From 90745f93a51922d83b05920d457bfb449908795f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Thu, 12 Sep 2019 10:33:25 +0100 Subject: [PATCH 001/878] 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 7428f17551b97523aa93b956e3e508230332833d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 20 Sep 2019 16:17:55 +0100 Subject: [PATCH 002/878] 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 81867a75cd9911104e12103a595637a088f72d22 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 4 Oct 2019 12:37:04 +0100 Subject: [PATCH 003/878] 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/` + `` +* All tiddlers with the prefix `$:/temp/RemoteAssetInfo/` + `` + `/` + +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 Date: Fri, 4 Oct 2019 10:50:00 -0400 Subject: [PATCH 004/878] 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}} """/> + + +<$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}} +
+Remove tag ''example'' to the Hello World tiddler<$button message="tm-remove-tag" param="example">{{$:/core/images/delete-button}} + +"""/> From 6e57f16517eb392a51c090e736fa01d3c29dbf8d Mon Sep 17 00:00:00 2001 From: Matt Lauber Date: Fri, 4 Oct 2019 10:50:32 -0400 Subject: [PATCH 005/878] 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 `` 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 `` 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 e5985566ce29b4689ae972de93f52b4abcf01ce0 Mon Sep 17 00:00:00 2001 From: donmor Date: Mon, 14 Oct 2019 00:43:46 +0800 Subject: [PATCH 006/878] 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 6fa3e21116338e5fc7b59db2a327eedb04ba9288 Mon Sep 17 00:00:00 2001 From: Nils-Hero Lindemann Date: Thu, 24 Oct 2019 10:15:52 +0200 Subject: [PATCH 007/878] 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 Date: Thu, 24 Oct 2019 05:02:20 -0400 Subject: [PATCH 008/878] 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 Date: Thu, 24 Oct 2019 05:03:05 -0400 Subject: [PATCH 009/878] 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 Date: Fri, 25 Oct 2019 10:02:57 +0100 Subject: [PATCH 010/878] 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 Date: Sat, 2 Nov 2019 09:31:15 +0000 Subject: [PATCH 011/878] 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 Date: Sat, 2 Nov 2019 09:31:36 +0000 Subject: [PATCH 012/878] 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=<>/> +\end + +\define find-original-comment(exclude) +<$list filter="[role[comment]]" emptyMessage=<> variable="ignore"> +<$list filter="[listsort[title]] -[enlist<__exclude__>]"> +<$set name="newExclude" filter="[enlist<__exclude__>] []"> +<$macrocall $name="find-original-comment" exclude=<>/> + + + +\end + <$list filter="[all[current]role[comment]]" variable="ignore">
-This tiddler is a comment on: -
    +

    +This tiddler a comment on <$list filter="[listsort[title]]"> +<>  + +

    +<$list filter="[listrole[comment]sort[title]limit[1]]" variable="ignore"> +

    +Parent comments: +

    +
      +<$list filter="[listrole[comment]sort[title]]">
    • <$link to=<>><$text text=<>/>
    +
From 7beee4f9ce04dbdac37032610056a0042d3987ec Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Sat, 2 Nov 2019 12:37:07 +0000 Subject: [PATCH 013/878] 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">

-This tiddler a comment on +This tiddler is a comment on <$list filter="[listsort[title]]"> < From df85281420cccc06870e7dce2aafddf2327708a1 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Sat, 2 Nov 2019 13:19:00 +0000 Subject: [PATCH 014/878] 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]] +<> 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 Date: Mon, 4 Nov 2019 18:56:22 +0000 Subject: [PATCH 015/878] 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 Date: Thu, 7 Nov 2019 13:39:14 +0100 Subject: [PATCH 016/878] 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=<> backgroundColor="""$colour$"""> > 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}} 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=<> backgroundColor="""$colour$"""> <$element-tag$ $element-attributes$ class="tc-tag-label tc-btn-invisible" style=<>> -$actions$<$transclude tiddler="""$icon$"""/> <$view tiddler=<<__tag__>> field="title" format="text" /> +$actions$<$transclude tiddler="""$icon$"""/><$view tiddler=<<__tag__>> field="title" format="text" /> \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 Date: Wed, 13 Nov 2019 02:47:45 +0530 Subject: [PATCH 017/878] 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 Date: Tue, 12 Nov 2019 13:41:46 -0800 Subject: [PATCH 018/878] 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 Date: Tue, 12 Nov 2019 13:42:38 -0800 Subject: [PATCH 019/878] 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("",0)).toEqual( - { type : 'element', start : 0, attributes : [ ], tag : 'mytag', end : 7 } + { type : 'element', start : 0, attributes : { }, tag : 'mytag', end : 7 } ); expect(parser.parseTag("",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

and the content of a DIV
and an inner DIV
and back in the outer 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
and the content of a DIV
and an inner DIV
and back in the outer 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
and the content of a DIV
and an inner DIV
and back in the outer DIVthe quick brown fox
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
and the content of a DIV
and an inner DIV
and back in the outer DIVthe quick brown fox
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
and the content of a DIV
and an inner DIV
and back in the outer DIVjumps over the lazy dog
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
and the content of a DIV
and an inner DIV
and back in the outer DIVjumps over the lazy dog
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("Recursive transclusion error in transclude widget\n"); - }); - + // Test the rendering + expect(wrapper.innerHTML).toBe("Recursive transclusion error in transclude widget\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("

World-wide Jelly

"); - // 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("

World-wide Jelly

"); + // 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("

My Jolly Old World is Jolly

"); - // 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("

My Jolly Old World is Jolly

"); + // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwo

"); - // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwo

"); + // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerTwo

"); - // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerTwo

"); + // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwo

"); - // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwo

"); + // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoSomething

"); - // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoSomething

"); + // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerTwoSomething

"); - // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerTwoSomething

"); + // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoSomething

"); - // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoSomething

"); + // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoYetAnotherTiddlerSomething

"); - // 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("

TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoYetAnotherTiddlerSomething

"); + // 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("

nothing

"); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("

nothing

"); }); }); 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] : ''; + }; + + /** + * 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, '>'); + }; + + 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 ''; + }; + + 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 ''; + }; + + 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 ''; + }; + + 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 ''; + }; + + 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 ''; + }; + + return Empty; +}; + +getJasmineRequireObj().Falsy = function(j$) { + + function Falsy() {} + + Falsy.prototype.asymmetricMatch = function(other) { + return !other; + }; + + Falsy.prototype.jasmineToString = function() { + return ''; + }; + + 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 ''; + }; + + 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 ''; + }; + + 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 ''; + }; + + return StringMatching; +}; + +getJasmineRequireObj().Truthy = function(j$) { + + function Truthy() {} + + Truthy.prototype.asymmetricMatch = function(other) { + return !!other; + }; + + Truthy.prototype.jasmineToString = function() { + return ''; + }; + + 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' ? '' : ' at '; + + 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('', 'expect().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('', 'expect().toHaveBeenCalledBefore()'); + + /** + * {@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('', 'expect().toHaveBeenCalledTimes()'); + + /** + * {@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('', 'expect().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('', 'expect().toMatch( || )'); + + /** + * {@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('', 'expect(function() {}).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('', 'expect(function() {}).toThrowError(, )'); + + /** + * {@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('', 'expect(function() {}).toThrowMatching()'); + + /** + * {@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(''); + } 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(''); + } 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 += '...'; + } + + this.append(out); + }; + + PrettyPrinter.prototype.formatProperty = function(obj, property, isGetter) { + this.append(property); + this.append(': '); + if (isGetter) { + this.append(''); + } 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(, )'); + + 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 jasmine.undefined instead of undefined, since undefined 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 not 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 jasmine.log 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 disabled 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, '>'); -}; - -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.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 ""; -}; -// 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 everything 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(''); - } 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(''); - } 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(''); - } 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 jasmine.log 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 Date: Thu, 14 Nov 2019 09:23:17 +0000 Subject: [PATCH 020/878] 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 -<$reveal state="!!hack-to-give-us-something-to-compare-against" type="nomatch" text=<>> + +<$reveal default="yes" text=<> 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 -<$reveal state="!!hack-to-give-us-something-to-compare-against" type="nomatch" text=<>> + +<$reveal default="yes" text=<> 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 -<$reveal state="!!hack-to-give-us-something-to-compare-against" type="nomatch" text=<>> + +<$reveal default="yes" text=<> 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 -<$reveal state="!!hack-to-give-us-something-to-compare-against" type="nomatch" text=<>> + +<$reveal default="yes" text=<> 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 à yes, 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 Date: Thu, 14 Nov 2019 11:00:07 +0000 Subject: [PATCH 021/878] 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. + +`` From cd8ab13b55eec0550ed1812cc742392d5310d542 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Mon, 18 Nov 2019 13:22:10 +0000 Subject: [PATCH 022/878] 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 Date: Mon, 18 Nov 2019 13:24:47 +0000 Subject: [PATCH 023/878] 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 Date: Wed, 20 Nov 2019 17:45:42 +0800 Subject: [PATCH 024/878] 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 Date: Wed, 20 Nov 2019 09:51:00 +0000 Subject: [PATCH 025/878] 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 Date: Wed, 20 Nov 2019 17:38:28 +0000 Subject: [PATCH 026/878] 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 Date: Wed, 20 Nov 2019 17:38:59 +0000 Subject: [PATCH 027/878] 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 Date: Wed, 20 Nov 2019 18:01:06 +0000 Subject: [PATCH 028/878] 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=<>> +<$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=<>> +<$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]] }}}> + +
>> <$navigator story="$:/StoryList" history="$:/HistoryList"> @@ -18,7 +26,7 @@ title: $:/core/templates/single.tiddler.window - +
@@ -30,3 +38,4 @@ title: $:/core/templates/single.tiddler.window + From 668ca00a8866066b10ef5f5b762641c67702ea31 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 22 Nov 2019 12:08:53 +0000 Subject: [PATCH 029/878] 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 - + <> 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: <>; } +/* +** Utility classes for SVG icons +*/ + +.tc-fill-background { + fill: <>; +} \ No newline at end of file From d785a605e4dcc62afa486fd1d4d7941f01e7d094 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 22 Nov 2019 12:21:03 +0000 Subject: [PATCH 030/878] 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">>"); + svgo.optimize(fakeSVG, {path: filepath}).then(function(result) { + var newSVG = header.join("\n") + "\n\n" + result.data.replace("<<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 Date: Fri, 22 Nov 2019 12:21:54 +0000 Subject: [PATCH 031/878] 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 - \ No newline at end of file + \ 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 - - - - - - - - \ No newline at end of file + \ 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 - - - \ No newline at end of file + \ 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 - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - - - - \ No newline at end of file + \ 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 - - - - - + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - - - - - - - \ No newline at end of file + \ 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 - - - - - - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - \ No newline at end of file + \ 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 - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - - - \ No newline at end of file + \ 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 - - - - - - - \ No newline at end of file + \ 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 - - - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - - - - - - - - - - - - \ No newline at end of file + \ 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 - - - - - + \ 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 - - - - - - + \ 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 - - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - - - <> - - - - - \ No newline at end of file +<> \ 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 - - - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - - - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - \ No newline at end of file + \ 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 - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - - \ No newline at end of file + \ 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 - - - - - + \ 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 - - - - - + \ 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 - - - - - \ No newline at end of file + \ 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 - + \ 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 - - - - - + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - - - - \ No newline at end of file + \ 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 - - - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - + \ 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 - - - - - \ No newline at end of file + \ 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 - - - - - \ No newline at end of file + \ No newline at end of file From 015306dfc9099f4d5d9415b64266d328a154b119 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Mon, 25 Nov 2019 12:15:24 +0000 Subject: [PATCH 032/878] 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 - \ No newline at end of file + \ 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 - \ No newline at end of file + \ No newline at end of file From e33d519ce0d78974d7cef80521abe63c131927cc Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Mon, 9 Dec 2019 09:05:21 +0000 Subject: [PATCH 033/878] 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 Date: Thu, 12 Dec 2019 11:45:55 -0500 Subject: [PATCH 034/878] 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 Date: Thu, 12 Dec 2019 11:48:38 -0500 Subject: [PATCH 035/878] 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 Date: Thu, 12 Dec 2019 17:39:23 +0000 Subject: [PATCH 036/878] 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 Date: Thu, 12 Dec 2019 18:02:21 +0000 Subject: [PATCH 037/878] 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 Date: Thu, 12 Dec 2019 18:05:31 +0000 Subject: [PATCH 038/878] 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 Date: Tue, 17 Dec 2019 12:01:59 +0000 Subject: [PATCH 039/878] 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=<>/> <$action-sendmessage $message="tm-save-tiddler"/> \end -\define frame-classes() -tc-tiddler-frame tc-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$ -\end -
> data-tiddler-title=<>> +
> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [is[tiddler]then[tc-tiddler-exists]] [is[missing]!is[shadow]then[tc-tiddler-missing]] [is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [is[system]then[tc-tiddler-system]] [{!!class}] [tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}> <$fieldmangler> <$vars storyTiddler=<> newTagNameTiddler=<> newFieldNameTiddler=<> newFieldValueTiddler=<>> <$keyboard key="((cancel-edit-tiddler))" message="tm-cancel-tiddler"> From 3aa5198c3ef603030bfe7507ca37989db55cc321 Mon Sep 17 00:00:00 2001 From: Mario Pietsch Date: Thu, 19 Dec 2019 14:38:09 +0100 Subject: [PATCH 040/878] 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] +[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 Date: Sun, 22 Dec 2019 12:37:30 +0000 Subject: [PATCH 041/878] 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=<>/> 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 <> +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://.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 <> +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 <> dias RelativeDate/Future/Hours: Dentro de <> horas RelativeDate/Future/Minutes: Dentro de <> 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: `` 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 <> 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=<>/>'' para ''<$text text=<>/>'' 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"><> |<>
<$edit-text tag="textarea" tiddler="$:/DefaultTiddlers"/>
//<>// |
-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 [ ...] ``` -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 -``` +``` \ 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 +``` 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 +--fetch files +--fetch raw-file +--fetch raw-files +``` + +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 `` especifica um filtro determinando que tiddlers são importados. Por defeito definido como `[all[tiddlers]]` se omisso. + +Para todas as variantes o parâmetro `` 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 [] ``` -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 [] [<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 042/878] 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 043/878] 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 044/878] 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 045/878] 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 046/878] 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 047/878] 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 048/878] 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 049/878] 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 050/878] 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 051/878] 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 052/878] 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 053/878] 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 054/878] 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 055/878] 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 056/878] 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 057/878] 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 058/878] 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 059/878] 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 060/878] 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 061/878] 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 062/878] 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 063/878] 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 064/878] 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 065/878] 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 066/878] 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 067/878] 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 068/878] 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 069/878] 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 070/878] 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 071/878] 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 072/878] 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 073/878] 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 074/878] 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 075/878] 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 076/878] 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 077/878] 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 078/878] 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 079/878] 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 080/878] 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 081/878] 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 082/878] 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 083/878] 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 084/878] 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 085/878] 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 086/878] 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 087/878] 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 088/878] 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 089/878] 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 090/878] 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 091/878] 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 092/878] 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 093/878] 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 094/878] 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 095/878] 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 096/878] 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 097/878] 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 098/878] 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 099/878] 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 100/878] 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 101/878] 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 102/878] 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 103/878] 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 104/878] 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 105/878] 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 106/878] 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 107/878] 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 108/878] 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 109/878] 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 110/878] 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 111/878] 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 112/878] 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 113/878] 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 114/878] 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 115/878] 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 116/878] 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 117/878] 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 118/878] 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 119/878] 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 120/878] 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 121/878] 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 122/878] 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 123/878] 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 124/878] 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 125/878] 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 126/878] 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 127/878] 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 128/878] 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 129/878] 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 130/878] 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 131/878] 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 132/878] 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 133/878] 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 134/878] 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 135/878] 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 136/878] 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 137/878] 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 138/878] 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 139/878] 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 140/878] 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 141/878] 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 142/878] 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 143/878] 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 144/878] 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 145/878] 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 146/878] 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 147/878] 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 148/878] 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 149/878] 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 150/878] 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 151/878] 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 152/878] 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 153/878] 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 154/878] 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 155/878] 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 156/878] 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 157/878] 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 158/878] 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 159/878] 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 160/878] 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 161/878] 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 162/878] 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 163/878] 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 164/878] 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 165/878] 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 166/878] 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 167/878] 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 168/878] 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 169/878] 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 170/878] 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 171/878] 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 172/878] 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 173/878] 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 174/878] 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 175/878] 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 176/878] 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 177/878] 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 178/878] 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 179/878] 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 180/878] 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 181/878] 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 182/878] 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 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 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 zcmeAS@N?(olHy`uVBq!ia0y~yU@~A}V6^67VqjqK*`t%jz@Xvj>EaktaqI0}_6m`! zkG_9&@L+n$a;dRJK*-67>t(L+m2R%<eM<UCjG|N2o+>E?vA7&;YEru4;K<_Y$l_Qv zS!=JdEYH~hSC_s2zgJv5%VAiZR#tAb`?u}+=R42u{hnxUz1#SC`MEQidH>5dN-{7^ zJ=eRQfx$t65sW!h7#Kjfk%fVwk%d8F0s|Pc2r)3Q2r)D`FoCgv2Ll5LGjTF7FmZx4 zf(!s@1YwdiQ)~dpW)KG148la(-kA^aF|k@Ny|}Wl$#=EUb^Y@e+sxl@FFsnM$l##x z(w*hJy0Gy3z1m04U%%@cXk)YL&XqOKq8C3pH&vu)8UsUPO8oC_&z_{Q?+A@pw0PC} zhznDMSs6G~s%IMLJ)9MH(O$ItyVl?NegD4dn15twaM-l9{Z`w~l{%J@|Lo_Q6dnVa zU_AL=_M2rZzq|^YZp_BOp>o@zc89`_ZSC6}iptk-N=#K#=VcJ^m|DEqFY?mmKN5m` z3@nqjZd-r8X!EX`KaR=gq!|<@tod{=x_1r#l05$_5BD%KFrCzzE8oAxZUWb5Cd+(~ zy<YQ{W^OP#dj9&~{o)p-Ad#m2{@t^6PwiW4Ime2@K_OH8LHt>@#*$Y7jLZ2L1Uzn; zc75Jv*PF#!S#S^J%Bg9~W?f?ss`F!b4suRd<*szw*UXs-`!gU8*!1zXkM`vgr&quF z`1j`=a|Q>6$khthS53VCR-Whi5|ESF_}-sdExM$z@M=fF`pfN-@$5GaEDd&TFMs|v zV*b{&%wLZzGw;{TG<yE|iT-lapRYEje6&CMe`jv)wST#m$G<<HuW$Ib?%oA%k2uTd zm`(ci-<Q34AC{ssclx%3uvd2^H6J+~dD!v)-`hoB&aO88o_Ef2oB8`Q8xLuxNAOH` z2>S7>dx}<Q$nuF5C;vpQoMYIqO)L7!iOtK^`z3BYShy`QQ?qW>x_ui0&WDw=@mFp8 zcU;~iZm&h`m48zu0{`#5;Nx<7($36e_oJnCHk)RyT(*6C7iVAGywLotu+8P)tKRoy zZprXl#c?;@tJ}gk#(YAH;`yuL(jIr`r*K+xyCesM$Q;{P?%nq}^!1|d{Y8nvf%^QC z0sk9+JI}9Qx6irell!gK-8Z+mv{aYA4RQbC<kc_oszxVRP36|N2$y-CJLX#0CI0^w zBOcFstaQ7<{_pDqej2OkUHg4WGs;k`N8;LnvmUM{CuP5%77@L?bJC%=uQxwC=OL*3 zabE0ev;BrIeogyPKW|m~pX8rkb2etk-+14icU>*#)e)DA*%zM|RF$sI-k&V^cdg<2 zW4Y0@Q$OsU!ZN8hH)?6pk-I(qvnH5}-K~tyW%8VT|D0&|uad8mzO0m2<CB;9{DC>q zv(wJ#_zQu?E!Dx>?DqfoyVmKt?)eSb>dt#Avo@{gJ3i^+mHc1FJ=c9ZaI%!y)5PIP zxKNT#^BLnT{qw6>CiQfy`|LJLJ3oJ_Rh>`Ge7Ubt_ky$y0v<04;}i6l@9%l(b9w&% zgdHy;Z@rAD`(YP<KKbN%-XFiZMXuizxpH>u>kHBUL{*CYT&}M6yLV&T@s~lM^xK%R z&42zJlcb1dKK|C_%YWYdAR((XVP3UW)c^SXzbBXO+kRN-1ou9#tN$bN_GxCk++z}6 zvFFL9#w#10Th82^F!`zfy$F++dylaM?UegdpZLw%t({}Zp*;sqS+O7M>)QPG@Qm=b z<6+k}cFenfQ=W@cWqD~d_sVp+iGp!YdR_fX*Lf=ldR+hg(ZliSJT}|i*S0?FSQ1vw z7XE0Xh&Y?votfSWmJ8$0i@CQ{d(LB@9hNF&DQf@H*XM)c1db)I*G62}a_M}Fb<{Px z!UJsDb+J~lOR`Q)wDt1&E0sNcnXt#XXMZ>LKJjmAy2CJg&V_TYZrrmme=N#$lH;C~ zXnM<JMbn$*?N^m$&DNV8X%5mqziPg(SJ5eVuXPe0`{!!cy<h7#PpiG9wY~D(?3st2 zJ$*XMUVEy8(u7lA18y5M&*4`*C}(Y+5?!n_`M&vu=1cwed=(~qQI=Ac-#0m7Y3Jkr z28nm%<K%B{$X;%>-E6(6<in*uRX%(!)jz}i=9|mhh0IBDwT9o`UVnV_cl3YD|0n&` zefbKd_Wp6wX>?JTx_e7Y2jk;8Ld%*CbgOTP54PPc^}=!G_U*r~ZH;7^<j3}P_4{X^ zo_<(o({9oGZl7|*vR5^`miPXB-KM~F@<MQu`KsAMv*$hg?y<Wd@cs6BgFk)Kwia*x z^V+5A<~Qlrx3#@)*YbT_^+ZK9IO(YR{{5jD{d%R=r5!uIubc4b(19Hh`M2e|f7G3u zDk9{;GRg1h1m&I;6Du!O2XCJB?Z@T(ePZqkl0Wav__uMF=EnJcURvdI?ww-wJ>J(P z9GN=#-?cUVlS?ZCZf&e}+4=dn`TBEn{?sK4?lO~PS7ACobDpw*2g@Yhyme7F6BL<W z347>Cc>MkC5-soH_1xR%(fyD+#@iweIoa~(gx99(2K-#G<&MLyXNliF{q#L*zxk7l zz)F7wL652_&DJss6H?}VIX7>fk3wk7q{%g|Ir|MXo*jKIy(L@tnM~u9^+onR-Hj>x zs<$Pky1lM;GKr7;zi;cbTVE@#*lBE)@JMqnd(JB>u=r<07Hg%<y}9lRf*xi1Qnw0! zO|HC@J@4%ISKS-S?+fN=i{8InzQ&<yMed9?>sU9wC70Vn{X6%5-gaxQl}pDG!L60| z;{ugt+e=K}P?lM>)8ETwk<Z*2D=K9_suo|)`L`e>GH7z`{8usG|Aj4lE6?-(>e_V~ zxgFmwFS1;z`uo%Ay(iU_u7xZp^z1(P_qDJG%cQ%f|K+;ztISm2Te$IF_<Dz}{jITC zQ|5kVz4YnlwmCw#{~S{g^t-NKT$7W3ueLn<rB>&M$@RaIZfkCQq$OcykaqsroNT*> zAKFUITYGm1TY|jxP51XUsaj^%nMeC~+XgNVdUjsO<D9wbwfpD)&b$}s{{7EezN<$k ztL1Kge@*xNiaVMc7yaLo75K|kch5zA^D7_1*6$So<<xa@9!A~r{#ENgUahyuPvdHQ zV%3<kUvp#P!g-hNyh7H^s(RSsd04CXF#B<dM6Wju>5I<Gn`;`syeb~*|K_yU_wuHP zWh|2xp8np(uQF5HeT&}ue~+iPnJ7$%QJGLOL+JLyg&(|^cTZvdP_+3^=w9cjuK7=* z9(<c8H2dNe|C_%=E-G0yW!+Etek_Nn(_vHk)LlnkG^P})SJc~opZ|ZAY1F--Zik|Y z4nfwcVbPUe9(J5wnmTh!!M0bbYf{8^Tz-BtJ!{kYq78ReI<sb}v+g%uCfMkraC74u z!*6PL?7eMX=GOY3n9qCTvD)6pa~z81Xl|T!I(Y8sw6?DQO7=<rvSwOt?JT^;ckbL5 zam$o{yXE)JUhwMav-YhlLXA(l8n>kSPCM#cQJZpj_5X^yn|PQ`mNI$1of47V^+F=^ z-OOHT+5FF%8^dh<UrFcw+r8-X^y!O}l&;I_W`kl}_Vhd7wtbp5sZNWII!9Q&KYvs1 z{l1$W4n=c8p1C$lDJ%DB?`|>k)jN!JjGNt`Z*4Bulw(~fwQ`2QdtU`X539Me*skoZ zw(V|D*vI<uhO!{bq;8f;ZJHayroEhedRm3V>SaRW%a@*Aek3Y#UWG}}RbP(Ooqv+S z{$Cxjv$lKh@*~UCqAM<G&pP?c^Q&3>wwVq_ISMz+yw><+{!iGk&1=ukUdJlG&Z(M@ z&d2`9?&m3dxFSmV&y9OFpqL21`EhO`^U9R@Pc=6_lYXQm{pJ5RjwPpz>U?T~7Wo$@ zE_e~$@vZK^-9>%g%nz@+H!hCvtgcNtT(@`et*xBGy`uH@<<en~#6_o8`23Zcq~F8w zeO1M;z7BIi&PSL3{k|5Z^zGM|72gjnm@z%Rqc%C^u;Kb+yzk=Uzif0_b#vR^)O{Cq zS4jQOotNaOAn379)T8@ZMBOFp$CK^b4QlONSG9?Lz5eB-r*v4_tro{^<|Q{fH;VnO z+qdJ3$HPfGGh?mXs#e}P`16<2uGDAc`}Vr#{uGb1NZfRim-(aJ?Q3a!f7CR;Sn(=M z?(~MnRO7Padj;3$*06&T&W@b;{5!IW@zp0kO^*9~BrY_0-Mf5ItKzK5pH<b`_if=& z3H6iH`SD>c%f*$KYBu`(*0}g5Z`HSw4L{ZNr~8SYojvoD$L@l&#~0OX`ub8ul=;PS zKOdC|94ggQb6@vJdx(YeuMXe->#FEK*T;cxMXI*{*Ijjgd-#;a_nQ<Zgb1qlJi9m} ze}9}=!|$ETLrof{1lQ+eUtRR2r9yZ25m2D53VUueeZ8Hx8raCS*}PI7)9ZCM{a{!S z+|E(_`1&mUg|~%EWs;=%m`;X;>3d%PP?7nfVbkrH_5D*~=U=&fJNE4{kF4rCsa>@v zJ@-8;|B=_)#aRQcS6L?QJvGggjdw|Iwl06luLp1K#f>8Wl+K!Zzj=CkXyDyBwqYI$ zJDn6b7cE`?O-1l;=I7I{`JSIbD=itn*-dk{E>2F)T46P9LIVHi)7#gD8fIKrI6IF; zsBy`~E1lDpA6fT5JNN(1%acQSWB)FnH2dlP(~Q&mRVHi+v@Xm&vVrZ{bv|j0-Hh40 z%@VC-PH*WKx;pRGtz#Fo!+F&waHvR&AGULRd3o`?qjqOqk1A}xe@^uM-8srhYqFPH zUE`UsR`iKsag^}!sI>VGm)zb)1wWJ9`5`3z=Fy$=|N2kiJO1gi=j2s>mukz~XT<-0 zx<zf$dZF-Xi{CpW-f@unqtp0gTjo?jX3sfaUS`&b%|G?;^47wqIUm1$jg;Rv`NG46 z1-Z?&@se`dJF^)YpIl&;VPal=a=z%P)S%mU#I=5|GLP@R3~E6JZ)|KWnt7%3aq9Gl zy<01Fr}1r?{`|MF2ixA%@<$H)&a|ID%_(s9{L9Ic%ks~NDTcg@mc2h;KZ}Le{0rNc z-hW?n3>%*uX;d-UZ|L!FO2p0$IdYR$I+V#Y{#f<Za@xi9D<UquIQsl_p8cu(Yu}$F zPh=5lOgWx(rqV--O|ylix`V6y&59kl*_+qBw~V!lHF>-ENLA@oUv-hSC$#$}c(P1N z%Z+Y7HJ?BIpVVh1KlPuERjb8co9MhfTpsd9)i6J;>u0OKjnvAAno^Bl`X_JPy7$A& zd0#nHlGmlG+b`R8CuoNFk8?BJ+RLBD-v9XOPsNf|+p97?m>=IaQJ-LPUvk>~BbPr- z+q66M^|aG=HC)_Z|NPwIw|XL9*yTfZ`|SUp|9v~X>uCEF-s`F_S%QA*z7TW<Rp-+# z9l3sab5?+F|D87t?eZM6E$kjn54t)3|GwSMGFIL;HmjDX{kHp6u;WE-_bxTVgUh`{ zujVIxwtQk%Sid@8c8%-zd!k0wRhx>$I#x7?=wAJEd~$Q9FNezVl5Y_UR~_$qCVnda z=7Q(j)$6Zzh|S(Pb8BVkvL~w-Enao{`nq*O9=ETjn;KtT^B}sL<GYmQn#MCeTY8q& z@kzOwi(LIvmU#Jfblh(9)NZ+k{{A;-S>ol(na%#|PZwKRbtPxxozm(LW=H?T7oK>0 zd_}~b)A!Hc-O&7)Q>FTRsqysGuB#rd&hDQ=xzm=ux^{bV{DZs`4Zog=@3RjpyW91z zcG27i?%N|3Vl5J1U0u8Gh1iLja-}VPGAGtQxa*QD_aOf4!$lq~XJ>>z*7BPu-!D?~ zHe`8}>FM~8z9hY-!Va@`+kLw<g@vX{2cC{^U(~Vf^wP_&ER!Y+?oB_buV{Df_8$HV zKOd`|4DT$P>N_oTYT>I1T}Qpl>SnL}_GG8pq*&Vte)4)5BFpm@OnIRdy5Y^FGl%B7 zX`l4m_j}u^cjX(3oy$%~>%7VS`H6d@+Z>_aiHqj$J0Lz^|Fu=OPtevA8;kh38lT9x z?brFe;?vr|ROjvKUgvMUycD?KFjG40)V)gKt4%vo!#3&17sa`FY-pc&J7pK!rKQ2H zH)sC4^=iSkwa)zSPV7yaxaHz{laliFk0LTd_Ev@RM!V|#R$Kc(zN{+jT#xaT@V4W} zj#u7(nJrQ}p-8H0#bVX?2=z<eCAOR@%Rj!pnRJr1(sgRC9FxMTPqXtU$!h9VCG3(t z$K9L~-Z$fG=BBoZkM{1mTH1I2E?c9?hWIU0uLgK*SZ>jKq!iTH-P&X$^Ks|Jj)k|_ zWAx@uH!F&0{>I<-Jmu%?Pt3o+tWbZYEcn^YF2Bw`zUJeSmq!|#{@yO$zV>X?UW?jy zJyQ(VA1lp~Uzl6@xQKmESC?B|-R}<v4Ou2#j<AR>>wJCh?(0m6c=e<=J#pU3)8urg zthx3mY46$d^IUlq>OY;IKh;a&@52x4_DGqo+O@On<Y~Tw1+B~_6?NK8DZid9VSjhs zNWwp6*QtZ=K8a3Vk;Ere6rj|&<e^AbY5ImI<_luZF3DbQHEDfNUS(eX`@O2a9YRcA zo>@QZW9OT_?)CQN?(v7tr8OS;5^8>Q--;b|Sr>mNORtRGqqlhF{g;PXpY6&#V7w`| zAla@|dBT-R@~_v#EPQq1oz2hUoR2bd+Zba0ZPYM4=)TD{bkq7b_ZI)r5@r7FYJJu} zKUZO?+HWBb_wP?8+KTp9R{par<rNR?oUJYOu_!-(<;G7N4NcE1Udy3!Ty?+6s-lD| z+J{r!on~?|z1_t=Y0{rdD{Oa9vt^IkZ4&!0>E?djc86cZEXJ84Vy`@(c=%}tno1>I zoU`fnqrJON>)rl%cDg3ZBxmbA-rE){`>B5xp5CqQ^U2%4*3NbL*Vmv(3En(w()_H$ zr+7YdKb@{4`2W((y4uxDnWtyzFnR7w<J3}{RrDz~>tfH|qG#vR*8K5f;kOrXQ?T43 zK0jZf^3AE%T~EzrynH@f%-y+QDtGF3qpZT>n|s}VdX)YCy+k#ff5}ecAdV${^|@Dg zSAKi{&gQ32)SuE>JC|ziulxLU^%FslzDH*^9-5G_k}<Qf@#>kyd+V*2Kl)Npzostu zn#*U8!xCR69!`00d#^gYV{v{%%4vsRzqpxBE_kgeG4oGs>C-n|p6^Ys8H98?6zP0o zzBGk7B1~_>+m4pjs(Dwlw|qaxdvntKS8a=CJ=+^{PTu?^KU0*E`Pq|N?5mkFFR$`p zTItris&A8Ff8jHmF71FKjvbYS(=RD+^3J_?WsO?nla6!$0yK6$h<4dA-9p}^NAP;F z%(6e*1Wzf}zu%`Ree!7QFW$2SJq|%z9VQElC%=20mD2s}#5uj7b-QOxQ`&uR-Og=F z6J$=zUVl>0#~`m{&(F|B(-nSd>7QR^Uo$^{%f#2^cja>Sy$!3{60om&$sNV%4!?qx zcdu1??2vk;qb;RJ%YN>ZSjOUqZ#Hc#`(!;y=l3$r#wQUjufvKS&;MbOU%WrEMDSl} z^P8Hv=~eD8%{GSDh5eYdG<CMb$@LFsPI-}hK$35&yhm-dtDr|C<JG>mXE*;-xwqLe z{qgphZLyQjZksfDNt>BZ-TsX~Rrl^X>E|EVw_j<3%%P5jo0?xwS>E!e>%pQo_m*5P zo4#7?<T)iF`&~P$OKR%({W+#5-{W0yD(m1ahg&-pZ$A`s+UmY@>&{~b?@NcJmA#Bm zw^u(9zR^D@uk665pT2XgC#cMxpxk~mYsOED1^Fh8PaIsT{faJs{9<DNdBNLwuWl9b z1ktA_kC)6^|M~aNN4KM|Tq|&os`~_L=|1=NVF~(aRo0;}!KL!MZ|PxA{eSuFE9<+8 z^YhCmhWg2PG|!v5>(4Ix$m4&6E}BgHqiZFZsbkleGBLy9gq=lTj)0E+cMp-LOr2$_ z`+qI^bjNOoad^>k&bjXEtm72s+C&IQK3uw1==+BiN>Qic{jxWed!Kt4TWP%9O!9`l zmCB9Fg3Ko`Z+^wyoRo5GZ-?Km714`dMM?x*d37#9oloWDw+FJi*|Xy}B}{v>wC;KC zR!)`nnR<I|!#^d=o_VUxJ>DjBQjGGuS*z|VD0|%fx9>^+4_VcCQSsMnZ|`g3lk^Bb zUjO^&uGMP~au+f4<>;qZKI^@oX7#9SW4L!%Tm8}8ja$7hAKgE(a`l5-a(*%%{kB4i zl|ME8c}~V33=!~9u<VkHO_Ar-`>`sgrF)fa>-U^%nOnC<&Oc>$x$51^3|`}DE;B9c z4tB0)ot>MwudcG~Npe=;ox7`fD%5s0ojWpxvont`dR6#(t*qN07e6*%b7s%3AH5mo zxzW>At6UddTB-E+i0_}%@m}3?zMh#J^H^J7-Qn<`<F}(PI2Z9)UpuX5ulDQIGvBy# za+Bw7eDdu(@8mbHiZTPkc7;S=zJLC%4bQ9n;wjSUi&TzO|1Y`ZqHwY-yq&*K@M_`F z`<a(R>?g*F9d8IL>{=)k7Z>_ix~lvCm2aPlswem@_>!^k3DdnrX6E}}eb(G`b<3wv zmPv`7yLKFQemKc}S5@K74=>E!%%<$`D2e8&e&upA?Mp`@ugKw9Mo;=(Ee}m_n6#<f z+wb<Zg&Pe`*ZEI5)?0J0V&}pqZ<5k1Iya?x?h2k)7HmIdZ^_hhvwKpi)`gqAk9#nk z{IM^3qT>BS2K@bYg$o?&;$QCDTQaL!<-d=%&XwSucf(&-r=(w3Rs9uX73-pqS+Z_P z!A<i_rA8N9qv9;#t=kK4-;wrG(2Q>NbB<}z&0DAXleb4U)NJvJdik3hBmRDw#pJ0F zSuAzpe965{%W^8dY-lw66n^2LtkvD*3H8gC+AN)ZK3}U|XA%3eFPDYy^87w2S8FlH zA!@tM;h*Pr>Mt{y_@C{FeOUD7?oXE{u(3=!c=GzuQ~%yQjIEqxUhOKVD^c6$`fp}f zj?YbzMfcB%-oF*IEp^(oN8dMZF7M}&^@z2;syJa^^uwISE%nvwp8R79KYgk-Rk-DI z5tB;%*PBaJm`<K>iPgF9eQ)>DH_uL8woPq!udWQcnyWnN;`$T!eEz+-yUDO<)wcJB zS2W*tHLBD<vn(v!ba%U-oK8kv@`P3S2W-|no_<N`=dz6po8~y|y0>TMrqYj_|7-64 zy{me1*Taj<zg=IKg?Vq==%Ro8kHCvlGavnlxycq5w(I}XOG->DjXFPjo?mtU_;Fiv z>jj6MADW9@|MK1Vl#WJvlzYwlXLEX%)ve<D|IYf9m{XjMy6?Z%XYI#WCNaiZM#s!h z-#UL@Mw86l;A^KR-oN0u=fbb2s;VdR3s>*?Z&O<|>CaD_$CK68O>k@DTjKcl)$4%A z?pIgaCB__D*L(AsCSQ2?;#>RdUN>(So+R}<Bu^nX?k!K_m)koZt>5o4F+Ti$%(HVI zfi}TY=B^f$f1bM{*Mw8$EWe;@?D{#i`t{FvWCa$V-`KHd%9|atxtP}f*?Q*4(qPw5 zo6U+h|5@*st}<bc<%CsXYcKshX(g^5)AIOJzw6%J*M<LY+Qj5(x#NVRd(hg*S$g}g zE!m`^_G3nVaL4Jmf31sTb64m$It2atSu*j-zA(jua?AOq^7iN5jw-v6n~<<|Qmxh7 zY8CrWpJ(fzjtUn(u6|<v`S{vtZ<I2h>}m{IpZ7JiJH<Ujf9`ZOd)+w>yI%eH_s3sd zb?Z+5-#2QXs^xq#p5XGc#!IL%CE}Cz6Rquw;&%od{gCmL>tos0{OrCb?pc-Ix}X1? zE>>+d{F?2tFJNbleB+ZjjVe_(+F~ni-$^|GOy;NhD>I$w>sCGro%hask1iHF=O=5g z_V3<qr!_VOA9Ls1L?qNbQK+wX7Ma+}GRZL3BC%`w><@aYasmry=l|^Div7eL=x4ok z`#b+reJo*oVxo@P^+x(LroOVue6pzV%JTMU**{86S5LL5RjB<?w)pw{)%sb7{bZF~ z%ssX|ej<K;x@P|VxNEkv^!J|FKKtOcpK24<DN1QiI=(c<>C0^WP@aA<^(VVhC9~e% zT2WQpmHRp+{9*QOt1Ev3K3`eL^fQxRX-~Mm=k)@MNvj_UcubY|@a#3s`>XAz8Tj^< zjK`xT=FiqE?=)Gp?bDOwiO;mXVh()T&C{VYY15rRQFT6%8(p^qg{Mk**voCa85q4k zvFznVr<0Aki=1m-hD_X9pQFXG<$LS07+c3pW)(~3zByC-G$Qh+V&$yv7rvLAi)J_o zP2cs+bMEb;Qobc`U&rcA=;CHR8+^0gKK{<ey<KnRvso*rRPTOv<DQLlozvFuU$hM; zJb7OdsdIYY#xm~5*W)JL{ZRhviAwJ4stmo|q2DH4)14mM>Th|(t<Gbf>C!u9l8q@B z95xkwD$DWVWja~cC?fc7Y0T`O!c%uo&~WDz_Gsf;^7!{>X6B{KzCV4=HpAUAev;gz zbl;PwIRmb~7X2UbPxIwF-_*eGZ|WD7tT6dz{Yi{*ov6pP{L1B@C#|>Mce-q@0~hz# zn3WPao65cWQbfzPR#b-lUA}VyOVCpGOA{D3P2XJf>E@E}Qm+f9?ls)Ba8+`onSWW| zwxYF#g?6tCbRHctxuRmjv~tm<KgSgA=2;7Ptn$j6w!g^shw*W)t9nKu2fb#o1U+TD z1S;H;<D%}wnA!ZQ>GYg0EwpOhm9GBs&%QzF%eHU-{qSz8?h-v&<x&f=rzxCFCtoyv zDe=#4S6LaQckfrw$GjJQ!X9sLwM>=M4Y_wO@b^E@PCI)!O@#?Pk{+L42X(zZ{b$w2 zEVcQWdM`8UPK8G4Oo|sQy>VdERi$lfPF`Am>_YD5GNzMkOVh9K3aeY?S{(G1M}>EB zpsd~mH=f)DF_KR&oV)YJr+#aG&_|PWrj<g>o*@$_)i3&LtN84;?{a?eme#6Q1)Y2U zG<8L8`J}z*8rLU_!UZ`qIWIoB^e}?!Gn4GEy1A!WFWHu}ME_iQuX?p$W6ElWSGQK4 z+qbqp`$FgAP}38?vo=~7&v#gL#NpMS9dFjI;?+Lg=H4%H&0)T`&(&W?=lf6m8|$_| z=37kG*GDC_eXcvVu{J(oXq<BK%K20NUvuVb*fM)sx*VU$wDN52!s~0KwWG>Dr!T#> zdUaLjGBNY(n=D-099FGy5Zb@#$?x(U`NX`t-S<!5_wR2FoFr8H<oSd+tJo>CbhajW zl!ScUY%elvx!#?No3`0qJ=*s*l4X)I>!khhrk`7^b4%t)zfNf^aSl9Nn17_ZdDpXJ zO)DBg&YB0^lL+J!R-eEl>ai*>R5P84_l5M@^IuJCHgvfjeA@m;Go49y&f3eq|JIb$ zyYG*G-t~FHz1ra4YYcxLb(-@}aA}Hy>XGX0xw2L-ZvJ|dBzCg!FKh8rpN~gAa<2L| zAyn*Su8B6s5>T-)wQ%q5JpQsr4qe?}^}er&mk>!l>@aD6XzAI&j(r_p&DLzWV;Q|Y zrcC+x=i|PQyeGdY{admrhrco2E4M&L+;7H_+hKpo<Eu5VUA%lklv#6W=lW-5Eq{^} zw`rX^J6l$D!Y=#B^ow&sF7gUp|L{L_2k*h_@k{R9im4Xf=Y8Dc<or!d4ppfYYi^Yq z&sCV<lD+Fry?u4nrnO8jzkfbjeow7*^{LaFUoD)wZT@M?q8Y7{Qc4NyJpNBvl&=4? z8#Ltk?D(dt&ZimWeS0s*6c&c&z7Bk4Gv{C-bLOjdF})Mb)<v$_=T2#=`IoNy{W<gI z?)5B_{xz!XKm2|I<Ja7}x~{s;qkLx{{M%H&{fkGU%Z@8rH9I5!?Z1(@{^P#AIySrf z{63Z5VGWJ7o#0aG{WPk}``NO}ijYHQwfFN&CpidB{jsk1X0W<iSJrj4?f*h!>-Ypc zmNgylS67X_y1Ux8oloVX=t=uj8Pi1ze;&v^n)Lm|*-Iges)dt0<W39syWRQ|afCHg z`@|vJw}Q^n7LHOo^AvXO4*&V9TjZpFQAT=RfG_{{QyP4d9>T)<^9*F~PTpRcd+kzX zrtmS<k{tPkiT^)w&68NY_vI^r#+3edb*ZdDtnZU22+4-VZqg3kq#u7(C~RubzUYaL z3YG;5JOAd(`hUJ~rYoH5<ay2&Yd+`P4?8Y*CE@m?w{P{bta#^dYjSvXap}8XPbIJK z-XFR`m_5j8Px(&w*n`XBKQ)%@+~RTgO4?j+R&L+e<bwad*zBkMu*hG2GxS<1v*#3d zc|P-7k4mpk`Fp#FQ>B<W>FcAC-1*lO+iG7+dPsHEDER)?xOn!1>!$*~cW1V~JvaHA zhBNyS3wNoVRSG*j*Q{Rg`O`g?pq)?K7R|b*^V(hEWmxn7l1rZ$o_gsoDpa;qTISzh zmDi@fdioM!4?iIfvEvzG@6NU}-;TANuxRlr|Ctk3#JuTqFe*~0HPAcw!*oZ7<jmxo zdkt^@I4%^tzinzbdt=H12Pw-lhh9v1a7&IQD3$fn1xCZA?p$mCZ(*5a*I4qc-RWY3 zL7nQp48K)p_`e@nJn@+QG{*BT*1l4L9`$S9M}GX<e#-VX-@Af~4q4aL&a|CY6ZH7S za%o2R<DU5D>s+69R9s5=7-6>dR7r8mrX<H;rjwyn9{=}VICK5@UZL}5)n^jSD-@ol z{nVc`H|uujP7W1Wrk7V1GM)8yco|t$vT+Z4uf^Y6+xSfXZM@R?Wz&vL28~ZV8dC}% zgvFIHG%j&g==9D$V0`iQwA35Phb%z?y%M($oE1E^XXZ3@g>_L=-U%H4<nvx5-Ag%~ ze+m0L{;d%^&-_^8`SsOQvv;3Ath0H}r;?xlT~Ah7yk=_E%Pq3fRV<VCGJ9_4RbHd> z$T@7!kw;fUf8^x{-d1GF{CGW+Wl}Qxq!o;lC)d2+XB(l?`$S#v?9x72rA@|v|NdPS zx;m`YVUwrA)_v+Jzm9vJntPg4<v6d(U9+AIn@Z|zE<Jj`^mdzI7-$Gy+x)WPgpeN( zfBz{`pM3gvp6jt=`NrGVoxQbFvHJbAInCBZ{xT=F|7-sH-D&e_d$G>4Yda?$+H5Z} z&oWFS>+0opZa-Nqi^>fSe>xxk{_OqjY4>^kR|gkYf9iX4&U%Y+_@A%Lw~N2$pT4`@ z^!e|#mXAKaxjAQZb?~=!y*I7*oxZovF8lT_osWUr*POhy$Ex`9DxZ%h&DWeUdDGy> z+ZYlf@x$l+ihlbHojUQ4S6}|jJbGPYUqN)>?;7tp3}$~`Ul&M^I=VXU<}3bKi^NqA zx^`4~NzdQmmwJt>s3Y0%&EJ~mJSq~AM;k??gAa!Y+<0~FLEYZP%X~aUPFC$Za%4JN zgG1BX&afpfPOgobvhTs_E2*C^xjcDu_m6vaY>CX=WXT%TrCv4M;6+{ov`&j!%gjK_ uyg(SVLJWi(iCW+`P_|PX=IS5*Gj?RI68`aBe<lM11B0ilpUXO@geCxQf{&;G 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 183/878] 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 184/878] 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 185/878] 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 186/878] 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 187/878] 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 188/878] 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 189/878] 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 190/878] 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 191/878] 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 192/878] 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 193/878] 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 194/878] 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 195/878] 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 196/878] 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 197/878] 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 198/878] 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 199/878] 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 200/878] 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 201/878] 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 202/878] 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 203/878] 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 204/878] 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 205/878] 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 206/878] 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 207/878] 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 208/878] 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 209/878] 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 210/878] 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 211/878] 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 212/878] 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 213/878] 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 214/878] 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 215/878] 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 216/878] 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 217/878] 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 218/878] 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 219/878] 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 220/878] 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 221/878] 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 222/878] 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 223/878] 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 224/878] 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 225/878] 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 226/878] 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 227/878] 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 228/878] 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 229/878] 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 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 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 230/878] 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 231/878] 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 232/878] 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 233/878] 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 234/878] 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 235/878] 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 236/878] 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 237/878] 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 238/878] 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 239/878] 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 240/878] 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 241/878] 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 242/878] 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 243/878] 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 244/878] 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 245/878] 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 246/878] 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 247/878] 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 248/878] 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 249/878] 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 250/878] 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 251/878] 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 252/878] 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 253/878] 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 254/878] 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 255/878] 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 256/878] 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 257/878] 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 258/878] 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 259/878] 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 260/878] 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 261/878] $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 262/878] 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 263/878] 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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 IVDN_k0Q?lFZ2$lO 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 264/878] 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 265/878] 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 266/878] 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 267/878] 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 268/878] 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 269/878] 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 270/878] 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 271/878] 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 272/878] 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 273/878] 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 274/878] 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 275/878] 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 276/878] 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 277/878] 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 278/878] 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 279/878] 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 280/878] 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 281/878] 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 282/878] 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 283/878] 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 284/878] 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 285/878] 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 286/878] 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 287/878] 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 288/878] 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 289/878] 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 290/878] 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 291/878] 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 292/878] 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 293/878] 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 294/878] 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 295/878] 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 296/878] 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 297/878] 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 298/878] 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 299/878] 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 300/878] 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 301/878] 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 302/878] 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 303/878] 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 304/878] 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 305/878] 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 306/878] 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 307/878] 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 308/878] 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 309/878] 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 310/878] 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 311/878] 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 312/878] 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 313/878] 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 314/878] 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 315/878] 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 316/878] 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 317/878] 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 318/878] 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 319/878] 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 320/878] 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 321/878] 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 322/878] 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 323/878] 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 324/878] 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 325/878] 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 326/878] 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 327/878] 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 328/878] 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 329/878] 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 330/878] 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 331/878] 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 332/878] 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 333/878] 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 334/878] 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 335/878] 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 336/878] 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 337/878] 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 338/878] 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 339/878] 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 340/878] 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 341/878] 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 342/878] 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 343/878] 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 344/878] 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 345/878] 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 346/878] 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 347/878] 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 348/878] 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 349/878] 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 350/878] 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 351/878] 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 352/878] 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 353/878] 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 354/878] 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 355/878] 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 356/878] 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 357/878] 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 358/878] 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 359/878] 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 360/878] 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 361/878] 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 362/878] 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 363/878] 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 364/878] 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 365/878] 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 366/878] 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 367/878] 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 368/878] 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 369/878] 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 370/878] 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 371/878] 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 372/878] 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 373/878] 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 374/878] 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 375/878] 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 376/878] 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 377/878] 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 378/878] 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 379/878] 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 380/878] 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 381/878] 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 382/878] 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 383/878] 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 384/878] 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 385/878] 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 386/878] 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 387/878] 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 388/878] 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 389/878] 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 390/878] 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 391/878] 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 392/878] 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 393/878] 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 394/878] 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 395/878] 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 396/878] 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 397/878] 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 398/878] 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 399/878] 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 400/878] 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 401/878] 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 402/878] 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 403/878] 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 404/878] 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 405/878] 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 406/878] 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 407/878] 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 408/878] 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 409/878] 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 410/878] 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 411/878] 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 412/878] 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 413/878] 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 414/878] 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 415/878] 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 416/878] 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 417/878] 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 418/878] 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 419/878] 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 420/878] 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 421/878] 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 422/878] 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 423/878] 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 424/878] 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 425/878] 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 426/878] 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 427/878] 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 428/878] 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 429/878] 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 430/878] 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 431/878] 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 432/878] 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 433/878] 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 434/878] 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 435/878] 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 436/878] 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 437/878] 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 438/878] 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 439/878] 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 440/878] 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 441/878] 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 442/878] 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 443/878] 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 444/878] 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 445/878] 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 446/878] 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 447/878] 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 448/878] 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 449/878] 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 450/878] 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 451/878] 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 452/878] 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 453/878] 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 454/878] 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 455/878] 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 456/878] 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 457/878] 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 458/878] 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 459/878] 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 460/878] 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 461/878] 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 462/878] 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 463/878] 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 464/878] 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 465/878] 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 466/878] 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 467/878] 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 468/878] 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 469/878] 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 470/878] 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 471/878] 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 472/878] 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 473/878] 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 474/878] 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 475/878] 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 476/878] 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 477/878] 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 478/878] 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 479/878] 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 480/878] 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 481/878] 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 482/878] 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 483/878] 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 484/878] 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 485/878] 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 486/878] 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 487/878] 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 488/878] 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 489/878] 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 490/878] 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 491/878] 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 492/878] 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 493/878] 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 494/878] 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 495/878] 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 496/878] 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 497/878] 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 498/878] 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 499/878] 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 500/878] 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 501/878] 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 502/878] 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 503/878] 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 504/878] 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 505/878] 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 506/878] 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 507/878] 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 508/878] 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 509/878] 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 510/878] 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 511/878] 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 512/878] 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 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 513/878] 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 514/878] 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 515/878] 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 516/878] 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 517/878] 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 518/878] 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 519/878] 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 520/878] 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 521/878] 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 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 522/878] 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 523/878] 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 524/878] 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 525/878] 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 526/878] 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 527/878] 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 528/878] 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 529/878] 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 530/878] 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 531/878] 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 532/878] 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 533/878] 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 534/878] 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 535/878] 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 536/878] 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 537/878] 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 538/878] 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 539/878] 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 540/878] 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 541/878] 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 542/878] 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 543/878] 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 544/878] 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 545/878] 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 546/878] 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 547/878] 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 548/878] 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 549/878] 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 550/878] 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 551/878] 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 552/878] 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 553/878] 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 554/878] 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 555/878] 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 556/878] 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 557/878] 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 558/878] 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 559/878] 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 560/878] 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 561/878] 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 562/878] 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 563/878] 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 564/878] 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 565/878] 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 566/878] 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 567/878] 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 568/878] 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 569/878] 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 570/878] 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 571/878] 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 572/878] 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 573/878] 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 574/878] 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 575/878] 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 576/878] 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 577/878] 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 578/878] 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 579/878] 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 580/878] 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 581/878] 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 582/878] 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 583/878] 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 584/878] 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 585/878] 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 586/878] 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 587/878] 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 588/878] 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 589/878] 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 590/878] 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 591/878] 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 592/878] 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 593/878] 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 594/878] 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 595/878] 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 596/878] 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 597/878] 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 598/878] 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 599/878] 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 600/878] 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 601/878] 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 602/878] 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 603/878] 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 604/878] 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 605/878] 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 606/878] 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 607/878] 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 608/878] 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 609/878] 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 610/878] 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 611/878] 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 612/878] 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 613/878] 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 614/878] 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 615/878] 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 616/878] 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 617/878] 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 618/878] 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 619/878] 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 620/878] 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 621/878] 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 622/878] 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 623/878] 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 624/878] 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 625/878] 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 626/878] 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 627/878] 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 628/878] 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 629/878] 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 630/878] 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 631/878] 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 632/878] 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 633/878] 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 634/878] 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 635/878] 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 636/878] 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 637/878] 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 638/878] 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 639/878] 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 640/878] 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 641/878] 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 642/878] 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 643/878] 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 644/878] 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 645/878] 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 646/878] 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 647/878] 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 648/878] 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 649/878] 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 650/878] 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 651/878] 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 652/878] 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 653/878] 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 654/878] 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 655/878] 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 656/878] 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 657/878] "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 658/878] 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 659/878] 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 660/878] 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 661/878] 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 662/878] 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 663/878] 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 664/878] 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 665/878] 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 666/878] 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 667/878] 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 668/878] 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 669/878] 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 670/878] 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 671/878] 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 672/878] 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 673/878] 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 674/878] 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 675/878] 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 676/878] 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 677/878] 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 678/878] 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 679/878] 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 680/878] 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 681/878] 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 682/878] 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 683/878] 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 684/878] 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 685/878] 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 686/878] 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 687/878] 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 688/878] 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 689/878] 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 690/878] 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 691/878] 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 692/878] 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 693/878] 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 694/878] 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 695/878] 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 696/878] 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 697/878] 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 698/878] 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 699/878] 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 700/878] 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 701/878] 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 702/878] 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 703/878] 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 704/878] 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 705/878] 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 706/878] 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 707/878] 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 708/878] 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 709/878] 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 710/878] 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 711/878] 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 712/878] 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 713/878] 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 714/878] 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 715/878] 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 716/878] 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 717/878] 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 718/878] 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 719/878] 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 720/878] 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 721/878] 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 722/878] 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 723/878] 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 724/878] 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 725/878] 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 726/878] 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 727/878] 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 728/878] 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 729/878] 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 730/878] 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 731/878] 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 732/878] 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 733/878] 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 734/878] 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 735/878] 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 736/878] 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 737/878] 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 738/878] 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 739/878] 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 740/878] 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 741/878] 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 742/878] 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 743/878] 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 744/878] 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 745/878] 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 746/878] 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 747/878] 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 748/878] 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 749/878] 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 750/878] 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 751/878] 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 zcmeAS@N?(olHy`uVBq!ia0y~yU@~A}V6^67VqjqK*`t%jz`(#*9OUlAu<o49O9lpp zC8-gfX}-P;S_}*f91N_CQVgshB@7G<UX0Rkb`YZ>1IPpk1_p*GMk6p=gn@yfs6CT` z1**P{0RlXrd@${nQ<<5UuHc)RSfb#VoL`iuV5(=PXU1S;U}RurXk=w*s$ghnWom9^ zYRSOBw15d_8k4~SW*D2%8f38Gy2~mI3=EtF9+AZi4BWyX%*Zfnjsyb(Q&DC}L`j6N zk5zJhu3lnFep0GlMQ#B|7lTcORYh(=ZfZ%QLPc&)Ua?h$trA#;RbH_bNLXJ<0j#7X z+g2&UH$cHTzbI9~RL?}uK*^3vK|#T$C?(A*$i)q+y(lHkRw<*Tq`*pFzr4I$uiRKK zzbIYb(9+UU-@r)U$Vj&+B~7=uGOr}DLN~8i8Da>`9GBGM<f6=ilFa-(1(3OkN%^HE zwn|DMixgl0;?9!HG=xog#ZYf0=jZB!Wb_U74D_*StH>>YyAMTIMPdO&6WCV}yKF#4 zSvlwD78Iox7iZ?@*_qmajYknfI1ZvdA}F;uKc^Jr2|IHms0L&~bPbW%G$0EiX{g98 zu=34M$xN$sNi0dV1EmvPLnB>7(-2rXvC&6UgQnZLC^fMpzbGU>KgSM7@`D(GtPpC3 zjXo$=kYWiOSP;=57dJaD8+~wM0VNzeuAJkut}!q;FnGE+hEy=Voy&PA?DDtc;o)sd zR756Dxuh|bjrWpEkd~2Z^0PCC_r`oS{k*>|;FyOIcj^j{jzuApg0y_6D9$tziT!u~ z^5o~W_lmz+rq6#~yX^CpYs>kczuA2Je%-yz=k8Uny|4BCdVGCnm(l_b4W_OJr3v{g z|0cfY%lO^Z02OL(&{Fv;3zl5KA;QA6Y64f1)D~f={Hh6G%%NHX1UObWX?0{?@PjH| z;dJRf)D#Ctg#}zI6_z<#FND~$fXlO<8EOV=V}sU`rWtH+TcB2Isr==InlWnOXpoL3 z8gLGCsBCo*)X-x2_bYhcEdBle)vkV@vR3P9Nyh8zC$CK0lrrm2vhm8xVNu_w*FSmn z{`GPF)KdjNpBb+Vh@ACxnyqy!|DVa%Q_e;F%<X-%W%--xIXSzFD<;Z3`SGu~vVMv2 zgtb~;clj>;F<?LQg~cbWZ<1*7)B63V%|c~;W__7Z^s=t0{(tM48ozyU3bS+dcz2(S z+q)!Y=YqPwU#8aVchU-*Dx1Zg>RtQoHUFo79FZS4PFb(e%g>Rov^A&d`s@1X>z|#B zuRnQ?cj=#LFRxC#8T9nuB6F=She&~lKl?r_{re;w`8zmr6{qIzn_)p)mzh|4M9Dwi zBhq8^+O_gm&Ck4<pC{P7Wjpoo|8(W8M{Ym)ruXS*yXxOnm*ey*e7D`$rK0K`emd=h z?A<5Z<-Jzfe~7>Ie%hqy>!Mb_CkoHe^gcChYRZM~OAEY>6z#=d^d}xa`Rl${RQ?6u zbJDZ>;_9<k*i<k4&^bYCYt*R)7lW3%WzD+!^%DP+bIeb+%X=G{ztdaZKS@`6+7gxZ zbrFin{?q&8MQ?t{a$WmPUTL?Pubp}PnmDchcjNa($9>w8nQ!?wQggqnr&rqgdlEYO z|K02U-dj0U{($5ENzMP}?)!B<;C_f=D#r=mZL`AHO*RbA|8x5^FUOu2=jHP&#C__c z<lel0=egIf=%Vz?dhy%+FJ^vj-Cr>M%buXB_}5;iKj_L&xo$RfYVn<`aeua5dHurA z=g$7m3wmtM{>_*z`(zjErmto1zRbD1evY>Jo5x{_Tk760Z@RzoV%0;Q4<+CA6$6jz z`97ULdC8$|f?9tbo9|rp@Ywn}SCVr3CO0Yv3D0?Ly86koYfWXIQ+2gYsRlch2*n%E z-#0Vr#Ljos&0lt$nLA_R?~CE5R$t$p{i>wz%l^}IXWaf>|74qG?%Ev!362wzb6M)T z)usPU`}e)wrgYsy*)1P*XIksMUa<LD#d||%?e~>&5p6!H-cfdk7xb<u>Z-r|-X<aA z)ARh)Ta(+q%u)4~$+_URrLU}0#eR*59iPx@;rxT5n_K-?co=;xY&KiOHf@GZTa3}W zwC!d}hu`l%ak{a0)9wdX-9&1NJ2uasR`|25vuE$kfY-O3Q@*y{Wj(xEMs=mrDZvXz zZ=P}2|M~A}dg%e<`Q_pLSuvk`tqlwJXKb>xZC<%r?DYEklCP3KPguKW&8bZ<pS=pN zN%2b;&;F_NS$SLBXN}XfR(swsKYwy8PVJ7~{{K=_{+?a9smwQk?Ygnwtuvpd*F1b_ ztX}N)P+QAEY+rKSkH=n{^-P{`^PBs>?a$VG6K20(b@aXDrQ#V&xHQ`n#N&gHZ7<+! zJNbN%cim_EeNo>xYv(`9|68J{tNQJQ@%<<FO*grxi0m)(G~d^=;>q##J*H1JF20YM z@T_+=`~JMMQg6SfBwMA2d{%3D;%S%Gxaq~+Cv$%v%HHy*yl0o$2lo?`j`|y%J+b3Q z>7=%ZGfzW96rYOz+hM+M?^f2pH1}PP<=*{T_3oLU=e_*>)t`)_#n&DFd?oGQpZHg? z&({CfsLh+7b6|b!{y!pr=KF`9wAx&?@vYy!tGBh6thb*U+FkS7({4ud(Z;y}i3hH` zO^v;?^~Ybn=G?bT`(|zsKf5Dj?bGN~zJC!lx69<F@Yk&3Kg;pw%VmG<@O6Lw{eEBn z=i~8DPfzFX{d(<o-tOGDx3=yy5ZAbNCCvTwi`6M}|G!f4W`19?Y<E)6o{bAXy^Bvg zv+MlBcW0{N8#vzVnqFgZ>W=<?S>611H}$J8^JvaEu<;A$w%dLpzjL}4Rw#AO7u#<& zeaox-xWKKJ$EI$)qFbH1bBY`LscW}SuU~yPcaiVwchCLKyxps{grnmBx7+!~X=i@C zSlmBNFZPw`^!quR&t_d)b8}DS=WA=D^Y{IHCitp1|JtdmsTa6EU0{fuy!x)3SsCB1 zkXv(84&*#Y?)zH&%F=jdf3?H5)tM*Oc(%43c(=Bu`bZ$xKTosIKR#;jo4Ukq!6E%L z&$G`~W<GnZ`tNy`#GA_PlGgL|xYaq?=C8c;BjIIPVwTgq^&ih$KP}w(zrZtgW@2T< zDdEU1M%$$~YpH0@39!Gs%vajF?9F-m-|txezpwxA9H^MT?`PWfyt}uyWCovmCVXbq zU#4>{pHKOEKe^ob>8Z`n%Oydx-u(8z&%u7K?$VC-EBEiee|W59--B1>(@xn{TU(n> zSZzOT`}?Us^DU3x+HErNT>449>eeeO`?*;f??!h|`Mh;vq>*Wi;>W73<_R;c?|CWe z&U?k}pKJ9-@J@w)Wl)ry=H>Z?Zv+d>k8Kw}zjKRhk*#iu8l(NH)z42vJImPTEh&?J zS=5)aJv&WH-&uFnghK~^Kb;=m#xK7wrSt#6<d;@;KOVL}pI80vvcJ9UrxVKBAu9rY zB^ut#-8a?5^2Sebog3TOG*q?(e)n$D=BV$I=B<;CEV|2)A6Gnukx^#hk0lKj2Q)O6 zh$Tj^fAhxiRD$MbH7oD8366&!%05-E*dx_?K46N#f3BEq>s9~e>29%G73h4TXHDGR zU-PQpZM^Pw@|E4cACGsx+tuy7ETt<>gQ?3wfaz;Z+{Y=7imhFH-!g|Lw#z1TP0HYI zYTN%OH|W(i{<jm;I=ULPmM9#l`}_4eyIe)WRW13`w-ziqXUt{y<%07Zo7U7T&$}9w z6dcuGc`xJMcmCj^eH-^~SSkIgSa<>JM*Xdpmp8rde|D##K}+SnJkxVGf4iS5+A8;D zJ}k}McGLc!V9Uel@pYc6jHWM?T^$5(bU4`73+vBm-}A*|<$;IsPoIB?UK^KnY|`tW ziCj4^+dfa7#H1PibDNv@ORvD#SCW(7m+brh@Av0tGt0M>->)tAdHL$<>hPsrqNj>8 zwiG-(q#3-d=HpTEd#~(%KACJ;{LCct(vjaD!A3m{cc!err@(!$?2L9<t{Qu+663aL z#@zbN0R=nb&4R;pOWr8|`x9(-KWN+C(6YP-5upVY6I4%m=S(zw{m7N`sj>T`A3Ps- zGTUZfz10+2vY0vL`d;R$xoh1eR1e>0<`wdrwPS-!#X=KXm9yI%O8@*nxxIVoBfd@d zPhNU>C1~4qi-Q~999VEpV@){In@2NB9)G(v?Y77F`jg4arB==P?#6LBp~2Ppz&oY= zwmR7gGKad@pRY1I&b6#Ovv`{HueY9$(m&rTnE7YJ<6Ax7-WnME+0$#KU@lobS!e#s zg6p3&51h>2uzAYzn>i{goQxLls{8xP{9eW3-#Mpsx4*f*UVhu%m0~5gbGOU>S{b@J zEaFkGob9jg_wTB&*5CUj=<lzu=AzLB`dK?YBfrkPb7|d?-ifzwCd=%5viG-3M*TN$ zqi<r*8xCs7cR4Q(&s2X|G%fkWY)7^C_Sa4=`JM9U?zz*q6y9^BYb-tz=#g=An)~#s ze(6u?dYtUHtNBF}JWsq*-Si>%_%(Z>Rh^sW`%bH_%Dq#WJmd5-%h_q_HbJY_?~z<? z8>ppP+3fVH!tK+!+Qx}Zff1(?0@Fl1Iv)sp>JDs*J7RUm|BqPli?;T@iIV5@bl78h z3J*pXy}EpJmXVW3kHm`?`&%A}+mx@7DU9w|Xen=7{(Z{VZ1ZV{{)=0!>%Pa6*l>4- zb@zYnTY0CFHnYZmWtXoxu<Q6$-z^tkE}wsIk!yEI?vyjmO3Ussv-2GZHJdqON5cL7 z(n;EZ`NlmAQ)cNcukw>^o1fwx!>0K>mi^>}d;4x_+>D*GPQiQMs>TDH(*zIx{$%g_ zWF~jbmOwA*3Cln3+nxLW&cuX$wp(1JbKjhZ|MbLilb+S_Gnd78oo`&mQ$B6;%17zD z+~zfW<?{c_H$kebG%WV2joccMhtC_&Pngdlqma9Kamf07J@ePCLb+4UG}d|Xew*l{ z|C@F7#`a&+GZv?`>c_-sMYtK+79Mmz)-l<8OQ4dV)CPCoceU#_MeYl2O<}9}_U7h2 z_S#=xZsu;kyXWOf&C=J`-d<fDp5^sOsyr%x(XtdC#-yt?HrE2A-MQs^4VUbmbYsVk zjY}WQPSUS&ykEIsPvP=f&SJl^sJz!IYo5Ph{r&9qY;Nv8nG?JDrKJ+z1m54klAGlD zWa^V!+8<BkKRp<{@6q2GS)Fa|!Ht1ZC8d*ImmAuZl)3*^aZubC|NME<i=s~7uz&X! zpFG_YyJ4zT&4QX2ic-rMr`g3z+)I$2otCkBy40?N@r>0+D@8*+*nZqB{(P(Q`ij72 zUrXma|DfGvZ_Dl!x`!Jb53K(qn5OnbYw`AP91o^t+c+&~yRhHT$l>Dzwr<sYmT9Js z^EbX<X8nAMd&&{bccsnNlV8fYTK`b^{^`(^jcYRR|D5weLNwGNx#x<;o5H21&h@6e zUbT`__4<OdYO@3FYEQoj?9LBXGKzDyZ+)`=7;k_FqZn`ek3AQ{&lr~N@#*~YZJFJ( zXy$v3bwUYpLcfkb3Qupl6sjoM5VNnwGTmbx`|o$V*B357H?=qV&AUCTxN}8vHauVJ z9;~D=LF(+~P@RU`Gv@5CQU5Lzq~`bTxqd0%tIGn@ER_9>_j~4M9nSsyuKDblOtYi9 zpWj3rpEL1kUu_77P2Ha+-M1Ilh5R*;V)^m?hbHI#zg8J8LL!{iWw#ud16OH2Z~MM} zqTbxK2GdIFgf^^y@!k51_xEfi6WPaeJIjAQyR~xRn`?)@XF8-a$^8tQev*CF1fGm_ zk;xp>HyxL&me}-5Mbg;$*sIC0lTY_F-2c?k^<U>N@4Kv5oyNujMQzDXRy0{XG&!L! z)RLMT!H|?RAvE*K+3mk(p8siAWSemPip0t#chZ9PPu5<a{PC%J9oNbH=eir?-E*gw znaE$?{OZu71KJu|8%(*<s(1gK{2*~c=ClLy3wL(ZYblDk$3OfnAzSn1fx>P(d$o$J z65WW}+b6CuhkCH3d~E-^ENorO&Dk%ePcmRHw++3<Ca&;v|5I1C=Mft|1RZvHHBJA? zJ^Lqp@1Gp%+;l&a>2k4T>YLuCiB$~_cW%B**_qIE=ik~pyW{dA6_?wqe=vC-@gVW@ zWXWq>FPoR2DSdM>Oe^nwoydlN2DeNFo?Lm)qPKEF#^Lu8oR9O@|H!l}x|a9)hUfFZ zw7yBl*;%*V{~eWC;SkWqR5vX=#kh;RI>|t};Ll-Jwrf{chx^ZV=bIIhe|^uFd-rTk zPO<lu_lnNh=xXGAg_|j^=JQ$ePP?4VXU%%_ZYY{({hgihZ~A&(DU17uj`J6H7)@ph zm#g#m^SZ3jrecd?LWWWL2Uc|l;rE=UnnG_#o}Zf3wl>H)>PzvzjkhG~l4gFBXqNhB zv-;wZkN*y)AJtZ=+w8IG>Q_6>sZE(%FWzhMal8HT?zh4>FMGMC%n!G0>#)9}8M^;| z-Q91yy|eD<Y<qui$KsHKM|w9_G&pg6a4@<u@1=^}!ZzLywt7pqt`k3TaC-W#t9P!7 zSGOLSEyW-9C&=<gp{CF^lZyXuHlMf4Sr94rU!~#r`V-d7a~N*6TN}xVhpvgZ7@h0D z^(y`1BG(^gy3yO-?0)a%dZJA+>G|C9d)4pvTCQ=jXAN1@UnBS+!#rXC>Kazd|E4Q1 zUyG5Ex=_FO^$aJLJv+~+nlDKz-g<6>?w*Y-YDcI0nCZw0^?!e-`@hEh-}=Rs!a55s zZjs+Aui-y8S?}z+SPfUrvXT!v6|H}*9)IFqo_u2Y-;S3Ica~20^X+wv_aa+subrRT zY=h=3h+O5QGGFW1(g-Ez1AR$Zyf=3|i^$HnufVl$-E&JhkHTpZ+A4i1YCbazYJZhX zm-F&t-^Ep~#4>yPzS`f5=1l5u(q9#3dgEt;n){B$51LLc52#gNKUtjRqjy|;+?iRX z+~;FvwD(v_8m$pHv7_*D)V7?Po74TPQ#02T1p9m`KH!s3c;)TBTN)D^zg}J-{`8ev zn?w4-48Ph#=BLx5Pe?AV*&4VgqW4(QCy(Qc6wRA%RlH03Tz$b!vG&1c&8~KV({_tD zWQ#ADz|k~atIjfZd3<!}v|DS>{3%_rrA&QVNN1s?+B3IAdC}CF;s;xvtdn!RZy2Ea zWv`-s?CFHXg|^O3-oMXTzn^1Ox@x|e*U^r(d)Vb`3Z9&pn0@`<+nIBI-6)P-8)aIP z5PLGi&U<(6Hr|U(>mKP`zmZ<7DwS_}aM9|H`DR|aM?Ww=ycV4wYQH=rV$Hh0-zIAC zycJ+~UFeju%z5#CCWF^eW_P#0JD1M=OD$y9mkG}jA4)iBZ#)yQah1vI<a4LZch8J^ z^!`mmZmrR~_p>kkzyJNmrSF>MjH?B%PZBvhQEJl0C4EKb&aLu}$zJv(__`GL<Dwqf zo}lc*Ws5!rh6zhPe(>&4-_rRDx*o0Xm59+16>9t>SNkRKkjT%oeTH*Qk6&2m9BC#w zf0<el%heTui?4{RyJ=!PiF4<s!t9>M>>uZz-KKbY-@#_~%c1#O88usYYyNyZuI@Wa zWP-c=RHugEIij1rmoB*{Q?M}C#Wd-9-s{gZ=SL;J+IpDpL2~g?J+bA%(=HjeyR*J! z`&FiOV@sp3e)5!dU2V_L&b6;omQQ(Wx>)CbfWm3dF7N3omjhqjbLf*%mOOfN$HPmN zD_xmvCIoFx{U&vurRH3i{@0aT=g64u$Vh7VdpLbU>uj6CM=st+AIKg)HC4NvM>1*g zNsD<O#g=DY^St-viik$o{mSQauS_|z^}6xN+3dx|i()0t&)+jMR&z#RkEC&%+^$Ps zuk|qWb=AcmoFm7&M?3av;e(554cfX-%p3%Z&Lzrk-JG^rA%5}%KbM+28)oNkX-#M~ zIh?*fZ+@MlPeWg3sd2G*V7`mIf0ul#?C-|7gU?s)IT<T*ZrA!}(^L3^JY>B#J$=UY zn2&>jIVQ4yZ~U$~vuE#nvS8{AO_gbUb7oCp6_5LVq?yBXW^yZwY4d8uxL@aOKJ)mj ze0^<gvF)R2YqyEVRXqIpoYzNgYxecFpcBz5rmd&id8Mb7y;<rK+R$9<p0%|q*X_Y< z)@LO_ueXWDb$r`&{ouFCxpU%wn#*2|GB@$c-!kv#^R_j+-f})Wo@4*3c2BW{@pseW zl?{J)ximIx^$1G*;JNXGZt>rhZ1+#fOc1}4JAIFK>BL<gpSEUbh(Fm9y=vE)yEc{E ze%{f(=@eFZWb)c4uMVZh&RP9Td8_l1-Qw{z7c&BTuSPyT*8BZVv43CvhIMI=xfk!| zxBqj&dxBT@=jZ3s1ut(*KHhN6aMioJyT8|dzx(`@^XvTmf6d%oW(X}v{$QS@+;`Vz zjYPmSH+HpEuP!cbUoH1uH};Un!P$OX&;3opSBL4IQCcwJ$FJAxpP!rS-F@$~@viS* zF8jxqTy)Kxy+_(QprtdX`G;pi_wJ1x%kS(^`n7iZ9@o0x_hxT1RL#0v`t9plt;hTp z-`ZslY`FPj`UVfH4@u6=o8wH5iyU8)d;Tx)&)~@$)|o|RPG)btQrUb}z9iSaes)yG zW7FHUbzh5nQtmue-gr6EudwgPpT4XGrk|>OC1;(_5DN5Ydiv9Qj_|%a<vKgUU)uFf zcB=Y%HQZ9?W1q<CcZd1yZKm4gU5_olo4tN7pVbS6DaU_&e7sjb&+Ko)vu{y)OTzm0 zHR^H9{&eNY5!0@AX6e($v-M(kU0E4?JlZph%Wm`fy=gzDx$InY=GON7`L9Y{Ow_FU zqc3efZ}<A?9cOl9E9HaPS>3aLZI$;`-%)X1uIb>dJx#?uUz&d=9}4)AUf=5SV~)q9 zSLwnl6QpKlu8woxywGM_nOp0V<0iMB?f9T<mEIb1Zpr_kjQzcOE<C*1RynVF4jEp` zxXdgf^oMngnV9syd*)&s5nE=iIuj_R^|Q79^hW+CD|YIb3(wZIE@6<fj58@PR#I_U zW#;uP@n(yW#nUOld%D__mwdlhtv~bf`$roN^KCX4GY@n6$js04eckb(bGvzGbd+tp zU-x@y*5VZHHLT}tKA%ZD%M<;U;c4&5DLN~}`Iz?qebCL^GbeCq(N+#sqZ=iu+Plwk z)N-G@^-tyVXVuF*4-E{Y4cED@NV=bV_Un>mPTzuS&tGYolwBby#I3ylm*vM#!c1m) znU_L+xE9(@cv81udz<aWiL9FM`Gl2bh_oJYQ{1TdEcQi#S@D%Xcgg$LPu@JZhj;I! zJ-%@XwG;My+r8k~<38(i9zM^*RZRD0US6g?uOg}7`-$^*vjeZo6`wK8xx6&&#ja(~ z{{8*ES*B#^;yvkSJ}hr5d3w(zpZU<wB^!SWzC3gCgyV!6tUPO!Pl|~ur|M@v6KkJ+ z|Jj?zmCXt@Kbk7{_sRO*>B>EF{l{<pNUO7)Tzd{A*ggq)lkR(5Iimj07q3SWowNR` zG+aKh-XrhQO})CL3CtdURL!_fzD_^<koRD;bNu%+flX@;nnud}QCR2l{%u%v?oqBa z#m~=~@v3%jws?JI<>igX<+6oUr!7`~A1NLtI;Trj`^)YHiVh#_LNBxFt1S&Ou>LkV zMZ$MK&%H1IT`R?Np5_}mp84c4>2djmX`)L*xh4i>g-<pNn%r6UyY#o*^fN+54_8kx zTa!GkPT{qWp3DWlpC7YTZha08U$fod;o&uRG>+tzZ?u%y{8W45Q`v`YkM%bOdPL;x zzVNIkefiv+?{{wgC=z{M_VLltdoKB0t2ne+u1tCw)S2^qe!bmti)mJ8tWAC;yxFil zf5`#)gI*WEa?Iun@47e5DdDx&(!AjOp65?iO76M7-@UN&bi!rE*Ead;#*>(OCj?ql z{j_^3!pqakcJo8P7OPtkjf#d3&b0NK+BdOXGdy@@yBo93EcG{vUgutz9=-f0=!WWr zoBw?>Z{BAJQOZ1X)z0qFK2@#{jy63~AJUE<Ima4*xQ#bflW}{7zL@aJ*>xG*XRb1J z?T}lTX0h3^J#o+Wgo8}$w+o1szqwerLRc#FTIl9*MM0LkK|fVjB}HFKy?bC1H?zRf zoyCr^MYA2(IxJ1w)G+CqS8OQ9mDYtZOIMb<W|?nIxOH8}t}II<{_N+F57QHFUHJN^ z_oYFQv~sq|TgiiRIqkQCQo}cI<(PJJ<-3h5_kO%=e$r;QiD)0^-ubdMp*|9G&OF_B zV1e@fP4^`))ptBF`ufq^>5b6(1AQJR_FbO$(XKPl%SL39VZmWOYZr@}wC8JsmU^wU zPM&jTN#Updy)lPU_)ZsHQCV(!BQd#`S6=(;a`TUIvAh3%yB)o5osh0nu9Z$_-=){Z zZ@fc4nLB^zp7_c<&F}r*eDnQhmgEax_)^rFa+23D;~neew!r^JCf2sDia#q)C&i0< zM!fT>KNY|v-NKqLeaVw6)Wb!-J@mxx;~qC7&(D6XV!EH*qoCsOEU)vc-#prI^B1dg zQb6%>@5k@<E!OzK{_(~p<9SDJ7<^pv=scI^*J;`L5fR~S4bdh7V(e=!ZO~8moU+Yq z5$F1MAD6LwITFF#x$^YE2ajeyy4)a<-F^71zPF;-)dMTTJ_j8Q&S%Q$3*M}{ezDnH zorr1Ne2qPO?7Z*Y-Vqe@xwq!mw1ur}w@=?&C3T5;5>wyAp1$}Nd;S?WQ=IFLdmOXU zbUhy_{>+>2&vKc{-HUsLiVnCgJ(RVhs#W=|e0FT6;jZ3xCnGnZO^Hjr&#}B#d~b9* zn{VEk`KP(pFI%#DVT{m9Tc6mUs+W7CY<`vm?|<<3QTigb)f3_mm@8*p*y<{z)BiW+ z+YAmxYtDC`DeZT->!RF>xb8jUjJE!leP?}k?Un;uL_8O*^N#qXk~EEd`=jHVUWIq% zseEmWpQp35e0RXFyHTt1eyA}e`K*ajd7P&=)jrJpV}Qq;){6VLrm1muzWnj$^ZC86 z6}^AG&GFZeb6ux)gR`e(-%~4xMP`cvUAPKgzjF9^{}EH<>ellH|0k8pf2w@q8TUK5 z;!I??;-kBg;Swp%g3F3-?BLp!C%#A2w{Tb2^rzR(D{5}!e<t2?{oX#ko7-b&aX1RT zJ?fG8T(_@XczN)*N$%Zjk7rFf(8l<?=yBe}J#U`gdi-*}u^d;Y=p=Koi*qcCb25U2 zlg+JuiF7y_NjXYLD)oFm;WaVBcb$97`|e#!U#?pCBcIuB@_m`4?BySR<vQAJa}(I; z&DXKg_?efsn9?+N{kY6EcH*6TRJCW;6p8zmC7srrk@A8$ke%5rS7U=>=TpDC-|F~z zUoK?#IBCSVdH$KndpK@b`aC=N@#w^Iu7fjsn(i}6mw%j6p`o(jYm}LDZi45QT}el| z^u5hj>n&D0@z>_j%~Q`7zP`i3`|E0W{LPYQQ^Vsv%84hIrw5l!J~vrv_8nFhHt&AE zk{u~ctr-r<mv6~^{QPX8W#7bO)9)=Z{FeAAA=2jN4;AswJzTvx+;492+Mkq3*!}in zX4#p#>v_9p?R&y^Z<}=4$7M5vZ`|rVWtg!}WARE0adnQrJzMKOMLlWVy>Z?g^<!>| z5AVFHN^KVXVt+57LXRiXp+~~-(C<@u7Z<f|cM89G=gy{oha=_$ue<VW1B1$ui4%A0 zo8EqMa`N6KJURKdTy}e`O%LAFrfqy++I0Ju51DIoyAN`wo!?zO>m-NM#gxxl4R;<M zJ^gepd-JP`|Av*{9xdRptZ-A%SggWP5z`;>VvF1Zug!aTKe!czK1^Tr;MBAoThI60 zU3@?4NJQ~Dq3YPwxaDeA4V*u2nOeT~UMAJm>vV{Hn`1NEy+mgNFNNakw{2$jE?!*y zZs+mW#z(Ywm%hGsGN*FC!LEZshTra0zyG?J!TqQZXTg^j7w?^OULdX+vuk^suj<m> zCu=M%f2>q~a_w8+{w3ZYm?Z1F?_Bb`=JFv~JCyyolB}QR)Jau`t&*Q)e)>?@wt?@y zZuzvlewqBZ)+J$+-exO3xS4<O;NHEp0-Rw1>DgO(y5>xY+Vs(JWx3*Yo#j82HVXdE zb(nq2XvXqG+lpTF?)&<1qscq9`^#H@Dah4%aDL&lc)*Z<hBZV`y4+&*w(RSCyXLys za7+{Tp01aAz1!pYy{&><C*GX*RFS>dJ$;sW{yB}9+{9Z2-|v=hu1h+4m@WCxtq-^J z_p3IsWh*CtQ28WNbV6}m)t75M4C#trt$rT6vXJLs-M`y`7XKAW?rpO^{eHit-NG9t z(ze29bAK$6tJ&!zDOd8(q;!c-wNuviskd}n!}&KJxT$#L-0kxwH<!=VQQPd%WO&fc zX|X(ONK<0m+%ltjCkL_Tg55JbxH^@pzfRJ(=Uh4McrPE%`N`{Lj<8hzu8TA~d*|Ql z@)LE-m;cvHSZA_(WnqxV4bzg>*Ln+t;yfw}g=P2;UXz@~ync0Nmf)H5yUO(~?r(JF zw-rgYT+e9EHPzRWMVU3{`3BK1pPH8U@pbgnZCY9RsaQ6rU;2+pwXNMdyPf-5Sp?=? z`f`1~)qkdxb}K)bxgJcB4ChpJ%9&X19(D};5E&@t%f3b8rJ#y~f4su$yCPcetPCDy zBrb?9N$1|N{=R06Vq&?#fqjW<WNvj_Kh*bn+s%uoHlB>A=M(z5`eps}J9n<hEN6b* zHhuk6;kKs>lxJosnMId%GM2x+WjZ66y{ai8*X7BsMrL-WI}<cnj6?ZPJ$tdZ-)~K0 zPwAtXEuo1U%(5;m;asxr*rT8RJQk)4i|ZJ3bbiY^#BVz~&9QXDFUwsyYo^G!@b0+2 zy|bZV-Wr1_`Nz>0o;miPK68w9%Gd1j;(8Oa&-E#9cwU<+O>F1-_+Y!&<RdA`cYUi` z%#?f=zvmLTXme%R9!GQS<I7V1n|&|b!gb8-fGzj>#R-XzO%5cqNOZ<={z&G`Jr^DA z7M!$ff`PNe&nJ^F_XQsL^|D3S@58a|6B<iihO<4Cd#H7(?E2H5-ULb3q?L&djW3F8 zbbfOlNll&DaKd3B<97v~w}q9ndaq~dr}s|OGOg)mcb{TWH)C`9jCl?+*PmD257(N* z>ZW-2eTQ9Eg~O}w#<?E3R$8$ESvQZEy5%ig$Z@m2TdQSJhDh0)E#VPt;fvj}D?WwX zyg7B_m0X62p$Gi6BabGU|Nh7G@4LHE_(|6T^4?PW8z)s67l<0S9_fg5-f-mL3%yq_ zZl19Eey6zdrMvEo(|=qN)fXjPU1gUqJb&GS7ORpM4eP${;{QG6gu7Aw|F7T7&1K%q zO4bXu64j2_zy7Z6t?B2ocD=6N`(>};t?dR^P2Q`E?|UcnVZ#}tb^o{BzgsD#P%~lP z?=F+KvJ;Me=;)nw_`kOMy@war-#q)=9#EX`>^SL%#QLYfDnh++i^^sQZsY$mNnu)^ z!w#Ebao?4mx56$vr&o$}PBDx0yk0zMdK<SN?{~{f6XYg@Y@hq{q1>BQKTp52V+;FJ z_d{H(rbxDMx8?MSA5U<e|7b24m}R&x<WJS4S-P{Ye+>3ma4>uNfs#Et6cx8Jwg;;& zYKSj5$hxEZ)|2w*jZfsW{wB0(Z2N85v~O?soZvt|ef9sV6#3^ru;6qPw^^sR>xGh4 z&dZxz91a(^=iiqoU@iT>{HK26{>x5rcNQ8fdi%}(@PzK^>z68f_t&4^ncTX;+>9yN z+;OpgeOO0)--qdUzOgu4?oZ%d85wx2Ic`ebfAK9fK4;HsKYO&D)oF9f1M{qkms7Z- zc9$4c`W7v_x~o3RI_!GJkur6*r#Z$4%0C;dnDP8(-SS_r0y~~DtthcEo$B@A>YdDh zl~bPZM$O-QXGL_xpGkYUFBHx06#SeL{o-qu+HuE<5Z%^DgSu-a29eJ<ODC$-CvCdK zF+Jy|^X{CdN`=dAUY)r+W{$+!dA8Eaue)}ONwPOxlvT@;wJ!5%cW2-4p^<WLUwBx} zn;B+~--C8fEwS~Fl6xxmaJ~JBzwW30T)+GBk3e<2GJE_(zwNt^&*Ib9K62t#`>v+) zIjw?)f4ItLpR>MX{(f4z{-i5&TbAv8a%FjL{PBBSlQrxAs5$@U`seKV@bTY2*B8}V zC*L)AX;=9=u2J}m#s%HQKMmrPj+L!SU^U-St-0E`PySq`rHYw<7VnG_{~gZvszVm= zn{%;Un0tO&*x$Q71vTIA+>EV@3k`ZPA$!U7tE$`YX*2bFI_$^wkc)k<z`4nD&&;o4 zyn9jf-)_F}v(sX~d7Yj2?<>Fd(|>h+j|*09U|Re<_2;_h=VeUpRVr)^b6+WA8qr}t zrR~EdiOMw2+4Aps-|#uDKGZVF^G|81XLIa1(H9bLEWi9<{dd3a+-WV%-!h8J?NZ~u zGe48P>(wfFaLUIy;Y!kNDz{HvaNQ#sB-CP>eeJ>4X33H!M^nL^rte#y3TZ|9pJcU4 zJE6Gg#ob9$o`_1DF1LyMwCEvwZFPF{b}u9Q-P$ML-%MHbm9^~c{hH6bYj`7s)O>D8 z%Bnq>(;~Vcv+e4JeQ^r%Hk$W!rgeqNc&$@okDj{e<dJgbGxO&A6#NN&XmIq_429({ zIqTM6s7n?*bKg?_bdBYw*iOys=Xz`J3ufG0*>AnS<?Jczz%7-s0S2oAPNq*zeOYom zhkwx?T`kY0vMI}d`5j>?SvY@9r0V4Mlcy^Ep4Ia4bIzQ#qJ^PczIWRE{nO`4Tb#C@ zy_qZdHA7vz{bS+At?#>LK68J$)M)?wJ$l^tCcO{$Xg$@`#`a{(a*M6}r_;GqcCMao zb$_n)_3~9)Z)$t5Rs1?@K5y9X`)enx+Rb&E&%0ec;?hT!1v<}~_M}{Tpq(V%KL6nJ z&2zR3Uwic?h3$p0(SG|wfgfCa*X-ZF+45yN$7HK5I`QJ2PNxjK{=9o{<G_*mMt#m@ zKADXl72{{sB(idRu05=DP|)91P{WSp-7Cf7<1^cjYKDKf*}rqfvb<d!F8`Zui)?sg zZSEl5c;L$MIp?>u>@h8Q+<O22kEreG{ohu*To!F)a$yL2dByh96}e4U63PQz1v{D= zv{Zzn-rHq(>CT;Y!7yjlnmNJ08ej5>rHHyN_#sg7I4}NL$KGnshRVW^jtiAfffml% zXl#n#o-#}Q>f{X-t0sRbKBc%s-P^M%b=xGSs-+wvHca+wCTRZCVYo4Sr3RCrU_k2= z#-8A(Utim-oY%rKSud~OjQ#r5)s?5Ro0J5KS>{>YpI*fI`ey@2k)izdGW%+d6;7WL zx*NIX@h)t-EYoy5`E1(4%H~5dE#lW?x*YZi{wS_pDYxc-tlQsUyP9<&Nw0j5UtVK( zC8+zwR;7mf+nN#_8Xm-UCY)(YuUA)nyi!2zb>QUhH}6Zz%Kr;#6J4WQD0#5Q;$iU2 zGt0!g92P1b2s@~K-Fn-JH|IXSZT*~fb=IfbQjy;r1^g}FxXeALwPj&OeNv;tLoF4X zt`B=WcZfYKU``hBbKM~E<j~J$w^@yfr@YV96^^dce);G7d>K2L%k!u1T>tBw`5HNk zN`Ydj+j}~lQ+|Ho&D%EHGErkCOZ-fRc*gr)weo*{y<YFq=w+qrc;6wXTgo)c;ohrg zH+c;vH<k-->*Mx+JehBAQPokuu;_tn>eIU%xlYC+noO+E+qaaxjXK11c8+E7%}uHI zHdIewbNugYqWoyD6UUUJo|O;p8@)@r|Lgbt;8)TDeGQ4nrOOO%{5`BK_P*-R|M%91 z)@<Q;RP?Jjwfvnji^u}snMSPQQTlm2Dc|pwtE(yQ5oK(7wD0j%_StGo;iep&yC1eL zJ+-drt&Q>K`R1FKX)rAn)KF+;`Oa@*xqjcTtc*K(Z4){&uPpPOed%y#9s66ZK9~9X zRPF0uZzw**!?s<NCtN4vhgr?bTS8nDT<#k5Z+!H!V%I{|JIwbhPyB2-a*uJB^Ni$O z^L9_%{%qgjr-uXElsZ*pRwefMg&*h*c;}*-k}DF${(6aB?XM+{zS2>f(=?n|^j5q& zotz@0+hhH_x7<TDM5J+xfQCq`%aZvI54Q_1)Vrj?@xS=VME7MoC0kEP*0yfuIdtx} z>I;>KB|l#ON}K3hwDn1C<1AKfHl_Oll~ucAV{ba=+1I(g<9vL~{xfUlHS;BMmy<Kz z&8z#B$@FrT+^=P(IX5QU@D|lx=DqrH^hP@kJ(j$e0zz^Ir8^8J&H1uIV5`5Ypoe&4 zQ-H_)`u~5K`E3$-PRLs6HF@z!nXCv}>b21Fu4LREr(^dX`1#yBtj9CA*e%5)ex|L} zl4Zx(trIzvxQ^#IxAVpBy>(7}Rmsz<tHbRd_ZVL~xVFT$D*Oz`nR@30Hm}q}U!`>! zE&M7XI4YMf;+VqN_(xminp-nF|G#&;-(QkrRsWVguTpJcg7Osx^>?Lbd9oK@(bB6p zyzqq1?wCE3*Zj0vBE@s|{SPx0|Ch%<oLtm<>GGq_Sr<Ih=az=edVTuR+>5)JoEn%< zSFS(3-TUeC^)lXmOv(p0&)nvzzGm^`{E7X?Pwtw}ll)|gh-yo0|MccN6Rb~r^2n5h zcwFB9JErch-@l0PM{2CX+R}0oT$|1_W^4UFC2_>;v~ywj`H(~E-D@A~ub%t9xzye| zor|Y&h4zKSkh^CWp6Zc0c=xWG<DKV`iiQ6^o>1<u`E*j9F(F~khPv8Ja}NK!Z|^#` zzViI$U-9NjL7k<O{``-7>P4^lcT6}k-)qB$yM|W|Nt-X7)Gk+*@$b)1P0p7wNskNO zY&^a!*eFYqr{m%IXZl>9a-{b^Uh!4^bMupFqI1p9o#Qn>y14Yj)4cau_v_~!IlNOr z;pN40$wSMgoD!)xyv<C%%52@nt<4<r4|7j=PuNiLVu=mcevNHM9;U{BY83W4xcl$B z>*jWh+1te)y%gL(QR4yQ#-6`fC$g-x((kcE8hHLti1@egXZC@sjB_TI-@W~i<N5FA z3G$L#@0OZQ-Fw?cTgC6Od#};_Z^@!<XPx#|ecg7qEIR4`hPB%Z9y+Z#vG2ztZe<zu zxg|mq8+-bBI>X;-{&~s9ZN^u=WPhIa%HLg8`wo^)n)$=<?iQ0u@hZdQV?FBgYc9>; zz4PsE`F-1OH<EY1-R6A1S^D52rUGZhh0}UMQ`II)u=m|OF+0rKer9Hov#vpgz^wIm zJI{UJ%{$wTZT7kF(1^=-?u6}|lbyAHj*PL2jaL846vbtNMqLL2FV8Pz3b?7QxPM|! zVBoB;g<_Q(yf;iZwb-E9c>d&-{wEH3`f*I%(rPMv_~v(um5G17e0Hzx5j(ToNom)4 zU-P?P4)aUf?Fe$)`gB^fT-l98i85*DWuSFli{1OxOya#bpHJFwe|k(&XD-kC&)c~_ zz3~pKeJ_7*(T*OYPbK9)^z&OQ&TV4NSMT}TCY|@;mXcb5anyx{Gne_!X3L9c-z~+s z-CKXJiMHaujxE1Wbh2evg!6BzJ^lTCr2fvwFH?74ymS4$+_}FJ#lP0SjI@q3bj~t4 zS$o~+=A-b>Pru%t^Wx0H-F%r_P6d5x;7<MTSb5`uvd4|=|I=R<PMv&=ohvc@`<p3j z5|x^h{9h^j>Fv4o;!3dp)3sSw+!BsF|9?__{+m*#M<QB>#HRT!xu>h0?jU{fvEK8R znli^L{t8jqiXQ6%rBw@z!<c92m`A!)9iG!1{bAb5jfXzC?2DGS)cb#{qwkYoZMnW; zUsB=e9kZLZ2qr)8{yp_|QV*k}pZh$u>u;XsY)f~RX5>};G;jYE&W6*UxLM~*NAC5J zd!rw2e&*1Qf0K4Te!A^kQ>^GmxyK4WLp&;ED-~be-EBVG@7|XyQ+AcU{`Tgkv8ig| zS+{BC7v}`6Z??2GEj|A?=>4Vr&t`A&f6%?)`_*&L)^FW#?c=kp2YdgXZ|1kV5k1Xy zx%tL5nl5Mld}!SiHfiOj)5}h>`=_qj<g_OJT!dt8YQ=H8nu~>#y5}yCzE>HrF6+gg z@9QT#e!|1Ux7Fm2%g)aZKQ+&Yt?cPNDA2K4`SGlOA#7%H%vQ})-`CG-n?H;F%7oSK zmBAiwtPd7EmQvH<*}%C&sCWC@+uM&nxc#+5|F6r0{P0~5w>_3rddl;1rDuh5s@Jag zM>{T8_1Am8EMF~C(^_l&W~Xl4n}0VH=j>F?leH@O@Tl$g^oe&4?hAi6N5}nG%v--R z?`_{dN)p}kw2gN|)#8mFQD(Mj1_{mwnWk@@c=3#Wb@NPn$94JdTz;IJl%R6xR_pnW zulrM1wgz4O_pdwQ<kt@$nGEw7z3+(#-8xY{?_k-S`+jq|ozK}sZOwY>bwuL)HO=;7 z*0M`XOTHRjI<jE~hlb!Mj=DYB_EY7iTi)Ahk(<DC`SJatvoV$*<}0##+qX$}FfY86 z*<`lqi0;Pn=UV&n?(WLp_w(4)h-J|}5@Gtf!Mu|Cf8M4`uHU4fm2%X0OFoMo>z44I zmV5UuT|2XLYIES9A4~6C^o^)Zi}|6mW8+qxD)Yyp?I9d<)o$5(OV3lxjkeYM+_^VY zyUiz}zA|_t?`O4NORua9KK{EyJbP=_)jcoUrYPqXpA)?&l~mDUW>q&sac__3?dy~F z{ad%AZ0h0(dn9`UDmJSIDXjQv*VH4*7nWZ&OLJk&%gk%hZAlZ>h|ezwF#p3Mzu9X3 z#iZ@B;s^P@?f=akrPzPy5L0dayBlYAsHm|WdVXudy*~ZGxRigdKRpO!GWEH6cI&1K z|M#q&u;;Y08@uz|zY>Q0pVN+=y*4|;FVXIS$KHxbChyg6zj^WG;5q52oyBoeC(BPi zyWMEIR<%~tg!lVWjb)Day?A7*zl2X`&)e)(K});Li&re4zTG3hi?J=|xbey#Pi}TA z%U?O_YWVqjqjPB8*1$*XhwYwUa87+X=ggm)8_Z`Gn|bvlemni?&e55Ye#^2?-sU>_ zgKf*5a<7I28@(={)U($l{}(CGaCDw~{9w+c9f`+xU3yz{-1^9^z+)NL<zBL!*!}qU z3+1Z<O=9cT@6ZsNW%4>U!&WQ1{@8u3{5yfyytp>oM19_O_|Ch%m2b3;hkuvXoL(Cc z7FH)St^M1{+qX1C517B3<aT$dXaAKgPCL%cb~4gyQ#b@#zNb@YC@1b3=CQJO?O)Gr zT^n4yb*1Wh3!guDmuK`pwEM})&8?rmZFY<P)m8m=Tjs3ZQ&C&9TE8bc_vP<5Ef8^4 zj^oOE+1<Z}??$us$v2nhN_*~ZoVnKM{8rx`hYbVt!YY5+q;oISX-a?5S8Wj@`~QZ| zkKJ)wBYrT8e1DkTBKG50)jy$hf7RTB%ii5PEPMKsN0UFto0ng$Px<lAT`^B|wUyV$ z>F?*hU~$oEIGgy;I&<fRf2#g-p0aR#jEZu76}Qazxv!$*l4r8qeJ<a)I3Ka)^KN7J zI5|mz<AK!QZ+k!86luT2HvcW#+@+^?Ui#3GGL0wZ!%_1m0^7~Ju65h;r!8A<JK2Y0 zN5hWuzrSogZ?`$zgIi4J!?lDp*Jhv9Vr>lx*yJpmF1_uK80*!QMx|^;JC&}veO9;H z&GFL1^5*M=hYS*jTDxxV)^51-aPoDT*Z=#EE%|xy%eUG~4^vj&yc4_m>EGAex!<vW zYtnjU5KtAX8d_E;ek;+L>F|-4qOR88)GEs(Qks8U^_Jlh?ODs^`KheU<wyAY<Nv<A zyxg0v5_iO+X_i&#D($(U*ZHhfo}K!7<oPt)EerQPZB&*`n$2=hDt$)IhDS{eGd1H) zW=`__&RMdKu}PGnzFn+IseR(Xse<lGkJ*-KOK*R`c4A%0H1~;q3uBJn-F}+eP4T1a z$@n*+@|@39jw(hN+7#CrW-HHdmOrkl{3~dgWBATr$(FxU-4!dh3T{5nS$LYa{pWSv zg1+9%6ZZd8KOZ~E&2l*h_hOH@lee!;IKBMj#_!TwCaz}xv#o!x|2cX64WC`7nzJom zIeW2L%3S+=ZIvy8Ju4=dE-4ee*1##O_T`1(zRj6EkJ~54wFGNibK{qNyFz~PhhDa; zUXfuhR$le1Q~7$X#x`|FuPXnycRZJmu4TwuzxUfL-n=6pm0KpQX7+Jmxf9d6cf0l) z(M#*j$~2um)8+gsCbA=XS9b8ty`_P=JsUn8Tehy?POq_bVdt%T^*VD>E?w2r?p&NV z{aj<5%u3fAr>q}arpKrJaERQl_SN%;sajS<&h;$Gd6%a)Kb^QYQucSRM6~O#E+xH# z`|nSVzGWF*`R&tPqn}So(;XuXCYiUgFnwU&DI(OFzwf8oyxF?ZY`&Hu3p>OQZ_B-1 zC0rZK@$l91UZK<t9PQJKzlZHJjj&TVu(P+5Z_B<iCzkT*PK#uA9CSLpxWOtSc;D}L zyYKNxa_pJCW=iVQuAL`$PvDN}@3dZ;)XWg`Qs?RZKC#Y=%N{YEI{d5u?sAVqf+rS; zFa78^k;`&sw9LDJLyyy1c>Pok$|OAK@KBwzcbaDZEiuRa^FF1R<W5<!E6Ua~d5W>p z>>r^g@13bzxj-c7-nKUkDd%m!x6D%P^m)Woygq$iW!jk;hHkq*Y|XxIx8HG3SfT)* zYtiw-bG=Tjv5z-#vwQqm+S;{sd(_`wU-#y4GkiM4t^ea8+l&Kj8+VDDN65W7Ki`R6 zvB2e4^*rHK?y4e;e^~DA2+q5;{lr#5iw(tnGyC@@%s#c-nm2b!MpNs#m*;Ov@5p;2 z{$*?6%jpThG06q;Cj48DFMWC3^2p1&{g=;P{k2r6dE*3?`PwRF^Z9JQT=@NN_xZ2W zo|Ii$;wf->V@pzX7k~YV5W@q?JxtoG;_FS1h#iu+bt3OMx9RUvvn2}Mysr)JTm6*_ zS)ue{OPkRAkh@pcGlg5-&i?!BtMajR+~#j~9?X4qX6A#o@7i@yDGmF??s$AT+`GzX zXMB48#elrcH;nyvtEowE*XePaBlXt6M*8jv-??w1+=ci!IHSVEGH;w+_`UA!e!*7{ zX3XU9nW(f?f8(~)19gp#Q(X<38fwb+Zk7IVox4^4*_)lQZZh6>qC&B$zRYiXC*Bbj z506{lakgVu$;%`ag%7%?TW+rLFj%j%dy2NY?=EkRO2$0KYfO7}b{8M}Yu<6-{yhb= zsgAkfo6~$}&)HUKx82TRRowYYm+o$RsdU<X!Ue<YOOkCxgJo{G{;0@l+4uPH_22e_ zpMIylt(>~YTxpi+H+A7fnkv=b@7=pT?dsK)m->SCd$Vj()iDjL4YNp`{Ap+E^dGGo zJhCn<XuQAvsM=iJHOzb+8B2X#p6hD2hVOgp_pmaj$RR@f&97ahp*Q6pFXA}VCGhPX z2dhow#?+2&Yrb4b@YoQqn0RqPk_&^?#p&w=A6e}yu1|@MOK#ohp`!O{{c7beUmlz` zcCK@Nal50wYEwl~OWmz>RVIDKuc!2SmG|)&cIZo--0zgM{q2v({rzQsCNs(BhaUQ~ zL^z(Wd~?9c`<f=*`E6Hv({z-X_C2#WX7f>S^V(JUZ<}T+6)u!A&3ZCl^#x~C&4C8S zmk-23R(I@my2PxaKS_dpf5pt0DDSv`{w#}i@@)%!ekO&r#C>KI&%CU&BTMI~GN*T! zM;r6)n{SV8uADKkVynbUSE1Q^7kP+IQ!M@`Dm1q}?qQGdxfi##W-mF+V-orN+}yyl zdkM8+4K2rxJU-62(m!a!F~t*CXN8_*`OG@4y8P>eVy#n^Q=hI`D_h3)CPE;|N2YfB zl=TnvS`Qzz)IWLerNC{250Cq-^Zx(+ZvKgLr}VGi^UmmK1g6E=Z`i+i$?y7m%fIaw z4s>!@dVArIDa|2lRZXX}tkcpK9`F4q8P+mSi0fM1ExG9@llxzNl@(&Cc9eEiTD0Zk zrsLf!4zK(c%W;ZxwzEp(`9%pT=hHnrWqyPl?`7M)`{U!|)sO$GY*y8`FjP9T^SX!r zOvOJ;r~m#vH=+F9=d(ATSE>84IPFQ95hbHHnfG5+PF%Uo*~H?4jd>5EtRJP!{8i!E zdSmuOnREN6{e8OR;iaEBnUza6C;q*e68U>`PW0WIZ|^?u*mT6(Z6#<@@9Zqo!%gqH z_4jFH-g?e;hvVt=hsBFiqQ9M1?popG^?+^p*Bj9-I~XQZ<emETx%}E<ef8gS)8^jP zd+f)%h_yK(`f6NRo`&ylj=)b$OHSWRwYBvMll%H)_n~bk7gg@p5NVylz%+Z8V>6p> z>@Jah$t#nlujSKg+xz|AZr5(HnUzcBiu-dmE`1R3;1f?e|Jw`FOMdU4lMu!)t6ZV8 zl<RQ5!Ab@Ojdh^20H&>6{7*G_{)ErRJfFT&_21Cub=6Ik-({J-=ImTGX8FlpSDzf{ zcKtEkld<>ndHedGpPsTzKI(e%^)D`cwlaYqnTb#4o@|RPy%}xdus&{S+v+cB<-bp7 zRX!{_uGZC@D*C%u*+Wu6{mhyT>=K@Ds%NkG_JjTDG|Rr94S}oP&h+GxKa;5Bv9rLa zgJbJd)9ggeB}XzoXgKZo_wl&=#&2yR?BA7p_CH*CyXy7Y(^ikJd=k)?t6aXtGVETZ zgI%?Mh2sJP3-ebc(;lR@+0-qImR9ZF{Iu5Jf9I3Ey|?$x`22aIv_i|5yy}`Z%}-wD z?7Rt0oC3^8_4ogo^#2g&5jNSzKCQ4d5mxzS?=}Q(6N!~eeDvpy>!;O!HyvovS<brQ zfe8Ea@}qBkluee(7Bp&Z&B+Yh&uP%wp(3$A_Se21o7jTnBG1RosRsg1J}^?9vGmN< zU*C40zSdS@vM$DQx2{X;6d4;Y4$pgOubKW^{HtUw-=@i5J=r_x#*yYFdIuvvP3xWg z_HSgU$H~5hbrJlk`Nidl`%|}fMw>jC^7qJsP3O4fg94%-`b5cao%|%-8vA97Z6dQk z|B)Tewg!(~Mf+AJ1U<-SF<<t6e*qKs2V2Hm{t!1w5gVPv{;kvRe%p9{cJmz8wG)aA z{w+{bW6xUb;^|Q)%ysfu>oqn1fOf9mlI|Jb5+~@~w`;Y1WKw-R@B9ky%Q~|)j{Os= znKj2wY;wZ&&tHB%l$-lEkN4vO4`$(*1z~kUYhywVH>SM(^J(+1$IqFcwu_#;c1VBL zci!`p56iG7rcOWn(Jk{-+o{B(GL5VFejZJFe^kwX3ZGcmJ$?Jm1n${a_n$m;=;-Cy zuJ5Ov?CZ<V%2?a&Bh7eeo3;1%`l<t3a~o>QqQ0$In*H(4#;Y=&sZ-av-QDzg%gm`P zXZ|ZRZx>(m*5q~ad|P(Q($**ZMly;E4_z~s-?QUp(p`Zp&RHB&<f77jjBm&*B+l)) zJ8{0i{nVT6pWX`ntlV0>s(tHUv1sp~Yh@O@C`lJ?Yd2DMi>!ItJ~i{3tPJ1oqm~bJ z!u8HdaqYRGc-^8pGPq{N$JcM)w<Movs}afg|15W7*fPymdwrKo|8(i9Vq#v*)iRsA zorw`1i?~kKn?0ENX>*sS*dt-(jk9CcPxg_W=wlXtW5=Ue-p3TL-aEo4tT~-o!TN{H zw?~IqUxyp*+kJn5=INR8VxQOk7Uz4~8K2Jk@@3}bv|3r_IUb6fJh|d!LOE*cHg9BB z_v}8(**;68sk6lH^hW1m%P1A&DNmW+MOACPb8+4pJ$329oT;+Kp(g7}&S>!M(}|wz zxjin_<KGF#Jv#~}{eR5sZ*bDPfT`5heOWJ0%2z%0*z>$Ab+7fmJ*=RrD|O?oN|XBk zXTCiLCLZ2*<k9yz^~w1KVcr$xjyopxhKEjD)~w-sNa(l~n{4|%_xq~8eCLA7xz<G; zdhwB8J^N8#@vg)FZt!j0e8Y2^`w_ohm0rG{DYma?9(=X3IOUh|MX5(7=Oj)VMCnSN zTbu6juR&;)`Vq0sa~y)E3+%i3F`8>av!3DYPpl%H*Oh-eY|Idx=Ca}Ofr+1AI2<qh zvHojjpXltR$Nfq<_|)!+K4j58d(0@LC)Dq9Tv+MGz?-kLc2=EJThcpe$AgBz^mugv z=di7Urx#xgSG&Ds*Nv5lY)MNZx28<w{D0?q{^ZqCuGidjb{M~l$+>v{g3i$mPD&@3 z>=ts1>!}oIoik@~JpOLxj5|Mc9luW7$L;rYZpwkZMsFhSm-62Uu6`HKRCr%ncH8ld z=DR)%r!(fVymyXbs{a1x=jZS>5gXIaO4-D9#>cG;Qgvfr%^K%E@x-)CS@+ioMF0PG zX2ubl+JBok5+^(DW{4NuV?Fs@`I!aD8}+$5Lq0rHS$Fd{pMVo*LC&&Cwk-GLv?Lz8 z2<_qgto^#KtZ%jbY$fh{Wrx^r%arc6Iy3JlryYCgx;d8nb=?K#&M}|0k*(5EIP+mM zznuZw?}d_goIak&yuYvZmdcWI%a1=!@8}kop3Jl3WmR0JMVy+&n`r0MgDUBQ0Xt`1 zxqY5<rmMx<7e@K__H+uXABuix?tVLGGw;HFj=dB2UFyB3UCbGy{chv$SLV~thiGMA z>t1r6*RUhzTy?>Vg`dtceLrEDl2^M%rsAR7^_=g?=l`w|e|pc^cI7`#7K;bvtC^T2 z&c)m|k?PdlT>N)Y&>x*hr%ACE_iVb=tbYm3dUpR`npV_z??}yMTA|au@1K6RYctP` zBcX~LwVJ;6H8{M!wsy0m-9)KhUtTh&H~OZP%jN9-u=@A`c|Sh0k6GKNep64qF?Vgr zWbN>EpuMNL7JoI4&srJ0+%MpA+Pq!6OV&5NixA&eQ5nz{W4HRQ+c~Mn6Y@lM2uSeW zQ!qJY-Yt{7Ja*QpIQEnGY7d!pdG~vX24&jhyf2u&du#HO6YXynByr6MO%(q)^>xaf zvrhcRdVd0A3>?dDYCjfDUv(%#OGV7B-~Qi^^!YypoPQ=9?%rMh|6j}M50!BmC*^Cu z2s+-;70umr`2xeCKWArY&YX0)o4vnlPxsub|2AGOeHXEEUwW9dX2+>e#ii!F{qtlF z9e%WS+Sa3Axi`OVJW?lG@3rut&EDG0o-4OZj<HyHfH(MY`V|MCce~&1(q3hjw6Ef* z{jV2`C#(B!o4LE@X<|QLtaPaK#b}0|zu)cNyJeN7RL9=4<#|>v3ntvQvVQ0kBEqQ8 z^y4+l=BCQ-2}MWhH?Qu^c=T8B<|Vf|(tm&NWxDRhAYj~jWcIIz?ecEwlJy1)J7tdb z$k|q%n`61q^7Ev|trvF`KEBcGv%d7i#dd!AK415$qnGttznabVYgMyfH|6$j*N*cc z8Go<;OW|Zx^4nXJ`(&4)ce9PbZKIb5*KBbp=&kn^s|ewaOIkKzUd<=ZbK!piTDfHo z8=I{MZ7;O{Y#jIfyxnh|ZxwY@pJ@MGy?$TP@^k*uhI3wBU2SZ_CXsNcVe7-<^S0Ap zE7n-9cVO0d5Pyj6#Qc}HraYH&&(%N8@!)EUshVNsVlEkN=0D8KUDxU={GVRTEVt}` z$Ak9o@{04%d+l$Fnc6e?=JzI6?w)RGzR#ADN(EV~Bu(5d8K<48_<YvfkfprQlS_@6 znVqj>>GSW?md-9*-j}S%BR0!Cf1ZuJQ|7{o8+VkyOx%9HXVwn)&L6V(mPdL<MsC}$ z^u}d_>z%c&A#0yjI3^v8sN;TkKt5XN--KyC)BV-kit~Q)<~+3ibSSlnf59oWK8B5F z<t!bS*^5fD+1&S+o5_9Js;bS^d0NUpmYoZi3aITqU&<#QzR)X2L?|D$Yx^d*vSNLo z)hmtlE1Aw&-I%vE>uT1K4#9iO>TyqxgrCjZVwE5NH~7NVAAyzgudk1<KhVIqP9s1g z;R`QU>9;pG{q6s53GeNdwf=U-`23e^)7DPeA}S<5uXf$k+J63@+y~!GO}_VW`>E^m zml?NQ&o5u$QJz25FH$#HhGR{nD*spUrfEwRBd$H|nZ+2!$Fw%pQ{mp6g5AP%9$i_! zBrMT&u1BARS#+8AG@Xxm*QV;n|64NI?^D*|Cm(LywfcG`xbya0AJ4cAhdkn*|7FV8 z%9p?3rar%BlehHJwCr13UUI6>X;>ecrF326!Fl`tcc#ubdfVjNksq&)1pc}8^U}v2 zfn1mUiD7y60slUCKJcH#CazN7UNI^4{cYp!6IoYhIxw{NzMi#oW$%wEFDqTutP;cB zyAQwlG*wZYaeaR7`xX^lkIr7FUq2rA?`4oHx!_p(>dMDu%a<+K(r5cEB4=N)@Xmi< zF8g=7zV<qETGxAyYxf;D#utj$+!n5L{b2e);`Q5Yh34mH>l$kY?%#G}*6xBuhwsQ} zuHdoaxwY$b`iXCC=es8~>de=?JfH96;{I-a#(ho;WcEI0ICw~vw=urvLGn!g{UR48 zuY1n@@XTi23JbyA(>8B8l<eBk>-1?~qIUSYI}4rJXYW*gv&LLKi$REG_M@BU4%f{M zH{En!VuP92TcP&!IOF!6#iz^GO}^#u!gSx9+gEwcZZ&kiE&Sxw&7~UCbG-9Tv}a#b zoqSpGO66BJ^QFN{%1n#j2sE5~^-ZsDa^{r}PdX=F11<YHXPT)$n^AnvJDHWw95$HM zyxJqPMR;Xr#T>=NQ*TVarXB9O+W$0TwrTdaW76+rQ+${=L~mZBSbcND`p;p0?Rz_q zO<B9`)+)zlwi`xE?Ee0Gy?$ficVknZvojmB&w2PusFi=`S!jNAeZhf%%(!R1oILUs z!FTSMNxkG2(J4N5D$dr}Aa3oV4}vp3uSz~7U}{iV6vMmg<O1=}!e!k%o{9SlEwVT# z`Mf3J-&^&YN!lv|Lbt8diVmO1_2>4rmlB1CHvIbeQ9JU}zT_X1<!nDjmwUIKy7c|m zlO3Py5`R0L&v&o?^U;01ZOPeL*W#ZlO<>!Y{oLyRcc}+YQ)l#?yQ<f{e^uz}T|&%x z8w(3GRi?#k*pzfrFhFZ^zm%N9a$9A7`TV{;C-bEL<hb9RXSnOPl<$)Z(oa`*JhZu2 z9U>Z}roPwUwUQO5PT2at=1vX#*Bz|p>bl>1$9MDTsmX6|?~-k)pT>0e)$#SGenhvd zeYt|^rTD`HE;WWin{97;W+`8~J#DMgr5r2E)Ve8aPV(&B`JwOJ?W+&wNqnwe&AV>N z8vl<nd$Oi&kyMzS8yFP&lk3takDW=&cxp_NZ)pVn{@0ume%tlQv41sRCVh@w8FYl> zfakCK=RV!~zjS49$9G2Fvj4k3ujyUnCos+K&(y*_RoA?k>;p`GdM5;O^_I!5J@=*f zcyjBJbyLba);;YrZ`M9K+x|+*fl%j9Vr_EYZf^Ls_?+&x8%);bVF_z)Y;g2{wsHRg zw(zw4@L0*1?b+AYl`buKz4h^jXD17|c#4?aPc{5by;-7uK+31DLVTm{Jl>zj+ZM>( z_;l;^udRH^|L^U6>z#4VLh-=5H+T0cx!?Bgn^1hgcz%ER1*1nfv4+m?-m7=t_vh38 zlXO?AGHJq`+=5k{`m<lkd<^h7_PDms^V_Y{)3!}}$`l=;_eCkUJ8;_ff9>*h7NxI3 zYG%ZQ7Is&y4qWWEyX<X2(%qWRXZK3}3A(YM*!Ix@p1CRO1H;xvJzdp!&LzrmSJ(8H z(|F%qF$hdurM;n`yRJ`J_uzy#tn$&J9^VR%YCPX_{pmkt??WaoZ!OtMm)i?7xBa+K z7`pP|j1Bj0Dc<@f`!M;L{}eX1>bn=%jAtv#MVCcPtSp^${hc0z)Z(i%_c|SNNVv5n z)BIk=;}wC6dv0|svwZqU@QeNR*m7CLSxi=stDd}NQ+Hr_TAccM_tN}(7dLjM=YM<{ zUc7Mm;g=V_Ovsqq^W~|;+N`s4?O8solB_BCb&KO4Q^p2v`?yZk1GB>mbc{AAcB!n7 zlh>@CW^~+H@#Eh9!@b;1E>j}H7kv~9efZVpX~@Y-NBVeovCCC3_$F6Ab1~x(QE2?S z?qtv1!*1th_xUQ!IyU>AZ=+x5(M8&KBbICX8{RRq)3~Lv?;FdJ?y$IGaS5gimu<^8 zJ`SBcZ>D7W9QED_%I`~(Y{e&U_*+rovP<VqJNJY2%5q$t^Si<oCvr?&(L3qE(|5J0 z$urY7uWU8j_5a`R-aU2)?GwZboZEOdcCtI#6m<m0ZY^|p8oFqm%^jzk?40w=_ZB`r zcJGLiPv@)2-cRmt@onrD*f)cpll^>q-^A<r-o+9Y8S$Uiy{V3wb(DKg#Ovgg<GU{Y zvUvM3<LBlH)@EFs`(@VaN-~PeRX&-RP;A7cu=n4u*KseRwq!i?Em`_um;1_!sWY`_ z-`91w=C}K?p!ZbH<z>Cwg*0B?Q2(+_J@`V|;WpmSRT+gEsaNiwY&u$eaC$<Bkz%OF zQNzCmGLL>uGh<|bt~%YnyeF?KG~#n<?+fvdC$lTrmCd*~gH1Fz_f#A#G_UxO(9ya_ zI_Ag>3Cp4<-1>VSd`(ocYYk*ya?QUr=kmhOLBfmU>VH0+ZuU{(!Si)NOS@JV`AvGk zAZWfvt9{?uS*G0%t;d+xGV@s|ObTsXeb?gdG;MVYAvdA86s<z{2g}z#-R75h>9XOs zJn>VNk5gyMKH_us_`kU5(4z$JoXvZ@=9Kx}-kyKH>tJ?Z+apC0on?%?(q?xO+hr}z zq^CA7irQ1Larz|n#<KNsd!2Ik8T!mH&!1OVcH^CMtHa{sdD4>m{{O2!@gky2@+$M3 zJ1<TrG&_88@0YW^V0-V`hYHv47sNz1zA;=Ezh92Upz;Iv%aq00d)FSZP+b*Sx$pmz zB%ad7lG>~3Mmu(YxNpJ|Hu16iq_Ds}td}y5Mzj>Td~i>g&G(ZjK9F~}CENTTJ?Z|d zu20w6eS%**C;EX*pU3RoH)iSG4wF`mpCcmFt#V>5=at-&%MV#|CFjlA8u&tx`~BbW z_}Z)8D$8zwR*9URrW-83a9T&PqtdUUGcyeDy(>K9+<j21V1Dg4$IgBK_Z@6x*m_EF z+F47nyUdFov;|ei@mvqw{$|lLeYT#i44w&scS<*`DUALY(K~@R?#%h3{l43)X7<?l z#z-gS^G=*AeLB;hbBprL$+6%17EE|?Y`gcT)e|<YoWHrj=-=|czrKEEi`kIh6)Ixd z@=Sf!j_YoH*KH5##N5(|6iusMu}j$B=HlxYr{>MRpQIf*r+Z)RZz<)}CC@l_uuV(u zvt;XF`XusDc}0>EXG?;Xp({hYWQWA1%WkE&PNrV|w4nFGg6rnx*^62J9cgc!^zru5 z$T_{a+xo*Q_pS6vS~h_}Jh|m@zx};?nI@%np#2Vy`>fBUF($^W{POa0``KMrxb|NE z`s%8(Mw|KFh=tnHvwN4%Df0U8Y~E^*PhyieoSa+N{h9RBxaOeUjoIHVq&35@O+Wq0 zBA@q;RNXJF!)qm0cUP&g*e>;w5uEXNQ}WRb@0OSRy7$gyXU3wCb3eCBz5iZa#kp;6 z9TTr?+UuK>S3FPodGA8se5a&$6>o(EuV!n>8mwI-SM~j!Z-UDEPe-G<iVEk<iFw&F zJ@@Xet=bnWyjO7Z6~**hq<p#+w&PPl_afK3NmB(fMR$BYXFb36+s(?)wvVJgtYZ6g z#qwPG19NVfchg$)PrlH8+V$(xKaTej#&ek5C+<D4nLToo*BgNumR|2(Pxn*#T{Qco z;C5@C(x-O?FBUa23Pw54bV=(iG&{9P<>}omDT;4%0u5E1r^z3G$)hRCb>*<Dcq~gd zzuMh{`|S4IyqWU)*4EY21r)a)x{_Vfu;-e<!m!GdQW1>{cg0mcotnZWu3_0Dm@`Eq zy8iC&^5t!u!fHPA?e5;5d?jn+S?B7)rqs=Eyme=6%ziX|vz$@g_DLQb4O{KKmpe*k zp9>X~pJBhIWGU<2cXvD#4hDCMGX={}clYx-{&nhAgNM7M%g^5~NVgHcXYz2Cg};?d z)hC@3>+M}uPstFeoVr6x#o@7N&r0d4rlag>IXA8(UO!N6->B~AJ?Hq9wb9!H7rSvr zTU5{K?Q@^#SKc%8Ve-~MkIuSF&z1Wu7DaE*ld(I<)AG|IJ*v}GY_-N0f$HWpB8sz5 z%+^}8*yV|g*?~2^lL~}ca=uU7wEOBKqsSBAl8(;F*mG{T>E^YOpG7&CCbyqVUcOW~ zX5xj_>HUH_XFsX_DXmF$XE6Jj__B6w0^^LrpBHZ((YyGiY<Joo?ulAG8=bs*CSN!7 zTi|IQz_ZV@@kd{&n~Fk^v9!2q%Us{H!Zo=ejS=ryr+>0rDt9AFP;O!G1<xEysh#Kd zrWQ{;BzIR_zSX2f_vPdCQ>mAi@)$q5edLdMjl871OK(Kt8W-W>HU{r@_4A$I&Q5$0 zy*8}q-RjD3CP_c}Hc#v=IAQX#?qyk{@4bx50^LpGITy;a66V`VTP9bwi7>FtvohE? z%~d*ZXP_dh$*bBYUoU-q);X(bQESt}hAo233hS1FOnA*YyJzC(8XL2yiMG~mr`PZN z+`-`Z?b2m8-d$E|Jb~vw8`}lhJbCbc>y*OnCw9f_e7=>IT)R!JD=~0u6_a6h+|nB& zL2d_3+Dw0ayPf}5`+L><pliqG9opB~bmHgnsM~o0M?RlF!F^=Hsr~;##QZr=PX1MK z+;&OY=PN9G^<r2yT$1^EzT}#l%S!v_Q%|%6-DGHDJ-*I2SNqtsxla?)R9ATl7S8{y zyJ`ZDu|tG%{;TEl>t6YO@qQR_`uB;5wdT=tg0#Z7ztxq`e$Ti0Y|hO0YZqROi%9Lf z%oBb#eRAst!}-1wP2ar;p7vMwP>x08#&qlSHHRO4ermJv@pAs-jmDyDOfFCOHTUV4 z^v}rw>2GrX>K#idezaqD>-@-NDR2EJ{(m$};!mj2RoT;3N%d_hmghWft_oe<<~`x{ z33f5I6JK&H9@YK-TYlz$jBZj&V*az|TG2bU?>6bYu>HBd;3C(Ycx|VN4Qnd)`&TJE z*!fT}ao%FC=a&K${P!I1Y}BrIXMT8kJLs^sb;9OWtFPz>R?j~DXT|)D=BM6V3Vhf( zokRP)<Mb(-+b&$n{B$JpB@gSX?~aQ<?|T`t>Uj;b<;N>;TP80_*Pk+3e*0<JY207M zPAVtOmURvHNL=vjx#hG+H=gahb*zQoItSD&I;W_An%S)|)#j$rwyDpL?2=tF=c_rd zUlYIl?2Wy<)AhTaO$}Nf{N(ShtKLtSUF&=LYZJfM7Qv3<puInA6{~)&{q6cV_2lQA z)D@L&_Rq9_o{uvsU9v;w_s5+FKR^3qn{rDy(`;IYhU12xE10bBMCyBnBpqI{*5&N} zYVFPxcjmm}<F2_!Cd|LDu3j*4$=i=YS2Hz({+7)wJ$<fc@<sM<XU*?_(W{MlnwT=f z=xD(PM&mWw>4tamLL;SIZ<Zh9NIIe^dE-Xqcg3FtAtnsfv4XnxDl^Qtadk4E<rJ%Y zu=q|1ORfvYqVRRXd(!`~yf&J{_`}KH*}~nk*;KUtxv`t&$2Z&oyXMNT4d$2EzpvXL zc4Vrw*;V%bX&zIeB;w!HFIzop&z)6HMu+=kcTUe`Je-~6x#!Cz@0?SW-D_iafBX4- zzWTA9(<d^T-wQaWnBV%*<E4Q?l>PncD-TOHn6#UQ^{(BSTqElGYKy4O`ZrIfzkl*B zE^OhS2;n<dofqwrzx92|g`&QFr_5L`a!)_W?(g>6t~zY}9f7qTO5YRBJ=X@+9Df-y zX{k{zo6F{<|0<^*_MB+e%3l*(Uedkh(ye(4GyaG)OgY`wSj5<)%^Z8+^0$4z-+j&! zUv=y}=QnmICzU1%)kFR@KOVLpi>S$A;FB_05w@0R?%b4w6v?$s{2R5ui<E6w^1K{p zRFGn&V<+D`js4f@UmAhY3jIHytK2;N@#&_i%g;~lEWeqi7JvQo9D^H`6C?Fc?QM6< zkYqnIFY_k%1-9pI|1+f;4H*x=el2$5+U=WV{jK7&8(Y<)!=`afO<C?1w0moDRz|+X zbQuoyT<0qF_iOYlmbA>U(fWDs(f6nS4lCy?JBxpr@2_-RbhDJ(6Q5NRniP_cCf}*& z)_PpYmMyrk&*r4-lm>lU>B7KP{Y}d6CoF5fG41!?@XD97cTON&QLv-vRp()+N} zd;H9%S&N5H|1T+aaNpDosbB7|SJk(9v@^t`f1XmX(kw5zvdty?kBD!-!hWMaCQkj+ z^4cukojddHIQQ*zFIyqJ*7VzjMQq!jhP;`vut{`x?}x>;Kc!|`s2qCkv?*%e(jSYo zcrNPhUQlWAWP-DS8^<ZZZ#@~}pd$w(*3GcL|Gh$elXu9&6%FT)S@TWkKV~7~!q~*9 zUH4|qVVUNo9k)0>SzTk9*rJg&af{&8$@7Db>dq)RFDF~s@xt5tp~3#1boFVxQw?w5 z+30tsBcMqrT>J0)iMiQ3E;;2nGB5iu`}@?F=Q*lRxD~$1zE@thLI1ArJ&8GeW~;W( zFX`ODnD@rBO=zv}5~C||dsZDhF?$Bz;WpmiZ#JL5^rCXInr}y$VCQ!0-mp*cEy5Qk z%TJ#Dt@n@I^4Fi$E&f~dJ?mM1ZXe%g3BeeJC;y&SAI~U#D)an3uT`5zb&03TjU3CT zo;Pb&r!-w<{kJXCqiX4;j1@hum!3`go4WPt!da`U<0G3bKU;=hJhb=e^pjoBPelsK z%)7Doh~ukm=O+Glo8~i>y}xJ=cZc?l;M$ct_8xX<l>7D7U2)E(PyDUM%eS<4v@W*| z4p_&%YJ!uRa20FQr(Svcx=TwuzfEz{Sm-y`%JJ4*|7VvcOicY^$iq=vxb}betf@&- z4ZMc`jWk-MEnXijDf<(<?98;-uI^apTa3k*n_Gi)*5+jJOh3E9WtYOHhcC{avYWKp zbomVCcXv1Jlr5ZkzTu)n#Uaac1v7=~I5TB}Q`gld`|e6jZ&@0m<hRMT`kM;V<-FZ* z!(KI>=VdE>KDS)%x!de6Gp`2+0(ti>VpXaM<g4-daNFPcgMg2-R;c&l0Jbid*pExz zt_;@Hjo7v_ZD}vVqwQOi-lsAgELlCn+_326H)hu615N^4E?TaCrdXGE<3?$#NZW<` z=L3yFr)@r;U*9*A*}CG#$$x)S9{=CC<M7;R1rod8Z0de}aaqynmm1Gjy|<b1{NtzN zWtTWI<&J*S*?N4pssG;1d)w3$^qaIJR35Idv0bS6CSZ{j=f;aEnp0PuE<dgFS<GeI z{L71e9z62+ygh5y@fFJ#O3E0Q^{4j=?zzS7AEM|wd-5#PY`M}afm0OEu_jJ7n5E7n ze7j0RQCT&6%dN-rX3w3;`2F;^t*Ku`Q$Lw#ar5md_?djW^!=CD4@|OOullt5ceC;e zr)^)AH%?={D*92<*L~7lDYsK`TE^BPfp=r0t?PBdg7z=gnVmLuvx8CS2D9|?(jCY5 zFU|5zf6o`yb?3BR^-0O|-dlI=%)hzJ_3oz4jwdIyTZp^-Kg`x2Dk#3H*DR^U@6r3W zZ>B3(%$K;}YtA|OPQAbOWV1!7eDkYZzg)3=GHcJpbp;o4<;!+u>8=#Icul)hi*JWV z$H6Rp(^(#`lXEt2x7K9hotnG!=9%#2zQ49^w+z#()t_}Z=U1<)_q54n>ZetMxx%C` z28Mc^ym_hnjN*kQ?J>sTv*hRPlscTXYRly00Cyj=YNk&OTGn$_dDm!8Eco=c!p$M| zX6={$PeJ=9=L(<Y-+VUn%<-%@JJ@r2H*H&^!tBm*ce4o3m))XW<~|kEBc0thWqi2S zA$#Ge@sig+1(Vb&wKw`F-hcGx`jeJ+E+vEZ`t4T@ugOc-29>dFaH)EA=gmCcDeDzv z{ifMnPpj~4`+WJX?O|mBvlq{1Xyrz3d=s!Vo>|W3f_N*}wV&bja~dby%fGMfKTrD6 zr$bI$MLXGIovcH(m<2b#d#k?r_!KXlBeRQ&KAqs`-v2=Hz^or<SeX>Vrm+;ymYaU^ zU%HDy(D@*LomHW&DU6fSG`X2x*Ng86P`{(N+Q`>w*Vk{CDkqfK?e;my$JEBAE!2L# zfJ5^8ufP`ezrj^;s)29sFh%+N7F?&b!=H^?{&7HZipw+qDHE6f_S0DYRNZFMvwZ@3 zms*}lR~MUTeedBpwMnR~<YUp>g09rE+c_VK_g6L7^i-FYEH2n@*1>Q(YW{iCGc`#{ zt0p8F1s1+n>l68`cH+!)R`>5lR!=@(zxu-A=I-rVENsNRg{!Qe3aV=ySf$#xlsRfc zRjm33;dHrF%l?yZTGquX^UEj}AOC&r)|TyaEVT}?&B}MJw@)x_=4y#5IBD|pWA@E8 zdvdmSKlpauE$rsuR|3oV>{k8EKPkT1tm1LnJK4YG-<AK@cdwPTn$#968}??4uBdbL z(Y-JK^72)t8d@C5XLQrc`2NHAp^tgkA}-Ca%b_xJTk9LcpMRS9=_}L0$@O<<eMl^n zIxor0=JfS@`J0=ICh51B3;dVK;4r%!5&dV!rYi{vYhD(v{Jd1=eniuThUejC>nB{E zFB6|1V4yQcW&S?Z)9DctmQE{v6!-30(5o%eY;Rd#ROU{+I`7()l}=vVX1Y@xS?VHQ zu9?ZPs5#s|&u7AlP2p|-)s{c{GrjqXY}WF_-182~9b2JwFLnNTA-gS%!fa}0xdjut z)@yYMe!BTut6pSBy`a)edtMI5j<^%s6l?a)i3wYyRkJ$L#m_6SLu<*R8E&$W8y`Np zJDlD3*uLG0$<;wHfTfFxG1SA=u-A$M%zf0~pta=3`GtKTIg!Ri4i2J0fj*1*oCE_{ zL>hl6FW}PrSG+<wfJKDSb%BOJKx>G|<rU3fuEIZ#6;56MWnOWJFuFPjYH+cHD2g66 zd8Gj6cGxqmn(%1UT2Q!-2J&c<8qGkX#RZiL#}EH?Qy*rB{I_2Vx+=@l)z4*}Q$iB} D3oCNv literal 44302 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 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 752/878] 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 753/878] 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 754/878] [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 755/878] 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 756/878] 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 757/878] 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 758/878] 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 759/878] 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 760/878] 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 761/878] 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 762/878] 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 763/878] 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 764/878] 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 765/878] 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 766/878] 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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%0DBj?Tjk6(4B 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 literal 27715 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 D3oCNv 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 767/878] 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 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 bKjX1mK{73ltIjYmFfe$!`njxgN@xNA^?2h= 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 768/878] 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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 delta 48814 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%0Dk?~smUZp;+D)P&Trir@@JSR`rNs@gj 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 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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 bKjX1mK{73ltIjYmFfe$!`njxgN@xNA^?2h= 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 769/878] 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 770/878] 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 771/878] 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 772/878] 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 773/878] 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 774/878] 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 775/878] 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 776/878] 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 777/878] 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 778/878] 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 779/878] 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 780/878] 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 781/878] 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 782/878] 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 783/878] 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 784/878] 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 785/878] 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 786/878] 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 787/878] 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 788/878] 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 789/878] 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 790/878] 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 791/878] 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 792/878] 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 793/878] 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 794/878] 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 795/878] 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 796/878] 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 797/878] 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 798/878] 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 799/878] 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 800/878] 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 801/878] 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 802/878] 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 803/878] 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 804/878] 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 805/878] 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 806/878] 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 807/878] 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 808/878] 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 809/878] 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 810/878] 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 811/878] 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 812/878] 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 813/878] 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 zcmbQYjJ4w#qi}#XGm8iV8v_Re1A`(%P0kFl%#FgDO!ZlZ3`CB-XRmIbbo-)<Y>(lZ zxHspYs-3ZQxHjij!mO4#FTT7jmn!YKsJUpvU6U;*f9{L-pOkMAXQ~$M<nT7<;IBQ$ zjW#R|zIBf4n_2Ct{K&SzDAnH00UJyer2F;s+b(ZqKeOUi(!o~}f9DEBT)W`$<XrR8 znWtLa+^TquAEsJPuQwKGj(hJm<(%6F!~V5w(!BBuCUFaIJ}z2&Zvu<KiA}%H9=f(V z;ZpTtZ^_OOowdInPRf_H2wi3xk=-BOa?oYDv-RiQ2e-XzjS}9{l%wQaGmST~W2&IM z-kJMzXMg^yBs*o@suIpqQ@h)&4qRlPz?I!_Lt>uWJ&)Y-JJo+KCy8Vxy_he#<nMl! z8kOS@<`=~L7j$3pnP17)|NbPE;sj=cb-WLD_9qJ2K8ZQa@XD0Ut7|iJ&Gmc79lvJ? z&2jgd!f?DiQCu>&^qnV%)0GdRQnAzDpPqQ>#glE$v&*?c+P8cBwED#|eWEX;2<z5R z1LZH9H!v$O)%*G%HsEP{@A0So#P_RrCkQxsmpgjwRt%|Y@VvvnwRf?K^xggHG6Eq| z&CKrgd+Yw3x_#HC_tgo-Z;wpYbPI`CD{m`b+cy1IVJW+oTG2GO!Zi<%2$o&_diC2( zcdtr~vc3IUt9Pte=za3OvfJg4E*k~T>xD~k3NMvu6SJM!7<DYyH}YQ6k9CY!or2%4 zZQHQje8H>9=V#YnpSJ8JuYHH5&znm#MNbqbrQcjvb0SCa>rbiB;0(*m4N3EgtduI_ zQ*sV`cA33j_-~D_-<%UcN+v=-jLy3sS6%S6K5C1}$J28wkC<~FUVY-j$);}k755k+ zzQ4!$SA%Ku6*f=C`oKpQj+jmRrk-y<*?E`4Nxg;Q%_@It?Jq3<`*8XDBjRjXb3-Sn zYI1B@x;pB%#t)0Vb~eol*S1}nyLm-|Lz8o1{r399e#L)WmVH%O)TPSWcJuv`C6^M` zYZl7o&bgxZWmdAJ)XUP!YrLmye776@x!RDlOtWulQ^6WD1;6J0bN{mwckjyct|@$) z-al=9#EE?Ib14FrU9T=EXwQgJIet>D^N7Ow!%xiHPEJqQBz-u=+u*io;)xdxSFPJ; zIPF@KbuF%`GD@_qU9YW<i>LSNq`!}6eUtI$)PI+(dA$5q`<%N;AGyIku5WQqyt|*7 zfuWj%fq|cafuSNtzdXMvJ1IXuTdyKFXG!S&{KXamb@ng+v5S43D)m{LQ!8@fl8dQZ ztGl+{eVhEWLAb_r#%5pVt+)RFJ*Ki`$=&uian-hi&pw+Q-|ty(w@r1s+{zH2kj`HH z*xQRj)r!L23jMzQ_LAi7X_uCq;uNnJ^?jqh>P`P;`~N#`asS*P_~;;0gO_UA!ctk~ zC7YV2xx{wO3NzR&x=BUKXQ%V3X;Yr8S`ac_rgEM1!buxW*(n_Pq$`oMJ5@5aV~u9! zQhtR=MT;8uX+^B9+G14A9pm}LIoNupMs~vugL7Yk*|VZk#nzWiose?);9IfwFztup z2kYf`8&v%DGx(addQxhT#>T7D8G8Aa#Q*G%ZTT3<aqGHag>+DZN^Oc-yLy;WmHO%z zEuyx~iQl(hH1Jq`*^B33wR%*=qh~iSuhxD1<+tN5v6Zj)duAFP&FvOmy1sZ>=DZuq z21n=F?Ppk@5`13jSfbc&iDYSC|Drf=1BLIJ*F(bUT`uojVdC-D<8OKD)x`7Mj7r<~ zU8<K>)4amx!EvW?Vv6C-6{Z(kuX@b8@nSa9{|ojZmp*x#d3AHWo#8frg%0a-QP=G{ z=YL+7txix}^kCCU<|{>4t$Nd96my^Pwkf5aUFpPpbJBIwPxdX|M#APS8?Am6SJX+G z7kD4rYjHg)>O=jWsG2sGyA#|!#5<Ji!#<ySa(MrGBgx0V<tN%lSDe0i<m2<}jgOZd zJmY!Sp!875&Lepf&Mm6^Av|Yd;2h3NFCML6VV--V@#4GFEA^MWP2V7Gu2aA4<6+yl zzMcCee(jupEb;Q^ea5@O&(AVkcJ<yyE%Dz+`qcC+ST!wYEZq2QZsGCzqF4sz@(=Iy zPnEF>d{Zjt;WoWlV|rF+<8D)x%Wo#$o5ZVQz*pH;nlyi7tjrC)hec-!j*0QUD4Q#u zQC`0K)vBj%%|{kymc8G_;!t`djeqB<-G?OB#WhDo@?ACf!_+Z%-v^(Tw)h&RvrX69 zU;jN=wSRJezs~aLu#0!D7+#QxaIfF=U3dMd)4x@Xx9(IB&|b7c^L@_;>EbmK><xa5 zvz9+I*}VMkKY6`N+%oZJ^gf76F*K*0H)mavqpMqNoUrbpd-UJPm+$yOPb&ObeA0+V zZSjeN-6kbX9Q|`8`P}>r;$zr1d%jry??%SuIX#8l&EHF{%bV2NA0PbErtr=`<^lVX zc+bOMSE*R<TG2S^eea?`ai4^0H`6bFUKc#Hj@$8NuF0M<S(%^ngjv1yd7jM^Z@Jf* z#rgH)BbooH&KjO=8M80G6OsQebK1-=HEfO8wMmm@w`}#}-5|g*b0fFXtGzS+v4b=D zW<Q>dY~0Ex?>1*BGcec)Fi!4Pl&zn0H?sK7wQ0*9{_cD6f5C&js!GO|nmXY!T`5WP zj(bNf$~iXC#nh8ORP^ipYE|Lcx3c%|zN+RIQdzNwVc8M?1LyiZ9z6g5<M-+3;q~|K z*x$KVTU#!$$Ihmr^z+xlcaPs*zkjdwi(9Mb`|-!w+QilWt@!)%-RrZvoB!{rwD{2< z|F8c0|6f1X@BUqH|EI3_^AE3YAHF`kd+>dK|NVRWDnEaC_<gqib^i75_uZ|T`v23* zcmGa*UHs?u-~4>JeRuE2)Ysg4ar(LW>cfX0o5!!q-!J#(`-gA;=D&IT?(*{6{O022 z^8bDmeg0awfAa6y=dbsF`Xyht|L?biZ{MCCw!e9I`s?5I|LZ@#UCv(~zwe}8-QK@7 zzkkg4x3;bL`t<Pa7u(mDf4{!JZd&~J`v;%>I=p)S`=|fIKK;-BoH|b?{^jYn?Z0=o z@AmIspL#z3+xnUN|7<o-&tGS6^S*Qczxpk+6Fxut_w4-byXGH$uM0aJ7gX?N&-$z1 z=dKlh_vS}s`tJMdes8b8Q&&@7|KWc7=l^w+_OtKaFY~WNBeLR``se%qo<EpA-~QgI z@`~@Pt4ixXzr1^Jf7AA00U6mnKc7Bd&hmA;dA)7K|39xj{<{9`+2^zE$EAO29Xz=D z`0o6dXO|!UZa&}s^tJTa&EdOG{HrSe{{HT=i9E8W!he?i{rc?c{j=sjj}@;jzIpa* z`|<kQ_W53t)#VDi*W}m#{`>J||B=N9mjB-Uf7j1nUuMnQ_vPKyci%Gl-<2Ee?@_Rr z*8BhbA8oF_`+ec!js<1gZXccfJbwD$^UtnVeEq_{a!>u&*Iy5x{k{AA;kU<+-+!ul zTK-1A`TTYNfBeaK`0MLM<Ll-1t>(MKbq_C+|5s75=l3U_`rZ0}9=_XLBl`38YW?lI zn;TO8|9ZcC|NpK3l~z9}E!bme6K9*Bzwg(cpLNciXD+vW`d)c>v3$P5#vAzx$^Tz? z@4dPI%JTawx?dlE9bdO^|L@mR{~Vln{g1-_k3|w(_uj=leHXs_)*ic$f0~|#@4Edc zez)&E*%J*tb{<0i{-kcU`d$C??EFu&|0mA7S^IzPOlRAVb@qjez7?%X*ZXE%q)_|M z>tIxW%scn8`)A%8AFq1$O8!jF|ARh1_|ud=pT4y;`TK6s-4k|9*fnA2gxvu<0(J%L z4A^~P$Aw)Nc3#+Ru)|=NLF5NFrSEgBJAZi>Z@>NIZlhPT^zOeN3iUSgE^jDmHb0+o zBJpi?lHZ&MXN~>Y&o0k@{8Z<-e|=v0{TtdR#DtubJa{}6G*z0POkfIf((>TVRM1`0 z{AB{8k&{|<NWzoqUzZNNF}v7kS#+pipL}4WWt64+s>)~WjUV4WKVcbi);O$1A=-mu z@?SM+)to@VN$($cD{r}dq;o>`nVbD9IAnJV&PuP7SXg<?>e-njR<=#8lP^jM*L!fk zRIp8H=$UX*OjIKB@g5U{-M%FWeRD(4{;YFheWp^-XZg8j&!+$1J+tO*WHRm+l_2cY zviE^;J7(R>UBq1ch%L>25%Xi2)_doT?Rn1FB(tVXoBV$DtjK-t8Qh$Tg7qqGDicH| zITm>^YAT8@X)~E1cFD2o1cRjFWL+(TPye1TZM>QLNT>PwxuC~2_KSst*Ua7S`u_Ps zdAGEA8<mW^OM4n~6ctsPj!a;g<YeT*r>UU2r0L28wo6V{9{iFD$|;*%UDK{>@B1LJ z`Sy{{Gsj{%-=~+Pn7zx)l>3#K@@!^^@$V~JZ(3wOtUTc*m;!PUJ_osedRv*<RW{o~ z)2c}P@Ndbvi;};~{;>ISSmdnnwZ?R@*D<EurR$nN0c(yNurp&%etWd8VEfts&uxEP zu3K6^<$G>e`*V@n_h+y02Pe0!xgoKsDER~zpQg&>118djT_w}X_CD~geqK9WquoSX z?cAbgHaGY!6N`TB{hs#fc;c+`)b>m@YaipAiA=4}xa;Om);E^2m^44pR@UpubBEpX zKX1eqZP4b8ms(bPamAsMN9#K0mA#Rh`62GE&tD6l;*FW@oNu2`y*X7@&8KzFWPM|4 zW098zZ(kjr-j*3}`O3gj_QB706Sn*|oNaY>?gJBZ|C@<X)~7#kZ`QW<dEvPJ%oMmj zU68(2M?w1BUl~}wpMS1-=jJPkMOh7Chu(UB>YR|)CGE}X*4{I?EGJ*klQz}76nSfF zpZ?iP`&M3wEP8$P?or;Ngs7GC7tY_o`q*Y`b?y1n`f@X#rCs3@esx(JWF=ImvF4@3 zTc(rrc`xrf8j@&rv@vs?)zzdIBJ67CuiWyybM&&Pz5n%lGrBePcq8`;W_ojZ3TjT? zs3W02SxI(TZ1~Sh25*1+%Bsb<noM8tN~iqUv`GhTmiGB@T((J(pBb<#Zf5LFcUX96 zgZ!m+8sx9yRR(h(o-iq2Xyx;c-?ga{6#ngR3>H@JHQK%DaLdXGlNn8=jlp)z1lhqI zVC_>hb!~O+<2#dXB}U0UI<aMbkoM}{>a~#u?@#dwN8QvmPHpE5R-7DfA!F#O<+D5g zvG?IGTYBH^4{v`rF;ni=-rg;G(IwY?(y~7PIsA+Jf7?05x0ie(yVWjD6PYwQ!9rTk z)ykJ!>Vv5ChpUR~8o!!6Sj`ZA@Lce>%6BLB{;T>|^~vl}C2QV^tOLA}?P@_Dpa=$e zNH^m^c+P?FcTc}Q|2)CYg!LTbo4qqP9WHtGWxjaY2|i)z0^`*7PF@R;!!%v3d>~eY zK8TxY0!n=057JKYUFJMwB7U=M#*K#Au{RTwn9r@8{Lx5C({m!<<tDb8qii*z7N?(m zt~|jxxtOgwe_5T(vYjWl9X`T!=glcTVeJAxQ2N&DDw!b`@?barR?F}OYnax|eD*7H z?SY>s7lOhziPdgDi{^zhMz6ZIsJ2f2U?gn>Hk_;GC|AwaqI+NGpLhOsVoQ;|P!ia5 z_37om?%$VOcjvsrtk|1B51F2b_5*9v_MCX`dQ(`<(Xg7WPO%R%kA`bsVVxH?=d{MQ zN1weXG=2MhkW2K(HJ{r47^Dz78lH1BT>E>~&dQAM*DhHd+Hw8#+2B|0`+0<;3pdZL zO>tt~_cR2oUQ6Vqfo{gp@Ofc1Z?`@AJi+esPI1mX=E2`)zUP^LAWb`O+vdY9Ts5ax zP7s-VQBO)+Gbk}iKjY~9ZG}-Ew^q-Z-9E=)=W<KquZIn0D!%5Or})|={X|u>J1o^| zfl?If(jT{iyVl>`mLOMj=*c$LG_Tk_MK88JN;~Bzyza+7qu{bx6|vy>QUN82sE=Eh ziylvZ`b=@IT1~_`pOq%89>V%O=F(B>R<N|A22z;yaqDuia(nJdJATW|L!IY}6Dtmw zY!o-&z5Q~F5ZuXHnwK)8E_AQA-TUL%-dW{xMVFq$oy}f$W#dWRX?ka-)GkXl%v<)x zShl+m9Id)tC9}jt9>3nXVw?W&xSi(qR_4KF0b%a%mWR~@ALLqY74xJv(`*aB-;7&D zTHu0CrK@C)SjgkoI}5KB7QI$8Ui$dSHQ)Qoeb_4#UsMO^d4@01g_MYzT_t5=SMI&u znGklfFkiYLZ&^rL-`#Az+Ter7EE8g9Xj=R2k(m=54N2>2A}=j;HTGREKDy>{OWn!h zrQcskoX$HxMcq$htNz*U4d-*#?6VXF=Oh(ZD?jd4@4v<vy|#FG#?1faV&QW+^ECbE z1Z2n05>Gtd`P6*5(`0=uY4s%@M>97s_)~W)t^WVZ_x6Q{eVNWq>6`r9?40>gi<z3Q zQ`~nc<$5YkUZ^jv8noo`mIeRromslc%Icw?Sen;S&hkwkd@CQdNd3N)lOa3T1L{&u zkV{|eH!qf5`}oPd(}#RsTI^igkgs)P$NV!U!QU=+UT-bVf)`|}la*wbv$Fn3%bQg? z=g!g{GcOeuO@Fjc(|^u|-1u3%Zx;(o7eLa!s^`Q$P<}N2e#*-4UC<qnx!#5Mr>Og7 zY|=m5RyN0AD>N0Wf?TlTfcZWyneFjr!B&0|UDbMg-;Z>P?zp*ERz2*&99V+X1lun9 z<5+m({9WQFXKIQr58i(4i!ZDDxz5jrd~Rl|$Na24x)K^=YM`jy@<=*f`(53dPap>* zYQEbkbw^k|<iYf`@82$VPH!%Tqylxg(!Ss3Gc{$^b&l4q-SK<z4DQYPzh4}=y`%sU z1ZrSMto?E9de{6U&3D;H{Wpqy-}=b?o$AA9+P4awSnJ>}(C!ME(<ip&k^k)-Ykz3U z&E33z?v7tFr(Ru&?V4SC^Y{jaLZjfYIUevd22PAy9=Y!e`*S9?Yqn<Tro(@q)&w*9 zm8G5P6JF2t{0g-61*e&)kIM1db<egvO7l8?GPdjYGN$j(>%~DTqYM3@=|Byf4n*xg zZGE&OaUm?WDxYom>=106dc5<y_d}SON}zNIHB;{>C}Hgu`R-f!=t$U|oD5M`SU%8! z1l8{J{`Ybr3+hf3wJqJT{C(WqL{LyvmLzHC#kI()Z+irfG<9frO<XP-|F~^c+9^A$ zwS~^1_oqC6(ZcoTQclM4&g~u#Aq5&ZDP$b&w^{q+mw<Pn|NXsoM}qEL?<&?j7j|b4 zhqYhMQRG|`^-<Yhd*3nHs<Tt<tP(Zf<sQB3?>Mverg!1CM{{mX0_PgdB_78!9kuJ8 zWFEcV9?@0(>)ltyX^-}W{W)^;dh5@wvN<=pkkYr_WF^t%k6G9LxNLSVsOIgx36Jjh zyj(0iPvG6lbIjk_&BX83?kw-$XA*qvXFs%VQ1_hZccW?1pBuqb)-!*f)|Td_s#B1k z`C|4bm7eMSvw7cIBxb=%U=__vg;4=h<g2?rnZDD?TUIjX&hD<?%WMjrwCgg>wmfcG zsSC;L5LXA*z0o{%eaCumHhZuAZZ=oJ^s4{+<}AIrbmk`EW7?;nfuZ4QmB_v8bFzQ= zzOww)#d*t04sAFz>wBtyrO>f=ci!CV6JE9r9v_hOd-vzY<<{}L&4ujEgSGtL)h@XY zaz;{lp4pbiN8Zf|2A3kr;M8Mn|E=`-yR}EogVIEF*{@|bg=p%O5bAd92Rrt(A1J54 zIS0z<H|9cf88~^DJU_ngolLoed9amV-p!Y@x$c}l7c)b1^&6GgiQASyDk?otFkP4{ z|9e;QceSGDX<o-Uy$j>Z&sm%e{<Qu5d6V+@S#_EF7S$ejv^LxVQi`g&Y9*?3zxuK~ z_m0)wz4m{1&J5y=-krKUzl&YRI8}B7B9noOg_7s$``*>OU9%hRDW>nA`N5e--w2+~ zz*%C~XW{treP!~CGC<L_>9YCLPT}3fn-`XDQif(S6{z<=mOigAXaZ$2`JM-}KOO1Z z9%m?ht1v0>9JB&f1^Fvr%KRT)pSJ#1a5Y}~=!u>E!@c>Zgw@5Kra4>t>A+%C9h4cn zJ_*MMzO!?B3@y8MpSbh4<XY>^>3hqZv=OC@CMZXWJXPPf=+55PpLfo@RCp+;=H7H$ z(K(i{H*jy(xAxofm1{XHY@taI<ObepkM?z+F^}l_t!I=zCt}KM@x=LWBBnrN3mi^h zV{0DUEj|Ov24MA)>h~sq(^S3(%wL*te-(Y-x9WMC*U^_JcCsF-z8~_S?#BB=J~!2^ z<5JGS%4L<VkU4(h&{A<?HRlFUh=D4RV<&wg3zZPbKpAB0g|7L(q6)uv27;0SxR|pk zd?flb&G~hTJ2Z=HL$mm+?4$iCb<(r-E9$h~+_QUi>CI_B34NpIkWxlj<YkMl#wq_= z*Pj!s_cI$W6@C_1{s5F;U3cER&?nqo1gXN5z*X3yKUc!1JWfmlRiXUGpFt(!qC22c z%heK+S5?8*2iCpPKGlEsx9ki}S@rKi383`92cj?>7Np<|Ao6rMD5ez8gJP;kpYa>W zMD0_coKgWZQXRXIS5EESe7be!rrpe29)-gSI2DB2k2yBROCPr^-LYKb`;ku9oj3Q^ zmLO6eI5-2Q%>UI@WFvjvXQjo%n-$=iy9-ovTYUUf2=TUx=ftkdH=7py$&}u%VP7~M zUcX4F8>h~FgUCr5kc5}MZ_%G4wPy36(YSJIwfjnLP~|ecAE{(j0apXAKWDDjD9;x! z1DAbEcYu<9oL!#T7QZrB1p^MGEsxUog~^;hW*iJ|Jb?0Cbm8WOC>4tm*u=FzX08`K zzWL*sDP6+zdY^-`-P#?XSd4~xM;RQ8VSmnC?|OW*0#cTofBJZy#YR!{-P<1@34<1P z>fl@~YX5obqYAKR4h7vQ{`n*8@gDCz2ER8=f3&9t-n>%*HCZx_p08PJF|Rj$S;?FY zBHv@|-gOG=%bV}s-tPxe3NArm^)Ira*SmIquik6$dsDyP9(PN4#?*kO_McIOi0D}< z`uNH2^Ig9g_j+&E|J`tO5!A8uK}&?hWb`sleV5)D`g3M=cF%J|S)=b-3GZ*5+N*r} z=;s-wS3cdCdVHH4x2;&E&bNq18?PkKJYLi<DyMB5R=MU|#N&<ElII?;>gSb{wl&Kv zZrZlMnV+v#b=U906`!9Q%9?!tmGFLse#V{$e=37tzj$iMDYb3tf`cj<2AonpO>Fg( z5o|onZI+JF7uK=2@2mQI<}c6v&olUD{Z_OCnVWNCzImwQ<EhW*S#nA}gBgp*D2Tma z1=}ng>!UC1W^dp3=x*(Xc`_HD8CqvZf8Ut(esA)=1skjD?}f1TzTKVf*VJYSb}d*J zk^#7wvvU0|h?#skxN!NT`#bvYOkQv{*(&25`~N-3tGE8%vgo<tRySvM{cMwOpX%i% zFG%!jVk6dMDW9ga*}_{`V`~duXudXocld`&#yq*Y$97%5eHr_9-P`NCVvppE<8S;6 zbNS|O`u3^PNA^j?qv~fW)iWl)IjB-?a8k}^6FY)gkHki0-h7sl@3>K3rfSw-Ubz$B zY}8KH?-PE*=AZJpZ|$8oo-1xVsrI?Yo#5xhIyvB=N{9ics1H%ho6lOZ9QVr0RQ>wP zD|fp7o6R!kr)Hb(8Jhh$pZw~~N$vZ##X=@$JTD{&nap6}RdZ}6j(K~|0$q)N&CdRx z_ZQATrk?KSzjA+JbcAK`uU+-u>s*VTJyHEAH(6Cmzw7%97T#i*;q}Cu{$rv;!Hb_W z4;-sKFrOt?F4*1V`^P*Xlk+!D37f>}{NJ-Os{iA11`?BDJt+Bad%1wsyUyUlmWiL6 z8+{+deUX^~$~ZyX?{A#?`{Lix&ogRYnZzIDlgfR4)9g#clZ`i$JC6tTr^=nS4Xar5 zCF1GETgko0qxwtbUfY^g<b1iY<Sgf{b*KK8{r&1#^tntmU!ZQf>94HMRps0#`Ri?L z?$vVU=hfd%EckG`{=9tL-Tl@-!UfL!UElKMcb8p({mdUW%bK6XwLFyl%*yNf<>}{T zS{XA)NT9I949W#%q3^nz&A#uq%6RwIxhX;Jvg6^|jQ4N6I$>#dN|4ueOFav38K_Jk zG3Od^A{(xiQL!yS;7qbsM#YW=<!8iAL@vVOmr(T9V<fNJa~8Z^bw`{%_g#JIg*)dh z*$#q3BlfLq^iFewiORS3m`CQ<*~jlbzijfGh3ltb%T=g32}`z1pFMeR?9|_n-qfG{ zyZ+p~>fPHFW*mRAIy&><SDAf=@!tYmyh+Ufu*{NkoBi$C!|%<_`^B&KU*G?y=I`;x zcdx#Eeth=t@bBjH%kmlS%{%S%{yk(OC!-uTku(48zoH+1_1jnft^YH>*?j+>KW~3+ zpZ(_7zwNiz^RKtNUo)vhcHgwH_jUi-9>1I~|9+qC$~}wX-^)FH+x~O={rq+I_fG8Y zKYYE&<zGp;`uep0`kU^X*WbPS|MyGQ|DWn1D-<}x%d8cHr5PAPrk~el)U7|;ts&S~ z<{uFB`r59wD%-D>opJ75BWB3N$j7j4R^6=n8}c{uXY1db9N7?J&S0{pcSh&5P)((Y zQ>R`JK3QJ>dsj!ZzR~H$CO=>L*027qHsPenT-TF_{qyVg+5UO`!*_zX(#%c^-zWb0 z*No~vZ~uP3?z7(cZif2VPwe;36hHduc>VVL&o5*2T=q@XOKqBZK69G@>p$b_irM<c znrS~{P9+KMm;F*@oiDEBb&ut8$y5>hy^^hm%@1mI{@Xd}_bc<;hwsh){{GX8zq=p( zZ9KC)a*NJ^N4vKl{av2_@_JULP<Qo4fp6>cpBv5SN)73-@UUlB4HbBLuyU3N|4XN| z*9`ii(|_wQ^3->x=${g+_`5TrV%{|SyblHf7un~o6VeRZdVZ$L<;q!|>@RK9y6gNW zUwf{hRdwO2%~a1XTi<!Udv4#QB3?QBijk|EzeRVK(zJu6R<(D&X#Q5}Tfppj<(raz z%a<k6hG&mBskugJ@7Qd@uXeJzXX$6I-<doU&s~}pzWT(AMs}md`hWSq!nQ|#QEdv7 z?aF*;^EY^kt;;;|d;XJM{JJxCY3Uq$!SQ#7{!tNk?sS#uH^qNGt4-KkuTt2RQlS3H z(qwbN`9@~}n@*b@?LV3|INvR}*KIP{aHWm>hOgW2*F68nYqEcaesaNQ+tbZ<%=Po? z{>k{J8bqcA%J5X%v;4hVC{h3Ccl>|hIo&x{{M%ldKU{bAOQw~7Q}D)hziU6-eW}$R zkn%zP?|a@l{kn(8H=Cq6&SGIb_xUUrQ<TRed+ny1TFojIiMp=SjQtZhdwM?PDgW6a z{NdF1wYxs-v0TD;TuFPuw#`+aC%A5A-|1sqt)I9&>7$C#bDQXEE0mI-dP|q+*YD^~ z+T=3tuU*S5_s!cThX!42&U2ON-g%-}GyDFV5Fh!^CO?IaZv4!*MrW=2&LxZ3{kSrs z70qnJk57mZxfxx`*LJjI->KAx^US>0yb`Y9zO2$4Ubyz@SFI;0YGUUa(?p+%I@^CY zvRJP)S!mX>i6-*$kJm&jPrvi}w$I!%NA{ep?=j@vy~gBJ_V=qlpIGz>{c$|K(?av) z4UNYy)cNNtOJ1Mf{kPIYl%Mak`biz3wdd9>S(HB2UhlHR|G>wKW3L6f$Q@ky=a1yV zo@_b)OUt)yc2YSd8!$mYb<^j=yrDa1cHf-bliY7x8_1Eff3d*AzkTxNA8&Sb@Y@_R zXi+S6JQrJUGFREANRH|F?pbzLX1A@f<-IrE=lkb(-s+6YCyvFDCOh7QPO0WStvSb5 zMK5h)`u%f3e`fmE_Ut!esdLRa@X(I)Q(?8hUY<Uq88;tv@d~+4w0pnoecRhR$7=T% z?~YT{Xfn>Q^gN$`&^`3P9OVg72j^eUJ=a>prMEdE>G<AltLm%PJ#%DV#=iIFe`C2V z{3pLYbYwS``y%sf{oAE8+hh;EV$9nYC!Bd$!(ik6FKh=39SbWJH@h}m=53uizqx+J zjEBb?c;9!cY-?t9`d#_Y*?=c4DR-i^Bg3}px7Dkbz7Un%?=h*vZMDdo&K(^Z7mCV! zH7jSOtlZ3|F7KWs_-4ID{f_L5s)v>TeQWH$A2(~VUv7r>>BWclNT{=~6ujZgAaeZ4 zb(3j=Z}k>c$jT@ea^)>LBrTW4zG8p&?9B&H)ak$8Y8omxYgLWi%XOz7*YU46dNEP& z`|Bw)bsjbs1bIgbdl_A7F_!V^vU`2*eWT7MlcGn5KXXh>o3|_MdS!^`@paqlZ*Z+U z;$<lizw6ZeRU(%;=P$BZ{$F>xU&_*L;<F!Y+{I^oe!dgW)WAo}UX@K=*HyVe-{?oN zInRZg7eW$lhcvFXU&yrkp@fz}8(WJhmw{)RBv0PYxNSUVLygx8#Xo<f$-nL?^Bk|u z?eZ3OsV{y^DSjh5NjiPK&2Pt)J(8hEgx}N$e_iCKczQ!ahKy|E)tvtGD{`2$`qoV> zf4uzHE6$_6{B_5-ig#=LR<t;~ZBO0X)X2-N6IXK2|2IW%%hNXTPj<p@P3Lv>^g6aw zMaE>;HJ@hvr1$>yzw2D}yZH9ZJl^_8DeAMetBcQrnuiMJ+6N_TUa0?kaIN;n<X2}* z)UDZ`E~~dZUtv&G(<J;T=uWYYn775DYdW_UqzW#%(cZS_Z_I*wZ52*w-_kC)&sEBw zkem3PThaZ7Wa!FQ=5kk*s@Ht3K5pd5D|EH(jQEeRdl#1&eM_y^6HrQe{qljmc<Hy4 zZyn6L?%CYB8@983)w=-A^gVA?7Jqs4{8P3`?rD#Bj+^C$^{fvz*j<==<h%Bj8sk6r zw`=ZSvhI&gvIoD45#NPJ)f2BsAMCnPDfH+}6@Tl7We&V=CVMpP6)oGNYPZ|Ku4l(C zv5h@)&$hBn{%)wt<<9hNa_`;$5~{{C&t49>ntax4u2>iE+<-Hicc1y(Sdqi;d*!ue z(7CilHH}gUxq%WBlb>CyXQ^}bW&dd26_kBtV@~I+)ys5+ZraAoKczBT_T9Fk9m}<k ztX0hXx+2~FMUmXrm&Ow{9t*7(`@Xt2n`wIgifs$kE-um)m9%~I^SPS;yRXXIU*9mz z%DGax^lVnelMD&w+j;rc8~>!L$=_MjT^b}h(TIDai(B~Rx|OHd*QZQ+^7==8_Xm+1 zp%Oc{H$|!DspPMl^=QGN0}~_6USB$4>0;g2x#eEi^KaXo{Vq>gyFWhlYv<vsHeE-3 zj-B2aowaw~a%0IkPoz`UTD{D7|MNk6io+twsA}oyoKvsZDgE|HKHe?ao%WY?DWl$( zEi(S<GB?T&F?ugaQ~Ow?wYazY%qw9tqmp_nP1{#mlOn_3pU7KO@>TShUf<jU-(`O8 zb%-hIsIT41SbbMVex2BhP$%sgR+qcmZnl@0l=$$U>tFJ#zT0=#+7~aj>R%|Vy6Kz$ zOH=$p*!CGZ`*$^}UFV!AyTN4n+nxu?H`WKATyA&H%5USlS@N$F+amfEFUZ_A40-tM z1Yd5@s`_Gu0FlkpoE~Pp=(y|os!s379@j@MLAQ=FZEbb`vO{Xp&Rr~`cg_6u;+L+^ zx+>5lH{*v@?O(y2XJwx+cxS;L8reMA=TOPfzV1g(K|5DGEwv6izdrb=(UMDiRdtEp zeg8R4U6yRnl@1KL7#DD8_Y_0F+S+BiPib8Kx?*1Hj#b+})aM`1=~^G?$z=R>?vyUO z8<RPv#LNp_e|Z1>?INWMJc8eS_wFvezG{_h$;wr&%&PAckDQ&fUUTIY^Hu66);F$U zSkSOJ?f28Tu6=@Dy%t}t{ABe|(XQip6E1BVUh~^F^pop$gSl>tCWKDCq4_(i-#j;W zicL@`e}d?rX7eqb=I2W5%fC!nW#y*3>${Q>AKT-vNs;ewG)Zf6Oh~L(GyT<UCDOEX zDw}R~@YH~RjX|Hzf0W{5ozbhiC1S$sn{RHs4qMD-8?t0&(32m*9k&<Wi@E1ln0tNW z;qpK`-<3JHxABY0Ml)WWw#t<8!(IQRuP=UG*<I>2xB7QvM);Z3V;`FK>Z;WLcL?6P zaj~7p+y0oz`S-SbdQ~}NBjb4smaZe&!Y5+YzsXu}e7|qiYL>}s6PjYGo-QfjYdm;D zv8(A$beqtQDQj3OeJ?+B)8pQ`qkZbT;z{OZQY#<dI(Jx<r*(Z~%+<J6rDxN7b?2Af zI@!T@vZJrs`buhYv(*~I#i!Ogt#WtbJW>BX+LXz8-E+|=?T6<+tJotlN83OD*w6o0 z8+bUk2Rl_%nL6E^eA50xpI26PI$xurNa#U^-cS3tR=ro4b8Mk-(EX01UdI@<EOsV$ zeKqxMJ``Sf*m{j)?Yql)m(MSjN-TVC&HXL;XY0lIZ+W*~rxocW9n%vC>#=%q>$!l( zCPuAg^`Z-o`TemddvyG?#UlUz4GaEsW(EHLcm4mZo+^)$KN06eUjNHo-n{b2t;O>c z=U#kk#p|-%%sZX8V2^FPQ~EWh-KDQHTCQAr)z2>SlTTAj`kJYQ`p0yaXB`=~y_vPX z=@*-XV@f#B9k=BZJihm>SY;U7_nNL%YFXF)LW0XqtS+tpY~!xc^qBEmd(OIr3qKXi zdbwDu;)T<u9ZT4*o_l`c^WL(JQCD0uw{Et6YsTQT=eF~!cwSHQ_R>?8)0b`5sa1Nj zKwZ`({OpJA0tb?obDq5Pqo-F@^4r@Q3mJ=zhl<mgE3`vg^Nyyg=X{wkql|MWbJWX4 z9b0Pc>wfMzEBWqbqjG)RLciaqrmRYhykEJx`!46?=F5xA=J8!rSTc8gaZktl%aZ3T z4!CCeeY-dPU6jbPz*SY6A$12H-{H@hxTd;g%`cA|#X0|FtrCnl`!r<Ey|~q=n{bus z_Gt#&`O6JI%{Erpa53TAle_2ACD(5kUoJCcdclTeE5xf#&+(VoEy8m`j;CJcY{mnh zaOTyGcRBCaynCxv>_4-7{^BK86~+&~OyIX_Vu-2Oka=y>%t?x`Q+BjzO9u;m+s0?J zHF}-%on^-CH%fJkS>CW-a1jaK@$>v=`BzR`R=LXWRyZ=h^~6N;-{-A-I!-QDR5>@h zk-^PevN};PPfDznPfkU~>ettpX*M@j)!Sc=Q)+(r*z^}$c!q0pti9<~>)GCOANa{~ z>|?(0ocZCm#=ax9Y&``98-6|dIN{l<eLL3&&X)RaDsHJDZn>g(;+2lb;ERvUqIK_- zP28Gu;uFvGUZY!OUj?74Z<*nG)pvEvu_7DMlU-H|n0NUK?mGG_IO4-on;n{$&TzJW zF^%o24=cLGX>K0I`Lbd*Gq0E5#*hE9MfN{fBzAwcmf+0B2))MHdP|BQ@Xx#OUymu{ zBm03XlPiBck*k*P4PEQOp}}~w+H*GlJl(wWayw-A&UR&qVF;C-KF{M+%+>D)y*}=` zS$!?R!SKet$+zXN?EJgA)QFjj_3M&Z97h#59J0Ifx;m(ShX3?Uk!!>a9>mm0Zg9L2 zXm&_s+il$)emDO-R=fJ>o^Il-)w5#Q!}_kDW#tL!Ggk;m5Iz!l^w(wMgbjZu+UdW1 z6B&8;X<@sF$V-{sKV?t7nZ0?J(T@cpch_c0bz4mii@VMlVVQPp!EBL9-*(OjP0!R8 zFmzp7p7gfqm@L!WNbUM!t5;2br1>o)q~5=o<dS*3y>!L5*IyW2Ip!>mp18wv#m-fm zGh2T?kG0Z%yztU#S-#Jj*Q9&0-@HqlqR4SioORK|j9*Rd`DybfuwFD`&`A{Y*82Ef zQ=@n7ozjwD-22&-Hdj5&y;R~=_)06HM&RSNnYSNaomTQ~O~A)*i%vVrtg5f5ZvXRO zL81M+!cg(+i`Fgu&~T#H_3*oUOwT!NWbN)P`KjEuM(5Tnw(Gj<r*1nFA7dz1Y8d5s z^T`|kjzSZK;ENF}m#oteWjVLKsr$w1-8aAOQuI+^c+dJ(B)y3xs!pWd&pRj0THE&R z;y$MxyWh$PcJ5=`m9v9=4hwsOvgdM%`jV%UUM$+Gv^7t4VQ!vmPx*?do8h;j!da$C zX1@q4;AmL$*D7`4FQ;FxT#qgK$F*MQNsjjIJ>Itt_Em1!eNkJY`uvZqngbI*PRqKz zGWSSUHyhUh|DE5XHlO-<`s_ECwmkihJRHj#x>6X5Eg$aOxS}&B<EXy)T&9+w6lJ5? zzSHN_|BR5&W8JZG`iYt9?Fa6@nV!1YZxUlDSIXhfZ^L@u^+zn<#Qlz?(=RyWXtPFy zPT{(~3655-jYb+*JWEbSEezkjA}zY|LF_)mD>Lk;i9he(-n3h{p{baC(L(`=Pp+4D zyxKVXuKMl1>XM6Z9c{~ZD=hx4!6+w_z$xAz>b%VRVpl!y?x+3AQ(OBr?qpp#pRti4 zNA^J$e@STc=2yWxDpnZm@SUU`eQlb>T(2#=cJ?x|U9_Efyw>7LwR~OYF$o_Tqu8Rb z1-H(I_Ju^xaIQCcUivZKblbwfuU<z>PVGMah`VcTUZwwZ(PNueyjuR%`};1oq<|d< zYR~*s@Mx}Gr++3jwmzZk#Gi%UIfg;98w_V2VzfN$7`rm5|HI^j$+x7<rvI81Y1V9c zNL~7M{gFSdd1gM7N|#Jw`opfm5o@vk;L=oc_gw`VC4o@~E4FVbc0VelbE+;mQ6!Uj znG4JGeJibh%~JKsRcK~4J@ff0)7_Ir$2?}An)>mCVw(PfB5{GTYg^^(<CJ34!rBTh zX>Qa>72C8w<BR|w%Yy42BKvowMMhte+>-Quvfsw?lMnP}K6-ZJ_cDi#f@KSxc;zlF zU|0A1BKXoLI`D0s`ARKqiK1QiZoJqd*bvO@wI{TFzrnOpx3xF6KAsp@yE9hng6Uno zwX<fLPdR9HR<}4bx#)J6*zThyyI0jS+pEbwJrxuyxN(i9^Nbfc3!DPNOX?IaRBk=~ zy`<5#*E`PHk8OuZc=!s(+4*8JizDBDNm|W1*HZe_g_XryR$nRdIb-_POd-5xKL1s{ zC30r<&sLpVBI;NYd@^?Fq~vwEX4ju;EURSGUNE!KTlH)Mo9p7uIX^$-J-rd@7vt<^ zRKN9sl$QX9-a}Oug=Jq(Gx~=eKdEqO=C(bl+dXpEB;6^D?x}9pzFZ>uStjD{&YGef zTd$Y8>55<VRn&6hRK6k-B$u2frN_p2`1PFXT+j6L?{1WC`kLHlbx2OUU8-7Usr&K2 zACj!TADzY5cy3Matv4x*BAXc)Cz+>ij%wd-742KEd`DzS_9fPTch_Ig`Z4o%`!~nz z#n<DHw(;L9;hb|^tKeC9rq<qh-U^%<b>|*-9n#^~I=}S74B1G%HPIrAXYgKC=y%(` zAW5@g6NlheIXA0{T|F|Lk}6h*r^)}m;koOTS69-G`zx-dPH*Fp{-Bd!SzEMbL%&=4 zO}|_IyEI%*u+{5^bUaD3St;dG(aimeX>plNv&^Y4A&W2E-1;YG`wF+aPMp<m-31pI z%-Z`kaa)Ay=I0kx`3{}%Ub;E==dL{6)(t$lE0<olQuW6mIpq$c-twb6E(+aA44D2! zW}lVS+``lM=az1|thk!RAaHH!t=Cu6BX(M!schZru$gm$Zh6<L>GdAzxAsY1I~ms= zbB_5z&yu@6o5CZw7kCG1fAx8lpyCE9et#aw``Op@v5onivEb>gsvm?HYuowcUVbT* zdOT^-caCepuiorui(%O}``6Wn6Pmxdl{`wdS$x`4G=k-EY~`Nx53y?8KED~H<S#!q z5Y~NTIepuz74NFJJxg@0BG%Tw%Ksr%DYu4a|HFpnDaS5#SZ-!6$lm_uo#I7_dmCla zmUHQ>u`oWvx0&;3oLd>k8_ixj=c_k#`+jDWwCT3rJgIjmSgY-J!lR{Zq0Y(br3H(# z3{J84a2>D-kNNoZ45wcE@)st*y7#(W`tc`;#XM(K>*lZoGybi@hTqr)w3ahIs#m;t zbL*W~vEtpGDn4^ly|USkykEeV6cxt3&QMb*?Vj|NDi4rNw>WPF8s1U=X?AR5Qs2X; zJ4)gz3S^)ET6As^@9noiS2(6V=e${EBA)PL+7~-DRvWhGm$P@e9ldfkUo_^}vP(Pb zct1F=Sk<bSY&`4tCYxK6vfK*1@=7nqT&=%Z)BDHpjkdSBiunCI3;{D{2LBX!`dR#l zkMZX_a#qKVurLK*-nS!Ic4b#mz>D=6Kd<{q)_m<+W4~67B~<XOSc`hnmzXsSQ_p=_ zz2l5yrpJm`H$rq)2eIxGc`cp&NFZa)yQp)Yp6iA0D=?UP_VJ`h<u&uz8Wy;1a#xO* z{hXuos@^Ax@6#S`F-~)Sk;yWr%#0$Jv233a%G9vgqh_g)eDAqUPk-(D`K2p0h|y|k z>5jflYdBgM7o6+VKV7I<lBRq7I%jtGgV|4a`_?U~3|pbU<-?rKQk%m04MYTjZ@zps z>&jE%Th?5z52q-8HI3c2-mt}ZO~jKW+c$3c&=au3!JWOe{?C{4bc^ZjF6lo^^=>Il zt=!1rD<)o;Dz!ktvNTP3@0u59BKvj*KeY^5ain1S!-Hq<Zrt>Z=ZLte*ZQU0r`Ml4 zFV%T&!_!69SHB-#cxr|O-=#Ydc1Jdd`UE`ke00J!M*6kDi!=MYjI5t<=-zplvQ01` z!19uJ%92$+kGCv3Rd$rSzV+O?r)k!);e6g@<v&-kt$ejXFV5ci`NmmG{wm+)dD?i{ zD*NjEe+|-_iu}Qan+opDdQdY}_qiY6y7igwEw>5Z(z|-HAo^+h?Ofx!kOH3YP20~k zEGzgGDU)cg|2iisZr5d3--yJgt{&C1(jHHVFk5guOO4N(#cK8XNi(Lc>655Ga6dx2 zdEJ7>*4dL^Y-1~Z{BEy{)#Yi^-?eP#*d8i!B<n)PjLa)0zYYg}wDx`TCDc@gYi{J} zx24^;MSYBA3S(|+BsxS&eEGw9Vw=fF7GY2+_w>^)$;{T8Bf49rCA>8|I;F}Y-K*`* z<)!Oi^4$9QqQ3lvf6MKqiD@d{%2$4})juv3F*wow)hN8wEcbx#a*Mqw#V&;@!54lr z{w-r*d2#P^d`)R>ab)^uQw6gd>1H9;Z(p_;erR}?uI$O}=V#``HD}I?p8aewHZm(M z<}RN9%=*IAZfjK=?$EEodQ<){J?DM9MC$bl_t_e!{7M&0)Cx6-SR?s7;ThkR-<k%3 z7mVuzJ$>uLSkI&z%`LS4zUNKR7dNg22Mq&*d*61cNu-~6l<}hUA;+z#Yd5#pM44Bw z-mu`ITEqp@f{0bipE)?jPb*>5eZTd-XCGIOc+vU2sWIIC7r6Q!94YX><k+*4G5Y*z ztHslvzq*p|{$=$VX7eQ)E7ttJ)>8d|$zaX#xt}a6<LWQY+-wuNebb@7O$<4^W>raV zpW*nef$fa(v6F@2W{u}wWq*-BEL&ROlsC&PPCel0$&=4{?$4k4r?jbZ{g=buGdF!r zJ+)C>o<p#2J?9rjQyZ0E(zl=9@Ozi<Uis3{KRluOdcar5+OEmzCeP-U+1y{dKCIO2 zt<HMk*<9%oZ8euS)fXn8TM_58J!PGQ!h^S4e`S<R(>;Fu<*M)<tIw%0pPMyt&-t}M zmj3@b-=EWxT6N&MRPV8({ppo^POiUS_c`-Zw9uE|_3s}!&8T*`f7_j_V9&w$GG_ax zZmxg&f)_b?_UX1?Kl|@((eu^IZ!LfFv8~iRI52*0YE#sugHP)(h1cv_T>r*ah3)vX z_p|@pa^2VSY4Q6jOFyX=_N>44p+6^J+A~h(Fq6-l4rcpk%y5%_lGgRUq*OrY*{Y9q z>kWTv$r$S_I-a}l8K=jClzES&6|(g9MxJI{KJEP*mS-H2tB=J$KE>=i`#rDr4ym(} z>kqG7Y1-_&`^e3we2FJGOf`7a8G0wM)q8!dNZT`OZ+3K6_RR-ZiWc3q+QZ{>ndR1s zyC&~NuHX8&RpOxFq)e$T`NnS)4QFio^T2WX#`2Dj1#G6vq_sP*Ugch*nSI`O+NX1^ zQKk{KQ@hlacbkMsf1H{#*Kqmj9OVO>E9P`hKauc9R4rkWv0=)cJAX6|9-M5UHD_AW zzGa(lCfB!a>Cf48Fin~10h?MFi+LvF=RMzc2o>La@Kto5-OMwM2eX42oqtYz%n=_m z_l2@XRNO=6`obIT_vf(Wo~+m$zGJdggTDE_H7hGR=5<u(KIV!)<9mPZ!#n1h3qAD1 zp5@LHe?NVLHltWQH{*uAi<lW0J_#}~@G^im%NCbZ=A;&bw#q(<i0+?lAyOBg`M>#T zd7HPBT4zI+k>nDuyBEETwZC3%P`oB3Etx)T%d7hLhEJSKru$r46100yg8Z51=bs<5 zWRagWX|ejMEH&4TyV~r^T0t`n16zK~KYl|hIV4-j=+M#yiuG|9rRqEW{ZU@=wd-;_ z>ryGkmKDx>F6^3ht8A`bhUY8o$UsK_qLp5Y5?68UUMHd&nH#6I^R4B%6MCG&JDg`s zds*$^wdh}LSeVx7u8e60=f12udT52ua(Qk=QBRA2+&hY%fsgy9v`cNhxn!!{?d2&e zCv83RRrJ9vqw|qo^Doc6Q7=4uiM5J@9q-AnxyNr?S1<N+k-F7oXP9g!!@5&sm)pu1 zF4;$~w<>VG(tpueV6eXZt%ir{bgq?3oP{#hZ&QynP1zD%=566EV(fHVp=?LsgoX!6 z0qxuG-~V;#_4h4LcJF&^{X1$`V9$qit6P&w{6k7tf0PP2XK{a4QGyR=lLkZm{Oci| z5^5Q?bupn2-ZCB9oP2qm^@d#mDNn2Z{f=Lunm#iz@Xoip>UsLillOc(@Gj7d@9L%O z{DM<1t9T}zKb9JMW1+As<MN$sF-N;vcV<V<j9qd~U_syn!ypgG9Um{Am43~5VA+(< z?2{MRJ+Hpu+jnGBkN00gZo?&3kMGV_{18>oZ@nik>BH{~*)slXpBp}Z+_B>1_1zO! zJz6c%;ZT!w<y@YHwu`5=pg{$%+%@UaeGb3>eh6f^c<*hSSkOlO14o{4Ew0Pi$1`hb z8sD$uFYH}cx!>9n(wjExPifJ;jZf;XHuIg!Y3<hf$;w`RnVB!L^2g-Z4{zeiV~)ta zz4H9pcF+2#{r)H9m;WhdzZH4;t|iZBH?}=LZt}BUv*h@5|6F>>wsi*g*6#bAIx|3Y zd+g<PN)~JFe%w6yXafJw-A`CMx5TIIja)w?>HCjIFAgzUS~)A-6PX_1_buz%-mcQ< zYNg8`T7KNKU~3mE3AR)7K4vPcAF{e(rs?iq+jHZ$WcJ=ZRZ+j2`-SFW%gCa?J8C5! z-Tk3IYh$YA&2_(K+j`!0YN;@P7Zy9)kKxr}e^Zm*0(bADPJh1UmD$d`e{`N{Sz2<o z#e#jNAJdCZ%ilZq>~qDVigRzb$2I?Bep~t5p0O*a++wYz$;YhP8(#(G%QgvoSDWuM z{o=M9vkUKv=T|5{KUOZQZ7*lB&QxaNMpHT78tref`F2w0-u=1pzVN$$&STlzrMu;s z+V<FAU9)6PXYX1wu~*&)Jq&6e3p~?UtNP~d`B^WlryulU6s`YSlbu`5%E0hLj)6e} zl8He(-itF*Q%j2V!IU8=KhKH0o%h&GpjQ7vy}%ba?<Fb6&2se3q;+;VaErL+ukZ4? z?WA&X>Xg%qUhFUTxH-*KhDnmWQ~#8uvGchzg0AcA_J*f^ST$?gg|Aj3lP!2c=DyAi ze1H9+eEt6Vy|ddLZ>N4W(=J_m?P2-Vw)tlE|29-zK3iNJu!{SD)7^E4ov+JI54`e> zJv8;Li+m{W|C=wDowE9I>&@bCH&*0idxlD$w3z1_8g?ZyKk;VGk+yqpyJBo#{aG4R zdR;m*WM-*AeYHm4+nZ5S>yN}tH9fC?e0NN^yTQkhDX!n|)=Tj=YsJ^yzP{_^JTHmw zyFE7BROCMhKNMe7mb~72-YTX1lGWvRS#;cM&%FB}eo^Vvr*75qKk`P(msSL>Z}ohT z;B`-I(u}yAlLsS;7H_<HbjHkeX+MK<u0P!W@#S;Ad##n7?bAR1|Ho~<I+sz>Y%!PA z*68;6M?WQM9m?3eiS<i*{la^<R-boV-fzD;_Pgs;)rO}!JU*><nSXN@+&@sv;}#vd z>dqCf2?uYlwmP`n;MTYK_s)mt{r~q%BSlI&{o>KvU!QM&zJA-T`rM}FYeM5oeui&+ z%Xh);f@}2F({ZQXy-G5g8K?Ju+5NhpqyH{2O00XPpSyhZY0<|P*HtSTuP@N@sZV!u zOnd+B@7i*u=aVay9=n|AZruD^cz^n#3p&F0{LiqqT(4H)oUmpdLzzDh<GWb5E5|d^ zUl_jLbavIne8wq;3vMT;xj5<^Tr0V>N8NeOVTZ()whuQA7)00@auxm8&knh_eo^?0 zFMnDp3k*N93N}9PuAb~OuljIA`^%}-jdOO_b9h>}-%PeL@7eg7#j;#b^R0~Afs#Cl z<mbUp?zo=GcpjkV^SsTltgrZ;(z7kaFUpq{AC|C=Uodeu$HSF7s<)LNb`Wj%?rW&X zI(KJrC2PLKg}K*x)e9bR_Q)j3l-_BQZAe_e@WjAMn~Ps0Eu%M(!L4xTq+|_?mWAto z39O0bsh3jAk~z$~>3a4p4gR8x^}#$M85vUwd1~GopPO4LvFnWpGozQyS%n`$8JZch zgx55woKS9QTHi9QDfxh{W0Or)M&6q{v)+8o3*ql9mS5r^7b#K`yG6u=|K)^N!M0y+ zS#X(r?Pz|mdhyZ+5_76vuolTQub2BFq{;Eudv4VNhkf-`4^}TxP%$X2n#|y9yK_R# z+$|zgx;4+Sa(;T^^r`exPytVby5|IU^{2eqE?(*%Cmp=y+IX(!bjUuxQ+28qT0dt_ z=H_~Gnl)ZMb-#kl@rK_`ES0|w*@zchf8D}zZi8RcZVPeeL&y4gYUY~s&-k&gvi~~2 z%8AW&V2ezSRM#)p=a{?a`&ZU@byda2;+p*mj&{9|UN2EmDR}pVmG#pX*F)Dmy&ZSX zcpNi9!Cy~kpI;PLALD&}j|t25!JMwd#_8WwPHf)hpI5O&O{Ji*`tq%#ja5~~4__}? zn(*1rRv>BDhc!<jY8{X4u*{sY+*){FP*j(2>tsHsdVkk9r`hARg`L=3->9^>{Ir^~ zej4Z3C$(GGUeI5kIYnQ&X0H#2rpTepAfcxxIdZ0N`aZ8iy+E<RZB1f~?V-sNr>vhj zt?B*39j+P^Cd_M%JtgkzeXx1Yt=yNVo7^hRT7&lGfNa{V=+Uuy$E~drx@#^;Z&Ts) z6*-r;!Sv0MSM@u4m)5-8B9dc&u)4(L)O5jpCCjF0SXncfoGO;~{CO!;vqEn}-Q)#F zrVH#VS~jI<S;XdyDbG(TKh<8o)FQZ1-Zo>3x?=FYqA0GuN3Uk?pUy4yRMXEQIywKo zu=M0ZH>EbT&5igNyTm^Iwg1Gvn{j_9nf_js*DQ4I%YzqrOs==Ts6S8rW<2NH&D9sK z`|oPry!rEX<~au17J*&r3xcfI?*1%ZJgwYv^SwXQH)=DAa&bM_&SB2Sz~GiTnNwJ< ze$L(K;480o9sT$_cI!UoqklzyDKsrz7u7WP^Us=_Nvp50+~QqPe0AO5yWvhs`y~HQ zIj58DcX7UQezAng%jM4BSJ(e5Ew25LTV7tjb$@N`j*7CHiVeH>-l^ZQ>+hFe8%~(l z&ykb6W1o|6pR@k^_TAUp|KGbS|L^lz`+v``e*b%Se*O3P<-6OP%UW;$zTQ4xUT)tW z8>?OW|Loa)^Pc_f`kQyR{r^;0U%t6E<A2rnmoNUEzMJ>^Vd3K0uNOc4`0?b$v)^8Q z+YtZo>D~L0$^Sn-zWVfCQvJ`bY308!=of9@ea~*o`~QERuh#!=AGUkvAM4Y1bKd{^ z^XqB<>Az>Emvw#*zaGwC|GzHg%ZCTgJ}v$HvaEi4ZT;Q4JN3HPZl7-6|L)fRX>b3p zmN)<WV#m_it55I#`}g1D!<);VF8){hti8Uhq-@LHny60s|M#QPHrnmFUAz0$z6Sg0 zQUA){UwZWOa@6Vh-E04yKI%75?6qBNx&HpR+KSpA^~Vpdx4*T$``z}(_I=`a^XreT z|8HOO`PJdj-=gpARyFUwd;EI)|EN7V*Ipl9Y`$KOJ0$MyzWdVkb}xSYsN4U4^KbU$ zd*?nb>->H9>$^?a#}00*{hV9AZ}+~u@F@Fy>%aT|u6q4k|Ml6UNtM5Le7Sh}R({;y zKcD+=-?S;S+-F^}fA9Ud@7J$h&CfsocK)ny)z1#szkB@c_1EUc)#-27^2~X+|Mu?H z{`2K;6|9~f|6cx^x&NhFpXt9}e+#>HpFeNiuJ?zx)!p7Ncfam^e#*~BH?y|d#OY4+ z=l-+fXX5X=)89^i+mZVF+w*Dr?=AWJ$R_X7K3OwM%i6M{O?Gxa&*rYJzZ16m--f3z zH(!q5Gu{1f`_CVq`=W2y<=o%1>vp|;M)m!=J>TQE-Hl86xM}yrcg9<7-r6<)+L>kV zd6(_~t8Eo`*7@Gs9{(yo|JrHs^?m!c#&18Z__<80*y`Mz?=!zS*GE0Cn6u-BuzLUe zr|*{C*US-_>@KFL^I*l>Bf*BZq|WQOZ9n?@u<>K=T@l{;YDz(KKih4}xW9IJoX!#} z@!De=ZHL?@i7U$=&DfuuF1Gk~QcTa&nIg>-uR47b7oNEEjlr*ui`=cflaGljOIKZ# zo1FG-(d|d();w-uL34}UuHEXkOZwuJxOg&)n6h+S$?}@d=L~k~)?MayyH=$zv%{lQ z51~J%s?cb+_+7F6FIkn(f88^AqOj$am@k5h#kr(ey$^;Jh{Uk^9}MRZaccEY4D%2P zYV}bJ*AVe)^;#H~!6WhY(a|??CDA?AAD!NL?U~zg!tqg!(xyqDksKf&SMqp6<?)Gm z-S_8|8x^hE`$BoKwaW7IOC^x~`M&TRC`|JCRC?x|w0pXzzo)BknfoNWWD#eGKU9)R z9v|F!cx~R~Leq049UphBN%``m_(ad?h0EtVpO7i|YW_diY;uLHV)i;8bH3S@{BPAW zayjey)&$J#JhM?QW7npV$yYDFcpY)xv29AE)ZCZ36E-TC9ckPl!2igZ$%CU)!BC}f z$poHB&RiaxD-}$a7^cR|$_p{uZ1T6{?e(QIPsk*9-D}_V{cZZ+zKzQ-zPz`)^%UD= zds#&_le;pxX_>z+-d<tCeY1N{tWRr-dXZhrv9%X7{~n!SRBmd;dq*L8vV*LGn(5ss zxoO$I4$iqbYqN0ep1zr_cCU)|&EQJ(UtD~!{BYVc%ic7dl*x{=@~XynS@P1-e=WSb z!q{SYV%o+dearZJ%T2r^UoEQ6*k}9Mu-rsTdUBzHlJYX?^JjH@?JpX87kA0>8ow1) zs7iH^mzti|x|+FU(T}`^n;Iuq$|}g}`I_&Z9XYG+&iB`gg^jyKznKIpzR4)L1y`Z< z&d2=P?3**|gmz@y|Feh9(`{4!?)tayd}l8_Dz$c|&&!JPh|@N9FH4G=C)>y=YTPPu z-am8e%jYe3CmoATopa4+>9wkh2a~kE%Cu|9hVGNzX6)Z)nyi>SSx`b&)opL&x%r&- zd5fwiCCA*l)}MF$ZI#~2&nLIeI~{rH=maDEg2M?ClM5sj752`wmx$y0eCOi7w58Ke z`7N9Gc-4uOTfbat>rT|&Y(9f`@<s(EY4gwNhfgOi`ThFwl@zb_DVFp7UVbffKJ|w8 z*kMp2kbQUd&&Lm&<j?(k_9xA#wCVAcD^coIaW-pGzp*hVO)gYWRQjIwuc6{*f3o{t z%c(QZ++KO%k&C+dWzD&Q{F<B1tOV~tqD;Z;bNZ3H{@f4w%>28T2kAd)`Ce1BR=h~4 z#Bj-(dkH>0ppb~UcSc@Vzy0OA3WLS=8YZGvSG6~&O}Dz5y`gPNq%=?0M1m=8_Rr== zsrD=W-o1G?gll?<-@4LO;kS4+H=9d{fxIhc{<;0==}u04y_d7ObiW*2{rROxUyzkl zoq0|=&tHYfwQ>qF*~aw|d;UZpesprmJnQ-X%f1vn>Q+pBmseu4$8oZ~l!AO<e%R;s zqy4jAY>;r?fAY%AI037<mkwW<U{u9?(?O?WvYot~-1oG98!Ai<AH=@)H}q{4OE;Pd z3faUgkC|H!t^r4n^wyd7+Ht;Tx(dsTMWg1te3NFibn|S*)N5>u!QrZSJ?-C$3RA;- zwF~<*{932|SlRkggfGZS9OTwHBF<2YuBZK5QekSS8Ta61{j#9b$+a%UR!h%+F<Nrw zF0b2BP!uY@JNqZ_V^$W&nR`A<rg7Wwo=M?4&(f^j)&Bk9o%<QboQ_Sdmy=VdHm(oZ zGiwIZ`Y%rVS6&dhF5<tupsYE&tNrbnTX03$U_}y4k2#mC8J!k=*XX~jps0CuSNrz^ zIj|h3VEUQ;=;}_#jdqW|lxb~=d3ku|Wz9D^1{!kPjI$R@a!XFGmX(uRclM9t$E>7) zGt0Nn=6ZQ~%3OcFrPJ5M^JspaB2f$u0GX?4w)K90c66TU44i%PLezJ&%bIh)^J*?O zo4|WyvV)X@OzyM(&g;U-kCy(Ma5u%H-r`}6)lzYP9?i{W62hR^mNxr*{K)H--d$h& zu7qTC&QF-(_j2k&=TmEVj~xMpjLf>Te+)lXW%=lYXZfa1tGIOZ<&=4#WNW%(9ypHV z*3Pt7&5PG&5N~^B^XzTP3zzrx{>#7o`#!-ayIIk2a*do^bcsIq$1g{CYjb~H&wCM{ z^x*Wj%X&BN)$ZE0*M7&n+MN0qpMFGIv+aBx-~aIAdH&z}{kQs(?!TA6bv^CJ$L;6e zzMlH#*7HC1b=Tf8+P(YEZ~yPozLdikFKaK@^OJu%s2|R1WVP6M`u5vijH-<FXZ>Cq z2(*6p*yH@fwsZl<!c&I3nz{v;0#~wL+jnls#)7vejC-Tz&GS_9;#%`Audc7pzW?~E ztli%txjAEbS}o>2QEE;|etBq>!1>d+Cwos+oEab`&n%L}uCeaR$BDC+-*8Z3pRv*P zfYTM1vp!y1OxN)G?U3COd~}Q1k<6%*5ux?x4*71GZOSq!y|PX*(ObYv!++M^g%UF9 zx_{SaO6DGK*FPP5_(0U(OsV&46!$HyD=~BJ5l!tsw#z~A^_%zCn!<~8g3s(^*zMU@ zW))sEXH~1I+`69}v6B4@o`gHzZG3sm++1&AnC{uA4I;s9@8+^ssBNleTga^Kl0C_| zQDVd7dR|ZY-)x#Mug|!*flVP~607q@{^Pd_-<<opMZBOu;|&j+K%R_}o^0iT<ym<` zf1PY(g}?JKzi-&A;9PKEyZT&phwx9{|L^U)ukg|8&z@*|y=8xneSL69+RprR#bNcj zbALCi5Zme*@G1E1{nYq?a+^<2tS7&|)gn4&{;c`EdGT>VZT<`W_0@iwJZF`-I^|DP z{a?s#0~UYbi~F~)^kr0MtiS7h*g)jyeb)c&6TX|BRZDK!#yr*5Qshp-53xzN^={Nm zaM}I$d)nPKpC22}DX#y1XL8ZT>$1NX<foX5E~{)5lt^4^l-p|lI@RpBhD)Bx`!$VR z@(K@JYimQfj<<aM@MJBsyeP{Q4>f~_T6?-L8ag%IXndyV&o}wVv8uDlRllayTj<@Z z;7$n=F<zutbW&N}J>i*~lAZEWiHYy-mNPqWG0A2a7z)e^{`9u@LFte3gaExcQAeA- z&F4Oj+qBf8b8)r&m5evP?cOhU?wK-w(%V-LD=kcepWT?s5F`KlWktv8kkrKv_vBtp z6}rcE+vUp*6EB8aEFV;VX6r1KSY%Wy=jNPgZJqjeQrxog@2^$YsUK}gV?FyK$2Wb= zjLoxuW_#8#ze+rN{{Jd_Mh1re|Ct#AycwBv8PE<goh}%_Xd?|iVUvM@!H0=~ftvvt zESjDXz$hmTK7^8yf#C`>1A`Q@Jj3zn3j-K+rP0r9M5y7M{xX2khVkokwLnHS8D+$Y zZ{U$Ggt}$I)7J$uYRQI|L3fkXGcbrCq!}0(T+A7!TL&?!%A${XBUGIXVwheV#3(0= zKB9(DGA)c@`qw~4O<#4l?M5P~sjlnO9g!6g|MerNi_EL5!lzTe29Y?+9X4lm(?m gJw^tGKa30vf(R2B7#JFJ8K!>=VpL*#mJbpK0OanRZvX%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 814/878] 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 815/878] 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 816/878] 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 817/878] 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 818/878] 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 819/878] 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 820/878] 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 821/878] 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 822/878] 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 823/878] 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 824/878] 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 825/878] 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 826/878] 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 827/878] 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 828/878] 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 829/878] 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 830/878] 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 831/878] 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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 ajE9kfX}by^<99Z0koy=J82|rg;0FMd%3+fL delta 41037 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 bO_9AcFVoe{%>_!kLTNWpR%iVGpMf6$2=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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 WtDT9cW3+dUXJlYxVEq4|fgb>LFPBjO delta 37552 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⁣m3B|Fwv<(AonUmm&36m$7Kh;V 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%0DKkgo*E8*|K)&ry_;( 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 NF)%VP{{PRw4*=f3;)ehL 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 zcmXT-cQayOWME)ms9eCn$H2hAC?>$bQ0W2@1Bs(zwgiT@5Dq=g>EePMT+NSEn*P@@ znlY&`w^wnua51nbuy%N`Pg3M*<dS~+Q2oZXo_Q7Js~5G2aGajVk@#4`W=8dSPV=^V zZyCB4{Yvfr|KDEsro>^367~g|n^%47SD7*Ulu$oId&rEOOLq-<w;R?bPmkNu{4hLe zr>cs~a|U+t$zO`&Cte6{TUb4NlJDF#av}a%;wH^EeXPIiepR8jonxx2|EI0u9o)=6 znS=i&L`up2`S^T-d#*>$hyL=nVYND0%_?nETed~NeXS}wZCAkZGLF-0);#Xhk+|C- zlGnCTWlh=h>c?}VS&p$=mpl#V)tP(s+<|Qy%O_1gDKoF+^Znf_<<n2bs<ljQQR$Hs zI_BrZ)Y39l;G56{MJ1zDjXvHc>EkZ1WkOe9+x6;5{_1ObTi52s%HFzfwIE#Wr~U(G z!5=a*GIIm{lgsn(TJwHATAt)TN%f|mu(%tG?E%4WM&~&C1nTYjo-aQ9{rudUQ@CXK z3muvbJ2F;;TspP3{`aqIr=ALV<<2}kJ^FE8oW>P#FKPen9L;4O{46D#mx?&$aJnY1 z`M*m{@AcNbL4j&((w>-Jh;86m@jHP<Q=@iO@G_0hS3)<Z7e~)%-+p(A*ITF6=E=c6 zJ1f6$%yhF7bXLn@TEFAQv&%bLMV|2%uRdb`*I3Ov?dUFr_s2x+B9gX?v=<rA;=I`T z<49+M=Y|B`kYJ6~N&AKW{&~NA&X3P*+j4sz#$HUBB6aWX`Tb8s|NZ~JPxf7=a?-#5 zK8e~qDeDh?xwDLs*=NVj?TK4<{{P}<d{Xb+jgyTF&S(}^otPw=F<V#Q_1k}E@BHJv z5ms>BsO>`GB-g$rnuqQyhTKk?k{q}u{!+`gh3`Uq*XI4+Q2jYuV1^L4?oGZ^4UTyo zi$7UyV|t_WQDe9M%RW`#8DcZ4(|El7#279~iDgeeDds4Dr)`V3<nRA0XKiKn_#MWr z&gvezyX;!)o#Piw!cD^Y{;_)`v=ut6JJ9%KsY0N)(<EP~O<@NcmuSp$Sw2TZW^3Q> zvUhsoUqdzb-HWZhyX(cex9iuf%Uz$B@3DN_Db*6eW9oN;)z91H?EhP~$ZMl;^CXcA zy{{bt3vXzi+!Ql?MlP#e=*g|!elzFT8S&r#f8}fY+v!sa7AHo}e7^si)$Eq)7ygD7 zEgSdmjCFmvs-&Ii@dUB6h4a7iYHi`$yk^;oq_`9HFW=SKzy0rY>)ouX7^i|3K{to$ zF16?X_HIg*JU45L?Z@eyAvp(`Su*~!-%M*f|Dnlf+JlDBd)pZ%{8B%Cf#JypKjwsq z1@}Kp)Z(zH%as3M{qX7f2h2<4S<+cA+s>MHrl9h#_r5!f)828XSQYUxbY5f?G28#7 z;IeD(+y8p;?6m=6R+Y>4-Fzmz{!!%g*MY$r{lBmB?Q=@n8D`V7{A1kdL&B4Sjk``~ zNk#oKn|`~CkGIRiyN5;H@sf|)$ugtq3Z9!x%x-dBS#^EYT^WWc4v)P<q886jnfUhI z=GBMyElSYjV2yvcA|o&-NG3=obWY%$;F!=$HkI>)-p9Md?w_YCwYToS?|zXK8G9QB zkA`#0*SnatZd+UV_v|Ilmvt`#UwXcbe98JU^<{YdzB#{E3b}e6I~lfVyKZQk&eB(B zO=hh;ZNTFHi0f(pwtvU@!(!5Rzx`@j_%uGZhWW0v)Yh#1z4qK;9QA+pGZo9Veo2&$ zcp|av|N0;1{~rbA{rk8*+)O_=c52{@Tg%oNE<e0aO)Rp_?csv;KPz@mn11;3VOeQe zRtXjPsngr%Pj8>yJ(*eH#`U#P+cM5E3#}}QSmLTA#`pMSwvZ>c{+n%g!_EeON&TY9 z(DzM3sBxeB`Y#^S+5df4`PU{SD=_E#S%x?FoUQhHN7sM9W0WR!jPX;Y|FSOvqTKJw zmL{)J-QlCNB#^nuwS-ks;w?KX=K}VB`hOGlU)MH?GTD80vi!X+)1N{WuTDfyJJ@j9 z{_$l4hs}IT<-$vRBu!VcYCm{VpDLm7|5I7Bg7qmKCIgjK*(tiB&ZnfE>UKF9Z1{ED zTWk%3?}Q~+m^Ce580X9Ip6cD&xaIm<U#B$@Uqbr%vJSI)yjJ^V=JN6F1<@yep4IV3 zcIPxNvHkY(#FEJmR3nO>uDm}(b9Q2UdvLIVa<QoblS@YT$4W*<ap9j94!=cWSIMg~ z?}$3-{oQVbwb$QCk0oXZOLvPW2O6ht$k-JrU3BPbm?KZ(Q-#w8=N$rPo#^I&anzeZ ze_6<a?J1I~USc<sdYjI1<*S@kUCkvHBgA-WYf<b}E${r^8wS~lZ5*mW-f>&`M5hP@ zGjQEBTy+2C6rMGyrzBmMgnPN2oqFKR0o#@Do*ivZ^*(WGVpxcKiYn{w^ti)21&^s) z>wh{Q^mJnK{_0=z%*?jEJbrzFL)@I`rE{FEEX4Spa?P0Y&2CB++e-C>R=;J6K87WG z{#1rkoZD_BJMjol$A-8E+iW(d=U(%Zzq)dR+p5CtTpxU-R20jyRwRD9WYs2e<kOkW z676cMKW(1L`|zIPzYsq2zsC$F9Juq;+v?2LpLOSYTASEJUKF$XYTOZ6BXlH4`$(AQ zqZJ~Bp|dKqoNK14HlCWA?%=uO;I=t2w{Jc9*0C<B!&ErbY3VAL1D<PyR06e^ESt1s zUC@$+mzJzFTC#MLN~q=P$0xXMPR`TVwBP+H$9k<+wpC4G(_bZSw}`6yJK+oCmO%M^ zOIRh(NVV@g)}|a8a_QHV<on@Xvwi>DO_|L9=yJrehl(Fsx7ZrRbFjL43hmyo;S&1~ zDVhJ3QrVjpIOm=dlVR4*m|WJ$dU>sd<Ik+8W!tV51^6HTb>&Q{#=;LQUXxtb){1Zc z{G45topWC@+i~;cn7zKvpMT~Y)Z{Smv@&>n%E##X`PV!fCM{p3KRY!*>0+A!pO=5x z>g(rq`u~dRyD5L>d9y<Lj)%oDt|H&#Q^TH2yR<Murng72p4BPIKVssQ<h@h<*dk;) zUuEs`JfQC$mARBvIc2HqGU;2pE_A30r=6a0RO&?Fl&)QoD_bM?TkO2#cv0f@DxIi@ zo@Q1I%VsRiQHhC+e6cN;Z=&hBgsn0noTbOMO^M($UbngM-1G>+>?bFFr#fhT$W+d} z`Azr6igm2FH%8i@F?sgGthXgZpga8KF4f+Uj4XCj?d0d%{Px7idA-d{UbnmQyLMmH z6f17#_ci(Rg3WTz9{(x%+@npcII)s_!ngJ%Dfvn}Gty`4m>BL#TU!t&*7NN9^Ql|s zUS8+;PWY`E$I^ztXWO(lCFHD4&s8`zO|jF((RRYtO-6e=r^Q%G81G)O;-d80^uv7{ z|9_RylA9OK5S{6Fz$$6W_53F<xEb$=Ov!k9v^}FU`E&22tS@dyKmL?rN$}8IrKrlg zWXjbITmg|&ncXUQmvCgwI58z;^#KoGX3bL5H3z4J%|77a&8(Sgy5{hd;N1s2{Fyat zO?{HQRvH;B%203(-E7?9wg2zLgK449Fa1v5zAa0&?+S-PO4qb2YKu!eVyi`FUXwfe zdgmfl-jgqEGjsaYF5h148C-3Wc~8bU>Q=Hxb~Vq;i*m+m&%PI!+jYk|@>j7{+|Kz* z{^tKmk|U4uHU&@I^?)HW#dOl!zLwXFzZu?izhZpn&b7#;bx};LNr-3Ti2_G~kXh0x zY|J)&2hLemD4lr3D3j>fCBu<$t3@DUL!2$^rnT+PB6qrNLOdQTt8*Bs&R8a{>zXh- z*ke}k2@Q=~Y#$4Ht1_3gwFrHm+QC`u-odiIy@@H(pg@wT@uZF5?p~V}x2DN{&O9&L zUbHpeAbNwQUH;|HeeE-A{L;S6PpDCxWqB%njh1`PyS6L?_K3?@w#r6dy`9MXV0B;2 zl*u(3HcltMgvM7mxt5o7*E(LGnO;*j`NCuQnK^%hP4<@^+LLzoQ0@GR?`wX(x%hbN z+L|yC>!%r08bd34i=KMj-L<#)*O|@kpH{OumYU7=-S9Nx_>}fVMJ_k>wsV_p%GtQ@ z?9+*>d~WpgI+Z8qt(;)wYuyvUr?~FA<>|8fW!0{YVk#47R0?j~bK-MQ={C2i9kZp6 zJl}LSwf^!woAvK57ypy0@Ba3??EXeu{lmH1uebkB_ut5WZuQ?S*F&y4Z2sA_hh=G~ zra;Zk4v&jA>J#Vm{?gEP&QeeQoP6D6oj%{rH651M?r6<suH3NDOzZT@r<Lq$Wxq|1 z(_No-kWVaa;mvvCKR(;fdbz+dZQ1ts#^rw&f4lf5<99~5b9I2#Y436u#m?Ht8<LZP zuP<o}3B591%8&cvx<5`GMGumr3n!oOR<hq-{C(y3E9uDzpSLcr%(`$lC;wmY+TW6U z-tKw3dE;}ZzrFX|if`J!E`M__`juMk)cW>$GyUh=Ro3pU?|$T&x3I{fH|_(cl8?bb z)n(gywK-+4M0#vqFaO|qqF-gB!ECvf3{|bw`x%-Wt15298@yq^yyz3>GU>+7+wXRr z&VA9zFm+>3Xdq{>AfrK9m%s&;8<RFSUf$CyzJtff?6v5G*NZk(C^-q7oI0W5fNJ02 zDaVR<5@zuh?>C;ud}4#3s^big?1->~S^_#VH0~c!b>EXAs>|(jz?ajdrf=Gc<&K=+ zE{Hl<AD*;&rX&B3VwO#M9ObvG_nL|{X(=yx+Ugk9Baq!M5ZJkzO)+EXVaBA3KfPzn zyK|&$-lw|_u`N%%RLx%KWhe<nnJkjmF?d?NS8r#Wl2A9pBymkKoyG;}Mm&*f{okj0 zA6Xa?@3QC%kJ9&zpC(B}M_Eep<k$vlS}G}M=->8`_*gj8{IFHQRELfu5{V9XS$%e2 zvstLH;wr0B(y<1|s3rSO$lqf1x#9Xh<=UT&x~cy%zH!`Cp1R|Yx#}I~`!m}bWQ$KV zZAb{3z}WJtO(F2p=JJhcH$J5`eoAhB(KLO=3chR1PIZDitdHwAxGdxdIrqwOf8QB{ zdrPIS3hd9nQd_2-^1z*gMO=~BS$VVO(r4$-{+{Doy>*wzrKGLV8{P%ETYe9>Q`R|l z{yW>+J6tXii~0mujb=`o^PE-n&Y^8*1h1;TJo%^aU15(U!$hg<)6TtZhcw^i&iwr) z?XJYV{mQ-x=M7R?3pYz&{Ua08=~%h+>^1#u%?a~kq9zv|3V1oApYfqw%Ct!KGeVog zUjLq!s-rOf)8oWdS*89rmU*vG?sb+F?|XAdcdc54kk^J!>zHmxUS++ss8CAt@yE$K zbnYK%dB-blx^Ibx;^R+~IkazkR8G)Oswx!UrqOv=>^ooNg8aq1UwmV`bbL!-)du$| zUTbXpbo<>jj+`=^^e-hh;^^AR?EIVES6+JZolz;!)6(Jl!I}N@p0IEA`QF6)zFowU zwWIw8o5s#F4C}5OXgPgDQ|Nfw*0ZlpsXW<PwEp9_$a@VFw3ts6W|%zf7CRb$_eLhC z)T7PGPc6B{*>7*MIbZsJudYDvC$}xy?)MhlS!k+|(|P<(T%E7Pqy1OS%$Bd&{oBr^ zdgmqg?CJaW-g)w}XUnYoh1XjboJ_2}+&o8C&%eC(My}u21sfb}8xG(7Bpi?<;n#Jc zWnWp8R@H&a^PVic_}r|fVT1DmISBzDje|uirvKNe+SUBPxFO(`^Pw8MV_zFI{<oao zJe~Up!;h>3Q;wys`RK7=d40&4LopwHlpVEyIEF2ilsp^r*HB381o!gw8i|HKHpaec z4P5A-*mc2itL3luL+=BWl?5`7f06w7$3Q-`O8b&s<m?F%`PWZGz3oY@aTM0b*}87$ zoOKgkOy2uSV9R!%T~}|reqD8QpS`c*w4DW$WokNDG%NS;@1Cw-A+RN(rH}De?y0HM z1f-7rPWD+W${jh~rNc!ils{s+D*x6sxofYVQ~dZqi$7jlqUg!Lr?USK^i&;iTIw<5 za6xXU!>JE%H?;;;HAMMe)OtAAd0`R9v~KUuU*F0$D4JIC`n9i~zPkBlmbHTB&wJaY z<)h{}#Fn<ygea}}9eyJ!)cVqc%-Km+xqO#h_FPar;-V0_$xG(j7hVS0f+znfbhsJr zFL6{co!|X(*M+6;I$jng{MfpWw^3E=rOiafBOKg{laIfTuak1(R9m%Aq40H>BFkIv zD2D%KJHI@dT^^O~;_$hUHMu@zrGMY;9uL=}_7dLHOr9^e;ud9L=c|*FSQ|OdZMV;) zpP!b96fEx#G7~bZ(&-Jds}N+{bwkMgl9f^RN4weanbQmowfHBeo0VT!_A`iCdXKh~ z*L{naPfPl%PO4`~G`O${hKurRe7MH=ZK0l58PBQ)x8+xt@ZY<#e4~kf#>>XK=lMG( zoQ<6Fe%U1Nd+x8kdT1Uw;CW19*@Vsn{}ux$<KBw50r$ltbgDLcwrL9l*Soz+Hq&iX zP7>{&vfta<YQe+DK8zc<bAGVAR~E?8xc{Y}#a<+1@fxFdhHw23g-!Q$KN3`}nCBzi z=y~OS^@ofLk$Y|n2s(ZdIra0#1%ZI_3(hVs|7ti5jSd|%{FIqkArbuk?vIU8^76Cg zmrnh=C;ik)o9p|nE6O&WDv0kF(b~GX-GW0TK(u9zQ{~?&CQmPK|Ga&b)**LG8BVo# z#r9rH7^m=juxY4TD?c?SVD8uJ$xFB_&Wb4WOzX8@I+gcr?DxXeH=YRBge{tM(shM$ z@$Me=qqRazO2-8lZ58I<Uw^Z=_b7vM=qH|u^;h`$)mI-1d^59n%_3owd(*EKa|-LM z*dos_IKNDrZ?&jlPGm4ofH}MVQiFumOkOYS<Y#!?Ug2=IWT95m$9hxgllm52P7_z2 zR6b;*D);TY+J8;M4I&!;?5_<UI6wMq`E+WWmDQ<>ra7V4*JrrNwH~o@kKkzk_?TNY zFIh}lVj=4Rk!gt^l(NsWzgK!Frqb3Sc#!>k|J>#c={XE6p^+J3e=e4HT(>y8Vs6yj zGQ|y_e@}Bh_2k;~cHe8S7v5VR|0!>wkVaDYk$+9`+2S1nOCIlyagv?5WSWJ^xt9_8 zyBJ-3uC^aaeR(!)$zw|$%WFA5QrA}1{R;cFIX=<<rhuP|&c+Q~i&TuK@t)BZVUZGz z+Qj})e4i)Z<?KVXJzLdyXW3}|I3E(N)tI?&j#NCur&__vw;`?`O~%)3H3hnkXy|?t zdmtv`E_N}aM5=2+>N&TK>kOWX&R*VHm3U9z^>DG@9yW!a=F6n!ERv94?GWZ2&3kTV zz?QojfrnC?H4WJ_E%n=`PtSg6SUBU!guqiRAMa(TUVJe*+#{}P`lBno8jDk>ox7YL z?;?Kg94q(5Po1|b52@~*nf2~fnpbf9$;Wd`mzd{RtP^Kus+RkGc(Tl<7LksQ8dtdo zN3ta@UvCx`ST)J+fdzx5zSlv9neE^6j&2aW@UZKQ#0Q=;Cmm`HIhD9Vu6RkeZ?V00 z&*_P&#Kl)Sk93-^D^<GqIY?ZUo57oKt>)cI?qBz3{A=5B@bmvuxwX#|@7^`iYy0@@ z%%P@qiz7#-cbw^*;#@88)8WjwPY)LMc>O)QwYFCH{<KL8z4LwvpA++4`TO(gW#Xwx zTi3NdR@*%5z)SPrW(|z5XXT%6m;bh?D_n24&mY4!$%eRn=Bo}CEYW@t{5d#n*$pi( z$>mQHpJ(T%bu}G0ag(2KtL##@xpj6tZHivX5(QUhrP%j;{u-uV@$IZ?$i1S9J-5%v zpPJ^U(6l7fAmQ=N-Kv+IPkj?S{M_jFY!gkx4;BfXhRf4`i2hCTeayEkS8I#4Fq@%J zNrHt;g2}YTqyrD03pLa`9DB?j)1kY1sxV_n{?)Dq4wp|CH|^2)zoD_V@v=~Hm5{QZ zrMcy7x7vo6ah^AL{lh=an{rCvWAN#|jm3d%{6{a9wlpNAyyZAG^?ZovL*susytmY9 ze-<0hGG_F;(DW^A%N6yxdt*htje9mcnz!l&b8xKMvfay5ch5D<IkxG+8@oRo-#%P& zDRkNxGe7HW+)2aj9GBj0c6KP5H_a!|OfXRMh>ra#17CSX-x<nj7w0{X<LdYpDJ_0C zdGg&JiHnSa!YB4@uANj>&^NbJ$Z6^P1m%`O-tJ?&JZsXHJt+&yJK->2d$qq@d%;|* z>4i!WqPOA-e#gx-3|A8kd%WoWsb*vKRZGt%@66wH_e7QT)XfI0clUhU*(@tnu~k~V zK2Q8))auFIF-dm9vmE#~NazT<H5<o%o8e@7j(=0t2acsD%b0IBeVClwdA4NfFMYme zA(m`botpyY$}=cTyY703RclrHuAGz|CMIlWu4s5f_sw>HYH?(vN#O~8rvovzSD$@b zVs`L)&h0zXuC)K1^)@+DcA3WR1;y8N-cL%hoOW)GHTy%||Gl&R&H8I(f6=3Pkvn_C zCR@MRMNwjBkF1>Qb87#tjQ-g(mYsQRV_D6YY`b#SJmn2{r7s#Wm#-`I{5d)Q*!r0G zN=22stEKbpV{`8m@^ACg;6837bRtYUcSZBL>i2n)TJs8v>kp(}_>?}WGG^8bBki3& zU1v>ZsMa3Z<r4cxH#tizb4D7^l;smI#a;B8Hs$q`X%R-7ZrDa8YG}31P~5%Dq9UkT zsqEfI!(;w2q4&xb?YO$5rgmXULMd~%+D=v0l-hN&ebZ-eyOedWc+RvN6PaiI@Y``q zvhQh2=K9xN0Sk)r?&P}O*){q1^!ToPgK0+VH|<yRzaf6}X{gWdgy~1NZ<)obylcBE z%ZVDNlU*!K-&rf<5*F4jP2vdVKh*Lt<A!tbnoSJ979G*sJV|xh)pF_O+PY~gZYXn0 zh8jgB#~k81((oW)vF?L)Qm^j|KdxEuah2}7rXnVeM%yqCPos$}+G(%9wr;!Xv%F9w z(ZX4C313N6)18ay$uH8S*H&)saM=4vnvElNg-+^v-I#`tCQF|=3-eC7S7O|<#$~Fq z(n<f@_Y-%muwK|4bU<s>&){`&-<Bn0xz=o!;Au~P9_440YjL6}^vcQ`rp@A;zQx6< zC-PpKxnrICw%B%mrib0Tjz<<dFEi`B?|E^{?X0Jt9Tftn+0Hg9W1rdc^<=`gh!xRg ztVw}Nf2J&myEoaa@2vL5;t8@5g@^60W}M|d8m8Y?7c*byUDCNTKA$=MY&7BBK2Puc zGvm%Phfnjo4RGcAre>)(@2l&EKbqfuIsM$6BYAKC9iQ)7L2Gn<SeGa<YM;1fq{R@< z8DFrT_q@#AFsHuLSqJyBedFSo&Uoy9Hp{PVF_Vw5zQ1sgb?!HLrvBfoI^hS`-A(gy z$$P!Z(e=_rqxTwhn%N#)<}(#dG-KWv8Z0<)?_*pxE2Cm^V8O2Xjh&hM*)0W1eoORe zTn#%?`q^uC@@M7O?{+@m4LxntoBAbwlkBVJ;utRd)}5|iXQ#enVewE^Ffn{0Yh04A zHX~ElNG7u~`ku0w(vtm$3ODZEb733bl1BTcSeHbGxI-Ls!VYe^z~w6He)WNu_2mFY zw?j3#rTK1)=Oiq$XL@j9;n6v&VoKKyFHPfQOa2-xwyC{T_vF-VhFjJ8)V8NMM_Dho z<J2*A<6ke}9$9^Q#gYSWpH>{+!u3`6*pui}els(sWO9~hO1vzZ+3p&^BRH*CLVI$} zrE`8$_qo~ql8LRK_+_4GWk@+&SB62h)=>$m)1TI8&i?sqeb}p4mOq(TXD;UETc*$c zwl|f_%SOV?vYctw=7n#VU)!*ss<u~HpeI*#LcAva&-MkZS3H(9%Q4QB;XV2?V8T3h z{V976aL?<Fn<lAx&S(A<H@|y7&J`Gn>n!{JvBav^BzMF4Po~WikBHB%sylrqsqPE& z+6_EuT+)3SN`0JZf&2dZ{b6qT<<719yL;D{Q>Bv@%;Wg4yyVImjX3w)oBYeIAM<{w zc-!uhDVB85Ps?MnVy#SXlC8k2tn&wM{>gkTqLgkorS)Co>EQ3YlMYt@PgMD}KS;hW zxmNyr$p!Z#xhujWCvOaFKGBtS*rMf_WRua(ePNmBRMaL_*^B5}i|K4BIKbKS-#ULD zqfY$HvxX8kdF^d#W=JZ_)oN59+)@8Pf7_o42EwjM+}7OLFL%21&RWu)cze$r@77)J zKg@Ss^0QbbYuxSkruU#~Jg?UiyA8(-)`t1@U98l9YSgd&|AgPme$AOP*bn-h{d>Af zv&qGL)xu<V1(~DQ*B+i>v7~a(dy}YXQP+RF{;OM1FYxO`KxfG8i=Vz2UVMIpamD|y zH-yaWc3<*7e3AEq#j^gW{wH$Mzo!10rZQ2!x{3K@NxSOIbrZ$ifB*RrRjj(~;fJF~ zwLhx*q?;Ml?pR=!^mO{PHP=i9U#^RDla&m(S;61ZCfm{Cb-K?~Ur8uaiu;!u|7Avd ztveCB?rmFhGVk8a<HGYa<|Z^(G{hb$W-S%p6+LU7(hrm6a-EiYD&{QOn3He4%{|iZ zN$}EJKQ(Xd5@7Gs-P&@Rzx{jRz6V#?v>2F}9kYv%PV|_u$0R%J(_-VfHLJ__WG-CO zntgRb;Zok!GaU;!l7Bn2G+1j-dv(m{qKo+F;}%7qo_p+@n5mfEb$e4!!=&`51{;d9 zC!1Do-BY>onJCwfB!TLQXCn7B_D`%cDeYUn@_0hdMQ$&-ADcHlRxny<r}2+_+me!` zRcnq-{hjrx*iufWYWK=XEA@(Yn)HSz=bqkL7nf%GT;=DYgf-`wC*M0@@Ohi{<Et48 zOwnRfoLfajE1OshM0eJw)JdpINnd4rUfHNrelhf`*6pN&M{ZyJbSwAK<TsBk*le0k z%(B0zu<COD=NVt?dhgVPrPTjleJ6Rs>2`URKZo9$&G=ch&5MzrKXc*Hh+nL-{Z41Q zBuhSSv;6-c%y#yMi4v!`EplDWYX5kDqetvdJ&ye6vXkw(8xNYVY+~$q@KQ%qy4HY8 zt)OSQ#&l)pYxWQOf`5kovHG*LW2p|W(~F1eZyuUG!T!d#r>hq!EJ<iicymTl`trnk zvv@O}Sf8vo-+fP6ip{@n&aA&j{qlnM#r=A}?{-7diD^y0-_+JmZM=EzobN-kJuY_z z<euNsWe(=Jxb*0<z1u!6tPki7<qUqTTEBfO_lGG=Pd`S*+-!L@Ywom*ll&HJX?mK` z?EP7x!S?3f3$wV51H<!l<0qf_<k~5D@!Va7<F8_w9Q`W}ZWg{OaOrg1mm*DrE=326 ztCjN45|;%(;oW(xckAuE(969sZas=RYrnAFXEZ-*e1lnK7K`_ChkLcw?>pu<%h^ud z{iH>I>0(EY*1*Ts%CEv=Ocr|I_;)AAd6R>I(x++5cPn?Kxn!*}f2>$=cklF_4UP*K zSA6uk?ARl?wXQq!{>=@Z&u<+2<HAwaDYfLNZsYOXzqPx!efjlbhKJu%Un|*tCN&?A zvO7+wP26XEV9NuGX(D&b^<O=DEc5c9i|O5VE88pIR4tQML{&703$N(oDD^wO)Vee4 zs&mELt=Fd8tXkM67H!O)+?>-@>+AkTTC8P$?{S$^+npcAn{L#v-2AEa$)3|kejny} z-@flZyZo8m3--Fyo{i(`V~f69!83Wq#Lo<KtjsbL=FQ+y(J3~(x;a00k=X&o3mXj6 z#FiIdPO=Pp`NM3bsQRLre>SE}&sVp6BLA}EclmDS21Z-mMz^hAksG64F0L{)o!|5) zAz#vKO8ZMsnR$j;Y}ywzd6@ijU$X3Bc3EH?-`(@Cl4bonk0X~4Wp31YGvmmQ)T0VF z^;`3W!i=Z-1*Nv|L^Dm;p0bba<;l|r|9_h_#p2FeQ!ReZmMU3QKFzZ^3Ge4;Cmm;* zohor`#{=_uvkWw*K1fj5sHCJ3>=m=A<KVwE7oiH#H47epzUp<GGw9hoZpRquk~cf9 z{5x{zTRX$%mq~uN4t#Ao$)nGf<fe6NH>bPb8xDa2X2A}2aaA2v+3h7WH&3eh!lRfu zz38<4qci-59|HN4Ol-ubnH(<Yxy05eWN=>pPT_%t>Va>Cf@03^mS&pm&)Fh3iOu4_ z&WUFR6S>p3EI7%czF6RJS_h+s*t0_q_lj^F^0>Q{z2cj`d%EK7n%!UI{ybK^^h~OA zcfd>UODp`s40`U(=<<r|l>3sU%ChZftbx4d{pDdN=Cf^{YwhSS(l9xE%go);*B8Bh z73=eAV}#f2(v9={FRXOZmEE%Z_Pj_rYqe;-o{1G%ZA;?bm#VFJa7DF0MDuZ>Rpyq9 zcV<t$qx3i5C)LvIf7n!RP1QZ3*SFl;GG}sr^Vzj+n|Cx;-%Ge!={V)qjQPuas;t7z z)%<K_>mD>-P~EPxcZbtW&50YnWtWD}wGOD%vz}&sa0zpVvDSG9kDX6Ay5j1xKdUbG zoT&I}(Vq973gO~9ceR(VdC@knM2(f}{W^KJUo7?$^St*ynb|I<*{^*!t!~QS8FN$Y z%QpqrKDnZqWKiiFl<s=yY*j**T~X0(&-)gV9x-86o4!9;oO(9v$27hj^P0QZ>lXb} z{=DI%t@f+({;I@%+W#-INB%pKbV_H=$q>_x-L^{#O_nGgjXKfYbSGHjS6_n6qO13~ zIWiAhcrcqg@G`8B%HArV`@AYM#^|#D84u>Lr7PR*PQScpWRNChDzI|H3em%7)~l)o zE@W((r7dsgt^C5$&14l<fpAS#@jK>#Otsj9$2w}4@BeEmJ<lRx^A78cOIE*7ZB|#G z|CRmRCU&)*8#jMH6{g?fp!wvrd9Y;H<S)jyGAgAjr)R!6nW?yJz4~dd{G~4T-q{L5 zFFY5=SW5ezbQD}BUNqs}?bbS#sq;EIW=@<Jd8pKWvxnOQhxt$Ls2)-KUt|+0+j(&x z&#l{Y%%5I5+VpbXksP+^#*b_mi!)Oa5B<8D6zcNom3&I2+4MP$1(*2zZEd<wlm|Ay zU(z0OuJg|ODc^pTvd7rn_+F-?yOU-0Vdlcej~b>|CwiEOUi4UVG{xwx*Y;a;_dU9D zX4m^yDK9n#*PL1N*w`$Gec_WoRsVSHb6Di$d)HJ-PEB5vD#utXKheQ(bEyAK;lLBu zMf7~cPBr$4uCH=fo#CLd?{MacEuAwL_I*_9TPct=b)Cy`=kAst8pRc%iyFO!=V)zQ zlw**6JH3T5QH*<{*Hq>6AH+CLB<xNqe7@kCN6zi@1u6GhH*7g*@76AJGt_u`wb7Z| zzE@m%=4^_Ri}#D>V?J}`67x6iecQ|5t?aOvxw%wQr*xuoZ}z>l*0pPdW@_A$?KyC; ztx#O>;;ICPzwLaV7GB@Fqj~T7+J@felXB!QNKeUfjs7$v=W0~%If?Z`i7MB7Walis zzDo5<>N?()rCHtYzMZ-6fBaMLCxt7qhf2=hyS3DWchaou#RkuQ)(F1mTdB(Zn4f2t z)_e7f>z;l2WpnoSAE$SFineb0e|+1{nm+CCH$6?9T>sP>|F&M*eJ$_K*IDeF`s=su zIB>_+aMHs&oI9VE|C!!b`ruNtNBlGuWy_Xn`!WmP*RU=6w!Uz4)sNI|mgi&KcSYQH z3Kiae=G=C#1)DeKG;WC9H%akn^mGehvt<wBbIZ2;Udxctf9Ck53qALZ1a>)17GZdF zn=NhQ{j2=j@>~lZGEL7s_xa1NZQD*xm1LW9a>38~XUpa{{H)fGlUvWAb8Tl!8ApGE zr9@0wNVHkWpHE_Y&tI}s%B{0F_~6<12*Wu&ErrJ<>vklv-`VHJbK`^Xm9}eVMIOD~ z%lSSpFKBo4?rV!CyLdeo{2k2uBiXWj<DRRXOhUqj=YOvIG_mz~_Knsz@0T(<r?zhH z)@V9;Z_4a7S3_>DULf0=TFT)t>8bL;yVVcxh8TaWDo%}hG1=rv+&ks)o+~obbL1yZ znEiC!TV-2)pRlUyZMr2({Gtwd>R4}|Ai=7rQ@JiZ<&vs!(T#N}PnKvU&t&G0TBTI@ z+v)gnh1$+b8O%CAjQF&(CWot~e?4<IV`Jsqr>9Cij<ikcUJySgUDI^;v`LmsIR{=H zDxHz@UF&Sb&E6QZm4=fAo)z5O7n{RiA1U|5jK%t#!^4}6;cF!dW2%=O-up5mZo`rt z@z0*zwfbM9G{?b9$A{sgkJ;QLj-Kz<UryR3ua&&Oy3H~E#J<XuO@=L6Yo^%zED|{= zKO?yC+`(2Zp}k^vTcWrGUY90G&RH;p+owG1X2|}@OOMX_(qFnlt}?{i&g8F;vE=z} zM-(@_au<A-s;6=>{7&<0hX$r#2|n!=PV?k$@y$y#ak4(M+I0T~p31eepYLOuaX$Th z-Nt|SV;*;uL|t9=it)zjtrq3;{7R!;&fGlw>@EwZ-<bu+_PuE@{jB+fEjMkA+!Xnj zf30;}O_r{l{J^rPCC_-a%fk~MMrZ#yJKR3^%haO2?cE>q;?Ab8)oUK#)OqmSV%>^& z#*cP>Gr01<_CcIP;jic*YnyMazdCsTmM=PIw<qGM+rLY}WwzCAF9a>0*>Li#Ns{%6 zyVIOdVqx86$Ko+PuOX1{hsecbtCqsIt<5)EPIk<ge<d{kVng@`=`H{NM5rtZtvn=` z5qT+@e-W=wxqtsg-Q0hk%LJ#^b~><ch>HxVk(#%<#Nlj+p>^11ALm<ZjiyDG?~!2% z?OU&GbXv_>*z#%r)XmO4Uv)z}g)$9W)YcpSn*3n-3)MIM(}G^J_dKXs^QW;*w0*yG zlHQw#dsjI-TRqq`J>Y-cd-k96@?ZT3JG@Zs$?>Ynnw*1-r7G&Wo()WDQELvD)W>b* zaoV@$KCAMk&A-*8J5A>84)57GW6Pn`O>?sY=iM+p+gQGRhwb$6walG4&cz2zPPqM) z4lP&TSXnAM`TeEIOI?z9U;6i)+d8A`@FeASziFm-3=?1ZSgi4wE^&adS#3?nkM5b5 zUX=V_{XnSx_+uTHrvAI?E(uoul7Fem{f&4uW7S8~i2jVFt*u%A-Z${`1?FDfCZ@S8 z>b2><uQprw4SsRl2|E1UBu>=xZ@2ocvPJBVi<)(pJM-#>%zUnXF>qi1fobPb68cYi zKjT|-m2K(j$D$K0RMtH9E`D&jW=i56kzdaXX7tZDdhLC2)yer&LM4lTs!v_?X#IsL z9y+^Ja(3=B)N9h(lzhCy@%x*1KR3#pIBoXjdt}4IM^@8p-<m})u;o7Up6^t!?D54b zH4f%(h}xrH-x^pPd1asQpWm6Q`aYdJd8B&(RhJ7JY~|BG`Z_MI4K-pf<Zu=}T>R<O zW>L4a2X=pNtuUDW!R7I{5bvJA`(MM4ZRX6lwWRjUKIcmuSN<D(`o8^^rs*sRuFS7` z9chak!gSA0+wdT4)!y}8m2;QB7S}&}R(g(gePf%d&0ot{ZQl29f3@eWQq#W@+r0bM z|ET?spP!DCR`{d4`t<+57w*^W4zyzV>Z&Zcz122g|C4(DvfE#dSG{i)>kj%J`XzO< zjg5c9#*c1kEU&A?jJftlHbnTl<?sGxGs}9@^QtVbZ#!Zm`UMg{sxUqA+-@H6VBY2Y zOMD+P3g@j@?df^__VZ`&KZKgU-xb4BbURx1{^htUvrWQF7d%j1Dn6m<WNb`Ub&|BC zf?CwU2m9LvrGofkEtf~0t2@%+urL4QFO$8dH}+fYQ(Q7%*W_lP%yPS=)4Q9Utwf3^ zbsP}izwDW%@9{|<8yFW|;5;sIe$RulJnoP*Ls_3{HlfFx+kZ@M2~cI=K2)>vY>?WW z_i05X)z9YSYDqth^S@qlVaIgAxtrK0rVE_va{6hWdMkd8jnu&(;?@@hkKA-!>ZB`m z`~7V-c^m#tnLMSyORoHVheAIta+wv8b4k-!#LuUsrYgoMcG6OT(5l0C6isGySFE-$ zzP#z?UT)UAvZ~rFNkSieym@R5i~qjZak8(vs^^{U3ENeRBvP!?cIeN3(;lH6B0ih@ z+2)A?1+nv`TNxHUeR_GB-wbATrQ9bI7tLKRxT3top|3AvZM(=nR>yr8Odlt+|781; zk;S?!`^V<OO`0#1D=)0%vJ>c;uPPC|`WQ!SlShPevtv}sBa5>qb*=vjvS!@6d)Lb> z>U^upk*O=!t#F&cx6A1JZ1H)^POLIG<56PCzcT#a@j0g#t>5|l@a}mt7$(lLI`!^n z-Bm+brb<Sp`&ai)4gJg;c{=M<9m~GA|I4>6-mvD))uZ}*SPU5X*2Ud9Zo{;ZGwSo1 zoh(yYnC6~MV%}xIIYnLHS<@tq)8<54-c&g|?wl!4r}72aN<NXEX|v<+<^?TJMEjB$ zb2llPw%2}FxZxl3V*5SuF3<QZqe}s^pFMG~SbEh=;bcgBkdDZY_DZ#xd=?e+80XH7 zm}R(5Klhf-Jx8ge8FS}8Om#Sr#vJ~6`X%jKIr}!w6ua_olg;-@PuffcwO`8S`#<16 zZhelq*!+#0yrX<#h(+xxwQP$}?Q;d|WuH8W`g=WP>a9=hH@9bg5S9A(Xx^l^=MI$@ zUSYeFb(lBn+y;eDS!I41lS4v^qoa>|y*6r_Tb}i+rix`>^^b7oBlFhz@BaH}lIJ8x zg;zfwooO$gYWXYf+msh~-d~+BC-{DvpB$6X$xmiRhL+mdH-9a<)bb<h;oqm+zb;)h zn^P>H@0fqNGC<40R`bcl{9wtKzKhD8|A@J|C_GF`*L$hM=gtyhGdrrObV-hf`n2Kz ze?5kepTn7w;un-<9Y{C%@oM?B{9U>$laHl6tjT_NaJRAa`pd^w@RaS^qRGM)#TmYm zUE;3Pk!cs>x_1UNy^=pwAr<nxEB>;CSFx@BA|KATZe5ONZ~88`ERFse&X>6-)Lq)4 z+Ish_XVVIzl%5zJuFSsv;n2*O{a@<4ea|o&96wnQ@^roBmb>q&UtMFkStP{CxlknN zjx5J_X@R(Kr83rYX%D+p&M)W)wewgX{!FuUd5E~*yQMSh-$;4>O26)^XMaj)>Cxvr zL7cyt)(Rg~vzXnPTkLg(TmRVG1ec43-Yz#3uiia*CGhd%M<>p3Nhx=3Pt(<Zd8(Dw zu4L;@xe~q~j7!{3GdV9j$N%j|N=n+<`qkT$9u!_G+Swhr=gH&1GAVmq{a>F83TOB} zvOBMMxq52x<l>Ku1B|18l)c{hmgk%-+uxN+C)5LePVw7+;2{_Dycb_CY+R?Bleg-e z=l8S;(MG2fnv3#wn;N^l5q-90<>h>{C;dxLhby&-9iH+cCZT+-`;VZnZ?5q0xpu^C zG0(qhWsy2>|HD1eyVhxY6#so)ar}Cc-qP%Avm^gbym!iX0!x0GOyJt9Q%noqm@Z26 z+WU6OxrEuh$$RD|UtlRM&AMu46}=`*qxNq8F4vr0N>4vMa@LP6Pm$Ss=*t$?+86HC z_btpjgmz94FBVB$E9aPZtaNXT*J}sM*`2<7%^DO=#JW~`MK9BunkgcZe(2!LMHfzZ zg`UpvpMNUv)#Y_3&vgDTF=?D2rZOWh$=Cl{WI)%k^eCgpfto4Z0=r8jE<FCkR6AqK z=EJQoUpBii9F`V%A!}BCE^Xh1EiNi|FRd57e%o4f;U%4Fr%7z-yVcD;S}r<eHL-fO zbtKQZlK<N{+gg=E`ZW^jL_HqHv>Z;&wshm!z##0oc#m#r=p-}tk33?$N*$kPzE-_I zVTo{4(0R3(KSvWLtjLa5K6*NEHK*$BeV#96xAO2@2|YXeH%GvcI^!iQ)y5Zt>$v5g zN}QZrUJ@SuXVQe38S?g<o`1~MZIm?Gp2gmod;a&;4{S$DJOXa`EHgjTZ(yNx;@zhy zZ=Tk!ekh@^e&6Kk!py&~a@J32s^z`EAUUM#b7e#Ck6xo>*-4SFIrA_7G~rwDyLq<6 zoO$!kT*<QPm%de|Fw42^!i91U6>-t$&kes^n4r1;#*?k8G1~8y4V&GJb~~@$mK?Hg zjn5{TlRu(W7X<Cvv%A)jX>R0?aIP6!B?A5j>z60UDxT7*{S&XrWLLOlrq1@{Gr32~ zwPcy}?lz|CH$^o^UA-pR`rDLE<bLbtE4-dP(F}jg^9!`it-tTPwE4^QIj_Dkxz65j zGx7LKIk_t>I~c>G?tC}!Q|EFEbXXX8WU{JSmL}WAzqK*$-<|Jih=$cyFTB#Yvv<Y$ zxU>gu`3i^An)Yrzof;FYuchmw7Z?;Yced_9jeymaoRT|4ZHlU1v@rbE`cQnYh+kc= z__bA7k8kZ0_0ZQ9$CrGZ`AGWvysySyKAW4>vLZDD=Pq6TT$+pf<x#bB);mh;q7pPT zLXO-MYug?@>HWH|UQ=I0IVm}FsXqEz`?6JLZHlYkg|kO=B>5i+YZu$?-g4>Rlw)5r zRDxu`Ocvd)!@6a;_M7S9H{X7%Zhv_9=X<gD)AH_K4R?Kg=5+V|ox4J3*<Up4KJ>M6 z?MBIKB?a7}?jEas=PgVWSUAJ+(Df&gng1i@?;SW3W>DX#{^RiZlOn6tHce+{shb=x zr?D_rXQF_n$-HGRKX2`Sxv(_1@Ai+WGhNgqww&B_^t*P&t}DAH+itP?x#pxJqsbh- zdHQE0o1GuIMcgaWyuMFWqh@K?^Sr)t*CmqIEU!#V33-34TJN5&Z5`i<j%6ifm8Y_N zo_r6P7;w10`&HNLYxNE)Rvl}fNtnFsv^#aZh{5q@#YwH7Yy29`_U}9WOZr*!>dcxH zenr<rp94RxIwzQLCq}%uzJ7z|e&N}N_MC6n`FYOe2m7sG{kbw_(xyXq{@>qeeK$Nf zVsS{T!}LE9T&#sw`Um+q9WT7=OSpWNS+D--wd*2*vkR`Q-WUCbtt|0ON(G<Toc#*r z7v|lqd1Pk$qljVuzm>Kp9+dpaD`Po7>#fS)CFM6_9$kODoKtSuM(KUAF6whlj$hqX z;kV1<f3Ar8lLXm*&F?$;%w&t3g<d9h%r|>8`IGfE)(bKMX>GPOKYf}lP8LtQ<NhzZ z;+6kPIsG}eLd4DX{4%|Iif^a#)I(81bEn+>AyK2w*}41FtJWtso+jQ8y<r*hw|n;Y z7kNRm4v45MVGOVr+hX>)E^30O!{l8Tw?A{=6kM^O$*_I;<kQ{-8!PL#Ygzd$)Cu_| zdGKWc$JEPH13#>uu4uTLuR^ad;_w}<*vp+Et8c9=S$43SZQcFk;NZWy6}uMS3DHq~ zZg}8VZ^fPa+6itGriB!0ikw-OXB0haO=W38?4d6=en|1;zkE9@(p>-g!Mv2l<UTF= zS*rzH8}%clp9swU?9G{7CA(xv!?cL_4=M~@Etg--{hhkS?FdH}Q_R+m{)$H9N3AU% zwpCB)IN!$juBOKPm_%Uj*;x;#U)uTf&Epx--@aaP=18r5Wx2`X=*6Gfl71JmTn@3w z21Yu*5K>@0XqB;mbCu1aUA5I$HnFgYa=-tye%kW0U$bW1c=)Qo%uw*<o#XBQf0^$1 zad<^+?$o8~cQX2>G%dPeEbI4qXG{x|aLJMXp{W}ea{kVrze2&a=33VANla}`*I)NJ z_CG3kJNGZ=!i}k`TzwOYm43)nwj^$``S3R6@ZSA<w8Fn#C@~3ICs4e%Z0DpUf39oW zh5s|EsY<C8c;gW1Iaxg6<m5;0T~TVbOjk}wJL!Dc`u0M}o@=Wov>w=T<xm>4a<5x@ zRn?h~lXWk>o-pC2`DLw-ZeKtA{M=FVw#oLncjh0PL!Ua7ZdBXtsoVR!CP)03Oki)1 z&@PsRE2cgEIAO`G-seq|va`$n^jDv__*+s<=ccyX?(7Vf%MP9!{9bK}V(yv0%YAK9 z!fL}7t%jp9o1;t*sm%Q|Gv?I8PaD&Fdm}}}>l8iXn+=y`z2-T|db`y!J~lW+e)f%B z^I!h^`jBZ=!iV24dRVu!>D3m_?fkC$XT#(9O|9ZKUkeRI1snw%yc8QmB*ePnrkmXM z=Q7&dR&V*QeahS;xv$i`y(S-PNXj<&l%IHX*^@}!gk|DSex7~%_@(76k%h-A56uqv zaO<L>=oGP~`q}e;ZTTj;RR2`k>-Ckt&c^w@NQpS?_I)S6jq=S!hi7g$srZ1cnJxWZ z=JRRIMLcem!4o<PS{})=8V1ClU;A6FooC-{wh67TPfpOieDA`s6*E5THuMU_t;*$* zdTF>iNHUSdeao3QON98@!vyn=uC-|m{nfVPNmGg0iG*pgbIc82ot8Xy#Q3z^+}H&Q z^Dgmuvde4RDA+E&8L-sb>eb%n2`j{%F7!G)3BA3pma|<{<)zCazmMPc&JRs*pK^3l z>)j<Xw(Ae=anx$+Pxdo9vw8DI;Ux|$g?DkApItwvRBN?*(R;m1A*m5JUNjr4zxa`L zXjz_-sNn4xZ_aGmBqKf}Zsui+?)|G@R-2`T``?i6$h~`1E^gil3EpLm>)bBPWXnwU zkQ18sHGOJ8N6V-6ah)$WikB}5cUW*ew9Ixt_lLVv%<s<4pTT&k^QK(dX;!h53#WT< zFf6o*Qh)ohZ2$UmGo_};K8P<_Dq`&NivQ%T_c`AluwTeecb9r*z_deE)+noB(f>78 z>z7CUpTbZq()xMj6uE}t)0_E{82MISSu4l-_{5G7@wvZGv20RvF1owB`hc2cOT&aI z7c5m?J8hczyz=>OhllMywB%bE|9yDy%$L1((!a=(vJ>uCuOG9t5eWJ8^;e3xqr<|> zKW^{7{q4&ZpY;VYnmhs)vnzEwZ?5BBJD>a4A5ZC3rRTrpML!Ri^5V?r0@Y{nyEZgf zC`^{iNEDr6cR&Bs<1IU?KFksB<jSpjDsyYk*>v;AaWZjM5@%y)EwI~SKlk`YsfeWA zQyz)FRaRuN)ed5Nbh`e9<(X^mtq)9(crmrl_=O+$q4}1<s*{w|R(@w`eH3eMv_<i! zf_akmntJP(vsVVm@lV<yvvFDTy$uTbf2O8!oUpsK=D3AhSZQIyb}MrSrr9gz@XT8H zi!piz^AhL90yjJseD;@jJ3He<;?hh74U<46+p`|U;;Da^8U6`-`OHFn;$z|Y4X^B$ zo-SYPZm-XADq!Qz)vNj^{mD_7dLUKIVo~Y#z?CIkD#@?z-~OZGSyOMMf5k!N{Xboq z?<@Y9ZZ~?;;C=1*{KE;qe)r^AHSdp4Snlz~BIZzo4x3e_oTf&_xuiYz{tuTHp8c>( z)kl1hAnTXk<-$&7?3Y_hj~_oaEimy6duznwm&+8cv7Jde%HFXk<W8EcwZ-B%tLwFW zKUZ02TXjpi7r&oWqG)9K@$hj?htm_2tAy2OzLni~L9@=PYev&P#V<4FOb!qUKhvdM z#`Ul6!PF%h6Mt84w2GhV@+U3z&*n1zChj7Yd&~B>Pkmk$Kg)lq<rQ}^7In)%X|db3 ze<(UrdSZ$F42>N|>#KgU-gQyepP6iRYSDK0`F_s*KR*7K$`+o>G_y!G(fjO%37?Ek zOgC$_n0R)!+k!WT=3IVY;=41<u<OdzCd>N|@1I@C&U>o&Z_^sXE1CSRl81|vX8zTw zY&K3)m-s8)e{R=)2MzJf$5N~Ae?M4t{hEf=EXgCaJ408f{NR!J>>igf!zjv&_x5>t z*5kLh7jrEV@0^nKY(wnpwcl%36`Stdu;r3USigGs3fpaL3pV~cy|OFcr}w$xs~^@q zi|%daFI`l*qkq!tm#?ZgK6Z%D-?`0y_4msDi7`#r^WIDSXxZA85~OMM>4ukk?6Sp@ z=8sm~(44b1^p;xwM9UXRzg_!0u5NP)E-W>97eCF<bLyH$K`T@8)<tpcEn8o9_G8wu zM~2rI-IBZ+r+Ri(DpR@6z124t?^=JVmGSAVB{9}4lM1_njwgAi^180QW6$TZ)3M}> zx^Gp?Re5Eh>o=FIv$tPbzkruJfc<RQ)Sf?vEN%N8?0Xko;N9P<`8m2<DkbQPTUW)a z&>L>oTn<~*KcD{K+mwo|b-%SuzGRo%?Ou83O3h=j9W`pQ>;hKSk=r*ZGHK4@a(b## zcizEP$ns9f-ShUowo87z-&xEZvumaw+k(~4S57l>s*J7>cC`wfakX*g^?=?0L63(* zRaei<tT(=BZhY0n&G+uvrdRU+V`}a19~9S25-v2}Z2U^vVRP$&OZ8tR=J1N`mrQUp zwmh?V`A=1=9c{k<!;TnEzj`#_UTx*&cZ)PcPi<UW&;38{_uMzXpV}?^n|bLJ>l&si zow-x%+1GlX+<D<kh`&FVwvoE#m6XrtbfaS*PkolFJ?Wxsl=vH+@-wE4ho{v|b{4Iw zU6k1Iq{C>N;Y-iUzp|dB6h;-N@orb!Y`J#El<Qx7y%!m8_l${Ix>js{QS<@k<LuiQ zzT8rL@F+ufdUrfWJVX4cpmmqb`dG4?>x>v)vPiMoZJ3wO>B;ZAePIpb*>L-dn>u;^ z{rH_9u=3&EF8^<O`dl^Vs`Bpb`B_%<M|Yl^Wx=z@$EPe^^!weiV3y6ljjjIQbS*Hf z5aF#pKkwEel?$8dZ5H25?f#;r8y4BzEZ8DtA0_i9R4CJUX5xpELUE^KPwaPonOXPY z4?|Asl<>I$EECP6zlWBeH+Ap2%xrM;+OEW<>!oh&EL-p`l<#`()I`QdCB;wfyn9s} zeP1C!<;yB(<@nke$ErfQeI_i5bUwO!Z}PjX=KF&)((VSY<E#$kKgis#8vXR-Q`X3r zJJV{Tl!7xEvu-HlHSmX>{_%cq%WSt?_r+angGAD~&z#(mlk(jqEy_lDsohy+YhRY& zqPm|;8*JkmybrQ%bH3&Nbu~}eqV^*@UhXJcte3R)hs!!A)>U<4dvgvQz8`+H;u?!f z$Je`8W3Ps;l2o1){_SDks-K&iqJD99AI*6wv2FjPo-+ZVGatPZd#%h=BYo<Sw({O( zPq$u82zj}~sQK6=AsZtR6QjPKKJPZSrrCxjY?9&2jihdbXlWV#7F*cbKCAuY?X-*# z=@5y9Yr0&%oG-qn!y@3c<iPz--q+S;b(^0s@iSauYMT9i#`&c||L4AWv-}`KcX#6A z+q)C4yx+EHmz7zB{jN_B<fk!syna9D&vdV=57b$*7UX5Ib03^F=ltuZ>ef<MpFca~ zuKlLu)Fa*UsMhIEPW|56^ffy2Y!ds;|9ux;C{4+<s8Lj1xIo<fHFMXgns@D+P8udQ zNtc>82TD&DT@pWWV&_MtNiuGm{-o6&%Dl3uN~0k4!;IJK?4%QgHuaP#nQvV<VfVa^ zvu8a}lTp68aQdklrtVjPd$ud6K0K7jEG&94)BT@%v4C-r^Q6ydy&poD{_co0s$FRC zoo&Hw?F(w=`r^-S-`1YE>h6hMv!~AI-{RS|nyq!+oNFQ3x0_x1dmj7`lJOS_<=eTa z=gp&?oO08>>mOWrVlzKv`HnBEW=hVyHfP_tyVll!<F%JvZ>woijPtCvU%AvnW%kxc zyE|txzUr2QU!Ujm`^MX;+wU92?zxk<(*Ezy75>x8HoG{j{F{<LNxZ2xNP5wXfAyuW zSDpQOM#%8ls!9AdTc&g>R~AV<Z@+Z9>ieR&X{sukEw`(3ocq0hmK1$uE7O+h+@+<H zDgC2{y^2fjng3@$zpxo^eGf4Hdhzk$ytsLhInNe`m-#-Hx6`@!@~xzuo!5KgEzd1) zUo_s$7O?4d+{<>EA5Yz6558sWt@*p|{^j<zCGIl)9{FFtxo%DKdmGL(k)ehC+ImSD zrFT{v+(Mm;pX=`{S{?m8pu2sqEN6r7S}Pqpp0sA!`)Q({*IwCZxhO5!&|1DT@86xB zPr|kxj(z02C+%-T>ckV9+4`r*Rh~#$6C}CjeErikPb*I<)?bPIo%Qgs$JVZc^Q4%Z z<?~zDdNf?gxV<&kME}g{rt9x#&R!{ZciZWV$!rCui}PzuR&Vl?3_W}O$E-^=`<~Ry zeD*lq$Tjq8WtYo@Z)fLiEDTehdnk*6+4->}zpqvH%y)?wENX3=o!+PPp1=EhBA08% z3%6_BZjI>^<sU|deO8vWNw(hGA80qF`eVk6e(UcBv+mhe9cz|*b!v^(<--d;DjGzb zpA~ULO8)j|UfwR3(s_ZQYWA!80_@$MSyVmL&!5P#&__j2=H1&~&GQeH|14&G)ii&p zyWMooX;V|R8MddC-a3%>FyC&P#}j7ur$ydf?*sQqtv#nvyZ11+u)5#W?oEe}9q{>3 zkbX_f<NwJ|WgY%E8}BCuDv1^4uMa!HlcsepeOl}6Y5InJHG7pNPu#iaQfBP_`npNI zCzl7GHEK@UdQA7`U8iT8D{WMg3^{-Qp1(0t`PxrzbFJdCX4?f$%a&}KAL<>Xs+q-H zc&bP-Po&Yhtmk5`-9gE#iOHXzJ?wt5ulu3ri-mO$)|dxN9-7oM;lq!Mj><xtCPhd# z=@=Z>;pIQ6A!xKBE&XqE)(v|FllYx7Cy%X96lmm7-`je_NjS1aY^(aM5+V0X_K!Z_ zO`YG{w`}Lx?D?EV)24>qe)vp#(UYYKFKxDOd01m~=+lkhtCK>?yASqVR4+WDdQn%9 zjbqXB&8n?2S#v&ePhD`ylIO?s*67HZntCy_zdB+&B_d`e8UNp&z<A+zm|xOYBj$Wg zYo(pLbx-k1vpPuz{}WLAq~&_B!$)l9*B_fBZ-3p^{q~#sL?cNdomDMddg2cMHQ8R* z2DzuKQccP$-kc>pduwRu*_6Djk{vshU)oB2n^*XVJ@RhR&M%W5tF8>_sIB0izs62Z zilfDeH-6`z3zw&*6?|FuSkrE==d8?MDY5n5ZD*6VI~*}9KBhOL@xk>17lr>f^9wfo z@4j;-GjrO%gOW#@ll$40?f=|;ewNxiuBvxGY%*AX?R?C0`!u)j?_+l#x;7fdm<PXp zvbJV})57krF^_dV7)xASd$sWOs$}=pg^Gu69y`Hj*Z=sY$%*Hp3y=M%mz{fEW2@B+ z?|GXm{#mxQ^>!?8V-r-mdC(>5MvdGfD;<YJhmKEq{AaFn0>{S)*?-d}S?|5DLG$Ak zpH(GOz4=+w(zZRaeX(uFJRja5#oF3?yZ0_%x+{EVe)<1@IjJ)g>x7Q)_|){}#GN}& zduP7fD4J{Ly;~%1u3?=?tkco!i6V?T=X%bZU3q!w#n(#hTl^k1`h06Id%4x5`PHBJ z;>(&}Jvo<KnCVDy--$i>qUXUSzOtyi^FF=;`}|VhS{yxDBCb~XQgZ9Ng&Pmfv97<e zZqb8{D>vO)#<O(EOXsR*K~gI}pS%?&e|{y;r=QIVKU><3R?JY;>^pUm?fZ>AN0d(_ zZSfOh-WvBj{`;@1uMPb_oOsFoamx9q4P~-(?@ByM=KRE&DPVqOw($A*!_O5ZTOLne zbUVOr@%$qbc|0Gm9CFQP|0El_vyR<N=F_?lcS7EXPbpJ3wb#|y@xx>3#Rca+@2;I` zldySB(Uaoy>VXRnO$myN%RTpbc|um`+{n6XH%0#1+%?^~O7G^96+eG5%==+3ESMv3 zY=@fcq6fQQu8@(q+;%<NH-}f&V7<Z3^8sRO&2pMenGddO;yy0@%OoMz%kbjSx*vBw z{%o#bSL*AEb``zYdB0p|r!|k5!H28wet6D#t6!rw;c?Nyhigur=c-?vs9yN&LIYpp zJdwz6nUQ8kg_Rb>TW^^#`Qfz4789AO<LoQdS*-R<*3Y|P$2+H8_C?!#>6<;S2X0z^ zd-8F*ga2#Sre7JgR~R?s3pVe}V2+UAUG$`J_sf#N)eOD&GM5{FuK51$)2E0XcNxlZ z*!N#I++fChV;{4`8w>6LvHAaHq^6zxvSOWGv08ibk2|u<*RAA`s^fBJIkki(c+=~C zzN!bBNjq(4zh7m-yf9I5wXbKMqLtSgLGPn|n;ys{`E75z;;`)Ami^jC{We;*83do) z-q-nl+HPx(btl)va<K=^%v$|lyQA@b<+dxI5B!_IXR`RxU78$SIa@7mhWyRn>~Q1H z<6|4Rr=RCuvB=PL`^-rXrz}nQvhmOH=_;P}zu*77KPhPEo9~MsJ}o?_{m8gC@{cj+ z#)Ec;*(LOwR9+;P%gH}xOl4HPsQ3GUw(c^KWV5zi*0vK`mTWq{I(o}FA=B$qlFtQt zW`6OUv+RP`@j3n%l<dqx*15E{)hf+<Rrl`49%-Hel|aSH+Y2rgAFF>ZZl5`^P%oy_ z_e(+QMpY&EMVA&e6ul4IQ2+OAq20H+|BtG0-?{Z(N%2u%>dY;drmXI)D_`{9Xu^a; z8<GT09aw)!(;#y4`}utVPcpB3kbj}4(>L49^7ECVg~4f(qQ7R=20vI8%KY!RM~%zV zxw9XfUR`qSit~r5@u!}x*<)p0D7(B;RpaYQ%?Ivgf3xcJb_fTatT><KQ^}IXmg;o- z*Va$%;b~JpG-b=(y!iRP;5=1HuV{szu{&&61o-ME{#HFHuNe_!X4Wq}f7Y_&7J0tQ zQcR3D8s1!UvRpTG+u@^M_U+lk#BEZu`-AdFy?26!FB`4rF4eS`{`-`Ff5vj>LYtb> z2GLCgFXtHu-Sqz|Di}LW`17UM&^sKG+vm*e;}6bt4V-lDv+Uli<D1r7T@?_XHY?@! zcZ){>kv~;8Rm}2``L=U<&yJdpcNN>q#h>1s>nvyEprOCH&*<j)Z-zlVlcX<+*z3k_ z&*w6Kez$b`XOCC&4sHE^EX`|6M$hhBv5&4Fp7*NmSeji2<Hnh1-|4O1WH}|_=E|)Z z&QYg$*N2GBInr|D=E0ktw#P5-NK)r_SN|4K>+$~Zxpz{XX;UX{JgxNlo5HU(eY4hG zSvRXM^1cC+>dm-sUUF}*?tVRI((BCY-N$wQlvW;??9lIfkv)d#|JlpO*5>%tJ`&w! z9lJ(yIj8N$<z?X_zc1&nl$oXUzC>x|G9|5!n<p=KR&q(bKEJIw^KgM}=aEA*&ezv^ zcFhafxN`SGxoGpfht4NdEIqx4-*|cUv&_5CGeu1FI>Y$9+fQ<dJ@#0wzbaU@_F#?R z|K&es7IxJx4c54C95+$p@Gp+o{zsn@uO|i^T(9uF;Wn>VQ6|^f75}cP{aVlU=IYb9 zH4QKI{{KA_?a!&r!twXZi<PQp4>;MLnko9&`oOyO9x0906FzFxo}WEwcGLCs`UTH^ z8_O;Y-CXvT#o}mM^&P(Yug-G(`u~srzm*rOn>vA=?fE@j`zsX%-_JxGu=7e4;?eqj zqldM6hn%TA+r7R1hpT(vXDToEdv?l~zhAqm=aj;XmHlzI9v^yHGOzyhkLB#A!X&OY z?%ESMhcn2^evxGn*Zs2Q<I9(>dsvyeCZ=$G*NO+>4U;XIm;Ni=d~#m>i2$>cOS7^} zO_iBb>(x91b7b4XC#wE)-M23?oVk0_EAyG=(I>oQ?lwG}trN97d<W;Ub$+qlYI^zH zXS!dP&Eqa#7U{I{67RYep^G0@-ad3@)81?M{`;J~Jncn)>eYEApWU}C;jmaW<MO$H z%{!+jmc<4f+IfEY%Gv+lF)ev;WBm!G*d~#9#jc2!mX=l9HWuuTl9Ca&-WE8IIkEi7 zoQzVYuJFdxbVZ%ttk(=bthQ)PKWO`=+VB0tIm;f{TRiyoU{gc3q4whNLq~V1e%vr= z#*)iouf<<VD^Jg;V%)Ru@5+OH#^I@V{?CtCeMWt?!JmzXPvlMiaqLm=v)+@zQ!jTP zjoPz`dvo3mLEA}RI?wnWUw28f;6kMQ&WK2s!^&1^(+_g3+glTzRbO&sQT`pDrDr+H zoMldb+7o_R{8D$vI`dVTUpyBH1z9Ve*~zaf*Sartr=9r0TC;8K`q7Ckos%CVs_uLF zT5qG6DD(3hNj7K0{vRz;d;cKg;qUcbyH?lAWOg4qlNTfAK55du3az=)dw%zJf3lL9 zrBi%-ZTJP(2>IOG_w$d&>Gty{FE2dx=l&`8h%=Jk+3S`*T5kAk+Z^@RN{6GLu{7nf zJ8iU8_-giW+oxzvu6^nL)~BqyqQwQ5zgVhgyma%*+O5pn`6}6aRc^YgY&mAR@b5z7 z(9?@Hx<ww!VeF4oEUvH-FcWagT#%Dq<auTB;kC>m57(>}y1HJMrLHC8kwpt<AIIO- zCm83|anIgpJ7fN|79&|>t8M93pLW=onA_OfFN^wEni*XBH)6uBW4Etta6FM-w!?T* zPut@_V*&NQT5R`q%_dg5r@e035!xDibcdaHmG^RMOBt>QsUeyYU9T2!dn`VEH{f8@ zI}d~2j>r2-wAb;}TE}+mJ@u`v`g`n4>r;;tcYge692IZ4(s#=;7t^-*x4#|MuQfHA zbVuxw`?t=nI^|uf4L83kpU8TZ+5f86L#?UH<svTJcbys98=J=+8N)d3m(9`#Q=Co< zru*mj7p-5PcPG}j{Nl3NKRnrrcb~f4X=c6CqAB?8y@OA>bvSx<Z*}*QnkCy3v#PYk z`wiQ#sTz{K>^)!hG`F6+|4sVK?7j{D!IR(5mAlBq>7}<?@?+8SnVjsbQ^U3F!rP5D ztS{htB0f*Uf+_I-M~_ARlPnwpK6=Ked7doQowmN`x1Q#n1B%8rx<NDM`#t__q2?hP zm~($cHh*Qj!P2!(=7nAnwTeM5N<W^yi0`@<&HOX5uRs2rx!J~Y>B32V-qZbSWIxs> z?Kobv^WH3N&xsEwTTGSknBw!g)98zLdzBuq(35MHMU@>)`sxW{2Rz(YKkrzcrOrHC zZSqgww|vi9T3im9ZMU9nJc&6cVZPCPp42Zj|I#0&$6l=u{mZ&^_kkl<p2-<*<TSZE z%_Au0tkIKa)6d`N(dIu;u<=#R-!}R4*PkWs4ZSlZ%K7cnEq7*`hH&iv!MOct_wulO z$sfNBP2Rdsx*5!tZtE>->9I%G`p(vx;0AZ5MClh>gq>CQy-O?S-cxbX>v&$n?8AXZ zvxNLhcdPE6$ru#!rRVIPpkUThbt}WRu5Ui!wg0f{>tlVtK5*^Vu3!>~G`pg``B3Z6 zt!+_`Wl<}5w?EzHza~G?>0a>pgyUP!tmI8#cX05uTEB4K)HciRjl9n$WzO-QwcuyM z;`?IZ>-ASI=>J~CEwrOrB~eGgOoRELdf^o9a_$WF%|=;snE!+Z&t}QwQsB(VVF)kC z-fDMcv5!x}-lnU?r#3DtU43_2?w0J2>+91`E`5D>r_J}TC;NFA-LFU=m|C6D9`SRr zUUSp@LyAnS&-Z0A>2CXzSvs%(_(!c3A1<Few|ACc>4^;w{-1e2_kD85f;`3tiwfT# z4dzXiwUbTdEl<im{Yy`{^wJ#e&snRUEP3(f<R3{zPeqrRh9~Dl9p8HL?_uuN&(nmD zPEU)jK6Js*@@C-DvlZngvC*c{M%%^K{y&mz`2O36CpGCCKQ{$iU!MBX+Fw`T-I<%m zj=SzlzGfP?@3>8^^-b2ihADYYXC2q(mbEImoIBg-JLRtsn{C6g#hiTccXTf%=P0-D zoptBiVomdaPtrSQy){_sJl)Gr&Th{|Bc@oU`{$Nkj9PX`Hiad<;^w(_Nt1X*W~Zge zn^iuRt+S0Y%AWd4p#7+ajmT6UAJeCMlTS_kGk0S{{QE<thPx-|&0`B+xBBMPlF}0# zl?*|u(k3j&Ry&kO9*=O3^tt`2^H|!vhdcG15~V~oxwu@k_uu^c`_Is;1ql+_85`%z zL>O3<3mC95l&PE#D$cyKTXR#M;PS+#t%X;!8DAZo`TL5|^6PWvoi(Xv3!QFbUzYac zVd?oJ=U;trex)p-d|=TlpQ}7~r|j8%*f`_MyoHQM)5JQ`kKQqLer(CV^2T-F$n%@a zEAMytUD&$Na_-vqw~lL8tvA#YbHACzKTp)p`%5HC+shxq`Ahd+iJQi^CjP?A_xiIo zDV0Va{MN2>EF}5-me1!lY$@^WITv&D)sq8lZ?`z@-tC+qeLUQ_VP@6$UY}pP{vY^% zJUnEV#3V1@tFMg&9wff;kciw;^N>R#cGX(>bgy`$rIx)5R`1?q!r{8aJ|iPLYi6En z$)U5%n(tP{x>lwx=-F`Ybmcaa$lMFFS63(8x%Bh8(e~^Pmp1vrR}agbD<$7_|8j{k z)_CLQ|AC|OyHJ_iv&tU^lMiU`QIit!o*80V`@wGZ#|6Tzrt?hVfB)cIq|T{&sI8!i zqfX`ElK$`V!lET+x2;4IU$|F%+Of0O&vNp&<{kI5x<u~GOWSnJ;_M$U>B2QG0?FPo zg-jk^uU6mnj>zI-I@Z;+rE2SWPx;0J=|#nD3JR$fvi+7qV!NIh?>ZglkRCPZ;QvMC zFYIistxOJ<{JX`YlX0W4#{3*ltgQIm+uzRZF=PsP_`+Fab-mr=(jO&aS7%LpbM;sC z;mzi!W#`}jAN}Kdt<4vf<gBi^Ip6Q?xAou*iz_&*wz~1j!~+TLRSWL<zvuRmJZR#^ zWcfJub+paLfDkK>&ntp-WrFjbyf<Mmc~|zs#KQ6J`QV*9S6Ae{vk@)xv^lD$vt^0I zM(rzJXC_<=yM84kJX+_S$uG@0r-H?vh>C5TZ*7+@E++a!vohq5$lPan8$(tfWcioX zZL%+AL2K)q@8VrAG!~y#y?)~2_gIf}5}NuxqG4;BiwjC`c<%R<(731eDpB7_fyp&A zbSrbJyC_r3C$7Zr6?*4Z{?fnP*PeH1z2I)g7T;t+2bN3gh1fK>pQo+6GsD^Atwq^X zJ1(Jhw@kJjZ8X{<ptQo*Ax4QcJ7MeM1an*EuBZJE%U<4IB@@4ETGBa>h8MXTuQUoa zytDdJqT_Vok6m0Y-+s#n+Bx@<HBEO}8^qofn!39_@yd)t_1Sk<s_Cjep2zpz>R-y{ zdF8$j!|MNt$jVtfTT|O<^6RH#OP%$XU!M-V+QdAej_bMH9M2<PUB3s$Y3$f~C`!&> z`T3rW*WFc8Hu5dH$|RA|p!Pzg@pII(_QV>ad1n@E__TxTl>bHBjm5V*n`5;3C!Ja~ zoxLq?zpwj(`SHq&YAetDWXP)iAMhc`Gt=tz&-ygi?Z+fCq-<)IrzAZt7W;hk$g)fC z_(g&)eh+`StW$i4=x%w1=`&>{C(d^D{daHivI7ChdzF6fPk*%1=~MTOuGDk3hd2Lx z)TVzoG(m&y(9ZkM&jqPQvM-u2_u&@lcpKKbl@f~QcRYN#ee0<c_gIAYPpEo(ifh}B z#P>|wQa|tC=lJpA%|&~wrH}AV=AL;n_G|3PGp&;=R?XeXB3@G2EELqf=;TF_FIGD~ zec5qN{~)jWwz_pk&%MovQO>)wJ3J(rL))O`I>+}$+x5>RJ1^-7n4dE&IP>yFTCxkX zTjnJvFHMbD_w=uG+!YoCZ9Q=`YJPF{w&U~dZYbngY`CKM^x_u@;i*5R*LL2Yaq#!% zn4fOy1z&C`ec=#~JrsB*UTFW7fP)F=I@Bz02$ghYPJXffly7>>@w+xrzgqG(FFIZ* z{ou^R8$A`7e}oQCcBygumGt^oa9;AptMBp-U)=mb&i|2$pR~l2^-bNCax(lo+xzuA zoOT{R_}1t_M@M7hwA{(YlfM4&JjD0o(Xth*FTXluRAa|lHm8_>xmE9uUT>b5X0KgQ z8=78)c`6BUS;cRwdNt$2jVVcgk2{K3dmjHX`Dq1Pe&tfPH2#AdwwB!D5LsIw^)xd= z%C$xR+|$d(p6ed>#XRJitv~bRjS{K(M_%6he&WXgfw-HAe~KO1n&uyqaDFoXc~V-x z`<k#=ubl^L1aHV*Uy;Qn^Du|gt$E7!uZw-$TF?BKJEUycTtC13pjO_JMn|`&el<er zag+AhX<wI5da(RO)cf5B9r?cOQ~$@ZKI;cd9q;z7XZ{|P_nuu-(kwH{`|E!HFoPM3 z8$yq+&sCJT7W`$kpYh4tKI-1b-Y;AgJWq6ufa@vcsOLMH4`(Dzp7%M)wC-V7gZzu% z29tWWZk2!G7an1=-9q{Ex--{q+V0KxWF39S%-!bd+co(K7O!WWsyMAyzvuRZ%%uJ; z#V^G@jDNrTpE;>!!n!k`+a23Ww=!N@)7zpyeII-JmOnq-XKeJ`w`eJA+T5;5>+alh zvk6|cr_$#|<eSJTb#i_y9&vE;R<Up^a46r|>9unHub<amO%dm-T%G;AY4snkkoS)& zq?cbYy!a?+(sA#M#0S+cV(y>0Z#p&F_J5+nr?uQaOL>0zx}UoC^Tol1Qv^IRjnBT0 zv+-~<UE1<@Rr%8LR%Ktt+P=r-_Y;NQ?no}a7q9Pp>d%_*zcxIWDw7p)wvpL-zN;#W z?<(O1PeQ_;6?~Yo<(JH_S(g^G*EN+{)$!^?SAVE!@;$TD_W8}L%jR#0t)G|qCTmXd zlvmfa`(ypeQq{kl^t`gcFKe2b^5v%4CY!=%CM`*7zdW&6iG9Ib3s077tfn~|_vAh~ zS(#?G?cN?k$yK*|U-#s--SyA2*>_Q@NO_U|BbUzskH2&jbY$EOdfNVW!wWN}g!(rD zIhB3pi~VF4mPfD9{?f`O@OayUFF!)tOsBAgt~+mH?YDiko|utsl3&Jp$CFKSn>g0Y zzRlLGw@f>5+f4U$;wR^LiuH1FUXZKYHs@~flZ`I9Q*Yaxo&4WQ=7ftz*Pd(vt1m`R zp32=2m-+nmsFkDP%d5W8E2?w89dOyJxAN7|=?9)GNK7cRD%N;>%hx^j<I$N0OK0`X ze`IlN`MvL4?X~)DFWVM)DC=lPcULN=h#Z)A;@=GMJ@QYQpMN^{tZM6uXA{3|S={ga z*YNBl|Dz{UCAoRuMe7_5I-fbemhHIEaiPye^8cewuXugN)XTm1DdPpzqpGG!wri3T z!VRjjd6a~vu^-Zs@tv^NFG^~D+^b2Ot{=>{Fgm~d?T7Sv{j;2uws0D+Q%dH1+_~i4 z#(&pOUgph8{o8VEmCJ(aZ~FTeTz`E<z(_~-%j%Mzw^MiAn-|dgz0g_JyE!P#w1>HP z>G_N*`<Rd`isdE(#$Hc7PhY%nYUcVwotD)nE?rvamHotf={1ou8TFknnB^Y_Ol&Pa z?_8&UII*(XJxOENW2MBapR`mKYu`ET$`(AWdX>)R_2$8|9?i-$-+gOo?cPm3-><Au zXJ<>F?b0qMpPyw@xM!Cf?;^dVJNr+?J$tj^_jd8y)9zcpxb}HvVsgr=Qn{kOSp}Ap z_ZOHR2>2~$-JX2h#kn`m(95)};_udT|AHBJ%@JDsx8H0c58I(ti&t{+-R?V<Dk)@p z_1+`fpVPlz**dS&uU4|&qw2+iR~?T9ulBvQW(zD`Eo^Y%Xi2lk-Gxbdo;UX;Ut*T7 zjXK%Ad-LLFY+=f)BL6;6T<J9{Bsy|SOQ-UR6W5qe#-<)Gn^OMoTB7ju^?KW18ch(5 zj?CD$>#EvG2XlVyM3bpYmY#82X|gvm{k6vYZohBRz32YDul`_kk6Uf+`9N#?yn`lc zag5J6e#d5<5nu7?7QefkJ=gqy%RZWR*8IL(6Wn`C<&gLRo@s8WeF7m5&SVx{jh@aQ z$hywYGbZ=KjGb?l78;7LHrTWF_ouBtGHqtKELBbY8vA;WLTF*gCFzVEZebd2ZE-c1 zza}zOUSx>B;ksp-bFRC>y&Vi<CmE)$Y6_`dXkB`CjUCq$$Cl;q&gGwPs@WSHbwG$G zJs@OPq@}Fn6qC7KhYoDKsQ#-#v>>c3eBP{f2f6o}7rX0f=cNRRR<3<{@!1>OcsGO2 zlhWF<5uKY_{F2%IJ{pM27CFAR{y9UDX|IN^;E}uYwPs!9e!lWsZJ8D;r&@I9<F7w_ zCn<5>*Ek!uIn|=#zaR4o?o$#v+NpO%gHBAS`}t_;%p(gz{4VzBm2R2*w$*Oh*RF5h z=ii#t!4`DGM`*djluNH{Si@vQzgARVY}a`Fd;PP0jy(@}CO`O)a^mdc(BRj4sX4Fa zEVkqC+IzQWN%^tkZ?C`Pls>e)>@~Ah-daCvtziDO8WHT%8%jMzUGk4!|Kl5Qv(h#^ zg|DCS+tfVi+1!_8Z)z8QGxm7%=g6Wa7W?!1rT^NqasnMauB{Ujyd5!X{)5M!C6U`Q zYJ~R2>AJ?mez>={D6w$K?up4y{6a5QHkq7}WSqV?SA13=@9f_!?Y>oKYZU7~Max9C zb7k_akBdAjwLE_P?Ro3-HKwa<zEv(AxA&({#cjs#j776MmoqFnS5)Y&qigW#{=d2H z`Ax@iJ@kZkJ5}6xYUyBAbkp6~H{fGvX@%|iI+ZQ)4m*FSGoPORRGQ86M5p5B$!{&b zv9{S)r2B<cY(KK7>BxmR0Sn>TOm@Zd<BxjruJij<@yF?Yv*Gqemybt}@VBOBoNQ+* z>gbF=+N|{cMN!*kjqV+@Ep+A?*$LYlZ}P93?|<r6nu}27?Ol_6*RyP@^3?5pvS}ON zRR2R-zi;!gb;rJKia$EjIqQqgFU_4(pT=_@y*D-V(oOBPg4<o^Z&==A%6D_A!?arl zF^@w|vDAHfvGn026VJ74<U$N0lqakyS-aPLgL&yA^_ORg{2nRZoNnCo!iBA<?r_<< z&wJ{{beqM!Lmtl63Nb9>=$gg9V#28>7d6&QJiUM3*`?*mN=8a@mff*OJ3Y>yW{Th1 zbyDi;$G`lZ4q@N)KDw`5zU}d*#a9LY`EQs!!?!0npxS1~nWVh%kIYi1+E=$^2f3K< zadOY!RxSOCqc!WbAkW>Ds#mc={->E1PCOR3l7A~R=ZS<ZYbNu|&2jKQx-RL7;rn-Y z|4Fi$E>zV}N}lc&RhyGoJE_xaR@C}T&-P<QtdTPV|4O+pezWAi{r81d%_*kGJ&vgw zDI~v8JHG$>ZLZL3fe)2^GQ=)id?)y!vZG_=vCaGZ(odOb+zvc0yV=;}`vmtV`B}_` zO@5PKsN9<PK4n8k(T>%EcZ=TG&wJSr`P5n1?8Kp~k*4;0{wO_pow<}{>XSv4`)(?W zKT(N@O}pT(C+@P=;Nw5*vI^Ir>pcZ#^<BmnzHh$E(<!(6ohq-b=AT`hhkt4OyIJ(1 z<V0D@Z(c{$3QbP)B_b=0G=AjCH1Am|ZQQVS@wumsA9E9apP%*B{+NnKeEIe>S*+m_ zR+cwIci!Hf8Z-Okf6c6IH9R%HE*8ZtoHgr}&R&tD{+BLZ&lbL>x_FiQ#m!D@>woAN zgnc}AYK7>OW-hP&t&biDS6W}z;TJ!>Tw}ib_R|6>vF1^;rIUYpooZk`c`|c%F!$og z)suSXp4a*EDE{)5FE<Z<{QO*P^Ndn1dHZkkAEnPReIsORaOwNk6U8QlfB(w7Nq=x) zE$7E5`^k+llio&uINm4Xx_1v_*~)F3K6-uK`Iqg%yxCDfZ)UE)lX}f-J>Pr2AD49E zS1i4x-g&Ac(CC$dNAQ$i@j5EJI}Y<(*vzc8$*yuzel23L!!t@tQ&e){*Scj*;`|F% zS1(Fy{muXMRKe{#lNPPD`1YpQ$U5@D)6VE>`4e|`EX|1%m>4(b(VuOlWhobGQp&4b zXBeMia%HrcH1ql7*Um@%AJ2&WRr*zMcYf>*fk^Q)&L3BP(P=Y3x5q_Oqc!D(`GzY~ zr|i6PXoEOs`^P<N1GYQv7j)V1@wn2f03KG&54s;GOBOt;mXX{3dgrRh1rdCb8YXAH zo%?nx-TK0X|JRTEp7gEWxP9$~Kf2{gvzdPHv1&Q6^rJH8CM}-zw?4Xht$O~azUA2G z9l?r|l)gJHvEmRCso_6&XWGZW=VH4IOPFTLUX<n4>h%1m5_HB{VUuoYcvW_|N?vmJ z@@?M1UVD^%CKP>PU%X;bllXqk1IiO;>(|L-<w;asUaM@V+4$}bC#z21M3#lIwdLQB z?O(pX-Fq6>DN{?nW4w>m53bbqIX3nD0oRq0S&jDpe)#-(^U->H#U+p9`wkf9UtZzV z;BwsZ`3qIgX^{fKpThecHcU`B5j9U*Dbca)#-&w1?HBOYzvQ}`yH(X@r`P^PEDMh< z3s|+y_~v=7)5o+ORO6P;a_pW^YkVWC)c(f#=dZt*yfN{MjgWR<ek6GN{p{5rOtTM& zvVA^v?yZ7_rNPm8+-{pJi+6XPVF@|DhhsvUZ?DqT;@4|c)JhNRFS)2Bx_`pVPEO7x zwQ=Qq%eVI1^IlrHxnYje)~%esDypj;eop>$oMTn#kH9_ZKdkKcKRCVSJVVNswv+!S zrm6*I3pTvAcQnf0q1|t+R9<4dJMzKK&%(>Uv+j_x{>SuZ4SUHxUal)Gn{|SFXYd`q z*y*d-@51(9N91)+TPBCsMuzgw-W3nG{L=h*rJJGoVneXOs~^=uT>DmEwD)CSTd^vr z(y#PK&|SgvDt=D`TUPL<n0f9HO7GizU~Tk#YrFNkD^4tP+Nq+{;Fqz<)Bhx2`L42~ za?zhGxp$ph!*V6c_fMW)+Yh$c%`4UY^=dj}m9MYPu(8|rndJ%hi>=<z8jpuRo*evW z<>@_d&c8~#ttxrK)$}^2P}U`d28phyBj1>>d23pvy>j-Fa9Z_nOUBA@O>?&+f0n!p zSvX_iuE{TdWL~{!bVkIX?DdMNFHDX1Z_ur(C_aCL*=L^rp6BPM{xLnpwkPygy_G;k zvugb}gC~g$hW51&{HtCG{bA!%dw!ZDF+y(^o6;61hvw$ZTQzSp9z6WH;P9CY0TYf{ zCJ)-D3tJvr`u4kzwv}!1G=<r@E8`md-m?jw+%I3nG08&BNGGvr`MD{bJ6MZr6^<)3 zY!S$8k+F_RdN^&WRL-o|pPoMd{P@DjJ8vpOUwxGEPXA^ibl>Xm?GW!u##3)2PdsHh zcyiU6ji$E6H#Q4c9I;+ewXJbRJ8RmNri_-;T*Z1f#2B^K%r#T?&+aeYFzv)SmF&|m zPAp-xSGF-e`DSKMmgm)SUy+X-wv%$Y>et%+4vRRE${rVyAh?C$74y0?IoEd=PMYZ( zWXR>f+j0Na-mQ=3FWr4Qd0$4c&f(k%Pd}%a{X4fW{z_d-;Qm(2e{qJ<Cvvym_gE-n zo7NvIxcS(+bxj80+>!A~<(G|Lhrd$I4B#^H@{^F$S$4kP^l|Q5_J49U{(|wh7|uW3 zdE0sC{XDK1Lw~_(f5pvyf8p`2mk+7_Ycb`^U!}g6$sQkVIih$D|CZb-=-6@P>!$8i zzE!mg)D$irS#m{Re#XwVo1cG8Fq|oNjd|O$c^{rh&%PS)c8klx5RZ2<q8syHb}e9( zE$#K)xMfDmy7GWSx{tox(w<%C)y(>Snl*!hVG#S-6vwsA99t)Lw6UH^f5me!dPjed z+eYCar*jJqy!v;*E2nSbX5Qnieb;Q~c&>PmRycX--umaA%dDnd|MxW1zqEDx&S{5M z9rxkqbDFk8u&ilf&*i6q@sqPeuQO>)IDIB3pvrR9%<ZB(&9x17Ev-K461&1t<g>`; zKRd6PtXsVMw{>UFwVb8q&y|;6&zs_{^s(&aCd;jHQfAlp`(!I7g{!Od$ni!BO!f^* ze6H{&AyWQM)s+?9q82-IZ)E;GB9S|5X+cGu$kOASe9xTrv>jS_kCB5z+;@V^L1E>Y z3z+n{xBJiS(LFEKU8Cr<IbHex_Gh&xrtv(COzL^Ee!aJ7dKTv`tCiQxq-QhTNlVK6 z(HME-uJ#;@l?R0mtTNd9@8|FLT_-NgSiisK@59!oPE&XLcDWc^tDU{E-PboX$+aX= z{Mg-ll2fJstu#tY+;PP1{H~g+S&O{R-g8QNc%ply&tH}uXFJ2Vbv}s9yS4Gjfp;%6 zQ#a2D|GnaEl;&2GG6Qx?;R{(MmahGb=Xla?YOM^t^3G+A!HKtd4-a*?^6mP0+LdFU z&t~IUXZG%k`C?T%ajD^v-Mg;xF#8qGT_=9OShVFa`=#vIFxgprmQC79jO}im2Q2p= zJLhA@c~pZhgW)&p?&==`y~;N=yWb?p<Stunp^^BdBwxVU;>6~Jw%h3y3@>Li#(nHE zH9Ej}$5g{c$0kb2^04OA1^Wu>cbC07Hs$OVk+_-*J5Ow5^1N|`Ev4?{9o2N>EiUf^ zM7mp?6ipiE#s@t-#>Fcj@^ydB=1Bg}p<*qm0W!*K--t}vv;44@qlpdo4#~Vj4sO#G zlJ2fKaX+B?bO%r1v~}#ycCUD@_@05W&!I19&Sbe>F&FcmfWoTJb1d#zuiw9G#?JJT z-;rl-^^`uH%;>i1>%%`1mV2ZQw8TvO5Rl~hO-AKG15=>%MaQCtr+Om$jo1H=icUWy zz5H;_o!1>Q({5Tye%oZi$0gV<WB7YQVYyP=kq^i8&K0UlEe~$t5K=aBJh8K9>kV_a zH>=IGPTUOK!am`W?n|2vjn<mQqRVdXO5`aM+nOqO@1L{F3%}m*U1sKa+nhCLJ@Uyu zpQ1DQOOif^9`lyxA9wHVU-<Iw<*gqxF1%Me>F`)qJ@I76hZFbawyyE<e;Ti<@0GGa zYMV*-NsW~fC!3cBe6yV!^T=}A!V?#s#f9}V9lwyQB3l3P#R`|52LAUMXU>}yylc8) z>VlRm(-~7aKJa`NjaEy`X<WEQe16K5Ox-Wp^1J8GYEb<6c5%{TyXQH(>QCD6b^Z^r z?_DN%>CwMtmdak1gNG(Bo3q!jZNr`hH}_wkH&17nvv<ztXA%!SN<9AZ&2yffWp7N! zVQ&wI{d%8YPPdwQ)>%CAi00=_(+`K8Jmt(BD&HY-Pgy1Xsdsb(+d6B;>PErEueZ#1 z6Z~@}y*l(~z5CQ?-g&1lTD*!m=Xz(^?b4i?o4*~`D2vxPnzkZl!RsZA>7}pYPA>Xz zD#B;i-(_BTZbB{>R|kr6@88`jt!+9Z_43;NYuSF}p8Cxh`*Q7Jxr%%9ZY#UK+R{}y z%jdnMc;&S@D?Gz(UVQa_dLqQj!MCTpbn2o)ey*AAN86swIB-g5Wx<2PiySZYuCHVG z_-Xh2d$m=&ub<nfGV4xgNz~R8;ZNVpxS$ffg8Oa5N;QV;yL@V@*V2tME5u*!lNP?X zu&;n)>czJzqVHroj&M|2J)W#C!R35-_CdFtn0q-(R=$r=C|2kB^;T)BeXX_in@2Wj z3HxqvoX;+pJn74l1#?rDi99mfw0%O1#iyhrm;2n`*VxN1Pxjq-rhLwpz|dBiYPqxP zUqAD_@Y2KMh?4*Orwe~PDSFE}y({<E@(`05Wz1a88pn%DeD%Alb6y`YyvFW!r03)o z&42~wp7N8rPg*A%MQ)vU{uxt^jHRGN!V9hcpK7cwEs5J5DZG=*JN<iJ?z}wR)z6<l za?DB3E1Oxrq$oLjWtN?9qVIhP%XSX+qVyi7m6x<$Zq5i;x@=dBmYKUa=WI6><1E2t z@r@y0<vZO4i@WEzn?KTg@X)4q({`!tr){MzXRMfO)huK;QQCBcq4U;<6|3h@>^&h= z{JnLTj>GbMe|9fC>2&_ej&SqWN7uxOTDBcBJijYXCqL36{H^na5}D(@XZdZvrZ{Y} z^*m+m`O))8<{pC;=4LEMM3UIQ8_&CaI-oOn(j!LKmOpn+oa=qtdUKnkhp^nMPl*X~ zuQa!XH>fO{%liIT!j_!Fg%@45C!O09>Q|KV=`FwgzRxSBM18RF7JPU%bMr;73BKE1 zlq0S^x~Q$L+B3t}z1~cqY6;t3F6X{!yTw_*#U?jbXK8z7mPqB*F3}a@w%Et&oLUfg z{P4ML(J!64yPJ=6X#9G<o@0)E<lz(2$1K)eH{CdK#>xeEcqRVW2o_{p#INjl{ke^0 zjf!IH<n=c^R(iEh=5TD-_?0y`xhUnE#Sz789KZFyv(%|XY*XQr^<KBSrF4^?S*y!O ze?AxKQ@Rshc~28^sE~8nK22X`4R7!6q^uOd<9P+X0cYE9HC&HbAzHfDFN5n!TS?g= zjm2+H-|4!#;qA#Y?mbqVCI7ClcgQ`sC3J~rL9g=JWRvNaza22!tE$Vn_F8iLgH|CX zMbm3JPQ?*&&DE=?G3`C`^rzr-@1ELg@%!IiPd*tt@o#slLi6IpxYakK(~hj!|1M_@ z@9UN;x0OOqnaE~`?mh1)<oi2jzH>#H(g9A<F0JxvuD5?Y6)xFo>-<y~Guj{eInpXl zeQF~g=P!=;oF#rH3)k931hc3w$z8GNoyoKcf%<ui(w1ZdT7SE7zdZQErt^F2mMnOf zud*qs_vxW1)l;t)F6H!_@Z4^vAnUTGp5<9WisAmk!t?LstM1c#c3yJp?1|YQIsThw ztAtAWwMi9T72SE_-p<Ij?ZVwtpTrBt?zvFSP|sG?H{sj8-G6tj`#w)3#mF?i`u~M* zujU;vnyLPF?lZABl3VZ2Qz~vwv=-R;b47x8rFleb!o=kb549KdZ@(j(d2#09ha0k) zyr(7Zw0nQ#VaY`f5si7vToZ0a9t_iGJ->Csx|6)TTk;K3;-{F(O3yCZ%jtgWU|pBO z|5r)pv{Vb)+G=tbmz(!UJyqNDJLKQV4_?<*4jyOgT+3l=86Z@+fmubpxABvI(S`f_ z<thc=uhQi?RKGW(Yp2tNmpP^;7vARWoY4LBdCl#YvR`vfB)iU@c2law`{pr$@+V?# zF&!5kXl=QE+{XDR^UbyFNpBq(Kb~-r(@e;jbKN;|V`)IQjilBVY3&&Q>mq-SNBx%E zR(5l~<?}4I-}5)6<{e+X^KqU~&ezD4>bqxN6!$c3R(w^wUHgNXz@GTtHpSNO>Mey0 z0za<LESKpJy7c5;Prxs(CpV%eJY1n{?vPgW&)oHZgm>^8Z2{r4Mf!3-S(>!@XBaMu z3Gh0<HLBHM6NlaNZi#4#hl{2jzQb>Eur-<Q$Er`t6|N8NU0xWr-bkd+&3rzq#< zY%}{4^Vt>GeiV7EqP5y2dh4}}**njkGLz_Wm3kECe2!&$%HFjR&Bsn0RxMa_yR2Z1 z7mM<hr{R?srmFw_TCr^Qsl8eyO1Dp|FuvO#b~|5US@?F2>{$E43qPAO&GXelMZetD z+tqtQRDG>dFDtjydE0d5edSh9Zoc{K)5TY_==|Zb1&f={l=Iy9t+}|_?)K)B3yyxd zIjfI*W^lTa(W05nEole(q}J>$OA9ytHCwG&zU(BU?`LD%@~U<B{CBT9`QPyQ{Y9sg zuPeyz?D8_2cdTDu>C`Hr`?hRME3dN8yS)05&|iBaP5mVo*E9D^Cx*?9T5)a9@9EDh z_!z&uaCEP%%w9LGZ>B?BHP5}@3NvyWtDhX!dBPT%eNj6)@<z*pqE&ZfFY+vy<D14| z|30D5lBuoA{!$M2T;1X~`x<Up+OJd7n>gnKpTo}<?U>ombH&g94AcIf_)Sr$aGC#3 zj;P|f`Q5?{41azGRAsVtL~w;XOl)j>#karp(}yVQ`xde#hu>^?m3r1XYP;^Hc#hj5 z`*d?sx{rEaI*`25F=nOymzL*qo!A)9GCb^7-gNS1%XS8vQ~Jvff6nSIl=O}earR!g zh4u87X}b2@JNHVtOnW)=T|{HjmUkT9Yaeo+=r7oJM!+-5a;w>;Z6{>-qqlH*Yp&Ag z50{B56gi#qhV8ST(dug!+I6RVXKrmeDVl4f6xzRHMG=3g<J*F?T^aj>r~6c;NL&AP zk+}6&uxkC9KcA*LR{T9XtxMq0wS*5Vp08Xgu>QAL;<c>37N;Kyc1KMueyF=l?domW zh85dm%Ttu9dRaWDehc2}_vYHi#`dqex@W}wYPW7koyq;MUVD+<rRspd(kLYk1Em@! znFkDCS~?V>j-PXtPClU;dwQ*!?TbT-vm28Y)}1}BV8JKvyzu*b39ZN#$1ij&j_K0s zPYjRT@_xGW<=IE0qbzSrNK4(k_%Y~Q+|wr3RQ;y^=fXawa5A3_I~*sl@nzh_oTXc0 zjm$r;etz(Py^rhSmfLB{(>I95`YkHTe5a$X;k0g@`Mt0MkGJu@J?kaC<f+zu&TnZa zOtozqHpxcnG+a8gH&W-!x~hF2_vOB1<@A_4d6vdJ=Q?SZ&x^Ls_mbmPnJ+yvq*-0A z|G%%%p2xB0^J=6@W^P%xb^hnW8$KIauIrY*@1|Y8Kv%W&>*a9usVVy$j%+-7qvzmT z_hZ|3ZCe}0_9jBOBk{nSUtQW0yYt`P%<WsvvZGJvx<OITp6QukQd@tV*0neix_@3L zSFlHZ;%n8pLF~tm>$;vw>w2}~L(p!az=<y$)eN#c(yK+^9C))eDC=CDAnzS#Ma%Bb z%J;Q-HRT;IH_FssarfQuwxH(lj=gHj7d$!HZ7#p>&kt^a8%h5jOZoUJyR0yHsN~Wm zr0bR?u;CPwy))Mj`5#eSZHuyYB}Q#~TxB=aE!`kdZ1&-&A6Zv9O^jHyY~8|@s#8yH zEiL)_MU<`0?U>rNHM3_um0so>z3uIdP^Se37EGN^$s2agc_Jz@bxLSK1yf+CZ>)2$ zceH!B|9qEa0hwT3%hH~SO$)nbwyo?NU!UK(d%qtn_P6`}X!Yjq)w6fEFQ2}hpMitP z8D^S=O{0fW@Cp;F=95XqJ8bqjXb5>PG1{p#H)!d#jMA#+iz(Y8cEW|7Rt9BnvD$ku z!zh~LQWo>4ib>m!-eBjnSB|_jr#g@ASJ~s4t29sV)H#2K<5r`n!@nB`Ikwy1j6LcS z`KSGXdal{&$N4d4xy#n?F-y1Xf1(x5$)TOQDU?BT@~LO5IE7E`nBXNnd$s4(m94r~ zY6pUU{^l$B9-Ujhk5_w2{ICD1ulL1F6gxa~TH=9LWuHCXfA<OA-4pxqlj%FLmqA~4 zK41#WEdDBxc<R#9Q#&r0g|i7Hp4zf;XHi3p$JEsfD|^m{GCgt1N}hhWQt<GR$3c6) zo0jhUUDRl7ouBNam7BAUP2o_Bk=~L`JEIz=6e>==H|yMAmip=6?B{(^T=Ma=S^i}= zwcdYG_g-y%e_DFpiPM)ue=+vd*C$Qf{jhGUy}sBiE$`TrsM)qb73FPbq(91~?l`@D zPmb8jo%U{$;z3KR7j(qc>~=YNr1?u)Ri@QR^+W7h26|gI?sNj#_J4J#<SW~M^^+$3 z%T=hoxZ3`o){9DBj!#cMuR7&aR%+n0-|(}0pw^{l7m`~42Cj<<{JqQN|DPMhfBx%C q-n?tg8^gLbg_{%a&OD#d{-r3qRE+DV?H}pM@v767&XZ<fU;qF`=T5Nz literal 32944 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 Xax%AP1U)_>7;68*zHs)-b-D}yyMe+B 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 zcmew|jd4dsJp&^H0|OsJ0|PTdf`72Sky~RCHv@xK3<Cp0LUL|m0Yf*V4g-VM9tH*m zm*lb%1%}I9a~T-SRTvl;w9*RFb8m>;{=mSX&A`CGJv}|KxPXCyL4bk5#(;r=fg?Sq zGR^ALaX|(KhBpih8fF=(i78TRr|UB?XtppgFqmazq}C^LTxMR+z@TNpz`&rAky}y` zag#ZZfk6{wVNFhca$<M=l#dJynl20s3=X-86$OmeJXQ=0nji-#<R#{&CMMS0WneH5 zU|?V=E66V{u{^ceo`J#o1Oo#@MnO?(L0`v%V+;&tGZ+{cx)_)kj2IXgPB4iwFf*_- zaBO9p_)m88T5b*vZU%5b$TJi(FiqAnQH;IMxRptV={0j7OFL^4TPwQ``+1HYPERgI zu8rK*+#h+~@;>I9&u=FnA<!r2D5NZOO+;Em8f*q51H+4BIXC0^ZN4&aGrwS9U|_hd zzw$DS{{QrU%;X~`3X^$Eb2va6m_7c-Oztt2W|e1PViupg#?&r~VF9zke+z~vW)FrX z3JeVWam*myOzRjJ7!*KS7?>Cs7(iko49sA@2m=cPILH||z;X%<Q49<I{|Bpg1hM`< z{(ty?9RuU$6!U1FdQOHSkVY0x1_p*jV51mWI2jljlo%F4#hDm57>+>M%nUvZXP|5r z1|3ETD4Uf*iqQqiW<wI^Wh!EfgNpMpm@r>paAwG7C}5~$C}PNDNN32Hyw5{$^INwk p%!~|^FL)_($}@mMpNWBaGM~4Z0DEa(rh$Q@0Rtlg<NyB*`~Ya+lbiqm delta 4611 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 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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 Pjt>ls42=K(Gw=fdD*=uI delta 10179 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 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 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 Nflss2Gm04)7y#?F{_+3- 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 zcmew}k#SE+Jp&^H0|OsJ0|PTdf`72Sk*jUyL<R<p00stzgyh`B0)}oz9R>!C4Gatn zF3Dvj3JkSep$rVB5)2FsT4@F8xi>^^e_&wH_`<-zJv}|KxPXCyL4bk5%7lS|fg?Sq zGEFjNqZ9)J!y5($HJyyq#1zSk(}fur)GHVm7|b#<QtK1hk1{JUFlgv7FfgcO<d#(U zPG@?@z@QGYuqG!zIk9<n&ld&;bqfXt28Z0liUP(^9(x7`b&vxT@)C1Xlk^+%7#K`l z7#LVO3i69fEKhB=XJD{A!@$6hQBagx(AV+c7z2Yz4+8^37XuT65d#Cm2_{hnW(IZ! zj;(AH|H*Dv=KiP32?_>zh7ty*$<quKW4|-LWQu3H#azWw#VW}r&9;|4l0%7O4`(Bn z64x?rQ|`Y!cX(^~WclU!X9{==Dhoak784c&2PGo|L)f*8_v86(zA|t#zhGcsV7RTn z@(PUp|LA|=WCJ6G$rVO98XyhKqW=pSqF6TmfAsGGOCd-Eq!f<j8JL(hOqMXVi(**7 ztnlB0A&Oa)p<jW4p+Alpq=;!X0|SEsSQ`@q0|Q7*gn=2%7hzywFaSjZ0|x_0PJtnc zVZs0ZVD*k5*8j)<5C5-YVBCDcB$_9mlc5Ntk%g0ifngEYC`J}e21W)YhDA_uCI&u+ zBTzOoLlDCyD4T`Bh*1T~W@V6K41==Ski>bJiWm!^;(QDy%#SuZx`?w(j`UFAlxJXI fU}RuoV4gh9!%Tp^G%wS@z|nw#k%965e+GU4(pZoq 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 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 C(rA_d 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 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 D85;SE literal 10240 zcmXT-cQayOWME)m&|qNT1JRxm3=HbaAz~mtDrQSyXiDPH;+!rn$iel{=CT8$8IuZg zqXBmm1B(J{pFVq|6i*|U^l=B)I}*DRA2aYXe{JYEb<w=*fBx}a!vl`1t8b)ux%ek< zP!dbi*t?s5(!uPl33+?_AI`d&vn_LjV6FVC$fc~;a|>m~^>-)k%B)fH*evV9B3AkD z%DoE@FMMBY_=siqmhAl&PRaA1@O@bR&HtnKr$gf3mpU$7;3I14v@kUCa@kWZKG`cf zn@b;@c>L}d^OpbbfBk=5v-dma36G7eDc(kpexLd0m}6=1#<F@kt8kok{?mnZYxeH{ z{eG6x(#RJ)q009pgq%+<@e;~^>BOABq5j#H>$ex*3*9z}Y1PK)<p*@4tta#MTz}%# z9q@=%>3Gxs`rQAU7qR#kA9BrM+o<3CR8os`R%O_g{Th)kSIs@R_W$2H>yBHSzMq~u zVWXw~;%{F{G$vl#@V_WC^y|XtF4LJh2JD{m7^I%K>Moe46W{;)@tpf<*0-bkL^cLJ zZ)mYej=FtA{Kln1MdkzjQ_R>u_~)G}I9a*s?u_TzKJ)(GXPO!sdP43{>1zgFSAh+4 z7L}=gX#80fWy~77_U307y)5l%t;`Ok*)i)v&Ym)^cK>JZ>TZ=*x2ov<mFJ6!FE?;A zHCs>cXQ;_^c);wT^+>q+%akWe9w?kLELTij`k_(YsX#pW?V_UB>k0#RW!>Gad3X1V ztl2-K<2^TZ_-U>@bl*1ikM94T<Yy6@A(O8-9pCo-H%~_TPtVw6-?-y=8M-{A-I*?g z?qOt@X1mwK;(C_A2b0e^3_mzO|K&HcC<zl`J=3whDfH&5;0KC~5s}+@85kU{dp9t+ zJ>0DInv21qw=0*yk=?D6W15!x*17gq74;@u*jVxH`2HW8tJc4}64Aq8b)LQ5p+CdO zA-AVmgJJ%viHtKp-RI+9nc#cF{~r5a-ppNzQQMgH#j9-?BBm^S5mmTwA1~vB%iBZp zn7Ar>Cac)~W#``R|M0!N>#p59)>p1A`pDGzZ+}McHJzMyd)VU`Z&onOD9UhHH0?E; zlkU;_gv-kh9_>-<J~{jR#o6Vll}A4Mez_2?-uCv;!|Wj0*>9%r;9TjwVv+B?Ieh<9 zGuD3Ex1Vul>fF`BJO0f4ws8H^5(~aFvojssB3+ry46e9rxTw#%Jo1JN|A&x8pY0k` znY}+h+qx!3)<otS<NfwkEw-G-UvBbF==$|N(fInaiUZ588}2XqJ6lBes>+L6nH`&b zgYE}2yR*bfB^+@+pxspJ!;n?&u{Z5n&)ElUyi7~8ja|Fz*IbQKW7WNUqC#%|FJViL z&C5J@yr|_1%H~n}6vTOE+FM?;O=?G1Y-u^&5bH60!8<3%RqVpo`onjrc8SPtp6;+) zoMU0Eysd`uV%IO{YIeO?88~BVkBH4WUo#hrEFtMCCDoErTa`nxPx@LuOD_^JJa2Nz z{@Sdhkh|$xtM7y>r6$OWKE7POanoCixp_9LHZ!ZP3*Xo0fB)XAbN%z49N`R$xKgbu zWyZYP!9;y`jL^cicOE+gcO*7-wuZ}RZQ$I!=lZM8h1=71DnC+V<Yay1oTjuyGEw@} z*2WuO4;J3wDm!s(LBnRo#@~&T@2rr}yyv<|&cu;(xl7pwo>SIKf5}GQ+QPb<>*>Gx zB&E-4yMtFM9_3m+UFy=B8%}LPCxY0DrnK5TUEolu5ya>f(jpylYE6*tkCXGH{#4lf zsCAyc({Vbls%Vizh)ts#=Zh(f&6^T}_;gM+`?40S;Lw{Ya^HzvmBn&q#L9_kH7#6f zg5MXf3!KX`GeKj$XY(bWk|k^IZ%iutyL{%k<(Ai6R#x9xV7Nx+n)=7AO~%)nmj4ZW zX;ykV<J!u7(qh?>3D*|>Jt&g%r)m2Ab3f+2y<&Dv->hV%pYdW}2Z6TlE02GRxPC$0 zqbbV7RBnUNZHvWWItL!_{#ICN|M~J;(dX+d*7dY6<X<Dd?}mZO21e=47M~VREXfRg zrB|97Q8F(uCigYhwZkFach3Jh_QmX<iu-MMy^_n{{J4B}I85m>bl?24WcnJRu5>f5 z>3{kaPkA>7?w{kcNKS0=pDWMKOnv3s<ZJe}e2!ukS7-N%S9zQD1RvY9-ks3EB3^sp zSp>J)&ZTX7`%WaT%U&4ZDcw`ML9xJcdV|5*+n!Zw!3tFqOpcmPG_sQwc{?E?my3U6 zX!^aEpLC}?ZhBs7w`I|BQ;VMP-Gw?A58KZ8`9@N4x_rgGCAYVPxLuih`HEAz-+dQb z<E>l!wtAl|?Ebv>Rm-`|`bV4BPe`10w`OWjQDFbB2|ITi*`yv^we+4qbhq)OCk`b( za|P~Be6?nC*X3MUrceHc-HuzBBA>0C`_{t0YNvnOC*Jud6fT@C%J02!qwQ&m_NIA@ zjxpR^A#>{2uEX7%Vs{_r+Hv`1V9|6Qy$#pJb9{W(E<3v7fYCR}DOT0yk?b-DjydsZ zJ~+|u)~ESEg~3d5xk$k?cjf0I1%eFK9(tM&PW8J@6Dg2oke)bOq~LVFTVC*ixePa^ z+*#UCU1w4>pGl7808^z0WB;FwCx)(Pg^j+M)&H7$uI7V{GIvGZfnyT`Dg<YrX`FtK zbI&KgEAoCVhx#|Z6#nyM?xFMdH2*xBduaXRv=6h(+4fhbf4F5G{ff8VD_Qye!e1QI z1*~UW4riabw7X5jAwt;UO1J&Y^+EhE8IIXCR6b5+<2mrp^@c#sq9v(3X%pW~d#>%5 zz>@a<OWy_2*V#8t`>4dT*(-ORJ})A&@wac)yv18q?Y*<okkwjSrg7G?RewIs@yvba z_vGmTV-KDsa~QJ|OrGgDvSwVjE6aLm6gulwV#jkv&D7}HFH@ghKEALgw(?a|>6LRA z+zuIaOw6C9G%3XKPX1NK)e%dZ4K&VsDDQP&y!q(iQ-=FC6nyMyF!p5oSHGiACp;x? zg{jD9iAmMVcvVXBckFr;?%<Hx{7{(tqpEnka#+jH`-==+qfISY*Q$9n2dG_>`5fS^ zP<<%grnN{_^h-g<ygdqwWHY5!P7&NWiznubYCxs#gRX9ai6`b%+!X3-ICg%f$f-MD z7g-+82$^9dbb!ZuqxXW|J^rdZ#j)Bye|B$G;7N9hF6N!HYDM7M2gaFN3<63ri~DCk zX3@;=bC!ylwcxI9;N=U(O6`uFd;L^(j@{C~uvUC)Y!H`dx)}4PFE^B9SJ&Ly8nz;P zKEvY||2-U3`?9S*NiR)2uKvmR`~|<iCIJH4>bbXODW6I35$tt-y#3GSB(Gg8#Vffq zbXKkX_CRX+Oh>`=5AS6C(zY00oIEdXbxxLXgTLsMfCbgIeP@<_PI$6~;pq<-%R>8w z;#ZjrJ|B#ZU=F>qc>39rJ9heyT&^AMW?^2%P<T~t${FrwiTBrvR{fOrSNJ96_f+^P zNByIkX66J-v4ESG)O&(<be3In2;Fw;o?E+du$a8|T06Uj1P%X1?*+Ug@<M$0<V-vy zcQvTBJ9ewvtdfZe&^s~9^VQnCHj%5Z^ON-}?Y$!s)jqM=i$2)!%<#IO?5Y1}uT4<? zwzNkpa!nwQ-m%7*wOf)TGX&&>4_$Du5-r_zRQu736}LRD-}AU!F-7&$6n)!OmZy$# zZ`tVLzdm%v-ffY7_kV7P-}qW))w&zakIE;pe0VuyT8-n8{>iuXMAqp1^vw(m5{%p; z6rRL4q0x19NXNOpRmqb=B@3hvy%sxl)zERFzdipX9=*EUYD3Y$EE~7<HlYpk8(-P3 z{ZLt=de3RCBdgl8a|M%x*Ist?F}P_U@Ucm1!FpY#CDk1Zto~IizT&X$>0ib#WFdKY z!&j5Zg{I8s4Wym;ITVl0b$0rbxXt@=!cO;JybhtuH{Q%UR-Lzb;)2TCr{8@%{QvUb zuBhLl6^bP*tgR}<<{n@1(rkH;JX_1kTLzs9{x?gxr(~@?W-D>nJJIRKHj}=5>!mYI zpZL!C{b_pgP6G!!y}6qVo;}-McytqQsA(&+C(~V>1BZB?Jv}}{Sz{~HM@x}&?+o%) zjoORtRjYcI+v*2cZHfD|DfyOBmhsc}S;hqu9(_&o$?CO#@HSveQN-hbyWzXy%9W+= zTRP8Ya$38`vG}0sIgxdb4HwvP>2XOIRQS4UZL>OK&wgRHl=XeDNqH+SZ~n+`vuc4B zzeTCGh{(%JbF_1uR$lwu@yp3GA;v>1u3$@;Vw}@-@tbF-hFBhXzvArdh4;!Y+5D`Z z)y4aVuTo+Etn_HkU#{ySrU|9bH7VN@8xSPTr;*<G-8)IYCiD041a4Kyi)_ZHh4eqT z)rHU5WuOvqX`PT{WxH?YG!vz>GdJ%G-NpQ*`PkN$DSQT%7eCvxZtkkA@A#1N;X_nr z^Nf_v;0df2#ep5F;u2e0<rNJjH%{mGnzv%wtD7z|^*r|F5fLk`n$KT$cwV|zWfGTr zp634UYkhrNEq@D5mSg-g&#x);{kux9T)WzB6+Bs!0*&AHPOezt`}{~_c@#gV%f+qM zDp!jW=C1zSBDVWew&~TSS|UgCta&epC0to+DiE0_?!((s-6&@-Y`$lg@i(VW``L;P z3fZm?o$*J$TUcCZH|LzR)ep}oZ}sx}EwxIxUpRK-mUa31FLo_$e8?m2{4!hoU;oC( z?F-Y-9H<Xb$(iwC=UnfS>JyQZPkX6snsgw-_#<a;zTVj>(hH{-GtX|x67<gSI^w*T zadCCfl{M}Cx6U7Wc4+ZG!DBAlO0~2nOI*FRV$aD_mDwELE6@FtPhP|u5dQg5SJaWl z*PleW#eLT7e&4Xo+s`QW?U7Z}p4t4b*U4o6e`)(g0iUF8#jnKT?!L;nQnfHU$?ewW zhgZ$?N^d+~W*~XAzS8n&)0?Woqp6N%&qP*Tk6NnH|9{uBT|WOpDlRDo7Tf!`PRZ$M z*c|b0V~NR`0_AfFs-cB9R_48a=zhbpZ?*9^rtROArtfIYyB@Wbo4e1{X8p#sQv@&l zIe1`N)Xv<Et5*G;x%jq&;&oAmOIw}xW#1RLC+QXJB*gCix@uab?IVWUbAG(wH(Ys9 zrewuNwmo6N4p;g7*WAmhliq*6+&pQDV$L5gISoBmIfD(HYf3#8&-iB)f752XI!k>1 z&Mm3+-@L>0LIf8_eUK^M7h|HK!x$TO_WX_~3XwZvpBp*s*Nk5f&N+Mghjf`mt==uJ z8}*LfnfCc857YUmzblg$zTjq5n_ZPGcCGEjy6y2REzhVv<?szos67{ZJ#UNt&y@1) zP=;?2LB}MYdJ8y-e3w4O&AlmB_0UA`9}$K--nJI)jS8NnyI{}4tySK$s}@Kmeto2{ zD_rrjUfT}c)|m3O?H_-duHE!JTq!iY;mYd&1#9#_b}QZdvP@j^ZjMf_*^DUhE@?65 zD`|6I^a(vp<L38Lk=XL<%lvIN{qY>vxTU_f1+%@<pI)_$hqw0ox!w0m&HL=?7kFBk zrk3#-@o7qY-o<RP{hZd8bJvb(oZqrn%iBr#RG9S6MIZm2Sy;-E`QT8cUz&trH=9L- zTJv>=s#lJ3%EFI%I?i~^XS=g)>s4N_S;j_xmu<80&n&-}EEKMA;i=~A)!Rjm&p-St z>hnU)y$Wk{m#v%98MS4SrObvmcP>3QaNs-k%z=GZe9d$3%dAGalKvLc%vkev>Vh4) zBY8Sm9@iM}seU`l<mU?2S)Why$@*QGW@wRk#7FJK>v^m0wjI-&T=HRo#QY0?wbRsl zZx#zFmUTXK-puyr;KGRRMBW<>VHX;>TYk*l6=eNb{GY=*`y~@MAAW8=^`u}L^W8fO zHWxTtJ#_Ke=Ni8L@=Jn+E@5$|T9tb?trc}kU2`cSabx46xi-Al7bwk=TrD%%(Jk__ zxz%3X?MsTA^Q(pGE;|(-z3p^K_489k_jmm-r9&0hmU7Kjejq!6`Ff9!5u0+0@2kGo z@&RX@Gh&vlugbd>|G@QUP0aGOr%Lu{oc;axMEf$E#FA;dP5kTPl&YfkEZUeEIH^!# zPoi02;qB}_i|5^U+2eorj7s;)H23!M>AE{js>Qa(76rB37kuPzR-4wAsV15J@TL6s zgSp9f1pM}Aby%G~zvhF6aNJh=!rOB*0#`rhFLCYG&~J8|G_%D_S?BhX-pf5+OBY`g z4V3Q6JRPEEnqM39sLF+9y>?`+zWyIumObHn7&m;A^*1k&QP!2o4_xv>v2*qv`}c27 z^Se)xDU#`$slHE-lg;YT`GSR&YL=P*%&qhJ*FMgQO)m=C+oqC~a%0||?Q!j8-aCI- zZPr_<w*JP#?%z*J!(Tc3*4t|uecP{8<`=0@8_<4V^nrig<&)fgDz_$`$=$3uwbM-g z+k@TxOGGP8?@yQSUbXNy$4k2>OGD2ryB;R7d`H>78P{it8>Dv3zf-x{Vd{rh9EacZ zB&+-@UZMEzME}{|InCetQ{xR@Zv3;9X_noK+}nQwpBGQ?dKe&36DHNSar%3=?MnY{ zd+g@@#PR*;21BtqU%wqnc4gZ4X?2gK{MACoihD5+7JWRqL^5*Kr55`KxtFH?**lGO zY4;rNvJVH0v-R#=ooXmK=e+zr(_4=x%l^`sc<5Eh+@r=pJa$}D!WKvVcAUQK)62X3 zA{v|YmU89$SnF3#UE`1tQS-%8{Apd7)J4~4hgK`_sBVrbs3?s6%;UGcV$+5B2Nrfe zFW)Qgv#ZE5N&8&q%}(p@UrZKkG?IVLxo&oQ@Vp!&_8>Q|K%E1-Kdzd2<nFgW2D2T_ zU#^vQ)_eW@-kMgmGmGv91jlc=kfz?AG2;TasDk0zsOMk9#s0blZmRgb%-&@4hn<(U zoQ}&q7LZkadC7+>3ywe7{iWIWuc3IWP(tHh7jNmvx_F6~PsDuA$#=?jM{Zh@y5{GE z51+XXtj||5{%5Ll>vH(_$sAq{jK9x{Rx_Vr^p9DuFO_lnla};Mf!U$r)tBpEHl}f` z@{fH!eQhyU(EM#|kKVNXw-oywn=(To^ho)JC4Z0qdzQfC^;$!F=@P4BWxmU-tv;>f zSo;6Nlad#`3!Fm#IZSzV`Xqn)kMa{gC7OS=AKbR~NW4g4O7<SlUfXSfTUNFokm&fn zzhDm66qT8>r}!J*@p4WIKO!-EA6F)$+TjN}>*C{z`I?vc$1@!7f4}5&z~#u^$49>T zMQ<`w;qWsF&S;-6Zk!`G??<uJq{P7KBKs%(T9p!P`eeof?a$8VRs?IuEaypkZ}z=A zf@jwby~O0M>-R3}M$12MyjRh9qP)%^;JaLLP@%zOjfs=ink_f%DcW)Fy7;!GF;jSD zEbKJ)FZIrmSW|K+Br|R6-+0s6=XU&lu!lt{Il78_Pr}B0<(RzC`ZLZqtMA82ueoUd zBBf|WTG;k2EHYAg4|lK4_p$${bujrr_oguQysLUk&4YgOM66x7s+(VaTXe)0+qHMy ztnF>IJN;&_iWB87XN=XIloeW=_H%E03=iv8_rt5A&Sn_1EL(Mc`DcY+*_I!_@8%Bm zc3O4i&FRONt=s?CKH0XNv5G<A-Q7PoPPuv(?si(X<V#!a0oSb)5ACS^;6IQ339l-z zrZ|^Y@zbkQwTw3_vdmu_Wh`P*bNNJaz@|d~;yaB|5=LwcXWL3sT#Qey?X=PVV{%LJ z_4KcGs`|IB-k8-@rSPZ~Rx>%>d%U1-?HZl5wEF=EtE<~&*ppc$8%55hw=8`BaCw!Q z%CXi;yXbw-_U11UZ7P5KeR|E0`^Ol~FPM0)SoLMnnnwPoe-iu?o09XlG%b4Hb?JT- zYvP(2TyC3}s1~~4ve_yB=G*6+8k=q!m={jYQj>CYo_X_l-MK^m^Yh=P=PcPY^Z!Dd zkGI}w3Nud+*m^<ma>V}Io5X$Z>^1tL-hX;o+VS3BPCknau3F3NdDo;l;njKD@aNS} z)RXl#q)bvT{-;vBGsJz`n~&xnW0Ts~NN>LQ>Xz2=&8t3o{!m|Yo4I-SoFp?@uUQ$o z)sKT?E-qguaxJ!IU!l^ORAYsMOVSqanj`OJIWNR<M*p<wrojs*d+b{{t=TI&k1_tp z4aMI_xq0SD@3=nEC+-2y^NS~IzY2+++Hz;jwm8Gfs`mH#CVOj^2&Hm=Y+JEnP1eVM z-2akxtlD$YVHsc9k=sZ1b$*f!U%%2UWxa2_(W?bQA)fBCex7wk9*UwXXZwB2emnh) zy6f^+=DMMi4OVL|s5x8l>Yuot(39`0m!19V`AskJ%hdVl!AWm-C4bv2ncXv0FV4Ym z(Y*Pa)Jx;KH}-J-<!N`1@XYTk?EZRuQ|zG~ku&*?-WfYOC@ff4rdazRq|17#;yT+@ z593SxMa)MQ&iVUm>iv8HL0hGDZ@xNm1*Pflmj5a|@xt^)%UdIj+t)mOuD#lAQQV!i zZ!8M8S>IFBI<@mt?Zq=$O{X$Ec`e<iPkFP&nOC4qY1Yl>hcoB?me37Jikvy~{fTu} zw=A4rJiGlSbRFOP1gnA_Z|0T%sGg8{K4N{rad!2s#b0*je81W#V!hQ`^n$|Ew9{MI z6kYwcE}NZxroKG7jzK8xgTk+g^KPmxsk@z>wbZXXcVmpwzlD#^|F|doSij(sfRokz zqoJElNO~%`ZFtCkbxXDTlEPa{q~@Q`JD#1kqG`J~cW_<)?(^wE@%6=hX10}!6f1u@ z{Ji4xyzivqvuZ=L?7fwuj?TB!=dC+qs(!O2JZWx)ZQ{|hzW*NHURtH5`S5w!{blim zZyWPxU74KZVWTFVT9aRsx^<__2~*Q!;UROn^&_9$@^7_?k$rZu+gm#-VqLW5nUH1W zB`an;Sh-UDk@ShZT<`jY^Z$Mmt3T&D^Zc82QV;Dcox^`>da;Q9Q*B^O_T+1m7HHZK zY;PjIl#55YAYk2u|8f7rcP_tuetFK5!|iP$Nv2odeA@rstp0CVV(6xMktwz{yIYp! zYn@5%o@cA|=vY{HOj_EauL-NYXKq^5F!Pht`v(=Xv(F_s-dKFD{%^sW367iVH{P5T z(I5QylCE#@mWQtmV-kH<UtHOv5Y1|%x9`Q4`dK#}n>Zz`^8Y^ipfAMN`}OwvrFS!o z4J5O&r+(c#^WQ$#n8n{RbgF0Muw^dOI#c|}@_tJFq@$6?GT-d^QYqHI<n4~xg)>hb zyYhSA>y0Mwf8{Mbam>;6+6~!C$(LH57sEFm+;jAP&vCVtS9TnjS@vsnlVs@hl!sqr z`M<`vJ$y00ZQ`E$EJruYoqKcpH%{qf)+`grn1@OWjlU|a(0U(tHEp}P-oIAS_a|R^ zg~~mO;tE^l^Rv)W-ujH#v)EY=I@>nJFWJei)%~CQ(kxev9sL=rqbqk^Xwl01cSw}; zQ2gtQ<;FQLdtwgW`IvmK>sZ&U1kpAF*OZ?^*Ear%wtRYD-|a?(hsl}L)4G%A#&<UF z4J^}UKcY2VX8jw9^>=dKEjlD6!+G!7VyX56$@S-cv6{%G{HiMVeD%rT=kuT|4}M$u z96OgfwJ6!8`W~Bgcz<1Rw}am)@tg7mcQ&XcPyQCXrOJ#uy}kXSRn87Q>9td*zv)Q7 zesflft&K=yT;~hlt}PeZ%3k?M&G%u-U%RTZ_qfWlje&0##Ow)P)$zM|W2%&Pq$88& z)h&sqw_04f&|h^-p;Z6OcaD93I-jdmW~8jL=U#F~=UvIy&oi<lZ5Xnn%J&^Os=oBr zMqkVF=~M5rXcn_?-`n=K=~&m@7`4MIwoQNaHubNP+KVNQ#?x|qV|Q{-4s)5Rv(ceg z&qwju+%k<c&)diM=VpKZ6>i4=Vue#<NP6FK{%#YU+1*==OAJyf8)IB@ch1RQ-TmuX zfB)X16DJlee*Il9+Nj>+dyTxP{tM}!mbc7)`Pkg{`g}1}>g~4|N57YSln_Z-nKbRO z?SutOZoD*Gb+hK1T|Zx=lVhoS@@KILUr$;x_RMUM%+Z~>MM^?O_GRadjy-8noT_05 zZbba4sg+nNb&31KelDh~cS1Kt`fd@cnw2!U{E^+ApI?_o{8{mNL#pWifb;+VulOf# z>@>gf$}^6|GE#-l8FoH$tJpiq>&T*)88=ewo?hJM^kK48#Dmz72>yet3M~@CUS$n8 zXWisEd%bVv=bugP>cVjk^A(oPE2zwHD=B39(9l1@tfT%+UaHNSTUk3NR5H)Yt9r5E zcIA}IH}j0_GYk?>aY|VT8t_Xes+B8zZb-Q&`p$-Z?}6=SbF^xB_`hx_cyf7<v8M3l z*;WfnS^T%ndcgU<I%7|#kGGeI+Nb54PW3oD74^=(Sz#l8{_*QFt3c^_Cw@+H?~h{S z{LOV#Vb#o^$)8v^29+*r5*2Rq=$^<jRmM^C2BQWu>(g@w3VDn##73W*ZmYGw>sdnE zuixyE3#?`we(TR-{*yzX^T$k|J<lXekKGGCbJopj>ixIZd$JaA|6JsL{gUP*qeJ&K z1eg~oC@)pr&1RNd)^TTR^Al#h{mM0uvZuQEWPT8>6BWz8d+Xf`ua-{Rf>R3&m)^W} zcx~D~bL)BX)xq_%&Sz~&Td%W7>ty2FiARfdI07DY2z1G7s;ZQ&FGw|)+9H*vI+bIq z>POQ$-KW9#?y(=A)Rr%kZxAXUp|awh)p4_~>63b1Hg`yCNk}<26rb#JIU6rL$=2zo z;O4y99icfs`yyGhzv|vG*6mdZ^OH9A*c_6(X=T0LE0dDOvlHrkmHF$0i!ZOey=~#? z8~HUwU0?VwR+RfDtY5t9`*;3G?^_JJEIl13{hy%5m8DxhZ7qX*(5~{^S5`ImT=J4$ zeD-s)^UC7QfqvZ`hyQO@=a;{;Z|6=sNz>O^s)FsxvR6HJo3!hlx@5GoWKqSjGyeV_ zb~%AoZNHXDSL~YQ+tE3>A}FI)&Qq$o!pr&0h0I;OcNe@{VtSKjPwji7V^U|IE}v-C zIkD5>knnGZnKP!#&3ia+=CghoRYkrRjh3PN*PJ?*p-}QZH*Z(Tsy(?D%W|!wlak68 z+H@X!9&vDsg5<rDgC&P;0)xGCz4GVvyfVDDmMQMb8WqXp&Kn!wy;<&ZjYo5iI}77y zhDDR-iz~b}-2407^JjL8AKwi1U1|N@Pq+M!M&~kyiUWI3hi#MJZtnYftytHkXWffM zCp{J25@Zu7Hch2%8<*Vjwu1+!9u$amFG)3C8=9Sb{o=yEvhQjy=w>eJ(DhG#rBZb- zWXJbw?p{ZX6I62@R*TK@US$+(`Dp3R*FPq1dnz#bP1KDJyVLVOml<}7<s6?ZG-Z2p zHBWcQeZyOVRk|8-agS`a6`WK3VcKh3SMmMZw#UCzs}qij$j6ozH$04H$(9M&vv^(l z&d^KxeXAQP^gVCf30wYm-un=*mo1kbO_Vc?ZeD-u$(esuss$XP?|r)LkJT!-^$5zE zxqS^(l;y6hOK?d!$@Z?gt9;He#vRA5UfptgomHdm6JxpFebd!Ho$j(}<azyG{?xQ9 zp)Z#?y%hG5&^aH}<t(?(T=vy3#kZ%fh;P`?e)P?ywU;j}pBCx=+{S-(k+U3wcAVoa z@fV4<j4Kw~JqinZ{O$nPssM!rqK0i1nRm<FzE91M`<<=b_A;XC>=d)jd1c4UIBVk6 z+z!cbRP%66%>EH_{gQj+#Kvhivx+6l^xwQ+w^pq9<BMyCe^%FjXOGoklc<WG)Oy4? zmCIRjKZBEFucWxtt7ny|7dgCIOJw9;7uKDXns&jlyl1w48BgG<{DV^t&zW0t+jRSk zaH*K9SDnu(__E|L$+a*SaW{CHG^sJjddATp@nzQA*UaYp*KxJ@$=Z`Ejd_E#RxXuN zI55FFcx}W}2JW!+Dr^2stU9ps#G8wi+4r(T4te=JlKJBIzb|%u_}V3_zc1|2P`|9Q zsV40UqiT2Z=NHp@I8Szce6cKP)&%jNA)BT+Noh`~yW+O{k(G;R#Ibgvxy#<)v9rE= zGs>sEc~}1Ir<V-W+Up)B$<KYGJNJa-mk6Jv6HMC=@tt`4_0O8CE395Fxs&ky!DRca z1LA?}bXq?dis;HJc}DQ7Hzpc&c?BPBVP$&kptoO1SRg`e*@+vGUMZH!5mjZuEC(bl zVrT#8Q+x9H-aU5D1sAVx{Gh@$zfvXTFQ3~x+2?C_d!GB2ZMiohfJ5xeQTyOEEnbdx zku90(^~Op!`{r@%cr1L6vyOX*!10TcLi<=3>-6>=eZ9}4b=u4C9k-Gd#V7B)b<dj9 zrbg`JgWcOMy*6RmI?0RU;Cvx3<Bm7KJEVi39CVPdjGW@naQcF?kWR>=+lQ>gBVX^I zbL#$ATl3l1Zr0rT?dN(T=1uA|4Vx#PcfU;F;4w_~6j}K^Kxn?Lb%Z5H)sl&S3pU(; zZPrxuvfOw3MjP!H%_^LCv|5GEc<!9YaH(Ol;APWS44Z4Rr#T-yV=C{+<}6*Xj92$z z%hXjBl6yDLea85s+y3y=iw|=yz27z~YH7$86V>@2zu8^UU0LIsaJ-@F_bKh2Lf7>j z4hZ^n)u@HWa|P)KEoV)d^seP}yz!&Hz}f2GcKpv4Sogv6fdS{tvkM;8{!n?e+V4U5 zshvFnI~Gb?T6jJ2*7<4G7Augd+V*zxBZsHcmQL>wR@ObolbW%0+pTqXUp<@Tw0mjU z8qcQ9W_Qhw_pkrH;I%<XHq#o#EBSvHvYgYK(YjOFbnOp~Io~dPpXb)NVgGvBZyX%{ z3=5Yw*b7R_w;wqD`B_G0p~i#4+iQPbE?X^F(HC_x{qjkTZa2wmCvv`B|8aV{>8W%^ zmInvchCV#G^?#<x`{hc1Oc@&5m;d~~;^~#;qW7zV7#LQZa57D`e7@q{@~oQw#U^>W zyH3VsOiq0uw#TFC{+zinLi4Y9Xx=hYV1BjMMN1<|ROyC;Mxuh`j9XvkxlHl!tKaf@ z%Gb;{)5Y{x6iQw6pO{)zJJD!a1*`toD&rRMQaLlnoG;h>FS^X>fBLvBFGp1P{pKXG z$iOL#fucRXFaCWH$k1^vfrB9@Eyv?#O=9v=u|ty_1w_R8oLKmqH>|p*pp;)aLFLW) zzLe7no1a#wo(Rg=Uvk9hV?kAO;&MiYH*FFj0xt`7JX{{dO(>M|Z(38fjMcKWr{u}X z1dFQTDuYGVKNcqUEcz%me`B(Z*NrnG(|O!y{Z91M4nEwUmwUN)|J7WBknhV}cJ-N6 zd*(0MvU1bEy<aa`CBO9I+9A15;LoYOy1p*E?}Z#+^*Dp8`tO;gf3>%y{oSK__s0D_ z=c86x$3E)j?pnL;#D}Jr)$swolb+1m>*b>4bA$iz^y!CATSp}d6~3Ra?Q+8MQ(vAQ zUgY~T^4=$=7h=}UQR#X26?ZO@e%Z9A=+oA)zaoF9Fd9BGls(nFaG|P?%?tCB*0LV? z`-RKy3I07kqwL9t$b5qY<IwGbd!x3_SR}6)x0r>6`EKTOkBdgOpE%2Wf7xu%Yn(Je z*>{a$%E?`?mdV9xS^Z<#TQceFo~c<ZzB-*98n3K+KWHuavc~Ic&K_o|PmLXU*LJCO znZC?XIIlG6y+P>oI^Ne?vw~M-Wl71c<z#%T(z<`+-i<}RZ_nzU4~bR}EsS3F{8#SO zGs<Vq8LM1f`bwm*Q}dRR*_yWEC;CAO3u|t1ncsT1MdQ#`zWJ($>z13AX-&+}iqG44 zu%J#PuufQ*Ny#d|VrF9R=G5nIM{700geIrig&1{AnWN~Dd&ct;`$Z$>EE6{^LHDhk z6AM0DYOlEMoL#e#pZR3&bn6#^ipSUQz3`etusJMut!3j$D=VR$OWY1^)jh<PXD?jU z*=qB;Oy}*E-zL*kUW@Ja&yq=!{rT^hzwna>pC#Hm!mSMXdD2w#pKkP4{m9Aj(B+8A zl9VeZTOJ+po}l5mNo3`vtgGjY47{c*22abe^eK9JGGBnBnZsidPt2BAv$U<wX1emV z*ZN%a;5+b}=X&?_<pMDq`SlXKW9Kn_5>j*a-TT4M(Lt*^qh^U_>f@=53@VH(+8ci^ z=8f2IXt+(>|B}47!<1W+>pM3$+9ujog=bEFE8jeqQ(0lwk29UD@)Mq#2W&s;Y7ScV F2LMk4hlv0H 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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 RLTL*qZ3&v{`v0GS9{@Q-7IFXp literal 35660 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 DC`*Y5 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 zcmaE{f$>6JeYwAz8v`Q)0|SG700SS0jt_wFL2Oj)AFOZ0z+fi8z`zj3z`&5;_9Ns{ za&BS)1A|!x0|P@U0|P_L)3a<6$z>%93=B4R7#J9o7#J9=nC$sd(hAaZ85qniFfg!o zGca&Zzaet_LwaIyeE|c5y$1sW0|yifq~}zoF)%Q?FfbTpF)(;MD>RvLFe5cFg@M6j z0s{ks83;?+PixA^NKIs5F#W*5z#z}Sz@Wmx#G;##TT;QmU~+<ifl-}-fwAVHAzxlj zesUrMgYg9h28IJ593qyMlbcvkz`$U<fq|i(L4kpRL4k1&kAGfbZYl$VEdv7s;{*l< zmay25l}8Kmi%S?7>_8UpU|?WWh&d|sx}YevfPuj#hJk^hj)8%pYf{gjQx&)7?q*Gp z_S~iy6WY5-Z0oM0I$I+)U6`gDnHJe5A*9~-cEaHY7AMc-Y&u-P{{7trqsM!eHm2^` zu&4h2?lXIQ`t@w<b|?Q2y}N1d*=LWM7PqZhXZ2z3`#E;J0vb#V`&wlhm}DN<pS>io zz-d>CZsgQSra?8APbLXk#{JcI{ZZI(;MuqP&HuaX8sBeezP0?TfWnQLRjLN%D^eLb zW-eo3C=hkfIF#vs+NF=d#%<k#mrwoG-<Wkxy?nK3YrRHi&JDl9kUc@`rhT}Wwne6Q z+VP-o3bG$OCwcTOTCwr#YL0vI;*aJ0Wf)k#d=UL0{3UV$yOGAWPgWiej~h=|bfN24 ziIfvZ7z2ZvMXmuu!UWz;S9|iWyGLG|xJ~;<;g3u{_V8POHH%`Lo=s{xT{?aCSxHrm zgW>lkaUJ>k>r;MBy(R11s=1fX)Uz^hE!p;eUe@CC%~BFf!4J%%*U7Nd*mguPD5O-o zD7P*Uz9e&bst4bOCx;@HSXmwv9{7BQD?vg>wQq4agKu{*gJKqIz!VSP>Sb}A4+39C zyDK^<zIu_%b~)n6$>{gb7<>!A{93#C$IGWrrx{K=vGmZ#hzyV8zb@5pP@CFiswX#b z1J8%^YO7A>sH}PLUwG}65A&m@c6f*gsCyP|4eE10^le9ztLCHMnr~U`8uSnE+xJ?2 zq1*HuQy(^o6mnOEKRtQ$<7)To^P?laO>5T|x!rg%D6w$m)XcAHYxrZme#Pyc5^F74 zu3fm}o^xUCmg{BDV}g9DV%~&nEv?sPk2>D9_EFKY?dsC&zE(Va{XF~S%QpwE#oztB zY4OCF`=s~n-0@6r%HhRF4m^9X{J`$e)f`*)$h0t&UGQyVXvkuilE!f4PRF_PUMF&U zjTnEd)VIDnO+fw+Q^SLcZwq%c?c;YjP#46XsCd@mQI}SG)>*|1e1X#*oRT);ySZ`8 zj5qcCH!|FRBsV?Yer<l;mm8N#Pv*_G{4ne3zU^~r8`r$L^G!m={eIx{M<-*xb)|?} zPJ60Vu`O$9P*~B6JNGS){>^UPrK%<!Q~D)((WcTDKa1JVMeAHEd39ty>wJre@-tO7 zyFQ%0Q2MXchsKA~?!GQN$#*f$=tbqUg)9u6{LePLmFTFK)OnmNd|+E5qkz2Jf%b%% zXAC$0(cI6vG3b`u%4-pR2erboCdGt#>4YEM^;~6UxAvv!Tviqj%D*k06q;|bUi-z% zO_%M(0@#}Sq?+Q_iC<pWa`}02JJZ52rO^JJ$#(7cC8s{JWoWwhR(z%578V|b%U)7n zIJQVi9pq%t;NWB6s#ow>`1o!plST5@XkC-nK8FRwHx*qA&`nu;(7t`TPV{^IJlpiv zY*z`LyuS-&`9u?)7zAW)haFh`ATxpe*|dvnjPoStcss3$PMY7f=wYW$;_6h(ck2Ql zTg=~nDlL1@1^3!o)z>EauikFD|IR|HQ@1a`MJx1!aF)a_2G%*c$Jf>iZC>@M>tSi& z(eO;`U;FJfCw)G?{XgR$<_duV1?#U~8SWpnt#_m|rnEKREoOKZ{clR_T#v(hD}JtQ z49QaXn$Y#f`I&d#_r)5&gbyS|Ckk#8)o^xgG=1`T8y6REy}QHy^nX9^T1l7kvoaj| z{@?#e!+&n?o2;9xSG|wgvt#+M=K8zE0uMx&B&D!U@L2ZxVbS%8vpKAd-bC;JxU`#H z-*)=x)c#&|Z=q`OKk@6XpIcx5@YtE3-&vm=UOMsmshutfU+hBD7+fFLGv!_QXVM^| z@NN2$?g@<lcr}~crfD)LTJZ=73C2xuVfdo8;KS9+=CKj~&g?1OKQ*EuwsWIIkN456 z`jyW(LJi(Mm@mp?c&d=4d76&$CGl-JW<O_KPB5$#{c)Ay`v=+ilN5YJH75T%9XykZ zS>Xgj!>JGZ8yH^Hm?c~Yp7KgsZjYIILx<CZTPz$8j|PfZ>`~TbcMynWozN8i{oLcN zUynapRodp{<;!gCm#M_mxk|oxO|!y^o|tH%uMg@M->mpFK{wh`LUKmT_TE!Mi(0hr zi^WKX^Shk#Tz~uZYO(0-X^QR47klQZ+3mIM;Q6pzfo<K^o;rEUway(*vS*hiF<cPg z{m}GL-X-{TL*fn51DnKzOs{BUD_@&-V{bnz&sn3_yT2=QTs-)0FUL9E?O!I&xGLBg zWqECK-^tkEfO-!Zg>%CFAzfGJ)@GeJf5>X@|6|_Q`{g&6-0DsjT3SAZzxVrd<J{XP zCpRDG`?s;t>Vn;0kM-JRC5wc;jvjUM-!o-{tjwAaegSLK-0Oj?|6~oA**mZExQM*5 z$Z?z3mdnD(s@9>aBOD!Ix@nE)y|l@1T;B044{;LhSa`CFIn<@TC(-Lr(Fg7HnQPA< zRPL_&8*;3!==D^2<KpxCv={zg#9wzd=hxJ=`<Kl=eg3eF>DO=urrX~Hk{*6{V3?D| zsneYC;``0qh&Y#1b~>r{4G}d0?mi4NQpJpT#PX*H+~{~(RhGYiVbO()dw*}}+`_`} z;Z9?QiX3m@8g1U40XH5_;H+m8)V?XaUM*C6(ckF##xH*#d%wo~*6IE`l{c&mOWwS> zk+Swp<NfH(w#QG{KK(1*JG0BWFn3?2!OHe#hQ>qR{yPMInf=2v@<W9;hl9gQ1?J`n zX&QU_CGNHJJFKZaF`;%v50fzKEH~{~_A7rbGix~fDXsnfY<6BIYyD3xr!NQJ)!Ulf zYS(Phn>A^%*NoJ=6{{<}nT}38n>B5Uvqb2Li7L+adpBo4DN^Nn%Dk6TdTIRq?G^8Y z#jB=seVS^&L;B|3Ki7mO6t`quOe;=Z#2@Qel=R`iKa)^<%YA=BGXDj9JM`YpGqB+G zl=_4{GB2mhcIW(+u=*DJerA>nS&}|gEP~ASj4E8ZLUOy3gT$QNau;+Te{kzvWyi`D zYm*d1Li#iW)*A_>O^G_uXt(F!fp*Q><k$Qx_J8)*|K^pn%!pcUK4;?gf3p}O%6_Mx z=&$2`(ZH{<;J<Mo`z4MIufMTK%x8M>>Ye7Ngmfb>xt!|@wnz0{|0WQ*H0H^K;JX0_ zzyGPpt*`(8;KRocryhBSPhVgEs?$Dx_s5?eHOs7+pHF&SyS(lE`~3lNG7-D8Q(yi1 za`9)c+2x#hYr7wB{IkOD&O2qh7q{~kNVrLIx*W)ks?uMgxbcPTltLychAuXB#+LmV zKWD{SGRhT{eqT1*_Hg-W)s_{_ccnFwbmpIpRMk9^u)d@8dwuxYw>w;ycJYhkPM@Xm zV6pe<xn~o<&weLoRr7yu{hwbCm8%Zgn%d5Yl-8e{d&jtNk)Hn-Kl^Xd;^$dQYJb1u zvHJbp_CeYCYqP~q=w(~z{}lUU_MkzuC+kb}t<H{Vno{>%Hb<99Wxc8R&emajbID^? z<@~FWZ^hWyy`s%SZlBy=FZgG1RSfT~+<L3G-<Mwga69YEy<c;$I9S<EP|9ABl=sQ~ zhMwgE#(mRn^Il}()VZEl<#WvMOkVz{+Xd5-UnMVzPtf~d{VF)F_KO)08zW~8!_$Ye zX6<i{W@HH6RvHs}f^pG=)I}2{SC_VDUv-lCXWzB=7eAZIi>vz$V*k_#DlDka`7iR1 z{fp}YW=VtlmwxV%W9D5UTc_DLJ7}%mW5ES#L8e!&cU3dDx@NU02yTyzkb1G8FY#ze zZupF{zBf_Md_o?sHyzJi$=dDN`sd-gCBB<4ep`9z!^D^EN%uZRJ^B@4EUDXVZnE=m zdD_~YXCf+=m|d^GB>(Buu05M4e393g*Hyn=S#i2Y*wfqp<gWI|G5TJ}`6^y5;KI7S zdr?AszFoJud#RKSd!~Wo5;n~ZoD4gd6s~-0ES=WpK2^iFLSecy%hCL(CGroyt}gQl z+rN9^qL{Uj*+$2sTqBQt?0za@@-cY5(UY@sllFZ*)q1k#=#i<9-*4y-)!unzw)Sa$ zo|?*xdds?Rstb=?t`&8wPrp!c{`TLE5vP6~c*?)^+|or&vGdPIsH>mtoU!%V7qv?p z7e2nc`uTm+<<d?1^NgofZTnZYrRbDmVR0E(zyk62KUcqSy}-0NK{RKJp3e8D8gAzM z*YEfH>~o+$VqQDLCD{eeJeLe-H#`(PoX;@rdBwEbEHX!&>Tfa#Jh*LEwkhPZ$b(AL zpGWpH2pssbaOul)M{b-b$lrQnvS+GOqOEqarJ!o|q*bAzSqnQ?YwL#AS-)I*$Hi60 z&1Z?soaP@6J(E*<*rSf5WUF`w9_`Z)^sm#oXa6OhjepIod9yT*xSrdwU+z`svc>B= zN)JZp^~>LU6J3}Z<(^)zI$8O_=eD}vZx*gSwmE&CP2}92$*T7c7v#tG8(xs$@iX5! zdHT_^i<XO3oY>ozFJ@MsTvu!qB_Mrz*^IkM+d`uL6(sMQ$ggEMJMn+Vy~;L2If?i8 z>&2cPZs(t4Q1N==ro*0RuU=O^tn$Mzr(XOo>o0{D%u~Y*&p2~6>6jU_1lGGh(BRtA zsTrs0^5#{a1#8x>2oH7TRfUc@MnV&rCeH2pdt?&J5lxpSmnfz~Z0>n0Pr4kqdqm{h z&UrO4t7b11)-+7syi`c>xQm+pvDtxEx6`dle@)!-m+x0=&7WfT^-tgOFQ~lk_)_Mz zmxkSbz5Ly;aw~EZyCW}{H&1N0Ve;p%FT0c<9d#+xHvJ2?`n}SOqj%T@er&IIux(ho zl22;wuG_4dY_Aj&K3Te43}I(zOJnHu<+vc?y#D=<zDlp#i$$hQt#Dh)V{}vO-t=Wj zXH7b$SuTya{nRIB#+;O^JfYrxTB$$$Rz|MexBXxA&VW_#EDAq;zqh@<r*N+Azsv9M zZ8fUj{W0X<7jNfztNgb;(|7w^`rlH-c*>ll<QvAf*RP&=j6e1MrXBT*>e{ORE<74+ z+#kDtkD2hg-L`(eFL34ZSUl}LAkmOe^qc)f{)N*C0zF&XQays3IT)=Z1bj@6IyscS zIvS&PHXyg5-1m`OZRq99^8HM+-mU%mWO3qt^Men1MC!d*u1uLLo3;C>)oZprvy%P0 zx32s2QL@PIvYnNzhMxLLjq@*kCx)w}IuvYVKD__ujg`vz@-J%de_Va?X7<a??>~s@ z)V*?aDGpm{FV(*Pvb52)IVX<3T6U^w=L_AX>a~l`RwREocKy{n<F=oV-$&fPZk>>w zW@h2fv}<{4_yb4zoAqs_zlDC8{gSX~nE9#mrsR<g+`LDM4?Bx2VO+mlkhNxln-6;d z&-sEsY7ZC>C+9GTFt6ZsP;7IO(9B@FDBYlT=fMrXV@YYto<Cn^{dn=(WkP{MU3~^m zXQ^aYcm*_Gl{ln(vt3QSNGO@Xy({QeXm9eWlj5gW?qjn5ysV()ipGw5ojBE5=hoR? z&Mar?_dat${Pw#U-0fZSDy}?VUQ@OG;<4h_hu^Q1{kmH=ypQ$S<ks#@*|#cmqjKci zUtX_pV_OqetZ~oyX=a?<tPHDXd;1pXm^V%OZ|J{f7Ej;JUyBp1GPol4E?RS5hNnbs zo6H{PO&vGeQZIL_)W<ivJU#cVe?@)f7tIL_mmjQ~#_q%=p%7B}JAli(^Ib<8<8SVa zY!{sklNFOMCrOxYi7M0Fv*6>}yViM6-!mya+;(-%cd=@x8w=isO%o0E2%KEAGpu`Z zlz(`VYj0+WWcAvt@H{7pO#N8JrS^Q&l$$>XX$VW~o0TnLuKRO}wqx!(x$0jDzkQqQ z7yjK}wIjm9CSSsH<|W?ik9J?5?l&*aW2fe|tWPr^FH^ad@8jO%wBEkZY|oM7!o{9P z-_4n4vnBseRgUBJ`bX~;_Fmk#Ry=pzs^_e+cf5FgG=JZ(OIv%{Zt3P5tkW|#zVPXp zctib0oxoq_ZRgE?BxuXDh)8uSosd>+&}sG%oRVDMJ>lVvzS~b12#BrX<KD_6;JWzo ztiw)nA11VvPh)?>_8_9|sf1~E+RVk)jb{%fdrs#_-1RG8y7lzxy@}CIeM^%QgW`G% zcYkFHniZsacdC71;UZC<{7GDuiKhM`UoS7wwva#g!F>t8|DJ&U<09TFhAPvz_J#Pr za-SQN<#QvxxZc`rdh%lTYemxksyJ(JMf!e^{xRbP$BkZ|np+a<zC3wXzirhGrHwiH zH{Q>bjSlUzwGG*Hwq@tNfDNT(i=J%#b?^U`t=XN08f|MfMi|SQ{$FToce(jHAJc7n z$LSZ{8(F*_czAp4;<f5p=)igDir=iK%pEGRE(TKkAs6FB+Z?#+FTcC{T13-d=I-9! zl(V~%6h*y`NE~w8XcMyIxsuo9OQ-BYJ0{-u7v#I(>aHs#q`C0&uG8*jZOT(G3Z$1E zt!fuO8Gh&6p4V637yVWDy_OJTm$>x%+=928|31rRYrnAj4100lZ3kBkJ|0%LH`l`b zZ?UDt&Rg;~_t55l9nTLm?Au<i|J&uso86xo7QFqxxmI+pqdc3^isrv-D>(!jx-K@n zW%%ki?NzIZcR53lHsfrWB@qsZlM^xz2%S(){BXnf_Y|3}S&Gj;Tf7RgU2>%IOwWSm z2chP>OegM&jR={@_x`upZPh#N3UXGP3svQ$&;PDgS$+0$@dkkkZ>>FFmlf`a(5vS$ zFkT+heYAYuY@Q=LYwpEzyw+RvxJWgl@Mw)({{;DU^Y2Av7zsXp-TwLJ{nbBY-H(^d z?R>QU>l(XP-?l#zoPPBh8%M`&`(>M6C?|-VX*|F6kL!x(?hF0)ua9jvxpecSyd2{# zX3e&@VY0Ivmb+KU-eT#vCVVHIfmNdG2;1Ji>-FoI`z|vvI2!eSE-`+R_sHObzOTb3 z{#mzXzj*fWwC?FQUrq$@6wA$)>3wka_oWH9J9%dP=n#Ilp)1Ps*4CAI9EvG>z5P68 zn<Zj<S6<7q?CNp8|Gz3eD1Y9k<2z0}bB9g79C&W3=C>=KD(XBxEc?X%=c@jk_3yYN zH9bY-=FYq|p?>~;5szCeH=j+}c5cqRb&|490a5RlK6o`@p-sgNP1#ys^*6=0au>Z0 zT2qy<XyKo{`IDk;)K8Xew!D=RZ7i((^yKxQlQ`vnhn!RS{IcSK-riFO>N@KBF6K-8 z@$!DtsM8$kxN%9Fnm32iuIL6|#%Tv{Ei~J`v`lHc?7nqj+w%Nw)f+V&OiGO4NfS99 zB)wg7bNTP0(+h6Qk+}WHaNgHtihWA6X0U2)I)2?`&F!<TPv$DTd+=@1?zB4}iq3QV z{<H5fzv~+}|1_22=d<5&c^bCgHnLa#pls_}{&H!tapKJ0X?D*_q;DO)^}>$h_vXsy z&295KJ0nyzcQ0DjuaJGxu+%`R-sg<&4;j<sgAdAXRQ*|Ga4?nYYt5(F$RLjL{QCBP zwO@oPnErTb|GRazd&<0Bzh6w8bYN4@Kh6w?$%QTD*$b?D8{?*5=Cia|c$MvV<Gdsd zThBg$qXI?A3nnBoOJtmKkdX^Axx-+y;ET<+0G$R=9jnl+U7`yvKa9U?b>YVTETwvm z^?!^f3*Hftum5r^dtL0#nwNiWhFHx!qm`+=@`=#5n&MeURxV^`?%`YAAdpeim|Cv? zP}}BWNbeC<FXOrz->VON-#N-O{n<Zz?nW8S3zK)n_5ORN{``i|{ND7xf#KO5^1nR{ zUu=(FvnKleg~+dBlV^SxwTX**uF;~CxLZZ$PyOl~vzca>9nY;UpPAZj7`h?)*w=Ya zGOVI<ul!~++IF(L=-bPM4?nLnE`IxpS-iICo^+|_xtkR{m)KUv_v~1%ANw!==`^R= zKm2x0eEYZedYwVG;F&q+6<+GB>031Ep*Hv7gJJ6G9M`fQ-F;tI&1!GB=<_F~)yseR zKD##k(c6_#N9x~}n*EC1=N7W5P4s%|e2EMno@?KF=bOJ`Guos3_OqVnzZ(_Xj;~~% z^)=xBA;Uz@nth_T_)9YmH7{7Vzb_-BrNL~r0P`X(6|M=hF6@Z0cUaTsy33a#qm9kw zy~x=BY4eq#%Qp*ueh|)Z{(ei}61%H6WY;#Y;miATdGeh+8@8iI>wnH%xp88|jb$!# zJ#DuM>{xBto~HfKHu_@L71cwwdA?V6uUnJ)@=BlL37xIGRtx8_|6FzU)rX%okAKgd zd4J-~XCD-;<9Xz`cbxNM`#iDa3Gbx<|Bu4Q)%3j@zr0A<qp*42gtM<xls>Hg+ny8a zdAlReJvr@n#v`xaCuH5{UHdLOvHr6Bp5(2?Hy?|BzPRX0#D)hxdyF1P?%jBS>qxhs zb+G=6Gg-OU8$Mswe&K)6<j2}+t?dF2&P;J$sNm_p`|3@(uXFFbv^}xd(ljGj#y2<P zq}K7bf|7~fYik@&fBeV$I7&5_qe;f)&a=1e_pG?CUu#|Y@tMP3{V7|t_~xZ}qz0+z z)(e&zY?`m+n6rMvr6pI^thkfPeWZT(ggvjX{s^04a4K{6=>s!ZrrRd%`QdZh*uM7V z1&_b|!OVO6Qo}t2f3rV`l2?0iZR5f-FHUbxUU(yBgT-w<57}<}p1zx@(Kj*$CHADT zD5h|CXRl>n-y0U>9GcmDwcGCE{{I0Q6)FlEg~{IaR#F}3e*LoD_iR1y+Npo7Zm|k% z$ZuZ}Uhs7RvtN^aKI^Zdj)&8iA5xSux}3)HU`gNd%xR0QIh3}&cC0+WC{_@WCBVSf z^!4_%1rlu5f~UFOY;jLsy7O+LPW97xsZ$A|Um4okZJ5pfPi4Mp$94PH$DKF7Rpf6~ zpYM4z*-$pEjHkX(T-Q2OTQc^-)l;%ezgW{RIZVB@XnEN4#7^<9u+?|Y?(-<zGHvnJ z2G06_OO6Ng_LZJ#zE?C~CrWwo&7@u1uUiZ7L`${);eOtJZpZxH+KHFBcQu@T^UUeu zuJWt%ZoQC?t=oBAd-pn3CCBc2YcC%^yz*dttiUrnZP`uht4_bUKBfNW&ZJZ6ujQxA znc0)E{rKc>F;}lwRPCwjpQ-=s@tnIk+^o7AtC=+YAFnX#W!o+%zoqK!zjWrluJf%E z?!75q@;UP?cl@Gz9eY18{J1@>nx`n|K)-43Qb7kXS!YLwatjW1llnKTD$GY`N;Vtz z-eWOI$`F!ZZ1(VFG-_xGi@SQIUhWQO!ExQ}3Y+S$_YL=iUU&N>bNJ(#XZH4ob(=fi zrKc~mRzCdqYK+=c9!<qXza>6eO}+VF`tIgWr{((Us&&M5*ZIwn$u|ABHSX7GyLS?K zkut3gI?w-y?^^lrTb&;Bqx}-G{~2m!bQ1f2q-o21SMVygnY%>dUW$uMu&&Z9ZO8g) zX;zPu*Bbf8L>!WmVz4<H;Bth=-S7_Ef#716{}Ekj<{k52mfusH;bC)Uwd5_%4l~B3 zk4r^X8YgZ#oe*1Kl`A&atoz;knXc`J7qB;7J>1Uc=hwr>f2I1<#*X{1Cmj@uG1`!H zt4{iQ&Z2eslRQ>_J>0P=%=qA{t4Yf3Yr}48)(8I7>~(&q?NecXdBwFl_3#_T=dRpX zTJ_uS<-^GvrwD#l?bq30KJB-%OuWyGy&sexNgVb2b~3Q|=W*5Drh;2zG$d7*-|Kzz zt<5>caYNFDbhqQ0uS!H?J$~hX4S9Yeqi)&14bdmH@{UbeU-VIW<&_-@^SxyDOK5zV zaebQIM3d(__1`y&-D~xk_DJ6MOX#!v*5>8cX8DU=Hfcy;+^<<7wD>c}jI6D-aYu?b z7~gmk%6(0yFG=QnVtV3_)hc_BI`;0dUT#+Y*@)w&C~wo^mk}nSUB|D!Vpn+-;O%eC ztF~Kg{nRBJLdv5x%d&57)jN0~{lcNc%=_-Oo_IFXJat+cx43ov(epREm9upxi`bi( zq^?Ulvhwh9x!<$5&$q9Se|oU^-)r}&VJB4g=Ur-j&{6-&<zcIGd(OmzDaipR)4eV? z9at_~tCsTQS@df5b!&C@|Nr^<=AzRV#HEDUrd|E>>h~1+S|O8yz09|TjxUpBnGs~@ zc~PNhZA+Vpo3V@GT(*?k4G-%Xjx#8+a%AjS`R%}j8GH<96ZIFa$lJ7P>NBU4Q$!|R zN;ECJw8}pA)Y+9!`I539?wz!Knv-VMM&bKv#dkL}x;p>NU(&VIIWIHkVV|`~&w)7S z-$73&pG-LW)KJbkivMTS<zJT`ncsPxyCvfPt*1BYbNjw5e*WHQ=F=6{h9-}@^`F<v zn9VM(Sd_cnD#zRMp5%mR<AcGEH#Ry2+0W9|wOuO0$TIEi{srd}=D%lWUb`=aY2vZo zBFz_*&o&9ZOt5x{%X4y&O1l!~9K?2OrHj_aj2o}}F0E0PO}2dGFl+jQ+M=jW*HtIY z*>pVJ#9ZmxMN!^88-%9WPwq4mOrK?+U;0#$xn9?EyQzPD_M<w@kbhZrL7V5+ch9u1 zDh-&|_vPRHV5Pe&e!Ra^|1`X&IW7IXbWi2qpP9)^@2kb_`#oo6tcbql`5j8z%=zNG zBR_S<B-hUGUoe|{@on>htMyEC7{a5cpPkSs@}#tv@yI7ZkHRGn4!@9?+9#}XD6uuQ zV(Xj3D@yw6lQWpSB_3%^I=oVmeT_hfQRz-u7Wc4lzVm+NYSo_}F1W8PQ7SW|L71f@ zVS03VqnjyD<#fRkPS?r5mcMWjzG<m+=3V!bF0XgHJy<>mFF$+mjK|?*?x^tGK=D() zhGFZzf5=(*extQ_^KYNl-BUJsr}Onc-+a{eh*y97pU>9G{`EF<C+_X>k$zhCsxhIE zYvJ_o+nKyBu1#OvblP^l-tWF+f9Ku_Sr(ajOX%~iCke`;^Ji*{?b+TmB|S%Dcj*U# zH}A{6^8PpXEh%*Pz~?*X<1Bq9hsFcnzQ43TUb?(?#yoqDdpD}|UOF=@T`+N1{@;oV zhb4Mc&PhC5*e5N!GT7vFS^WnM<pn*n4`eX7P4Xx{&@gqu<1cgk_H%x*SspHWRM53h z>vLTA;%?4&Q?)ar6m|(otXWX~zV58-biFzD+qcvw)$B06u_9FHW5f~F=Gub!1-~mc z&Q`syvc_qNrG~rLi`|)_F@gct5A0sQsmS`*s!aE;SyLy^`jeNr%B{w!vwZ50`ta7- zNu9=p{~N!tKHtb%ZZ+ebr9{_#;msC_YLP)U^TQ7P+j%*7TIZ@8pXYg`o(b8t*iL@? zjVYb{_Gyt80vr7z4<)v3dz!pZ<uCusfKU97mgba-cut#?ur8Xdi^)oy|IegnNzBHJ zzfRl}pmAi%oedX7dA2Q{XRex7Q$9OJQFeL#iQvCMiS>1Pdh)Yn{PX9|N}5!6RLJhi znx$20r^*ad{P#c4Sik#nSFKuSEuR-#^VVy(ZJd5275vU$A-LvyV!^JhaqFj4c1T7Z z$=-gEqwVT7HHJzHOPhej8L`p{W)2b3{zBSpN{6&FPFz@3r+8fMer}^$)m54N3<Hra zHx4<^`l_vFE6QfC@IC)1FHl)XE$c?^RVDp3hh_eShGlE4D%;)IDOI^+YHr#*?Jbv9 zC#7vPH<}vF#VWLR&Gnjh0oUYgOzy{v9KCqQ`n2=O;_u&GCvUr0TwMO)_<Q5XNi(J` zemL#UDS0c;>np!Jis`@qGV^8a-lsP@n^qgeUu>6;T3U6nUcNo)(GRBm1|{y7o^uz^ zniF&-wdZL2!Om+J?WUjfDE{(7A!*0Vmz=8S0(7o^bhyE0@_?Z>c;CsDrF%=|?!_#0 zUmf+EkEOdfc(Std-m4`>VufB03~biy?p^qNf>ce%)b|I2e0yK9OnGtl)2c0>t@89a zZza0dPrSP|vHr;ai{Ab9BJ#Fj5hZ$OYTmwCd2o^CF2l-&au*fPJ=0}zGs>w?zw;$R z$LO%$Id%J4nP+bJ^WAWDHptaGxBQ~pJMjlcWxl39eR#b7Ys{)?KTb5p|3C4_?Wu*; z&4{`umkLzOZw41!wK=u8`>M#AE3)dB-yG@qo6_aBN%Qwb>*L9<qR;QX!26|s_X6gB z(cUs`GAlv_*Q)7F5mst@x9wAS1K)~k?3QwQLR_aWiJbI}luAlTWJtPTc%V?~-TN@6 zE$e1p%4MG{Z7Emqdi%Le(X6}PDtnerzq#XVLd%TihQy9KNt1SCQGTZ6#m>!V8@)8= z^03#+om}<Uf!%l2pY35+f`sgw|6kk@S--aI_33cmlTji;(w0}GHx^~Tx*BdDH)G!( zi4!K5D%by={r;lnFBd+i<yXZo&X4RmvF7+BNza{M=e=3@WW(0&wTpynz06Z|QgXJq zyW}S>-Z)X)^Ms^I{JGx`^Bv~~Y_f3u9C9OBOM<s8VW;iFk|i^)n&ewu@rYh^So4Im zuGxaJ`g8Z#_x0Dcs7}dUst_>ygGI+JofhG{)2ulTHojZU#PIx0*z8-S#~)S|&e-g= z^!@&KrE{%|&M(NHS@+L&ccax|29B1u)d$`$me1Jys-lJA%>{vNk{wqf*Jt`(t-kxP zY_;p$(3K+D*D96-RbMyu|K@kEg00r`c}o4iuzQIC?lrviTQ8O~FyHXM)bORuc+MdW z1IFf?|F?eKZ}Y<X|Mkzy>yueH&OGFsr1|6d0Zyd__g1mSE)wNmpun`kxy<mTsU)uz z+qStvOUhn|J1n`>a?bUT+;-XgAQgSN-M*}o)@;;_Je?roRsB}uq-(`f?xRK`;_F1y z+AFm~uN|G4&g|Ke)n0E~a#Q_mu3Ge>qPJBgXYxK39q#}3oxf|_>75b!EJa1e7BONc zi>Ghf&;6hO*%?0p)<4Ug<#zLlUiv0G=K#OTx%k)nn#)c|R9k*3sQI=&et!JYH}7|E znP5EA<$BuLOCGg5X7FkjEEH<ymzkD)^wC%0(_Zm;pWDyJK1x@gv+T>A1NE&-PM`R- zU&p^-ZuKXZf9%`qdF)yKGkG}Vb@E9yZc8wEk@<EugSLvSM2yP4yPKxXU;Qz(Nq*MV zaP~EC96tSF-f^|rtadANyiJ(FZa>v!tM5%oHk>8>_U)Q4u?CDg_U`@5yrXv=GiycE zxdj>59ogQTkef4EbvEnD^|w4L_w2S^TfbwK0P7nr=U~p3Ni$3h{$6%nW>ac9`HkSL z@+<sv=R7y+6u*AU<a*QorRM3{+^tnN_y3re6Td1(@a;m8Q{h=h_o=_*o2zR+_v+58 zyRvlcTl5dvGv^5$xx`<=BQmYdCoTVy-L&oVC$E0hE~ito{@t-J743p{uPkmv|0?Zz zzQ$^Lz2O1X`{g?>m_OK&G1E8oI2)IDd-#{h7q0}*@w~vjr**UOo#3-BOA6+A*lg21 z(0;MqktHUBGw;MDJ`Ra17gvYM3OdJf80aL-+-zR|lJS95Lgd<-V@V0z+20$^*8f`e zbedgC_bnSU?w29kr_02&a0F({ZccL7PJFDy$o4us`Dp!myR4mw%UiXRnl8$k`x`B) zT{(A^UzAW`_ydj_<>h~_pPuyj`^(1<_XSoo^haNFzuv{|+b<KR%5!B?tb<*SrwvD= zj>on~3l*9e$~JlFyeaD_TP-J5CcVSsdhG#mH<i5)cg6bnycLi2d$sTBa|OHI$xR>j z<=d>h@n+iE)$(!4^-Hav@vBbrxhPWlW>3bB9}Y6>3@4us+a?tKXR78cP4#ne(X+#@ zi64998Mg5Dd!4##g=Ktii=FCrY+iN#yzW#lQSHc!3*U16kvtb4BoQydd_?ZV+hbXN zFWnNBX3yDP@icz%r>x|8la{|L(Yu{{%*}slqRhfWE6fuw-kvMYwXKM!{@)wL_XP*+ z4S#L@%+Alzd-0+7T=SNag9|@7Xi0qimNvQm>$B^5FP62(r2V&Jnsh^5{et%aR;B~@ zKmDkc<1X})y|Ox<DRbY;Ns0$G4~bp5sxfQ5z|PG0X%Ct8_?Gen?>1PO{;2D1#-+Qb z1L`Kfd#%0kNlf0!Jnpl)I_tjrTdp})e{h0C?CfplZ}?`W%=ckg)>I+-KX*6#AKhOo zcJY;aAA7w(f%%r+-o8uM6uc+29E?`kdc7&+vB%+_w+l1)A4l!KY$S0;S%WR%js3ar zR?j0V?rZud<o??GU1t7v&4Yiem!!5UuGJP>Yd`zUj@vqp$1i;If1q8#8aP2Ywm5V3 z&5Q%}=NsP!9Pqy8pv-kKJ@i!7g4;m_HTqjL45tTATN8GvD`vH8mg*YglMA(Y|Az|q z2#G6R@Y|I2hR0Nw{m68E!_S9S9DFEgk+ZJl``7P3#rq=TAMh0~*1Kyi*YaYkW4htY zlDOYRf9icc1{=)Y@<Z%b)!)U6%j@g^TzatLddmK?p3n9Fb5Dz&-zB|7tU%~H%lG7Y z?^xDNdvZjv<9Wn|wu0~pQ5ROekqk3GtKP`|ZU4^H2X7xend4aSbmF;OKK)#uVD<Yy zAH-jNyJ*qn-Ji~PU*6_EttKmF`-7}2${*G{axaPUT0H;7k|}-~hVz4kd_=Z1mf6kb z{9$Nt=gUj+D?RSlW+~U3D&OB+6=eTXF3a88Y<XW0FMpo>eMxZ%eZLQ16EFX`SP-;8 zYNu51uXW#F2QIjrkQF{zZ(iRspMKZiFON=K<Y8Se&)d1Vz54iLt7B@aZrmroJndxc zSB#P4>G#t+d+^oFN0SnG`FnNC#H9B%E`7z>f44+QrG4$reLaDSyO(~5uK%0-LEn+- z_d3DE`)lu(Ri@m$8h>N@kLA5*<>t>TUY5&$)ute8SH&HM&)WpzW2e7zv$~UMXHm36 ziG3RTyeTq=qV8mHs{OXPn0$Rx(aep}PM;eOUORZDu3Ms_@5ZavxB1Fkb@DSB*^djI zJj5*H{p7C0qMaSza(GW~o5r@F<l&Pm^^z~F&R4!X_K)E@=XVj;r>|^ln=Q9*e%{*p z@x@Nx{Hgs@^i$Yg-%#FeaI8p!-ARGhNw?lc>fq%lPK$=J3+o>XrkGCka#^~`%OX2V zWb3i1d66dqZ}To+G`Be8pxM9v@HGNK8^R3bIF^68xGm#-{V&6N_J;E%HN>X7v(`S} zTNzd#C|9Jub~D?FW5Q1juch{;2Oa+vG`T#shqwKQ=a1GC-+ep1s&mXZ1k%JLT@K1K zN^>MsR>(5Bu)gKxUw+D^xpK8f>F*NHwurX+>Z5u!FIk@cJXP?2$Hn@@g)duQ1}yl$ z*z@nw{x}<9uK9H@_C(K5JD*cqV_!3kcdFcVb>7;%`s5d`42^=1pIt9xIn`97J^4fR z9SLPip{6Mf=e?WFmd#3QOn!L8Prz!r@A1W2p94&uDgMgzDf;H)vNEyo=gYe);%UWI z^V~#qC72IA6yIE|b}Rj~#5}8l#!ZrI#O5A+n!kCC=s7JNd0UGI$)$4~^`)8mKF_SG z+q?gMx&fE=*#q@lZw232%{@7LF=NAR`@8?7f7Jeny})d>w$r4QVeMl9R*?>kRhK6_ zmfUXM>T{TLZERR}g3Fbwd-E@cF}M`OD~j{&n!D)isTEs%l~+|4`kZ#y^;Wg(+ucB! z>ASO5oj&~Dey;Vh&)?*^t4qI02d_R`aj;<i?YVo;8PxU1ee%qle6;@m(ZqC(OU(NV ziY#8fJ=>AlePjNi^@hop8Bbg7es<dJbKS9&36YAab+3G4I0PM^Z?9*$-xJ4gvt)Vn zkuOr)N@bckj=p(h#+%QW$ME5<+|6gn9%%}vmQ-E%nsq2zOUf$A?X$h)swZ2nz4ZU` zWh3{qiQ+wplM4<qo!_%j`IzJr;d=e=N38EZew=TiT5;x(x}~Uo$?f{)u#Hn)I@w*D z;>`Jks#qA+)Du_VOi9W6q_AR_&-U1u#C$Uz-&Hr-PJejCd+^ovk0ldp%d_hiR>@4y zS<>-A!`#tbiCg)Dv*g{W`Y(@9$k<h<XEL>?Oi%2a_nKIXLsQRB(|fkl<BLCM-It_# zy<f&6Y(@bd??lR@ExHu1WgiagSKG+sr?4Y=r(U|ni;$R8ew#L37T4Xp=*-nEej-{v z2cojwRHr|jzb9(Wg^eqN7p?7_SKZ~bEx#&A<KBe1LZ-&$8>jTezOtND>@qFW@bVX3 z^Qx|=jiE0-{A)b0V8y2x<+*+<;yG*EPc4?vXsQnkx-Pe_U8liOpscGk#!Pal0{<<$ zerfeck75(9vfp3NPxWr@y_8WIvgP8Dmmy_m-=$c7?E04X;@OW)*H5Xh*3fG&H)7d( zqQ(8dTmG--6`BuL|KC?U*-gW5!#tLwQ}wRel$oV1_&r(d^NRH3jJiJk=*X6L$&&N9 zcUpaTb+X}qy>D>$O{bz8)2fc$5^7nYJ~eMG@44RF-Qq>=B8!_BFIPJ8aN29bV)bX` z-fhPc!uqCbynb|AZR_pX_vKpSkKJ^hSF?OBKfBGQBSNh|H~J>F3R*17XPO;zO;IT{ zmTR|g@aenjZ-|O6Np1JK_2|j2F1HSr|NlRn6wQCNHsfvQN*(R`CujUlAN}wuO>67< zi`gQ)A|i(zPaiq-)N|Jp$pWdYhX)UIO|qM1v#>m>XY;hGlBL%zUA3D8`aO;}o1{*X zb!0erpiClAgP+SHOYMuwVzp;Jx2E67+xX{NM*U{JEFq>T7xT8SpZoRvtUZA}Do11N z=Ud+5xLp-iaVt%>@-9cs@dxz>rmDZ;Twb#6P1ozED}$3w>oQamO8(9a4v)^Q{`D^` zUa-d7=Ikz+jXp)X>&p7o9`erF&+Z_!B${*kSuaPC^h_>?D}sty<@Uzcg50HN^jWW& za?47fZ?)yEd*R1!B!u)WuUh4lb&BQ3gNNl?{CDZw%#CSXJ#p6g``MD#(GtAd>R<7m z-a9ktz3`)%XG8wxO526mKbd6nv1O-W%3EIPzkjzqIPqj(_2QX{g-0gZMX(BlJh**e z`i1L_tu^laiW%=GX;x47dRwC!S9|bIdgtrIV)^k}ef#ueI4ost)%O3-2$Az-=J@qs z@&ogW%NtoXsFryy<n(!db>|ed)xVr}Mh7R=f1f$ARX9R+t8prioo0Yuv(63OJLis^ zo2asJk64;J!(KL(jq?uYElQu+n;{>2(s#+L9olQ6H|JcN<6_75HD&Q8pNr-3N7|lW zlwW!8d!W|;##fItR<A#3f5G)m`E`->{_Apf#!>xSt~>V}oM#>(=d<+w-(8pQ?YsAI z;>(Y3{I3137mIlw@WIN-Y!lzQ*`=qppY-`Y%RBpnuDG;V`5L*ZKhK_&G@72<ZIgLZ z(8+(kPqoYOqA%CJd<i->QTm#6@3*^iev1km@Gt+cVZ(Gj?YrtppVwureQJ^Cb?N+v z%P!C2+~0G4PRdDH^QPF6$9t(`R?m`y_4Oye%f9+3{Y3H5vf_31LYpO~ui5yUkx6;R z=NpFNy-haHY<{+I3!dA2U3OXR+T!e7&#mX@@`O)%cx`t3V(H?;RmVT>Qh!rkyHnE9 z>F32u4_y^C3j7!Bbe*|W=;XZTy2-C!+Pwa*@^0V7PrYsLZ6qX%tu`I&-2Fb@TT&+f zSD#&^WyG7pWqV$IueLuV^kYW-tcSaLcMDCps`|$5+T1(NM-}zj58cTA_bKl*tJZAE zCF{c2+0Muo+vk5fe<nKYU6JLiISHRU)7S)8*62weyOV4X*E{8(xcvXSo9cFnJS{HY zdibQ+CeBF@CU>gE+!lPr^vfVZF(-EI6VauyeT(+KTbZa>lD*90NtykFTd#kqr#aXA zq;BVYQl>vOAuTCZu0H)!$BqyGYg08}FFH5#!oKV4rZQLk&al0=;P=lvGk$6=H8{|> zc4Ntt$u~3l?@!!cuw>5DB_75fx!-q(U1(3AeU-WMQT?1BkFVD%DsGZqVRLDF$>Tc* zZijE;b3Yor!_NKprC<A2nb<aoH7Rb~W-q+o*u<v(_WD0X(G%3aSv;(<zrC-+>>~Gq z&Zhzf!nGP(=lZ+tnp*!hI?TP$-NZ6${f0F&FRlCj?@mUf?7X#Srvz==c(ZD4dg6;q zSCr2#yn6O{`*NA8>G52fpU+CokKbvc!`-A=WjNXFz~&QnH>R&vJ^U%*YQpQ&y*V## z6uo^hd9(ZGwFlSKyUMNYHH#8%Km9Z0P)o7ThyTni7CSbBHo-73FvK%-F))Mo05LJh zFz7IpGcYhL<DL!{VPFu0!cc}Oj0udbjH?+hF{v?yG1W88WID)nlUb5Ejd>4?E=wNE zMb-$`sjTnWlGv88Jz!^JFJOPgv6xekvxTdknQJw7Fb^kBD=!Q0CB6dwet|?m10fY* z0pb55O`=?)^<oa<HsTi~>Lep2TO`*@9+8rfijnG<x-Bg#-6(xuMolJ5X0@z<tefm! zIYv2SxlXx5@^bRM@>dlU6-pI;DMlzRQT(O&OG#eIM`?o6d1Yqh0Octv5-P>uO-_vU z3=GFIvLDCu+k9o<W_|(k*=_xmS7G%37ytQKZZJJ%U}WH6U;>FUFjU-1`f)Vj2m?#c zK8Hu*6Z%p$7`8a@Ro-oIl=*LK{QvryZMnC%<<4K|Tef=3E2g>1x6MzyzH_<d=yzka zxDS)9ALy1Xymes0g{4LhPwnlf7rCin6q6z>dhqq+f`j1&qW?IKIXzf@-+x218_Sj( zFAc)IKRjT%A?YLN$$sKN@{P~-DHrW}Dg<xFFkLW_$#A;AQPSt8#J4u#h|kiye;lng zsGR;=>3iUrXB(!^`hV&8sR9Oey(Z=PhbD$4ED?!m-9JU&HakFLQ_R~%O`o=eEibCS z&v3^hYbEnkE%qfvUwe<t4H1m0bo>*XkmbaG^_94mYwN8e`M;K)zpBBc!Ee7pY@$s! z$Ipx98<Ve2+jp3`LA-@Ca7wd_DVzCK{o<|(N~L8rEZSBV``7<V@^fOSxRsocl8{jK zYkt3C*VAAB#s9}|xWmx3ps9l4pd^PWNPcp;uVMZ1IcK>3>q;z|G0&(bC?VlRe=^&v zf5%FC8yPiDb1-;K5()!_x=g35B$I<cYrTx$j@@ksRyJO4FwWF)l!#F~k-T5Fl8dEL zU_!CP2bpIaQ#^L6__YfPr>(hB^yrRO^bsMU3rP=Vvr6-=(~LauXp)co-mjN}`R|te z^m+Zi^)yc#)7fK;4CPnkb~7++UhXHvR^RHt!QwOf|NYdcvlXBJPyWy5v&f^ymqVUG zF^X>$$T3L?2@g^<k`mGqQXaBw5@$4QIeS8Z^@-yRA08Q=YK0tymxl^iPNgLVBtB`_ z6e+nxqI5xynMz^YG95Q_joJMNTPm3sm~OgpR)H;P!};GLJEzW^IdkXsSLx4=ZhyaA zv))*1mTdZy8<FnWSu0kuT%W|Hb!vL>cB5Ad`?F@4E@pIAo^n`!d0*k{H|G+j&A9T? z@~iPpLmQ3v+NocT$xmHA^X);;nXkCkOxdJy&0;^h9eez1x7jO}hB#_7tbG*Fy4`cV z@nU0LjdZ@|vip&*l3N?yd*2u6O-(+3fA)Om`U_cq>f1HH{a0`=F<F1&nnLB0CyV2k z9e?w-erw11|4;v3+NhKqc-}&P&hMuOb#CsR<Cj>Xvpm4^$GeZEbNHq{DtUKVTyn~B zEBDn)&UIf-UtpsV#3iToy+>>Am5}uGz86<s-eEkmwx`-{(eE$HMoqt+D*v}Kz1&~< zQjoW+s&Mo4eSVs)^&y>=UYYyO%zHY?=(y-yjx#x8y7xM+vhZ)TTJf>$P3;GT)@#X^ zobS{G|K4v|%<Xnz)su=_NeM{|&HvBxxbfU@un{n33T2GyN<Y%Eh=HMD^F8_7+j4K4 z{oZl<>ZHf5`LjGdygHwpn5rJ%=;YcpRU>p+OsiMus;etPm&Y}$>E0^d^7_I`@9lDX ze|?cQ$T+b<aPhI8*#?=Xwn%P%b|!j5%FS7&(q_3gw<TYnSIf>PYgzW_%FJSMz1W>) zkFU-B9dW1qe1y`po~21IBh;q#y3YK*{rJL#PZ!?5?%v*ZSoz__4-pkMHlp+Xv2Dyz O`Om<}!1(_^13v&0HV{Do delta 21207 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Ⓢ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 Zcxhe0EnWsrHJwCIb->8L`2RlxKLCzgr)>ZL 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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 GSQ!Ah5*k?m literal 20360 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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 9aa5f674daddca531e771b400501317fe476a722..413322824e3a08e33435d4247166da724ab2ecc6 100644 GIT binary patch literal 23904 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 literal 34352 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 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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�k>or Q_!!iUK*bN^|Njj90OkN7&j0`b delta 20685 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≪-aC_Hw;@k*_9a96P)< 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 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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 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 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 delta 2790 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 SptLKLb_10TjQ{^L@B;uZs0HW% 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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 Gzz+a61=XAY delta 33849 zcmew`k*Q-UQ+>I=n;Qco0|Ns?R|f+hh<;lD;e*(y*gsg`h=HN%4g&*27y|=Cg4@fa zoaEfZ0tSX^69xvR?F<YoUS<{tFC~|iC@?TI|6pKX&|_d=uwvTAzdNlUJ(q!@_6-9A zYc~S}_w*Ygw?CvO7S|UrFmyFAFfedHu|RrGWf}tmqYDE=$p!|7V_7WHZ^ScF6H^!% zDts6i7|cLetfaI%BO^7DfuU*-0|SEs0|SE!7c=|MjNFn628N0j1_mZG1_qW4lNa{l zIr+(n3=Cx=5HTh*uK@8=xrr483=E}T7#QloniZHlc&hReb5j`@S~M6Kn6@x5upPJ) zV(_sbzqo{fq3sR>1M?yV26lCKsTceOMX3c049yh`3=DOkV4KwQ=Tyb5Db=hM(eBs2 zS*E{>nNXq{`!cRERp9itoYP`bsYg9!j+ZUSymY1TmPzTU%vWl$_l$In^QYf_`nG=a zhd0O1oH=vmG*9Tinc6d_?R&re*0V!BB@b+$?@3Q%Vo7EA!CTbO$o4Bel(q3#x9I95 zQLV6Lf2MIiHL^Vaw_MVml_k4j#RYvQiC>D>y<T@ToNnNF&G29igJ3lKu|GLi&+#u8 zH4Wnle?7HGMXE68Qi$)_CES&h&MQ6YoON!!Z~c->$yV1mcMA1sUpdfOvn(V^ZuxUn z_aM$??6=m3NlaY!;OX;!>gIk+bMp4EuvFUg{CBozt2JO|UK__c@dKB;Qban3z=Eqm zCc$0HLbooLC`v8J(QNqfH)?C(^!ZiGv{+aDKe7Gi#+aRXN5c2Yt$)e;Ma4Jh0*CA7 z`oGTeF24z?|9Rty!?!zY-kF+S{qT)%I<K^7@}qVe_NHrBE6es@cxqO`DU+%DeHP0O z{?guQqDmiT9|?V6&R(;miuY1UsP%aP!wrudWBFgM4u7}v^|xsAb8F^W6_%71*4vdU zgr5!nyl}xS^)>fBOlMswFby%?9aK2=_Rgt&7q|4Jt**|y+PA*G#qiM8GvDv*Qd_m- zepJ566Wi&@yY648z1OwqY)?|xo;u?tGJ9XzTrO(vN;^4QIxoa&;_dukCBdo}iG@E; zg=^$!oHx0>#qUnZzG7K3XZ5@tic)`VSxxny#~qWa((p3;7<ESI|9iWm*3FFh@3r42 zrJa!fr&g(~UlU?@c-an-_<Hegi#oNtU3|7XKf3k%#9^I;pCuuguWvPTEj+%>XR_<( zgAT_GIQG`P^0{5b=2P*)e1q@&cI5)8bB8}(n^>4~>ZJ2;$@JIlmwA3>P2mW2bEuIN zSr)@~ZbIQ57L~RVPgf?l0#1f^tjA=wRXx5rFCZ!B#5ER&;%%!eXGW>bKlwbnKGtGY zRFt>7QsBpxQ?j=@#odbCwJvD2h3L;1zEe52`B#pH9-AmU<JFBvrCY*yLqD@F4-%6* z{%vjgESG)B&x=<!I^~BbKVd63s<nzrSHI*Pd{ZL()4~gHw@vbIV{*&)KeAw6il=Se z?7r~xnHMX+%{!@hNy&EMew+IB+oKfk>mIKUZgr}+Sw89A(?0+GMUfl%r>FDZdGuqo zXsGwx?T1z-27M{en|8HBsqb6#v%9Nh?&rvF`>QIPzh~pwK7Z-@b=9%~3HPtwPx#Kw z-G7)VhI{*gmDf6DRvi(%A;IOZukEqGD9F5lF@wj<f%%H*9R^vOxVy!SDoTFM*H2&P zHEfo*t}j3QGT1$w{qxR)CEEgge!AE!@NsBeAzP?&;c2hQj-K|uxlgD5W_#lOQEkro zC8pQseM(&$bz-s1p7d|uc^A5$dMdm+&gHL9(t#_}`mP=4=M(jtyM3{~oeak;v5Up_ z=S$=5?>;bAnsz_`D0@<86MMdFyp6?_x95KTw0-|#kNru``cN<NxOkI`)yG%%{;GH% z)3A;^dfB2+&t=wqeLbhHHECmXUhmOK&F<&LY~G6Zp1-=j+PVDDk9p+>68^lpeuHu1 z+5UsP1>$$^SS?qOc->L(gTe5QLy~3)%L3n&3JD1zqgyP81Fk!U&K2cNef0emi-5?^ z4v)y^D>MXCMISty?KiJp;C}U+7ZY!u%+a$J@%zbgE^yY0M=2)unX|Gt?Aj2qR%z|a zs$*x3qAhn^+q=sAR4L~VzrJfKTaLbVTNbur*Rtuy#QkUJ?vFj@99P4CH|K8QTz}i? zGG4w*nwY<O{cl-l=4pL-&(CEmo_{&^ad-2T$I&Z{rm6h@>dUp#HZ1Fg=lrnxA1CI< zo&Vxh^l|wl&dVpNSE^S$d*7|ho^|i_a}n7}`+q#iXD{8!FcuD(bFkt>x`FG*DN&E@ zw(h&}WoC2aYO|JEb#HF9+_XtlkUGemyfY=YvvU2;<Jms(dZzI+GBp|}-78MHR`2`! zc-pi{zaGi1nw}Zy5OM7A30Kn>Q%iNbRJ7~Y=;SG6OYc~kyJbRJR*8S?<b;y7Vfk0? z9NPLuY{iR*4X14D&hO*cWc&5yo1XI@et*5>dG-8G9p{FE+o8Pj0){u(H%=3NbEV8- z2Tw=2i?U?U+@y$_dh!34-W|+SN%^#Hy<U|5K0|?&s0CN5zc{bhnDF43c(jba?XTyb zm%PYY5LI7!H-2mVW9K6_J+taRW-N?i6xkVi`0}Ih;0yP?1em;P8TEyk?lcN;I&%g4 zZ0){S!Y&@R;eumZga1yY8AqmB+?pv@U;pFV^W%H!nmqz%{{Fn@`M;!x(Tu7S-qac^ zMdiQ#$|};lSY$zv?w@zU%C-s${i%OuO-Kq%DSzx>xKvxEo+a{U%KMM6qs<r$5|nH@ z0up2{F1hNmnw>#%j@b9E*-y-$Y$&z-bR+7tgmh0Y@2)S(d!DK-kFLCX=c3^4uh9n! zPfiF~xh*u~>50BT>ys;|{eQpYEsw=_ja_mt`}eVAZgaiJc>KbY>N!smKC$m#5YP4X z$l-Ic6_X;4z5L#DL-5nrddo~V^^bh&S1t?xQhXn?|IYbmFI*?Id1cR0Y-;XV(aquJ zvq3krKlqZ|mSqZxvM19vTi%}Jl^nb1h-azf(Xf4Mu3G(BIB`|z$G^W8IPTEVIADB! zLSj2_)w7ow9gh=tJ-G4bC4WiQ5B7P_9&Xs-e7MZyTjO%aV<)bv3DxjS63BP0XK1+A zcw#?OhhmH_@2-m%3v|EleW>`uQ|;}oik(yB`_z>?HRZ#3_b>d>o*N`-r26EE_wrAV zSDrcKQ@JqZgn?pxqFXoH%s4g&gNMyGj&K-sMliTourlm$>u7MdO4vA~W15@p(-{^Y z51#eaG*+nbJ(1(MLv+gH>x>usSF^TX>8PKw?c&t!+V6@M#v5h@8eh$3nRKx+m^s;s z@8-vQfz5{uuiLLW?b(#D_0R3XD36o*&Yi}-szs)`R~YLfxBpc<(*MWp1jo!om70!! zr?%C){hn6#K0@P(`AuU7gQ~BuQ!Zv7XbgNYnSnh?q2cTd?Oc}d_O52nldm@h8*Tp^ zHFb}E{i|omp_7kZSli~Ly*;h!PvzfWzVkkNpI%O0_~FLZ&42d&s9AX4EFfHc)7N<l ziiTCZYX278s5txR^Za@H{(g9Nb5~cn-#1J4cl!I+&d}-mdS|Wv@%NtoUZMTW51zl= zD$pLaI%n~rLdhM6^qZM_M7Awd5?u3A%80>!4O7R&LhHGw>Z7KmuINnCnt#P;tJm6D zf;(5MsgzEhl^QDZ=eWo3<2j!LXT@w<qaMEZUx!n_@wGpnrmuar<Xz~k`uqQWt10*} z3W!ge)o!dk|4XOJM5YHl%(q$Gj^wej@SQMk@UUd=dKB(*%;UY(VaeEEjLk03Bzm8? zbIm=Y_}O_o$GaQRHCxuz7rtIpcB<OFW%B7gs*Eo`2pax4-#zo=3b~G$4Bcz#>|Mc~ zwR^RDuVwojUc5n#t!7QF?xnNSn;$Ele|U3))qx73+dCg6EKpAu_X^VqkGx?&Rf79` zPeIs{6}?=$p9_UQvhB&eBc6BV*RS-jfMAJYhJa0+pSb7i99(#<v3A8uxsdt_F3F9l z7edx$)d+hea&dlT4B@@P`(S}UcudXQw-2<<pNOy(FWs{4+q+k?TXpZoR`0l0@cES4 zOQD&YCcHCvxTzxg{j7zP6F(ncFJt|4kAkh3#XRqo57qPbmfsh+n4xEHw&MFY{&(E3 zAJ(mo2?#ykAoeB5Y`RXLh?ero62bk259*)1nWDZWGHlMri9ss6N=oiu2&u}kF_(MV z^=@vLpRbvYY-hW(l;E#v*~+amVo&plHY#vB{QY7j(V!!fqq{`uh-l2W1t$s?6g=H@ zU18m#mP3_iS=YF~XEM`VrndQH&kU=C$cb$Yxu?{1CQb74e6TF5_m|Do)3G5IO(C8C zxu&hEch$_X{r7Cb&YS<f``0wB>`Gcy*lHXV9sPT?x$Hib1vSo}_5TY=POA8+Ua$22 z!q3jl8iu+yCtBJ453F6=8+ql5rOH}<$w-bKWv2LZ%JHvUq?8rdX0tH~Jx~pBxGEC5 zsVGS*mtoO9zC|i8S96^9W*1X?z4YRvfPDWeA72zO`PWytxaOC1Eqr}M?WE5{{T(mf z9=Nx*N$AI?zj>>ak6H9NIDTI!b9e33{$*|2J>tt&{k79qe7Vo#)sGEnKNinPnX4vd zQS#|VpuV}t;}hJ6YUgd~YSEfHYrD;tXWGm+AJ#4l{B!+b$X%z@1@~pn@jlzrS~vf$ zfr$R^7r#8)jtKAVGOri-ayP@!%(V4{LE-zIz16(MTC+RUx*4{}a;o0o&;PTAJydUI zi@QoEk4D3S2Wkcku4aZDF;gWSLhnk62_8v$I=N3`*6)1_=j`^h*s-bl!~d7s*RMs* zTNsm9SfH}B^G*A@-ly&clkTRvpUpWQ@O|cKR};g1#x|FFx7Wzszag(#|Aqfn-BiOg z^+z+O`>9t4-^_j%Z({wkP2J#xKHrO-DfbPmZdM$UHz~Q2+#43)?6-QEsGiF6wq&1| zhG(U{-Cwa!e);cfaDM$|_1X#}F<;(ilaJb${aNU-sy^@PI#FePi#e>@AJz6Ady%Pe zP<j4Sj+WDNugqqcq_HP9s!3!ILr?uoZ5c)-g|(JiZC}dT4m{(RQI0cijs17e@b2|P zRbo!N%(J2$=QFD6tYq4~=kTRFelD~8zP$e$ur;W#`hAhhjrEtWW!&X=+SG7w_u0ic zkH4-;Gc~j|NT^WzvgJjGymHli!!!dIuBvt;#>ck#9CH;zuC`7%q>{zEPSa(h#AExk zdcC{%>o+X(V|e}Ojp>ADqc_bLuYHI(b$*7y>9D(D1<MP#FMbRC-Yb?o(WJbyX8R(S z-M&+$V|L$K-}Yzn?x)d<TzPn=-`$<JTiQ~7@5azCd{6r|@60jXlk6*3@!-x&@mq4r zyVg`syI@@!<$rfgvXlLje7)x%{w{Gl))!E?rOzg!-a>NwE6a6X=d5jie0upasf|9H z()S(M`s?IH?V~3{rDyNm7L^e%CwcnogPSK#yeSdRh<+@%@O{bZhpy{{nw(BAP*|W8 z<G!G%NV_|QRZrEPyT|p$s{lRg2#vH929un#M>qbs(qa^SCFIWgG}F6FCDclKcQspc zo|^k%daFy8itM-gBbG(W)#Gl2@0oi4f<@4k_-Kwj+e+VDxLLEQ-e8IZ|H@#;Wm&EJ zoK#j+#m{;D@fcI%o9;tV{V%<J?AOK5JD2pvcJuN7uR{JE_;a9uaq-fdTF(F7R#cdX z_y-+$+|N|HL-`-i3<HJTht`T-fACK9y3>*e>vpuQ+FiNi+uuD!O2K{gJJ%Ey<mewg z(#)<E+xByF^-VR;W4!lER3(}}UV9;+HN{0uXTQ5xYV4*Nq6s=j!j8Ko&2*YoKi?zk z`MToQYI9~SG2;C`S&+HRJL1&O-o~8NBVQ{1oG_iXy+%g!)#-Oa-{hyM&3K-W`fp$2 z`iIvi2o}wK>RxT+!`d=?U0u)Di(K_zoVTPNFaPDuup`+-<))E%rQYPzWexMshHdlW zeJ<$Q=@v0R_0`+?dH+R>d06=$F|9h2FX{Dr{jGZ0Lprza%=i-dzNSmk?sCAqD(hCC z`3v{F3Y`~jcZ!#xN$k$qXCIzEXqK1~rOd#k#5j*VsmIS#d|hG6k-iyf4U)#m+f<MJ zs$aFLCpdgX$nyS2x6QYeS!EUP;mr?rn)v)!>x8@6Hjg;1tI~gdmghNcHsNKZ{+mtC z{cobSynns9neoNJd4BWX{^NPZebev1WMjs4IsRFSvoG!w-@EefXCLmLyj4MlJlFoM z{C0lMrZWrr4Qy&($acLm*3J1pEs4W=!}5EaEWa5(*1vy|zJTd-Kz^vx+)&<xBMmWO z9;cSBRXZHX==$*Wft~Z$r*$t4vU{QTsC>z-moM-1@7l@}{+{K9SYyE*jkKU2d6Lyt z+Z>+FZI2I>i<lwfA<^Lx!+D!a{mH_#9v|ZgUe=jQ8mH`Lop^fs2kq7+OS|NK`?j$K zw}#An`rD?b<7ZHP^2BVuBgd1<W)!bm*>UZHLv>np^`Y3y|IKDEp5GQ+5Vvm4-2Lw? zn4MqbR2)b?pk^>NM6Kld(Y5bxe)z><5+b=moZ;ftdpG%3?AWArr~L7)m&vQ!`M1vc zdg?<$zQ4wc@2j}x9133cA#&ZGqrcyJELGa{{ob|hv#;!aR-C)}uiE3d`cn5DKi6NH zspIgpF10=7vc8%9zh~uhZNAOi{$l-p^Lb~rqypa`pKp6@&s)XGC&J}xzq_5?^S-(E z+L<1q2suaAz}}uI`8D(8-JiYdm$=^h?U%0KihVgNZc59`zLlII_3z2$^?x7y+IT$v zZ(M1B`nrjSYS|C%&EJ3hzA*p2eHQzB>YsJ%O%Y#T-za|hM8H?e?Q<?wub;cGt;yS} z`bFTi{+pdIj;!za-;f~CaQ2e_L5V8~@vC3D%S${l&SN_^N3?&P!O0E2>l+ML>7AU` zr*-w%>ZD^gUIZx4-xPH1-;5vi4sUO#-8!^xp>Cf@QBL4}<J<Y4TAS`jPvlSCd1eJ4 z-z@zd^+)qVR^NZ(^Yo(K-1^N?U)$pTo||B4_2{GPIyWT?qpDBWvS#KbuJQB`7xhcg zIKP*3rRKZ@|NkkA71!Cf^V@xhWl9KOSfGDt^Mt0r43D!+D^~8{(aP|-dak%xg!P&r z;~7y|$;GA$pDt@POeoxAVKPHJIQV4azm}<=I&#F<l^WJx=v6w&SoW?ZNo@To4I$pv z3)WGhUQwS`edzz6HfPs){}*S|#V^|1%NYvadlWr&_5EEP?`2PAna{H=Tw56Y=!<Om zojr+bE~g3q%<}G!c;!-m$?4OwHxDjE#6R=n-st(X+ADa@zMho-FKY#J>RC_TOsdHJ z<(YA6pWFlyr&QsTs``ZK4H?<9CmNbNDb<v&G7OYDvz%>_U)0^RSx4-`w;OLV-F{++ zy!g3;8QZ^k@7e8e|JZ-0AO7}LIR|?Rqn2_Mx`<9SbamD>E$UtVJhc1kuSct^ze*qb zZEALA3v+th&x!W@!gjxo@uz%Mn6I8REB%k?Z;s9#%OkBsmSlh1`akb}y{SZumT!fq z($V@~2WF<<OK?wixU@dU>BrSJ9g*nfF0Y=QTwZZrTejM;Oz1eSlr$yR^PAk%f4ARm zSa<r9<jbY9(>}fbzqn@O!{|@nb??9ayS{#Z$Kzk89&I$P?QRx6Q$D$b@7sUZ)JGGI zAKoZAP|ESBcz=6VLdh@P&wJDJnMw-lzaRgSxZ=>vYndMu7O<N&8Yj&$tK~RgVQ@2d zLQ~1T?p=9n8WU$|OKEjgiG^HUzfLJct&M&2%q`ppB93tVsGW66bVX9=GhLC=_>TE2 zPl~8EhP`_cP#AJ)&XnI;s^wc*_KGQ6?KtwdSouoMq|4c&liJPBEoIm7pWOB1j<UG^ zrMvZ44$tzKx08AAa<Pw!r~KP**9*!?nOSVxFMTe(-=rh(w|%E+=8}~w{x8<z`q>|! ztnvTq)t}5x&l7j@bH`jSS(n?yCg=S5M6X(N$>Tj;J(}4IG@f;d-(B+Pc4WF#+rxzi zo%H5%E&mkh{q60)*qbTtvtLa!ni?x6P|jC(<lmLxzIy+RBIfSR%igV=GU<7At?}VC zH&YH9*ZOagJ=r^PX65>SyjniD-tOO^&i$n~O}%U1xxNk!D@N_Ls_dP<iw-e5CZ2Zi zNnMhcwc^zY(W&$A2babEaZUL8;nKpN&+feO*=rSbX4&~AJQK}}^7g(E6Y`vR$D_Nh zenIZn4`nIU?d~h|>h+&q>hV}G_mT3ki>KA(YtH9RUmTLVuiz)gXYK3Ts(4b%->f_{ zLteATZqtl+uf6r{>@3zldd;+V{s-SLe3oab=U6<x*LvW_lTV%HH!j}xkJC^wkT=Ni z*D<Pom1DAJ%FeehZyS04<qXp{msB##x0FnFsdYR4{>_?>qe5%8uVa_3KeVL%{Oq=4 zOP1Hh^`F{VvR(Gm?ogFS5eFGoMce5+X6BSE(U6`0-f8dpaF?|kx>y>zn_k3;gzU0T zWO`(6e$B6NW6&eE`1JjcS8ix%(*JYCI_JLYnV2u7^Gp8c{D14p*}h3f_Wx)5Pyf&V zofqx)<(v8J1_Aa1<vT3X7MU*Fxg)gR(lhkSxu(e*n`34s?z$8e7k=x>cMfgWs?r^Q zxwlpR+?2WhyX`0c@6UJJ>ug-!%_AqU--79BSf{`puhs^w9IXzI*F2qPL>V5WTWi_` zZHUXayqOn&&GVe~gq3d+(v}CVzQ*cUzwQ3*Y<UjtAFmu9Deo)1tS|6zC)?D0pM@{? z_tjfJZT<8##{T29`upqawm$x_{_m-rgsu1Ibc=rp**N3XufIzsl-bY8o0}tgs7FHY zcggklujBeJeyu)X6ubZS!-NC-AAkS5p+52clruY?c7D9HqM){Dfx6u0?KSWIB+QR) zn)jBMV`1d3`D_{dI~Vk<$~^adu|wsrzwCP#s`sR<IPPD6Ywq{EPaWs2=&?5o`_vNm z>6x7I?1S-6)<%1pd%oFU%#Ocnc(8S|oNax<!^<xgwFGQFbTdAy%=rG|LqfIz8L6Qq z)k3Wj#@4s@WIxcF`)b9sNvk)Xm~$m=?=Ica#ZLWvHs4P>B|Km0Z}m_8c=oH83+wdF zHm?8s{*+nFg$Rkg3!LhoZ=V|X@wVxXZKXEdYTODlxA3Sbr`@~fxm{+d@}Ib~r7i{! zK1*0-MbBH|xHd{qPou2KzhlORJM}UAIm_cbs}H@C%T&I~xn1wr%r`10TE$Z@y|X*8 z<^Sip$B$gU6xeRu7CAH8`-RpkC(YG=)2DT~YVWx5eZ?Yc!N1XQw>Fv1|5v~F+tuH3 zf2%LoSPLzF@uc{De8&HYi(Z#3`aAWT`0NeZk9nL|n}$1dS~pK_nY(Uf&hBk%W`F8A zHSf_RAqnAGt}#77ziYf$H_iFVSI^_Bj=pb~<sK``{CeZDmGYhzao+FqW~k?ApGo@v zwLI2W<k+q54*y*re*XO?uQAIhL;FVezUTG(F0&M6``G_wIg)rKcH#}ibZc+FW~CE% zj1%szd;D8kXkTqvQu~zJpGSO!_o>g{Ccx~T_dDa@?<dBNUOkWWujlVwYPTpt-$S)3 zNPmM!)ma0!d*55sXMem?|AvWee$|z}_|5;l9^Tm4ynda!ecXo%E_wfJ@w~FjT<bM* z?s6*|)L&iI%s7W<-@?Tv+oO+P^)tJ3Q~%VGNq>`S)|=WWetZ`yT&=WoPrFgK0`GI~ z>L1g2Zk69s%J~20IN#U(Mz1Aj>{$MPTCuqIuZvTk246JXzjEc#zNMaT_s;OS;x;{} z@BfV@-W_l2-LKvjpFg+z`!|MS|MsUXOQj2B=QMxc#^laFp?=|XfgUL#gN<xa0^D<i z<vup>D0qgKIA4DHYyIlE1)Yf{pYm!_vjr_%lCEz4w)mOA&!;ZsrJ9?n??q`h7QAcw zy7lVQnJcp_XZKl^oyc}zmX6yl+-vcwY~8eZdOhzyR_@&>%{%LL<;06OzeVynYMqK+ zTW4}<tH$Z>?~DFxZQc-Gzc^;T=+_qhv@-@qM;xkj?l*dVi=D14`{7If{kOd?Ogj(X z`!5kcQ={+uk~S@=tb19zBEK!VZ@l=&x)~?$x#gNX*{-!*$!;#+H<=)x)`h!RmwoM? z$9Kd}X5Z>V)qAV@-z|I^vuFLT4=;}Wm0UOLV8s7D^1kOUMXR~VWwi@;`glF6_noua zQu)I+{=UOeuXky@vWsLby%d_5CI4cT|NRf|7My>v!K1(1E;B1vwk6S|@$lhxvG0fN zE`B|0o_>1i!h=3qS07IKxVPdCt9#<Dcgww(9reDh9Q|eO10jF!rfnX1lfx(Te-wSV zeZTLuneqR+uPCz{z0gft7P#~;W9#dzj5~ex!bPbr4@0yy&RtgRKX&!OjQ<C|9Nm5C z`m=O?nbLKky?LKLtQW~nELFOmt-RRhw9NeNtN!*K*t2R@t0!-C<A$qQZE8(_v`k+9 zx)J*1-{pyg+S{%&o3U2gYF6Lv__97_?Hs}TEPOqO*G*LtWsFgFdm?mlqw?qCqYHCx z@g4HCS-G=5;mtPZpSmx0E_fBCn)H5w$>g$$;+-}Ai%#uWvdua=%1G$o)?;rbeTv(* z;oVkqvC_Hs?_8=9Qi;?SOz&Hp@nUDeBAaN52mTwcmBw+2$eUaW=gSOv&!c4fL}S*c zLtcA#-Eo%Wxm#*6b#CO7h({YOgf`CeKQ1|O!{bunWah<jUdi<@?lj$((}^u9nBp(6 z@yD&ZJ;IZc*2+x{lV)15{xZ7)dwaOuOfgQyeX-lmPL2I~=e)}Ucg7>pOm}YlPFwr* zZOD&B(GL&v-dt;u_gdAynj>r3<r=G*itTm}Ol<pNx2d_`lk53===|}feEFGMPHlUf z`N)0Ws#Wohp?gi|8d=(XpI*OdK>*{<nO^r-G40w|bYyLF@!FRPQZ1*WvrYG{-6~bA zF1Ycn(F|X2Pi0F%zGWIsH#93Q6-GPUKe}e_iEE84A17G33iO)C{`;BDrImL%+axU9 zPSSmk$9XQz`se&#xWnJAIg`2n|Lvd``~O9s-?#F*RQ;cJz4iNk>26b6a?WvaX#HDv zr<gE-X)1+N+@>E1e7Nqx-K7$SM&eVMtZx>a(ti5Z>sUzWWh0?QIqor?0n=436+WNG zJ5fh&|BdyZyH<UVuc<jKUH56_gv!4=XV>i8RQ#?g{Mxtt`fSIh{D;vIlMnrS8?RdR ze)f;->6u5?)p=J=o$%E{XDi>jGk)qKn(OYH)R(j>?}|C~T5#I6rF-(G7O>j!9q*SF zeEIxABkRoCCyyd>^zv+Tb{=|P5dKVk`R*o-%O;#YKQ!O&TCgj8^%mhglTWR-{HGKj z3Vb{E;q%v$73L1Ne${r~WL)>z<I07V?>o;1PPM4ysdq8_aUkc>smS~n6U~pEy?F7v z$!x*m=Y02T>$z=T8{PRPFH`m1@KZsMPe|CunBV#FDTWKR3i)NLzbnd=M@If$_I>~U zxEFDcsxNL0;c9q0y)wFt*|_lhyS#+A^>5iyrp>$kj_ued%kA<n*6)b(fBTm0ndg+F zw*S_pmF1aUofxUHOE~vX&aB<%I@%ZY-x2@tCObE$$M;^*cJnXwtG>6LIeghzUrP2X zTU=fIg^C}ygc<9N3-7z;znJ<cRBw01mlG2&8m@dHtRHRhuWIF|lfvg0{P}#Z`r^jx zpX7_qZrE6Pe6GeuS+<1hJ7n)Xy!I#{rhM%L*VL1@x3+ZWWpd1q-u~yAAHOBjB3?1i z;0+(zu2|>1jrCpowrv0E<mCSPXRC55UbKC<eNT_;;$8inr={zz{?2i1-JAUF>-G5g zr>mX9^=ABv6@R}!y5rCC_y03BD=$R7seiNacueoSe=F@@u4!Pn@OabW3A=f<idsed zW;?79h<mlJ_{0mBl5+OHYc9Klh!=mIzQiOj=J3OiOS;V4q!(PwT$Q8iyR&*vQK44- z%TJOkLabL_DD3-vp;_)|^L~ROMX_X&4>J!wUi~s+gMmRp;_uII&uhmW`aSipdv#ov zl3llhjg(8y|Iho((>K59WlJ&^5176>*y`hqr5AV>N!2&65>~J&2|X%PD`z5+^OWI1 z_4WxO<=mVOJQrMoo@8y2*lHE~+xh&Ry5HMx*4Lk@{mxsw;q{Y<jPoZqE;KoL^<hmp ztEotrTZ-CRCvM&S{*S$0nA<f;809YhtMGT8<h2tL+26P28=l$F`^GshEac(yGL<Pz zjKWGvyObVDDLjnhJS_V!>FE5*XJx;x+$m2kej}t{<6!lV>952O$G<%8GU7`;LSD~R zKE%JL|K4P`dNXT#`_l%#m-UZ|UvBYPBpf8W<JajcdwzZW|F>qI@+)c6=USo+O;4`o zUzYf%6_OzTCsA9#we_s1r)uA<Q@fs<t2rbdnR2@^#O>A6wXH8^*i2%4y<)QW0~6kJ zW$O}6FRncH^qkABKmTXk)cX6v)2i(Gj`Zb^H2Ae#1f{-ioS3t#e!qEAG^2Af*EHUP zEkQ30wMxpjs`hEm{ky2=K!tjF`CYj}m$h$l>Yu&oXxWp{F7)8X(v-9dY4?8Je0p2G z>$n_W?{(uuxf4s-inbJfdl>2d{KffOZPT~PYnv_qvt+ZhI@?Tjv2P*#e(7mWnpfwo z+L)2DV8YwkTBeIR>z^$X|8cRt<A}xHj0BU18i{+NrC&_n_d<Bzj<_H8jEg@sP3u=a zUZQm(#P4pI`ct-zZFwT^Z6z-2CU%CsWA9Hqb6=9<-Hxr(oDF8kzj)nwb78~E)e{!9 z=;?^*b^l7+S$(kYv}Ve}ZB3J`uLs=nE8gZ=wszK$^NV&>{F)~Iv0Z<j-2)dkwvKxL z89(N|xHywD*7u3?#fg@_OVhu8v**8Czq{=A=d`Nij>Q(I)~5Yd?p^dvRQK)WV{F3S z$7933<o>a4JgQ`~|EZ)CpQ6hmJ&w%>8XLF;lmy~#Jv+c8)}iOyWgK2xE|L51L}B(? z11G)NQXTHh%iNol#8eB9>B+A1xU}WFOm6x7`hwR-iq!gBTZ8t=yfaPvwIk2kC-{-~ z(uu~!=BD56|6kr2cJGN}&DpK$;p=%be%EjrHrudQF*|SOzh_qb!AWbj_c3P{mdb~p zKYvM{#CdA}--(W)f*;$nBs`N(AFy2WQZ~M9cF4oiYgt{*d3H_Taw;J$t0ZN`1V6XA z3(hY-Y#?1f&9LFqoaLfZqAbhQbf>JmS{Cvu=hM|y>zWVW%?pWIxY_LDf#Mze*6oVh zI)Br}%TZOAQ$o1&)<|^*Z~pZ0&k;r6({78^e*UdpdepFYUZ}{%ici1qNJ#`J3+jGv z>P%DFTrpR?`1v`{{q;pnJCgOcxUnB^+FQDKcI$`FKePiHI4kP^rLzY<jb1+IlN3|1 zgvRUzOw3c~vY(3;;da*GT30^F;gLH}&s#Z-hJFJ@Gmgv5oiju)glZ%>zAyXm?fW~< zayibry?cX#^-KC&Ek*zQo$%5`ZpV+52EX(3C9m;|F1I~(`~EeX6;;_U8&27NzPGt^ zlKF|c|DI>1Us#tNuQK?vr~aBm729(C2rWtX@Q^cYO>zHTu|F#Fzsl0$$nZz>m!w4F z@p_%)Nvm>aCbES1Uc7SK@$#<QPug}ntXS;Q!frj6c~c&r>|362v;Y2&uSZSP6*D$@ zkuuk{T=x2(d8K!vlAr4@&1rYMwUps*=%-abC++@w?BL(u6Pu>@1^LYFb7fmz&;B=O z#i@^<j=olTm}Q!tW^?(o)}|C2+X?4+Rn`<W`d^*>Ha>$%<3jyb$K)TcH!vN4sJ4U2 ze``}MW6(pDNm0*^xCE4(+ZO7`yeuPUaj@5hYO(a+L4jXN`CnDJYzth+TeV}unIGRw zT=$rY>@}9(bvbs%kuv|t?4x<M_1|NkufJ1Y_4LimZ2vd$GsI@E-|2HvoB#Ii_FvmS z3f(QO3z&EPYKp<v?7NpA-MzADZ`-sxTn=kG>Y`6CU#hyj|63dP%QNQ;S+>vLuPS`` z%b|kDj~*7@k5GPd{+rt&TdwP!g8jmhPTGDZHkGM~KHV)>FF*f!^UuXUjo;*DPb}^T zsPS<=cJEbvWox5i`iBMWHyn(jgkHZ~**UfN@WTungCMEX6<ZEnDOo5MY@Ahb;^pSG z6S_L24DHQLFN<GzUbJ<^`SkC_LjBIl*~%wRo@^AfFW)3(*Ju&DKD#pCR$|@n$;@xR zFM1_xs-JHixc*2vU&A}Wn|VTh+tvk6WZ8GnB=PQj&%#;PbnC<IVpCmww#mml)C*P3 zxRTOtsO6|NDaPrIrHib!%%&Q-8B0zc2>V!cr?u}~($dYBeLT4HTHl?!oR=y+rIhFE z!O8n>JeoB9!-B-TIH3SHG2f7BHlG^*U$TAFc&1{}oW1XB-ERJ>zq^;c;r6kq20iAi zvI>ksYfk&=Z7<@Ue#bAje&Uu(t4?c8)4e@O_4cIPqg`Fq-H&I<S$|wQ_x#I!U*5(1 zvV7~kw{Ci!uI=>Ig};LS^E5myN{tNr_wWCry((<ZANHE_=f|;2$y}DJnxOsQyPZbr z<zB|8mB)Vw&PXt_RIj)xd7*QjNQk1kNt&9j0{7{e$&BF@o24gt8(l2z4lJmj{E%07 zcG=;KGnXzEx#`V$-gsi$r^HU~FIQ(2s+j$7J<{o|Cn&wC?yO<6vOxdq7pI=e%&q3g zymv0K=E+qTacL&2&*|yM4wNab;n;qDMXbXSoq$byUQc5^^me~;Za}xvE%luN+*5Y7 zxisbPiLF`Y@#5oW|I+Vqv5y(U!g3|AY1LP$&Y6Dx*!o*sHCwfum#!*TzM|Ffuqs9J zx__rbM!~BuN7faoU6nnu%1q8dDD`)^^tGbT-o|Mbn=+S7diU;3i`9j+->d7F3%rW* z)pT^2E#dF?siVH!(v6cfLgv-$1CN>(yw;I;XtZ4Zc=5)IB9g&cajU#e^nO=POzLq> z(%NfVuPVpkt1j$kaiSu8T8pPi=DHQ3=X)AlZ@rCO_I!S`WvuG!6CQ4yG1{s=?#zYf zm)IGW)ike(uUfm7g(>-QVEWvgnDVun`o<Z>kJrWNe=}XdqqpZ!>S@-n+aLFsv3>nM zyRNOe#ocSC!ky=ueRZY6Zu`<6wlFPQXuL&rBA1}d$9j{aS94xC-#-17wd}vl?t2mY zVmTtK3ckKKvTV4|?7uPM@5Y(goDU3iW+|LLw3I{UP1mD>il+)91|prG-k#pplou0K zmM<bumUDZ{iACRDU)wa{$rTpkp!W7V3rf-pRV8FiQYS9I=WcOk&YROS7d{sk5;r;J zdi=MeOLpE4wZ$tJ*I!>3A2U%@_hDgOCX@W+^2Oc9bOkfH&npFl$?ts?sw=ffT7vhr zO_jfc&<b(;DJt98XPsEODDlVq^O`}8PrY_Nd8GK~(xwZECVVS41+-Ts%uKpi)>w5g zr16}yxRReFV^#IFmfFm!yb@d4kL4O?OO9*^cs6a@?(4$&>yKAN?scwr(v$9fF-yQr zQL8PSYul~cGCx?O-_^ZoyX$V{Xt;aH@n5|c|9w2)D=#;5N8BDw%j<KySWGrQKE@Xu z{IEFT{`KH28LzT3zk6Hr&sy=8J(tZcD%_X&^mABpUD}<k4`w9KU+WpTf-C&Yo8=2Q z_S$+(&2`Ya{7ke}xBZ!Jug?0Ku=>#Rdbh7kTazH%cE+Jzyja`N&+mw((82{L!<Kb) zRb_Af?B!y^yZFzU(gmm0qDyzAu2-zAyZ%r*{n`3>>ve0QI(AQL{rY#)jlIiaR%{4; zx$LO*ejDS-;`fhTfB16wO)DL>>ZSiDxfvY}mn+Jh&SrIDgRgOQ>EAOp+e1@Z)14Li z>a}9J8s0yR;Vd?9*?jSI+Nq^J_1n&W-Ro}kS*m#7^srTidt7G!(vl38lUuvBRrkTy zyTMbn)6@K9cv70Una`|{i%#2myPW6Zfr|9xMf+!eIkLF-<l^x8VH53^JlQqP?%2nl z2l~Eev>wzpU%%UjJzu<`-!P`?hh6Lfk11UW9Xx{dfm3FjcbwE@Q=R<tan?_XbE1}f zD;FFJNjrG@##f^^bJN#(luo(tzmB0P+|)~G+SN$WZ>x^IJ^rWk!24wZHKA%8ON&l% zCAl0bKlS_jws)*MBVt}~s#{AOxKq_~e8$l|2fnW}5YS*!v+~%%7oyO;?r!ses~LuQ zwNK0%Ii?&lFT7lT>A%lRiy5<LN~{j8OiR=e+SI}t5pbtUm2cPgte3ldzHL7~DJyQl zq~40{vtL^j9G<Uy`ef%sc{#IY$HjK{H!g5q@_Jj=Q9ezrJlFmY9{)o_t3>x|HQMdk zIi+XCADI=3?E)9)tTMSFrqb1wCn6Q{`lPvztD8lI=Y?L0)K6PoB<gcScDwNIU!|O& zkR!j{wQS%1*?}i5KU?n*zI&`}_v6|3rl&>u9xeVa*dloFxNE`Qk~!f&-OYI<bCyOQ z+j;fE-dEgBN7CNr*5+P~k@Ml2KG*N`raK8jr(b?nGTf(hU+d3wmHkFLp7HHp`SFoB zvs+rbQtMYXq1AKU{%n(oRXMZrPJL(J%=vkH{#@mnpb}WMYxB=ZA*(Vgw*Nihd^O`s z5?@T`Pr)B~24^43mMW}}zcJtS<ZE7K<@;)%#BQ&Z{AM4dmbOeSVqa3a;rVZ8T2^vi z&X~2nx?}s@57)1JW&Zr=^sSEb#~1rmO!Yn(ew}T?e#V$O%MOM~Sz^pbcX6>;WY;(T zuW!7N?X=+Q*Vaw5^^F7+G8^79w(R+Tc+yhgjpp57BvsU!j$5p^|GDI~+liDdn_PCg zZ>fGi%{M&TdrqWNc4PFZyT)^CIh$H}Cv_NJx7GZ(q4fRP8L6U4PbW;@eYwk|<6V7R zNnNRrQjqM*-RCMRmTpXT6uW*q#VCgN<QAtX0j4(fo^QTxs(Z0xA<wl{KcqU2-r2_y z`>FP?y7!!^-s->KPu~6GY}I4WAB;@;dEcsIk~ZW$zqs#XmDJ~eE8l*)$qSlgtkMxY zbui53RhIQW_59n{T1$(KWopznYVL8i*Je2Sz&tbV%=6gj%{fYKg8#Q@T@gsl-j=2E zenZ0o@nq|~cS7}#V`eWg-soKTA!2q=XA7^OY)@FSf>i9RGw05F{c3zId8oElCzmU; zqIXG5%~IXtj|(haCN)3qVT!q!^Jf(!OW})^ZU55$tkb-p5qeWY{n*CjSm)nMT8`K& zf4Y3@j_x}xtEL7q$<(x#qcd4~88*)FR%`g!Hj}Z5)vd0pa%KOKdgZMLecRUU;9j$G z-ujBOTcl@5toqW*CFr)o<AksETD{emzg}%LKfmy*T*0KU*4b`WJ2y|}{j<98rk<<S zg^5}s&#%R+yk_se;pMK#zam28<g>c6cU==RZ8q=TecOJ!>>-`|$J2H^Ew;6_)_WH5 z?c0~q&);A2Rvf?jfOWRQCBrvG^)6q|%s9Pw@u8EF)>_J}ZrL6I7n0UFAJ1q`uYStH z%Hn9L6xg)$?ZL0+Px72U)j3WRHd?>-S+Rp)pZ)J8wZ>_sD~yj!(vxicq@^5Sa%Sd& zy0QqPsCeJGqUV>d{$tr1d-6m^AYb(3<u_~#ey}-ry7nInQf{79zFcOfTvzbVN6+e8 zB0P?ISG>LI$JGDg@6z3~->v$ekaAY@-^2F*ZO?<Rt$DeG`{s@_I~7j<tC6jkd*<nB z*2Q^mUY&?sxH_Twh1N-%Lv<~$Yc5BmR<5nyXBYLQI_OH)>Acv3zD$vQxt)t1|F8>O zr~K>S+Jc1!E9##ayD(q*llwkmNywB8HRfyL`#b7QOU~y;`RiIN{VXWBm-%EzOKHpO ze0G7Y3lFAnxco5UUuwbDR&FcDA{8OttJwGPm$A~HSx0-mam`LQd&elq7Q_*}MMGg? zSBKp5Fo_N(gXdEYWNYzp&JfrW{$WzO!A-Z8ui5F>zkCz9xooxOp}0-cXQy0PmGE`% zjz7KY*G#VxsW17zZI?LD0?j*?L94fJ`{t+iYg+u)i4%W`Bz?X1fp5yR$u5)DI2(33 z%s%^?p~~+3W!0lwOT8y~yqV{=ypMt5WSEZZyA3WEUvVr?o_2<P@r&mT9w(+X@MZqY zekZp4vsgpwcabB;Ouo|vJjyy2tc%$G%b_9l=S?+51$Q0yiHuKd>i;jc2y=OMPSASZ z2{ySMZGj(H(^br0E#tg7bIK}(nzGdCI$Tm2ajD@qxpsMVtJ=v0PLL@Jd1`L>!>neu z#mD>l$8LqE@K1M{?aGp5FA&1+vqM}?AmEAEhh_!6^#8`<O2<;xJ8<x83+#EjNcQzL zzn;+cAf2c8r`<Wk<KOxAz{GlkeuJI*@!6l^{Va6K6x_3R-;6OYK5ZVay}MG@(SH8& zeWJ(XH!O>;HOo@oyX6_HW|Qh~uYEB|hVR#2Uvq5w>NM|$f4rrt>~b6_^Cw@Kd4M^q ze2sSsyHQ8;yGNo`Is2-9X8Lu8a5m<&-?6fOcv`2dc;ke}rIRwlC(Y&(GCRUpFUE32 zldY$Yqh)WMumIz>r`29F+?`(s+TVC^>{zW+!S17X=SYg~TRMATPPs|^1?Lv?ixWTH zbV>hR$n{Oh<xPa+_6<!Jt2BjUf6jSu?J=WB>w81{>1r+&t}1MNtm+XCH)43E?vc7w zu$tRf<yBgAd*z{jGaGaE8L7^`nao@~wXr^FnY`_mZI|L_a42svjbHhsyLQF>-hKXy z{SSI7o>?2r<#B;g;L~miPL7=qBjT2+EYLlA&XNCfOyB+KrzP+06#D%&R%F+LoWzzT z9m)%zou6gjedzN<#f#70XIl95%d?xlDVQVYZdk!n>&0QjdCO2(d;^2Tx(wB&i_V_A zR}`(as$MwnW5kqpM_c1lrj7UI?pKEft(vx_?_<qJ<Bf|XTsC$re0zoG%Yhdw1kZfw zI?-9i)-20*<6?_aSC@3)f4zBb_XSQJx^iYmvf?}=#e^3Bf>iz=ljKDje=C=5Hg~*r zJb1dQT&Es)>S_@^kz&_-(^Ot<J+?8*wn*Y{_|}UX_wZNO-_^6M+bnZ|$*^)~Z{P2* z0_&#^jCa0o-*=UB>#Ub1`(N)Xw%hyqj6lt=GwWNH1k5<8=l+^sxB8#(o=+Wfz0dT$ zEePhkQFdbLofYz&Iv%F;yr184zTfT5oF$&IJMMb$Tn>RLm2=asFI&aH^7zG>YYdDl z4mmh*C+-V7({$kf(IVseG7fQW^|U;N136|&-bNE6@|LVxv8(6~r=ljqs(0dd8`j8d zv1QGeAH7}P#B|-iH~i6U;@fZT3>GMh+f#ggUH6UD@|^pRejU1Y?p)8+o$>0Eq`fS{ zR!r#L!dm3^`rC`ht*)YlOFO#Ut74vT#WCCdi(2WmN_0=joC#0s8uA`L%dRh}TypE@ zu5*$lyTcn*)Hiz_2)rD%-za=dMBw2JleRTpg;nwErk%OTVY;CIYRub;qzNx4zt_I< ziaW-5mrUNCHI7H-2ggmjGNZR+QU~LLpV9(HJ=QET-@ov^nahuzNl#9@A7=Tz)yIDS zN4JavffM3>IOQF-FMRg<#rui6A(Hm5nCopT)it<<*6;kf#;)1D&1ts54_g(UZ=Me7 zcLT*(etRssl)HUad6lc3_FwZQ8PU&IZPH%LUAaG%LHV(;WABS6S5^iuHw^RPUKspF z-f7y(gqmMhRtj?+O5&O*oWrE>qctzN<kb_;Z#S=P^!fRHMNg^p!IzVl&+}K*4gPrK zWU#qnz0QuE7v>+loRhzbBfCX+53>Wy1Ot29iAr;<#U^vAr86cxob&QUw{#o(?$c!x zKFr;4=G}Th@z$xElGYcQNqsZSd1~-nHKA?J3+q#DJ5>dfv^FW|MsK>m=E&oQO_OK7 zNq8!2E*s&%a)3icEA;O(j!2%g^_4l#*|;CFeEEKk)t|TCs_ky$y$=#z8~Ieu>N{*I zf1BOzTdBtT)X1g%*|qnUyRv`Z<7)`mqV8*U`gXkh`F#(H)OYH71@c!-T>4(`?fsq4 z9bUeSci8ar{O@(TCc+%j6QjALcYJUA$>x6H_{`R?Q>IrY=`#chDNL>t5QvLmNmSff zRUqinsPpdgvVJb3gY_=Qj!$Q<*W)~Cr+@F9?JA`ear2Cv)-uawuATRNc8$@B(~)|4 z><4$ecsgl)ymi>~gTEHMth&nScBt&eqQd&qUMH@`FaEaW<BHSGxrq~Z-RC@Uf7h*D zijiW{ug{e4`=<3QGHSaYkKEmut8sHu7VTYh>YHFy(ti)FS>4AsO*2V2EnC0TCoZ+& z#?pvIt2cQwF?j`)?pctV+-z#Ww(zvb?)?EBL95o)|NOUllkCn4GwJ@elO9|4mFAzi z=rdcXMR{ds<G-&#pXblI&t6xaD0lyO=CkFqk_+!@xA32J;XHAOMdMT4y%4=t15Jjb zSNN@Zxx3b!JSEsDapS>1F<*zaHa@ON^$7weEmBr_Oxx>_pEH?HVtY))$(fw*ci;MG z|KoH{q)_&A{oN(M!=}~l%Y3`+rs>?ds%7jwB6m~vUEqlCm>O2L=k<$KCW7x8a!-p& zuHDsDTD>b!Q{Qr(w7{W#_S5{I{uBPTcjkGUe6h}Kz1^Qyc*T8|+LihGm_(><`z4RJ zM<(*tFR7|j{rkvfo!-9Nj9Ds+TF)u?JD)0B^r7_A^~oF4%JUb7X$T85yY?Rwh^frr zxOi&gY8^qz+uPP$UfD4<A+31sm#imTcV*6n9<7-kd8NeMa^;@4e7!y;&u9IgqwBgT z()C@BaKQDBbzdrF{1@Ks=`&oY(Q}69XJkdrWf4Z<7XEs!mY_}7-^V+=FpEvMd%Z;N za`M-tdE)Px(!=I+l!RutZxb%~7?OYg$E>3JE}wg@KYf^$<UZ^0<G*(=Pu}~~^n<)@ z@SmK=%YFV%+!M$D|H4&?_wTcODr~+PcrA`oJpJSe%X<AF0jEP62~&8K58OB#+Naa) zdFc9n+aiWT9}-q37}v*gZOVJn@Y^ExZ?bE#miMI9i*{(ZOpoT@QF?vGT8;P%pE@)g z>oOJuyg2!6%3+;(1y2J!^+l>S?@U(aj$bjWT6me(qwezi_XFdMg%z#})z}$W3No8m zX`Q=s^f5Qr%sD0f&)?tJp7wms3ZLiYIj61o_pkZsS^TVWdYZ@$+qY>J_5Y>v8qRY* z)(Q7H%f!UfqGTVxL`7l212KMq1y3qZ@AP+Ee{bsR<U+N5^Gf5^)Xtl(7b^SaWzx@5 zMQ7n-i7`=`Gaquv><^z5@u8Ye@4ot?!x~T2CtkZN#$EHl`*60P49hBQ*`#Ajf&xl5 zENR_-wM|^&`8?A%Z>F&SP7&2@TsynoabvQ9hLVs^i1?k0_njknxAYg~zFuVPKl$;C z#fKJch_9Hf{^&XDAqEvCfBvA9z=uqZVX8kDEXa(DF+Z^Q%G&-_r@ja2?I^u_-&=BT z+WGRSwN3Sc(_4;Nu0NO|nZ{eS{mkYqncCA{7ZoM{v^1YOUpun3rdmH@J9|W_Yq<7$ zlX{JawQGN-a_zHT%r$pzT+QmK%a3<lY~J@hf3f({^;M@I9Q*XHz9($kwf+CUTQo{F zY;oG8U0krvO6^&*+B9ii$=L_@ScKi(<$Y_9-3rrb`_}TvzRx}LUhcN7os#E-vaR}B z=ghy|-CzG&SZwL(Rk#10TcY$|#({_Jj7L~*o%2~YpZaZ9>$KQkO<TKI#HsnG$2V8@ z`{fs15*0qL^#8T{aB5EZ3$bM_r8bimHffbU6--ZWOls2fP6=Z539ShTpP-`aZj@3m zGsIbMy4kWu^~LM6*Q^fxU42S*-kldWmg#jnnU_e{eb=%Neg3B@=E&+>(*2+QmbzAn z`|r28RPmgbd()o!Z!dNp`I`IsTCAR0`SDQe%`aC8uxd&)FVbFmG`g>s_l~8e=j8JO zXI@`BxOl^idHa`G6uRc5WT{Lvx0$HJQSeMW-R+_7hseZ`9nVfy=rlM+`0;3SC<ri~ zC=BO_e_PIKYi+sshFSOD?|X{<lGklYTDd-E`(3|fKD)Nwy_mOL@_fD4XIb&pTLsQX zZE$~mL09@|(3xpV8YI+&bgz`ZFt^I6=y2I?{j#JkI%d_A<e3_VSMF)-5;B;>_iD!k z4HgZhtUX5ZH;&AB?j0ZS?DQ(7P#*1IU)RZ+QnSP#)~SA|xA6Ye%5nJkMP;WMwbmU! zw@Yg@M`SebK2{_D>-5Tw#Im%sda(^2ya(1hu0Pn27sktF_>F(XLN$Y1o7oe$YpcI% zsCN&yDZf|RaWnSzL&GbE_UHG1Fa9A~BWkM}aYtUUdBcHFA@>_+{zWAymUDl)YB$g4 z*}dBz9Nf#D?(VP@VY7<qoS{{<YLdszpq1KU?6)NP1CB6<zBy%mW2*1Gm+OkWFYm1{ zkaIb1o;Tx~zGqC%oEM%}3qKl)@a5iHp>|=dZ0*6V*?~6KLMQ1kwyb_A{(;xreo6b) zPWFwjQ#Ui3B|J!)mdGpcpnCbbASD+CCma1I8LM}jevjP9{H=L{<ZX}DQ7;ZGN%noa zHYwM3*6ei}Q@&n~QFwOs^@^nOu*%~RDIEI~=G99r-kY2gazln!$?%b>OP1;PUw0lQ zSoTgm=)ob`yfkJ$%gum!>TV9AM=xAx{o(dtXN|JK$98M?n0|>@Npj2k|JXkjbe6B< z>%UQ3z*g6{?~KJ_oh32cKb7s+)$EVh%iR6`ux1;3;k-oqQ<?9~J$l+~x2~wYBKvd3 zEzj-~K8-!~qNM?B*-u2Zm0xz5GNm8UXtU06V-wL*;uN}8ke|Im`y^j$Sm-}tr)hT= zuVQF^o}u#S>z+^9R=01r`xKkAFkSdGGpc6YwR`3*4NE51w)VJ8tJupUbc}`Ze!JbV zfO8z5+JiZn7aqJ96!9r5hUNO7^}Dt{ohY<?w}$KL#XszpR@SemR26$@ve3#?rK9m7 zi`&`dO4d{F&0bgg&)z=1e705M7pqkYEvcJIe3bUTt5MnUQ@Wl_Az^!0&8$rIz=iz> z7uZF<)IY||!M~}rKJBap`_d=x+|omPg5{#p{u^(-Z+Y+kk<aa0ci)!_kKO&de|@5x zWmeBVCAmFG%O~y94m_b=|ISPEthMy~d=tC=HM-Lqem<IfxA}X_sW-24*S+2QTcy*c z>ieyK?VBe}sohck_GNyJ>HPHnoN?16qLNBpCB07EvYuW1$LX1uzO8aGv!BGK`TJ-1 zi%UyC_|KRn(BHvz^gqk=tZ#ekbEN-HJv;m2qi0_B(aJsR1bn$>y!v!$_C{&l`rog@ zFNE*o;l1}UP~gJ#i?d^YCpTSOy?IK<X70k1_LEB8ZpaGh{pbn^D|&1Z=r(<h_v|^% zr}G46@86_*)N_^gi@c^lHRce0^Vf;ilXq@oEbevt9Go92)nIyO;UV@dD!&<cS^vFS z&+y@574L>cJ;`1tmHwUfe_r%vzwx2(8&>($Yp^gX9I{*Sqk63$yFbUu;*TFHXU%(X z>t?RsFDc$*>)$P3I@M~u+Go{s8?xO6cAF){O@C@Hl)Pi=vWcJbr`4?P6i{bM*V$)v z`06fk)|7|(SI(H&-}<A#w(-ZG_Qd0Flp7@ONza_)Um(=Du{QkW7ghE7>Vm88%#PlW zYg_PE`-5oxQ@iH*d?xeNSUQxR@!u~__`F+iTaw65Eya#Y^SV_&9pF}V4f9)`*5ugo z<lMf!YCkF-WQKjVIrl+B;lt1Qy31GR?vOtmbkKC7YN6`fWBEyY@7zB1usH37>gL(` zJ_(-ERuj&gjrZBowawNi-K&s^f5yaT$$_646+T|#;muE99#DUO)>?Hw&lSpb?ooR) zlr+4(M3(e^jr_TFeUWf(oc8%^=3WA!Dl-{xE~?lbApT5(-Kcqsy3T{Cp=%2xV)7HJ z|LUr5-`!}uqgzj`PN*WYrE_x4jZo{02R~HbJ1f;TgFk28RkO|JpVvHo);~e+b@Ifg zTevPIoMj2PY-`E(bn61&`tS2!%)j>F*0IR;`~SA)@EP~FuDoMssP#Br`&mKvBcA@b zJ&$6U*0kNP-?`?ox#!pUhcC5FHa(U2?cL(A6&sfdeqwdf|L`DOoIP*Kfk`30*FLNb z+Rv16VVe@mG(ndL**DG{Q|exZEjl$zE7BqV-OE=CKQwgr3C*tvo$J0P<ofz0_3OpE z-Pv+Ie?Jnp+;vvi!C72iZ0T1krz>Wmavn0ZPfH>uWto1rTWOSIs+Rt}_#e~s{bAoX zJXn^g{ov(yk^G<edzjSYOMWbC%5J^7YHh$gY0eMtw=LZnTkY2$w~X=HtJvC)pC%|O z1-f2fu<p3gyOvS6)T8KgV&p50zzYVq*EZFgS@(vRU6jx|{&LU0ZyDmNwf)nUty`3) zVz9lmVx0nG$BeA23JE;dW11_RW~@AOuQoD#>6efF)3su!-?d#mBk_=5Ofm0#;Wb$z z-3&pFJJ0ONy8W?~Gfr0HPuuQ$^P|1j?!4N#e`Of!`{*Zq+<(P(9{zugB}Zgl+AROJ z;}Jr6=j(li6PWkQz4?0iu;Yzso=+#fs0cLge;ZXbSA5^JLw|m}Jh({M>#2U%OP2Lj zE7)zeCVCh?ug=?}p{8_oLQ3Y-opS&A?E+ai&o}pG9QpgSP;TzA2TFa7$$brr?ZVEd zPWot*_~LNni{i$E8~Z<<|5BsAuzJUX8!P|lsW)tp*dA2NRnO+(V#V%Iea*OkDqHNV zw?!fyFPCjz=zaO%3bAvxI)DDZnwe~qbd!I6QrN+=#Ov+8=VsIy2C^^<2y%+B$Z?mL z=}zZ%Wzo7YIeo6{Jm;LMJ==G0mM9hRyuo){b)Mn%v^gQK_oZZPG&yYbYWeG`Uwd{e zdihl;{_5&}lM@+pw@2@*x1QU7Gf3g$<YfwtO^0@d)HAeBJk*!5OMT|4=fNlEP2mWW zm>?9eQiww%gjXYPQ`3<HPvVwZf0p(0b9tz+q@dkq@@bJO6>W3n@&_U;hg+)@Wn3l~ z2N~4=?OZMsSvJqAaBrUUGMNcVk9c_7_O4r3Iz8)kD|_YLbF)ki9lASR*|pxK+o(fI zW7P_oMGYHI-*Z|Kn*aR6iuS6N3s!NKes2DLzvyzQ`+B=Q<=-D2D=q#yabA()^Ol_2 zn;O2!dO_LBt22&m{u2H7oo(q1?<Y?sIK(g3>8!gf_pxlPpx%=3bqcN1^##9ueYxTB zq}rpw_K#wf?Sp+zr8)3joZ+D}|Bjeoa{b?neMxqzxBjO0-%irvZ>{oYcRbOtLtTl@ zX~|;qi8>-yLg#HRPJYqwUX8mWiS;Fi;>Pu}&OWJLlCbTT`ljT&iQQ2gzn4qZY&7~e zvtXg6;lyGd^OMTP_a59o)suebi1gu;zE7f;UwWssJo@>L8EKpPYwp$Zc{{G)JULUs zv19h!dJ*OKl{$vsid+l}`_eZ}IcHn6@A<X^{paiV{MxB^_qnA|gX5fL-xXRGtF^xG zj;VJzA*`|Dsd=gIr2jho2``I1rk+$e_<fQCzvI=1b5`9xyW3T}&G6F0zd>=2iz;8n z3(WcH{>9v>uexQ2SeJWLmQ%E-(Dk=_cv@qg&u9D6pvYE#I?*;lv$gc_B~GJzU)N=b z__bVgzcL|7ME9&&=}9d^HgnS^pMXQ#CO$dveg03=UF|0?Yu|XUx|2`r;dK7qqTMHZ zuNyvZR(G?JYFE|2d-*o+{FS?}tUkS1SKLjT=|$h&OVeXlyt6$NT+0(W-Eq2L=b1c{ z+#K7V`%}7wQgezmOX@i?rz)^13;D6voZl@Q6@F=I&@QnVT*qJUZ8gYKaP_mWTC&ed zo`E6flE^ZN$qg3f^P|(FBi^Z=v$M7+OkVG+%Iox!@!hoPYilZ<TpEuQtoU(!ai>JL z$))&CLH})kq?XUjnJF%pX7=M^Y4RO5{=(@^@mez->y!=|y|TGm5&6Bo{N#msSFgRg zBAL}ayXx`NY2M|b3wAI4T9oC!IP=M?J-X}Ht52=xW>aO{Q<#0<Coar6TZzwYiuuW{ z!qypqdrQ@3$y~X#^Wj%5r&kZRG6o*`^-p}ZhIxVI&z!%v7{3<WN=QEx$l5sXPQvAy z3v%mNcCB9d@YB@lxeK+kR{CfuG`7^6=U)mAo%TRhGb2G%`v`|rZSq2vUn&hTo_xnN z89TGI-0nn6y->Iy{6=ERV(E5C_g7z8%dT+=);x8yw6xq~$Z__6D0}XW&W;wPRqS6> zHmM~Ybg)>W_DlNdjFkbk+g7}uvAi&m#l!1}^(98PwyYZ$MYV;x#Hv|Ko}HOFf4B94 z`Z*h>uD$f=)=P=#rGXn2s&;i&7gv<TuRY8<A=>L*<qhc@OKZB{J-Asa^#4?-v4g6N zqt0_3A&#iU)t^`w`LRz->HYH7FM+keYGUVHg+#ZgMG_u)XU_15{9>9=qLio}d4W&; zX>e(a!qIb!GY;{b{QG%!+r3?Sng_Rtoj!IwfBx<I*&DK4votg&#;^+=YUs%GJ{V*; zb8hp}B>(q~;@Ri-TPZ6f9-hhdtNO>R4c-<9KI|>|?$KA>))w8L`_Vb>-(|<JyR}aR zxBa{#VLL69@xRP-n|=%Jn3KyA)`w3&J@dn)AQ8o#TNaA&%#zNtxfbbj=zxQV(ehoU z+A8KH42D|A`0CeRFBA}7CGy(iUftn$wZ_v~R1LpfQf3zRcQLM5yrR24h@;&>C+Ea@ zzp^ti6J^hI2drM&z0fDu@#u+Lo-(#=?aP{<Hm<f?p&WZ@$J(O$sjq%rym;@HgH3ct zY*q4Jqx*k8f8_JMWjnLGczWvjng5R@zvw=6y2adZ)t+yn*K;4n)IZ4EYO_H0>5QF` zDvL|?x1Ig}W2==+=6Aa<xBWLK`yIJBt?SCO_%A0j7j204JGAeCSJL`<M@lusZN7ct z(9=C_6E>S6wLJ8Wm#O{4O~ppa!GVlSHy90@oI|}QNs3N!(3%(Mta*7+b+D_-BsnD| z9}yP^|4=jEH<H~`&Fvg6C$-dH_;qwrMG))l2`K`bPcDfxIqm$i$H-)PQz6R|x10q# zZpf;-g!wivDrvs;@~)&*TeEwKLR9+kw@G16i5&^fi&7<pt){)}J6?YGkIRxflZ}`c z`WP91asMkhS;?h2vBl@?%d;gStNwmHo1NU)!@(i{OIRszQ(KeD!esRfP3d0CdabLI zE0?U5Rf?Z<;=+uY=d)G>mrPnPV^Z7Q6MB2z?MV5O5j?w^k@<nbD!u9n?^3ES%+2AS zl^J>Loz}!x8qede??1Hi)%=Ke)87Tot#+36Ea8;Rt^D<K^$oq0XrpQCcg_EJ;oB0? zf2{A#`-D`w7<PCpU}~_+hzxac7jzYz$aHjL{U)78B{vaIB?&>pwkf%4-_jJm>2Cb# z>kx9tYn!**i5U0oI!Ssy%%-BMPA&_7P3W4?V=f(`sQ5)uMe9{g+aD3-);r6TH&{(( zmJRc|G;xM<N9*LPHU6hwaagb@-`*KMahdzpF9x#}A3exv`=@Z(RN(U4KBx8>3d}|d zGF-t&*44i)N!=1~r03dp7D1tpF0uZ+<rTaCotgPxA=pF2tLKrd)c2b^fAZV>4SvFN zr%1U%$mCI%XXm6%k4@I+#8t++geaQ{X8u^#?fd!B>_Z_(7ItX0sdYJ4@I2ZjJN3b& z=j}cYH|~`dPnp5id2i2YC5|%}TwkBoGLSf9oP9wc`l};bz4Of`$Lnz)dt>uTL!!Cw zdX*d&``@6;=j%6FbK~~=4;h$zZg?+Mse8@W9S~`JI@~Pe!rKm>S7#0y?Q!9^P?}wv zB|XW|v0*|=j=i8#ND0%fz#A*f?_a42R$-cc`01}>O$RkiPHUL-x+FF@hMP2aPrDd% zGIiB7_fwCxChroO`n>*G(Sx6BZgTuFv=KYi>(<fM6|rRD<=wdq4joBdW%Kz0PZpk> z+GAWK*Y)SzwSyYxHd;zORk>ZcTKQB*dUTS*gFCw}FVlM%#CJmPsg&N+UlKW$cU#Y% z7c4P8{j++7ZFGQ0ZR!!$`%k`DS}azw6q;nPqF4L0+VZ7aA78WJTP0NZuKq@z@UEka zc^03nGi+&E^7GiU*%pO1L2Z6H{VRTL3(i?|;^)cb*O;1Duv^$~ouM{My0m_qU6tLe zx!oTVRvitg=h}Tw@RTom>^5t8%jw^2C!1g7x^1YHe@D*fy#M23gLMa1-m94v__t@n z#D^AZwtv?CpZ`Phj8^2u&Ek$Zx=w4i)+goesfq6K*j6DXzCKPt>6TFE{cXJ$@5Z}L zKlp#$R;@Or*{dUd*PcCoe|y$lpUB9we_j~>*|WQgS55R^*o+j3vf|s#zjko2sz3UX zv4f*WXL+}-y+q&MkDFP;lb>2~%-qBisPcc)7X_xE3$Cszfeu0IRz)q^Vo;y4I&Jo{ zo&S&3-}o%_y}mB-^X#f!OU-ACwVhw2qh=9uYqR0Gdx|}sS?g}rBqTT7vM^saYu4Iz zhr?a`_9j=oTY9wVjnm#XALA9vC9ecBvPGXiw~~ADVr~DW(z(?gbJI_|*ZvP(J;{Xs z&5NSLlT;;c@GGyp{U|%#Y8gjYhl|iw+4k#aJr^wvD;BD6(nyqe+2`aM5%sys>7PwT z#wwN+X^oHBldA&7_UdT}TjpFou<W$?dc)AB!!bcef3LbY&#UC6|2y_4p0jkC|0^Gw z;{P@5*!lq7{wp<N#WPR0-{SoJ@%pst4N>b9%*Ae7p5C4Q@crW1=Ul(uJbb&<lW)u9 zy}R9=>YrSyeL3Iau66zQ91Hfl>Qjm@)v~_hSiXC{0>dH&&x=zJJmlJ7IzM;M?cJ$A zJr4AF+)63Q|9AD@v+(E=bLLG;-rA_&<aCO!h!DN#uH*Op+57FL^`iD%at}q%)|l-o zH*S`f-52bXD^%C?-rh0(b%&L>)|1aR;qA)it1TRb^L7<f{^v+okdr>G{-Nx|6WaPA z9}a6P3C3TtJGx+<;fi9Jtcbd-n1`0z-^c7-`f0*G(`wh`YToz*W&a||W6Px~fAHSC z({c0e<mdNq7KUrey;!nC`R(N&=Owpn=D9WLWagPE@41&2oUU6JUVF3nc!v0%hx|7p z7H-mA(S7XP#h5y+Rfo5>+LbJPBByn%eskdNa;9<>!?!#;qF$B9%+);pbMCehHFK-` z3v{C|FW$Od+w!b{5d-5<rMjO=;-C1YZkX~udhsFaT3b$!4iAyUZ&5W<T_<Xs?!4Hm zY^3u#Q=q*5vPjsMEi3YOi`m3Gxt1`mdFTHw?_F4W)n}n;E1Z2J<7zC$3|U#E+UEbZ z*Q~#8-lLWhDe^X4cbC17YEq!Tl%dYg*n^v8gMMwg_qfxeZT|Bvug4p9E6rQ=nXh8` zu4Vmy7xm@->z0-~cqhj&!1zu{%w0FRn-;SSR0ZC)Z&zqCNH=9t(9h<xYn!(GcXh1& z(G8tpM*Ctu_34GH{N<_hGEwk2*q<{Yb#j%<+qr@DlHaNq3AlE&tT-{Xc+1no=n~Cc z3-y}c{D_mQdtN{Hp~Z2X<Bc(1&*SEOe(ZVP{l{|^rhgBM*PTf}@4P&GZv9mY(f_j& zLkiw+=32gJ!=rBx0;&&uW<I}E<Y{uv3SQ~|Pk;Y<uy~W`LYK28t2bO+n~}9|*UuF< zW4m|zm&(8AKCrc*URM5}$7j!-=F5W&op>W}{(1EAq={Qs>D~4$4d)a|m+TS;W*y6I zY*A{7ObR@*l~-#u<TRXvr>*KZ$Zo!jX_3zcwTCyHrx(t-bjGe?&RhL#OTRhaGxy~b z9zC^p|C$ZA&!4#+w<e*He^>QSt^NJ^-*(QJ`uUG1&j)cuU)^P{J(ufUr!p}ph7_i- z%qTJ272?d&V%+!fn`NN+i)H6i445tk?3S7<r110n;umInt6daJmPF?tyYIk|*yChW z;vn`oN3W-&v#W(g<mV~=+0VkivvX)FO<qu-r~QeE#d6D@sNjEDPfIc$+v=Y@eqFV8 z;q^M<AKMvzzqWI|yY`#r=7lpg>Z6zRW|g}+cNnuqcid`U$F0?HS>MtsCM2cV&1KcI zs;AE;pH*KRxUVejzl9K|)5oaoH*2>1)R5+3bC8zUs@kexSaH+YP$yI5WYWVIA7(9B zvEtg52~1fxj2v`T4whb3H_8dzdo^pv>aESUKd9=hloE<()ZQU;xh(up?M#*UgQx5N zm_5p7x|n#sB2oYNBj$Iy{O{R&4Aer7)J)}gEB)@`-q5O)<%^k)hJ?6&6Awv$u6(cP zrS0KbE(Oc16D$GQTQAOU=-9EKb;6xLb(3FOx27D4HS}TT)_?7j<UGY-nhUeKb^JDg z1vg@Mdu&p06tj9_ki;!tvq3U{V?#p=<F;wh^*5v5mDCnbfBTZ@$XfY)`3Xg*nNlqt z{VrPkcJ(cx9NnFd?zfAc`X+MdJY#&q`SvNv<xjs_`11(KTznwEwd3iDHwx=dILzGn z_nv_hTbuIjXWo+zrC)S8F>$u#O-|Jn*8W;&^R1Z{r89O%IKJPj(&Xp&Ez|q`Qrpi} znPP8eyl}Rx&y(dp&(0(}Gv>~O2@*$E_1)j%wy0&5kV9r+nY%+uaTD{+C9BjnGdtR8 zZ%8iN$Rc5|Y(~H#y92Y#znbr#{XT@_bC>1UhZfWKW~RB?zKaT+ZdCR5-kZy-t?u~E zb9&zO*W{L1%8Bi!wVgWB{z1_n%x=B(ZqGQ9EYGc{HpAe<gRc7X0!m7O#p`?|7~FPQ zh+ev3sOT>{CFkXX;I*5V?JRm{9Nw|Jm($6LYu2@k+Fh+P+NKFOYVE0KOcdI<qGy%j z(}U0I?N(Tnv7NlqCD3DLvvQSxUdHT(O>dW9uRri(!9Is0>*j1LSv^fgbn3npZST^r zG#dZ!d{>nG)zxjTlUCBAY4x@TKAio@wp4{{-h;z4#6I15Zq3E$J1uo{NMrZz?p1lx zW(%H`ugsZYRQV+FM|b!>rSN+j1oyga7wCMy>si;@LiIJ;-p5z!2uHLW{oi)9HowX^ ze&I^v|BZ2-`xLIU`0})EUA#B*$*XUH=5y~?e<@hKIpy|cm#EcSCT(uIJ4fk%W4+GL zP4mrJ&#(4%b!2DNKeOiLwUukw+l(*jY~;`9EIECB&Zb>uF(un2_9ZS_c2xh~zHgUi zHby9@U6kxNUmjIt@aDkv-Bk%LYrmMJ?JB+7^NcM>&^3O0c+-Ko$J?&&`+4cF)Z-Pc zF+X423Hki7l=<Simq8Y#g(4e!m5MLAuG3>*QGf77%mcH<tABsKtsDN?DJyT@QdKX@ z{US4zw=gRTu4GvMclZA8wwL|&DZ*K%>=hs1Tkrd3nsj(+h?>%(0=7F<3aUFwcI#G| z9$+fkyiF^8o{QtLpTURB9txbkWwj%D<3xcC`Rl7%Xa9Tm+FpL~QyYQ1%ipX&Vm@<< zMuDMJ7QdBYeH*`FUqs!b6CKb0te@)o(tpc_RZ5yyW)~WDHXA>k<EXJT$b)}n2h*gk zho7D-TiCgdM@;Y#%SXL{{v$`$6|NFG&~R#MtcUf@K&@*bW(*w+Q?#XZW6z`raPr!H z+2d^9_vLy>&W3t1`Dsj36ehjA|Lq$4{kV=*945^zuDuKLA6C`x{I^J(Z-u9;<<BGm zhsdh<E#|ZDB>%U#A?_-|Z1pi{9(VP#<1@bZ@pH=duqP*q{*;nZZanaprzfl<)O_mV z%ow?C?#D%JR+_}C1Z`c{^=0yJ{pSB%JaM-CAM_>mPR!;kd1*9L$Vv6a-y^~ed0ugU z(#?}A=BhLld^lr$Avt4my}_}+R*RndO3OZbdnV@K<L)fKr%xwNy%rQ$f8?`~%%2~% z0W$t}{Wm5Gn|m4Ne&$X5Dek{{@$!1b+rQH<`ThCASypm)?M3DM7Z>WjKTtRMpmm6m zgD-aTgi904d%lD`PVhN=Bz(5VgL}<)^Tf9Ezdq8nEk-tO@7f=wukWpUeXsI#y>eZZ zME%E!!C!t!FFt>N?{SwCcWQ5PPnBMmdZ*^m7Lm*5g*)mG_SJ3V`My#(aEsu?1K;j0 zZ+h5KS#@2NtKm?c(C!8Dk>?%0_k}w=H*ezJ{2_Ku(~bqkGgcmWc{{GSTv&fybOWo~ z^!MvRE>%VaarrOaapCOy!23oPtJ&g<l=autUun9#<8A8i-G7!F{XY8R4X<V_*N>yW z-tf9!ToqMQ@i{s}<I}Y5zbr&+ZbZlaYPQLrc9>z_57)Ss`Yn0~(w}a~Wd8H=|0dDf z9E?r7FK$2Nv&C$ER#`~SZIchtx7Vk9UX#kw{GWZ+AMOKX=lLq6_9^D1hTop@xWM!9 z*Ru4*Pfn)Smn%PAbhFg<Q_Y<{?|HtJpP6QS>8}6X1IGI~-jpn;zZ9UNE_$%>pJ}<9 zl}zBq-^Vqt2JABKHSr4fjkqj-Ah%fIY0IV$_r#z57K!0lZX&>Zv2Lw$41?|c%NGq- zM{S(3^h{~V7XJ=5myG$sJ?^pDy$^4-<Qqm#NZF(yXvpwWa8dncFVzzs>2W;nZT1#1 zj#hRChQ%5A7j_m^vAw(Zc~<Q1cxL~j2}z$`JUz~wQS|AB_Ws|qY^&ooyEjaI{dp>* z#rLiA3(sB^f1JJP>zTAavNn&7hUlDoemW#=Iv1z*z6To~Xz7X`>7Dj^Nr%Q>vlT&K z3|H7c5pd<bwc(4hPPABSc74B-!JV&-9ZLjWW=&o2Z2p2Xmt8$K`gA?~K6@jN$i6?S zXFZCn&ThKX%C`E{s@=c8y@|-5_WpL=BUkOn`We%GL~HoJ7R4NR|L)Ls+4BXD`ZvX% z<IA%xlQ(~o;k2`6ZfJgviSsm$EDZsR+Cq~Rox;}I&9n12xSrgVqdW17dRg}DdcD)7 zqHEHgU+A&2vA0~~vPkQHn$WwW8WojOx?Y#fmY9CJBd5>Bw=(<MzM|wLJ=5*}&CzF^ zIYVtCr<MDx+iB78=j9$x?c)=D4nA+uTd4RZsrtpSnIHcdB<xH3H}9t0=G@~&k@-)~ zhknbv^sQmtrBiON9-m%byZz4RZ_19D?>9QtR~<g%#vSnBo%i~CkuN{CiAm?IxYXRA zzn1;#yia|RoLR>X{c_l_OLc|L(y142xN6;sS`qP3dH2!4T)}xJd7LN1k1jd&LbS+a z?HjveMjC$_nS)Axf4Pw^^;=ZLBVJ{3+s>m$wyrx7ec?{S6PYzG8%pPPcsk!cXPFx! za3T7_^w^X28O5DZPgh)xs(+=hW6iT&Z+ulAW}LH+;9z1<5M4Ck+Qv02C9c_<?EWIZ zKr+kWB7<VfU3(862WB%NU&ku~nmP438-MmM$nXf`^~`u*aU?-Nl1Kc~bq>z;Hp+*q zZ*2EbJYHdvo8553{O{9`Z}(?q3$9(TzbroZFxS&-yJR+Q-Cmy|B%12Elw+ge&A|Vb zT`s+w<bR3rIv+X4;l1kCo7`_JW_2u@*UwqY^;X=7=h}o#LW%-5)xjC8xd&7xRkUV0 ziZFR_N(ePMh~zkj27aEtxIO!>qYAsOv&-KTE?ko?T>2j(V45qbxZ~T()#XbjygB*n zf6m{yGv8krw=Bq8-;uGfe(EAd<+;XTPK*KB`mz2YS2rl$`lHXH6mWFP)Mxh0vy5_C zr=5%8{l@IF&A02<^ncQfj4Ik0EGJIo$GtkHU0QD&!N!#SG<80cIAfyv8;gBDkA+T% z^Xa^KsNtYcc=;CV?{D9aHhh>H;HZ$dyYAUF-ee&KRf*q0RUcZ_nzVmem(|C!XcX*~ zknyS46kAmP&$2MV%rZbq)c*T(lPi9VatnL1^KukkwN&o7cfWH-QB?B!r(fn|EP31b z;6<VMj1#;6zl{xi(B;z6ylBs>4`;jeR9;+44cPW}cZGGk3zvaMhw!rnYoaA$SUv4` z%}niFlQ`juGLMk?$4ejU&zAdc5lZ|~Z)qOA`I=Y6=l@TpH<!h~_1ReZvcPGXj`l-A z*_qtUJ1hLB_ne+ta{blhG#l$}8}}c#y=r`scbl+I%c|e@fBj20ZZlqSm7Upd+v?qa zkNoi|<GJ4EYxd4bU*>S|hlc3aDm!-tYcJofx;N|IUb#Gfm*OL~U4>77Eiei=y?&-2 z|CjUiZ>N>ITJKtJb*5i?>dw2DHl}3!ujP8haeY<Urw_*>?p)BT?kq34dTfRJ?(ZDF zTNJ*m`%pN$?O{H@-pyN8tv`EbSf@|A_Uo(zyYZ@7y&antPu}Of`>e;d`Av(DOm$%5 zH5Ay+micwk${ef9dp(aY5Ei-_|4#dyf2@te*QlFaS@ZVSmvQ<Z)^9CLG@dLq`&kO( z+BfUg-r2L|jB91L%%xRF_H6KUb6YLE!>)0aWuIf8podYl`?dh#W9Ap)CWTFQyVK?N z<yKkqsa<Q9tMjeDulZG^xL44uMR2P1qD2yCOTyibr)@6qRoP_n<Mt9+Z~yY%hKPfi zZ#uSR1aSI(D_IzECZJyW>R;12eb%j=ax%OTr}V2*IA(2oS9<X$<2<+WO;gu$Zq8Ak zy(WB@YUBG9@m+^5t-2<<wt2&sJKpPE5ASO`Q_$hI;lCu`{OPLyTzD-vEjRx!Je_YH z^YzOYHt~qh{diI}r?%~P$Ac=KFy=ec1YSLUrY-));)z>|enQ#ZxqYW6zOFA*eYALb zp61j~S7p_l6eL?DuIGBIznboQUR)*luY=!ZnX9{!_9@$Kst*o-e)IDx_B)k-Z|mN4 zsQSO{@S?careD0~sd)BeWR@?Ouq41womuv5JkPR8TPp)sf1Tm>Tc&i%`Il!{Os(G) zy|Op-vT!<i^<bNoXur@zv-2L>zvioH*MFTnA^ux*xVw5lO6A*HreB*lHVdp=R62LZ z#{K&*)j#gk^WDhfbkqCb_dAo{c`SXuQ+?N#lXE{$n%<?Qpe40r{qHZHc9%mIf4?KF z{UkX@sL09C)%$(l>7ttQs9>JEYziK3*V{FD<MZ`vkJ{Gvax!?8@Xr?HzInZ!Gx7PJ zUz?Nbc~0*aDp6GX@`3Bbl-z*n<@0-0A4*Ezsy=_V>Fm$VMq9Vf>3%t3r<G>(fqgwc zdIbcmS{UPwMin)!PVkx>YOt|+v+5xuj|EABg)71odh8#cYxiIEu%pA_&?KMSxASl9 zI<Vzk(UCV_3+E)6wpuPc_hX^Gd_i{A&craSX|=LP#8=j<J#{>s!D3OqhKXmnj&ok! zo}Y$mZdh4)x}3QtaaMls-@fckmIevDQ>W>5N@<B6UKw=$!-*6wF{O!tckBL2Z&-AD z6-RADj&pdxIx9<437$O<Oc&kxGxd>%7~5UG%(oMcwbZd?8s=>|c_YZPAX~!5*HcJy z>O96Lu{>(;JX)6a*L!v4YQ11wq_N}Y#%JnH=NWY6QVv`=p2zGSBqV0C-$%r(;r@qT z^-;W+&&-@YA+u!4^<M@vv~DUam-{$NyX4mwZPC^Lrllwd*}nJuVtYE^h<%ms=j=s` zW&|{Gx-cnv=l?7JynI3fOLVT?L(}>%YlOv;&Guznx9(gd-Sz9(cb4Az4LWwecA4*) zcj|oEqSm8ZS8x1KyUWh8b(-hBeu)=LKhK@Bktc9z#`<L%w=T^O@-)ktS@dF-eeS>Q zc?U(G+xMHjHamE>Ut`V_ug}U7(QSH{ukU|Y+TZ2%!sfZndttwYz3alJXPoDMmE-#5 z?usi~?k!KAXC<kr2!*_~zw+n#uZt_{*Ju=dIU4`ZAwNn;xp9KT&D~GGO|aaXU6t=5 zbA9cbwqGkHTosBvQXEd|8vhl(xnN<LOr-hLg#uoo*JNJ`L>cIE&E-*RKb-Pg+D%G# z_Y%+DhYx?Qn8F|7Hp%PdJ^q@Xst*Hxepa8gzw6?X#L5B|^)h3N0JF5`YQNIAsR&9O zG^u}Z<jC<&)7~{V<nT4IAGDTancc#5UU_28|A#EA`0Xz@O5~PHJ+oQ<u+jexyWhfm zou6`Q8Fn8OZ*IIEFK+0PUG|Ubsk8h8rH}2^M%M4oricIL?yP+plU~0p`FX`*mh-+E zQSD~yqL+EHH?Np~eZmhp-fz2~mkLe0E!!;r$Kk=Q`s0(NW>o80N&bFey~wQge`Len z`M;SNCHdvvtXp#Q^6u?XDL3UiG}+fq`sVm}-4?T-L50chl9^LG@3YnmEOnZz&2(FK zf5N4!N`hK#la8)CxbUM&&qm{dFHI|M_MEJpWPbMe!sdq;^m~kDR!vn{U_WKs>D_|! zYZFWQKILZc9Ft+Mx2=3A^8c^%yS62p&jt$w%(gxDb<)p?JKFv^%;u4JdpB4nc=@a9 z_@hnlYiji-ueB7YWSz9AuOsfEg|wN(p0)4WcqejieKPC*wwc+jZ4-UPuVpK`KfD<r zZPxH+{V9>?sZ$J2Y__y2Er0$>Cwk#kYmu{&JBxFFm$Rx)@YQk)dU~&Z;;#~^GB>5O z{^s`0@A@pfg#!aiE<L>$wRd8hZBBywoR&nHW0GHaZ%<5oIXlfj>9g(p{l!t|f6kdF za*AhOjJr+49vvy|@T|uP_J>4rlRI{5>{|VE=CgDq!HMe}4lDb5|5oyuA$a3(LPyUn zD=p@9AF<S`rMjo=rzxM?bdK>*RXyVc_nT4f(`v6R&bwq%yl%&S;jhIjiuFU35?KXI zHJ&J@3xD6Bc|2J#L0?G0rsM1PHysR_`}Mw0){40_&Eik$8|&I4v3h6u)B|-k8cnbN zH^yrVroFkjNTOu@%Olh4x{pNoEa*|rPhVZOSwPsxX}f_+4_Bk)-ms^(M}!NdgZ=A! zwy~Q>{VG0L#C@TmT(X$?4Uc5Glz~)uxAFX%J1ethU*BWPm$3Ku!-Q9_?)o1QlyNAx zS;aVqPk}4apwDOjWXmmEY+w5yQq1@#%=+cF`o5HgS-W1W-+FG+w@>Blf!|&0WoI_5 z`F7&1(h`B$Dt3EP6J9QzF!^0{j>Losv;NNzE~uAQt6bQhId9Dblg#8AJC;2Pt5lvQ zR9OC~&s%X({i}N1pL4d#Tm|PUE?S#JR53DFUAIh}yYqX$-x_NjGx_?rwnEH>pS85a zXIz;jBxW)7`Lb;0y-RBz{Rv?ccQfDSb9$c7x_%>j&GU*~zm5u*+)TELsuTMmzU^+& z-D^J%9J#o^K5yT*sM9)Uboa2ZY4Y^R+g62iiE>4KzW-lq<J%KwZ(m*f{0Qf!$<2-? z7KKmN$Jd(7im5-j_V=~@Pqc-0-<!DD`SbKxJNcj2_aD))Fwm5Z-71utIA`sVfbxlo zo%5MJFMjVgzN&EQ;^)FoPAkqgh2`F!_))rO@ybJY{OjK61XxtnU+<R?3*WozfPs~{ zTrKm?l<Oky502Y&p7C~n_m45L;C*b&|3+THMA0{{i4zXq3$F6hllr)Nro@^D*HkL! zHK#NFy!^iM$<_BY-<A9KZT`7&;>=@HdoR8#X1ew9)b~BVudc6nznj57w0&8+_FdkS zXSrBP*ne#hc)YV;yU_jk$)y|XUuS(}F5Da^|7Lzu=L+9>b+g*<-nb^Ph=0G3$QsW? zN!vdLysj+vZ1w89mmOWVvUA<DZFh2SfBH7{j*m<oPnN;5s!f_)+_ATm`z<yuy`4PK zUGC$$#!5b;?_1nb`KD)2Tkwlz-L|CGd3&@s95tCLYJ9Gre^>Z3!GqT`9G_^jc=y*I zS28#fx9Y*ezU7j065r)cxBa{BoJy}ZlfA&q*K?+>eDswuJn^Dwma^o{14_G388H7S z{C=wIz2)(KBl(KsmNw5%FUvfa`2J1q(W&#A+S0qsE(E{3-Ic%hrz8Kn?FE;2{A`@j z&~jkr{DqE7I6ck#RpuK-M|!T_xnioCjPCAPRkigZNeZvOm`f=B$)31^D{a1^+kRDb zzVH2VyUOeS#VuhvwtrHmj^NMfEQ(*GCu#^S-S1dmwPJtWk9#|JR#)!lewcgc@`hN0 zpRbgrXT9ZXICu2mp8TiN+3TiDf6V=v_{~>N<3&sSu22r)z=VQ!Wxv&}>W?e>n%-|* zzhG16w5!$sAJ#9AyDS%HYR1z%ckf>I5YNDezS}Od?rL!{+>>Wu7BA?k^72Ax-R4yu zuNv>&^D|_!Uo3xUO4h6u7f&y+*)Y5PzNyNs>|aWkZIv#m@T7d7cUp7yg1|0&7t^}u z&(75d*9(?%2yJ$J_2%5$*In(da+9@sMLI;(4#(9jju87>;@a(8f8z9wSFUyG&V?H9 zTUIaTEfm?$F{_@ZfWueY=J?*9eY#Wk-`y<TDHzGE*!Azr`nK(djtX_I^xpsUbIIb} zW|on!uhoCwx}K>f*Qo8`=c!NDIy(!vPUMi;qiXtrRV4f0uk85WyHt)E{j5<_+j;eS z`oGW$Df^e<_l+%YPVJOn;h$H(_{Ke}|0i~Ky**!Uvg=en^ZeM_AL;4Ur5557&+m?z zQuO`WyPQLp1nSt#r=F|6aW4DA<E!k?pBy@5X>U{!rx4?MuW@~)+Eb_V3%FtqoZt=% zX1A;Tmz=X!DWLdeO*<2Z|J;cWpZi>Lxj9!vEOzBtiM$!B=U***_+v_rP|l5u5x461 zOg=d+`Fiofj(vgxf4@w=e_x<jb=%Q($F28ApPpFss{7j1HJUTZSYLg;?tb{oI_um| z{u?=JIQQ+DBci%x!LOa_l2O&2Po0hkSI>LI^nW%_pRt(h{eq<Z`wzA@MV%Jd@Sbf4 z->Xx8=dXQg-KbIOn){14oGbYC^|)VGr$0RXMrn3^&c&%uuTR#j*ebm^Jo@95t3MC% z^j)nB7ZWnkxqEVoQ2y`sl?Ti3Pu4rG8R4c-@ap%|oj*U_UibDC+d6)>FA473GVbdw zU)TRNJ!KI~)57b^TrS?6{qn0);GwxGQgS6v_uX1Gy|OKNhU3K3pQ<EmTaF(2bFSTf zOYt}Fa#fX_QWm-THbse=8!ha*&Z<#G`^qnB+@F1+Gb`en^!<#&*U57kew>fkqpgxs z*<!kmBg69Xv2E_R|9IV4D?Z7kCo<~cQbC^hU)+mWcv}x7Hz@rN-KQkPxM<H?X8D%G z@(f2Oy0To}pfHOo*2>jI=+c8lFWtFW1-?GZpKZ@3ATYf}qu1(2e!cjO{Nr;Ucr81o zl^(X!_sP>8Da=gsmv=eMHs%s9`|v~S<*_z~S^F2?5qFvG%M^GatkXngjcxG3dba%n zi|*Bl^9Mb7&Ga>E-QVfftjo4u`^;*VVSM_QTx_=13+?+2=EBmBpS=!!RxSLT)m13< z?nmI~uNogWwzl%WY2IJHmD%!4y+OQ{YpUep-=c<WOLqU9`}nxwkvOd#KkB<5&KEh9 zcP+{&sqoLr@0-_F$uyp>d6Unp@s{(K<RXOy3Wt`9s@+}wH}*hJBE!9ShiA)O9A<DA z>%H1r(_d$FG|cK@RnBQmdwsRtF<RG-h3T~i-+%Rh|Kqo>x9ckeYu>0PN0&H#Is3R? z|M$1@_$hq(TRAswZ~GYVz5L#vQ>*1<x?HOE{eHH+X1#e+**rVj52xPBikH8sIC|ja z<%>@mt#3ZJ=2x*Vdfn~*EPmTN)z^8oAG`CSzYCe?Rfx}XtA7~w<m>AgzY-($#_P|Q z>Dq1y`>?tEZ}R`p_3N$#S;=sJaWB_AY@u{>$?E#qH-cFBA19QR$Lv&D+-P)hf3}9< zgoV2@C4#c<{xH3(T=8~G(nQ~)ggoDfM;j||PCJzSjHyz){otOJK^vF&zRos&dgjHi zhLx<(^xoYz-1ksv*XuM^n_d4Tig$hExV>}vs`8yyNAz#3S^uv3(lW1~>jSrkXG{G) z|0beR!RdDJzqI=0S=o~xGKXqToO{o}ZWHs%%L{Y9f1CGDp#GHKiutu?+Lo1mxwukt zL9Fz0w&Ouvvn20E*<HIW>9xFRYMYDuicJAiAEsY7Zwn|`8`Lpn^JM)KE3M6rZ@RmA z=f-^nJIZzJFHi2xy|=LL*QBqEE7Olpi%PGbpZV?kT21-gRW<Goi*D7Yglk>B9dO{Y zP;Bq=8@o!mKl6P4*f?Re={6SS^i`pcRynyz-H6?!A+ENy=Jeg@wYtBf9y%*+?9KUm z;%{J6!IOW=U)SWdf64j#g89S&B_}1b3&G_tiUe14Fz@`jR!i`HoiU?s^<8gMt$l*E zyspR0_q~aV-rAWF|9eyK<38hkAM2MMpWvhtIaPJhg6sclBP<<#n;d^V@ec8d|Ha99 z=Hc~wC+zGV*j?=X_&AkEKW?Y>5{CCLguc2w^4d1xzre1C+wNtbKeT0z`sdRtcg3&x zu3Dz__DA2=udK3VM;IShNVdPY<@|Ks&y0U!m8Op`-8|{EWMlf}41vDszt#9yzLc_e z9j?Ef@#Fx@7bTg=7dOr|-Wu3FuetW=JEcVjm0w?vO%~eU#rZB_x8eB-Pj)^^JUo4y z-3i7c3wVB6SSfD*>B{g^@@Bc;SKr)=7mv(p7t!_<IFxgF>5D1NTQ#|vnUeea9&mTg z+$D5(``<^gA|XxxT2DkM>u3HeJLAIoajO32b=EmX7WK!@KY3vHg}H41l{+u;nHGk< zzmYJto%xQB+~i+hSF!rV=-*~{<KppY|H*%Cfz2gOrX3&oR&{eQI<a_LIQ)E&d*1wx z;e~{RH&PAReGB%xGEOzA=U+Uzqjvqzre}905_=e$*F5a^?d!-9xyO~SxZ-Ao$t0Po zFBcaovb~;V9Jyn1{Z+1b<vA%E?B2g<<a+cioVEYTUNeDfr@Z>FP0KG$tNq}-@7_O$ z=+dcIzg4OxZg{4a`#JD`1W&KXkDTv8)+>(`x^{%WHsaB|#GAzK8kf8H$=OH+3-22{ zRI=}#yvClj_ROMtD!(c{MAPp~6i@av+PcA{%{8*cZqcKSo?R**uWqVeq)}2fO~Ct< zo?ja$->Q_nX&OhY@Bg`d?fB1@Lu!-HO|sr@<Wm@M_zj0#l}SSCO&7a2c00YAtS!G6 z-o4aYb>+^5es^xoJ&RoLmMU1yVc6;I$bQ2<nqT|Jga0h`HdUuhxY}I<>c1%e`8&U( zO*E|T#XDJ{HHp`KH@s%MwR&M?c76Z0Z{b`0%tek}PW@WT&iCfBXf(g9#f50=hJQiZ zRhOjv`*r-_{6D3~w(<U&{Qj|W`QHogs}<{bJM&UhjxE%)Ex-7tV8^X4iRt=FV#E%# z6zVVj`Df{-2kv4H76%^uvTV+tQSP)gtZ0e;mXK?w7rEX4&zzNfH|I6CUi;S!b!nbs z^=HNXc5}1*cRJCft}n6u`J!K~3*TIQ>1n0KF<atT^79p|aw@aKricAfzwx8>diWxR zHy{64J3n8wxkcg4SO55gy-UwWuh!Ok_{Vg*ZqHpix!|W|b}^y(Gd{cP??@|LKl@?h zzgIIu+v{erR^4x%t}j>o*&*z@!mdcA^Ratgyq#TNuUjlr&Y^xouAm}af5GPPZ%rSq z?lW!A2$TJ|Vq2GY*joFlCx<rLpa0d|`7f{a(1Z`3HD=CRH=it?{3de8(w}YDm>Ld- zFPMATX8%h4%N5U3=U;xcKA<;DKW5$2Fw@8d97`3xvU~1ax?3>s^;U-Zi0!QV^M6&} zk$Up*>D>-#|Fy^Kw{F;R{nTRjTgRjMmpuRbd-=rI@*kH?6J7p0<=3qlsw-0x7<RF< zN%*e)a5Z{8-)`qO@()W_EU8>oDU>bsOgX|?zdWR+$HT+LJKp_phlODB(-|u=rz*JQ zcy8i+wES(@mA{L5`UU6JUrGJ>Gvn<}$+}-@JDc{Xel)gNU>nNyH&3<R{qb>5kDoh* z_4`hFO`m^s<ChO!s{Fq)qE{X3^B1(-KF32*yQ<1^?&I(J5uUTMP7AycS;cd0UlGf~ zt2brVmAOuP+y5=6FSIf}cctvpfFIIl->>)d4mvYYkV`H{wLBvCz`h#Q^UAU&4Ek}` z>?d-2f76{ERVlas|D9L2mK;AHav{BZ=k%pd+dmnfy8U^#{mN(#MTbdiqa(7C*8C~; zn67zjdct8Nk*q)eVsE^?aOR)k{iBJD+(L)v2t8PB^2FZcfx#EqXaE0H);^yV{`B*n zdKs&K?+xZ3U%<?`$MVme|7<DDbHYHE*)mE^_9}Z=uc?uwu}I^OriJD!tuU?U+S_%e z>b%rV)P1jaOg~)zuKphbRRc$ZJcG#wXAM3W8X7hlo-<-HvNM`ybj{enIL`QxiMUC% z$tTkaG&tFGo#{t2J+rB1zs;vvR9IZIWVN)lJYqH7n%{bsO}(v!ZI$gwJMntE1iMT2 z&i3={|2afC>~a)!%yGQr#N*`ZRO__eS;4u>`MXP^%U#z}Hx@THw;gVu+&kR&d5C!A zd31T4@%ZQ|;o0Z8&-0O&lGhY(aqmd)67Tii&wUhqGJMwh^7wlD_WS<yi}!otAMU@< z|4o2nKzG2qz~I2Sf%k&cg9?K#2iF?}&kKGQq81VqQW<hDR3~(C7-LvKSXJ1ZuybMG z!ZpG(!`s5|MVLqQL|lo~jtq`0i<}a<CGu00YE*L6f~d#QQqk$r$6}mg*2hZ4#>H-l zi;QcH+Y-+Z9~6H&!6ji^VpigrB%P$Dq#H^9lZBJjlT8^IK%o!9v#$iF)yMPOd}ZKf ze!;-Nz;I*JjK47Y@1uWTIe3}3GcYo6Fff5c85k;V<xVo45MU_K_FrYk?$bMW|F*qz z_wK?&3y;iwmv!f5VY$_uS5|j+XJ0tJ-&)@|{iykWuT3ZOn&M9|GZ-^2;N2`x{KiIQ z=WUK0Q>Iq}+eIyxNhQ~xm0hDGB!4(!!N%Md8d}+&YBPPjJo!3Trn67X(rq*qo9u9f z@0h^WaD}5!6>pxrDLo<Q^@;3XzhAz0+qAP|Uzyge9kxC3E=AoB&%9OZp7~zvrPH%* zfyonInHg_ms*RrGD4(VCGVlG1yW4MPUEOzOEsL47;T`h}ExYVbmbvvrw$zI}W4q}8 z<d(>0jXi1Ng}k}v)B+!!d2M%WvX5?Y|H|?U!9_h^i*1^3P5xrG@LY<@_xA#--Kp;u znO%{Ty?(Rp#<fM#L7DT#@1Hy1aIG_Nb{5|v|86Ot#q!DPT1o@?cQ5++UqSkW*WAxs zll8xzl$$B}K6cS&zodM{qLR8ftw&yE*6&-%d`JDi`H7t!nN{&yZg6d=o4N15%^F3| zHd_u|>(9OE%5pz`Uz2lNcExmSV#fVsleZ?7&0@E>tpeL!q$+wP9&KIf>d<B~IXEIe z!1k=z(?7j;TewzTIXh|J&G$lw>eVyu7$3VGV}8-IHYt9QMb&Dl+WEhxIHe!8nOY;3 zdnhUW;Qin?&k}6sOM6u>xv*v0H}jT?`i|;V<*#+}9o`<cKGJn}ld<P<KH*1pFJE0f zfA;TTj&=P@`NXI0STC8`^U!k1l#t1}kG8+_2->*gtjntkr=_|Z6+iXA`dSk6um2>& z2ALoH(Z&~+F--nnCCw(nuxSlD=VXOyllt%fXNvxdHgGY_Pk$1Ykno~EneCO`ku80V zj2fpo7=j`N--D7{&Ut1L8AAbv3p;&trBBLa-`@5+;P$p$5Hee5Zh3WE+3aO$Ms<G} z4(v<k+R#|HX2-pp`0pHN7XJ=>!9Q_<%9ZAQ2J+JmXWd}9{q?Jr#}4NAIgvS6dt#2& z8$O;=c=^M|lQ~wik3QS<Ge<D`RM-a(8!7(-lRr&~DG)z@YJKMorF9+plR89{+Gi+E z>zbO>Z=vAVt<7=5K*{ak3kmtjiCRxG+|`#I{u3e5oye)vE4snR?10)0uIh&hGHuC) zY<dTuR*3XJ4z9`T&)aToZdq>e-Gbk8{w}GVx9WGk-)+C+?3UI`>%M<p?xp$m;e`jg zlmCVv-@3kU`>nuG>pm&<p4Z28&0d-x7uq&Q+D5DY{NxWJbN(MUjI$2wxSO=UY|eE) zXKSTwcN?D$&HdJQ{#!^Td%x*qE?iOObD;HBVTAR(40jRhf6rFD&w9M?dEMWu8~v<x zcsW-tuv$>Isy;VsbJS|F6`Wa9q!#U3!KC$c`JQW8*;7r=&&s}M{(eTHaR!@D=A@UO z`9Jc1`u?f>d->P$Z`;3{Ph@}MVd=y-z4<A_O{Zhid~Usvv|VVxnjxLLRCmivvrAb~ zuG$%vx=U5J%uu_`BITZ(X~MgF;gzXY!PQwFTUV-uE?*Tg%`2F#-phZY=A`#C-!I!f zXZw=vGqx`<|995aJpJB*^Sd?cg5TVln!S?iKFiXEl{qsQ+{_f(HqLBd5#Gg=urDbw zHTn62Cy$;zeEL{iKtxDPP*iyOgejAzO`JM8JRl?}EHE_q`h_c(u3fx(+1$Xy$js2x zc>9Jeo3?G-y1BfdB&ndRu(bGl!iO)PzJ2`qnV*A)i;t6+yT7BStFN=S+h5_uF-^?` zEp8VT!zJl*{(B22Hzu-AD4*B3P}h2TqvB7E!=ei1QA!g|=)ZV9-=y-;5t$wTR^H$_ ztGy~oWBm%B)oB`R41Q5sTAS-@9oXv6FtRZ@O1OXgUTeHrEA5tQVnDeE!>+?j9FET; z7#zht6l9kNx11Av-OpGjC%0j16C;E2iDO-XWlHIm8=fn<U-KzaDxSW3S-SOy3EWrh zithhu|0%y=2TR<y$-TYzQ_>&$TNZrUE_3r|xZjnAJEpe3O+$7T_)NZI{{P{9snDG5 z^?b}1BY$hBeLoTSpm3&PKwi1+s>R2$WN#l2d-1;7SkGAY^3@lIdThSM`&<f4vtIak z{Xz3}p<4gFw|Z?o<gK=S?u>Hg>_-QF?2%(XwcCH)KdH(8Kc=lnp2uHuyTpBV)p;3N z^DVvNlUD4VbR<vpq*Yt?szbsxo1>-j??=nc(An-;e?~MkaR0m)XX>|@{<AWb;0X!e z{lSM{R49Gl-c@(KA6k0tS|O5jUphkkQ{PG7Yv#Ff{D*w+nr?Rsn73X0)}9-;ef{n_ zq_+ij<Rm<jSrvE3Omg>y5AUkxMz8GTF50W`qsFu_G*t9V-j+4LZ@K+aG1BSHh?{vo z?XB9L3p+~|#hj~eKC?_Od}r@5+3C^RUze9>Oce6UbdijF72we~V_%TN{SRvcS+Cb? zajtrl7^URAvmkj*nI?nT0mgfFTCbZ#EA_3yUtZt(+5U>z!HbWq{22qJ`(j_1H-2yE ze=$SqfY=<?3ipIH52Png&TkV@zUO5%SD`K>dRLhJ{_2LgK54S)^#(RmZT8=*Nc;EN z-?wI2hQjniUuMbtIsZX6DfWzo^L@LICGXYd#c%qOdv0#Zd>ezcUyg23E|z@r?PSCG z>-8-wJ*BcfABhk6@G*dQ<Ei&A${PI|*%Hzg=}QRiYn&5RH}fiUp0|~^z1x-7A;-77 zt}Mv6zW(0g#}WR2g;S^4T)Mfqey7i@Uq;R?-#PECxN9Y-+xdBm?v0Bql`E`cGz%od z`L_4yT;q%ItSYHJmYU@lU*G?XDZtm)rs7u4!QduQ1_p<V)yK{5-?%0%-MjY9S`+)5 z+j8r-cbpNu!u6>9xxgX&{b3xR<k=WF6{i>+>QtDdv8YpVn#Cheg^4PYJQb&!T&h2* zFj;34=LBcH$|u1NimoETPMWDxf*n;uLxP=kORrpZQ1)fXT-F+PD`R=H->w(S+T(t` zNN;d#lSpd`JSLIe<hg7{T3h6^8R?C#(<0JLvm;JhUEAE)o0DW5edCnbHt9ok>oy${ zv@4z<FOwuLUU^dW-iHb9ZJ(y)w@K!)$p5H6p?>e<QI9;S)Gda`q|*0rsudknne1zL z)#UQo2ZsI?=eXy6>XF^^sBdQ4%-jPq#b=H0GjZ!~x*_DPyZH{6_S#Liq_Wp;zQ-n= zYm~8BciXKrYxTDqF6-@n`*8Q(Z#UmJH1idn4V5XoA?Pk!e1}ur^7WL<=PXY1KA%(G zxLBt6qH6v0dSMoRHvwh_h68%e`*Lq@yV*Otqob?S+r!KA^odg^wKcRfSFc#LGCLzH z^Yx2YFQp}<Bxlc<H8VOQD)RP?TQ{vOtSoo$*tN5|qN?)uk6%Bz4=s9;bvICsi}{0o z@bqj)u2$!gJ6}y&uTDy5pLt^1?)gsp-mUzg$C$)@x$wB>oO;jm_EDQ9)C}hCP02l- zc3<jJ&cD8`%V+)l-u?f3=lOk~yibeWXFuwC|L^~m5C7K()zq9Rmf`>Pfq_}#kc8Uj zY2|K{eLp{5@_NeY>**)oZJDTD_ROYauf{za0rizzQoMBcFR)E+YD+u1<c&Pb+^<Pp zXEw~6^5;^<?KQvK&$%s+dtA?Gd}Xez0pCMGH-l|ziam)*zQ!}6joEh@+`e_uKWWb0 zU(;qJmUAz+w7YNW_t{c1J?s8t_SLJutB49qS3U6xUT!JuoyGoliHE-aq^p0TVkRv3 z_9|%Rs*AjrFLT>mZ)fD$?vptw=I&M>a}76xdwiSZt5#OtH#AJX>pCH~(vIg^{i6LJ zx;U?0)o$5)=ab*$kdR*gb3WyJ^+fV_CS0;BFIcdD)vtF-yroi8??_ol|H}PgD|{tX z!qg`r%T~=`u9{cS%*jf7_p3f`{StO5@`7@e$A!)3-CIq|7P8k?M1;qLHL)d%cs;x~ zElSx${)q4?!Jf69?6nm)cvaY6WyMJzRLNXbp=GV}D(=5+hfd22aaNtRORZm83-%;3 z1+RYYSa0N!f6QQe+6wWfKD=v|X>vP@SLtgd`gs&Z94Pt};bO3D8Y2%V=-N2Xs0r`i gqGnL)#(jMAv{XLsh<}WXGWVW?oAQkR|1<Cd0MuNT)&Kwi 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 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 m?_;>;vegl_fBdt> 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 F0{|iuVC4V+ literal 30244 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 CiNF*9 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 zcmca`o9V|nrg{cO1_lN`h6V;^h6Mj$eIvJvoyQm$CQo2sU`R;LO)RKSQ=P}aF!=)m z1EWoHS&0JET>eE23=0Do7#OV53et0Lh}{0bz%W&Zfq{E^dSY<_0|SEq1H*C<&5@o{ znRby&C6IxE;SB>rzeGlAVv1D4wD}AS6LlCE7|b#<QtJ~rjF>?d<S;NWsAS}pRJeuN z?qpz?n8Luo#FmqvoLD%+ZyN){1QiAbMz-9<iUP*%Jh==E6Id7+7!>jnb5mm@Y8n_A z7WObOu%r~^7nih)|4U(DSPF7*Z9!3L!K9u)rx+L(9ARK!=we`EFk)a}IKd>!z|6qT zz_FEW<3FFQ%^JD8Raimc&@?%0(xrOS1k(d%yykZ1?=4<fPO*xyI%oaSmdUo%cAM=_ zJ1x6ZyG3>{?S<`&?T<UCJ9If5cZ_u0<5c4G-8tF$uFFDKAJ=<s9B#&L#cpfd)!lm- z7{Ecy$iPrpx055D-{va=H}eYy1_p-P`YZ3l=>Jduv$6bQ`o_S_uzCIDQpU*|Q)e(S z?3sLSsw!jS<S$d5m=t6uTTGMJXJTMrU}j)o5Mf{jn=8V=!l=Q(z~IK<z`)AD#-Pk# z&0xzA%@EH}#ZbqvVDf}%CL;g;g93{|mBE(5o*|YY5iD_Mnu*8%|NkHVfAs(1{|Eo? z|G)SD_Wxb~H~(Mrf9d}j|J(mJ{;&R@_21~f&_DgZ3;!<oJLT`>KllFJ{&Vxs^*`7C zT={eP&!q>M57Hi_FfdL|obI-H!;EB}d`^ZUki%Fw85kHAft||8!pXqMAi}T+D$c|p z#;^^_W@hkWI0I#~FlaG~LD{SfQj88zHXD*SFH;I*6jYp#!Gw9=X2lhsnI~(mQDAJE b?6qe5WahQLlf%}AbAy7Fk%965e+GU4%3kK1 delta 2333 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 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 zcmeA;#<*oaV|}^5n;Qco0|Ns?{1yg25WTzt!UwTYv460>5d%Z$5(Wl_AO;481h<Qw z$C7gs3m6zee=smGTw`Ehw5d;1otIozqQJlqbBBR}L4$#T!HQ`v|Dv>l^jrppunP<f ztlbO@+|zG}-2RZBSX^Jgz!1NNfq{VoiUrbhD$^Jk7+n|`0vi|@`Xw%MsRU-ECZ;ej z1ixWmU@!w=sf20sGcr;W85lxa7#JAj85kH;IE<L*W#pDrFffFuFfcGCFfcH&xrN#8 z%*jtqWMBw-!oa}D2Ev6i{I=yLRunKW1RY^usAo`MU|>*S+|HAmmzbN%z!1yAz`!_( zfq^9@Hln7XAiubTfgx@N0|TQ70|R4iyZFD9f}+#{28Ngz1_p*Y1_p+%Nj-l~Roq$< z5t<<FIeFcxWs1ESZV8R5y$3|Br{$cSU=d}~HeE*DJMP$p^Jl=|Pl^BWGiP`_*ST-n zQ@?X}>+avmuQZFouZLe?Y*J(RGo>bB!GRx>o^Wg_-y@oTRC;a2g__T@XVrd+|J&0! zpSek#;eq%I^$E>^7Qa;6ICgCNck`sOdFkec0}MAa89rQZG`#i5<H;qrb+efqELP8~ zD4YK9;;}UIpcB`d{$wPUn5d;>$;{TgA3SNw6vw53_4DU?mfU*lSKJwu8@BTNxpO7A z)&{sd`umja;_A*bA$?DHy4=JplRe&_>3w%{dHd_%FV&~c*>dG*x}l%Slmp@)LVOjK z;$~c*^U`V0#OyQ72hBf9*iPTaBRQk3Z2MMo--aD(6B^EGs!1}u`m5xYn5@xla7jaS z^JVADf#IAd5{^x%zh@ElCG7Uvko?bHZT_-*ulD8GiZK@-eYJ1nf?I3PyUtPBsm{I9 z{+GPSC#}|xmbY$4+@B+B8r-I^X_xvLcU2|<o7a~ZzeT=1Sz92-S9blIviNoZ#!Isl zJ9n!YK6>+Qg{#O$&c=f1g#s5#*%^g46u$f7{QdsU+RrPc*V|WRB<I$fn9g5o{(AGq z89F`7wI5#Gp8nhMqGLv>m2tmKM%a&c$K7^5Sw1@|!QrE+>&g=CCo3H^*PBLotxVaF zyz769v19zA&xe_k^{r|=)Pz1wi#~o#zRn=V_V>=@iL8+YJSXR}Ob&nFe}ntD`Lvp& zXFbj+te3f4|D@yn{j%9%7H@x_uddIVFFxy6L4K#bWnE29O#Qxa6OrHiDQ=g--@FJ+ zId!@F@J;qPWle!+OqYJXW9;!`*5}5$9*M#*`w7<F6Dv+R=-&HX`*yO)`uyeFRn${t zS^4Jg`C|Od@|X6E##9Sd{)2Px-d0!l2;ki5o6RGrvhWTY(?XA&<{|+e*4u(62R8B6 zXG`atdn<i#+s|n$OMg7PD%$e<-OjhulHJ4n*5<`te7ohiTNkUoU~dFhTEQ{d0~;>e ze=S*c_05)YB_+rC#q&80q}NIJdU;IuQY)32$`ij&d{suN%!5*a#J^eFE?YP46Q9L* zwC|j(MDBgHIZhX&_x;ywk3HRWq$55<GjEsSv4VP*)yieHsVAN6E5Am(T6bWB(Zq~H z@{@ETwy?z6+s4k@b<eNj)3YZhbX}zvKg~MU&--)TTp!b5q3!EpcNA7y_vID++@bxr zPxDDD%i@Y70z&D9T|8P`*;W4^ZQRk=y1FHH&Dy(9*fZwc4Bz#`zvSwjTc7@Fw*C7% z`S<(~bHVvFq4kEf?>{PD_x78s$t1An)us5&&tGMIE2<FJD{mK@_;I!GrXzD#r$qSM zI$e5}{e5BY>eutPmUKq59Aiy?WWuq5N3e}^N#<(@sRXUVcleAock#`+EGF>t^#YMR z#w0HDqSy1kZteWbEbPA`D>8|@rQ@%;@?`t>cDp|BzQr;}@P1uQy*Be*i@cn?ys~z| zd%vDt-}C6t&2~A9t))L6d@{Ye^yalAGp098e|%c`lJu2=zn?B?+Q-;6E$;hwmoa4Z zU7uD9-qzm_uDqG)wwK*Vl&L&?>$-a9J4?$O%&jkHw1}9#V2j!tnBP)%__`45ufW@f z7o_{Hl093t_*|IL(x%6oIZYqcPucf<n!n5}<3Gy|di<Q*>fBQ}**7*b$kuL(<hkEk zLT5uZcdohF6Y6#%W`=}ZTFVqQJClDOzOUnzS;G<dv@|-!>*m9>rFQv3n_gro-9F`U z-Q`$uwZ7d<iBuz_zGZWJy&fuDn*RBvm-ghR!Wr@wFQy!y|L4loX9r7O{;0dWtxcwW zf63uLb2@iy&pY<qI8Sk|tl`WJa}=t*?{b~GB%6P`!((>dy}5F;sy1v*TJrtuESrNy zmGd-Hye>QT9gnT9JJrdTo^nR5=+x3@NB29&tISAzZStys#o<S(O`H4@{bv5&ysL*d zymh?sHR8nGrnuA2FHEiEYyV~RuDgFm?9jE)m3sAkIxnuJ-VKu}S-0}oudm#@Jda)p zjaFkg^jlx^)r(ybZ57v9S!}o&zWYt_{9gC4b>ll`RY9gDGvydE)qho#>N&anvs(RO zWxCqgjGmP<;`!%%zI?CgPqBFA&&K{(!{3HHc_kv8&O1&{{P=_Y-`gu6r_VQGSXkou zaQc_~=bU%FR;{mUK7B5v>HD*4>jN|86fR2zdbw%7$X(jM-AZlqx=q`kCjGvW9b=y8 znpYdP_mbg@@40#QA1up%o9F#|@K((z`lk86f4k#~{&(jWIX~Xt;9Irw-)#2>zw-99 zw6uR?InsD-BID)a;3)NCsR@UQ72FQ^F(;=tXbAcFp0sOkFq!RGZ(((J_sy+g)76i4 z{gjyguVT|Bj_o&QEs=X*{kCLc+Sl`WPs6LOzUO!uXC|sS_tnnpGgS7MZ?NuNxcG_v zG*`j--8Wl#jJr;@96t8yh)U-sdH-Z@$-@&}72g~e;F`4X!e!NcTf)i<FP*z}rXV<V zsYsuxLHy0-k6xyPY)a>TD81ODzF%)^yvna2cTRzOWiQ{pVVT>Y<x{FI)FJXn_-i7E zfYcI>2J=_)Ey6O44+GY|s@|HZ*?z3`U6%D>PxX@h^<q!wZalm=?&!hrHGBS*zHF&^ zef!nc3p2AsSMU4(ZTmy3nT6In+d`c#`%CfM|6`>s)x9Eo|FY}fcJBC*ts}<lu;XF< zC81{z|4wKO+i#Su^(AZFZoZDr4R_v6+9P}E+4Oa}Av1jX%hO6?%5D{0IKT8;&JHVc z`%OxB4u9?w@_ark$|PTO_1%fB(wF}ID^9eMT>DgUsTRYn(jOfA1Z+DF7MRNiZ(+`E zkzP3eNJG2yRDruE9lbnPhD1z|Pdm1GzU~<n^Lh1ObHp6o4IVAKVPK(D?sWS(gTd;( z-3LnUTdSMwapic>^zF?=cm6Lr`N}i6lq3>&1$|MwFDv2o^J!A=%*|7S9K5eC%H?~% zlCQsnLGi-Z2aB!jCk4ED7O|hHHB@m+rG8VclhEXaJ4^1%l<3XQSXc76C!=+ypUTN2 zt?MU#TyGf8S%1*(*xQODBG>A3CNVmEIIwj8GVx2&2b(!}EPLO{&e1a=msv2Uki{dj zU#?Y#-?m%HB<tpudwuQmF5DJ;c)`kJjiYH!OY=mvuhCQ1r8p`$Td~C-JQ1>?;K{+Z zox3JUN80{+d~!iq=oNWwF2gy6kFUi{n0ZV1ztg>nUz7dMtY2JQe|Y23-}mZ&9QnK| z`Ru1J?eoLV{@giBrFheqUVSD78{r0}FKQVF*T!l$dkCM9d>eE4(_fLBD<7OJ)$B0b z$2w<sjq-Pkoc?V8SccqfKc{4EUAQ~1%tq&^u~%EgOYy`1R=->>@tKX)D(BW-%YF4q z;x}w1WN*(Fm{e?RWmmaEHr%d$-I{x<KEW$CF8uv^yZR-zLZP>+;`hBZl6^Q*Eex3> zYkqLCFMjhVKmL!dQeGwJK><xgt{!E^Lxr-Zt4nnJ59^oCW#8s+boqqB#|ys~eXA3) z5Gb(Xoy6i<C?&un+?#8l%aV7<%vovU(twUB5@&*qcSjxh@>_9&&j$BkwqtS^>;KlT zINCaI;V#RT+5WNRIhpb4WmTI3wV$<Z+Qzy3<Ce7xr@rZT`c+!VJjHA2?7y07Prg*t z`t8p&)A}0~$1k0co>nHX@<ZCy*|*t+>-Nw8+H`Zf!v9@1fuF6Vdy@`V1S^Hjs{J|d z<)XPCSKnT#Fk8nUEkI3uN5|G##Y&HM^*&3gw_K;hXTDi;GRNATRi9tg{7Sg!weDEz zORn{40cWyZlrAbB_Yo`)zW%85W6{Hecc<nw-wZE%_4MJ)t0hYl1jG9xyCPS#+@5<g zTWRJ}DXEDcIoyTjeA$07c<ah29jo0>=6{(U==<cG->DAwsW}J3A~V%|wj0dR_Bq3_ z;M}ME3yY=dCCd+2?+O!Yy;B?+w&ieV*vz(f>u-r4J1n6oeAUc@Be|@-mEo9}gj-H| zj$fd}<KrPFTe?gVt{-yH^^@K!aKEg3pND+hzO>ByKAYpt^50au(_4P~|I>Nfq?4xZ z%eli_yf*&%p&6~hC*M7Y&Nn$!(avyjiR!C2E#`Z6e|;t*`=P!uP$$$)?fHA*w(6ps zIjP%p=X`FD-xK=L-AZkKMoL@z<w++#1Wo;^FuCLC<gHekn^@QTskXJ{-hO${V*aK@ zk=}-<IFB2imD#sCFzfAI@xxIC3NP)hOo_0!uq;dnjW~P2v+ulUkaIGd;$zO+yhg8o zbJYbY6=hzL^xPaJb$51FeO$0iUwX{#jXV#ZF7~wF#L!?+p4oY7*Rr*T=9dYpisVS` z%vk(HNc7{}z)YSQ3A_Fl7m8WD4>c&?dp~Dsh`Qs-E4vyQI5~`WFEVx0yUw7}ce`Ix z{?U?u8lQwjJWAbHY}fwF(sa+kV2|Na!F6x8%?h5Z{58q$m6h0<N2?^uCjP5`vUKsa z-OImZ<;<9W(*2*l>!hH)KVI+1YRYQsQF^;TEkN&Q(4&nddSd6VoIYskdAif0bI+fp zzR4Qdp8GYL`R`AkP%UQ5)040%Ks(JzWU`9-Jsm5-G>*j||IW#eyQr$H6f4@TdAPTe z|FQ4UMT->gd+h)4Xn($|pzY5~DQ55Yo~}ReKj)qHgWEec)xF<oq0(z2Ww<%zv`Vwj z#-}QNGVM~w%y><Fci+u9wIjED`{^EeW8*jLe;XPb8-L#Z+iuye{C62{L64T)KEB@b z^XBLGBt6^D|DRLc(&^>oldd?!{8QqF;7RrV9&d|(l=JM}?0(Yoh-7(&b3;JE7B=An z*9D!O>Jx)11r~apKRYkH_Wf`BvhLS2CpVaxr?6R>25P2Wp12|5g@nvin^#qdAAD~v zUT<_*;_;U3=-NfqjFGXgt~LmNlIn<U|M0_ORfMlr+L{Rcw%!6AyLsExKXplMTT#VS z+;#Tq*<NO`RHuY9ClBYZ7m_jADKXcgq`$+aUQL|yZFIeK{0UX#$69Q8$C4PeYhUHm zxU{U2I%t$+;b`H#e8-_JD~cOqls|uN@ceQjO|ACPL<47uy-zOu7Ce6I>;m5}&HC(( zj5*&Ny1J&gyR27i5>V}{O*(UR$^?;L`x0MkhHTv~o>#N&?4-p{b7wOe^1b==;oA9q z+C8yrFFf;}I&ou~Z~cca8lQ^l&->rhJ6rqQJYmX{xjadW^{QRYK3>GKq~==L1O3l| zVo9n?cUlW|Y9(KOE4#5rP_J{-wL5nsSH3-V@Y4%%`wTnZW4gv0gC+ITP8sUX>$E)Q zy7XX1)1mvmeJf@d_FQdsE4BaNw(Q0njh?r1!KW8Z@YyQo9hGlY`Ly;{{nM>GKIP~J z-<`QztZQoVs!6uh<zcT5?Vc;~bh%9Ijox)-&6x~IOm3$S7=GLnc<*K_<H-Y!%+Ib% z9(8e>r_d?#nElfFy~<}~PhNN1bhY(Wh{q*<udSbamEKm=+Izg<-2TUyBO>=<z_cB+ z(_iW79X>77{UOoWeoH{Nf$21rq_TPS2_9*hmwSHBtcc*2h}o!a6`_94mFZx<o#L^s z#f)qG>zf@lk19p^PYG@6^jaUw%oO9|dMl*ZbD2=8`bERVTnVrJx9!_%61C86#h;b? zd6`cf`L@e>J-ck=x<#y8<lnx3Ree2e^-cqI37aNY0fkK76qVL<is$2UcE6g%l6yR8 zb^S!YYpHc_6ldBtoal{zeUD!+&}MI$%X!5G=_*Mdckn!Nw7L@aO22m9W?sACjII~Q z_4DHl49xh}XcoGDI1#*j+NW6NLt(2Y#vW4JDY3lA&23p`?8*GUH*Wq^mI@G?JL~wu zQzCaZeD96gd6{4TjI?C(+ls*6^tUr_JgappYJI6(KQ+ntUn#fLgRcU?JgQSxhxA-r z`&}+pYH?Hqubb9ahhH<!q|Yla`LEa>w>g8k_Ty=>gm<s&A{h=bcxc%_cF~%<dA_v> z(}L%MOATLT7azUbC3vS|?cVjt(KAlXFyqR&e(TYnClxy-HuLhHJ+x*`Pl?U#mu&{? zewDGvKd>=(-MOcpKj?7J;@jrQm-f%lFtJp#5z%|wDJi*7W9`nnUnd=l{<iMbm84J` z{;H+_=1pGt=g_Yyte<aI<azNg5qj&g!cgv_-AvCORgQx#=HA!btj<awjZvOty*Dss z+oK6T{>=GyVdm=m{tqix&Mjn>^L@H`<C(41i<P6^^r}a5B$|uwW4K@6?K8!-y;`Iv zSYDm`>#5i?`sKOtA795#EZ_(*k~`J5c~_T@!A|*4r`MeN9QI_{ouB)Swx;Q@Nu9hh z?Y_l{#fqV)w|q)udYV(4`TBhOrK}cJy@z{mt65#F-kxdpWuC#i)Rs?oBcC|@+O~Sz z_NrylY*$t+3*J`x{JTz#&f(O2`P20U5>|iy?Jr%pFSvXCxz?70Ys<`1S1QHsc{%w{ zS@K7ZRYfJqnoFdfy|}XDKx*Vor+gLv1G^`-EfV5(>S&sBvYSJ=$zP%8q$C^5<mO#{ z6XdQgez;(B`0Qsw%9Hb#y-2dp`SAGsvBe^0iSZ`CPL=$3w^-4qk(c|N|F67?X}z#w zO}+d-PWRh>i}=g7-ff5wDzM)!5zb(EDCPs7ant(KO9B#Zl`qr#ckcYk1C;?%->+?x zW-wHVT~fbz|J`Rs({J2ifAJ#rw_o18H|u=1WIe697I1+rC!;yW$>>qo0TZcyzwN&> z+m1`!@Amrk<zm^%1JSQmr|nsAZ2oO;r<$!dw>%2=uTM1yZpaMNIkLs0iEE<8Q6~1_ zw3a>cj}#N#W^E3>I6=cNVLuc1{n?$fPtFYwIUyeArX75>S0m9;c!STMF0N$@ANcT? z9d~=gX2-iQM`K!%LbUO^HtwUHYwtR{MzvfF-}fv3iR+)*7ZST#>@Hq4a}0jgklFml zFVHmfVxGd8hQ#_EjVwW;3*+3R*xO9ow{h$YdTYSkFvq#2W$A<c|D?}8ls;eLEI!96 zb4grY-!*S#)w${Jv8$g>j`ukHlqt{XwA{LYF9{a>ZKYbGMH}O{PuBT7EvEkN;|cM_ zvz0&h$LX1wmAOpX-Cg*jdHWs_t?&*8LF;eVw%hz!$kDvuZrqP!_3Upn|E^ARW>?o% zKAoCd_V7cbZuR?554BaT+qQ=C_>`{rb@t-SqJ0)~PwH*E%J%2N(rm8{q8{(|ZQ1o} z_2fGbd3n{O!_TRB&;6Oq-WMOH@N3)2nY;Hdl~7NOv)Hyjq_SvdT^GZ(AN8{sS${nH zs=fK=BksFV)jR)Ha#-(b^0<7le&*g6232dM@3C|7Gd+;4<PK)3Q<&n)b!fqZ?vBqd z>JD;D>`)5b*lv&}82&@~-?G`)a`pe%*CZ4s7M;md>S*<K7Uy}}IycC$OQ^r-!ToKI z_nmgK_)<Layqsh8o*A!Kx*vJ9vg7TKy4B|y<ga&K*{Ks({-A%-tZNdCO*h{^`J7X) zx6)v#%<cX9BI!*5t6bHBWFG9^-~Ec!wtwn`6Hc2wO<9GPitUfsH-UeO+qdn0+jUfr zE6$%WduD24OaKQ1gPIhttB4<iGyAg@iH9DpzqR?Ru#ocQ$Y}zZ?;bQh7r!?Dy{k{` z^ZB8F&Sr?cb#uSi9qY@;BJ8kYJwI>DP9M4a6ZK1`6cujFzt8+zR5aM@oPtwR5c9h| zS7mNxdC%-uJpTRd?TE;z8O3o`RXHX%HM4E>0-ds#J>mYbMLxpwWZ&^8>*EwJtX=hE z_kqqx*6qt}qg~Qe<}bN-;#}kV2HV%mRTFnE*#9&7m-~v1^=k49S_E9JMH92CHt#+E z=dt~zm3ItS>;E6~mpT3Hd+w^^o2!-|-M>Ae<#PI$mvgmcgc1^`?=x&-d}Q8p<4T$e zLqlQBRg+$yPbXaBjysf=v(G!?Z`;b~er~F;cl7)S!;`n~^GSGo&|*5yRy%8t{C@_k zhP;yAP=}KL`zjAj^#8m{T=K3%Uh&b=>jef9W|oGYAFSWpPD`xcva@RS&iG^VUN+`_ zT>V~qjqUY!kKOmRzKkxPX@B(T`Jgv<%cRQp8oR&fTiQQw*2&{CC0X}FSU3b0%rIW1 zz9OJFzVM)z-LH)^9tC86)7Dcz)h(TRD<fc$`|cSToeK_f9%HEA@&AeRu6$d&+8-zG zy-Zys#3y19>hk9ZH`~q<EBksg^U9jfAEqjteG;kHU)Yeh*GuBq9JbJw4chzrEkE6M z$bNC;w3fmL<-aVl99oYf*!)j)uVV8~t3S!T+KI!rcl)e!pR;Dq&3xFMQmHW6&gcBo zcyrHHXRDGT^o8HF&78C*rpi^bcCFzp;r;Xfx<0)%+3nr!d$VMIf0O<${K4g2fBn&W zcdNf`^SdD*!Es!L(}2yia`get^LrAD-YtFKW6bb;eUonZF@|mbieBp*_SwbTuD!~n zsVsHP`{P`WM(>$i|DwJq{MxlnGR&~aETK%&<mmR9))UVBpD7~$>d)T3kb|wKWWR>8 zgs)TXYVkUns?=F}Z0TaYu0?ZQXNg^rG19B8pZ2?vA*n&{H~*{qx!HV6*RsFgU-AB> z@a5{)#&0L?JmS}!KG$m6({g4{DKXpY&tgA%E9$vu_O6@adprN*tHxQX>2tZyi+S9X zlX$r3{K1#+Ys|MC>(JBHTE`mfGNY<zmCekvu@P}Rx_vW!x;2-%l?kmmGHH(SL`|bP zSKYtHN}sBqxzXwJ+xj4rqdQ+SHeC&`yJajNY|R+X@O#^|%s<~}y!x|Dch%QrtNw1| ze7e*iUFz;Hai#YgjLUQw7T>q%V(i)ZiglH+UjFqf{}ZNEO*`^9^~%Gip<gOvjafLt z8oI0d61JW{y)(M<U~9@DUe9X1nHB+Tydti)?IETsydr-2nb-fi^LhS-{b$3L&WqVw z^!?<`s^w8P?Za=cynkkQbcDL4`8l_Z8(Jsyyi`7Y<L-ku)7NNUXML`=?`Y<?X}@D; zr^KYnsI&P5e_3KX>Ffu-C&eG5RMHJ~-^Iiqj^Ur$c_J*RGBJp&yW3XWYG!rLlYbsP zL8m&;>$_dupt|Awx*Ln6&epp&b1{0&tKz!yVAs*5>9>FRFKe4IuT!n0!fLOW(a8zH zyur##l5|YpYsdZNshppDSAS7?iF4$F3u}(g@vUy)o*%30vSPuJ!l_P-=UDc?IdnlH zrAI$<v%KN8<LYtQyEV7pF8a-|gX3Pc|KF&smPX<B0as+Mg~YN-n!TEIYWvn#^?E)R z-#`BJdcxdBzg-{F)WzPjE>7M3+~9-v@4T8P1tHl2zZ+-jTWD_y2$spq+x*=^XqJ?x z*7^6D;z{EESISv356p;vk@?8wUE}F6H-qQ)r%wNrOlT^17vpz1JN0qv3Gq8K>{l?b z+}du@7*LY8WCrW&FQ;z%`N~_xcxk`=)}UR_(9+p)RN`mk8Lxezf25Dc+bCBWU*90w z^<d-g{<jOe4$Q87BA3~eA#Qmz@4OoGO0$Cv>w*-g6tih~1z1kl_t)+7v)*lwJ}9?N z_}t`g`|HBgZt-*TZNG->{<kh@cipm_PjA)=_N!FvR{wt|KjBTqYwf<G6JK8*WNUhx z%k?;Vr(eCxHit>pc@lj+N^i|m_4;=&y|Qv;&bOo6Q#QX7Qe7ptH*9@u-;upXzwTYT zah_W561g?8oh^~)KOMZ)o!_{1_H~_C>+U`}wIRNx_77*lzg^Rtxn9S=tK8C<HuGKV zIi_XN(YM7_!qWu~xy!86TeLY=d07I><xrayH&qMn|GFD>RIXlU=JwSI`iol2x2Dh6 z<DU1X_>}&tZxMpq^B=W*&K8*NZGL^@{;LbW*an?yym;bF^3Cjza#z#Ru6_6O3F<$$ zv0dux>asg`O&?!8^LvX#^83rXj_jP7vLwA!Oh)JZWIo=qMeVz)w7U%h8Gk9J&inmh zw#pJ|DYldeC(bFaXRDnpn^s@%KEv|_=Y_tdFHfdfigL4E@VlW|6SFQnJa6}fInff^ zQc|C&1(iOt(Uduwx7M>D|FHP8teG5Y3=y5~olV8TjDOC2;_HvO_*30K_3|h2g;skL z(-h}eZ7BP5CnfEryVuPlOZX%jI1=8rHP|0DSRh_u-(4S7QzxEd!lgX()sIE>>5O&P z7GCc5Gs}#%Yn}M1z}SP~ZS0{P^ZlNggbG9+H!WGC(RU@liGl6F9bM@&v(0YonEud0 z|Kpp-{res^8eiV*|8B+I`D@ry^6uxmmt>|zZ~Rg4y;;C?{g+!4t<F~qG)&lZm3=|` z)H}R>?=$Qwu57&ebk>~<o8{hGezJ{G_u;PhPu=pXb-7*FY}Q4Y3#Pu={5)9n`md}o zOAB*uC8<>z7V{=(`K}b|yH}sE;BE7UvIOgfi{C;vw(S2W9jTNObWSty%88vv_5P*# z8XOK|IhS*fIXb?}@R`>gl{4lSwmHRD2sX4bY4*<9t*}&X&4x#(|GYiJe(=X!{fp&$ znl%oUnbt2n9vRL&?c&#UlA#6q6X!C!)oc?JaAgTBN<N{$F_U3~amU65A<b{2&n(p4 zc7<73@wus(@Yk}xjhhYy-_HF}CjEA*Pu0~G3g4P8=7#;~ywh89NcHKfRmsv}S;y5( zTHQ>Y4S1ff+;#Np^$jaozQ1u^@-b*$f|A7I^%{Q-Hn}VQs&D0M&0Da1*F(X|YDR|l zkw;QEJQLUb3Z5Y56ug6b$_giSyGce7=J}E36Q}4bI4$l!*J8)ceV1lt`d?dpa)xAx z#V$sEsXXg&euJ5>UDn);{-h;tF>y&z<J#L+JEM=>pLKLy)0cV8uZ>%du&sJD>)~TX zubK1aZ@k8?^m@z6mrDZF>VI_apAqeE-_1Pl%dd02v%XC|Tdfm+>;6aK_gM)G-I7Bd zIB&Ribz0J#AT6ec$vfXDx_jg{O5RAA=(x|V<d6D)(ckCmLwOVqD&DIIJ2^dfPQ%*y z|GtXqaHP$7kXf+k%-V2?=OQ^P84nwt=4999*nU`I^4(0H3j1Ts>y}y`ouqrFK6N(J zB+W(rb-e3mHD6`?wsm8AdU;~rsz@!B#g4HLU$ER+n)~>gz~-dF>9t#T@ksCWX5Kjc zZ<g6Ng_;{;iz{?y_O1Eu`u`+%<ge=QNvT?i0`LB~Px-L1=3Rops)U6{%Ql^#%Hx&x z^4fjd&9`42m3aDMqP5`sythry8H9aiY<PU5KA3;!`>E>{S`ymaw+9^y&}cOH6~sPy zXUBed*NYant}AEpB))n4u7zjUZ#M2{2?yW5&%QFL(05|(xijz2NH}c0-RD)Y)aky% zf$MgE4@Nvrw-d|E{C;jNd(ip0cE1n5_h2dW^?4fH#lbc``{b9SKU0h(>ppfq{rmoR z9&^vltLo|XY4?AaCMVCRoziN>{eABIwV}tfm(Gf+DEf6slwbMfj<SyeRa>M(7#exG zX0f`}e$@QsD|l#Y)s5bY&_2!7=QXD*X4@{?f84xRu%+yMNkePumM>4<c<hM0#`dgm zho8AZtIZzcf`Z$Z?K)Q#JiL7Tc!;0z*|QJo-l%Wg>o=$OY<Ybg&peBH&(xOY^?9VS zMD2g`yz;~Cr0{Z+%QxrF@p98KmiTs7{i;X6vfKk<&nr!q%2iu5JoG)eG-1PZks>3H zw<@<jZRHPEoqi{x=V)`Hi_FZ(($qAuxlYqBh?kt*?Js}NThuVCmE()zl}ynUOkKB6 zGH`GdF$T4AM_&JUK2*c2{(a2Rx+h;*YrpM2^Dj2>y`K4-9pC2_r}O3LowI&_>SbEy zHFuQ_QD4so{cvrHlz(wsZLU(*ahr)M%}y@<L6865xqDir^GVp0({lvs-7c<7+xBhM zwGd|MwU=I+FMsTOXinYry;=?PI_{<xRM(a(6{HxZww{)mZW&l^`s~ud0~t5#rP6<h zAC1UqG2vc(B*=1O*UrykaWOeZM3la*@mbGz`fu|6J4+Zuj<21?S-+vM<EDFd^5XY% zHoRpHT{uPkcHmTrskT$|XKdU4Zth8!$!cYR&g#zguQHC<z9{_SYTJ8);j&-jfqiaU z1QX{7)-h*x2=>N?u`4#OOE`DbQpIIM{NwtP>^tTAPRi^$`R=~RvQ1j;7n;Av?|QIj z=5BwvdpGuOyERibJM{F~O$U>2mmF_B&>sDF&!KN;bLZKuP<m*T`1$%Zz4-rkv~P#L zVXw35nks!Xq3+S1m8D9&y{b)9E=P2I3fZ@G>Hgz9Q+wX&tZ|6{yzZLbt$ok_8bwFz zbr>vt>wL4m=yHH;-HqE@`WbHQHv0MUTGYJHr@DR#%{|(9lHur-?u@mPN6dTju1j<m zbp032TR-#s^IZ!K!lqQIS|_nRa*VDzXY6Nxg5Sd94C|L|>!z}Ci7I?iFmRdUrE&ZA z`R|&`CuPb6_O0VrG`w_aV{u(u$?@K0+b{Z0S=8V+HzHaxcUt|Yl_@GMdIwlrZ};(4 z#VTxlxbAG`Neg{rt*fy!HpjfmyxnlqZi<-h&IOx4_nhN;TexSt@Voiew+_8OnEW~I z>y<Mh58f<cvfdyy|FBQDON-OIIg#NTm$HADxA)n~fZwq{BOZKe;(BSr&B18mTY64% zqO9e)`s%J^_36)aHJS@^*40}T6&hU*S*GAnKUs?_-Syw2Pb~|VJhqyg`0GXU)o<-u zi&P7AJT;z~A3E!Dh~dmk$&LI=d|6&Z3n*Rx5WZmXi_g2Ogbn7NOm13Qo8$HTa6`fY zmb`)wB8NFo-&Jt^=*LmvnNzR4NXB5{k56ZB$5prUl-*G~6`Os!J9zTeA~n%T^%GwP zS}fSLvG25~yWkQvms2q;E4_a(%EcC#uB+eJZaMw*5mr4_HL)do7kpkGr1iM^d(*0E z&abDg+%b21@~VTJ{>N7A>Xd9}Gg%SFxMo7clvNH>z7^%(U8AA3r`cG|o-Nq**V1oS zW*-*p7Sss8w_8{zphC%NqDIu5<Yk@rRh`)Cr#vZ7dDF4dOX>5=&M()Nm)GnFQ8U`C z#CWPuzw1w~`o5pB$DheMe=qO-8Zv=l9t+pL$zGh-PA91HGi@r36gt~oo)=}p-fi@3 zBFo+V`QJa?`QmYyQ$9D=@%V!q3$#mF?^`;)HGftyq4Dyhm|d|JCtIKIe(+qbO8wyF z;O+i)>EiVqbs8)8mCuQ7SujugW1Y%OTLodKxH~789lvtr*~$+`KNlK*D7N2Y+xV+@ z{|27VA~)V|e&CuJ)lwA9&{_X!_oe0G-xM77zq{}`T&8N>;=TIX4!@RPe>*$Td4E{? zeIB82-o?k)Uz56eJUB1&+_ptdY4%&?M4#12Ra7{hv|Xdr(p~>l=+Rv7SC>P+2+93u zwY;%6`+D9jFE5Qy5x%9t)}_%)y*9`$71<V-aKt0M(`~`Uj4RAq7o8qYpDcbXG}OT- z|IzE3*Ea3uHeW7CbBJZ#2s7NKVxy-~`LugU22&`bSfX5u)FzRpjmitxEq31j?bY&^ z^%f?TQnBx5v5Q9s9ux?v=Zbj!IKXqNannqd7A1|BqEk(D)n0qvzUEV|`zEY=Ud^L} z?0Rt=?=!F6n>w?$$}6l};-$Q@yx;EFi<9=AEBrnq<L=!pvUX1o-94<jx3*p4d!v^8 z!h<)|fArKSUi!_dS9VJDR&oErkJZB8k35=EcuOWw)Kzxw&i14?Yj$s#7qGUz_~|89 zal6pf@7O*)>65K7b=3@BwUN1+DR5EnvbM5}C$r<ieCBv0O?6xI|JC0k9~N(td-Bs# zhUxYqmUsKB{{Q{$SAX+`#y(c=6oz+7|7WtV`)I)1wr3l|!UE+*87Z&Lx7QsDcq%Gd z_jNkQZL3HBlq$Ek3H%IdFPC@9f8}=0H@V*F{_i#$$0tAAm01GhWdkgfg;Yfq)^1t% zttE=NK|#jj{+_&hTk@KpJhr~~>)G-3_96AFN*_gSuB#9Hv{5SGpWiv*j`*9h<#%6x zyzu<9!StOH2RAVZcHcJ2(fqz8t#wz-yOOHsmt*w06a<xuxb+k&?|nXaj#+jpchbRy zhDSvb>sN%VRQHqH9K`o<rd0H)LdW?PHEDf4+d9@2$z{d*#`fNJnU{D)wDF@-2)A`( z|FNZ20SR3FbF^jnm;0P+I4<^C>!>pK=WTy$vP0ZL`)<uyAExK_D6dG{hxdoiq$9_Z zj+YxM9E>Yqe(=e56^GlsU)Rd_hfkk(XVNtroi8g=zC5pIG&%j7L#-?S1>=r$Zxjp~ zIeSXOlRmEX-xV0<@>xgXfOXmA5bHv7rZ3$b6Ym#U)Omipnxm)Ap%$FT^CM5<0heTJ zpwdESapvM8r|Yw`_U+$WdGn2a^$Dk0i#IQyv-ocHwcVeK*QS}u_s(D}>5RX0cb}B} z`!5T8+Buoyt<Ss+tbbE>dDp|>lRHn}eYEE5)~n|IYR{bH)Lu7!`Z1$+ZC(AMCs(JW zEk88%rR`e5Wn4Y1oc?$8XRgrlT6gEtqd5oHTUhBH2r%Gn>reT{`q(AhB-_x<^5=oy zL7En?f62HN?q9RzJG1;x$wMKtj^4TIcRMKV#2dcWf6NB&4%#hZcX4*rsF$gK8*cl7 z;fsmcJEdvg6<l=MnX_N;#^#DjoMlM39}*_8c*d@&kqabJcD$VSgX!-xzMG}R$8*!_ zXWuSdd`{mqYq4tOGSO#jKcs~EK3N`-(L1%PU{-m}ty!g|t=_U)m3JCt9?$>Dqrr6` ztjWl5=frz=&J>wSF1=OQbG5#bmHArzhy8zxl~T8Th)oZk(YQ$3^H}-A^=T|C6e@k< zep+@lvcI>L6`k>NZ<htDm(FY_z95DJ{qiY{ha^Hz%6oE`{tD%*e>UginT2KLPV5ez z6C72Ft{F6)&f|WrxxIDrF5NjCmeIveqnbYc$hc$pa9Xw09q;1Q`M(&Z?~-arpT~AA zzMe-Yt*0l<E^6)76>0{L{~t7AtLLm|>fz{>3}ln9eQIs5b-zf=IP*^2U;XE`dvDjr zD;8AtZ?Iu}-{<DoA@E&b?eBdP{_hidI_vj7oBvNQRINB=r7JD1qP}I}cjuCyb#Y(r zy{xZz&t}*3z4l1GwNG+%=UN?uCWo|$9~S>av=-I}m^U!wo>2ZYQ)I{4c`-ZKk5uiu z?4I)HMA*6m{Ey2m{8bene0j~ee2xvDM2BRchM2GIxsM-r8yv4(Rrsr8$}4q_#3>&V zSTaI;jZSX#UjL7y?$OnHN5;x!61$(T@lUw!a^mXYpcxYlohwSF>^z=oV|@SM^(Mw| z^8X#bFkId-t*E~FPRjufYyUsye?<Oh%yRrahihFb({aNEHmoh%7zJO=y|+f`6zB3I zfn0CqIefI5#46Bq&X{%g#?`ksvB?<hfB1g?<uLOzvG=#$m^o|3RBlUap$ktpOmUp? zx?qDYZ;;J9dEs)!$#EsO^XGi!(5YCW7JK)D1y{Pb#_#i6`S-YRT&+Lh<2h@}iHcnj zM+H2N?BvMy)Y{T8b!F#?sMxvn$qNoCx9*wB<9;yXOn=eZg>$S5{@i%X<}l5xeNI<r zdEJQwwe9DRq)g9QHYxYjj-#&&cFHyE*}AE2P0GeBcawcSi<I~+w&+@Xy5zF^!r{9M zSQ|tYCa_zDI82OW_+-R#eOF7>-g<T!n@Qic&nUm~NK7bv+Hp7U))JkJ1!^Wo4J1>m zZg2lIFLo1qvrWyHDclG5I$Ib1-(e#0+h5qq+|!XWqwUeHA|E@!EgpLIhD9%WH0*54 z%hjVFN?zwWF0!uu(ae_)H?~ckJbT*QA7|xRUP$I~MHqf8KJViH?)-E6bWPsxI;xrV zv$CR;Yl=)}a<DdiE&00ca8Td-;um7g@{W^V?3@1DA@V;D>mnYBy=`~gX1(q(oG-=k zlYPdLzh&hId#~S6dt1K7DoA_hx82Fdm;Em2=YPywuxG_v$C}y+Kl!5{Prt@<tarw~ z@5TIa+y)c>T-f?xo>StUIVY}r-F)Mrl+ik0Zsmn~Rb>I;nEP8d$!t60^l#qst0j9P zGt-mL_87b^OG`d``QUcTqD!vo7u<JmG)WL*JK!jwVE>Ox;gn6Kq@z#3!56$H8dls7 zGiNYe3N5@Eek^zPS?j#AZZUVh_cymDue7}=wNm6!ptE!Ai!A3!R~85Esa@^yb=~cj z|NYv_MdPirUFzLVF$r}hDt52SW6}9E@xP(#S(Py68_UG?e;FO;Sh%d>Y4DjUS+4Gj zq3!&d$Hk^yT=K<+Lt{}xObM68-kNAft#H}%aayNJHb1WWCHKjC#s!lA<C*iyZ5S$c z?QQ!1<HXawK^==2j@{#z&ynw%ZeNi4QDF18^>$MZ|B4rxv@}M&UV63ex##n3_aw0_ z@-Zw+Rnynili9P}Hq)(a$>Lux_>UW<y_&=kF1!Ed%W!Lphb52ZyV!sKBx3OH^;wmq zIR$0DpZgUG-<jUgesFBogE|d{uQowfr@T7s{Pte$leTB&Mm688;~%Si<}<Hke?RwU z<ZEqjW54%BYlBW4)A4mxf4HQcC+D#(m)q^a?fb>7|9=q<t?xVG+jVR4M((|*Uo(H= zXZ%*Y`eaQ|z^p4Sd{+eg5B{+U4(+=6NT_$_TJG%D8x@)}&j-s1+W1%;%Z@E)zPr^r z(ByGzn0vR+8mr?X!mUdfR;bv`_n&vFR-)>%poTz)-7Ndyj#Tf<GhHmZ*PghVP#+ok z>vVo)<<FYzn@84G?d&y}Ra?q;-ujYx>$QvNOSTJG@Wq(yT{Y>UL5fJ=ktK{rEKHW1 z>L@mMDxH1jM5T*Imxr9!@w=0@E1b&PbFNzDzPbP#W5k^g@Bij(-#gFx%|q)ahQWIy z*M~|yJ-X<S@#0Xsgca#&Rb7u|jo!|$7rZ>LKL1mC)sEOza)%%8o7gG+bwk!OZ~iw2 z(w1u#EsQ8D6imvu{(3Z+Q9H0B$oP5;U((;5F-DsYFZld(!?IAWojE2_wzKk=zxICo zR+KGL%<tIL{Xc_e+%GIJQ#1M)(`2!+?)B1=by833j~&+R<NkTP&pUr>xLZKqSG%rz zH+fHGOl7WT<eKu+Zr@Gw!_4veE%{zC+Ha2g-~K+U{FXMe#`l)e^t7ZkL0(?fwIY41 z?s-hRx${JB@0KkGnkQdo-cn%j@qqmoqt`RF#BW!sO`B`K^{#`sSBua4d!-#&$$>{V z1*r*d^9XQsQh%m??ab4FoaZ4z)>*-UbIgA{FZiT(`pmswV)a}S*Pn@hJ@O~`bJ_tf z-)NcO)>WUE-{Rf;ap~NY8u!43>sLIqIFxaI^?$zi<r=aMzc0>vw=Okd$K2A}mjn*8 z7*}R>CpoSE>^Sv==<m2xk7KhZKi=wf;|=d&!GDUn^W|c`_?uhXTW@)o7gG={yTY8q zLGE$szbmH>yDwNc@kH2Use1os>2{`<WTL|iCH+-c1X8tpuewa)s!rK1H#3U0;iG3| zt&#K9B`VW<Z~u%)b9s=n$l#;ma#iQRCat=%Qd6lA&fNkjGqlnkuQQk_byVy4hdad& z*4;@qnjW)Tu<q;mxVHzUTVJ_&QEtnPw>rD{7zEE4J`9@kN9EdTjvcdJPKyYtf8$WP z#xQzi#dArv#kX7PZ(Yupyl?mC$nP)jY(F`zm%lly`HPF<%=sF}xD(T!Jagu0GI=vW zAuMi1==9YuJ4EL!S|~g>BvCJ~Z~A1*Bmth5o*Pf>y4F8c+kEm($h+-LzmhZ^OngMw zZVTv`GWqI*Mq6(Cb$#!RT<j+4_&*CO><*|ua8Xs%Zo-GJh3(GmuV2jGwQYUBxW=@z zhqxUMzIJ_~a4N*@s<elwkLdM@6KW4!XSaH_yZU^K=B)LL=RfuP>{q@k?%k`}^7+<9 z8TaEXXRZ(PJ;l89`ompy>TAC)E`2wDQTfKOe2x2S$~`u`oxU~Yjofb6`KsMEJ4;_r zFU@~+=5k>D%8R!j{W_^Bvu(BU&#c<TH&r_ScrdzbOw`@J(r~7X@dhrZPD``Nnr7uU zR!$G+P3oA*JMDCYO4iC<%UY&RdHcG`{!_aBm&1((rMLVhEDpBLPz%f{T9(4ZEnIXa zB9>G7vr~Ab;-w9&%ep37$gA%#KFGaDgy-<a-X-e<LyNxuSY7|0t=#%ftc&=rgN6!Q zcpStMemsy8a7nrG?CU(XJU{+zYiFB3WxZcmwPvGa+9unp-}*mq$v0w{CwFIFV9Wn4 z3pE}JB=Ahha4OAk>8k#kP<fJP$>N7w--`U_c;mNfqTW>v=0{ndFAGlUz1{htS-qT5 zZrLK~(_UI{3eUy-n<lJnQ{Vlq+<cy1vP1v<Ue?32&q=u}Xs<f+vpP0-!=Icf3D<dy z)Xu%s5>wLQv-$O5>+0v{OkQnXy!F|i63<7+1oIUFe=gH<uxbB&^}~+?rF-n2AN<WY z-TK#p^1DYiC0^ZqtFY(g`O^mRoY|aON)Ini5@vj^ad1kHzVybgQ3f(=e01MUsrNf} zD8l=g&fRk3#N%g6YR#EXhd69WeBPy+bd>M>=Q$kNi)Qsa%Q9_PUUB3sqe$@@yM;_M zg(NKUBrH}xU0bp3dGoC{HaEk-_tgtuR^8`*SZ~C%W5y=Sy6@EocvO?0UwOXCTH9jU z)a!Qtxi`ElWUIgQ@J!^Dx9==?`wlQI*Nc~^XR;KVVpYGMdqR%l155QfKgRM3m&*^2 zccircvbyo{=FSiHesB3#H@=eX_+#&I>3Gu7*6!`gpZ>{x*>-o%|DMU8k6-9GvhB}K z!FMyu>rcGA_ba3G(~*o61C^u)O=;<m<YZ%vpZ{F@{Yt#mU6K6m<cSr>mj*n_zWn26 z^Y7U=Mc!Yi-!bcb%bfWMIoAz4_MG&X`sw*Rjz`mbLNZ>y?3G>n{8MM8u-3_I#jGuX zH)b}K+<W-C?eNXuyN_QV2w-sNWIC84T)50&-JJl(Lq<-weqRXC58VI%wi0`a`r*d2 zcXvNazwLL>X8x8#ZEa==>%TAvNWaotRcx2>S^MfAwaKb)LQ>M|pXZ74zAst+nZHoB z!JW;MmGS=O_a&BbZ|3nvE%sfp#5iwveBS20Yi?^@KirvWn)HgP?TAv?hTOEZp;vy+ zy`SWJy(n*$?24u0PBL{<WbW@T{vVNP+93Slq2vFhqT8<g53}83GLbFq=Dvh8DorAj z1>^4jTC}rie!h5e%%?w_oG;gxwlB-w67Hts_`u-N(c(GZtsL)6Sz0cTZqIx^Df)}U z;vjq3?bd(q9K7CNaoafXo36TLTc4OU@7IZOF^?Ate)4lSe(>qYiHDbuRK2W|nz`!u zWYgx?ud8i~G+BQuhfU&inmI4)!;zH_V#<sJ@+LT#>OWjxqbFcnd7>|__?4H1bbZRM zWtMMO*4tUcJ(O1~D|w}4b7S4|SMf2u9Z8dxJzc1AzNp9Y%8kad67k0kAA)3=Uok9q znZ@7L;1zQ9XZ2j(+5Ph#uDGUkHdFGz-FrD65}}h)qbJE6NxEV7$4O!8i{l@<Q+=Z| zG)^7)bmQFuqd3ne>TiP%^&Ruvc*;dN>v!0L`ljWNy=QajY43?T8-4MWkDB4s4b6>4 zwa?vst*?fcIjGCX|9gH;J=T%GY^zPeCT4-dwG;S--9DHe5lDPtrF6t!MetMg9+eZ% z-zAyHCC_I0nI(MnmCHrepD}LMR)!f8xB4VKDqn2p@ci}F`S$x0rsvf;!-9VB==MHS zyI-*)tG8Yx>12-0<`nH&8&1!C(Pj5jwe?d)^`1#*F18-nB$b>fs}wPRWv}0xT$fF) zVOEn)W}TgomeCbZvUt<1Gd9XwI)k>(^)_Al-{R?oXRklrma*P^C$@v3sd53&_q2Q^ zH;u$EZQV<DU$(V<e{pi-S2y*GE5f9M)Rp2EJ?d+aZwUA%P%ouqDgRb+esgEJGjFfZ zyC?iy&BhOclc%{x=*~OQvUYJusN}N8$xDJ*&h!Q>nEG*X^&F}DGri8d(VafqP3GPj z&Ag8#_v@riE=j7nFPC4SlJM9$e|cNdtB50Eq3bNCJAbteTxu*-alhK2;?@UFcQ-%l z$gSHLB>Wg&ou8ER<sn<WqvM6wd5L{HHwaDN@T_uaf8(~iyQd;f=s(H5{ch2M<9#`6 z%ID5Icri^+m~R!++_uZJ>?5xj@7X@%-nR8o%;j%#wmg}oZDa8&=C0VZ-G}crOQhMY zPuA{iNv-HwzVW~fxts~l7WJKNTIjDfxvENk+D2a+=Ghj)CMNOjZ)Z*Qe5+Bv`s0y~ zPup(tpJ!wKS#kNQn{JvLe^$Ur?SmeVE3$32DzAAW(a6L9Ajyg`dOuIwtTSq}=e>Kk zI<j$77Atd|$mJG!=hGRRthX`r?3k%?xaIDP^YNvRJ@1>EOKtutcv`pZ+?k(@i>_N( zmPfDpsdSS+K23IOOTW+CH7zaEZprvQ+gE=~&)p@3Bc!7&YwgFp4HB_jtYYq(n#&(t zeDlU<@g?17X6xO)OkY)fZu{Y146ZjMPWqWGUV3@<($abVZf%(8+w%8?<*S-q)ff6p zzZRdKaoK?3xZH^_mnj8KKY7jB1kaQ{GqP*`Eb*j$szGGHwIjczTRFb|x+ZxiulUth z+pnc|0rg4g$4;EcsNEKqdBWkM_szEpS1vAJ_S?*J?$n@{pOv%t=LUV9*))Itsi~_U zy6m!>tnp52<JHce`CGlW1$n(}>g<^Cpyo-&?uQ-O8<t((S|w#L@34%!^u;$!$4=H* zESX)UbM9mcgWTCOzVfkqEy@*ARZ5Z{-92iXF0*oO=P{d=x%K&86MLtvJL9sr`uXI@ z(Eq*<J#sFI{n2+-2-DPPla#lfe2M$#0`-;Yvet!?ckkLpGbvntaEt$`#fpwRB_5s_ z^M%Zp*DJ>|#_sGBVd2_!j&VWx2el_=b5=b!4Y<0Y>cOGA%l+l7jc#Xzoa((PxPAFD z;~9Y(?)!Oyuj-3@O~3cMzID6f+2rV;cj0b#_U_ZG*(dAa`Xy#oLcrIMGxPcbjs^*Z z1iZd?^uf$&E6(?<?F$v=s}-7cXZ4GXNjjFd4MgjcUxXa@kSQ$l>tCOBveTumMl*!R zw)|?Cj`xeGw03UQhY#*JE<O61`|(ykHNkB{jAB}BtCrsv>uR;0xMchCz4z-66kSd^ zC3jjyZIa&B=N}~7Z>3+*FW*{upnyT7@pmfQ8@|~SnyW-yV?M9l)E~2Jv0`e(ne)o$ zg737iSl;&D*=gs;oB40f<?T*Sxc<K8zU1`--}gx+=DA5#oW3Gb!glV<>6q<TXTD{t z6J4K>-==!Jd0ANh#6`#RIWJmx8|;4XalAfQ{QM#JZ>F})@;WbnrL0~uMKoIcYKjtb zxaYrlUt^~mC7sb!J2thTqEbofh=Ye;<Za9E3ujMB%`$JFw`)$mh1kBOwHqo{G$!9H zamuk>BKJPT%5k;L)L!vNT(@V-m%Ar^`E;eyJ%1CQ`g^zP-Md8vRxn1e-Rn|tDm)&~ zspMW$pVXx)rQ2M<(6UD|Mdl7e_VenwdR)~>TV5<%{m;VL{LzlmXH#vCzcNqq_&7am zRsZeZ%_nVGg;nFe1-gqT6i%yKbal&@jHPMCM}uZcoepx^^5sqQ=9PXwTvL-`j_z5T zs9LsiGDmCI%mq>xT+I%Oq$@wW+4}5OPS!M`x$CE<Nt)I>`A9WoaO|^kuTbjT+Okr> zPc!l2p>vm$KWZ*|STLzzjn>7V%riF6II3}R)uEkBGK0C#?%eo8g)Kor*EsOdQVXUF z7xN#8KQPH!kQpxdLAis8sVnb9{evmohlJWvSF<TBKQ*=6?a(skpKR0bzFE4kK*?-I z)vfKX?e;EEd*h=m%2nTVaMDpPgWH#Ob_m(Tp3z<=drisG*jDTZZ?xdbK<9-Hi&id^ z3Y16{&Xiq!<>2j-7R3(kADn+=J=_a_?&W6rGx4LE%!&}Lyk)jLY~^irZ3)XKtvP=^ z=;{3V>z8O1Zw+CcuYX?r@>D;|&{^gG-8l~L-O<4RP~JW9ipy*LXoDHj^_hxIDtg@p zWtVrauy#N8lTldZxEs@i;J5()2OnnopPid8a<|;X#NgQF^D_&d`QCiPFVmX-YIm2{ zMhB+f%f7q*IPJiZ&UHOgW8vzB8D5!^Z2uOieTXqz5auRTwc-HBau#NWbXM&ZEy+RN z@9Ilg_X)WM@Lt{Zl;_Y6agK@ZRd?!H9iCUSx4ybKb6QPx=xq1)q@43RPG=^5y>#J2 z!Hz>65k+Slo;Ri$IBm-JV%u@cgU#S@Nz$CG88;lxob*^CXEtNv(g~)_i9*YYXD}Y) zN!-G(Xw|u2a&L=WN8M8CRg4Q~PoAO4*JPNXcehvMP>0gp`3gQU?rqDm+E~_2T(;<S zV!eP`M%x9wb_=zZd4(4*E$Gwj5}3pP!*<1g;eNw*xyRdA^)dZA@caJHZ`=2LxMSRJ zxqQca+xl-`V%fjFi;RtY(bF5&wX!9b)uM_su4_lS^)~tSh5uZX_63$5XFYcJ(Ur50 zbB^e$S3Ejm%MtXsap66d9sfkWEvz()YcP2`qs(%8Jx`j~p}$^jFZtg1uJW0(nEldj zp4maRTb&Qb|KIviA~^IAXNrPs!9T@Wb04+12G2bF*2!?2!08!27czQQZHVTSXj^Eo ztmV+;mpNj~cJ1zZnPIg$Y2KG*_i|dBT3+4^Jdt*PdwD<G_hShU6C!FCZ4mm@_V#pM zDqqAzmR^BnZ90DS2A5yR3q+cTH0rIN#`AS;KC8@@vIvpnWjVD`fi6o#IygW6c-+8z z(PQIA^R}J#!tJkp`Z+&6QT}ivna7{8?eqENXSXXos!={uK2iL`{sop>q~|(3-`)2v z(PCG%x?%*g%ZX<q2iznkl)qB1I(^fx{)$)0kBsLZ3~uz=c7Imp&99fp*&ljtb-2Zx zDXsr@HE+BhBlfLAEn3Irzs_9Q`OF=>b2F#(D<-?Y{kB`a?tAR+!;Kjd!eYT12VW`) zEZ}+1lzjfp^gGdK^JEN^EBz#U1&{4pwC(kosO>=<#b09+a`)~nQwXd|QJm;eT=ex- z=$}i+Hm|nc|M5<mo|KQPp>fNpdhbvljicH8;#bt=t*T5<6oswv>+lSH+W6_t7iaPJ zYjwo;ahb*coIGn%UDmTt&c&@WzP;Ie{-oXU`m#kU{jHYE&UcExcJ+AljKfwO@7jYu zcQgz9k-8+|bjx&!#y`bEmWJ~`zW%vq!O2<8Q)M9bbnStoyp{TwFZ5oo|2%Wu-zSgj z`|s>1NlZR}>(!-0>oROIU)oqoZEy9yccS3^(UN}sxvnzOUHvTm-czjPUf+D-7$GA4 zU^DZTP3=Ly=ZNgMzv$t;ug{7U1Om>UWGNBrSZDN)C2;DEsh1^+<<g|XOLVr#t`54i z`e8yxqD;-@V^8|L>?Uco9B%7qnd#)@>YLfRQ?h>9)h#zUW=2_fXa~2=)mpz~@>k27 zn@ji1+;n)V=mUMm!rO-=JGT|Hn@b+ZI34h~@xx1F#bamPROWPNnAU#0;<MFY)&?)b z$?f4e3)`o76e`X>?c>%obE}8N#K$4rYiHYU{ks0~aVhW2+N8yEU0GyHjn12@znbM< zeL=HiS+x-hSN$E<RhMQS>X_s!|IkrO$wxJO!lEA*E1rGJ=3FNn-k9>X{`<P8M{mA7 z`O$4})HLC1XBlR-S03h0{VjGbbhcgn4h{B=(<km&mOr8Misg=t>+>CFW~-;FJuYOQ zvU}a7t-bxrpM?k<&CuJCom*pjp!dn<@Y@Go{&?|l>I5;q*RS>0mDaBa<yHNlQu8=# z-=#j*%lYdg*Z(;glx&vxDy*aDjm+y7(bU4y+S>bb#FTVo&Zl`-UiMnLEIUG9?drwO zsR<T`L~_eJ)7Lo2t=s1Oa;H(V+n@VhQx7F&|L@D#X}W)Ri-4o_`hC*&o#`^W@+?aJ zI$VF`@Ih~Z3jc!%rhE?~RxUHI&lX>NFFf|wTE^`)t<jfmH{DHZI(=Ar*Usqc3@<eE z*-H<Jlq<ZCZJ#Ete(cb)6t?&EZ)fdT8KcOy)WzK5gYKO2S=Cm0^^y`hGPb<^u(|nn z#nvlQHEx}~Tepa@*nJ8(k#&vNLjCNF?x`zzz0P_DUb^1bzGkD*Gl|2V58ivFdC#n0 znsbMtXa0`|%XQUPp5N}KoM@A*SyShiFWcK;UgyZbu5m|!ZSkB(?GD*F&nCNvf0<;p z_8~(;gE`axT?Gc!HQ()2moxl(q53>~`Ua(@kBixNUo~ioTi$kLQ>y%33xN<rL$*Dg zRf{j>@8Es*V^{nG&d1DiZw4s}YVV4l`*r`7*7}bJ|6jbu{o~XBm37=-HWiz_UM>6j zFPl2s@2hzktUPu49B-re1ozgz`e`u9VZGWzcgx*jd<xeDujMPq&e?x`Vwb?Qc;{q^ zJngpXyt_w>?>ckl?G7oh=VJNgzUaUE{ETm4bXuLy;nR)T^J{<n`WybvuKv@HeQwoD zO!k}HuIKZLSQ)1M+xbbJ@jw3$b*beBHrHkM8F!poGNW&D;F;Dl|DLRies*P|r1^o@ z{CO|f)1F8duA4MZ=hWnL8@5fnb@z;E+cK7W#~ptj&6k}Yb>8m3q1e5RU)J)6ekvAT z9RJnXCqZ9e@r+p)S7tfu99y+^<&3%JGw;3P-}Jct!mJ01HT5;6i$(4Q7Bsn^o|9q7 z_0xsn-lW^2e8LHhWpCg8V{v>szvR1#M0kA7v95GEoBC&rt{e<bqWb^5L^jQwwf0f9 z9fwP|PCM(eto&oL*SR+=p4D>T-s1N$@wF*Bk+Qn~E^J@M)nT!Bf4%#)2jUl4qTG)s zZdrYE!Agk;d!7h4Ba4UiK5~uAV-`=Jxado^{i<941H<G>#XsEmw{}YR_FA@2au1!= z%B!5B%TDK1H#sOgIFxPA;kjg4y}Dah*VNP7?H+FX?m5Aj`^AZcXM3;8UVfXlI85`| z<BJ|14>Oq5V&tE*cK^LKU*tgIjfH0xAC6m>b)20s>Hem$y>6_6<!`n2z1~+Z=`{7O z`1kooo+&S%^zp%7Wp=q;Q=Yp0Z1t+Xlfd3zp_k{KZQeC4@2HYM#x-tE>xC;U!aQ8p z?*3#VcOzrT>Qj78Q<rZ3t^93jzdP%jxCrC5B}v8(iHhY%zUPUjM_lX*_m|bXowH@i zz0!(JU$=MibjNZz1gumn__gcV1J>))&efOQJ}JOv!rt=8(N|z$qrUR<D&A>tPlj#2 zxKW~iH*?lbiC2$aE#A9LR-|@Loxn2B)bcFx1t)Kv%ec1wZA0V?nb|q{UK7*1qy&OZ zivF+S=+Wz&F4Ss~sd`eh>7nQL6`LQK<z^~b$DcU6l_Pmo*3H&SF~5#qy}6gmWYy1? zK01?4>#wucXk`5PU$Bj>=)?UFm4Ey~oKEKXu=XSf+vNAlORPR8FnwCwQk{EpKI^6~ zSNyxay(wl|VAsn>EOF6~r4CE+vq`VrrKYmszlhq8B`bvH_%AVT3h5BplW`}FXY%7C zZ{Pe(k2!Sy(P@pAIjh?E%<D5BNb2azOvw{&P3t@}N9A^X+i`0~&R274Z*M=j$n^0J zm5{w2DWbE)s+X^R!1*J+X8mPVIp<#gth!&{G#OeJ_3hhbKf}nec>f>vq#g1H3+hgb zyF3W9nVl@pVbo>Gts$}B_sECuPajX^u+`vDD{Bz;oA*?WDdV91;dtxyvs`Uwe=&Ns z_ulCh-;3t!F!q1@pjJQA`o=kKw$A9edfz#2OPzP~T{?}O!70Qkly6SKHx1Jd$tOL7 zqobJ=95fGeDRMFM{4n8FYGC>!Ubk5}()DNTsvEWu?-KoIBz-^1m>M*3gIa)K*O|XN z{`y<rIc(qZ__4NUT5OEi#oebFeXaxqv>v^6?qrK!=pW7Q8FLr2<t*u{pC%P3+S?Mj z&rawxs|C}S_ZDpNZx-aKd6hnvxbwb<#o%D2@Tw*sgOlIZh45K_y84kTko#+x-@%PZ z>#UYKtA=Nt-lcksL;S=2|Mm_y3trW8pJKC`cU0d(CTqdPykv%%-zEh8yysh!U>(Qx zzxrd4jW*-ui3jE~1h*(M{%^eBR9`RP8X)`jji80Y5;wc9*tZ|&KE2=?yvyP4)6dE* z400C5&w_i8HJmU%%TYcx>$m9+3GJg^f=}zbR-6!I+wl5nZup1kPm4dgxLEQFB>JfO zcSYBIfA;gQ^uMSr+#mh@*b_f(J?^~wsQu65f1|=~Z#Vdt`2O~py0-r>`UQ`Ph^Sw` zS8vGvzU}xOHYx3oKUNrP+^Bkc@Z6C+HSRRGfCV2;y+5?}^4&Z60gfGay6c%#0~j^+ zp9ecOsk<lcdOKBK=V8G5h=SLgCk|?VnDU#q_Xlqet7{ua-+n%mJzp<fyPe9#{{PUI zqrbn&{QoomujQY|4UP-f&pFh@D8Os{M>VGQY5RlE_3!t6EN+N#d2^Xh=^L{~-?EFU zOKOkro0;auZglhUlLcSb{SUo$#(q}8>FX)GvoD?SDW7v<Gr!ZXE$>TYCVf8W;lGoy zF8BM#&H7I+eLE3f^OX60XSU9+N*=rV^y$*tr`y#Jx$>Rv{q`^RWQy@jt`BSF^(Xc- zEt|4bXPucr|0*&5`hp!VXZ7ya+M1nOmR$PWegFS24?istzG_$hezx7d_bm;tuFQ6u zH$Px=xYWvRQ|I5@U$|zK>kco+gl2<7CZ9z4)=x3m|I_Py{$qdZJ2zjRxWUx!$@zq@ zySLn8d+%%GJ8LKZbdlCMW&hyRw8LjBY^-|gkBiNiG4b=%ORCmhGcL+B)|=Sa*stF@ zxhN~)#k!fIwoWUjoru<I&5l_*b4%OfU14#YmvyeOx&OKE{h>d0=NYGW1`hoGtXwSi z=QyvuxW-?9QC!gFLT1Z}x<8_Q^W>fNt>)O3*Q}h#<LPJpXO`}FX03zyGgBXHuX{09 zT<3QxgMQuw>pOx+;@B6z-t;(^zh1BYMEcj$N6t-sQIa#E@~rP;`>@Oh-|M^<Hc3P* z)LrH0z1G`lQr5JS7QL>`?+s5_-}BT+FEhHJ62p5_v1hKfkMEI=rr9%8^^aIftd6eV z^YwVh`h;aHA>}I8A714D@t9#4%FNUf;41pz`7MrM4uPDHs}340v--_;Y9)`l-@9(1 zGxhb;S?2z2G*C5h*w<CGOz`N>yN_mQep%ho(B-;sc0eWj&$5L92Ny4$;MUNPCf@Nd zN8y2Q%Af4xMstgoEUSw?{iL6D+O`+xlxN+&{cca@?=8Rfe`G(~yk|!(-{##P9z}0k zd+%D$&&iIpm$%kFDq?-Nr6VT1{e*K7Q{R^JCl)gCEU&**S9@4=vqIk~i`pIK*%2K} zUQXT?y>3$VudSS1JN8EGsY@yro~-}N=F^AEGtXX}I440TjYXu!>zYDc_3P~``a~my z)B9gMI5y$_o%IGTXP<mBS^mD#JbjAIf1QK{UYqL<s6{M{_-*~_)676dkDs^vT?)5~ z7cR1Q?5NqBY~F7@zdk!%PL2Kk%s{ykjc;ER<z(}CwfrB{ZFd#uwzgh)Lgr6ea#Fve z=`61<hc{0wo<>cJH|w<8dg-p|=5@xp^Omqw6eN{yn#yFmXj<+5FIRrtcx-q&_4}(+ zjSPQIT}pCYE-}NvC^?(yK$ZHGq-(7!%gWbDJdohH+HA99SH;wAd?NSi>sR+Tos{iZ zknhr=W3k7kKW{;~h1ipu$Mx^lYIw_3zu0xPPT*}{@vg@!qQCPjHs6|KaL+L7zRE49 zALZ5)FU$#%ZZFz*xbw8$l&bd?-vg2j?#vI`;yj&MXU6Y4yLmYzy1DN?xRCMu=b^(V zTde2Sq+Xpczq@PZr@Nc9YxZvay~&`y$@Y+@@J{vl9_CeCTdL%r6g4y!7+vPmU|juc zc^(hn1mordPQi~EAMRL{-QXCT*V?@D&nHLGA7_4i(|l&^7RA9JcILepui>WSdM}NG zMcSk@ZEb%)T0VcGzTk{`nkt)?U9R<M*tA?+JR@P(<j&h|Zz6u`www^RuBkXRac|$1 zmGzG%Y%FkpSm7%#=N#kvDZ|`4{p=pG>}9b<_iVH;6mzS|6|8)I*Ws%x4^!iV*;3QA zn5LaN^HDX3`Rt6q2bYpdX0ZOd@n~fQmxl3+Sk^<6C*Mh&aw^hiYx7d!-Fn$}=4*}! zFTelfrsSo(<m}BxVJlMKvMg&`Ys8Rh7drQRjv6OheZ}{0hOzc#?;Lq#`fYRD&Syvj zpEY0&d$Tj$T9}RJh5m-@m2%D<b4pEqt#ZDq>6}&Kxs26Zeo~>!#pT}qBDW`<vOD@) zaPt4J*JaI3cB!`QUmDPIz2DBnt0`myH@i?z=7LKZlZ<;#hMaxS*|Th3&6nMBb@d(R zQuzI5K0P$UX+^zI=*%xYU!@LiDVOifF?$@@`{4V%-xs|nYJa=Q+MTq(=Xv}|k+z+m zo##f+U=W+?k-ju=g<ZubUU$B>q}lAp`_Dx9G93^}zN0pS^~cG}J&k*!6SBYm=JQ*x zKYL~SlQn$m*Q=SL)+dLt-^mPP-_q7zs^F0C_}_2;udnu(zq85ys^59eIR0kU)2X-Z zzP3M<*mM2l{-6~X*Sax2Tw?uVUPDYv9aCDXNMq21MRrOL+U@H+uYJ8(eBo4RROQkI zKDxbUq+?h(F6uo?`ryAbCe!Wcjays)A4zgHZe7$7`#gl@Mfn4bnx&tA1<qV}yMf`! z8u33F|E<IB$lT@OQd`b&xvt5k{_Xtf8avNA%ZSbG{HDD0R8X>Eg3FWcq}@|w=N=a> zeXcq?OXtZxg+nhc7x2_ysyu2FHC3JenXtsesTb$?J$)|LBJAQ=SHku#U0;mhte^R- z)~k=QOcrrWY2Q<1Ec(jWT=<Zx>&MM&4oCKfB#Z1a?T@giu#;|nARAs|)h4#F>3jYB znXA2njC!`di~MRjO~CCwxBJKLbIbh}XqsG~JFh3%GmCA~wNK98S-}M-=Xx;}+2!k5 zPMuZ6IlrN$Nczxe{->Afe)(}vnC7DyKF9x|!O_1Q_50p-9bbO(*FWRUeDnW&uesg* zVn4H-hGRSURLv%ac?>MzQ#F|w)ELYdCaZ=Vt~X6EJz&ObZfE}9;)UfDs~D?u)*o$| zY)fso+5WWCvP-pFWcSiu*uL2QxP!Vwm&0+#NXI=+B~IU+lb!FnEOhm8z30Z^X6#n% zw#HrEy@!DTY!f2`LuK7gj(C2XuMFJGFF<zQ)?axaM*n~MpN-`g(>DfYhI$SLCXg@# zL&YuK3CtbO9cA3@jX!&*-`<vcds}Y%=H8kzo7oSiSg(J4OZr;f=D(}2Uk_PW<vD4l z*22>=mkW1?&c9nM+j2Z_zTPa;F2lfG{JL*S{vImly>C+--92IV$E|I;1q^BJUl=#= z`yGh9!PZ`5cV_W%$2T5NoVR-k$JG1x7BpYnp3!o)k>kzbst0`;EuA6qyQ7#ly5H!R z68v#T*&x0=_U(iipEq;FcBxf8E7O`a@8LnoRz>$i`M;e{&)9unji&at%f7m4>sKx4 zGdpx^!oG7cnx~z<9hLL{XYomR!|~aDvku!IGfb8-oF6azKWnnL-=t@=7SB3=|JXz6 z=k+abIQMoe&1Cqj_4~fk>YcmNSS?@2&QvS<U0c0Yr+s(&#r&rE;%}}>zX^S&QG8Q) zmf&f}cg=bin)Wb#KX&SSE89QyH_z&;?r(iQ{SwoE`CmH6#oKFodYs;UEN9zZIz=vC zv2E_=FFR!_j}@v^+)7SJNl5thZGNv}SL(h0%l~UfaMv-q1~@7+Y<<LjZ8CGXL48w` z&gMh)+-(}m@_F`)NJ#v8Jfm?JzwufIt-yo?76#)g!AMYCmGr1aumm!+q~G^Ce%JKj zyUu@(hgW`Sa$fZK-Mc*5{vFnP6Z0jPB$O|H%dWt%g5iyQ*v~3oPPPesCNB&gw7aM% zOaIhxWZh-hlc|#|>%QX%^Smhqs=-IP>UlRR`yJUCwcc!XZr1W!Yrm~*e$}yk@AmHP z?3@Rr89m&ziUKoQCx1K`DIWdEW6sJ_dkf}Q8@A8gzInU#$>@6@W`*y0!s@^Clx1IW z!`U^7rrwc9IBxB0on@Q0Ju?5=N$yIm{-+CVCRBf_o&G<jYQj&2w~kyFriU;x<nShe zJhu62gehD7+KH^|LL3EL&zJufoO7f5(Ytr=-d%e9Zr9vMmcp<Di!3;Mt^aJ9yKZOb zcVANj_ioN(YR{hty2vG)E<W*i%~Rheoa;X6eNu@&e$8!O(&HO1Ph5^aGX0owvcIza z=K4pv&sSVdSdl%^hSf?XNA0ZG`Mqz-WD?nhs$)2xpS<LzYnosG-Q#qm<=cICPl%?J z8U4R~s`|$Nm7fxmuU}zVb4v13(6O%2&+AWqe|mh+qqdlk;%m1=MSopXJmFfbC$+Zn z`;w*UVsmet%san$oqXsm$2DJ5m+lX+3%R;T_qFe$>2>S=*5ADOw*F%D>w-CUeEFeF zvahGxu)pc~|96R<_II{;>uHPYwQ83Byi{rZS*yDwMD0%K#j>q0cBc0nnLa5`Xob|@ zkFVdP%&T0?n*VnFr+1!~E7xyo{V6Z<G4zep+ZR`-8W(wgt5(_k_G#()Xp?~7p-*4O zhi-U(fA2@RvPWI<-<adyH_ls~VKbq~{F|#glhv)q)+dhj8RhSJoN;2eOzx#0S@*2# zKlx4H+F|?cd-SvT|I_Du=i9fI4V36|4l;+CBrq@>_<8N#{cXK}b7$Y&<@I|)VdIAz z#qZQ+s;}fWQD%BGZR(rl!j3K>J~2*SQEp*=agG-m*=37v2)fG_-{DlBTXah@eQxnV z)#<T?S52?qEx4?^{choP+wZm?0!}LT+kU)aTz`J=hfCV)_kO%qEnoBHrg(hq=ezv& ze?Q%pumAfwzSS#q)zuZD%j25ed}nQa!6C?e%8Xa?TJD)0s*{&FUD-5OfcxWw4QY4V zM57fmm6kYJr8t>Aak3L}y0{|K_?hku)9H7jGvk&uHZEqIVP<63e&O7-fLnrI)*E-J zKYOOOsV!xR@idi9KUJQoEmbjcO)+9k*~FH<?77;eb}^CkXHT9RvZtgNv5TZLF`Sxi Of0}`jf${%;27UmW>oZ>f delta 23691 zcmdn8pRwZ@V|}^5n;Qco0|Ns?G6w@6h+caE!UwTYv460>5d%Xw3j+f~5Ca24g4?CY z70J1Y1q=+~5ey8Bl?)6_Q4V!$l9J0x6c`xd9xyO4XfQA^STW7zUzApmp3A@xafN|_ zwVQ!~d-@HL+aJ;si|Y#*7?MG@a4;}1fUrP%PGuSc1EUKAL(mxphKWfZ1e4n{QWH}c z7(yKw7#PezSTwEVenv)WA_GI%69xtbc?Jds6%Hfj#TmIJ6$}ia6$}iFSquzJ5&;c% zw{!B76B!sn3>X*~`9PTG!1M39i4_G53?Tvx4D}2O3=9kkjJtVq^AdAY85rU@7#Nr? zGBB`<-#@m@u^_*=gn=RP4g&+DG6MtS+{v-VcMFPA3m6#U5*Qd5>KGUpx+eAfIaP7% z>|WLend>tZ{_J}n7#Lg{YFy0k&;MnDo332%iKH#5l_`;J8p+$3`zBkQIhpir+QVsi z`qe+@rq-ufwWTgQ{N`X#neP9ut9DnpJxO`k{&M27-S?`mhRR?5-KFqSz^P6y)~QqF z*6Jq4gDWr2yy3IPQh0UQzDHTho8M*s-^zU7d%~XC0zY*A$()>IX8BKxRbfNj3uEE$ zb6+pz6!2=u6LPxa+!D0s1cPBu`{unYiVpLX93HNG*wEa5zW%$@&zQZlvY+36t0CSQ z_(CPdook9yi1yiIch=mUJO6!ISYg_{Fsb6=&3AuFnz|l%{8a6cyWm$Bv7<U4(xfDo zHvCt)Eq7kEyI1x{@zga2PtI-+ZabmcUcT8SmWg4{wimrV&y&yQ6i-z6nP}0d|M<B_ zm(S#%_s)a}aUQT@SNXA}eo2!Mlei><%ZZ0RQXZ=#wU#V5zC3Zm6BSlXUyH>7AN5M> z)E>s~5qTASefO1hGj?8QNa5Z(bz;`q>k%B0g*@@6)c^hHQ+^ThX)(9ORhyE!b!*j4 z`ZB)gy(qW!;Fz?1|Gvp}$97LXe!}>PM}954L7n78hIQFYkrD1)J$5370?zenOpZ4u z9H@LUfwkqvlMk0?o6FT#JZ}7bex6<3mk(9e8)xK|NEKgPaiU*Mo9oNxV!I#_p|o9h zZ?5IPH{t*5$8K#GearT69u&N8t(02i)_Zc*lyg2G!Z<Wn9bEa>-yr(!`4|66=3V+O zW381F9aC43^5txP(EGTmN|h}tpQfqJNUaavSnhrz#;UU7>Qo<oSJRSH6J@{OeZDJv zT?MyU?Dx6)-;ZBex$kT}w|)7iCnr{Xf3MCpYe_wKNcZkZa`t>7R`+Hnzf@mSIXlT@ z4fpG(>WmMQ&xh>oSJZWrw%+XTs4?xrf!Xi=|NXJ~-i-Qr|Dv~CxlnlMMEU-I++V6c z)=!8mYN)^CpEsesn%}oa@wkwI@O9Da94s3hClqwnG<$G&sGW4<FiDy*Yonvju``>G znA~)|8-2J>Hir4rjj!6%{qJlq`+u-|ch%jW6T=kW-<UW-@ubd~HfEzY-xkjEIa9Lh zGjk8eq6csIg^ZTpGoLMb{iCAX_YWGaRXh8l9_h9>#4+<!*RMZUQ)F<l^vcSsTOM;; z-~JrFW2(LdyIlRhh#Lk@fhp_HdMs;SJjIDSOLz0eZCMS{_pK-G2)o)7qLH*)(sA`^ zw)V@HFF!qbdD+_z_D5?^vkEIcjXKqvc4vd6e~A#2-n)3K>I7xBhd&x8Ckk#Z(Tm%x zdCW;l+<<-Zio{0g%huEC{g0TOc>geM;l8?aYn%Q(@p}0z{=vM~ugv}G8aw*^-&AZ{ z$ZWHH`GlG;DQa(ysL$8Y==*u%_59`f)tBBhKgoXRpud@C%G;|KAMne&oUM3hC!!Wz z&*NiJ@xr)G{n0ee)H#9sJS_}O)?ILE$*bzP(xGQs>s%Q0L?DqzU&zIu%d4JKoYR4c zFP*>k*jK-e$`(h(W3wdwC_S{Py6vg<Z{hWe(K74Y4ry%aHMjHLV8+&de!l&EZKj{A z*8jNCKCklCG2!p=Hf2u^?7R2s&Y2q>$&>jHu{$5)Oxf|hXcA}m-n)wyulru^5Mcay zZj1l&b;b&Q`4!u4e(3aJYk94o>+$e%Y<-bKMe*jd%dC{xh1_-X&1SvY^J;6?Rkz@| z{Hy-mY>`<rC*SNv)T$}lW31Go!(OWI`?R}HFC))=vBuqZmjb<J`l*+{zR{5ybaalk z^TZI{+~r^Wwp?<m&0G_)gky%wG|Ae}{%_Vt1w7nyOiImv>ZPN8OE<1izHq|P+IF%~ zqO8X0dcV6he45LGl-PF7?BmE|eDJ*J<S8Gmv&RnHsXU_9Z}<IB)N_wbB}MIdQj({2 z=SId{U|c3um18J+PW`g(+@iy)mg$@KWJR{PKlf!g@cCg(g_ZHoWiw56cN#4>p1rI{ zXR80yWve5_xMz1y4qGxqC{XyK)^scL|KdCDESvRmW8n09Mn#7@X1@d5D}EhPJsWqH zap|{?OI0DgaVq;xF+b9_5|1e}cfB5-=IvD)nss`us(-0uI9KDdSvhi6d!J~oTydv3 zF#P@x-}T;as){!HB<(d|Wbzkul9Sb5y!`jh#RYfOMWO{g)FlNjG5p?OF72dSe(J>k z&D)QD^_X&M#qAYQ=j(l}y&vswYn(d&M_+95ea5Ssr@5^ASg^-b>i0AKJN2KMr<*V> z`Le4eeDC{n6I0G_tUa8XF!jJ<%l}*n*VIoeaSse~+3+gfYyLec0sr=;I~AurfB!$i zB1d{5`~7<>N=*MSPoC*tlV9=JT>i(j_L2q5OwRv1czxgdkKgBUub%v0`$heO-+SNh z>7VoNs8>Tl$)2vB2Z{??s>*^dB|lSP3@LEvYRMDwny=EKm}+|Tx3b3t>18f6{rcy< zmt^Pf=@lsoRJ(JrV(Ch~!ZfDYcFbqhxh<ammGr86x%YK;%aZfHtUhXgZfE-~c+Fh4 zKw?+WpURoy4^ln!m#zrwxGg4|sUUiy{&b!Wr*V*W+cZn__l7H_!YAKTdhqwFn}ph# zEuLEo7U?W)nW*+eOWSB#k2_0kXK{Eo^S#<@e0kr~W!;&ctd9S0vbRCpqu1x#u^fhw zFPw4)77yhnYH8VeGd9E|I5fzty&kjNPS+)EN_A9j!km(;Z@(u7%FU4F`z6F~x8>VO z|9X|&kD>8*SFE1B^6G+TyXODPvS_I~)3e^0*RlMuRO|X5ErOkGPu%UFt*$+m|Iez| zO|<U(o_$=FpL|tZ(|%35Y3)@rQ`*jjAxAZ@y?xHXg`d~I%MV-O(N~skyNBmW!PfKM zpNn7Jz1+RlRL*W&hNs;2Z&#Hq7YDrFI_;dwU0Hwa`m#%Dd?`!TtkB-!@K19O6JO_~ zBz^Iz77E!4>7MgDIc2iLL`sh{PZM(TQk`($XY2I1M^$q&^Xog?4m=W>d5%Aury=sy z9e-h_%=hn{Qg+psPqX^y%HnkBNkQ3d_x6fydpKRDtFS1(^5nYzNp`|Qf%)23R@#MY zh8AuOGx++bVr~76S3(M*{&F?DkINSZy+~cD-&nJ9!MUFr0>SEq9jh;^vS0HqpY6KY zT4r%acF1<8!c+0T8L#}alA1Q>^817|oh8MO^Up6{w&joT`g*zegZj#RlFGk-l|K?t z5NXU4a48DxJlwKtu{HnkD|1~NOkTfSvQn5`=3OjbxLfvth(?o~dac7J>{qz7sh?aG zI{)y3U$p|W*67{+zHC`tf$nXqia+V<tG?O_mM=L_X(-w!$$j<8lZrQ+E#K;%kBzWl zxi(YybbsyTjok0o^p>2ueE(aL?(4MIOkX=M@&AqI($80BasKf%rOoDsaS($AThF5d zyr;iLrYIbI+|J_eb<_1w#0=T`bNdc%IK0Q2w_4eF$>*B2*K#~2%7ref2;*|qXHI;v z-zu*uNL}E9SLW}s8hNGl7helV&fK&!!Kc5+PiAhvr}#C#xW~KBJ@t6@@tAX2kaJs2 zohi@#28BgaidRMk@@A~rak`0P?@w#<dg+OheP=ZpZrS)tDlisZI{dVhfBNhv_VwS^ zsGI2p#(Favm40V^|4yAl*+U{vs8NRXzKVm1>=xcd(hf8H%rq1}b)Wj^`QgC4S+eV# zUj4nN&{R~l{b<XjwOi}^Qw`tU4A`qPf&HC*X;SG@YjfL+Ys5Fr+_G}A?+ugI$DLo? z7*6DJ1$fMS^JT4s>7)Ly?!UY?N4`A$sV!(h{oR{88G=u3{`B_SfkW?K8_Uo9Yus^u z`tetJ-wQThxU%m~-?V3T7Iv`)!FjpLfxgE-Psy5bs_58a<GHMIT<x>xJ}vTT(^<A$ z*h)!)yZ79^m`@%DJLG#hFX=5`mv|+!&1quKQuPU~!oMFL%CM|g*=?Qe`0Mapx1AQ% z29YPFPb^tlKYbCKhupifelHuUR`Nw<m>glSbau(PA3uMMyK?dBcdFkRPHcR0rG>*X z!t=TBOtD>S+dm)8smqxr@L|WF^B*$%jpP*L?;AflaP)`Sx*6eOYp-neb+UXsMN`I8 z_6eJy%fmOT7+W&LJD0h(rxi1a_PyU3VBEmb%X3~pr~6@|{L%Vwz3RR%8<~HHg{N8f zM(I6X_(QPb$eyGA(u*S0w$I$%b^TY7-$R{=U*_&~SY;x*PqeY3J#3@3!}?EmYpjnt zR}=(kghmN>_ZRBcWTs46X2ugy(EWaIL}7I7++Ne*qe(#uS$>N)Mfl#l7_sM`L#JB$ zR!{3-6W`V4Wrm3^m)e%p&v-g*>FdZJx6(4xvQ)XgzB*U&!_D2{@rffh&Nbh85wiBj z3n#mYk{1OuHlHmpEzMAUe~gtuII4Nkh3uu@LKbaaAJDV((6ZEwJ11Qq<z;v#=0E%z zs#9(BR^jJ)+uba4{FonqR+z!inUkQ^D{yM%@_&-`T?Ws*H+)#QZ<DA~oKjG|8ee9e zfpcNm(ddh}_BAmW-PrNG##Oy{_Ze{)A;tB-UN_y0Pgx}F6CxKZbmHATpY)<dS2dm} zC7xDbf4JaXw&49wpEf-Et+}r!^pE8IuB9APE*;<B9{#@J&5A}Qz7@+>CFwdH=u9z_ z@-{tnwYKmuS7e#rpW~mS)N(ntE3CTzZAQKBvFWlavaWX4?41x4(!;biVtGRAiep=! z`KQI!hVyToz;QYwB<rEZe>0144UaQBqCQQXU0-a-^q}MW@ynLavrQdVUDhzK6cJmK z#51So(EZ}B-!^~ds=R;gT-3#(XLBQ90goA{0_z?}i-}U<XPh-I|H}F{NiO65{@X(F z#>*Sm)UVg%FR9uTb~633;mMPp7KuCytPPs;KguyryD67E=VNL%!<R<KYaumTTRBU4 zp3GZpVK_<i`sFB<z`SY6VLB7%oUoeg>f3+Q$G*2IG3EKMTZyv^H3eB~KiQUcJ?xmU zc(S|vgpbqDi9fp7yjx9-`{kXMJ_V&tmlNma?VTVq@#3y}$G}LQ<trcD?76VxVUWld ztJnyJCGS3djrsN^*wAmno<|3NYx>_hJE`>3<MnNg%xk_ki<r9hx5TPX5pX-n_VCX0 zDJztIElhZA9J1G5+-(1il-7%{WG6QkFxDjhzM^lZ-DVdq!9DfXiHhBdu4PkrYW_FQ zE2^2nekz|kkgNPuM`?ZSmlMYry0sKU7i{CMk1DC0629fzy^1?mkEL5#3t4K1O$=SU zcl+*JH@Y9bdU4%Wta75?jfq$Cau>~6t=5yG_fS)OZtGo<=Kpr4i<F;t{7PC~$Kj$K zp65U9*!RBIp^;wc$L4w7&bKT6didC}bxXcob6dA>cY*D!6=Eg2^$-8;c~sxZUtxAi zzhcjZ=`pWcH#3+pd4xGA$Yv~7QfzRT@=$@{DDSxmLJA@x6NDZWeCtg=(&GN}n8&_- z5%c@BemE`-+}paucCEYwXYHe~^}5YhC(5O)w6EOu@_4FC=z<>E&1V*O_gY*R&eVD? zrr~6Den+D28MS1$6GF3$Z@NydV%Kb`-~W7zjDCOHg*iX<x((Yd<t|%g<+^I~>+6k8 z6V{z^`{Fd~b;xaB-zPrITmC<ImaetfG|hGO{NMS83{Dz5A0B*d*gx%c%0wBZ_Nr%% zvBh7Vd;(e+4?JSw2y#gEoY<YBp#RR|RX0oW@lO%jv-7n6R|uSZ!`@Nzd#h!|W9HNY z*X8P8Rx-$Nbh;R=?5POg+WP*N_T1OL&Gy<`m;Qb#{d&5t%j*w%x+^^e>mR-;+L-Qm zMlSp5bVH~0Dw63RCrVzs(q&%%?9ib?W{L9U;s#N(+kBrtSP^US{mG-Ishi8@YP~+W z$9Q%`{SB}6Ma4_P^3?YyUu3u={&dz-SMIH|OshUStJhCEK2z}W;g3<qQ*1psCQY}w zSAVGax=f^U{P$J78cg@rdns@@h<q+~6um5{a;RB=VYiEf_lAbq+5bXRHvDue-rtgG zxGX11{KULiZ|-2>t3`)4@))rfYZ+gXJ>hr1<>Srm+DF6YJQvdr=V`uT@cQGowT3V2 z=W1<b4HE1P{ieRAe$JIG8-MOS+ogDHj_uc%OLx_9o{9S0oNjdVXzgV)ohOr9GmWQs zmIhtC=5pspj-KhfMItLR!ryGo3EOh2HEd5o-r7A$>WW`qHhnzuGy8pK_sf@eJ$dJy z6ZzbE=PUbNLFJFjjFVdyyyuQ@lUEa*q<;LDfX^lcKe4yVcUMe!x2ssC{zUoF<Uoa& zDJJr#XIphTxUi`0|FnwjR@c2p*8g+YUG!5quwdu0Q?s}I$v9zBlzdd8HEZ9_n$P{) zcV1-)jY%rlnp?E1erx2ux3dI(%PrhxHCyi7z0xa^J@eilZP@baW>50{-?LH$PJg&) z-IH3uakuX8{K%YlW|OR+FTNyHrapgTed$cy`$g*e??qY7TRAr(y6;t3N=cPdQfTV7 z6SH3we_%`!2tV4yk;vfjfXmVAqlx2^=avCW+<hhsTsFNMabtG&84gk9VDaE@$@Vp` z-|DN!vb`?2P#Qm5a$l?Rua0NW%j(Q47BBd@y5+&)AH{Op=PJs-maK04VDjL?_8Au% z3QpDkeIQ%ZWzHd_Hj#JgO8I(m@lpY$H7&ny$Z|InEDA~4U@+qy$5Zb$@+?J<_BE$p zJO3q2{kYWCq<fc6NUf2K-q+%E<Sk>c`O9-9ZF$ESOdG{QUr4&$7G=smz20q-s_oBh z%qCi8+isT?{c4pd;@y#`zUWTJ@)=WBZnh~=5$?R)U+-X~rTp>Roh{N+pL+5bZTN6_ zXNt<+->dkJUV4?0yKCRGAh|vUt>f$0D0a7{3vaNqo3!PFjLYYXE^0FQu9K?Pgv{Hs zvpjmzG=-njuK(}a*JJPGH>v$Z_?MnigDsU0j!mmy{<3YI<ZKqpf)-z;&UK!(%@Rx& zQgS(*A6MRTW@Fe}@1fDFdFcNoakp*yHut;Zz6mY;n6}mS)|#FWpNaBcmxeLatz?-l zU+{VF8wKZwhwU!dzN%RKlAo>8x^>gR3G3JYmf$MN`&{zyWp7b-uDi|N?Q>f0S3cLi znAPhwp>y*4s^^pC`-?fO=N^4ucV(v8{!+cFlvQS%f=r)@^~V}~;$K%UvpcF#DC3RG zgI(-b-xsE@KKjW=Z~v8x(I15QW3L}dUijr+d)d1`--DSVr?g&PyZZU%sqYS*JiOe@ zq~N}-Y4v}5ef7-HDSmRRuFQ+ioVT>0?Z<2n59W<^k6*=X{L>e=c=M${Sxs{51#W$- zc*bDqHt*$8z9zLp3_BKQC@Tv{I91j!5@g|BFQ9nGc~bByr7oZ2jxC1%Eo$?))b1L+ z<2my`xqZ6W@?)>B#wdwx^f`Hw@y1$-#cLh~#{Jm-c;)+5Q{?{qIgu{Epf={r_nXRj z-y@HFEZM)8m+@bWU_RH>J?{>^U&_1Klu6`gzDReC-P*#nvn)ysW<8l?ly*ejnCSs~ zeM9|B)y*AIA<q`xO>1il$yQk(qA%_|b)s|f^J6({6&B2xHGl47L!C?!28NXf7Zv&j zIJ`JyvstO&P4xHse=Ji@_|98Cg;Bxg*QH1MrvDNP?ibi4yuba-#Jx{gDtD%5I3x&Z zaQ|578ldsKFxYab&k1ekpK?}9UY?M!_1ECl=G*c8O8tp#EBhAxWcgTf|KQfEPmfj_ zxu+d-zkGL<;v_AvjPqekO!GN;v|VqWZ24v3!SX9|YJymW*=mt<XB@;XMz*RSHD6Wq z;CI6ReZ^cGoHoV(HT^vKjFm|=kD=Gfv^l-Sw!80HO8oqL-+1OM1KxU7zxijx`PaQ( z{wb~8=TE^-p6BOg*BkE+XI*l@O@1F|7sE+kZNt5C{EP}}<!(x0dbKs1GL#H1&u<L= zafq8kVt<6M?)^VqS2=3WS2HxWtrz@|a^d+)_YcQUByPI7xr`~Xolh^ok!i+t_GuT@ z92GdsYYrYv+<n4Rqv3w?Jz1e+GxGbk@@w8U-mMzl^yatL`!nTj9~aj<9Ade2_xt=w zul6cc@1Ju_{{6Y&ZOK1_)6=^-^{q+^toTGU3`FM4)KvR=$UJ`AW&ip}r_T#azMqv| z`RY>C)U8oHv-0>?PUMPiQeyh^ZlQ7i_j{#T&u)BVHr5VV&Lp95IpxzAYn@*gc0T&? z=gP{j$>E1}!k@G%C3W1bnOo#?@KC*#;)~1gjphDsJE2$fD^!+)Wm;WVuAr9qiXL^N z4Xd`bDIH$e7%8fnQkAsk?cDVn@6Daa=o!X5>kijt?ys+{J$rXDN}8<}ncK*`Q)^0C z$Q5(5bHAQ^Km9*y_rE=%Kkk(;J^ugbGi4DrmG8el9k}<G{g|J%d~A=Z2#0{9|9!uL zTlLX$^JmpR{XJQxfjJ}Nw+UOpXaD?vnu~r1{hf1>BUQ&dEo{<mPDXhn(?4aOB!2eA zsVq}&<WsoM;LM%!jPDSq(7F@tmHW**^jfd99^W@h<QDItjw>_oe3-oBd9B5)1)0ZK zlOz%kGe7<$9?37l!M;gwPR5Q~hBh9z`)!M!9xPs7pU!8JZms-z<=tr~sw;J@SFi;c z=<tW!e&8{I>!b4&uNPXkN}7b$ud|Q)c&t_C1e5FSXr~=A2?fu7+cP9Tz7irND*cdW zs-W?~l8NWU_15dSPCur6$0I|q`Q5S=s+XJ!W@;ConZ5YgJkz&-DptO|ZlBrqY;Dz) zMgMN;^Bp<<CGSAJRDweGPQ|+J*Z0(uJ@dDfKEAFT5ZlL@w_$d@<5e#8=PFJHzwR#P zNH}|4-*__D);kyWACQ#xn8c_T%Rl}4iSX}AfeIVAoa_o@zAEZH&p+Nefs1oC*Ec7{ z!fr{P3nqV+E`Hsx?$D+0Q4$II7KaOFF4nf&S@!jxaq-!_y=58uHrC(XBU-+Fp<iNN zQ~#opC0_)EU8Y@}|KM!+iq&RI1qAo_W`1jLkC^?)={Zwyw8!N$TZ|{2@6;3FKIyh6 zp;-B)?ETh5Jz*=)TsLx+Oyrq1?Uz=`st;#QD1T&0_PM|iKj)=kbW+2*Ba_~V-Pz#Q zcu_o#!FJDiF|W;c|46TM-#N25xL$3~jJu+}7jnH!kF8nJx5DE6?D+r2zY_g-#Vfvl z>-zb?g1bHylfN}jVBB?#BXv^XPR}K5P2L+Hwl5T%(z`yOxTC<X$A8boFCDYqt#}#T z*!`iI-(>yu+sdEM9!@>%?0YwT!ds_U$DiwhYV|r4`9oWrBFekf|9(g_pZG?4ap>~( z^#&iNHqV}K^Gr(jm5tSJQ}HE&xu=ugT0gNpw)nDg=G&!z=LS7G_3~Mt0e2*Kcdg$X z9h+T=&sDzH%~&Cp-spW%I@0QmTbTdUNAa6?7Pv5Tl;#C91(w$>nZy43&a2($&&k+^ zoy?khPArT;V|wB2;$NpvXg7xZSwC-IMfahzHK#AuOEjj-S?-*lDRjMkVs(;7R*WFe z-&wwVUAc!8gVTeu#C0!h*-&Ot{k?Nyw7S)-_I@74d*b^(d=U;`AG5FI;T!I`&wgvq zefBfU<w^eb3XucWwZFt28I#Km_PsJ}mzsZbmczxJ&52B!*LznBc~qU}ysf*q;`!N~ zy`1(_t!(F>-(UadT+KcCq!9DFug@NHv$2%8Q=X8s=e(!#%;Qqwj}7llui5bWY5Adb z(Z_S1_1|4~%E050-EWzS{r?_rIM&`?+q<oIv(i5;wvIQ?&RVmJgr##Hd@L6>{Y2}$ zsTU?3@R8kKRHiB8wg2|!8_~`acc*Tce&W$@>tg+|r5@}vq|`!xuc-I1+MaOex5Tlm zr`K%0rQ3MeFIXXC(S6=-^8R^moO8>{?l+#)G;1h+)EV}9*5ohgXZaG$c0{|#+*!*% zC)&~NcToDp?x(fanh)lEayc(^S~*BIAtOl4RiHMw;fwF#2}VLcRgF$K-cNN)u~0r1 zdV=#r-_w~Z%S<P8w4cbkq1(KpKE{6i9nW71flSB3W=@QDxH?xp;GxE^oobqF!v8!M zPV81@b<lko#LInIvF7xtKE@q)TA!bPw)s`_mA$t%cxX<u-1GX%(Uo^T`G<a5sVOYb z;Pqhcv=)1p8%^Ro_fG%c{N<8dMD|p-qOYAx8(Ds&^84vm-&?Y`P^|M?inULpOoUs# z%&y6-&eKDl7U~L{o?R^Erg<PN;oUaQiP35nH@+9_Szqybv%men7e8n2d|qxM=V|VI zYP<Y2<zEKHZ(NG1zcx?lb$qpTbw%74XNF75*D5gVoqMwO@t1jzoOjGyv(D^F%f2r! z&RmukQhVx_W0h{AzyE_~&h!<D4S|JvF{iH7yv(k@arMI=84vR)V}qGNI%j8y70X-h zIr_FSa(8SQL;Bp8MXdWj@2=F6N^~+<_3~r4x9uM}=c3aWRi0gwZ<u|*p~K1BO@p6h z%i@jYdw32kUfAQP9~TzFU*^M|@h|UDv(mozqTlX)5AwCLQ~zT4y7&Os&WqhUq`t}C ztbAbNklktERL{A1_HC9X5f4p!e+zzXvmM1=DYr%3KRUJuY;u|wbk^_l#Z_uX<)=Pa zr+!gLy>#BKwJ@RQo?`2K?VPk=JB{*pUs4WdJ$|xeq2cunD(*Xue3^ZyhIyvfMt%85 zYs0%lRz8`tcNy>56Lu{(>^~}O@r-+M)a}YAA%=JHPP=p`9jg6SpT0n)Wg(}1z#{L- zY!j!f{dgkxah-}Pf6C)iH!r(i`@Xg;-8%Sem6af8c2mxw<Z1EeuJX?~Q~vndo!q*q z@)m&$J~2m^2N!Lhyx+FnuKCOP=ChGr!qICUbw3OaJhmfp&erd_6W4?<OS=>__0jd( zxf|kZwA<LONNbpj6|P%npTJ&!<=?&e)%Dy<->J<wvUtPlbRBh;WS_Pqb?%>w<tADQ zSz07q)~)ZI^@F{B_K(^7ujnjzn7c#LV`;-SLss+pkM`>pEjht@RPw``GqcwhDoR*% zF>kxAvwUxc;~HV-CDofbDmV(cvm*}%ENuOqaoIu9mF?pCXgB5C?#(x@-}-lV@6r07 zFUyurDLcGO?L_8|^E;TMZ%>%&@#{sl$<&(`7F%4ut%^H)(2+y_-G)FmjhUVAr6>LS zJpJ>V?Q$-;R;hsx{|4xmZHllEDl?tpmSp~4t93!iyt{wi=iki!p4+pk`cK?}bo1{A zZZl{G>CIK)yWxDc`t5AZr6&r%q#e7J<|UwV|3UrHlywjKg{J#VXs%tL#*rjYzPx1h zuKa9;O{M}@zHgO!xn$u=t8}@Lw4Bzg_cyc*Jw(}<nD+fW+OHb5|4Zse!^a1I)-F7A z`&{ggli!y)RjV!Umh^2qtleAk?Ua+%+`hek?wnf4|9=7NwL9mYr$4{<#sB#6iS=FX zySw@0XJube%c`H+7FSjG?9)}po+YnOA6@+9Wn2U^6JJIOp9S}c<uW3!9`Uah=6`&} zB>7mJ`DDd(%ZUko3Q~_--rRl5Di(I))8}I4jb&GF2=(9oToSz?V0QU7kvntq=69{) zkUXH?v2xDiw)Y4Bo;fegt{2rX@p~-ie7mWlg2!s)Cu(wU*(vy=vi`&CBL94o>vw0* z^E>|5!$PdXKkdSXqT3DcV+8Wt?0=?kJUsjIX~B;7B3!$k-ddS)db|C}ElyRrniF}B zb9~K6TkdaM{6wd+qsCXi=>N`S_8DsKZ#7yIIZEBwmo+{MH)3G)`opkNZON(EEWfo( z*6v^bNI>!mYwgF-i4RxZNSK;mUuN^;z|qg`*Qbk}komYO^43{F(TKI|)tXHz2V(?Y z>~6MN`dWoe#dEumV6B%gU+wosbx+Z4F$-&){urN4aZ7pAkmtYsg4F6c)zxM@duMEZ zUmw735Zw7&=i!^%v$<sBPu<wK>cFZ6zvf-5F_V#6drMg6|5h3Qo(pA}Q*P~AP`0za z;N-ETOT(NN7yW;A=G@zo|7X5$kz_c$<Zj1-_iJRIp6fjJ<Hc_^+2;kZSyxx~tqxwj zZU47e<8x=((~I-0n(D4x_<X^?Lgphw<+PgI`N~BHdN(T=KIq_E7*n8S*6C<r`lD@M zs?iK7E=7GI&BM(y&lQf>zIUCN+db#uB8lKgOQ(9d>L&|N-#dDz{@ION_hPMg7e7w^ znzcKt^N8%8$L$BUPyfX$bbI@>N;XGPQN78170K_oew?>2Qt$qILx0zb+-Zl8p7a)6 zES)cDBbwHvYUGpBmF)JdUFl-i)!EIV5=Hm69url6u&4fX`PwNdJsZzmtl66TQqFFU z^^Sffi|V4IGwV0Tx+-R^{-vG6=Nzoq=Hs#bBH!a>S6@dyE<E@_|KYniKZ6#E_byy! zn*DR4hlXSs2V>E_)$BhF^@WOO?%AE5-ss4yVa+t>!q?^l{5*ea)n+)&Qt+7|eOt-U z>(a;W#`co)of8ut9SAIHoMXE;yL3yeX4<8X8asKWn?9_tu~@-WpP94%)||i&=?b^0 z%jBP}3Hx<tTk9KzDbK?GEZAJ$_fG3|@*aC(xtaEcZSqGxwtD=1^QPp*p($+E0siNd z%^wx6y!br*`^${kig)T2ip*|R)*A}minyW}{X|i-F?FUU%kou9$A909m$TozC&5{C z&E(HtCu#@p+-AnB_-(b%WfuMV?&;xby1KJXb{buFmtS3O7dJUsNI3IUK+dsSE2pq( zRH(d@Ip@YPq27;UZ{K|%zX|@|&zLF9)>U#<mA~!vvtR*-M`G}S21A?8cg%yf9OP?k z6t<q@F@s?Vk9pqQZ^w+MY<w&p`0nP`O(wQiS3ENcOr1He;qb2f*FPdYN;noe?WxyF znensXewX|7nm%c{H^=9!4t>S0XX{g`{mbpSeoBcRpA19ndbjUamreG&==oyW0;RbL zzpRQFbu$bXv#q$;a=K(eRQl45`azdVD%L-UxyyDv_1n~QUv4KC&JJF2&2Ecy&IOlK zbA6`fDo&98WWF+lP4zEts<qPP%o;`OnR|c!te2g?B4p*KH5nb8Z=xsee|OV-|I3qm zCO?@tZ>zrWvWDOT3IRcqCx6SWIppXuRqwaM=eKjC*_97IIPlDq$+D#2{i#1^JWd<S z%LXf}KYS7v`bz8GZAV$LXFN`9XS=@d>bBH;;!u8Yz0F6vF5}DP<#x}-H0>r{vo|@o z-r<H$$dL<^>d(lB@h#MN|IGMtRodU2H>Z}SsC?13uUyXjb^gC2+mzA|{@lQ;uYFNz zYc!9?pP%w4=0)H2Z}{WRKkxs!=I3@r4?=lg6nx)RoPERK#8u1fY@F>YcLraVTKj9W zq`m3$8|y;u`7h>g{mIDFRN?5#wdlw``O`~FHt1(^1m7&Lco2WK{_s89>TjDiZsA&b z>e9uWwCyin_;8oU9DDH0+G6Xb%B+Bltx;zu`1QUx;`ZxP%Q|n58M%8D^Wua){1EoH z@e6!q=<dEHv?9jn*RAVXmsplD>l|eAu+7RAxwtqW{^G>{AAUW*DQ+`kkB3>+L}l;f zbx&BbR886nS8UO<a9zi+(9^B{x2Ni1j}<kSWRnH!b)Kbn&#Qm8(S3bP-`jlid-G>k z7e=LaTgc`q-+x#3d&$zQxs(5yU0i1W^4y1&6aL98d?2fFBt>8amy$^b<AL<6;urt1 z@3^$~T1339o4TBj?F0`ay@+a;>n61&-x%9o^!`q?U3pu4_0-dKKSI|37Jl*Bx~#rq zuH>;DVg54r<cn6G+#z>2@k0H#RbmH2q)NrM|KIk%@A2i1I}$G}dzzAsx%y+OpG<6i zzOS%EB)^-rh@n2<&!xrJU3*#=H*aEC$*H|g^2@XJ_x`AQhr5^j`2N4`)9mAa`MJt> zb1c07;NiQ+PtNZBaa3~28|Qv;&4v25lFJ?1F4i;p7OYydL}<zsv#)l6(hLG^hi^t7 zSKi)Zz2L)-d*yro-jwz?iI=dh-FvrY$(j!l{$**~+7Gxm+?boU{Pyw0hUaf1#EMu# z*_0-hOt~5Kw)m{p=Z$yXe*3=sXT+35t<*o;b~GHSjAyS_{}Q3s6XcLREBn%=nb&;g zT4tv2IJje8M7<uz$$8afW%K&_0)xestjctYbzcT-ZNGR$<&n@8@7<0)YNFK!4`y}5 z>&)#+RcdPX&=D<dQ|{*O`+VuficPC*w(SgAAKR&3`#j8zM__a2EE)efw+=V9{XWLq z&|e-tdCtDqvGPAAtTfrVc1fkrtaVOb!kM?MX4eeT75Kt%=!svw#10p($9u23e0r8% ztF4{Kqatyj`uimx^-_DrPwP1s?thl}M=>;f^S()oJeDVORM_Vn6)loV4{7E5BQfK- z@UL4}IKI4HdwAl*4+@(mh(0+KnV<drU+v!3pBu~ezBs0=_-R7Li7&6Snkt?vOnIr8 z=zTr!_!o^|SGVl@8S*jgXYii-jf&gZ9vL<{S^d@6Gl9w9>iX>dC0fmMF5M|vW45_I zr{%R!;H4W+l({;0EfZap>=sn;qg>A4dxJ^J!y6y(94weLYgVGZ>Wl^Qe+$%@#cSps zmgKwa#cucOWc;F-^hy!Ca;t6M`tIDz_`=<Aga7x5It8h$AmJZx@BezS_`>rWOXTY} z)-(uYRZHA(m3uE~-MCqXfo;(yHw))y>1mCM8pW6WKejeK;@kh~*}Th2&6&+z(zS^@ zuS%?4VY}8~zi7O&(ak{1n{PcM?dO=?u**IFbB~e;e<<6HMkew4Z|Ms%8O(!wPOseh z=2unRi_Gbg%LTsfui$0m{j=KMKUFEY;(jYnebEIU?XySa{+RhSdPceYy0zYbMX>I} z9PNp-|MplgyXCe!G8!=`_{lz0JY{+L<$F!e(s!kd^)3IKMLd?9XEIGN(NLZwz~qr| zSpT8T>*)nX`&%Xp<Yz6s<xx0M#<xo8&bRVr{yQ<D%lC;+-zC<xeGf;>9+_o#q$JnY zuDX|D;9RdH9{+%?-M-bH!Efn7-RXyy$Nm22zta1ha`>UQU-y4q_nP@&sq4Yxwg*d_ zj^y_`aV-6(7WIFZM?vh$ti$`)HU9gQuvhoA)#Hg9)>rrBUU&8_wbkce_l3K8b))~I zgZ^yO5A)U;mm2fW5n_-Q^ndu=qt&HaktxMDcjEcf1Nz@Y>Mz|_xORQ6ql?;xoU0sv zRQ6rB*6wXexbMj-{3X(1!NeWM0=Au9av=Eo!UIaiEY)6tUyG*{xw%^Kty#A_Ch^U} z>-AjotN-eIc)ZngV{m$4@=M97S1$O7&zeZBJAv==r%QJH)QjV9{~^B5;jDmp%fyep zcc!>B-IM&!72hylZS#}*1=A01RaP)y^hs&h#3yiyZMXUB7EUdRyDA<3_@+3zZesB| zsk&}q{_bC@*$NCt(+vK{1=kvv-=DYi-ItWbQCb!sC#;;cG-u{cIW}uAg|FR9t(f0F z{<ijZ;=?x#2ZD}B*M@H2y70to)>{j^=N?`kaEiw&I#5Z~ZldmWL8p~VCK%Q$pIsuj zshC&t{?#ku_e558R;<ieo~#$Kwly$u%a+aU{&Q=tF`Y18I>DIp=f3`E8>Km)IYU)v zuYP)4t*=up$HX~cOZfM>Yi{hhH+5~k3d_mGayi~|d$*jF`;?-e!@Ph^r0c*o)qpAD z4s3Ew`mu}t-eP8Cp1`-<<(=VCf0cFXdg}Ybyl%SOP|D3X{Wc-w-P?du{7)urzIsBr zV;-00(S*x>MmO|$uPrQ|a@ODQf>YblpPOV}hPUKKY54WY*y^9wKX?EB+3POnrXS+; zopCWGPfes)=IxnXZ<o}4J<j;6X*Oe)V9o95JI3u@N7u)kJH&iCb6RTK#jd%MzRMRa zEHIAVU;lo_qQ~vFJ5(PmKOs{2<Eom0-5qB~3HEdAg!fN)#`e&rflcuso0{tWzmXe$ zvR$6?$M1@}lxTci`P?IC4DJZGd~C9qXJy9mk+=EGervOj7xcQhwG-ujtWv)29J9>6 z&UVlKkXb91b@h7L*-zrSy;0mfE9WMc>Jo$RYt|ik<FWEb{ekW(vzzNmKXsP*xy|v* z%e~&fe*f)7&;B`T^IxfMYA|7INSv@BuU?enF>{rqVvNzrn`$?`th_BB81PP6B~*2w zr`)ISPVuJsTP*5w{?C&=J@@3siBXy_qu5?Lp1<MdSu3Gxy?t`X{~gXp@6WY-`(zz= zSj`eG#i_UaQr?~0I>EQz{%3jem6)t_4%xD&UJk``g2X1SukE`X&vaO6=d*{3k53-b zni({!ok5wWLw+vPL9=&W9#?lQzp0)2G_UOM?)UC>+pSD;H_j|Nzq^^?gHO6>{r?}w z7+qcT8cH7syIZ+WzS<ubYjx_av-Nz91wYl7mMpz+R$a=Q`{;JL=&eqA*X!5V?p)bE zO|0MM!pyEC<teenU(|(ndOTB<TrFJj_w)L4!>6H-<}2?1^va|_@WWY=hfQ2{cR98x za2jgtxPD-}>B0S)41a|#e(jNKX}9`YT5_2~OLE_jQ|1vOJC83qc&vJT{k45ppGK}P z+Zm|+RCwFM$;Jh4lG{$&vE22$w0^zo`}+M07fXE++}RrV+u)n?`&U22er#ub^Spdn zcjn26TN79>ELLLX=8m~8`DtnDw2q$Gd!b%FA(xIS2^VT6g($px^;7u9yuB-nR3fEb zOMN^!SNLhnswvYLwq99&^vcac>I?46HZrn)fBEQVkW&22lS@}sZh3tDP-v_)-~P{6 zr+O!A3)ahIhgq|nyz~0=jt7DFO>VmX^U37y^c2`+dqOKx&dH5aIfm2W$P2SDHK!k9 ztKy%y=?i)phdd0>d}p||#bDo0)pdat^Hn&60`l0h_uts0pW3>)w)Iw8*0$NbQLA@_ zTyx3WqPI=JO2D}Gm}HKT?7RAj#>{s`zI^$xI)t60z1_WD&3v|@ZO|H<UChdNcj>qY z|6Ho-vFG=j>%Q%8LQbYmbgEYEd3KxY<sH6mU6JIrKyA@a>t4^(DBE=QY3DhucANgC zlW*1kb&j}En4+gxeA20_YTLgX+Bco<iq@+nNj5HhWW1b%vB)7ZVBQxy$9vbgwX;JR zSlN2mt@hc99FE=<SAWW3%8ww64fEg4k=}Vd=6*wv^_tzACqLfm6?O8paDkKjmXw*Z z`|pQ(XmiTEnR8E0_s**dft;$D(j8j%+dfZoseAZlF4L}%g(Ye4=Pf=XQEqzsoXd`q zlrB#x+r0)mwKoa*zM1E@__&$r+1&^1+l;q+r2Si0Zsd@oqcd}5tGJj_y`r^oGIxs9 zW$|-mQ4_D3ms~z6o7%f~+3`s%C;wglFJ<@0(aMEy;@`ct+6OjH{(kxrhkIAd+gnK< zH+eTsRsD2w-+alSZ_lo{EEenjGW+3)gvntH{EF?nXYc(km(!9jerFQ<D|4oR+ZB7m z7w@X&HrW#Nv+9<>%SUgXyWM)MZFQ-$KE#XZ>axu~{!3?;xP6=T@#S0w1H+|#{!eGj z3wuzsA=u}Mo657`r6>Etr9^$XU;nr^*ZS@Tzn@PH+?TmVeLwo*i^eOahq?L8^-mf( zz8~B={lV+{FID3EPB!;>ew(~BuKZ*;L(3uuEfGsrzc&iX4~mz~PdfSG@Yj#mV%D17 zIKSa){Vrd&-L}n>K3dP7&-3nH{9?W@uP45(JmEL(($SMen?xRmB`Tg$Jd-5HA$0Yq zTkX<$y|*7`irL;hJLTEriJe)y9CW)JUUoRkr&a7VnCkz0Irn}sv*}ujSqhhXjwNZv z`CdQV{$2my8oQ0hCmpTWWfgitCHEA=-Bek-SzJE~+u7UerJv0II;TNi-#Fyxq3#0- z0o@l=dtT3ZIooA=%yjb(k(e&&Xd9^&zZ*F&_cXZgKXK~B-mqU$?`|Fb9&c0k<pJZ> znd<}nSM%;Pf6!K`zm9iJso<MM-;>uiFRLkT_HCN0uy$$A_anJ~)&!U=h_<i4DN{11 z@?xk=ZF{V}X|LgOyXg8g=GSlK&eH0e;xH}xn^${e@XJE((g{(ACeMs1ZfW=1yzBC! zX>(#9x6bj6jW*}iU6wjWaXtGq`~RKud5*p^_UoEA<KDrdl||77y5doDLUNDIiaHZD zVVR!S$7#wFGs9j5O-d>cnv$X_(>ysl^YVgShu*Ec{-5jJ_YJ#U^u8Z@>`)&m+Msvn zTW_`lXK32(1>a0cR#z7suXrN1|H1Ebz1y!P$4p&rb+BySIbEiN1MKDQBBJ{<GNW|3 zIu5K*Eai9GQgeVOe7f?&HPW|B)sNV7R$s2#bDZZ`<F7k^lIA>{?5FkZ#!TCW+Y4XZ z-o(ZAd#~;E{m*W4<*T+=W$T9tp4j|-as87WehnN<T8mHZy)WI?_UfL5YdlYpp8hN= zFUiU6^XoqS+S>g*`s~h&Zq<p)7Ck!l(b0L)E8WP36vp<OAD&Em_2bf%b_uDNy4TJB zK60#Tx_a>9I(47_ON~BnoiQ=VNKSffg;+sjU`k2SQLi`IEy)jWeYupkG$qGHdG3a@ z4rh<p)SF)BzQVJ{fHUv3<`nHKelpPltdhnlwr|CxcpJoB?tEw5a-yO*h}}w8kY$_B z8EIGRneSgO=u2$~^)qdc%2;N3#py@=8i8rXeFyk!1e7k8JX-W`+n;w*YM)-+SiYZ4 znfc6vblWpA3VZMM6*D{$;du7ARX8Bmapw1G=O!oa*2elGA#u|Wv)#AY*7RtUyohJA z+Gip5@7;xeEpn^wGoPqupI|pxLqBe(wT}2ZF7q$7|31$<KVLyvYn$ko-VfjRu>1P) zo49NHEOC2$d$tRURz{wgWka+6Gq$SN&1b{UZGF0XvPSUxT8&x1zUl1ydSYRjo$@Z7 zmEyYt-^=#Ax8(e2ULQTv>*J&1#G0e0T&Bmz+&28SEh$TpY3r98x4l?A-+T?-^W<Ua z*~4#c-dkCFz>~wFxKSxqy(v2;W46_b4Lu>B>~^i4mJ#tk_wwOYlOBHfb<dW&SXMtV z&gZt_X@%?phs=h=^7#MLT5f24UTxB(G&%Lnx=lNO-u6u1u>11w{$E@P^$cvRteo~G zA7V@+-^Fs=UYxrkwYY9)eB$2CNmjcIl2?k_${DKWD0jP@EZnho^)mf8|DJ#IS^Qx4 zt%Yu7hFTAnzg+3Oo4+@_tj&OR{*6`pw<K@-XaCxLy87k=x#|i%H$!G9$_k#H9d8}a z_2+Golg6C<3WK}P4{mYh)96;^VREZy`!+}5ub066)R*~3ERQ5AY|Jg&5t=>E+v@JZ z_W~c>HyH~Ap3Aki+?K2RjqBCp+TCday#d;`=NfuXPE3Bj;_oSC9lN_e%cQ3ne3zAI z@Yc4RzvXgF(6O^V-b>E4J^viMFrvHdm8<AKEitEeGZ*(&-#x9JXm`f<@P|{u|0}Yq zUF$c@yzzLY_J@e&Gc)UAZS_uPP79sAh;35xo#tbFn-*`M!qRlwm*o=c!4*RCJq*Et zq3^%5-Pg1G)wKBDimmBW7|YvlaQxAf*D1F+nK<Qk>f!xdsX@-tbt|(Zx^;bL$4K6n zzNVJ7^3jxFPs_YX(_Y7Hi&3AzG@adM-=1}ep~7FQ>MxeP-n{cl$tlkERc~tNcUjC- z+{|qG_T>lrZ|_Q`+FUd4YA9hB=sT<+ALRGZ>S0S!QFDNl#iSM%(>SdY&(A-aop0dF z`crE1*Iy|&`9J;a_*S8$A+gIi&0vKruS$2*{R><E?sNJbG;7hcgP+$JMa`(Xd~ug; zkk^vWC+}=pEO}{Vec9d6;#aS|uXdhu(Tz>$UMOmNFj?)$#W}e>esUQ{KQG;wV>8|S zR^VYHla({Wa?`E8i)H$Ry_)N^%$H-rX1Sbw!uNfzo$$&x<YN(QD17t%p2{4fQ#Y5f zc>TU>%YJLIKlAUXyCJLN@-^pm@XLtqXZ;f<aO$QQZ{Upb-xJTT?JKXp%_SAOBiKew z_n@Os|829Uy(wDaoBa)9pPx`WmbsQkV@*bej(EiP88dIp^*k%LBJ6gU(7n8jx=&vo zD2km=6?*jGpW|Z>hu4qaCr%SH3{)$7b?5`1`|RJbYpsQTeP9=4yYoR*u6NGoJz2?u z0)EVr-zMeo9_F3Ym}36th|KrHUiC~8%G0+b@|3*!wsMYpv&%i%%YQXqoP3=9yDIMN zgN)r1x?4*<&mFW>exYL}uxEScJ--7{(XVdI&RA_Yzv9BzzI%z&exJQ}m}7JN-O?=~ zr?#>6q<^^Zqi#z^^~ob1Cykb0$~3NKn3_BJ%t5PXho%XBSaEqn@l4rJ+nG`q@7aFu z+*x0+Vn)vII~giU?*y5%Ty<sg=Ss~!@unk_)lX5~DdOC+2haAidiy`W{Fd>(T+WS! ztMb~N8$~a-%~#Y;S!KSDW6rO6D(<Ju+y92wRvQJJU3)F2_{g`(3pammY_!mrGiSf{ z6{bltv-FGQq7SJrFTcL%(up<w%eenvS$QnACOY8Y+j_HOYE=(6?Uv!y?KO%zd*JfV zoj1eQhU=|~@1DK>%J=wJN6xI(ICRUSZq?hcb8ExDb-vktd`*p(Sj72t<>mYn=D(aN z9v-kkqTzt!gta~rqEkA3@3T$36aMU!U9&gGtF+J=I&YpIY3dAe<NvwY@=k8iGjHqH z(<_`rtv9>5xy>#<TOZ{u*~L8l?#*kZU+xv`Zw`7c63X_YU~ca25auNhyf3$A*-krU zmLB}nR=Lk^=LgB<k20qAXzuLs7M;^S|HT%YB3^T!ZL4Rp9;p<0vF*+urKDXF-LnLZ zCyJD4vG_lKmhSgvk5Rov@=~AdPs~sMKDS*pw^W#U)!Q}NlS;M2(__EaA8@i-KYPEH zZI`cg(4Un&s#&UMyHt*!Pd^i6XtUr7_q;hb6uy7g3t@P{^W&4VHLF$PYnI05^=dv3 zp7ADSC1ja*xH%}BvuIczsM)F5DDZa@<1V?&{PFw#-<di2`17c>QCm&TA6>svvb{>= zoVj$lL#S$3o9+ANBe%oOJ?2|(bE3ZIM=^8Uk1fKdj+}Lxrt~6B?V-+*nQ7UYYBT>n z2>S77M$Wmu_cH63+x%F<V;XKO{M4mto#@4;&WoF4wM*~Jwlv;&*~5QXm+<L}MPG8S z%beY|H1kQ>kA*5c=jAURb15!dbn)!cq%y4|i=PJky|a69XN37Yxic?iHU;?3I%V;A z=au@DTkYR$=6zpKJMYi!c^erx+8rlb_!uh~I4qO;nlWpSoX1mzqL<s-Lee(waA`Tw zq2OY>w^nxIt!Lu#H)iinK07UD|My*=_cgq?mrAS)<E*ew%6MWkM}FDPcc+ZYxqi&u z(bX(BjcI#V6nn>%+M3k@z2+>%?EU5JZ;U2<_}KimvA%&n+^0Be&7x4#<5RwtXt7_< z_}ExmEqChV$E;N|t|V=o>S^BNkm-1PYxTd!+YL^CiDRrS+j-@a%AXk@H-5S(ruOOP zls!LN>Q+U+ZhQNx#4ge+>yJZW6PL@2-z&N0?mw~hx#!RK<y)45CwGA4y;)0wKHrY_ zToqNL<b2MoR#~Q@eu5*v5#zqbt-qbWx*eV=qx<_^)`fEywp--AuUz_VBU`IPP)FU_ z)B_%l$(tCPPj;<f3v{<X@QC;Corv3JccTsq&RSb+J28EV)Xkm8pBde~ar)MimcB*F z3#L`9nBC=edglf?qg1=2ruj-;f0C-N$E5WI2ESQ#rZCNQrw~h?$iB7p4z60gZd!{1 z4@x}E%ly9c;}a88gK5i{O3%hx^famGoLdn%J!C<mkN&pj$0rAK9B}kZTXj^+lPO`+ z|CaX+#Y<e%YSIoY=U`^)$yxRP!5aCNr81!_*#z`YhZa2E$dT#jy&~(|DYIgwjaR>x zXk2HmaCElXxzWdjN6deE_QO9jH0zgm7cPsrqU3j`LtN?R#|!mECNm|sny_6tyXEVS zW0LdF%v!OzU{U6`&2vrK_B)uJc>E;(OOma_E<US@{!NZ<YZT^elUVY(qp^Wa<8d&v ziAJ7)f*50VvbLs2$=nzd=fe&!-)3_vHyLj%d~TT+S-CHq?bC^?zxC(YRlYg#Z?AP& z{j;=NXNweHw&|Wc$(Gadx8UWSIgfl?^Zxnma{RjRk=55vorSlVeV(;n5qoowqp0Z; zdzr)L+KAQHCIzh!U1j|JyR7(eaqmDkcd;2J4OhJ`EIIizHeGr3S*_fiCrdWY6Fgve zD^|Dd6JJkH<2vQplI1Zy-A_-JB|0s3GdeF(+V5ZA_jKB(w~IC!>s_)mUQ+5(JS*t) z<wOUyOlH={@#|!B&V4G&{TiV*$2U!l)uE|0?2`XH7M3fOy&sj2Zxs~mG})~7_>h&w zEQ75RG+)_n(GX}cnD)W)k6qHFB~`1~S|2nr2wKFfzWT@F)VF~8^4rxM<=HQvIVlJK zozA`0CwJe(mGuvozH+jRejR2!mG!^8A_spGXaA$~lO!@H*RH>{;i~8rwJ9rBSUY~1 zTYmk$kPC;Sm(7x3hN`j$n*uG${uO_o9+mpPYui?4DUbU%IqhC7w8~NE&d+?Onf+9V zS9Xr2g!p=<rA^s~QZ7ze>3+AzEG_cK)?9(s8jtn8Th3&31|QU@XKHw$YQ5&DP)mi% zw_jQ{+?|uzGQX^{Y`S4y{4%)q9;?FiU$+m;diQ3=u06Yy@8rr|aVT9KS8(>!wrd{> zrUvhP!};^w;<p8Jp533r$GLYZpQ5{&<w2e$d>2lH*xc)hymQL<gu9cWRPyH&j1z@b z*f|q}f7m_|{bcy*ebq&_fNgg5tudb;1xGJET;1trd38#mvgUO2j?@=zOD_o>xp1;q z;sl4pG!wH$Oq!|B|3*~YaG5R0G~LOu_2d1=CKGd)b8<~|Z>;&E{J#3U_5F|Aw%a^@ zd$In*rPku_vUVHlpT9~fuh|lIZi$Sw$_eccUU%;AEPnn>^Sx+4yVmu5wwYgo`?uGd zX;0ez_Pke6{cL|_j^AHzR^LdjkKVqh@u&4;&Ah9nd}-R3>K`2Q5$9V{s<-;x!#8rL z6VIG^WAMRxzwOKiyZl&NWm23cFlSjvI_{i(Qug(fQ=La$^bV;O3;VS1jXJSOr?*&F zYWAsTpAGKb4nDW*=AJ$!+ZUN7#!}1foauM6`(OW%`8RKc0b{p&(y!vBS6@5`<XR;b z%aFyjpzze!6}lQl&42kqH4`OYbygj{bpNZ~fem{Pr**{a{#ofe`J<PH;?vFNncD7D z>?~DiRC-aN;*+PQQu|M{;+bUM<%WWnOLLyYwp5+}{gd$*-yd!x|8J8nKM6Yj*tSKu zx;(gxO~C7V{c^@@Ne*n)yYAdBd&kyWa_6?$JHF_@>)yskNo4Xy{pI6UWWTwh?Y`Z@ z+aXEcrY-r;kiM$HjqOsD#mUNsBim$GzcMNL({lOefywea^7D0`9Gmc|<(Nj=X@|zb zJIvSq?Ob2KVP3qoOs6>OV;x7!|Id!i`@FkqYmm>2_w2u)RZF$k2Txrt7QAxJg6r#I z4~Jj7x2yPjd3=oij)y(ncP8yxab==W+wOTfFVEW-K8l(l{>EkUC63Em-B*7$_K&ID zur26USVa9>eyON$tv7qspLugWUYlP#dsWik;`3qubpB~nHr6DcpCjSS_}iiDKt!AZ z(-M*Eod-D$*9rS_M==O6*vQw1WPh36x?;h#u-3DaqPU#$R&BkbFgyO&qtCX_f2PmB zRrBK0t$(rB)5X76%sOr6T4nOmLw?W4w^L1xYxk5)H`sXg*VIGFR#%_z(_g&3=iXZP z2Hpu$4_52%{VUGLUGOI~e|?*iqOH-?rguuFrF!!g@0zxwiZ8H3B7S$)B9pQ=Ayew( z`db&v82)*-b*1dqB%9!_qdJoPg}rX4+swp-CrYeNS6-WOq@y)5_g0b7)vGzXEZ1v& z^4n_cw`LpHBhdwQ7wwnlEiXu!%iPl!S!E<*U2b>Eb%|)d=p(noF;>>m`n}8Ecqu6* zt?n~f9JOc94E-m|9zDFXu0khN;7rH6?mvgl*6*KVaWm@NtjXDPZ5BRhNe_JcDd!dI zrulPJpI4_ZT5zy-LH6BDm7aC%AFUS&pDL}Inh_=N)a*}|ji%2l;|Z(Y+}NF-nwgiD zwdm@a@X-H%JUVm^G>LvW&;Q`{=CcC!PGN^FKA5x5()wULo2ll!+JpsnrcXZQFPp%= z<@dUcvDxwS>StbeoOai#;{3YKTE)br_p8=2H~IF+MfXZ=oU!x$)7aRw>x(t#G`+tU zxu#U;;hSoyZ`t)5?#%Lb^|AJHFY7N)p0#aD@%??xpWUW>iZGhLUPQS}&G@pz<~i5g z)x!^Ow7A~0S9IcLXV)FqI@6x7mWevKf7KN)@8tHf9alHD?iF>a*NCkC%lyOUTvb8r z=Lf$o&eLspB$u#-<3Xb-=L64`-xf?Zn)I*Pr}<F-ZMh56<$N6XhomI`Zi##N&5)t2 z%%Hh4t?Pc?&wY!vy(d53*x}SBVHe_mZ&J^s=+31377`vi64w9o397vzRIu*$#}7A; zDo8&p=ACz4=yCEfi59z`E?4UF%yoCHI5I<?^J;XD>#~%icS^Og`ojYi4oM2U_kXUv z^J&c`rX$bozE$4lzA19t?XlsUt)?3d^84m?oHnoZ<#6UPTX}S5!VeaSwO^Bd9a$B5 zF`b8pk!cU-k@6#leg;?bXR-2r2<E^0r?hJpkGj9i%d5#Oze+8%f)}n*QE!+ORnH<= zF!zh}!+aqJrV3?``$s<%l&=f&Qa$A*edNERshRxm-D1}cnE&0oD)YqZd*^oNe_rza z@e|Qc@2f9{ZaC7c(EFOz>FmRK-;!NgKk|ykTr*v{`r9Qn$KuH|9{jzhV5PWXGH+63 z-NN4cQxEiC`yK7~CuzqAMIkO;^F9A#&r3+ot2Z>VS-kk%j;TzZd;YHVzxQFzO7C<( z*_={0E$-9Bb2o5FnMqw;;QAnTmNnn(eeACyd4H~*x^0b->oVaIk=BrXduNqKi#u7p zmacG&?pwP->2IFSl}*8^Tl;0p)~0^j#=SPzRzY5D!Qa>CeSF@Z-v1@lW?S-4WB)5% zpC>QA|4TTg{?P$}<P%EoO7^Nw7y7#KWlL~RL2=HFWdVQA-B{A`Xyx4OsW<v2rQ6(^ zc+&9Pf*D)~t+}g{47qHsWZtoV!@u&c{Ny4AfnTTdH%{JpTyJiD$Yh}gquhl0rCvW{ z4qyD(*w1MCNZYW}=Y6?>NE&C^mCFKF1&?Zfm)V)lTh~9W{*iJ0OreEwso(3D?|u+J z(Q{M(oTiKO9yTmg{;*JTgVU5kr5#xX2U-rAbu8mGuHI!=v-;DiW%B2CeV)14yWEyt za*h&5$KBUFvZ36i$0b!5Ij7(M;c}$^Fst^&467{Z?Q<W#dmX}I&Hv=b#jjiETBljP z4O<+hr*^j@L^wrA?YGssom1<(X31N8x!vp)`Y`W$QK|aQR0TfO?Am}frOEqZj{cUL zx76o$_0tQIJvOCgb9wA7ihgvqe>${k-{NaCH`pw%TJR`OYHrv~v$rlXPH)pRpDr<x z6<*qteLp<q<b^2h=<8(xSElL9bXkY*zcY11d13gGbIYzd^N4XDXMS6jI&J#fl={DK zHm*ACu6@(?__AaFqP30-^S3IjG3BTTt^WLhFMis&uU0QLm}at{D$suHePWv4V)5Tk zH_u(Uv21mA@x(8;`MGzlb<3AHT|Q@nOj_c$GbTsh#HDfZOx-DcmVKsm$CPEqmRr5< zda`p_`xBFH`%S@ZZqwDYRt8P#TlzAz>%*S;o9d&#dVk`X8LuJw?6}7BU3u0^Pt|-& z|GJY|YRjvmGh>vd_rIC^;p2v{|J&yV2Q>Weoc^J9iPNRMEqopcvTV2H<Ym{N50anO zY_mdXse*vw;Se_d|4mNwjN5WDh05OwvAH|99A3L|nIdcIBi1DqZr3!$f^W`QV!Dds zysy<9Wn0(3^}E*EALrU9YVI+m!cto}uU6$rWe9tpz$0Gw=PN$V`L%Gh?n)k$9Ik(R z@1N%3-Fcwv%2^}VCu-W?zn?o;{Neczg?}8L6RxHA9;p2-!=SkC`1*gdJBlv+akqA4 zY8UGf*lzoe`S_%tO#d@x7>n2}QQQ};_QAdDWYiqli6Se7g+eaWZ|~w@lxVhZ|Np2q zd)}ASORJasuYI-t*RJzn4m<u<O#UP*^Pc<gmG!nOzA;*xO)OWATFk*P<<*pzOd&5m zWTrhdez~$^W42@iQ?iVymnk1dMPDnY1Lr@n`|kq7B5gIr|88S!z9DS%WxtGvo^Ze9 zq$vx}{Js74{kLzjQnxpmRG8MEeXFf~Y43h1r&aEUt#nMw{FnMHd;B~{>gBu*3A(}C zzV28jX>zRl>_itu6^;q}kFnIu6))|c;G^I9z<#B$0#keA3#m?rmV1%KItlI@?E)89 zt+WigU=XNxWx4MPQ7u_nPDho9L;pYicbvj&{9hx`%%G6({=>u-u5Q(9*EUqx*YmAg zXWP{NzNhW5eV&QT^AL*~m6G)Z7LFbV#Xrpb@mR%gR!X`20Yxr{2bo`Xss~KF&F40S z%cR!E-j(se#m~>}uV>{l{+!15!7li2CC@q)txm6)>Xtw??kUV~D!=wA|L8sHWF&fB zkMW4*^_QPNZ9Ctb*IVCu-|w5i$D1<^eD>BCe$Kbwx;pNkbNO6{LoCrh-(R{Zz0V*= zsF%m&{PlZ={PGRye?Dnge|@v!I@_(f$J_2+$z1L|aZbvC2V3vA+^+uq^Zaqe7P}66 z_n;*%Tf)0%8XR32IO8SHB=2os7KH2lys7l)sCL1v`hRM6=PDzftq}PkoABUlc;3Et zqa`22@5IzsRs3J+|Nqna2j`iZj>TDbPht*WwyfKGA^tb#k1u~`?`JyF-%&enA9H<= z%1NHe4vG8a1>5EtH~M`w+!-2SSrcHzZ#M7FH-VCRA5O`s-7~nGCOF?H-z|6IXxQN} zQ^tRX?*)tB3p`<^T>nY8zs?}Dp!}~&O;x#n#A@y1YRRdL_1bICEwp`EVm+6$bGCi- z!ud=oJ?S|Mw+HOlrR&6$XZh^G_Ox$n&aHiW=kH2++wwJ5Pb0VL+x~c_Z(kARRQv0! zvcB)DpR3pU9M?N17iAr3{>Uj^;o_n>Ma^}_<}1a7x68eJo%?4```o*7y}Dd8f*S9< zO)<Vvb@$-2H6J!FV7#!cp6x1k&8<%xX8P<h{vqAxBGnncDpam0=G5A694QY^wz4js zoaWQE==<4qvkH&(gj~EP86$3WI+fRFmRqUmu}>K}rUgF)j?Uk?>)_(L)yExeL?r@h z!U9ZgoSpyY*7~I_lZsm|IR7}i#M5umbX%Wzo2_@e+(nn!)|?G(XPYXry;Q57OCtPR zd2?8^$$<lT0mgsWE;s)QiBDCxZvIhx(tf&>^pcr(W*(XL+|<5#|N6}r^8Yp+Q`s7j zoa{3{FlKt2iSZi_ah->4_8Awy@9Q@@IJablZ>wDCqK<ol>y`_J95(y(<!Op|;QpV# z&FkmSG<_1~@m=~|bHV@1{zomY^Dc1Eyj)+xS)bEW(97f+eMPtLgwMZNAA?lCIhHSi zMD}|gzV|1fCs1tB{ZlOFE1uPEV=d~f)t(x#`6YkQvak#Fil%C<(VbEv8WMh;QTJH5 zn(Jo&KRVe*+;&ywy-*`o-}zH@c9k>d)!*E!ephkhhyAmdD_LGWm>aw8Z{zg)mB(Mi z9*wwA|J_s|w*1@WbqDvdb*_KKQS0>8Jm}NRihzc<>q;iv|8P>LXI=jC{PkyUD=Ec) z(Y(3V?IrW!J1op^bf)IdiHmptwKd*%evRRFJFB1xbJW*NXiE>}dvrbjpOkT6bL^)> zg~Bz`pQ_s=*~}-!%@lmoEH5zU;`Do596s6R{MI6-ZO7{C)9vP2PIlOm|DQ|zb#3?L zKa7fBtZjEzp4z?suIr3jRZ3o^tN(2|&+l1Y{V=>#sC}zR;*{@UP9H0OT)p<Bu3J)P z^0b9VW^$_a?77hqP+PTidwSXYlf5ak0tFtPoEw}hY4Etp^n$m(PmlfV4YeijV{B!b z>bLI+F_vVS9+p=#y`E*mefFs>wUxUr&(?2eVM<MlXerl=O-^q2mfsoce((yP)5&sS zCvn@DIHlQ7_ReFee7%|fZoP@WZRLyAR~HJ_PEU(9zP-Ej=gIW{Td(f9T$-nttJ!>Y zo~p_E8^@Ys78Fccb!<iCNB=Er-$=`y%s6(jSAbu9->W)qr)!rUEzn(4f4g?&mlUg~ z-{-~O&0P6Asc2i({@#o?(zkajt}T!+xRvto=krZ#?U>)zNN}+_END7c<`i{e-T#I8 z&CDW7i4QKm?40l=<Z7wIh45oZ4}A)scJL*YJvt}%b#qvl7lWMMyQ#XCo9?fivH3F3 zw&|YyKi<5KtKn8~$Vl5Z<&^uLTSZ*;J^OcTIpJh{H|EmDODreW3p(vTcla>3+}l!7 z|Eb$Kx%XeZxL`?ogTVaBY#V0J-kyG+!_?T$BL6LmWdOI}oi^3@-Hmb+BwCyvns3jE zZOfVKt~M=`nI}7}xqV*Z?LYyOrStsK8VbAbhA&dGRkd+>*`!{g9%H#T{V>Od#O3p> zzt=x&oU?E)->uhMKL#nkUos)G?;PWnR-anM?ems#d}y?uz2WbfqsIkU`u0n7&NUa9 zndqvLb?#5}?#W^~2jds%ubijY68FL4*DUs{ncjsZt~*(`=QV!vFl_LiFJjGgit$Lk zr^HI3u66lRche5vpQdrBR(+nt(nPhNPY-LJ<GnC*cD<O)L_c$#iKirg&0Jpp;AFqc z&76NHN|r=PUDvoAGgtfUjhuj#zok0+?)g3A?UJwh5X^scy_L9FZrgz!n)_O_Wm>;4 z)67}Yuu1Iwx@}%xkDs%t`{QA<u`cD&k2QCfF~n?Elj*WiIXCCA%$2OpZ}<4+XWrZ{ zbkb&_)y9f__lga^)vJ~yHCC4<HEw*nHiBb9`K0}6_rEQjZ+w9*_FL#Z%lO?tZ)KO; zzV<)l`9q+tFU4bZczI*Ot@<8DR#OgV_A`B1lTs88H+489{A1CKjCVhOIAWn$*cGo^ zUp}2^QcdXydhDgh_<woOiZib|zRh!9K0V6KC2Q85;y`uisblr`-)r&TWn|jmH{rqM z!|E@7*j1_MSQZ{kb!M+ryTKd$(fcrqj%b#)^3+>J*_tUwuTEbSe6nBfLCWRdr?$=O z_!aLlp+?T{QTpC|ok?@E;!iqpajxqV^I7&TI>?cex%9QnpKAT-4QI}7nYDE8)46#u zlb3L~z75kbNzZ3(;qUq+UN70s%^c8c{KAy&z@ZOIYnTpwm*IRM5$nXuKX-n<RzQ)< z;&R9OX2qr_?GIV@y}4ToJHJtMg{4Ns>e*oz(jGKhPiA{`H($|q?#yqD^P8rWi62-! z`%|KQ@p{G+T1!H*@5NSle9V8?|K7srz~zw77k*mu`yVvD|8>D3c}4q{eNO9yyp}v? zE^6Jj^5V;#lH1?>-Q8th6Z-ed^Mg0;K0CXj@~^z>lUL7I+56XsaeR5cV&i}5xk=p* z7(j=XwoN`2bgAA<*392*z1bfNU5k5`*R7hZy{-4!Jh1&}mtwcn?uEUieTe-;`x_2S z4oME%9K{?f9k)4oIIVV0c7Em(<Z{M!f}6G5S-0=*O72PSvpvK-sy+HW7JF=DU;tae z$iNUSyGA>n-{va=H}eb7S*15N&G-+a|3CddSvW+je#QMl5qJCV)%BU%a&K?Ty<IjV z_sPvdv%^zn@3p8-tg3t7|Ek1y>8eJR$b8P&ZEo3zbMAiG9L1+z+qvzw%HECPR$Nb= z;%yIXXTL9Cy+ZIr>kq9%IuUHlldFs)m|iCspJ^1`SR>)o|MZ6b#N)M1yDDq9exCMX z^A){6jp8@7OV8AYubjI#WU)cu*^RebUuTIQEebyvAp5P!({j=cG2ZV%R*ye_oi*?L zV&AH^9De@8w!Mk(3}#Q6D)%djG0ndt*yD0yQPBLP-J9wZrIX85_jCW0->^HXl=qQ* z?2L=8H&RaY*Dw03`g}6m?JVA>`LQ2L3l(2GGbi0YBCn&qf2#jAk@_z-aW{@lG{3s} z%G}@mZMKp1J8BthcOOl2>n`Q2Zd#jWw%bWEseXd@0<kH|`bYIyk5)Nvyb*sR-($`E z@Tc=HZMf0@!dUFS^%Ku0+D{hUSbNcN?Xu&!6^HNbf3R%*<TcZlcm|nO3Kdr}FjU-1 zPDn{e`1NgmuVPo~z5mPqYe&>Ea=HdMN;7PI&VGCH;!uP7L%;u@;rg#Dv1rCV!#_a@ z2`~DS*<RV5*}}BKrLj?vAvH{x3uMxo9^-^mN0GMwGrPCGeO{J(?Y8c!yEk5R-&m1+ zd)u!a-EWuFrka?mmtA@~L!Ke?xO_7s!*6cRoYm8BvNPC!WaiR4)N%et*Z&Re`b-mB zV?-8m`DPpzP}|s0uljA$--qujt=~UWu8HZIJZVXYrt_&uMN64hMwCZ?cldt9%Y~uD zAb-QY!(x5QH`V2DxK*Jp|0p@=4P)58kR`j9?p|M=bG0L5T3W`eWf_yyGNweW=zO(e z4wuHvMVeFooSYqZdF@v5sJ>}yk7gGp1@&|a8mh3l?tdY?H#jc%UGTd4>&gcU+75-h zVU%P)&@aa@Y0V0Y@_&bpdQV>;v$yQ;v9r<J-{09={{P@%_x|}0H0Qni!nXKiPUQSu zZOf)@>svQ(U*p1w8#`Cd+}XNxs%dlYTG{5k&5I{*?p{56cl+|`+xyqguXjiYDDcRL zs9?F!<Z-C4C$)oZQl~;1k8=%ESB$SxkWrH`>yee2TT6R=zw)x2@j0oHaN_Lge(jVK zEDViittkwf&xKjA)%%=L<Tw-{()#fKz1`*on>HSl*^y`1wf9EO=_KLm_h;|98r(9x z)ogpSdXuEh!?|Ay5ApL{OZa2nm=of&$@sYfyY{)FgH7FYR_r{L`tAC*hl=Js-zMH( zb3gFr^aEXz1)nGM-h02v_(w3`w|~>PuWg(noc!jA(eG^gqk(xhmQBBtR{yup?r+r6 zuBXQu6>g>1y567m#89VQlK0`0X|qlUXA4CJc_#n*u=jnj_L-2T%<Xa}Kkg?@>NC2{ zDO=CCuV8J^&*)X5t3>0BcD_BbM>;~7{n+!b76JES3%(wg_|tCgEc>};!R=+%x2{w_ zd$D6-?w$!QxpC!In+|#j?VhUgT4LSGdM^JDrYlU`L>I76W>-6%D^%<ndZpjJ>#O{l zY4-lSY|K}$>e*a&X8k@>U;ovEri#8PdPb}_zq4Iy-IH82`K#~j<GzK#<!5`#raXV! zYNo&Mt=jUu1;&Rx7KjQzPx$(1+sPZPZROWr-|_N|X?V?g;Q8sk)vH!1l$}kzd)@4k z`ozR~O_$H7{+MN(KWsg>RQPF;T#8xg&QrN2>vr6UT5139Y1NS}9-K=}7WL?qYN)vT z%-39?Z;>5x@auFhq0o;8x)T@1Y%r{Q%al2>vry{O#K`Fp6Th!1npzj5`QI^5SVDKz zXNSxz=Z)O|)E?O$aWC=VJt8)PHN*Xin7zByM%HxJoAop1%#pO|wa{Ey-Soq8>7}XH zc$bDN@Hd<~CM=lWHht3b<J#)4_t$J&WbDekQzUK4Nyq;@&nH}QeQ*5bDRX(j?T>$$ zmgXnrS^j>)n7LGMnXE$5%;5PvA8NL0E>p|ga8~(t;DwJ9ct2|IKYH7>q$`6VMXknB zBzoe?r{Zz8M{*0(>sKD<sGj@EB6<qfw`E0tr#1Q4<R1?W`s9(y|H~-zl{dfOJ@pFZ z@?@nbndh0&N$$c=6yFyt?Kr)oh$|&q)AESdoyDsqr>|tK`>Q*r{om35jMJAU?_>a# zEI9|8OH~*|7!Lf*ew=fAd;0BdS5HL-G9OHy_qar8^Q0w>XFM3V@7J5?JXLpc3i66_ z^NVu~^o(>3^}TC!dhLcwTC3M?yk_+}cf&=s=$y@W`K;e=x-D1zcJqBkcG;pEg6^g= z#dkQ>=N8?POrKkPk5xRj>}crqy9JkZx8E(iZu{N#!v*Dj+mBa_&+q+kNqha?kJqf< z*M3kHs>}FxwkIt2--|1$A^rC}>ZOe3S9-V~TcUaS*jcx*@+V62tr~8crvf`y@zws~ zl{8B*$O`N~%DHj+vs5Vw3#o=o<>X?Hw>g|kWfyJ{UR|A(m#38N;g;p8G}}KZFUU(N z*hMYaK`px=ttwBcI>WIr&96?b*uhP$*r8C(WA^IVv$>~~wO-0&SbNd^C<6l{8w2D2 H{|x*9`PRWO 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 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 literal 21944 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 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 zcmbR7h3U+5rg{cO1_lN`h6V;^h6Mj$eIwTuT^<Y!^WQKqFeD`BCKe>lPi16aSm49J z!03`(R-(Y<#h=E&uyzXr1A|psL3-{Dk=q{_7#2=oVBnsfo>*MKz`!8Dz_9rU0|Ns` zdQN3pbHV!q3=9l!7#L<3WTYmhNFJFsmw{n!3j+g#Sw==`eIk25(@zG5`6n0{7*sNH zODbfhTgfpn%-zGlz{Hc2pPU$D+v38&FsFurfsrFOv7&%+15W`1!<-lf1_p(^#N5;v z`HBh#hP59U7+Aat@{3EB#+q|6Fl@46U|?)7C`v7u)br;Q1H)Pk1_p*M1||k01_p)` zOri|T4D1XXTiG`L(<s@@SI(_gZ}9&slQz>fhHM75%@!hz2HLDjYNjUUX69z5Cdx|e zZ2U}Y>}<*qF*9>>b~a_Ov^|rViJF?SlCrXznz@;=k(sfPs0f>=nVGSXn5YO?8yh>j z2uKRdXJ-=?6Eik4GdD9c784g?XJcn$oTqNYRj<#>Y$(LxY|O5tz{)GnBW}ej$Ih;- zz%C>tA*R8}%_YRm!Ys<h$jr*Y*w4r#%XW^1orjybtXP1BlZlDl+TGlVnNv@Qk%L>t zkdK*-SD2ASKv{`PUsXV+(uH5#nu#xnx4nr+T7ZY+rAdX1EH@XEkN^t@8?TB!4?7bZ zi?N_EHz!*G8<PVM2M;Tgs<IQmG6yFUyP27ZIKOe7p%@>RtuZ$XGb<yXwVF0K)ih5& zH}6utRhrcvYj&FiTNArrdm;PH4qA>&ocf)mox_}aocB9_bCGt5ahc@u!ZpZsj_V&c zBey;72JRm`T0K5`mV4QF{qU~yUh93^N6aVOXNRw%?+&ohj0_Aj?`ko{^V@u7;AVco zz`($8TYu#v82$gje>RpBrgscX44c&#lrm0Uuy8)3!DOFB%8bpE3l=#ADDpEa{I_6; zVtU8$OM!u*KaQD!fpI6(YEYs9TfoG?z`)GFz#ziF4Cae4urL}hFfe#9I54m>a4;w{ zSToo%L^H%QR58>sESSu**i7XAf3S8{23rPuhFFF~utd~iGq3;u|3Ci!=>Nn25B}f( zfA9b8|GWNg{=eq`(*HC5xBqYaU;RJpztMl8fBJtH{$22Q%HPR<?)|y_=jNa5f3E$x z^5^oOOAj(1q&-NvU(CQb`Qc)Z%_d8edFnYCia<_d;bdT7SOj(~BMT=3BZCOTBB(eM z0}sPCD4UtViQy2G&BCC>$O2`vGDtD1LD_6b;=D{Lj1Ew7J_Zx!B@E6C`3waNl?+7; onGER+8Jp*AdCkn&Jh^Mf_Q}pW{U^`Z8PCbUz{tS(|33pi0Hu=^uK)l5 delta 2627 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 I|Ife=0CH+cOaK4? 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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 delta 24424 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 M7#SG<|7YL_0C*!Z{{R30 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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 U(>K1ne%P$Osd3x(-=I@r0qIN8761SM literal 22748 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%0A)p7hOfCj&GRkxpMo@`?2fSIL&(Awe{qK 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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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 U<MwG>j5k4!Wn^Id|DS;$0H2gu-2eap delta 2691 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 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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 LT8#hyGw=fdY@d@l delta 36390 zcmaE`oaw<zruuS!H#Y`G1_lO(DGwO<7#J8B`6od5ATd<zAFOZ0z|bndz`zj9z`&5; zx<5)ZIXAI@fuS{pfr05f0|QG^nc!aT<gyY428KQd1_lNl1_lNzrV##yw1V_p28Iq3 z1_st{1_tiwH$-lKNKY)TFJNGpa)W_^fdh&K(sL@)7#J8`7#QkqFfhDe3;$=&kdd00 z!obkfz`(#@2Ew8{N~1F}QWF^%T0Sr^FeorEFsN{fvI}M8mQ*k>H0@wuU@~K1U}?D4 zVDT*{KRJ<sp}~fMfyoJkUzn`z%uTE)U|?vFVPL2SYgS<L;c3iE%uQur=*wYXVA{jL zz;^ppL_l^yesKu{!$b`R2IjR44D7+;$*bB5ic$+07<vydFfi0HFfepY>iKi3;?|x$ ztToZ$v+VxtW7qFkcVSYhz-g7{6B62d78{v!7p#07^s4OCT%X$y`L<d6cpu(##`&#| z@!7h=^?T0jW<Jdm{M`EaD=wKAC3Zjl-%<(xZsWeI>fGt)woFXL3?Fu@u!*Qh_;a*5 zq^Yg)yQ&#F_s*T@_cLZIZ(P35vRyvxhH%3N>nD>1S`>G@<80*EvGM1^JEi8^CN(%P zzI0{i$TeCrC5Ks&u_$MQD7!<22k#^2yNvBJx3hjaExb@4kdd)x##1Fj!Ih?~ia$n7 z@tAmeT9=AYxc;r{U!xwo=vfA6C>I`LIlcPiMaO!TSMp~jzVA;pF5Fq&AjNhxzUtNN zloSJbld}nSwp<Ph-TKGePfRx8@b%a#BqEqNTfsq~-!yCS;gyX#!W+M(tKT_4S!uQ1 z`kNWoik#}JHvTk8uD|J%rC>IvkB`;$%J%t+ss93uzMouuPgURRnbOT#?cR+G6IzV! z-<sAhFw;Bs>$<vcKfQmiSUK;nOiaVpYg)=IOm&A?KiqD%Q_7j_;e3KyM6h|bn3UTM zi?Z8iZ=2sM`1R{`U#?ul?d?LnXGNthM%l>-Ilr<tTm9<d*Xf;Jf|KvncUP?WyUMrB z@6?L#xy3>C$G?fMGuN+P`hTsNDF05S^;^?JXMb+2mz7UGBd+$;@Q-S#rp`nC-iPi@ z({?<)mhom{dyD85f%kRxDgwWbX1saW?)0NwYURHN+v4{<k3Gb*d3&9_`ma+{u6<wO z{qlQZ)f<bT#O;F9cKx?)`l2VQazeDei94iTo_WEAJzsYJ=zb#qK;;fo`QeM#9^PE2 zvNU3Ar$YIRmV;77$IN0BS<n4A?9j;JRp!88z-WCSVv?+NVNQMa{Zm&`cFvIF@m94s zyW)|KnEw%B&gD~d#k^g^qeQn}tumc<fw}9NSz&M1<~W_HUt)D{IlWrBv&zqZRb{u} z%KE39xa7ODd=|~pc(!R{#Nt5hx&jNu9Ws{ZB#I{Avyi)MF04JV>;ILISxVAfDsFAU zIWOGAWW0ON=IHQ5ZBfe8><ch)TOuia&p$#Xd}Uv-<B3V0g+)t$aeoYy+A@vzh=fqn zMdQc9zw^9qxGin^x3rVB-Tjer=MRoa&1V1jw;ry4dHdDt@5k1>^s3l+iR-gqbK1un zpO@6HjEVZHcu@S}ary22_sTeCOuBP_X<Je?quE2X9USga?Gi!{rhJfHz|hpBCbsl| z?1Tl=&fZ}>ZLp>|A@Z1+#I(Xs|ElwMKmF6Yd|kBtj!h=hw0+ZZCeCrVE~6pzxU=r@ zf|ZxooYNHhUg%oCxMkf2H>qByi>jf;QERn)_KJOcR&rk@=u3tF7l$VS#ZM2+O5^Da z)iQA_x}IxNyT@cxU30_~bA16nji*<>JPh`i^pU9RsxNt8Tvo3(smn@mzP(i6CXbX~ zo3r{>O!Inc{zKJPV(X4rfo*cC=e_xqT~lnV%O4-A+4J+o$!;~t`pB=!Y~~$~5=jSs zUHf13%vfT1#go1EyQDggM4ylDZd1N2o_GK2+?s8kv%1amUhaI+?;^y#mYMmiK&Q|B zI!2A2_+M;4yEfgB&XSdD(chZ1T<~P=+M}&5Dk_$fdUb?sZf$#LX~1*i8_$lW++Y=z zEtyKslcE<16c*+be0HA9HLE^Qqq$*YacROO)^nN<JlIz#aGmCS_oj6#SGX(3!Skh! zF>~(Rx|MZQ|4!AT9|yPAp8lF;IA2myPRd7ACwI?RtKF+_nq3OgTrAX*wm0m|(^pq_ zM4ipjQBP^ekY4uH>u#3G)H<$-!JDp#PF*&QNtd~*%Gc9jrN`pJaEUIjSIe%})PIy- zdMm;<BkkDSgNOfJimh8*pb_L%WL)!Jb3eyCkA;FF?pi{gVPVI*KW{nXzs*nn`%U$H zo3ebbxc_!q#Yb6;{h~e2o<Hlq?VIEjzPTQ(y6G7V+u!ebS(4i`YxdQLF^^aLKXlsp z+MCaAyy`&<w;cNX!au5CZ<dGAqKNa-&n~Ie#~Pl!=KEW{`&;P`fpsBf*PEa1R5Q#x z5P8!ytUughVa|tnrwVRJu3}c0b3pvCcx=5yuH}NciaYiN{B*qZx%uL}jqiW%5{`U& zwT*3R_+p()rP-C&*QUlr?Y>j5c&EtoL18K@+ks402FJ*-hU!a_N{@tXW?e2jU-&j| z@yneH1C;9fjvua*{Cy+fshs4py7?RKf7Sav-&gRT<DB}7bKmduWm&o4%)f)n?|o`E zW6;{Iw_$}{azK5Xc=`j|myv%ZCq9eWx=QSJ;r_k}zqnWWb7vOsK4bB{)c*MM$r*cJ z$BIqb@BTG#_x|6H=6-+GpTzdd&Oz>H13#}rMk2TUD!Xjnw5a-E?X90a1UPvec*>^e zV0K5}L$ITY#p#`6#2k5_LsIJu1?P5D#AF4(kIU3tv-0>wGke9a+5RQB#n<(EtHc}+ z%*r~rS6O27>h!kH*=M@gbH2&&Bpi|NNqSIOrjWOB>sI5?Xnq~uWlN8EC`cT1s41Pn zRpYKCVGw-Op<;&Q!X3KxES9~W4Cl+1)#UGW<gk`Ay73{yFqKV7(bPh+H!ts&--++n z0#qAC0wO=pSDUZ?TA;Zq``i;210kiJs(49>RDNL=uZKF047-j_WU`gxb3e3mgTTs8 zx3x1@?&f-xG9@EbW}>d;%%2Q?3sQfn_OUnbj-RHv^Y_yI{wKHZyShG3vYz?ayXnk~ zGUch?F4_IC*(1P~@T}7#{!At_LmqPyLqG4gILnHh*PV?!w9oVEp09S^UKQs3xzlIW z4CTh94T9UgaX$Iypk+Qi|E!x+^je1*h1sRI-CO^aNZWN8{tye0$m3;FI28HUGnz&4 zgGGbX0=}yY9c+a+U;Opr;^JR386VV_KVVI8{CV5%&GAo(y6a9odf}eCI!brCyvNgN z!8hmpQs;lC#bMsW>9k0+RCVqGq0+Vc1bkkwd%Vc!=z38R<L21q`||K?jqlQScm68s z{Xed*`^)=`)BGp*tx_T#7L>e{{^9w_uj7!;o`TQLnP2A^DjYH8`scggO6{>7Rgb<+ z@2F>BSm;ppjW2Ya*_12yix-rOPn`Gpm_}Chzb7F{HiwTKaB=BwQ~wb=Jx(L5UT5(s znQF1<+nlMByT2xV-1d{(eRlK2LoT}v?LHRNDs@_vq*=%*c|>T~S=gCL@EbO%xb(%@ zPnWX)d-uK7))`%Qi(kc>?=L7VG1*wQH=_G~n9ZJgA$hsJ^)h<*#NvgouV*}z$?%8s zs5@I;7Hh3X<SjK9&MK~(6U~@86C5}fTgz}Z>S|74VtH`m!BuyefJ{FD2BQg)C#D$r z9Sh)^c=2G{Cm*Yr!c9RhUbmUGcsVP5R24e>-8#Rj`LVaIm0L&0DJPYpG`lzIft?3; z`gC35a-CgJFLjLTY-F8Q+5RoRk0!7(l$y2gU$)Ot*zU^_1)&4I-!}CzCBNJB!<?1r zL+%5cO`I(kbQhR7d^O_JzGI+Z(3kUkmd079UCm7E3R({P*+0u{ldbZp{>0%_T2@q( zq9HX+X4Z`<^Lnqmx;2$WQ+Sr*_2APH$FAPn#_=M;*S9b<+NOSnT<wD!yyrhoj`@|d zZ)?dLTQT7?TFcAtdwlr9tjx~$Hu{XPTV;_-v;9<m*`2SSoh>NXXjNB|k}7BE_LkMl z-cLEOYx|xJTWWK1S07VR|Jj(r7jWGF2j?d~3+CNx4-~RUy6LG+416URZ78s0f`T5? z)1KfmL6!ooAABA!4f%TNcY5Z}DdCv2r%0@cWs3FPo7K-k_AR#boLhR{j@d%-%^dSi zLGxo?3Nn^^b{XBDF;DB6dm9g9`iGvIv2)X+gN5IIIqIE~a@$wbHd=d0&T${Bx>;&f zvsUl<wKQ(Ww&|A-Oy}*J6VLVRj8ECwh3>QG2q!=FNqNx7oPC}vx;4aVepmhJV-M4A zWwL5Np29InZr++FNh^0MZPr+-V>RR8`4o2XKJO<B&vZT2xhtdEab#y@=9&mw1AE!o z=by3*NBS*$HM99*v^%TPMMqZg=V9NDGdCYe;hC87m|0R`0^5Q06Xcs@raaiWHbBwQ zVsqf@dX7qU54nxLhggFSy<|-|vtKi|w0?WfIz<V_V>g{^H^?0_=IE@EQ;0t$uE@T# zNx1L$)Wi>+CD#qMJl!*I<?hHt(}yd5T=nG?z8Z0IA?Kfx2M@(r&P?Pyov`EgmD~3m zJydk^c5&`BwEi;DzNX<4mr>G$TQN`b_qVycxu$h>Bg6EFpG@;^{MFbs&B=4yHWBv^ z$HFSO>UYj?KDqkD3r3fOc_rbEfeU!_nAkH5b|$~v$r8XhvB0+F+_jzw+XSDP%}BfR zrlUfXMVvpj_}|uLe*f%e&N8v~GOE71GGWDZwzqp-{~rl^JoB8PZ_&Bgo<3{!qSrdM z)Sm9W<&&DUCd5N+QQ~~n9gn_rtSwn~^V{>CE-~6J;fyx*;>-W7H(Ql^K5TCH(Jya< z)=WOWL*eWEHq&>~CsL9pv3>7d-|xZ}d{j79Ew^1jq^0G%e9Zm)g2%ty-6vf;RHRb( z;LYj0xVb$nZM-sni_~UHJYD?wbnDyQpJp~s;`%0hc=?-3rJzi)Z}9?8)V1$a-aGmB zc=5i7eSUvUY`KnXt=eC|I%P2v`-TrK4hOf&Zxq?@ns95!eO`tVX^l{$13R;yUCH9O zn7(Ptk14k@_WXGJFe-&B)`E4fjP-RUe>>xXP1)AP;SGVm)%IQH&z-uySIK40=M7HL zUVFc-QWKC}Epj-B$1h>yk}$JrA3g=7D%i?DTf2DM+<BE(+DsmDIqAIebgNHpz0&pL zPQ}j;UreNu+qHK#&P?d}{Y>rE!bXpR<f4~14jy~;=+}ia0>1uYLYwWf)q-Vtq}XnD zU4Hs^ed@ob9t-Sjc1!rVOwS57Tim#H_Wknz?901;OPzdJQuHeO=aDze(KjD{Ov>3P z$)&5aYv*P259?3zACj@Tu<5Tyq25zB>-xD7{Eb3Otn+ks92a)o<8oU1`wj1{?}fbN z*p`T#XIvClvZQPMG|Mn4zwl(A=c!ue>qA$cT5$C0{kW)g%6n(LP@BuONV4dE_tRMt zT&{}`&+gy*Az_1rs%f|4rimX82yoBq*rsLvf6K`w2`s07R6p7Gn`1N6nv&u*vzA@o zpO#~5P@gjEoI{$1#lKhAd-B$D3H9<>wJ-(DDA@bkI#D9+p@GdkqwC8Kby+t_|3BXR z@a4~!lcagXW0|(Bd2^D}c5&beQSaEBo+>3CJ%O?3GG>dL=U-X!_eqYei2ZGwigtd_ z4>R)T<=EA~KHBYRV-!DaWtH8`=ic2G3R1iOmmWTJgYkI%Ny*ubJ()kk7PHNhvE5@} zXmT}XzWBo(8_kkMPJX)fm4E*EaQPqaJ5!lIcV6sN(HAk)P%HbN@Uo)Jz|>@-VcOXl z50Y{;S!>0XaJfGa*46H43TAP$N#Z^r5D*>Bc!DMCY3bJh!M8KJD$H-4DLu%tL!oB5 zbteCoPd*DgSAG3+t6szF;hc8XS8guX9Q3TsLiMtB^IttsdzGqu%X$0N+pB+=J%9FS zua8@Ik?-21^_x~4-7Cu`TCeqN1A}*pa*<l_qh#spXZcm#yS6G%F`9g==e4%*>78?r zz4};{^ukX&MyBVd<$T>u$JQM5-hT9w$VHd#AJ3k}tM@jye`3$>mOeVG-bLl%=I3$$ z+qgfk_7=bVLq5e|-=@M1F>{`k=gv977uvApbI_m64GL_}Z+|&vm8x)k{-w8hOYAGZ zI=Tl-G_DJOb1yV#PXDvR>qNd6MLs{Z<=Ss{`A?T_-`)S>+0G+pztx|wJtUL!zy4o~ z{Q1;RzXXN<_Dft6%v$adp!G`0=p^UN`nNXuYFp>CN-g6M-m+Y035&AM-RfWW*FK#$ zxi9X%k#o<_=i#m<E`lXyl`mI6@to8q;j?-dYr^qWHyR`^7Rj}jX)-)ato5GG#CGWI zs~IPrdFL(Vxb>A=t#Xb{CR^G62WRsqvPE)w1i$<D^#3GANx_5HWo?e=&Q7+_;Q2V~ zdAv~lyLW;$;y-Qdq;)(TwwXTKSjfn+^vRm({eo3C7h^Z3xz!7t7fF6qG-K6kpF%r_ zI3b=l|9-t&-|qAzaLN?6`Bgd#wx=z*Z#JRc<iy0_lUH8<%b(Lype?~I7{T7aA#-|B zhi{ANX`P2*;+E%krmb6`mGpCxmw}4d{ZDC{C*RF~^RIp;M{wKX|D_*Ich?`|VEgmy zwX0?2+iZ^+-2Y}hzxsWD+w1%rEJwaij&F9gV0vG(sL!Erv9QOB_iQej7Ry`gZx|ll z=-W7Fb8dppfjvTBO%EQFyAk*x?48k^?T>d}?hpE=v}4Pbl9ZPx8vkAnHg8#yWcFs~ zmYr@}xA#kQmwCzFYN>zy=0rCi^Bv<K)!Xgm*Z1g5Unau%X7{Os&vd)^+};Yf^0+;A zPSl<=XQsYF>J&kjQ^&r2HS;(b@W?~&=*N_*l+r&3e3_4K=~qyne0uH1j~7pP+_M+# zTQ+gkP7%S2a^7$9zUD7_RePddeSWyj>$!9EYyTW%*EzMz$GkD>%%zh{S?U>sGA3sQ zCcV9JLcq~z2eU<a^4l4Gr|%rF&8+zL%X+5V9pk;B`;(S&&Y4m3{8agivzK2B?|Z)P zcAjPVHUUZf>6^Kq?(ygGO)zoT)4OzE$JyIDz9l(Ti=>ZEuQI!P+b1Jz_v)+N-|k#= z5?{SsJ7sT(%6#+3#yg!geJ!R>-P%#%S|28+_1xvjF*R9_UB4CFEHXrkjh{~spEkY! z{wx1IPueolp6YHc@|;um(7RvW=9`Xu-ILU|VxRblcmJQ}i`sJOMC$U~cwJ=|w)}aK z_A};RRw)QP_%M8lv3i!ftc|X~*#pY?-`rDPg>KKiV`XU)Qgb`@>ZzCFZ8tKSxYGLk z(z@&K7au%TbN>C0fY`fY_4cm6?=dfbo@HW?UwdiR^<B%&uiLxYafU{;xkojs-CEL+ zF@d*j!#%Oyzzqi-Ztq}dIb!C!@+tSWlDZ>1rfc;xZ9M5Ldnc}Ay7qC#Y2pjGuHKxv z;?$(MLCVuVu2x<BE$C@Mg!;*@R|SjaDm~w`(Q<3p(mC~Se%y<2S-XCBaII!d;%W6} z_eB-oV?CVHraWA)s<AoyaN37Q+D+5`e>ia9`r<$>ufl)d7FLw3t9rh<<my_NjeVge z0S|)r@70^pT9vHk)3-)nm-E~oKi2K%w@$nF%Zz2gu6Yh|{&h^Bx)uw6_`CLkjsRbx zh>g5*NPvH<TSN1LnEIFmjt8MVDeD`ZR-d{Nns`v|%tgi@0t=)bb6Cq}+}|NqoBsJk zl(*{Yr*B@I2vEy@5fRh5`kwOZ(9)DW!Url^Pr3<*UYL1SY_rnr%geOGa<eS+Oq5>L zX<px+eyie4S5K<lN6vcX-7`MSjoQq2|E2q*{eLI?KOKLr$5p3hi(Q{*ed@>HBmOU6 z8jDR`WHLQ!-oDR#DlT`7tmWpdn8dEzCaRJavee?`tD6F*emdO+ha#+!1x*)3{6G7$ znN7*-+ob6Vj!sPNW&3v)%<WxYYx}UJ`#@W?{(rT~<(r~be^6hW!6+%#&XKC^u_MW@ z{e@^rx5LbYkeDeN7Q%lVw+DCySl4quklAKyzxM6b%L|)hON6ZEsn%OYF*XLKSpU6o z?Z)K;3_mRS&m8P^Z)VuQwR-8J0<+jFS5thBw7f93&6~UDRqG<o>mOHmyFa^<5&!9e zr_`(`zghPGe-p58!mb~E28%wQ>s~DQXfgA(i*5B46BaHA>R99O`AAL5lXr*JyOsIZ z%h&I{f1Gs@$GrO3n64lFc3El0*ShO;6es+6y)Ve|?5)4E1iq~lcX{$~vi+w+hrQX~ zNBX-hk)FxJG~s?o)x;*YJO4k{aA~}K_fqB8l!o|~ES+`_pI5ioKjX4@z45TR^`4IX zw3#!`a!q{2Rei_wOttGC_4|GvAFs_1+Iva#)qIWP`St(TF(@{g-+ll8h<Z$>nWxh1 zbH}#oC~xd3{%!tQJ>|uZCF%!HB-{T<*dkQ>jr~yWPSw@xF1)MD{hq(V)1xHgzdPTv z_v?8XorD_pH2%@ZIp7_2kTF+1Ebs)c$*wdfarGq$mqPQLHO*C77`Df(D*4|3T9tX% zf>4$#&9{VN>{fEum-wW{IJ@)7M`er5i7+&Nk&<ipBydXSOD4B<_a;k(zZF&9CGma* zV`=sJXXRX9n_dL%UH0YaEVE5A98)I#;G45a?7e|cSMT40B~zxHR++{3E?*%iaOFIH zop<F-YKM)cod}k{erM8elh!vA+b0@I?RzTV-XvCek$a+a^5ctl*SppqKhD#)zG~~W z@+rYn4;4)c@GAd5J?QL~<1gNJUHtpu)HHq0mV^H?l`KELkYVR)3SKDrXwpY+mfbnO zc$AjzOpQLGyoJX@V8*l0n<8yjxM!A>rdDPa?z?%y#dN*4-?e((sNH+sEzS+o4k^6F zr&;B<=Jb;(NkKxzReGhb&$KM)*joQF>DaZ9TQeV3@b(7W(&PCRlwT2fWZ#@ak;#cS zAI&NF)HPkPTWr(DyX%i`YSlPAegB;Y9isha*YoO{|E%0JJNm=xwNHe&cEza1%<*Ge zdBi~Iq?y=+s$<1GI~Wc=T$CzgAdtG-z-PN;(5g4fr&ND8m{;d?VfKTolhv#v+T>pT zom{V?_-Ri2beHfMhZr`nMn7G&t!L`Z_tzfvMD<_&&+EG)`)AVI59_|njrKXOa^>#Q z)sNTn?m4Cv@hzi6f>B$)bAgUP`Jai`&cr0Xm>GHLtn&GJaoaOa6o>`C2yj{R<3{Xx zp|A@ddzU$Xx_$HN{JQU*j~_>7uS-*2+o1kAK4jWgftvb_qNm)N4p_)!oq0M#_SK2M zA_W{bZAuOb^<;IL^Llb#Pm(Wgy0Wb{`l5%$gXebf2cGNR-m1>Je#Vm(o@+VtV-DX= zJ2AUnHEQ;YM~#2iUaehs@5(CUsVh%*e%x5J(!k1QO4*z_T)$=1rNy0Nf8TxgTrenl z*6BRUk7W!u0%hG_$JD<M3!j~nemyWsXmW>hb=>KQ@2*E~{q?@{`IhOMdF%GPaQ%O+ z`s0=Ks_POpU$d*$Gbpk(EWf&{=U}pbUqnmE<mFrX&fl2!z$ITr@@=lt<=Y;gR=hvX z@;yQ3f@`>~!o|B4`*JP>cN$7aU*~zXe~VX2*W$T*pSKAY6-)X)SfOU1U0?lgz0_gl zg?ImR-TZiILBH^!+UBJ@WSx@V%gTxcHzzSYz7n9n=lbsZH~#MW9p$}r6>HtOsi*E| z{d}#=a-z;Xpry~F&x@sr<%5#D)2(d>_H%Y5Nn81*PtAVN6dSYtdCrdRU=CJRud-i( zYwv_IIz6!DZ+qLeS>n*CM|aMYtc*BOpZ?cO=8&^nd9-_%%XZzwnI>6ZQ-juAwR*O2 z)!NqVa+@&cw_OS6y!p4YeRekVsz|C(N#L7mv8baZ{L;Q7v)2~c2&=he7^E4vyneLH z<I*uf=Fjryc=>ybRFni3JbNV3cScwKwA$;bCv#3snD$Io(DY}DdET0NO3(Ir=Jh_Y zE~|fd{t8!2gM9u^{g~~Q7J__Di6x8Itx3t#QM6F?ncXzu{Ia&hJXYqq?o9O;YY#p> z@!+Y)@hh3J)gjKjEpxRMyKY~M&fk~$`_HxB=Xn;zFAm)Lcdcf#on@SitmM3_x88L; ziOW4-xm$ae{MspBCEm>}TX@@g_sjTg5of*yIpn@&u6OauJ+wZN;}J7&(+}JG&K#b? zoo9;Vj4oa3_#MDvrvB6YUqD3Thl(=_2PbCSs|h?~rgg=xu#Y|HAD8L0bx8^`pWc=4 zeR;M=s<88IYhvZU$tm9-r(M`klGCwel91AursEL`FK6%iDwdX<>i?!FV(oR4JzG=T z8$D*YDSD=FwNkC;zZb{t)e&bb+-k7xfB{on<x{B>3H&c5s<v7w*sf|6N?gvrC|ujX zRM2~x?A(U*wewWJMQPvlt(AK9(%H9ECwzSe>)Q{f_v^or*17R=!a`1g_UpmkpUswD z)R0v0|NA(OyZcT+<EQH@{9eovcCR$@vbej~W#{pW0t~hL9%V4!tG~;YuXA<z@gPrW zAGRHZ0z1Q-B^KuGa|jTAvYqFY#QkqKm#uU7#PGf1RXgkY2FsY|*H|WQb3U-T=k>EI z%I&fG+hXQkzP4>b<e3!a*kvV>nsS`mr6X2dF9<!oBu*(P#oI(}(Zz@*`=>1Y^!B)E z`}cc?E$YgiKQVAT^={|(*BhNq)dyt%`|!G_cT>K?uRg0~|0BzP^FB|QP_?G$+ZB1` z-+xLy);-$V)}MbztkdRem?q0kbs4+*A1B`Je=<`p_3$G7Z7U92M>B7}-0E^?o6001 zrb)eyOWdob&R0Cip%`MV>$NrE71!QeN!#OPmKrzMKiS+~Aa_AxNlN<r70;}>7)n>v zUw_6WsUBX$wX?_Hdb?b#-?^<qw|=Y7smm0dWaaeg0l!zDx6!v5N!RurJRk5$IQ_gE zpM_h+^T@i(maD7}GC69M=@*^No-H)#y4d&nP}WE6U#ISxe*5pMcj26in`Dg3_HX?? zC5gX7+W+;dOrf*~*Ur_kDaP4KY21xYdcn)K*Rg)RmjMGui&CNVi<g%9J+BrWn4J7{ z<r=+5$y@AKT>W4At8~Tns>>^#t4`|v{FA>=Z|aWkvVwJ4D*GyDzqBc^v)d!4GW}TB zQ>VWZj=rB2+uPl|)l}~A=KSAE#daU&Jo&Nu{n_?!Gb@gqoLi;Rv$DXV^nO~^L+<6r z3@+^Y=q`5Y{fGLZKiytYT^o4r-`<qoI3vKt%gRiLSxq2olI-H?@4qX_uD6Qcsbz43 zxoYZ9K?l<;r8gx9ss(Q~m}Z^7S~YY2nUuA4TkizF-F3({A&@h0`@5%G4YzVL?f<a) z(~r-8TYlt4_uj8OEvMgLzHHWM&3L08Mz8Dr-ORrG!-WK%^Gkf3QNOX^*7=XD=ilF~ zF%sG?s9OD4I&h8b+;vQ$MVr0$t$MPI&-{SwhicvXH)~y_t_n526Z^{(z&UA`t#;d! zHov7-MXIVfvpEE=?@oI6&E>}9FPYC+t3OYwezsL@cd!79`^L+2wM1um+<1A=^uA}y zT<+V^?)>`a!k2Nainf2yY;{eyUevBI-#(?krs}Ma;rdUD-k;7`FQ)Ih^4c*qslTcf z{`0)IR&A7go4rZ!$B)-_vdrw?I7~TZ<l?{l{&^v!uy4^x)obc5DLOOxSk`_FzsBvi z$Uvipx&3wT=S%zdKWw@FPCCJZdu2pg!G%7v<mQk1`*f4z_AK=OlYZ#Dwef7h8AkQb zydv%S*T--0Fxt9BMrGgUR!iee4~&D-?SDKoPXB8m+HwEKy!(3;eK;pJM%*%5DLPZ~ z;;uzHN8~kQclxdU{C+!AG~)uh9qU4uE!ur4bV1DW1L6nS=luG?x_h~q7?<L9pV$tL z5^>#kdf#qb_T&BLU%D%Ja@F4S-J1g*)<$jJ^RoW>ti`hz=Iwmhc3HhIH%}(kzQ#lT z%8IkTecGqze0{&xq&)j<oc@B<EpxqsHs5yB*z;$%g>TVa9lh)8XGLBNJkz#%=DMVR zXU@B?FrB*Fv>{!bQ@usXU8ZMIkL8*3f6JzL?LU7))p_N6e*uwa5vQV}4{sB$eR<kO zziNAFo_2(bef`qz+3swzw}a!mj`W<F^X%K7nH)+=OP`v4(>R^Zx^Z!8bdmP{6z;<H ze=~A6qzKf!*=Wc9Tm7`_+DHBN@8nC4onHK)^ueFmmp&SQ=w9o=DLJjQ_m@i10_o$s z9nb7=actz;aU*{AvMtpwOJ5z^Ih`>!*KLEj@{PF@pX}Okm3`TXbM=}XRZq?S74SW` z(fKfW-gR5%<^1c;p7rSw{k*bq&qC|_SBs8XAKUok-}Q1WZ}yhAU0yzwv9`DDQXijm z+_PI$i&<rv{+-J<(T^TR*XC@poI0C7f6~$9-&#*UoxGW#axB;F_S7jGb`_ly>DtPC zQ}Fc}t9Xm5e=DZ$D(@8*;}>@3s#kfqKV(yt`YiV}^=q|^a>riGWuKPs>9RR2#ih-{ z`Qvvd3w>E`*%j&HPBv1CAFHqV+p2qrS$>+RvZ&(SXHNDO8-|~nSEY9`m2Z8+Xi`u# zL16Lovpgyp6S{>2_qHiETJ3t+Q{j72S(c~4NwUGZmZSaE;|<K8Z@EtWes<<9=a==i z4}Em*t(4ei{B@1r1=;mZH%>n(Ra)=9TQ<0oXR<8M^ob{y1oxcfSIg;Yo1D+{J9)Rg z{AYgiPkoJ7{CNDLg--@HCrH*iKJ9SYQNQs;>%tjlS9+H1-}$?|Onv=!!!E<5peY*< z{$AwcV7<Hi@gdfV;L~#?u9+^+i?b|Aoycjiy?*<_ZI8D-?_I~jx_iNrwVx+zcYAI- zd%jX4Z}-;yx9(Kz3<-HM^={V0_gPmLW#~HwUirrFb+=y4b@}s8o45pxi-UF5x6~X; z)6y{cJ3se$i$~|@7dQW&7JuCFw{@ZazsREc#HL%<w+qexbJQ>6hxL4}1%-Eu-NfRP z>Kr$V1+MwqSf8|(OaDj4w%w9b4Ju}HY3^~^b6Y%mXHkUk)2$o&nmC^wetVm%;2QIR zZPv_=#UeB2ok%_OGW$uvI&I$Yz5jmwyQAl|WQIbQq?g>L!>x+OA0BW&DqEAZxj!-U z*PDt-v(LRXzu}a3<iAYj1rz2eHh*G@_Mg4o6ES7d-50j{zom_Z>Mxrg`>^u+;zWTM zr@O5Z`@Zo0I^We9{9#|%ha1N(y3G+j(i`e_AX)Y8X5N!K{#h~ZPvz3vQWy9}UuU_M zvfMO=cL86tPO6r+K6%K;B6zO!KF9XGk`1$#h%{793cfzyW|7T}#=ny#)9W+W%sI`n zH))gmRFM{s^^;^2a{XPebniV=U+K;n`}XZ_`R<n2rr*V6IquiqQU7CH*nH`BzVaQ; z;G#z<e~vIE2DU$ZADGDA)n{4vt<v#!JZI!_v+(c7TSGmi8>{0bHvf5@UoFh3d*g}v zma1dCiskluf4d%1{ki>r#^2k=XSg&zVLjs%rnn?2;NZTW-}isiEDG7eeEvfor+vMU zs?ObYa_S5xreF2Cvuc&g!OzzPRdyI|R^NDf)}gaEc}_}RUKx8psbhmE*RNW$_i5$f zO3l?1<GRdm$z2VY`y`e#klTo7f!vF0y~?lK?^<2lcPl0>;`E0ay~l4({@C(8Fx$Yf z%7^>qH@9ojOZP6iC-%)&v9;~x+Z@RSZxe0X80-HlZ~x7co;_vndu5Y594==cY?kl6 zeMeILyn4m<5A5zdn|m#%E^WVV=h|D6>CzZCXG5!T-I9O>N4SnPXLl?v+-?&k^uLYe zvB?VY1JAyQ+cj*vpLzSb%--jED!ccul5i}KxYRBtropLF)M>48%3;ons#UxW|D4ta zbKkqVY1Yx6`twir&ib@sQrfD?^1AnZu1~Gai?n#~e!X^lC-=99d!9<>@n<fGj^D@g zAk&*WYPI&&o0*|o<V&u*{uRBm+u&=}${p#6Ejik4i~ejXojBL_sD$9c>H9-klfBvY zzRr`H(dl~jg6q-Rine)sAKu^$GW7lZ&AC$2#<pYoJ(mmxi?!YL7c*9GI^qA<gm=d_ zb&q?Wo=vxJyCPF$+Ti=}_x;N6wr3XPcIGopkUaWC<WGUNL1UAvpeLJVQ2*IQA?BRI zyIyij9%Q#PVvBy;m*7&h?{-&2WmL%p=jy$kKTkI@aA`HX{c>>6-hY}iio9A~ER#B> z<VCI7om<6pWX`f}yI-$b#8Q9PAR@ozaH+oGDcMaQy_rtFllG`eJbkDBf_{pm^Z!5R zr)-M<b#wcVe9eBhkK$+i`Lqn(eqHewb}6n){IDWZU~7Mt!oz<JjguoBM7XymyBL4l z<ISWuv7UkRY1l(8+g6^^V8sR|kEb19-&gHe9)4y1^S$2=wf<iiuU-H8UD5x_`eO~% z^Df$6yJ@>W`h<|+dl|R3vOwl%wU;LG<bRT!wq&=x$G?DIIzQJkGtNKyLjUE;!ml~+ zU)#>E6ImeMps<U-J-UJAyIu5=yX9-GK3?DVjp^sxPutl}eR<nZFwy0M;U^Ur#~PCs z3uD2|RV}U_FU!JT7c30PGOMdRS+R6N-L)0<=6{<nDb($ss;(btAg6kXW5Uc+TWl3r zIazhKv++-_ll}ko(*3&M#Y+rDzdqdmPFsY5BSrtO^*`HxT5Aq@_Sj53x^2<#DI0Vh zzE@0l<nb!e-s;$T(YD;|!nt!>c-Tr7Jcu<~U--?ssyXF7@1!-?_iX>pTg856kNK`^ zU&8)Mo@J@ePf`!PdCBq2#@@rNhP59SNnCRDvABI*Z~bL~^`8E(Tgvs;-h0>gQuOGm zJnn6u4s*?4QJKoJzVqMLsfmZ{lj`0&O;9cp{J<UPmUJ#<lB(z7oU;12AqO;6H?hCx z<;Y%FpzyEO<79UCH=lKT5`^Z+_Oc&pK787^@lNY)<1~c_v+GYxKV=kqLRGSN<HnOU zDn_whEbcBg(x*gv9|Zhq?#__wRNFjt=A0|qa-nypiB$&8-`mJvw<pd!=wNm2+Ma{k zTo}wJd<*luz2Nk@JwERk*}pf<wS5q_uKLu{?)^+x@9{)O&6uqzZmirn<9-{L-^;Tb zPS`E#FACY4v;Ok0b+VeA^^@lK`D}T=HnepAj55xkrJw$)p13`?C?q=OmW?Riy8B*# z_~+Z+n<6$*rZS{g#V9c;^5}or3GK&O<>!5Ck7hmm;b+nlXOEM&@A+l4vc**-tCalR zJUwN`FW)4kzQ-cnKRlHhJ<9%1(v$kHlRjn9t&cI;i#Kq+cy;ynl(@48qUW8cS8nYK zd&)3D=??D{1yz2gMcTE@f2Z>G->;GO(znyyHg&JeG1L1yHg7LU>J#NUTI5l#=@`A_ zyNTQm-9uON`d3Q5E?K@R`p2D91rrv}^a^QT=6;M%Rr#@^(jUf&b8gR@eXCRH7oWa- zt?QgeZ#--SpRn9~@uhkBvhX!Gnhvt`PU){#S#@6AwDR<&Gmgd+KD^=c)X<#MB>E+{ zZpD&)`58-{G(;n(Ovy=^u$Diru6uoc<?(37jm2}EIc}H<91z{R&T`VG`!Z91J!e^O zb^PVo!d>15b#E;n_`Y0S{36iN@l8p3tn90~&9QUl&%KtOa9LA5!E44L&EV6&V;04| zp8RszwEBAWD}Ab)cg<b%{zUkq{olhw9slJfZ`8h!=>P8P>G$cEA}p$QY}9Y)uS<RP zAjj}!PruLeD8V*+``>GJ?_Sj7aq?YyxxMe=x}c34G}D*Ojz0FFHT>SjS^l#3zQ5V% zW2oHVaBK2A8=u2}b-4vvnmtaq9XAqiP*|aBC%`Cv;B`XyoqEM@=T1J^Wx*C>u<!EG z?*Y-e+T!v$BA?zF?r;i8s}g!Wch!zH+E#j{c1zagt?7C{d3U|=+4~lTB3oB}aL;`5 zrATFGf!(9s|5Y|`%ePH^H@z`RP0Q}@`ye*+F6qS=1EV9(tdV{2ZROFLhs&l%R@}eE z%-LnUm|KWJk+q?J#jIOQ^)=f>&nc%1F1h2TvSq!w<^7+>Hu}B{OJoU>x@B_bQ*Y`d zza=&|`+4KIUzb?hZO-y(oG?jm`N7i@*9Q8khn9RhP^}mp_xc!<j>z1FFA~+~oxV}4 zxV8L;N9@&7>2-SRj#{g8&)%6-ZLIukp5(V}M=o;O7gQhMSXvr<@R!x33oAwIODgiz zVm;euzLeL9WSU=VZ*+K;MCSH_3H)^nHkBR7lAGdjY;$Lcm0+Lnp<``}XJ=3SUOz#i zC6QHwCwA81{m1S%@mlcnuim$~g<ti4Ka=}}4pEaA&YzE%?09}K&5>bY(+h>g$+~+d z-E{bFu~B>-L$ap-)%g!y($BkW&-Gknce<XtfvI5mZ@KWp+49TlN?tuHPWP9y-xW7k z_i6j(pFK;N0>5Zoit3xaHEr+i(1$aV!w>FG&E5H(!!h{(WzHa>OWnq|c8dhL?Adfz z)V{dUUHv(`+v0_ReilY{0;U`%dHn911#b;rwz(=TK{Z^dvDSOJ|Jpa)6DBT5e%`Le zo_u^+{p!i`r^4J$&k4GJ>w?Ad_<r-%&g_3KvY0;Oet0Hh#|8z?eaS^8l3jf4TmC3+ z5>RjHJKHmrZ|UNPbCd-p&R)E9>4q7ya)GvzN)~1!CPzH>2F=Rpo9@=N(p~!V%!3yk z(^V&zmDM}+&OACJSIujZ;o>O|{^cxxpEAQ{rOM;>sB>TIi>E3S7!)qvnp4y^PwSbL z*$v&YO7CnAr_x+Er6dMh$rp~z*Bh+3Zk>9;&zSeF<l^+?62;#~Hacgo{yj}BZTayK zm*CzrQA!KBZh9}-{Cj!WqIJKkvc5+7ntzMQ`(*q4b?WN7o~7IGT)sD_%kAnWx5pQ6 z=u0hiIPu~Cw)-5cUTpPo&zQf>t=h;xQF7y!cEeX48t!h(H(56Bc(ZI1<6$51^wr+Y zt(UXU2HtrrSeN(N^3%uZ!t4KPxx{_WN-oiuy*hcFp}?6XNqI3Vi@$n5v3<~Pc{TLW zY%ifx1<86o9oq#YKWJqAPipnf&j@~#d+6F}gGB}p!jjgvRH_SBaq#sN)o;6O{_gF) z^M2Dq+v9Csu^i<8x9Fbxjp`?wn~vYgY`uAS|LX$z*Yk?2HrIYGyJ1{#X2q?pdo?#S z-6no=uyVY2xqQjXm9pm#?ftnnY|HUSkHwC2G3@-(=^grmdHPD$A5PXfI?YR3PVA2D z;_(gCH!3_Y+cn#vW6BGeNZHF3S|^XD*Bdz&N4@e1i1=XDyPhjwbe)5iK)}fte)4|1 zCs;TvUT0<cY3Id*OWZeCvYx$Cd~L5oZJvB)u#U_3<=k8UR@YB|Q{C2jUdEhbQ;3<@ z73H?c`#wbQNGkEqn>F9cB1ZD2^Uv*dQ!hUVl;0Qal6z%}@~%1W|6MHEu*t}F*{ugc zo(wJZ8VqqkVvqfPTn&5CCTw}C;qkF^Yu)*cUY^X9v|v5;FiHPJ$~t#5-b7=Dow*CA zFun||R<)}z-Lv?^+CtL?8O`g~k54>2_-=~!fv)?COxxpkJYDv9_O7q#`yxYoS39qa zV0ouf{;Op6f^7<0qmpO7xOPCB$3y4g$*=d)9M^x7xPQ5x>7HLi>y+s?Xa5OZ!>Oll zEckfY|G1eSTy>uObG|ICKe_Qvhi=X6?Z0^~54_NQ!M((0a`OLWxi)hvf8O4oY0{F} zvX{*{E-Lj$aoUlsUPmTQ+JEko`ZICsXUm0~J-2pkF4&hE{Qbr2FBXaSnAEDc-7Ohk z%sc+3m*uxx3A6iY#en*mGTJ-;oSPK+@$JvAw<31y^u@Po_cwm<?V7fH>xTVXe@p+p zug~eQ`p4%F7E)`kSOmR3Dt_+ld9~(*7teaC=a*KTeX{8BgDl1^I@^DiBm~EoZQZr} zLEY^sExTt6vc3FXasOuwyY<tVMjUCK#aU9R*DSAlG#CkmAKd<lY3H%RZ1(zfoR`&7 zAF!UU{`U9#o!aMb)BSSgI;U_af7N_y)tr>k|N4vAvSsy;pKxvLUv+xb?c*PPY*us} zyQCu5UHSgs+}}5xZgVP_mFXQh$*@+g=Hz9|=)Y?I?^}w6FHZdGvMAo>l&g(j|EEN& z&$)j#aKt1p5Z2b5d8^5PThe2Xv#+-}6xQnotoE+`7{uuF*~@T8)R8Y|4%jwIvQ0MH ztgbnI@g3z3wW|}aUKPx1eD@>GG$`+M>({xbk8WjsWF7aeeQ)W%`fc;xG%k<#GC%!~ z|4-McO^XAXo}TL$6u5NOv&#N&;Z=E-n^l`)q))%zwm0qm`io`#pIm=Q&v|y|@xzzy z>-c9rkE(CqnV)THXfo%<o~QG7*xFd+Pd@SDqIlu+)3^I0my}khTkWVS_UJglZP>H# z%h!je);^soFL8Ii#m#m4@06!a+T2_aRXSC5vxX;M;5>`C<!!egoie-jO>pDAb*Fq9 zr_8-y&U)nC(!`3dk?V@Xt~<5vK6s{O){|@OY`2OZyj-@$%c0&;X{xmY18<Y{b%$5$ zjF_&^x7oIF|JF@QK5cG#&C55bdDm*4k8k&`P217`=u+yWXY-1#E;)Xu<Hf3dS0gOt zw)5S0TJu=@@M89CxA_eZzpwQXn!N7%v1`XS_rB+rFq%1c&MN*CbFuXHZxxe6y!<8| z=sxG_^gG`(V)CaqJNxE5Y;LcAXIk*zUQY82b7N1`%9f~=o)N9=Q4g=KG%(OSHj(M( ziQbIzSAWIU3%orh=em8$+rGf>B`ND`^IH^}CTNtc>${P4li9s!Vp5V$a>o~!gR7@s zm!7LO??}w%o9}~uD}C-*wpM!k4)c#YPal7NUfum><E@Iq2ssI12`<s9l*&RY*?K#V z+LX$ij5;R^$3hL`-Fs{->pf)lXp6emU)Gpf_CM+Sd5`xIoHvhcj<!=_Pvc*I_qnpf ztrtgnzH84j+i-=8_c!NZQLl!Hy~-<+k2Ppd<Z0ZzyYcgCkIe?1eQ$X5bG~HFxGUdT znO5v||Dufhx2zd^Evu(KJ0-a`N!-Wr_)78mh85FU%D*vf-*)TNrgc>k*P@IkKMg7~ zkt}c8;Aplc@5PmKxv!U=4n3+HQu5mK)Q@e|T{efMZx<h{>!0@IuwrhF^3)`&C@DF4 zBaY72o=peJVo#Q22V6JW)$aDWY>R-r*Kyg|ih^xA_ad~G{&oJi;X&TUm9?`p7H7>a z*Id1uF~2^4DgPRQ2ke1Pyeqd%yy)n1%v|Zjhm6_xx*B&i`YJqMS5+~6Z{Ch2er0>T zuRQbcogi~gQ^Moa)7ET-yHXpi>~2TRk`Ml}jO~!(jRU>k@>SpIa%5&Je|@&?*LCft zUC#GjioCZ!Tbgvvw*JPuslnx4`)h;^)wQ`dUNvCz`mXOURliJNn<A@`(1+rzmg3)f zEzX+hDR#Tk9!p1Vv5_(PyUeL$%Z%gS-+kZQI3x3C8-Hg(W`(l8??K(dqWUQcpGDnQ zska>xZ1%h@b@TX}cIFlq-c0U~I|LR5F}G~^RCxSk?1c8`c7`3hk{(>Vb#HZQi;$Z> zS5E%=q>SMBQ@Rr_@mkbZUHyJ(9%sX(2ayxF&Z_LZ;GE_C<OtWrrpFeygjVuKZJ!|d zKKD(gll8ZicjG@C`?NZ~SA%J%C-><)>-<fkWc+8fhP2+1_;d4AblfD)Y1eo|?N_** zF7^)ndF;B_iwixscYk}IcV;Ww{|kJLb8dww9g#TL8`z>e`NVbh^*hw9cFWXPcHX)j z+|1CjC1*>j_JXh1cR!goEuQ=JmkoUHzn#mNa>!W0`nuCLH+}ZT_LnlnpUVuVU1c=8 zDito_$FKI+Y|X>E&AYS3-@iMOx&NgkQ|R0fk?(KQOUnGe7HnrLKL0=Vb~VGXLYdA* z!B-PM<@7})2%9Oi$G%}w;b>x1nZYnosa|uUlB(Ad7p>!ya{~Rmrs<rXcKN6E^DlFn zQ|2F5P4_<cKJqy?-}#SCn`_TIM*Mp>^XAh@i#%ePJl?$V@h>keEe|bS$`_iPcdyDg z>a0tc<ORc&3UU3VuM$*)X53eq$6%0r$>p-fVfTgyhvgp|9=>R7t!Qp&Bgo?x6Md}R z?vZr8saRH<Rap4@J!WfJV;?=JI{lY#Uc-0o#i#lzcSpIsRJb-h$tCj32I;3g0xNl! zDO|k0EvM~h_|GMC*|b_O#Z1%^JH7N#%j~WCaj$pGtN0faA$ip6V~G3Iw)viNWg8d% zo2g>F{BVW%ri_-o0vQLq)OHpgRAoH7azd1@^=!VN3j6v;8k!fc{hqPz@YFLGE)=&G zw|sy9NqTF-l~}t(!{7hBzGQjc$WUtP5t-oW{N&r&trs_(J@`I4C|FYJouAKhjp-7s z_w9tIoBug(^tti>fwNvab5AepJ-hPc$BBxT-#AyMMK`I=oGQe1>HEpApI^UP`P$3Z zkF!s0xfO?3y4ga>tgd>d*zXUGAO9{)*kHbD<+pXca|#VkMtlg9>I;yNzng4OSh!s3 zO=ofO^SZ_*pFSAONZfm(bdmU?J2$E>ggvZueA{v;Z};4Gr58$GvRQlMgCFjzu8#^d z-Ep&A^$3H__nRixGj}RYS+?uAKux`d)`yCXpML$^7w1s)@0QcGqy~0J#`;ZL&1Na4 ze0=0PWy@OonUg;*KA78f?(WLPD`UgvZ=Uk;ao*k&fiJg}{c_H9-;weE6W>Gj{W~@| z_8mMYnYrJy?D?9H7b89hyiB?@b^fhg=Pt`|+J;xg|9bT;V)ch@pPh8R9X;@Fty;O+ z^OrYXth&0Qy)xeI?R^8Aqg(%NjatRNqV-a}Ow#+i>xxU2#5>fl#_^n6d-%XB0rPKi z9Iub`yl*jWVdD`wky>eGzI%&sY15_Zu9;7q)&{7ok_$N~deSM&CVPr!&iU3CKQ|Zd zkShxeH9mT&^m^{y*zK>Ugr9ZyZmpT1b;8l@Umt&}&=j4jTcI<3Jnq;oGxAcoWXn98 zX@P8jNxkmc(z#X-Ti@E19{icJyQe~}`{%*EbA^&h*1Ytn-xM)t9oy3RrF(?WYHKc( znGsyekv#ENu&nCCRc^=GjU6WkUFEZ={X6l(BePN${uR&Wbvw_pEBpDPz{qFEzP&TW zQk0u^>+^+3=~x(S-Dm!6iKf!iYbCia7SAuZC~mdzfUo(>`hy+aZ<XqP$3NaI<`W`R zG%fwe{OKGqej4+uDtIJv(^GV{dX!R+-<p@Q@A%Aav7!f4w%q+27r5u4Oltf5u*mC^ z*A`S6y8f!ad^omMMfuX>mAt);8sB4X%$mnP`;@ijzP~LCE*0;6<mu$K`Np?Yc@u`R zVvbg`C-0=@d-J&_Yq`}gcC7gSTQ!rtZM9iTkYCW+rmpphQsz1yYJ5Dk5*^dd%@Jqe zn=kTz;!87y7{A7k4v%bNAC=tY<dYYYOXl_}-e<?#u-b86r_xkuj}^NWQ#t&-4sTA3 zed$oR<3MFrhwI-NZNH|7cr2NA=xp=bozH&mpDcTwcf0qeQ|C9S+*~tZYyCrKn>~M{ zq!~3Lq}hGWoo(zDV`aE9>7|=y2dCUqmbov3rWhNnTYc6z;n*=o_LKfOaoH>MJDz@< z$#7F}-ZSM$?b_FWv-GC%Wii~@#HqNqvE%O_>z_e}G4hYf?e3rZqCBzh;r6)!vGXls z=k+bk7Fii`t&H#W3w|&6JrxUuiY9-lZ~wP{%d2@eKd`gc@z`%;_BYwJVTaeux$|eT zBq%o+gt&I4tbR1BamJY?-6Bg?ICab}j>#+4h@6)<jjemCXQ$W8ch9+wT`~-h@u*(y z{r%4UMKL*cX|wNnN+rKo*?Q{riiPvbr#dtA_#PIjoXR@6@<jHXjI5q4;n}<l9dakz zX9?AxPRN;eLE~TZS!vU~U$xin*SlbLC;j`Mo7^n7UaiXgbWmpZ|9y9Dm(81R@NW0~ zr))c_?G8Nt;5H+;YU-~)Eu0IM-2L*vN~7EJz*#N<7V}ySttD?$nRdiTXq50-6`b@j zp7>%$=Th$w*LnZHEUHj4Gn%5aEcAHiGi5&wLz6f4ubb-&)n(p=>IzR1jm?c0TVj{) zc;QC$$MsX^HvO;7wv%Bxpc=4{Wy*Pm#ao0O*;Xj6FxObOqIfRb9Hr$+vBpc@?Amtk zlyBA3b$3h(=St1{x4JPnZti@G<I$7+yl-y(+?OqGQ-6IQcX@2hzoXe<{#V`Fj=Xpk zx9Z%plUr^~vN1V*_jrBE$=`P~i}rRtnl$6x29^7)u6}bnPFriwyIGr<X%+b5Y}n(8 z0Y=W<yutqB$5wB>YM8zzDYtJk_qC~;mfPQ*&};GO<1~%x+`5X@6XoNi4?KGHH|j!U zXqU?5hjzT`og4ECN(?7SXg~dZOl)yYikZ|r`-(Q9n>7}5-%oXQOJBTpb-kFHp3I^h ziAB#RD7ya;l4+UFUA<)GlBv7QXMH=_{3a)Sf5(G1(*@GE-4FDpRV>*rrTgP%L@hhp z%l!|QZvR+V>1j9h%=6%tckX|4aX8%K6Bc(w`D2pdJdIBQinEpnc&Kn&zTCL_&EdlZ zE*qyd{xo6^;pw}y(u1*OHtT{HRa+j})iWBs>-f^%DY0vVkM^t&MYH{%E|)C{IUB|+ z8>N=xvHHl5sk!mBTi-lAy@8+a;bJcjO^wt1)&-ZA+Bz|&N>AVNcww@OSHjy;wRubr zSVi{i$P}@izg_v^J(nE<np3!as)V+OO3AukII=`u^VR$xBK14N-rt}1%x3S-OBWtw zXwFTo_e^uv%8UB(=bqPPKKD0iJNvB~e|p?+V4LvbrKyj&Hdmc<iq$zS^Xiwe)dEZG zCUf0S{=bLU>!#h(z0x|Tl=K>HBi~I?^8b0|yh%cv(!>B2Io@oW$B({0c^Pi_zDD+Y zex%JuznhL%15DZOSz13@@AFVAZ~H&~Gs~}r?`fJfXKH<3?M$17=i*U8!t(`+l7+87 zQmb*%)K30<*!E<^3?<<?jXPz&vswPHIbYWK!yvD}{qVzIXLI@NHF;)D&RrK?;{T`c zzu(pF()+S&D&M;boDy+=#LwarrO{Dl-uZt;+OhMy^&B3qW`B3ZVY83u{2$uK6<<HO zuW!#5mhykugeP~)>*q)`M*IKiju3YK9LnUvxkE0G@4&NfXENL`El;f8Q?H;h-O1^d z@U1*6*U%G>wr(pw7+!vPg{{=9{rPv&mQ*;NlHg=D^FOjfO8#8SX%R05PunZ`2KN6| zcXHj=4JdG_EV0{U-z{^!X;m(Bz;4;IZcGPsJ~Xcp72Q#_()pr2@6q~c$E+V!)j6u0 zJ&w_5-4*xAT-ljx;`yhAt^ReJcW;s3TKMEbW4GRo-Fs9v?>AlEwa}x|LPYaf^YUFY zTvHBhTESy4lR7sfb@E)6f}>@>wx6_o<M;R4N59W9PxtPbeYC6j(4k;v)tZ}j-dDFR z>FLiq*y%HMreLANl>=hF43T%O{OVVQ8tvQ4<#K)7+Pg**O*BF_GOg{H&i8z(s_h{O zN$-vS{rwGQNZj8ral*wSk>tf9bvz|I4CnC_vpC<#F8XYA{ASI&na3|O@bu`PS#B-) zh~uJ*-p<uQXB&k5`X8C{Z4kfrJWDEW*^3J8KdX(FojLRR@Xr-qqAhD>7j<*pWBC_R zT3<iCqjrf=RB5p0^hJ78SC+^xy7pzKzxC0G=PN`u=6nqEPH&YxzHU!f!4(~mk9x=Z zgtnMGd9q5o|E-3>-9^Wb@V~vfW{yTV&)xQzX^-D&YvjE<5h-=GFShcjp>N@5_8PJM zefDCuGefs&o}VJsHZ$hd1D7xC3}V$sW&Y0hbT`be_xf(Bc<RW?5Ob5I7S}nyzB4<( zQ5W*v;PTY9PE(C9+~zia{V-u^P{0%M>$!Z#mz(OcOzBw3_3^1h`o!>9(bF+IoaeU1 zs4b3{V={kH|KIfU=BN$Z9&Y;i_2rw__cx>mwO&gv`t~B^Z33J8o#QhOR-Te*eX(x# z=Bo#<^yYJ2G^|Rj=W%oU!mNMs`fkO4-L@qg>W`l*f4eg+WvOe_X@k9Yb3ETpn>9;A zQ{nHIhlLN*cgfE)o_~Y$$cZMm5{Ak?t~YKeT(@6I%7<x6IVvgFTQ;5Q*KB+Ed)}^< zCrj&vwT0)LSot(-CI64A;QW@b^6L#Uc|ZC?4QsY(F{Q6jx)R%JFIu1Gx88~U{e&yt z)}^+gte?-SoBE5soL;aa`1s8GCAyMHtMuMS+}TqX>zuNC)s#se8<L~va9xRiVRdWH zJCWNNWpfuC2(>@9C%{ru{F9!)_sX`3{#NcHg;OU7Y}A<Sakq5h)7z`2O>0<Gn{f3E zYhdx+6?U7SZaVw=v5hF_@+6Tj8|uA;RHv>#7hZa9&BtX5I!gsb8w8R*UGQwbrR%M> zVdK@UjV1ZD?lYdw+qvhjmz8M2qL(R4j=MZL(6;$yWBU42r!VJPPUyY-{P@j)z}&yd zujey3D0+Ej@XCvQ>;LQ$@uc_E?`M;vbwa*y2)yOmaN=qEgh*uv$=kO&KV9^VHEgXs zS-(hZvAM=FC!OFEYO|6I&sya)tlNIJ-7Mf%sY&|hFXe&`BH<49HC4KI^G~fgYaUbn z=0ziS`TJWt>~6+)em(B>birlWb;>6fxU&fFd294ezERBHQ~t?)Kc#motE{CLODJBQ z{@YttyK=4Ck{UIZzg4MTZ!?bGX^_kIww1nXHswye;hq{nfm^>W9?Ve--#%fI$-_Id zUiz!+&kDcX9`;_+b6s3<=_dY$(CVu${OOM87&%xTF06>(IU)Gti;GV<UD-{p$3467 z(5d!f_fOB%i}PNsjoYl=b7fck0jaeTQv}3Tt=Y8YY}Ee?Da*EGB?K(rxM-Smuwch? z262xg(ifcyuQAm>`PsYwlGmLAnFYzAmrwSsFI@S<o=a<9P>$*{k*TWoYvLSR14M3o zw_Ttt+kVz!@}k1$mZ1`<(@VNMS5J-8a!XP*m)AS-^ukTki&d9JWrUaCY28^AZ|ibu zXQx5t--`#WTYgl0fA4><IX`8!@T|$&{n`D?Lv>fyF8h4<Y-8=Csr4UrG}JrI6s~&5 z{cLfzkBS8I%WH=i6AfQ)TKF)}Z?etQ%PzO(EPK7~fnl`x^5t%AixT^fU&(f|ew$!j zy_IF}xt~+6JPY5$@#fr-$#+(~77^Vk?_zq((BSIB12$~TE84H<cwX4~TrP)CglozR zE5)BS$x|PCy$eV#X(;Fj^O+Z=Rqw|Ad%o{W_Q36tCdH{<t>v-pD_)t*C|u^zlV??M z@^g}fb$5f$ynQyzQ&Rb_ZCf)d!=+)0=Y#{#Ud>Z(UccLS@mhVw0=`!hV}cV7eZDFB zZDn1e;)YGjq$l3>-*|S%<F|`-m-rr#PmXV{J+^$`4hhl6kFwV7&hK7qs1>YqVJ@d{ zz0cdsihKX|Z~k?A-qC|%Q+<^l{lER=`l6?^6~25BDY!LlL)xD;PSd>}hCW}FqO(rb zMoqoqH;ZQM_o`jKhG*Y3m!AuBTo4RGD}o)lZtd#Zb>(m2%HP&|m4X?C^<J*>zwW=N zB&g){f(#kE>#zTLzg6g8-6w0cqj;xW*VOCZ`0Kx~FF&vJV8t)PSFsc0&YrtiZR)Qk zeq^1_{IaEjc~^E_G8X^y<&0hIT<1hfR{dnZ<AI0eV?X7tIJ7wa+Sx-Pzh2yXEciiK zot6DK*Rp>*&!?^8NO(56ID2yRO2>pU=8#`0_a5HU%9+8Mlrg(3@AR}q3=z2-BbsmR zc>c_L`?6r+&iW~C9c+EtrOXSm&dJxT){j5?vaO3@-5o#2tuIn<E@4f0@G)IUdd39H zdFpHucK_{680PwX-0AY%;lVbI8S<8Or`0b<nQSus|G}Lr`i{hu`wM#}%@v6A-96>@ z-41o-i=rP*E_9|$k`i^^8PYy^9fQ<~f@OW7YcJ_(&+AHJ3+CTmfB%)9=H>MFQTKMG zE{O1*?&Wkh@zcHFNAqjKp7A|e+3vN2Ir8%#20x<>=QIm__;T7;KRkcs8vpwXhoXa~ zEayyL_&Mym$~oz0ulvsU&Xs4{lKnc~dh!N|0IT|o>uT3BFWvZWUebXlzup|F_|Gxr zilr2X^=HMpH!t>Qull;o<eiyied5AfR&qBNyw@{Ze`!+fv2VZbc$lmR+E?SeRl=9& zxw&7u+O==}@zt?^Z%HV0>mQd55&5v^F{`gsP~PV?=6iz<uilV+_g!L_6aO5ceV5g_ z8%qw^6|em1vzvi2{`I}D5m5q*nisCjircjI$mMSl=WTfHzizkjJ^$r@=Zu2NmiM3Q zKjf*Zyy6LnT&}VyscMH{ENA3*-#L;EXVv!dWi;eOywHA}7#lM6^tz{oW`=^(Z!Kay zbMSY;%R3vN3T|8)-=J-1{wm5(zS;i3-yfW+D?;qoc)IDZe-Yfdu$Obyvp5!&%~y}Q z3N&d%uC1T5DN6JDtDuIq=BD$F78Q3Iqng`33fI33xX`#Ww2xWZ?DLF_r&<@iT(<}X z6v><2UTd?aqW6UV&9)Ow#h?BZ-fYpjemc~4;R4URZOpT`H#Y0@eVy?{lqDzqs*J^= zXUrZCrY8AZ^2*y6&b%|!oIyPGzUU5@Ntt)#q_qTAI`?h=Tz-95pZAPOSHAe=)@|9K z^<v74HyK;h>xE_KE>%6Sz31H5=f8!{%-LzMV%0(JbRV`!>vWPmf6kGXz4T$mw526M zJzik~Zk=X37;2wsO@7bOv}DIa@h6@S#reycw01G8#dK!~{C+V1U%Sbog1lahmVd=s zftl(DH7k_&g}n?dJKH`#MO{!>LElQSY^6@wuY}WfD)UdZZF*ln@&7JS*7z?|!lv9_ z$eMrDU$d{F@{IE)KZZ_o&%N38hAd5t0Ze-j#vNsB-=%o4?n<@#p{>7PUq2+-CGMEm zGpoMxlaT#XzL!$9ejFd{l&{vVE&23+U$CTL$-)B(dw&0EFnj&|r<=y7kmsx|GVVrs z)j!+j&T1^U_L<RP^NWj?F7<P_{M-3efB77ahAstBm7ac0#zyY94+AD>TiAtsJ})&r zd11%Du#P)Zu1d`D&v5WJV0yke{NL{{#~%Oh<N25z68iF#lF`M#_IG|95LQ_A=2TBq z@HMTr6Qu?U{An`w-crHwO&@QjUe}aORTAC(sJ?KOMD?mQ%hs-sEX;c7+N*iCK5o{@ zr&;X3)T)wx{}1>Zy!F@e<)`wkd=BhP`1$m;mi0Qn2;<4m?-#%PcC|Wc``(2C0{=w{ z{GF;=5BNFvgob=#&6sU?xVFT|?&jMKhM{hvu@`o~>ym3poOgTIVj-KFmY`LEli4%- z#ddh9+}b4maOnqzPhOKU7oIMgb?2Ty!~SFS=QB=h{A#{-|C62t&*MZAKj>!Uatmj* zKP?YqwbA-u^Ws@j?QEgIO<v9qEa!K-S_+-aeYG<}DXQRXvgP%8VH3DM?dd*V(-V?4 zdHM0B*Ro#CXgeGg8a(&fq{UfRnL}5EuU>n6-g4K)S`Xdcr`ydov<O@r$QyQ#@dMw1 z6FiAMXI$z(e6J5&-C4g@-L6SlvYT1)z}hn$bxVq?8fSc6%rtr7yU6-yNB%85F;nRG zWA$@$kKUjABai7x{v4m%ZP_iGKYsVG%YV*Zwe?J{x<Z%tzZjtjM?M*?^w{~*s(VW8 zqRHofJMDa~q;9B|V*hA<chK~poh#H?*S`P%SZrlF_qp$K_223X6IhBSoDG?~wOXq@ zwo>Qj23fDV?LyJU({*MuT>bA}=cW<xKu0L<%>EB|-xn*1*f##W;5T=l#eQ3%X~$18 zaH_9n?`S*H9=UFnE8}O2=@B|&ep&OZSFhabDb{brzUPSld2J2b`&K`tehL|1{T$}L z*nBEy!Ya#cdb7{<uRh4pSidsK);e>mrq7bEYddB?yKR{HgG)}&PjW`ev0b%m-allp zFgHE^=E9{Fo{|OvUQ>S+AIh%`ZhyjXIqu)SJIaX~-!rc)6<TD!UMP8k>&>+>N@?#M z1?R<v9(i-NygBks(W0-D_w-B(?l+s@e0}P>@Z56olvV2|L@Qi06BT!U(Gp!>FaK?K zqd>%*+tN%NZ|6qyFchV+GHqJTbf(O$IQ{s?5QPa=`woA+aG}aWCfcLt#g{AZ#mvsE zD{T0A_cr?q(PP^`dCbU{)z9GgEwQj*)9>FGZkS9wDO#mwCb{FhE6<y|DlD_5%FSwT z$K2VIxViPhucGudsd4rH9zM0Ryw+M2efnYje>Jt`=UO;TwFIx9bAK0=vGdhmE}glV zN;_V}UXT>nZLvg5m)T>n`s%|o3m6YP5;rthv&hQEr}LQbGTnR9l{@dwQ;t3H*IG13 zIILn$fJ?2x&R3SbTm0ne|Aefu`M1OJ)3nf&j<TA|EIgNGtzKQOR+zG+`q`WFe-=#h zIyKc=$DsbR*}`NC6-$j%Q>8;wrF<1XsxGq2%F3I+%dg?3%)M9Da#w3ud^xwAe1F%o z#cFxw@jtH)1lsd828ga$6_{k+7OA1}NRUVO-y-iFauo&teIksTK2J^P;5E<ja?xDT z##E4y%@lZjlclq*l|_ZC^6B1~u*-|Lb!{luH+t5?B4Jdoa4@Ls?8UZ@neT3vt!1-T zyZ-&lQ?K5|*_)OsFa|0aJThpj{?5d-*zJAF*Gb;9n{D~8Ev{CZ#`X8CxBf~$k24yl z-aj<IQ2lQ2p((T5UwvOX>A%>|lb36|{~W2$mh0n={3)oq_(-c1zbNa`1_qXd-vL)A zpIW?pMTPAh_rGgDKIf`mS)|i(&12f+j;(!63(E{*8~T_2(!M#dV{`2?0mUm(`_DUt zaBteHdhy<WvA16}F8&ONeythht<GIhR4(||?9A2fd()RXSxLTr+xd-+<E_cGSI2J$ zANBZmvvlIW2Px66Hzz(nRQRK9_xB8qsXy!392gk+1N+u3;P6^(7jW`hTXX%kl}i-Y zR!vGOXWwltZ_ll^&-?J)cjDblnv4P-Kb@bilD7TfF=hL~Id9f~>027wxLkg#{_enM z&wdK--Es72L~vC@=^ZbXYf@ih<{yxGn{X~(YI)+i%4zAXdk$p9yCqC@xAxGrD?7GZ zZxwfOw$$=RR<*}=$9;REbw}CauGLfX&-Hxa0#j~Yl$)%y;JuV&GJ}ZC-Hj!=uPRI< zA0-~z`}FNZ2?iB^yRviN^4`38FLwUhyBCw?*lzJZuineR+4LlhZPPREl(Q9rtmVHS z|2y;gukzlbiQ(Kz+Z}`46)wuXp67qa;C@<>Y?Z01X6SU82SIz?-^gjNC^F#XSjzVJ zVTjSB`ZZz_iD&qP=RH)(G5)wV!1t8<$Aj|}8WJBx|KhpZ^G*NUccVp-o&Q?au0DDu z=Cg3T<dd2Y+VeBcrFN~#Q$MtD$x`LlbK|F+oP0Fn>Ya;G0rRwN)aE3L3eGEid-Qb3 zYndFQl>$#RCifMK?yS0-8PS(x>=?SWo9Duo9ar`*`|9Ub|NHVi8`0yj@0Z?s-x;p5 zZ~mvf>id<xZau%_>oRFQ`yiP!9fbmZ!g;eE?wT+$HuP@F;^JfbtM?tz@LK-!orl)L zUx#Aj-Rc#7UFd$xzq8b%&$zO!@ky&OU((s9@%-<NbRCqJ^|mN``kFhfoFrx}pko}@ z_q*TgWPq9^Xa5iWvdDU^ukBam3s*%g`Z6=`vG?&~MrTbG6?ooO91;0^)WwZq?bfsR zDzrr3=bqce@2f7`dHbDmb?)Y^)j4a*OHFm3H(EPhx_ULQ@c*(oGWTLzPZ*zk+4PC$ zXuu<{xS5}xIW;JG?d4LgbNI8e+-aTWYWrLF@5@hHy|D6=$@@tT{?C7%Y_IP>94{K2 z`Tx{@)7SH#%(ZzN%(&ElBG=DC)g?!s9cGzwmf?_Y*dKmJ4*z$5FRI^rnD)5%rO}~k z&A{fDuV*$t{>z!RV(n**%PYC+vrp`Kzm{={dR;?&5LeN8jitg$iSJHzueUmq9N=2c z`26&7-`Lb1$;ipGoh?H+m#?z@_OAT4S-p(!Bjs5~GaNcBmYu7tVJLM8?hkP^581t@ z!J_xSxkaaZ=sK~tx~VSJXFI0+x;?31`|0ktKW{U0I$u$Ll@&O3pLN}ZsOnYT)2GeS zdGYy@S9+88%T1>p>pt);UVcXBRP)n^8|3(3s7;ccJ*S{W=j{dA*#8a<ug<JF+q=g2 z>d6-2`feAdDx0L4Q`b(rX`Xr^VC}4vu5Lc_E<0IC*og3}Uj9(c6;l3WW4K3#z{FKG z4P0|(?{H3zDfgM2&mnSnQNYUm`hqKME#wO)O<cGmZ3+KTPrao}7i|^4qSo{)!>Km! zeVb6BhrzSJmG#HlS*K=cm2<})-#krS@c8XJ=dF!PPZie(zw<g8{?aa5_1?VdM`pqr zy7QG(j@>Go8~A9qEXU@)BROmNmtML1(PILKD1Ypd?pw3Y-`Trm?MAB?Gj4J=nx5;J zWn~g0J7?YZBa>#nc%a2Q=f%BQ=Vok-m3h+Ro+Em^$n31^m7;r35~lOL%1-O8(6wLe z-!DBUGwV>nsSDP3C(GAMy;*x^#+<CDiNUvHR$SQ@bhW|$?XIP9x5Nw&1@<yLpJpr9 zt9RyBl2fikSn|%KtqW&O+m)~Q#Vl*tCy5#Us$XjStt4K*yeY$yV!KkXbV7k~3xmn* zH_|Umzif;#5W0|*RM;w$t0=#Uf2Pla7~7Be9~R8snA?8f=d+tO!WQr6_tb9}jCuYp z{qEcqyz&3$y%Dn7aVypS<Fc~jSML=cZm*3p*phy>)v#rsO(L5)+ouT{?<M4&8#TB$ zez%PhnV{5t^wi=i#Z-$EiZjphwKE5PeI-|>lf*LpeJMlL=4s0$r^>KTUUTdFui4wB z3>GcDbk5pt;c){4nZid)Yh2GJsmZX^*8g4hJ%5pa&&%?=^3ykGAMVt;$1y*2+Ei~> zfBrX8Cl~KF?krnVICtff<Nd$dl|80E-&VF!*5iPG+FhHSJg>KUe#rWKxZ?@)4y}2; z{9&g$6BOmoudjZV;j|}*$FTS`%hhdDE8ZX7EVb3*RcFZ>f7_D!z1O7gZ!cdm?bX`8 zM9Z62^@3g!I@8iOFlM?O&rS|oQ@&tRe(pMxRcw0ks}?OwTeB=6dEG9z=F`*qTD>m+ zzMsD^EqV&im$*31{i`J}cbUg*t=Cx69}+e{z{ob^+_RkSn2a;)%1V1e7joBxWL%6} zu_rL$*;f8soka_RWS#q7r$pHAjGnxDqcP{9du?`tqOA3IHB9G+mGVuPxOK<Ly{&l@ z$~mT;y1UCJ@71m7MfVgLW83#^|Jq|HCs_St){?5pj~d_KDGyd#t-5uC<O7Bk)3~gz zO}g#<(<Sk=tcp|a5%!6;0<6NtQR_S^CMmpAePB}bF)pPghPx_bQGjfeG{dTyQ5s&R zAB8v>E{9m}Ut;(~rQYz)_4%()7A*MQR`C4XqXMoXN%iHK*KR#}kbkVmYVolIh50@r zTjw40S}%4hhG%)u)k9jc0#W;&n{v8OojpI(=ESPMS^FdudJgfmR4ka8s@ON(-*3h0 zZ&UcMai3*$F)3M9=(U*dAcK*chIh}~H8ua3cRFTooaX=Jx7)8RU%V6F*3Vk&oUrtb zY3~)O<BsYxzibtB{?YN^$)CgGDyq{9)f3at-;uPl>|_mcoV0u8Ia|wRwI&za?-l$~ zZ~efRnj5XX?9{q&_utEQ+&<g1P5f7g>7*yuc5oj2IEU*B&x<Yb%*~T@UTDe*nun-_ z9xHvcq2pnIP=Xe-fiKGeo}>b`gm#nqbr<W34u8JPQ`MNh`QbyGY(6#tj%gRVS`Ht4 zRA6|^e7kke!IxgsEcZ4}vNg=vw$FXCJg;Qd9gi>Wi&YQLyUH{7hDk=s;)grtI^?-I zCx&jnC)(8{Hs|ybqh!w5J)V90bq>E+^}5OAV*DDm>TaHfMY%$c-j>$6+cBt5S#=;c zOuT+a=%TE9hfkh-aHs3^+2=FPPrqvO(;=aC(qc=w%^@y4@%t<t4$ao*XJ%R`)&Fsy zHm4n<&B}>S9~UMWIh$^~Gv(o#Wiw}Q6X?!j@fF(twnn_|Lg&^G%!d0)84r7$xN3H? zN4mFavG6+;HbX79Bev($jr8;uZ(JcB^lDebY1hli4E07Kg$0_HX-!KN6JE^9eZ=N$ zu%qs@RjBXkS1&H9?6GsYYhlk)Y_vVA_yWVaN0-hDI=Cpwxq7|}N?!WF;)iT<u%%+{ z$6B4KtSz<68a61Vs&`5ln#at#Q2S|niuSuRQwlk?XKQQnE@JX`>5ktRc-=fsFkEw0 zSWo);NJV?^)xq_*S+*}oFtU}pU69(u;`!(l@5YXUEN$~j=XKAw6u0-i_$$KY)tn<1 zE|&d8`hA`;Rm=ISABSpiTl>WxQoUNTaKY?<YEOz*=l{02Rp!gVXv)3CEpyM!Ugam- zR5xs~*|)uU$%(VxD~b%7gvGy4nHxNT<@({TS6I@QDhOV+oqvrxqQ3h@l&;j=%;0r% zWMk9kmGc^KZr@}1_1EgBbF7W^^sO(qw8TqZnVtFER@-kL)A96KOYY2_xi<a~KS!vZ z_}-f$mY2`i{J!%=Zhqy4b2c%{{huaw2RM~l&Rl=@mTf>$kI-_S<$7E~wW}&#HS99} zcYjxUO>yiDq5O0Ah3rbtEtWY}ug+_;aN@<<m6zM(qW|4`VY{)dhGG9QA8r|57wcU~ zo(ovHr-;qVJ3IMJmEybrzh8`A%f$OnwwDTBJzl-S?fLd6PSVSBy%sHO{k-_#KNh<i zP2x>4SLST{mvfxo-TlTE&fAOcMDD9dJm#>>sc(j>tyf6#372n+!d{DYg=`jl*eF|X zFCl68yUG1~<wf=E6Vq!lPQUxJ=69a)<a-`fPvQ?f^E_2_W=da_|Cwit?5lQon%M6Z zII(`F@yxa@>34GXdAhsT?O6OZeah*ts<ZNKIXZ(3s{T1~{C6tZa9<&Fop5p5!$+y@ z?#|*dGyPU6E87dKSGXnR%B64fQNj5lf4=Qk?)nP*RcpjP@F|si<GJ9z+=@r<owMv` z-)pg4#*q;oVqF~FhNVwL<Yv^o{Pa#p!Nm9KVe_mrbD}5n>-bpTajwv0<ln|((~y5r z=g77BzWY)t%k3Qwyx9GzX+nSL<QF!+J^%EU9Ol;CWxQy9jl%((>+=MA^?c(>`b?&t zt6?~o{cdypxtb3T!*}lgxcbYfU&{p-ZmIscbaKJ`S4v`0+qcLaaoOK}Lu28$FUJD% z?(#hC$x70QQ>ohYKEp(c;l=&Ee<pcWFn*kHd)HC-b#H1es${ybOkJpWd~tW3XVmTY zpB9yIT)DjP`??bkINOZxT(V&P^Dy#dJ(~o7SJDT)?#(Y|<)%NcXT5#RMe_NYKTYM; z6D|cZzMRrvlD=ckZ1MAFcip|);NS7`#k-ly4<1jy+<3M5<rf~Cij>1Ue^{PwecY;b zups1R(?+!f5us(;mDg|oIZ!HIBNg%Y%$aw##w)jQAH8|=Wxu)1O#$A;{D&=nW(EJ; zXnl>7aqdEo7c3gNi}c*@y3S~*Pw!(keK$LGN`aWmq2v96N$gDa&t@IFI#-{YsX%Ji zYnw%?TPNFGD16Pkz`EUrKO_HjsnJ_cVGBzc4x5kC(?Yj@FK%+|-n{j@gosFQ_o;~f zT_u?vMX&b!v6<>^d8FM!FKb)ud<OaaN84p*tGmnE%ZQquy(h)myTX6Zxx$X%+x1fu zK15Hx$)C5qVdH`+ZKur7-jscLtkCv?&zGgr^JA)au9RM<<IK1E8T00zXd(8_*sbby zx=X}EOJB^JZWWS{@U}OVb??2$(kwlTla7b_-E4?0xaQX=e6DB4@}~Ny@0L4B?7Q=J z=H06suYL7zJS=Q4`r+m~uJ;$0nw0K3qRp`4cm12a&#ag3e34LDsHrG=TU5#Q!F9>4 zO5L-x?*4joFtEA!ao6=;E}xdjjcE@aHeCJ{@jBV9l>O=1U5)&WUME)PT+Prq@paMu zlHfB+XA)FuuQPHxs9$qB9FQB#ymq~lLFCm2LG#Zw-;T)SeR#Tmhs@U&o6|R^irng) z?>Fnd>e^4N^*n)YaV<xdX4k9Qn;d3~=-q1OK6RG(y{pa~s!Y!1u^B;{KhIv*y`bCv zvN`ieiDx@Md(Mm&&SIn0E4Ll}d0{r+Y!T=7`z9);=BuX7Hi(YTtv$;3kbCVhsZ(jk z)?PcltH4IlR?lzta;EvQ-MeR&f1U7Xm5$=KeLLTjCSQ2?XV3Qfr$!4WIA}i&3t3e9 zwA4>PK1aFq>9YmR?N2onW*w<G+_ZR;g7^K}iGC)p9vUCG^&*8){HL3^o9f#h4WWG} zT{Ip&zM%TZPImf|np5S4AA&_)j%=N+t#GAbdW2QP*Gm5RzvoRC>`kAy{k-$DTWzdu zc@hiwJ#wa%ipp<1YM2#os$O3tXVxBH-umYDhW68MmT(FiWS)-vEMArzmQZ}?5Igg| zm6G;~^PSyqE|U?+&N|<>YWFg$rqYlqhESVD_u6w!e!mKmKVMp@*K2>)Jy7gjMZ;#V zxR6KZvh^1Uyb|NQcxJ_~-S>s8W+fI*4c_%}Ud<Jg#Xs4fX*|uE(|LUV-@7aO>v@%D z)gQEJpZ`KTUT2+Q&&sAg-@OK^>n=EXUp4c|W|-oazhMRAiLdteMIM@XRHpoPwsJRE z@%4&oT$cSR(chNhZaIlp#O5>U-@K+@$h`2B+Eb^->9NtLLLQ~|{m@oayr{f)iF47B zCH>L2#U1(9{nx&DdE%a>XP!S&dANRNK>C*Yg$*o{7q9HAE{j~T>B1eWhOM6!mo3`5 zZ00FHwJQr|&G7kt?#!v<4_jxgx+Zq$)5kYw4&I)m%(A)C_p|*+a~EZmEwAtG=_-?O z^fmvt=j;Ced*%f)9yVLG@?u2d*;xe@XJ_5}5^+iYviYG8PG*;$PxtJ58#_H}$(Fz? z;on~W6WtektNw87wd@<8<3%e@rajX5Ae8m{)sv;y>zpT<9d&JCIuxrdw9TY>;={y^ zQavqa=M=o=JhZ51OW1?bwek1LW$rJzsr7Snbl$tjxy-VMOH%a%L%ZH*Y-NaA-(0%r zuH(f#=Za}&vAwSky_(VYu5Q6?!A0IHD|RWzJ)e>q>ebBo{g(ay`kjx%J}vd=V%v5l zXw}r`&*l5Be}BIxCo9-L#&zC}ZH2We7sX@cl`cM==Tm8C6i`*Nd_u1JA~zE`yQGh@ z$rC*!=5@64?%sGbO`zhzi&wGy?{9@koe=#xFXq#WW0td5b@o2{**m*Ct={eI_bK~I zQU%-|KRm?R{nPuvy@~P0kB>g9Kb-$ja612Mj>mOYO%r^MK0kWAe9@EpDFP<@zm*<u ztd9QPx&M5|-M;l6t7q*h>UpWq{Alw#`Bsgo!tzbWIYM8ZN=x1U!DCm#>9&_szIb?f z@N9Fgt<CY24Ug^#^S4zvH2bNbd~MJfA#Ho5Q^NP}`eo?G{+%hMTE4n3GizqXPW^gY z3rqVc$yXFwq(7~j$`yKg;=W@}^#>Q7dGbZMIjmySl#+&J=lXeOpZDZW@AjGF(6VAf z^~sQ}POh&d@BRMOe(wGpd5*=Q20VxNW-rwi-}Clsb^9+hCXqJ@Gll-R3n@NseSTM9 zcJTc8=6yfIMZ^DD&3(J~#Re;J>HYbqj5xQ|Db&}x_}5HtX;q)}_E(1+)2?jui8tPz ziBn6<w~68IH~Le3tx7*}anhxI;_?}pKiGdL@0%**RG2#P)X85PRT-`^mDuhqpZ~-9 zPLJeu{S8WgnfA(v)m1TGeauw%uDR@y>-UN4vv2-gHd`^=Uykp_@pb<ByS2_doZRS; zt;`?4cj@zA^~q%qE@e+<m*d!MfA3orcgXDvj1f;RwJzz63UapI`O#xSbKWg2UYp-d zEno7)KI8~}xMEebc*~<7Muo@s-Oj1z_nco`KCe`@dd-yc`R1pU*4r(LD_qGP<F_MO z??`3#;>QQnD{B-5wbN8OR&-vQn;t*m&J>G^<!TKkr3tf=*`(`tv&=|}<1#2WZAxn> zX1IHF=BMNu78zGjgHL^HGz7NXKFBI~=zHh<od>Jd@obRa&$vHy)1s6eo87E3RaB;b zHNQFcXw&&m#-1nk_hgG5zxMxQuvg9HwcEdPGhR8Jr)!vZDSXc%U(JiP&*B}nEY*6j zUcxnN-=kG?)NhAy^9iJ7i`8$rckGIN)G9|iSKbXF-;OjTmRx`MBm0+qnU8|TXD>lJ zp7`)>Ct~%dzvmXPa({8;*6FLMH)3zczCW~8rQoAW+;!I4cYUw_Pn^rb`?lk3T6LAh z_GC7@>HY7nA7<>G6#b?{_(c`V($;%l7kj=}{Bl>i=LLhK_7@qy)^HKeWxO%X^&b=O zavl*Vzc0Oonele5MDK}q0WFK0JD%E3yR_$0i~k{Y*05hketEO;PMM}E{;jWU@7wj) zI7|LK(e>V)F4a5p^U?dOwS$$Peto_Aaq`u#^*1UXzxh&my7%VImz^b5H9z+he*C^C zwezo^b&-DChb3lyD>tu}`}yusXXd8%CsX1+*5_&ITrX^Y+!3xk`Qe6YL1mXPPrZeL z2X-@bp1Q{!|5NMY8ik+F>z6Xl{qwfHX%2%eQ^uBet^Zl&1!5*_uZqr`df>Jw>r+3^ zGcWtKAD?n-?A^MRY0(m?+;>m61$~)0O}(vB@<&bex_r~DZD)&O-R`|q-mQ0E)?=0P z^)=VJLb%)Ndp|$_wZhKQYR;=pMbCEg_4<8+A>ZwGPnaJOeQSr+vbS@mvbM0VNWOIO zYW?>2|CA?g+L}5sRABDm#U{Hf<hO4;_WI@7o(O$TmHb<Ko<{M+Y0ZDLQJ}|Lw6$Wl z>BYs22QP2qoM&urY$n0}^6*=3ZuP%aw;$@x<q?@zaHrwqw%UvJPn`o^bTNOas)(=s zd+%w{{>6H4q*guo9hR$pxb@bdd$P;#9ST3EKX>~+%Z<Bcp3U@LyR!6lc<+(NUw>)+ zti8O3RbMJ@vTV0R`)5bv!q;V63pYIfBE5G1zM8w&Ru?_3y~_AlAjfi3-M0;kpWa=+ zo7d)L<=>7;LdC9=r!0E*@~g=F`l(hcm`<Nweb&)Lfw5NXq7T#Tck$PMnMx$wx^%gL zJ%MjqK=5;(bJc&ZU0bXt8@}uFyv|=USNwltc`jgQbimx#u0Iz92^g<3U&FYqP`;#4 zXMzk@m5jX{f6-Ovnh$bf29}FLj2K(bpYpMJB&@L`M0mgYvm?U1Sw#n|A5{I=_bje{ ztw^8n12xt7NizgC-AcT(dWq`Z;_n&rE*k4Bf2|S5@$t=*uLTm%Le4HJxE?E!Hb?R2 z&GQbM4{7YvU#+#}-^#BR{LNk=J?s8RI~bfvWav7TnR~>>w<BW-zwpG4?dukI=n1>$ zG_9N)Ww}9Pa&BITZ{*KY`xCFM-Sc&aN2J27R;7BLlC6dcw>)mh9b5h?sB8NFzf(^9 zo42EHZqNToo8vXyTAJqR+7}mIzxz|}RZ*tNrkkt7Y}1PyozMKtDti>izVMR0g=Ms~ z#Dn;MNeAK@UL1<p7jQF5Dz(3EAvaT|^X9*IQ*^YJ8vNX^{Ibf$gD=^7xeN1j-@B~~ zzO3=}{w{Wjr{2N*h;GTe{l{A!j_z&b<8c<wRy)1;RdW26x9jVU-q>)MS>Zvo&OceZ zXIWdNHBbJp`L7Z>)jM$8v;SqwA57crbUp6wPf@?=Gqcp>9$9T<?i1v=xiCd%bL-2) zoV!0ONSJ+1C{l`f@p3)SeF^c#+=nKPCI>E5Z2Iu8I=|+#>UWle`X$@9|DL#xUo>v# zr`La{${D?0d$^iKb#L6vob`v(9;%#tclccAFFo#@<z+9+x&wbUG2gnBb+{+urQ5po z6J^%$h*x!46|XQ;4Z55)^T&&__j$obt3NH<_0>q0^S$@?9?O*>DGTp&Jw1H!Wa>f9 zX6YwuC(1^OPk$e}uX*;=AnSK(^+Ea4`n!0J<(l8`i}y9&T*qzN##Uk_(fj?$^}M|L z&eVcqmU~nsrEYIbR>*xX)58>X?xOF>3okBhbNt_SI`cQH+rDKyTBVMhYVMDWq`U-c z-@n_r<3q-JnZ12pOVtifJrI8D>FFOHX@5gZl0-H=ZT;!At>28@TjSQ9y%#ljz8tH6 z{ci6uq1c_q9oyMcuj&1W%KMk#v6VSkxGz-K|I1Tx{?}y}R&}lK?!ESz*=MV+@6<m| zosZ26+9kG|o(emtFZMj#KeOwJ`2U9=gKHZi_sIxPuRX&0&)#H}rlyhA+WonIa}6{& z=6ZG9o_*Lqe?$J}(6dIS3G#dfE3+4G>YjH-x!&y&`>7d4of4f_AMdGFvFd6*=doq? zTf;Nw0$KgP9w<Ip6Xcq7;aQfg?a!dH;ER$gS4}*5ibb&5?d!~i863J+CY|S{<Q_cw zrx9QIapwE<6{QFNWQHE#-(+mvyeqlySkDx`l{tI2pYP&7e_Ki=v3<|w+ZlI%EQ#K` zGohd=`+KxreOeQfvAsxk^4tSwDpc=&OnO~%eyKHI;O!k!sS_u&$yGiM`8{Rj%V%%D zN3Lx7{O9)C1)MCQcj`Yrx^wGj_xHuKYkq&`UM*%GyT?9(ZSC#(?^S}XF>mi|YW(}b z^r{(Od%y~1UT@`|MO@uCU6girh-fZc`(L&{T|75-^PQlFr(HDb@5W7;Xg}%OgV&<Y zo*J%(?Zq!=tX(+gaQd8y7oL8%tbN8Q{%S{ET*~TIcWsv+DgQC;{ddjV-@<pUYndW< zu}n*9%awQAK0jTt-#^H@{7zW2_II|Y%X2nt&a>BCzG3aA{bl9u@3Yqji&USC{wTP| zc}t*>a_AfG4$C*kBZ5umE#R!I57qe^erl3;*W4iSpB0<aR<4!*^Rn%?f_vwK?f0{5 z*+VmHWYbEXE@r%=aO+=7bGgN;WAAt8X5Fpr*=%sH+}`N)6OoW3qQ|fJx2r6CvQ$qi zxBMB;(s#$EZCqq6?sYckr;6A)^BrueFPKA*UMr8f|2WY}@%!(o^H*JHd>~Q&Zhw4z z7iY!)+I1O4_t&alnR?Lgwo}~yDHojmwKG$_w%A^go{}4!pMFvQ*SlxTdB<#Z?KL_# z+Z=ixA$9rdwf)<oJU9;4xp5X+L|QhoEU28;eszK8P3?G>mClkpiVVdjeo^+Be>r{x z+fQ13wsqgiH-Yzb7uZ)NuE^f1Iqy*Ww(_3IMfLTO!uvm+zx?Zi{<TFLc&GnU*AmU1 z{hF^$W8sZoM{CcU@5m~OsDCa~Vb5{bK7Hp)`=57CaRwwlni4g?{(imp+K7<cW!v_h z-tlAU`a7FiBOT*z#WWQEiDBnFwDn#2|C-a+{-4;rPV80TM!Tw*N@c~TykcJ~oe$1! z%`Np`{H*fluX-DK`A)XT4^xl-&u^7tTbpy^<7rz_-cs!~y}GqUv5Ik(ZhpL~lfR$w z3kZ3v)ile-YMWZZ#2cT!94tBz;=K8~+T9sd`)f7r({(a}Iq&(2K7MuBnlU$4uwgQ< zr>0L-<<W)qM<NYgna<I(QC{DwX&$ip&CjdbdfjAXE*pfZT>MqPd$Q;HLfZ|$b~!2d zMWmd)ad8RPgY3t0nc0tbOyThN{jRz2<&QTz1#BXv#ZQK*O<vD=Bflb@<I3FYHyMt7 zOWS9D>wlB^jmGf3etZ9fPRuKnVeE*jo_B5XwQF&+I1AX`nep{Jm-ErsXZJ3V@#2Zg zmyiEkw4htVU-<cU4b#F~+41#Ho2Q;O-7eX2Y+IV)W2UxQIiD@rcTX)~aVR#LewOv{ z#0PWurC)Gq?XJzTT4loGJ7d<00#D(8$uqLFAI;M{wusM<W83G@8~?WiT)*{XB}474 z{~H?0jx62(^&`WhdXetjg!y`A2ie8?ZDZH0OS%1_?CldX&Wdo}TU`Ix%Zk^m)u>;| z+0b3YyYrQArl5f3lXH8oXa99P78y`cZ15v(iDcKiqdUzT!e`DodhP9%$G^_ay|U?r z-}j>F_R;%V$~_{Tzo?6D74)xCZmIE$R$OwpRDYS+JAoI~BCnf{)^)s0U@2U`qo%$2 zdPGQ8g6_$fi!C16n{@L!rak*xDH(Dp$Y0`Oy}<4@O7kMkr`X@Tu&3F3)v}e^@<mM% z(Un&?AF#$5i=TXRR{OqD$CkT?^24Qa%hok)ax*Cn=<$zuClz>!W8JP_qWfhF=kAX& z)phpby`u1Glc`*R0>|D77guJy=YGWfZEl$OXA{R<UthZ`Gp1bKC@WSPYWBf&CAWFB z`U+L;P0aP$_m8h}xGc`nB+|-h`FO9>qC0C;rp#Hec=DlWZG(K%SI*5>gS0Z4g+1PX zTK?Ye))A+9>P2gwwEk%SByg%)@QJ}x{+-n;!sYgUcAQvmxWQ((iQUfP!Yx&tEC~&~ zJo)x(9*TWlc$iOsW81z9zgqXWMcn<R%J}?)^M}Q!^{lJP@6_*n`X_XyL;a?jqqcir z>6SYS9IpNT=E|1UaXHDar?1s_xUiSSSNK}U@1tE#yMA3>@57;4x+CVy4Tp1=dW+Pf zRHya({<N*odhjubF=K=NWQ&67ozY=-S^K_lnciI-_wkakQ%!qIpR3%C80qU<R>$Ws zb13XCj0<UFt(`g9BL41-dWn_a(u32FR-OzG<JuOMHp#<lvAM@4<+Bf7EjhFAz||j; z7ysqoUUyREo6n!K3%xrp?#e4HtavraxnSatHS$(p-n>4yxcuCC`|{6{y9@vEaQpr_ zyR<!E{k-zSy{Dan+xfQcyT0$&8MjY&N?*_0{Zr&l_|#no{=RT<ENP#!+Irr<*!r|S zjme(-^*<hov?{#$S6Hy>qi?+GvBSsj@2&XQ8{hh`bvcvGuUW6Z=f1VBxEvl3|MTtc zzWDvYF;3?%XkPHsc+IjUd)CwC%(?C6zVogum{7GiS#RRg^BlXZbNg~<_^0OGm@@OV zV0hJ%jUVTq%G{7qm$1S>GWh(BPH~0qx%+E!>fe6(Q`f$8`rp6N>D#vaTbn<FN%l;) zvZ(A*?Q04TZf~#Qdb}%OcgSZU&tRU@ArFHa9kQF3=>B-_SP&H-aQW3s(};Dd&etA9 zx1`!yJejn#_n<;eP?*Z<hGhyjFNl2oVOk>`e|w`#>2(FihVY%DHQEv-ylMZBw?6Dx z;ZU^Ec<=rC_q$_$-aU}twRdqw?S;3;0`yjPmVfNXsCjC-k8d^)=iHKiC#`bot92ep zCr|!5YrpfmjBU58lNlP$z1y+&U7qceyq<?!AH465=GR;i(Zy=tI=}1ZW$hnsYN@4P z?$=7#&h$Th)^6g84#~SeOcP~Zmaq8HK1c9dKa1f1j~D%GUp=T_==>qM@UN`z<$cYc z)YRK5{+*xy>&n7r_EeGmpQfLBzHp($C9fBKZznId_<!Txs_suNoQKvwIKHmW=-|Q0 zn_rpcCz;<0?8<UF@!Ivi)*`W%19zrPPYs%#|AlesilqDT#uu))t*vF(aX2&GELZEP z;K4&ToJy1IoA@Ri+wU6q#dt#f=7_N8%JQ2O;%{zQIf=cS@1Cr8UjT!5(DN^y_7k-q z@^guotXI2s=SM~u^UCJe{9+kX)P(XB6vA$4u3?E6);|4x;|%BTO;foJMlGJd=I}M^ zhfFd7x`#fljepbXUl;4_@SvwqK>XJA`1xn+zP&vW$P=;lD<4A(x7x#n=N~^`AXV?M z<H<CEnD0CeCJ(LElx!Y5sMK6mJa9mN|Ak$QcIt}@{Qty1{rn`a@#~C9!WX`&9p2XU zMC48Txr&=|lY{Ml{Sj>9->QG_rlhgb@fms!hr54@uKl`HY3{XupBwko*Q|1gyZFfV zlwcM6O6_GC8x^9?EK}-R?)xf>&CiTEcKdtFz4c4i9sBsbPI+y;^<O8(r?u)9d+u(P z{>X2=uYcwI=0y=DstdmdzMhr6#G>NG1QqcgvfWDlMKwt`8yBolRLk0s%A0F-G)C*O zn@iQs=mXRA<*ZzCX2+DTb^I5)$HVSH*rJuo4?4uIuD-c^O0LJhON%BQld)2HxZ_#> z6{UENrq4$<)knLF^8~Ry-qhCd+$A_;_qOX!z4kM;W?hfFad?L>pRCb`=Zl)yE*~rx zP>|=SGI?K?czjRv$?`XxxqoYP?|swDe;r-C%6YqM@4}<i_sr`4Ow)eO8@%15;o{cw zRq3zIzcabJ<)`<ht<RTxmQ#0DF*;Z`N$Cv#+g~DC9tU&Z$6c(y_cm|IR?XYNdt!^l zw-^7uuvSV{pEueeT_}9d3bXxrpN@vBq%A4Qlq?R9|GMXST<KStJ9(KrXH75e-P?9? zcla`sv{|AzEUipTc3s};6H#FK@5)_8_te=Btaki7K688J+VTY#r`)fu)GD)<lGanc z)hZY+?(})Fb;+^7yYfZ*H`m|&to3io3$wX<k5(3@uH)~CewUOz`}S!U*9#Iecb}|W zvFX_Ey^p8WJ*x8g@xf$idAY|U8@b8LSAE{mpr*L)YSQll8OFmp)1*_so2)jCi0{o~ zWc+?U_4C1Ism?fyNh%EY!l!2by5u1lW>BnSIi)Y!>ge;eOSk#Cee3oAbXwbdVSSl< z(S_;{cPbB=EStJL_g;nf#+%C*OxQ1Kr2QsQQB`q=mr0INRo%XSf(h?dxF}8CC9z*( zW@%VebIXCL9=cO6?f-Ej<h5Xqt<cucyGvr`{Z*C9{JZ|z?%X4Xwb!${I(jxgyxqj6 zK6TBL=$8V;Kf~J3{963*^8HEfxtDWi{hD!SZhg%@-^_=8^Vc1+->ve+Of<ANWBZPj zui|>LQ){gZ9nv0dubZEgc=hgVE|p2!IIqSU>&T1pboW@v|F&4jxAgt*6~~%>oSeEk zLHkhHkF{CF7pMMjZBba$Zo92@SzPPX>yIX`i))=a<w&#&gHV3nnZENazwiEAcs%35 z?Mb-@7RN8zRe$b*qS{QCtH~N}4EcLoH&`g!D@tVOR>>Uxyih{G<w@Yd_sf^^E_|?! zG57h?cau+9Yff2Em!-33|AHs_F`MhozPo9CPwr64Pg(OGU;b3RiqPCz2BD+j4?gev zrd6Ae^WgkFx#X}<JH>P3y4dfReeGj-bok?s2iN0e-rwBz^_h8Uy^fg0p0}6MXFgqe zHhk}{(l4_1{S7z2Z?x`WHWr?~ch{Zvht+&{MN7l)Z*C3wy2D66?YGN~?*SkEyQez* z{9Vhrq5Aofy{BVq=jrb1-*z?q$JtWp*Rw-J*4$X~dgV!>$ty2aDGQuzKizV(di&d1 zPgXffE_FyOy59O!P*l#k>bHYq{o;_@+icI2hz6QQWc)Vk{ie!w=j57Q%VylGxclpE zxs{cYJM+6c`;ycCy1mOZ+o!#t-seK!-b=>CyWA&!F1=KmXPYVd&4&H<!ZUKbpC219 z@n4hww<P|RU)a;B-+8BGJ+!`D9qgfWI{C^hy<FzUyPhP~TdpcR6*6~H#?E@f%DIg7 z!pb*4Ts(NGcWO}7v(@~(^UQawykLJ>V$~~?gjYva@T|G0dGz?TKH;#r&nC>Q6YPJ` zd;Ie3U+Hd-Iaa0hocogRCBI)#x#p!*p!1Wpx5b~We?4DjvCi%3Yu;qY?0NC%<iy5T zK9@?Ctqv{tSg_H$%l1@9kKc<@Q>6=Pm*Z9~44$*NUU;5-f%WmZU;6f)e6+0Uk8<DV z4{uF;^J{0PzOKrDIM4g7igLwW?ZXel<F4;>*l5!8|9hEr&i>cicm3OZedac)(93`M z>y#{42Y;J7z1>Owzt?Z4c}F##-8la-`jnjE@oi6IPwwAb`pNxd>*AYJW7aV5nB`IO z?ud1}<owK{Ls7db>(>}YaX)&KVPP2P&~;$P#Oqucy6YbvJosiE$D+F_ZJduH7v7sL zGo#~p*_C7F8`k~Ywaq9>?uIN+?k=STT~-V}+Vi$&y}tD84y#qms_+?)pItK)^JnPr zn)71e&tD%teEHB&_3O`9ll%>`^?Ig!Nim;RE-<$jUg%dR@PAIW(ws!4`qK9-`)8c- z-*WfLm&UZ*gDf5OmKnEY8tOJol)5gNBkl3{eC2EJJ?Vc{{Fi+V-+$vtfwheL)~&xM zRd`76d98a}Z<grV_0|*Hdw<BPKHWCY*LrTO#|hV!KT4c+|LkCxspzmo<soBCI=kfN zH#2`sUBNDUOr~0^a?0mZ?F<Sxckh?4-=DX7t-Rs13+z9<PKL>++AQP$w0QPI*?jXg zb;sXU%9TAZpL%+Vw(ITVeL20}v$RXPHyvJg_U6~klh~L3whLeM{nM%L&@8)`t6#s8 zo4#Xame-=mGfKW+xx{yOWoS*H^CPV*0)N9e*_cDD79D!$I7y{}r_n_t@sZcnx9?t; z89H>-8?k)wstWB`y>)Nv*4_GvyC)j#D^y-SCt-!zeC|CB5)BJ~MNJLm7E^55`}pnL z)7pKzo(6eOf68>cPw67V<kQnv#;GofVVdS+eeqX--zk~vb02JQJ}3M#`?1$rxv&j# zWs@~36z3!zJIrUWbon!Pd#?^Jj+VmzuHtY1ugsFtsySZY@P0*)(~Q4=(!ZqJf47-x zam01+#xkBM^;@DXy7Y1<yTn}Bm9{+S>II((p^xlOSw*uh4h`T9{<@mw>E75&Q7kG; z?mn8JKk2I9)Cap-)OXyO-cj>X=hf-FeLKFa-lkAe?5>jSo&R*FPR8-wOV#|tg6lLF zNKQ9&$@{--SIdUHha2m4&F3p^^7Z}AB>8L6;;vi!1Twv|fAH`75jyMKga^Fyo_LgY zuiI%^_CI#HS5{q%%<sALOBM3HGCqAQelA-f9WBoB=i~Zwa_c$z%FeA}UbppSxy_gP z9WU;`-S9P?+wsric)PhBbr<Weimc6_W@di(?f;#(?aZtG6@;C*QmpvyO+x*A>E%kV zy4x?5B~Sg#cyjNOrWY^WuZwEU<*??s9KZ9|V*9i6RFC!59lLIx_&R#7$L{aHUM(#? ze$&zV(z*89kOTLA@Vl=G<#H`E%IW?0R`T$*e^W}E&e%w9V`EtBzuhJB*Wcxmd)Y2@ z#yfMa&Em+ozU$JRZ9fGb+*Gjp&TwLPK~(+xKMNDq+ZXqT&CgA+)0Y4DQtVoF)^z)e zl1rDr_!!CVTek1(KQpIY?&~$fKi4N;F^jf%?e*(Oy<L{|VvQfAg6E4CHk6pCJ)fCz z_v<Te)}_kx*BhUIUc=gP=Xpz0(7JE^lHJvndz0o~cdGoq^G^6__j|>Ec8T@!zGV0n zpwoF`WBu2A*M1*iS34T(@;`4wiRY_BD}3*6;&83BUsb5RBmM8Z1xG(Vy_2-8#N(%- zp=IGAk%l(eL%w{R9mSRUM+8mWr#)7>`1QL2d+nVRvFjyl2X^IN3r&qVb8X|oExT8L zS^n5kR`%9$_lL@X!IS-1_utw0P{)p6JO2xF;5lyz$Md@%)UW(2|8ME-ptpxCR`_s9 zsJm6=+Pvg+d|G0;Tf60v^UK{XTk2~51TdI>)|{&pX7{L>^ZM?4f;G2SB|9pA6nQ78 zyIeN(^MOvrnr%0Zv)-;+=dy6|r4LSv?g^xt)iAAG8o9R6OP+sq)~pzv4NEqv_bCh3 zirO2jkqPWr)V0ruE9jcaybqu6$bYPxvOJbg<Y%$VG+~2ArZ~x;Z~n7uw29|3FfuSO zDohq@d{}?cLe#>=Vu2-(WsK!)t9Gk5)^lub*q*o3w>xKV>5$|o;W)){pW`FPe@=!@ zaZWRw&N^#3H#?tl5p=P2S>W=~)z!7n^@Ur2+dcPe_aCUxL)b&lBh6!u$A8aQFB5M^ z?|$!H-k*HheI0$b`8oTm`d<zZtq({GSQ_v<Fe&g$kay7HpufS<!5c!DLIOi-Lso@c z4fzx56S_3?UzlImvT&pDec`_%@*-wNDn|xJ&WwB=#Smo{6%kbt^*CBQ+B7;V`f`kS zOm)oUm<zE?u_m#lvD@PK<6`1w#J!G>jenKko6w!GKanNTDRE)al%y-k63L0l^{Z2u zQle50rF>7-N)1RYOTCw7kTxgnb9!`oP5RvQz3F!|gfl!d5;N9jvSeCkmSnEaypZ`Z zODM}cD?e*x*2iqS?ELH%*|&0dax!v`=X&SP$`j8E%bSv~ogbdxkbk^@ufV^cui$54 zc;UJtv!d=|*5dHu)x~Fv9~OTtVP;^c2So)4+w1bajpw)d%D~P1f`Ng7;l`$!j4=A2 z=D!c@+{`Tu3=A9$OdwGPhKgIUlUYxMItsL&zx(^&JH6ezORv9sr||aOyLVxS6mmGD zGc`S}SInO@E##H@n{Q_f`1P3NpWoS>pZ577dliF&iQoeFkWSBw_3B$X+LZ$KX3Xj4 zn<alt=Fv?4L@|}**m+l3E=}`MxAkDZr18-9rN@@(2jnh$3iRGP)LqV-@oe6LiL00Y zZ?!6yHhpK3^+-r|b?3Cjhb-%!8^!zE_8*&+{WkZ?%6-YP>J{HIRFjwJOm))S+Vx~- z>xVh@-D_q>dB(asL~U4SQ?;c2R?{twSB+86dVj_WhhF;r<M$=e#W6PLm$?<c3w|}j zyuYvT4a--9=Z_^e8?9SBWtMteb={$WYx$z8m!IC5*}r7|Ydxia^RMi7_&wYGXmQ4| z{4}eub9HOanqMldIjB)*K5gsGI5UBl-`mzGZ2qzP<T^#IZNG0WOg9&aEt%Jzajdf5 z`bFf`*R~Z|25(i;h4=gK7c9CwgYU%+_AJ%58`d}6pS;;K!Rq)L9^VH0x3S746aHN+ zP1zYM;dkHf+li|4vxKq?zAo!MD*Y<ho5S<T!GQC1zQVVhrhI1zZ{rK8UA!s(T{+vt z@8-=O^U^pze*1R3z^D53uD9p-Hl9;|SXYr|<yXJ8G_W_pCp>4Z+50d5Lx0Vbcd`$- z@Jr>J8B3Lu*sEKg-ts;AA&_<S^v`q)nP;&!3Zj|5^W#fAIX{+tNsrBqDxG`nc81FT zTB9o^yc2KzR!Qk=Js;B~8F~2OOXk`WQp;ZbTqmXat<vZf3r7UYALihxS2u&wPI5v@ zLPFlp?~Rk6xAL*CU|^W@l+AeZpH{>AJ^#<I`Eb8Uv1?~*phIKhLi;|+71iRGvla-k zvbiy6O%P0FsJNALKKOu)p#b}bpJrQgRW`TZ+LpWb%C_9wAawV4UeT)Dw`RU)AO8Q! z&hX~<vIc`6La!Nq&kAy231eY6cYvXTMRbAPmuA)tOxF&$-C(nRAaRF*v;0A9#I+6e zuiWw;?<l;rBemkDh*|U5w9hw~w$0E@)~-~M>s5c?S?Q&>qdWcab=Mrh@FU`$E?g6X z&xo8pqO~zxMkM`6C`*cj;Npamp8k^tqD3YbJ6~>O5IguNLg;jY>zXFsjhfqz-LsHr ze{3<Q)4PyW?y&F=k@>SP`d+^C;?A2pFYmmzc~f8WD(g+w`+e{0Uj2Kp?UJb9_Jhag zYb|AHaCTlBxz1F2U-r8Ct9!1_%8DvJW085s;Lyz{_f5QSa^-zkVPofiD7fIC{8^T@ zk(%E+n4^jr8F|-st}*>+pt$VMy2Ag9Gn>|K5a&CT7-cLdo_SVqZRH}<KpzwHKg%*7 zWWC<^yzWum-}=zaaoIU%Iaf7UtteY9o3;AZ3bPeQvo=YsZd?6s)dsJ>D;xHni_6yE zA|AoNw)&c^b_%QR{->Ll<nPE|v3~vf>Fe9q&t5-y{Z1R5<0mc_O_5P!KYh(;U5|$3 z-UaC;?M+)Imt82k<rbYGyLRc-EnQ(3ilW>uXBhb|;WX)UyU6j%vHtD~Vbg_GA?;a# zysI3ZY8a<3S|M`u_aW(bYagwAqxoF(t>!b&n(UuzE6rogKc=0Ut-0>*u4}WR3x7Um zynJ^9Q%{ZqPqHy1r&<Z?fj`F%ojP{z;K`$B51&4+ub`o#qok##r>Lo_tE{cQe!+?* zYZk3qwr=6drE3?jUY?(jk&=^?RiBoZn3<ZJoSpvu!HXjg-aLBs?A^ncPv1U%{aju^ zLPSPLN=!~rQdCx0T7164h2G0Sk`j|7E)_exNohOtW^(5CJY$15OrP|O3`(9nGd5Tv zlfHxP$vF=ep;lL6HNTlwnMHCj|4VY(#HL&^2nh>KzhX3niNR@_X+A^6tu>)fXT9EB z++oaC?{kKcjmc5M{p0sq<IS3BZ`2Z*FL4H$zhL54P>@~9%_8XVl4b7FVipdCr~Qm| za&iXSn;03GPaJD;EOUGF^uVNMnVChCglBf&39-FBYj@0xx2oH(?*ILtS?u_Mv-dU` ze%|~>r2a(XT>GadPT3bN;^*GEvg%v%jZ>|@yH4ePeP37qKR-KU<6SErm-M&mXWUhG zZ#<rQ%wgx<uPgebR+r|;doJAnzBeY#s*N#TqE~!#O-hM+*&owi$F_PstzQ|oGOWTg z@~&s4`6aF1kQ1*nRhoW3c(vZ}hkX7qqo+STwuP2&(foepVxjY^68F-oP803OS7An% z17n0m=RJ^icq#O8Lw)gro~x0kL<0r)&yz5$DRKK}Wh%kr629w)4<Bny`o6tc@4O#b zMs0c_^29(QL;Q2!rc+-+XCFWQaM_zx(d>eb8^p7tYi^(QyXzozG(*KIXeI0F>D#6z zifiACU0<vnp2@gQykWw6zZlU_#*NZ?r}tgywDA=A?WnT;O#bE)VaGT1F?NA^w@<vd z6PZ|QG;hb9sFn7ATg5aN&v8rf2yRa*I`U<z(yz9N#a!$DhkS|@<-aVXxk+yJqFby% zizh2-ab1l3zH`9?*QZ*4cZL0Hzo%w!Y4tf~)s?(Q^?uAg@qL2)MMKjG*$HJHj+@;% zvz)c3EPP&L@<RK)!k<0DNBXs<yvwTJ!&TgHs>lERUx{Cb?DyZ>ar6UkwajauiwEMF zeouI^puWw*C3a3Zo8A2F?|1h-pRQ5KUVPhf34_Pm=SlkwUw^-%&T13?Uv`<A=Z34o z^)3$T4(4vD??04HoU0_wkZH5uL8W8j{aJgzyi&}sF8}sf<9yt5tEBEvhTr;%{`N6_ z`)B_^KHT%iasO{C^pjWZvv+R#&Ux>}-CG@B`aW-YTkI|@vfzEe(-Wt6=v?8+yu!Eh z!@HAT`%YhB+W$}P9P6LeVFr^8CTKI-OpcjQU0?RCc&e^UqWXNx6a0J|ySw*15z4PP zq0C%)+Ps;^tcAbkiSYX$NgC$7#&<ZBdyQ^MB=1a^^HFU^#-x+WKFm<JdCuxzc`Pli z@Oa2&AM?XLo6ndXkNJFN`vIqJooz>gPU~zx<h6RuwqsGR*K9xNHalnA(J;STX}e|1 zZXGS({dVK^db{7U4`z8=yjkGPXZ>hJa$oT^PW8D(v!u^iyq0mde71*M@1GinT#pO` z14Bb>TMeiZxwpMje*eEe+#Fn--5p(>-X30_r%#+ZsjZ=<xq8K_mDw3tnXg~GdMPa- zB{_S>teMdfQIWTA+`4IPVP&~{$F7~#6;+kLYpNHm)^(q$P|x>ZeooB1RtKjCLb2t0 z*E*=aH15qged2chg8$YV<2|EZ8EjtrVb2liug!~%yAzo%pY+a>npLxV)54e5S$?K} zzkC1r?&-6y%iDSL`@LeDvj6`t5&d6(DJkMv^*ny&9qsHAha}W4yKT9)!Ta;$7w5E} zuRq`Qt|ye+id*pAAB{NM`V9$7dzIEckH0W)!jpfy6qfE{KbdYUt$bVGed>;w-t234 zonJ2sPTz3gTj^`Q9_NY{!JfIE9LX~*F7rG)cc$5T#@f3t)h+Mjd3xmRS8RDKJO96F z%x6o<yjR~&@^{bvzQ*LFs6AKi4%4P5b7tSO$u#@iy(sEVm+`bacjjbA$DW;9e`ZJH ze(nd1ZP}OFrd}xLovGa=*mHgFt6zSS7q_aYUx`!MJx%_=;h-|{z==z?#VNeG61Amm z>a(l}%Z+c}mM?QvR?*y^_x@l)VCh@e$UI)Hou419{jpv2yUNbB1z9r=T&eU)u!@^9 zb({LxwBP2EbvM?C&R4Zx)XrkN-A-%HN4{V61`WScRYO#FP7hlwk{7#j<E4%`yM;0b zZ_NB*(D2*${Ho{M#HLPN5^!`?j{RzDV;hbqiZ1?<<*FK!e+D4}Lh`pb@I&Pw*X zznrBGNIW~o^L5dj7xS{@HXGb={O_vzmeZ4uJEBjno8#Dqh8NS>B@QX~B=88&=v8xk i>9at3<p=Sa^vGu$8lKAE3wo^&YB)18F#i9~zz+a5ui%dW 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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 XlH#&w!~Xx<UM!rVllxVUfq?-4Vv-L) literal 32464 zcmXT-cQayOWME)msJp<x$H2hAD6oKmp{@)f1`<cbYzYh<NgP(3)5QfjxSB6XG&gxO znlY&`cQSCdI5Ds&u=Yl?_XYDba!F5rs(#`2c7=<xLnrApJYSclxS_CNqrCT=)-TPI zxm14t|1Uhbt7qnx3EPtU8a3|y*KrgK3-iu$I&s58XQ9i&zEe4O<U?JnI@<PLUQ(Fi z-ddTo+%K^6T8m4N(&dV09#%2eQxfMLYHfR1;hX>Y9S7eDo)f>P{ch_?3EXS{Tf}Vj z!}iHXlRAY;m;8-2^9z?)wBB@@nC!v*WfehR+BXOlacHIQUQ=K4x_OIG)alCH&(Cse zFB|4XroaFCDC(n2<aWtPU!!USANcW4eB|W!ztZadxxM;NYE<u<vj+d#Jt2tu<@(0E za~Ut4%~P3vdf)C8X2oU)1py%@PG^N~l@<n0m7GZLfN7@+6oLyIHL_wY%Gx(yySPvG z*SS@>OD|j9@@h}sR`%-u|JA4O|K3uqdUKlV#{`f0m$+RH7_5xzQa>8#m0Ef5dG!0o z>g#9f)t}s+GE1|`K<uK^?f+{uL_Lg8E0wk1n0~mZ%}dO8p6FNoS0z`U6wG+Q_U7J% zT?@tky3hTla(bgPORlqDy<ozO{MmUD)n9yT%jfLBJ58L$jQfJlOoJoU+rI?|A1!=v zIMrgS&Q_fQ4pnvr`9qCwMFbx0ckxm<kp1QC)a`E<HwaBQwYO&9Y{rC!(+P{eEYfL| z-ktHb{`0FhTSXj>PxCQ!PhwX8-uUOViEi!OHos!NTfeKN|I}F3PPVI!zQpN&f^ET^ z)I|zY3t!*Zc=%fC0}-VyTjxGG7w@vs^$c@J#qv<rKh<gHMR)efCHZ)T{kwN!{w~{i z0oi9g85x4#d#k@*33hyzy;;Ab=fMBIp7lE?rntP>c72uYq1<@RMwQ&gj<V_{)^CG0 zX{8&^OV|6R|3$Xll4mBj_t&WfhlO?6l4rm8-J2Pd<T~RS*Uw{5uQKz$-}Uw9*%OxA zC3hWsr@#8@`el1dvt^g7y0>b5o+9xh(vMN<!v8&Qwk|Yz%w1W2wnvZM;aj%e0qwe@ z{k(xwjOQ{M{Lfys*FNb(?bO*5be=ppzxC`=4;vN_OHamvBTpI*tnl>IInz>nAgk!o z`~T)w?|s|HsM_{_zpv%L`Q{&GtX}5_P7Eo~vI@U?rq+1I!MThMdl+339K4P=#1yjM zi7hz5&~<fo+mw*QbS(oR>VA@?y%$K(*<756<r_o9g`Z&eZ5#+Ob>pyye$!{Z-u0 z_iTE@vGl4PvL$&JYIEu@RNt8$^~H@#Y**`@53BcH4*It8yyZRtuH<)Cx&6Bwc6F_C zJ@FzhC8UIHs#=KYwUqk(zrHtd3cAOb-8s&1@bkav-?q<{5B@zXBWKlI^RQ{B#6$!{ zO75S&D}OxW+dfynqO)87R((@C?G+{>pU|-M{n_ulU(3HwQFQk5>+;}mTrz!I@P)HG z7YBu?AD?~cA-h5D0?iA|Hhte2XMD*0@P(r?bx)`b%a0d_c7M+}6_PtusEzYdyzqrb zEA`zbcr#6w=5F}*p^8ChebYM$=JZTODWjk{Zt9Qhn+o`x6C7NpBnql+WRn&+$oJ+D z=bb~&dk*Ngg*0=2_Ov@){$t+^#b+HqlO{$eP3sO#TI;gJ^;b#{k5_2gw4YCWuddt` zx?XB6+m)tQF{S-g4z=-r18kSau{$QLxlwdLQE9Qmf)_JyZk*IM*~ca%;IK~B3-g?* zy=Awb+t?bfE?^P<zSzI+|M9GKm$Ll+dfQ%)|63AW?)qlppB0%>44%e5Nv38A-oB6S zv)DU+jhg@9a!vR9&X?BNOCyvOGpEH#>M{q}HE33TU!8ts^8+Ccfs9~*$CHBMr^os# z-~A%#Wu3<UgT=>mc2n2tKP$4<)vsIri$(o!_kU5gwY$o$e>*Yl>1Fl4cYFVyGvD7{ ze>(sB<R84sGCU?KEIUrv{b+q(_x$<Zx23gbUQaW>6!7;f*K?`%o5tG=j+<ofdEQbk z`+3`TnUVu`)o%?G@5~5X-4n6uvQ6%)sag|{A3v))%lAx@My(qs?{wSiGMjZ&-p{>S zE_U}^jrHHR58fW=wf^Sw=KdoEi6hb>9x5q8T%}C`u4k2bU;a2KYkzkCFXbtPic|GY zt;)N#PTno#%f>>s<Qk`>OFd7fgiOB46p@=*)^2=v>cewqPJOE=E~@>v=TFn2MUN)U zT$=in-!tuMN;cmW)2SDkGG>%+{5CuP;JgH`>Fmc%&R07B_<tZI&9Alg_`2N1$=TP} zO3v@CzIl`7|E^spUKldO{{6LGvSTM}=QG=uh5svc-Y+=YV0ME4L*m=BUspQcD*vZ! zRo&0gxI(mwdEVdV#kY))eJp;kma+Kz4ySv&0!{v&U-Bqvow2&p73E1=W;@L2*r&vt zTo^i$nfrtPg4XkwE$^v+{rvCkbOkNF_kKHfaXam@-taehU9GuDLr~O*JF(W2lY@G* z0zQPdihkO^rCCvMzs5A*Hu*~iJnv=Bo|!mvrqH>FYx3W_gf28YU1pl{w{$^wdPljE z+p#VtEv*QV`ihiQJs-P;Cf^n+Rlf84!HJFg|Gy5)s&o{**Ye}m((Phblvu6WCdIT~ z2@<u4XA|9T)A*Fh%K74DuBJ5MryCC)nSS=N`L#d>zUR`l|IWX#S!3}$a?63fyZ;ik z)RuO2-isIVY~C08X<DOG<IJMVCcWb7^L?TocnNg`FR3}<Ju5_6+Iex9d!4e|6(0Y+ z2^_o!Tc+NuT&1O?+7Z0bo2fKSWS-|k{iYyS?lp{0XZ+DzwW;b+?_uMxxig=(bcrtT zl`H+B{z7TKPyW0Q9W_}IO$)4Vet1)>@$K%-nO_brmy`aseslhz&E>~?gr$r5$`>4% z`Q_k>=WIrm*V3kbbg7lJ*_bGMGc4fJtga`=GQTJN<JaMqzBuQH{%O%h4Q2n;z0C5K zAzZ=>mX~eWp3b;!i}G9zQ^RFXF8ZwzEjac2K$J~Y*yoEntvXdlzT5qk+kTCg`&jM2 zm-R~nKAyglx%!1u<M$$0b59-{A@=nujs8Lprl)XtSaEo9wWx?5nzYY~|4Pbx3GD;^ zYdH4rU!xqc`0kP9z-fI)3)l-got-8rXmWaZ8ZA+kO;KUpG>Oa7Gk=PRiNL})-7@Z5 z-mJXJx=nUhO7>$>7oN?>(tf+HWRkeZv2IyyY2sV)XLE0;$6h{r_hwpYaLTvu4`+p* zTcf>n@17#&9lBYIG<WjlN}ib3Q&=&L`>FW7e@{!km+m*Yu{&fVtBHi`Sz%9=>6@Kb ze4q8StL<Ql?q;v7zZ_iZ=OeEiQ#6YB`eyQ<`x<+v3#6S>z1BVdoxz9vc&)H4jv69X zAO6gZ{P8q(pOVAm+Y1Hf>SWbaia%0(GRtpwmF?TZ{xkF9Vjj1iJ+bHi>J@!+TF$%{ z$c)W*7pa}_>P7hjIdQL(mz$;pt6461QP1@7v!`Rfuw(m{_fuB!i^NuNUhn15{aVtN z5%88Z^0EYng1g3*V<CLMOpExhhx8@#mi%6DV#Z|Wzn^ctu|Ha+y6RD7a=-}=>8@Xq zbE<u3eqAA%Wuo=Y+x}F(RZ3;LlYaI*o;|CkIjs%P77-Fwdn+m`>#zCkY~$7L*B7N7 z0=0GQ_wdGF4V%ujd;0t;clW(<?Fxsx>pvN8$Ytp*ymoz~%xtr^qP;cw_Wg&l!!BJC zzQ*ckzCY8I+3VfpS@T>1SLbKvxBXXkJMDb$;`To`+`i8>DfRQQnKj8}&$~+{ekPY* zEeM}}HsaqjO|=ro<nGtmxqaznWqhn9rwTZFepV!<G`6xkz7#cWt1(*Xp>s&&X~U-T z(T7+{+H}2Hw3&NutU9tK>`YarEb|SCgd=9E%hop7PTFSJFqhFSCp_sEcZBxaWCnKT zo*N5~l!$C_v^vJ%$0o5cxbvk>LY&oc20b>3jozK-V;f^7FMsuHYc?u7?DjCsfm7mO z>@IfB@3yuTFJ8{<w|4t5<=y@R#s2bfRlh#my4=1!j`v=*$&VKoA8dAy{?t1EmrVa0 zo_PJx`B#p<e*7?{R8&yF<8pw0tVi9+f<J89;$lA;RGuEZ?aj=f(voJarq0SJyVl=P zy*}B8DagM2qoUxZ=d8aL&UO0h9rfqJ_qUG?*BpOzv_*3tWBYa0vo|MQC|{d@@X%UO zrq<&NRaui-RyJ+)vt6U08FFHOtA_i2tyhY6YxQ3=Wt`+Xn)`2);yPFEEB_U97V|uo zxV%TzKXMa$Wg+vzl{1AS4>PDo);-rc5|+C19Y>He6GMj4g0FU;Rm?g(T2C05fBb7> z{(r%y%$HtKd6j2oR+zpr)r&i>I_Ib=PhslHs7Fc{ZWr8Q7B+14&)RQ0!yvi)P@1ss zsrKnR%+!B>v-I7_^W^T9LVhjLS+y3)ip|ERv%2M`&N?8X((!T5L5F*3H-)BOC|#u+ z<h65q6!V9Jza`RUwq?%xxQAbZp?SU4?s*kl_4?`CX1?>Wds)V=J~zxcRMa!jdTvzq zY5fHgU!3p?7LeF;=Rj;<>}Hwl@S`%?FI4z>m8ZYG7F@ZB?}e9YD$^{b!b>Wlmkide z58hd{vS<2-HN2klL|CT2Xj^HrHt2}K)a4;_cMG5XmBn;r@=BE#9bI<+Y|eAn1-v`Z zGOdMEF;n_+(Xp26T5Fs6C$EZGmv;HIqqOGS-8%D*SL#&QAGB_WW!B3}dnmWZ{STj! zzo43Wcl095Bi~ocFz1Pu2<9oSJu7f(9t+1x1-S=#U)Fhj_jO#D@9o&RyD??OoD^=2 zpgofw@k{e5ocq=mrtG(m!{B<;J0F(?TMXC>JAw<A&#{kN(9|q)V@sM^^!A7+PWjAp z_IXWTr`FTIMT+68_Kelve~P@k;<;VKO#WSD$IeAP%?Z4hGj<Dh8Fb8lZmikya`x{2 zJ<|@bF3T74nUd{y?B5T)Wqw_E4z20nS)cTct6}pTA^u|C=Pe;$cvnwb{9pX%Trm^X zxw)lh0=`a2Y|TDmW5wk2XpU5*a?;XI;)?G&S^EBOS;~^|xx-@i_6ZT;QZdGFdB4hu znimE{3yJS~P|EW(T~peP=YHbpBllMX`|{1KxTM>hc&kBdm7LOy?}BHyqzdaW+DsNc zptNtE)05KOKiBQP7iqgbUT$4`^WEhPe1=NX96Vi5JAF^9V);F(?eaGF9G=gsY711Y z+#X-`JfZ)(<*-QO_xBD*_cjSTOfbqZ%y71Ht?9Gu+T`(lQ{fM<oHTiNzqr0V){7T% zJ>#5b{Vl0gNnKg*wVCQUp{p4eypK+JdeVs7lizE**^OD%3q#sAd#!b0z0lHo+wIQP zDfxfocdI8iHvJcwGVO@@wMQ}&?}~cQsJdMHZ~5z+0avFSaLM}du%NeMOJPVaW6q2> z=Iae=XU$??=`mTaH#@7c*7bsn_nV|7HO=dn?(sjGHqE_lc2VYGe&cxy;%+UO<?(dV zzx$f1(JBXy$+(F~9yzbDy)dKl@Gj1KZM++sB+{y@j;WnCWnWwPYs-0yOTDtP0c(^_ z_Mg6}5zF4(eU5LhVVe1=U}kNV9p7gwt6jaaPaq`VLXdTo`85@v4HB$v(_bx8FE`qG zedlWnlb<`p&gS}bM%jk#VpN&<dCrbY<xYl%%+o$`eYD;-Lv%*-#^rZ8T;CsGIkW1L zY+A;4^N#N>{C6&Ev}M;EE|}A!88SN{vTI@2G`n|E(#9oSSDw5V$mi^D(&}5X;*?`j zlFasw&M)u7H72uirUl;8nR9oe->SA>U2a`5b@Gm)ci!J-$ajC1)+{=2>M=oK?&yDS zOloXBOG@fRUmncf?|%AG%I=lrZ(XDt92ZTVeaDC|x|UVTj#(r^eO08)ZHBcI10S4N z$emifld15SY4pO-T8WuOS$eKfnfsRg5c;E4Z_#k;LEfo*mqP8MjUI5<9yyu1CU))v zmmHIedsX)=cvtOc_uJU^wd$Js(iJ!DPlOk|ath~v_c*^xV~X`1>+nbY(zU;qN3n&= z-TJj-n~~1{62BMqkM>W`z52^>dbpbItcQn8eSUe|o9KR6-96gs;<2~@msii4^6#Yd zR7P08e3EX@<Ma8O<6A$!zFE$)P6<7V0Sjm9Nj<Kbrmn}vU>kJvc+5eoa|@QbrlxOQ zySwa7RLXTP*I*^3{b$XDi#MG)5%sRpI(gfzb(5#=t=idYSC_N0*t@NMh3upo(-zAv zNZ%SA+wxFacb `!_$mzn|z#d2^3FXZ7<Hy8SaQJ$RPTv)Eyitjn~c#gf)9)7Gcy zr`z6~8*pNqZ|mL{K1E91FHfdSI%o1XG1&0_9NlEL7CG@r3l8}%NL&1~vG2p33+uLu z?c5N4bjBpbTU#Q(t~5}s5Dfog`q!_myYRxtON&=j1<q1hZg+a7NY#JSM@uqfShK$v zxOqRH^G_}^<lNPjVJx-(a~fm<ORFt(lYJKk_<s5vQpw%TV07C4*<}9dM=h#Oi(k)^ zt@+zHJA88fg@S|gh2K052;@E98Lu3tch^Zr`lw!=nsQj_(K$f|bJi|iU|251F8Z1? z`dQPj^Y1SwUvZrN^^$Mzap9&Thi|KTUo118{@8qlxt;g)GnSFZkLB|<7uo3DE^_g) znG?9vn&-Fm_mZc9vTx$*O_&Y%0whh?E^Jt5G*?Ub&P)9Zg`0nE^?z{xZ4}cE^$lls z>b0zLuXQ}o5bfeSHT7xqcje0w3B7+#8Qz>39@=%x`W$DaM*PD0z1MZt`p((qxyW_N zQ=7f_ZR++OWOhHex7v6~<;1wwnH8tkAKfua=w@x^nIPu7_8jN_wk^`B7x~%N7!_z; z+IMTx-fvI&tz~z8T5WdYlF><Xs~sO!y<ac2f<yCPpL&shoy3f8h9=LeoS({;i5=gk z{;TZ!x*I1m-1Bzc(P5Ok7}b0{^w=9|eRlpskEZ+C^)mNw)OZ$pz}D#Ltu5E8grBUo z+PRBuq4?}|N3~12-!t!Eo-vohI4FNkOO;=HzQFhIw|u0gDsgpeUM92X#4f2!#UpwT z<R2X5I&k^enu51$<TwA6d$cQJYTv1qNgE$Y+VA!?d$r)<uKTs}hbH^w_!pQbq#Cv! za~F-wc-PTexl=sm^%Op)5V6QAHeN>kow5Qk?YvgC&8^vmKWw+CL~u+=)TwIOx4_|F zqkJ?UmrStIkH}>!f*!hy{MA>tEp_nsa?G=sST*Uk=!y{0#r5+xp3T27|KidKkuHMV z3F;wJqfBPVYq!nj*Wnhsd1Hae1R3++7HX_hX3kjM;`hbr=ER(OTM<QW746I!yLuYs zCBE+{SvK#-)#c}(*z+oSoU@i(H}CB%f%_3}kM*xPscG;t(s7N!;?xJ${&TK;DOmI^ zn}L5?W|ZsIhgJ=)o)>(Q;+I*~%S<}MHD?n`x0s6a5`PK#*)Osgs=u6OJ9U0u*~X~& z8J}N&y0+>izk%vDm&;LAYxdP-G6jU+6!5lG+T|8>q4CtwowxHpSx#y#ndPLq{=UD+ zo>ajLUw#-)*z{1Z$vofmpu5kd0zr|F^}OfbzprnW<;-$_|M$p~7faY8zyE!2wyEFY z&L;Pa)lW9Q6Tf#s;?(sAe?5MyvYTBuzUf~3W8%jZC*>a~E{m0BXp@Q!ddU@6B`I7h z$eR>2&-DF=NpshE9PV<QWKp@{!WMD!$Z`qZecQ7(Tk@y<|I7ID#nzJ&#Ww;Xv>QA7 z1K&$5D0_DO?L_9kuKT<*I*wfLU}yK;;&OnoTea%oIgW~sH{X(j@41PJ&N|4p<0$vE z`O5m)LB7%X>#fZ-TDI}M-(@hdQS4)Q)SKlzRh~T-?C%eG_lB{*eV4xN?YBvcleRCZ znEt@hZ?DstU(Q<`9MAqOxjnCFT6OBDo3b0K?ynHb{JHJ)^e(-qa#yG6vC5B%FIM^R z3kIxU*8QMpa<i!a-Huc4hkpDBdUyZT&gn0Hbj4PksZ(Zj$-MB6IV$YfJ88a;a>pwi z{>+=6W;1!l_Sk<Ze@w*wmq^8RP8a%hAhzbH_tRsVNlCIxC#-yBct<Tq)Fv)W&exaw zRizv!r<&ZHBX8udF+UcN%D<btfbm~YbOd8N%km`IJv;A4e0Y8HtbfCE->#s;bHcTz zv%b9f)h?>Q@#U3<Nawe8XAhn+pKST4>)Yh+DAP3G>0ehpnzu3HA6Md(xYbwYpE$-` zn{KYZiS4e#h7Up<a?v^+c>x}`|80|6GWm&vvGk*qmfznbx&D0!;7SqG%VpL(`zNaW zmbmoJ>}jUQAL=e$HnU99PI!J@bJQ=ctt(%acr$;QS5qF7ZraeCyEwwct5sNj*9^O@ zseg?Z+>Eq6@jcnyXZ<_g#rGvEH(cP3J^wqjOz?HQ(3ce}gfrjW&21~T?zAd;HE+`O z8DBLV6@LlHMz#6{-}@pdw)b@Kz1}0!>ho`$NIe<G!yM>5c~*6y=5*1+*$HbEg;*XP zD0BGm=4aP0+x?lr3ujJU|LJw+RhC0Lw%SLUEfd<j-aMu?TzLKVC2R*$N~TEZolmM1 zlPuzTuws=>P=WgrbM9?_`sb$B%)IMSvawxw+Uz^6or`AvF>Twj^rQA9>)5H8QZFi3 zhRm7Lovzoufa{%2W#yd8*{k=(U*!t>yT4RU=iG&&UEe2}Kj*xn(;*VL_ML$2@2*$c zY<C*+o<%=pjXWTq$}&sDxAdv=3ZoFe%hpEIn67-)o{}r88Rq(ALByj42Ht^8O`oH! z?Iv8En%%m>>8iHPi{uBhmSu~^YwY2>Fztrh{>@p(=Cp{%^q5V_)%h-|wolP@&!P3L z+rCZB4Ar{D?BG6Qf#byX?Qfg9W^Ft7@zP$eE`#fl`!r%QL}#w~b1Sw?@xN2y`>j&T z%@281@I*(>d-K)!?xJOuTo2<DT)QhAW2Mu6t%^LkLf-1A#DXZZ6<4zq3+`m3=GL9w z7oxgqxw}o)Y&8zv)|au>zh@{O-juLq@;BbIKNquel)YqmTe_Fwna%3-_e(1_mhR$x z_i0g=@JHtoVfM=(C9|zf3~Ki-+WAg1w`N-gznZP_44vn{uSE5HyZ78|UqJYWm<!sq zr4^qIA0-%l-ek!AbngezN4d%yv&BEB@-t@K({yM^U|Y`h_;RxR+=d(Tj{Xju_woKr z?TKsWPqi(XGF{vJqu^Rj_copVUoWm_Vm8k7o^Z^6w_YSaC-2g*)zdusm{xa6WM?f` z^@-j-Y2%x}%IW_1YO2D&MEmZ(EPwxq*(b5`xWai>_m;e@mHt<m^~2*(m&rk0BVU&< zHTOQ5f7N+$V{L$C*LH?3#S6yyGyk!l^j1I2Eq{LI4~vx-b!zqbs{iXuf4?AbyTm@G zXuE_)>8rUD&)%H6<JS$Xf7dgQ7IW#<1a7|*uTZ?k{Z8gdMnQdUjbjI7j;fpA%>6UJ z@b*cOY@N-o=9#nPM0x5N<waguuQX%(>WeN;`JG4Ka3;L?_0waq4f|bzfK6LDUMNnB zJh<-A>bYypW@%Ww@?0eRTyCrV-MP;qUp-sNc;~b8<yl8FuPy#~%RAA#qQQCHwb^N= zO#O#$x`vlYFI(bd{F75jcFkRz$M>f;r_7)E?!y)Kk1}P?-?x5$@9b^k|9Sr>4yE_E z+tPYf?DZyOf6xloEYDS9wsifWuc1-#PM~sUQqrai%QX+QUl%FOOA7vVM1o6P<(cHQ zl37As5=}R=yR%A6C!Z95{w?~PT5PTUBIPspnYS)473}Wr_<dkbhO^`W*N=4ury4{# z<#t#`3G50~z5X+BmD%Y#x1^jW9ywx?6Mc|JH&mR7@mO{n?^VCf(3agH{`K{Ow@tPl zn%kOp*-V!+|7qMg#m9NiPE@^54mio9`Rh@5RLg-v7v;avZApHKCmt}U$JX?Qy%AW% zT~WZyUAFjK^l}Ea^#yKGF^*AhR-T<<`tdqLaqonhT-O~}DmT4Z{yOCCqR7xHmOpV4 zZ`gjn)ld4ysW!Lg|Dk)H&n`@=Shi)7mCG{YWd9De)Gr&@W@?_*Sg?6RK!thHjYW^* zT6TEUKV0dP_&#lW>6haxW&W70QsA~YbkbbIswG8r-p^-7cZ1Y6>2*JiyOcL!+L7XO zW>wPf<bO}Ql)CZvy8YA4SAJ5v71R6Z-G$7PH+QkJ))sHwlKDwn#vo^#&iA=9?#<_Z zw?{x$GeT(9UE#_YuZmfotv$A1e^*<q?f5RO|C@DV@XN(KoBDK8TvV^O9X~#)!m#vg z^!bJE27b?ZU%3P>%zlzDYU^Du{P~l}v9)HLTz97gR(|nI$o!>qVS8p)(0o^2<rwX% z?K1>Jl>Yn9Sbx&|L$B%nmyWFx5ntGs&id3>dUNiI%Qf87<L%>Wn@?Z+;%LS`;|t5> zhAgSCYqEF~T%Yy!UAZCC({)VffcEt6rV_PJ(yNX?UA5X%w8uehao-(3aZXzn|D5Hs zk4=%OW!T%FdByL#Pe#mMxh<0(WvZ%jYf8*`6OlfXTWxM$$gy1aCp}x%q+Sj>=C=0L zzR*WI`hDAvaI==NPk5}iR3;`zaLN^R@q!6|-*Fy!8+{_Zdn?lgk!vd(=N2<w&$AUY z)Xoqo;D0vZS7A%VN}VG6{wJTWtW#6(s&J4}^Ql-WH;3uT=i@8tawG1t%Ii;H$(Xa| z7Qa}`saxyVeBP`(S>0>+{_OVo>dW%4`?0ZQ?wbB<d0p2f|6q}`-5Wn83+{`4zu33I zYQM|$q!o{KlK3-E?|k-Y_P%zbqY~VD$78OmFPXz^A@O~3wu#f@gSo7>Tk^#=E@0Cw zm&;@{Z4EBp?w7Jlz^*DTu8Z&H|GTwMZ|kYl7R$SC>8Uh2I&<|_W!-p%e@rvx+8DX` zK79G&Ipf0gbDD{Pmzx%~Z0p@7x97U<q1)v<8Eu94HO`Y>{Mzlt@l&78<DVU0)~soB z^Lf1D>F3X?rse<m%NJ-P5%ZB{K>+jpAmtN}>x*~u$~!B?@@Ze+Z97|&x7Ka0ftS8; z>CA~?z9D>~e5*G8do<JNZMBYaRAS@r6_+#>LoIk~68uhHU9EW__KcrcM#du9^BYam zzA2oUp6GS=F5lMT$ALOYb@J0wN)=YbxbWS*P+6X>_;Kxij$F>G#t*LEty<#LaWrV1 zL+R1x>b-Xle$0)zf8y(xNAVL@opx;#59xVq+_+`8wUD{Jfl}R^M6RBL{0c(xEN@tE z^yY^(&$ya%Sm5*5D5t=J+aaZ@ZL>b}Jc$<HF}?WL{x_P1f>rhTkG2};^@L?b1%G*a zbYFRe`0eKIJ4R-^r=NS#+NX9lx1rptbxzN=+1qwYDEHYhSF}r7#cf?%Ea0BJRz&&7 z-NZo05VJ**uf!@JaPGL0zpJKY?nTkAZjK)n6K<3pG1`^a-LXCC$Q94suY%V8iLYJS zxb}zeR*iG&tg6!W*I#VBx8v6C2A`ErG}7a4UF_|s;S}L|vHx@6cg^aH4oR)C5i1o> zUpAe*+s`d#?w7K)*BnAMKjk^O@XEa0ZNbr+v1Qk%6V5#~_fDjLUOsj1ZrQJs%if<d z3OXZJ>}t5#JmT$)la&Vb)ze-rk$RIQo%OM7b^hw+gR#3F2E5sLjCaDcy8a`<w>}$I z{GL*6q^z>wuI5JD*eS98jC-WAO=1N9hMIi{lG_-3qj~;ujkYiLeEw5QQY>bzp50=s z5iV1HhC86<<!0yLe@BBf-%sK@R$5fmBlo;~PUPHLcC}qAoEGVv@{rEcefzumtf|sH zp0-a?f99?I-z(hS);e2%RVLRv%h<fn_ru>@3EDDu<`YvB0l_RMTl;ItXGA-s?u4c> z{&L=0H@|$bkM;Jy|M^Z76)}9M&-Q8Ot#@%gaQftqOPh+`_SF2<{gT^O^JJ+@?+Y`I z2(POb6%?n<*r6AY_e1`<)V%CN46a_8;`TAUF;;?yr-x1I*-@9XUHEu5Q{VZULhsjX z{&&m&q}$})ngubxOx|CV6k7Vv=$^mOHty})_W9&{N@X&vex=%Z^Inv(=z>7!$bSze z{VH)?t2tF7c+HPVTQ5ABW)}H9d@cXyCAYtpx$ORX?62?a&+cvgTW8&tKeW%Nd~^8j zMy32suh-<qRj->o(?tCCz6G|?hSRDKt>5^N>C2HP_uPcpca|qzkI7z~RCdO1xum4- zjSbg6D|{-gH9Hcq!u;}Q?Z9_+TR)d*cV{cA&C1CYcoT6)im}us<QJboYV6Ol-o$rb zXN2!Qn05Qs{DmxAXCKipQrfWIy7O%JRncp&t#<8RCS{%b)%We0WmQiqL^~&~{q}il z+Ag~(Pb<9FT14n?-DRi1?`3M*+jUdXy7tD=@A3Ee^xw9c{Cbw3vH4rM^#k*O-=$W< zZX78W1Oh^mUfkBXmdzP^a>*vPO;($Zt`c|td?J^ZP2M{+JXq+sN&LdghQA;8?6BE% z#X<Isa^U~7!P9C=^EbRY>oh&iqQuE2=TdVMqx$OihT#U5XD?{xbUCQ&225$&dqna5 zB^SQM@wc6)&)L=fyyLs63~PVWjgLDR)#NrG{`zmj_p0K?KZ`faOsRZsu`IvJl)q0P zx#g{g^;%2sDQz5QUrX!EnG$~DpjW@Az_PNY+f3re8e1LKq<2347ybW_dHKo}7CZGV zRagGy^SRE&)udY08n^0Dg-qzX&r@GiyJ%RgIrQRUZ{$Jq`12E!SNk!@NW}3prb)(B zo#xcj;FgIp<aLVdeco_Z{D}FygP->0J<GCvq$%k*-6J$a<VqmVH|CuxQ@eIg?fhLB z5<D|`Y0aH!_q<xv&LwX;`RP`a{|@23T1WT!U3;wS@$NQP#Ao~C%&|J&9ScKL7G99v z@maHI;*R?BPL?TU^3SB?_i!J3D&v^I_(J_0``)c7z1n<Fe@FGaFZs)>Q`rAi{ng)G zy=j7rxPt1Z-!R(o>7}|}y~%H#p9}bET2Do6nSN&LPbT5$c%zps7s4ea-bRbZ&fs}z z^GmPb+UEnu`!AnqUt{yrLu%dIBN6ME&OKVB+9RdF%_YC3=R(iQiD74JO=DWV&%SN; z>*)rmg*7p=1P(RLEzddO_;+#cJ+|<RKJ#ka7GDvx&h%*87IwOy^=qHzPxZ9ZM?W{% zzY4j~=IWQRbJu|hrhl*ceP1Y~dne(`<`+A6ewbLFC(LW|txAr)G4D&F#jnDIZ}Tmt z)JZM6x4YVLQ<l8sil53Xz6YhGUppO0uod`!cY*&p4Y%hH%X+p>(D%4FIVI-gj`O!R zySSX0yX?B~&VBRO9|`d`Q@Y;xaaZD>47KFF=YM+|UD(_0duIQ|(9D%jaz&!_8$LO| zk~Y~}cd2dXRf)!>Gc@O&F4FyTDACwo+}ZQ^-n2h+)iUG!4sd5kt?d7FZtb6KVH--{ zZQAu=SCv}kiMB7t^iTG$Z`Ce*+wW6p_x9oZAEz!&e{rAxmmrhzUb%O(e`s2N*1B1A z_1EGX9)I4brkX`c|DIppA^(H@_v1|8XD77(E7mEkRZ&fx_uS%j?%w0iyYId3|Nr{t z&i#c(u?s8o8=Bhg&CZkWFlaT-S~TnRyzCjC^E#?_O#8n<f<Z_4l1GW$WG|J+OD=df zwC|}-QgB^n92Z&n>hY<D>_6;^Exr-j&;MSW>a1@s_ImLl%Ys>Rj_>DIe;dl(_+!;P z)s>SbbDI=$=1=&O*yybs6BK>+D$7a5+@2jyNr`^pOEM!*CRxsX$nU44`|IQX!1~q4 zF3r5zd3$*`SD@!<{YTGzc5Tt9+8a`8@$}q{{^dW~oliVkIY;<w&DP+nAx1T~&dTLH z-5PRWRzOJq<fX1bis!Fvijck<X83vUP1f4upF$gjD{rZbU4C?OzoN3JX5Q7tdl|)g zzk7au+Mc}Q;7N;ln_ADQoL{XLwlGt->-{DFt{>GeAIwYdR8gtQy*y1!vBXC5(rp#B z2e!QVwQ5Rho&_%1a(ekJo-coPvrYZLWBZjMlQ%-;Ketukqt1|}?<a94ZkZ#gvy-QC z8&`GeIW39G;I}i)#B<+gM7C#NN^V)`CM~ovW3heIXT~)e!S2j6cEn1aIhDBoVUpAJ zz`vn}i>n2G*Poj&VV^pGb<v%^El2+C=W?Itb4WOI<K%~J%-Y-PYi9puom3Zh`|0$W z7@e-GHCadcCR(2<(YbwSqlJuZ)uZ^E(aju=bFQ2f`MLJ-^j)n>3iypT$@mDbKdl(_ zN$jYvpM3yxi|+QDUrU+x|9P<cYyC>&e_0#}m!s9b{CZs(`jkl~<eTc{)=w%HDGG-^ zeoPE_yi9G1ZhgUBwR-|jQw+l$I7RdJB`o;$XW^|S+ocP$_vn@1n-^rrd@t?N!{cF^ zCm&6CnDNm~`@eL<?D9D^4_<#Lzj=Rw9rvn`Ys-&UW$DHJF>#w|kXy0+@A^Hd|F`eF z@9(d%qh`aI`Qhn*lUBW4njqh`ib*NZd)CwHfN$)I`J2uKF=iU{JZ7+Z_`9(usAsif z&z=b7?b<)|%Q86lxF(jyCZ^>zJ+$syY<TG&<8oVVKiA_gtL`jrSKgd)a+S=z{-1oy zdwSotH!CTX>`+(Hkt%GP8+Un{d`iNd->J?;K1^=m3(k~G^yiy5k9(^%Gh0Dlh;P4b z*rZs|ZIKHUexEBp%5C#?UU~P+ACqk>_IPoh?Y+dHXRxp4J6C-9+%5NK9GrB=^w`|; zV~ZXIvRPkyQ}ZJ4cD0;$Npnj*%f0IQzzd!om3LdeEwsooJNq=wJ)Xns;i{J1q1j*7 z^ru#y6O?1nukm{xY`JVn&4;faH+9}%-t{iz({TfP-V7Uy?*}hweLS%Khx|IVWpnjP ztLyjqNcD@TtzQ|YSZA5<T6FQ}*;O`A#S6rY`?;g;**DEHHkr5VfK~PxWyaf%s>Zu! zL>+n8ru)UJbf1C$=dHY_wzXsi#B9y$68-V(U-GK-*d30$1*ggVDe7Fn?wWb=-6NiB z`$Wq{-TBM~8e3EzeCYddal)_H2aO*Ic2@uRp}d9Xi#qf1<%vgauC0;RjY>~n8R2bk ze)?ATqi<{v*DO5gD(xAYzRaD=<(g3#N93}n*>?*Qqjq{)tdrPR@@9k09f8kMENlhy zlYaWHv)n6_V_R_I4}-x&N2MK?|72g!n>jxv{X@UhVYS(|cR!Uf7)z*`rkmeynsna& z;Oa|9W%?YAuYXEWTG;8&Y0b=8;KcCL_`k@zN&lIg?(IA9Fs{N{#o(6mYaz#^g-_kQ zK7IV5-9JHMM#-&|Hg1UpKIL-4C-u8O)o7cE87`mKo*%YXQ2e|?LC_7Ws}_<q{|`AZ z^6qq4*xKjHXk9e_WW?;?sADG|>^j)DZBA*)v%k*;KI#|sD_T4&o7LxIcvJt}lBip^ z<7%AQE@tlAw=!be{73i26bix)=jU}zTh4mcd&$o^AMUV}dKG<qzs|~I@x?h`jr8UQ zJzO%QSmvNI<NxYLF|IAoE^n#7D=ir<7c2JMBVXc%fAeBfsT8%i9|p4&bZ4zw@+ohI z(KE*-7f$4dB+l{;(q~gG`+D%ffdeZg&wY}J-j$nIyXmTo%GrYkGpxme1Ku03Xm94_ z-gNo-6?wIG+fB=VNX|R*Nhqww>fHg+AYq@{`C3;eTYurGl2mPVxNjx3ZOfalOHLe( z@%XvFl4rBr^GOz;+(oBepJ$!2&CDhKc0ho~<i|YB#}*_upL}&=^4q2E@j6=CbL2%^ z!=^uZHT~Ge-xms|$1%P2D~{vTT_0Ps_H@c@>E1_El{U3`nLMj$$+$6dNnygl^R0dJ z*1u-F6IyJnw8gn`)rxgG(>2+P&R68ehh;VHUU)-h=emoN_ihdK3Y?N*^yAx<b944^ za<oQX621Q4!*rLj?{+JNosWXj{!VL8J}|X!_RLr%C!H;GVz(IoJEc5B#hh2kFy_0k z*1<J~^1Q9<tT$L?71u`gx|~b-k$9=mylmT^jh`9jeR1$sGw%CY&7{3}+ly3#RRIbA zq$kTB{&JUPLB&<JZFA4w5}&tv&r)Odm)Dd3ESkN$RM(QB_2%&fCuij7&fS@}uKxR3 zCA)2L`Fuv~&$SMJ-)ND_w6oc|Uum7!Jhjw~i?7<3pOW+QEZ%aA{gLKZmJNBvQ!TBP zlA<hR1uyF4^#vSHJ(ZkLn6af#_>4})bFr?;C#3hQiyJzewwxB>Z9U1)dwPmm=f{Yh z0W!)W+9B)gHJ59e+&lhW`_fF^<$^}<U%dRn<~Z~6i<KVhZ^+9{GTx?nsCrYu+FiEW z><;bDT(&{jW9N(AbB~)f%dvPonEv^}mij;Wt}XkY{%7}lJoPi9F;mrzXX`vOu5xuO z6jXQ8t)IAXj`Us`UUl&-;aJ5TrdbYu72VXXO)=Ro`6K2{&Z^SqTc;SrSXc+vU3%{G zGd-VeL+V;H^Frn|P0aUNZ(GJNotSy^O6C2aC);jt1qpqXaprIl`>P=0*e+HpRbZ~L z@WS5qwJ%gzXD{t3usInSlxmi^Hoe$;(xIujzGADF9@B`F&KG2V#mthtuS;n6M~Q^T z)As&*SrX!AAX%sJq5E-Q<;k?vWfsdkwmUAIkX3s7r_%$|*dJ^5el}jER#CL)D#x*7 z2WEBtmR@E!$N9(lDH&d09{Sw2QP8;l@cgEIh31UK()nDBfguL{LZ5!T<~W|Oc(l~o z-Ffq&HEmv2=N`*UVTh};X>zuieBzk_>z2uZO)oX$1#B$7Jv${SGoSVI*|U0aSL}_y zcKqr-Z=Jv<^W#_PcdkFV-|m|%Oa0LFw5+%0VR!p77pDZ<qm`Gx#+=wW{anawVef6G zsX5!-egzA^J;`=4^lfUOh)JzUP$ajBxZJ%@%YF9$KCY+SrdqN$Oj57uja!-Wk*AX~ zw#O9IhtJsh<oFyFr}qo_jx(2uHG5t46F#)r@eRwhfM*3+SqHxx-<P`*`cy4RVNI6Z zjH7+N-U0uE9~n#JhJF)HY0^)aX}rk)%+XlS)_aw?t+t%4e}APN*DgK(r>JmFoyV%a z?Qf&lbv}s)PVuZOciQ3VwwP_@($BHC)_XL|9<TR%BUQ1vXF6l%!S!2si~Nq>Pq@o* zbm695Hg30%J7woAQn|anTp?)274FYbwiQ$KmGXafE%~(Jl!)^x>y4^@1v`H|l@P2_ zc-wXQnMZQ#q?%h%;bE(H|4d3-J@>lW&q(*cYdk&utw)|+bFjS}yiJ7j*@66j_1ckw zJg2rc9zD*PBI>;}XKLxzwX@vb&uHANv07k@TEUO?l}-P%7X9vBpu6Y%lKPoEOKPl7 z)oo;0F|B>ljPK%pCyN=cakWgEp0>4Av@p+9FIvi`=K)Kk<m>Jq$?xXeNW6U3VA>0I zQ+}3n%DnR(BxagOO#2#LkagIHd-)APDTxJ>FKrYsnDozL-v_CUrY$Rv{oeXfvcYD) zQX2!q%ygBQ34787VtDWG2wdd)*5-Aw>n#ZeW{-6{Qy*4THK**|oDz9WBVF#<LlKFh zDNcgRTxZIzzMIQZy{KSC%sjc+s1<gTZ65bTM_L6g-+$_S<b{{%uTxL1Zk~8b#lCZv z@ST-$Q!=NfYGfaK@igS-ti#X6FGd%9zv`YXsb6-R&&>CiZ%ngk__5Aq@}A2?;xw1s zsp-|`>JKo<VNYpzm6V;_U?3hU%|6HX!R@KP{zi4SRjp4wX*;VeQ(d9aIpM#mp`fC+ z*QuW=XMZg^uxFFY-CZ*{H!Rz>czxyKMd8bKRxtk9&|n-@sTJ`4>&%<kmo%=<oPM&! zp<t!bb+^AC)C`tR{HkU4twu&RJC?uel=G>h7j6a|J=D5$=Ybhp4&7d}xpN1n=gs|L z%vVoOYmT`SzN-7dUeU?>@?<`2_H5le?PtYv=P9qBeK31-v^rpCPgiN~9rO18lbB_j zT9f_S-haBHXZxa2vu<JhyX6b-o%xx&@Zi_X%*e><-BU96Z;O<Dx%t)0GWGUH|LZu9 z@3Upt@<VF}^X{2vWq8{ytDip6`E!{2fU6zv0?i2w+(&-c{EE_OYe`=FGfh0*ZQ09? zwOzKS*V<p+vSZ?*L&nWVa?-aos)%wPdTFd{rk`oDao1LJnK$o@W;DqAAL-tqwXjRO z%l_kHPJ<pPHczAZZt*3xheS^PNvgErSe>9T#pS?Dotff6J~B_w79G5F-zEF>maO?b zEP9bL*0Z?ZAF5oMU-?7NqTFPgc!bUWqYFJ#8`?Ie9Zj;Fd&Kg?zReN0gJyNQ)qiRU z<n0zS>JAQn-R>DbooV{w|8>5nK6`z6e0z56Oup}PGOB+>RQSA!*9}+{@%iGT#VoSF z__fMktl@PCFTc>89T?mERYr7e{+k7f2^HJd?=P@(o`2Ew&jwj{nU)5Bi@rA;kF#F{ zdhL6Vb}PO>L%~gHPukQ+nP;~*Mb?T-%}FTWxvMLFH1kD~p_k?q;ggM0ZcnqKxaAK> zTuoq{W~Tf@JN329dge$baf?aS9$OOrTHecds#(a$Y|fnDvsNbhs3Oas@`XhcmMnD4 zeWA$p%92G%Y8tm)mUWH5uVaxLzItEO@Naf1e^;>eN*;G?bJmfLPjk=wtgO8jEv;7{ z9=7VmyfreX8;g>9U&MMFm@u9?>8$^ZxhbPV<?~J1*J`~pP1GZoHtdKoQe@z;?VFgi zsJ`CB?8uD=*`K^DUb_XDv7Jhml6pGp;my_h>fI`rL(etV<ry6Dd|bCu{eaSL;RLzT zLp$1j1?K*BU%|Hh5dYNK{vGWTt}S87Sa)(GbNx@TFG;&a#5^Kcyh5(lxqNLEwqt5Z zo%%8|XJ>tBTQiHn!lRFSrT2Z6ueVcLmvz9*M@aWvM`HeA{?v6(jJAm9>y=d48COTX z{ZYS2b)i=AuC)_io$~mx=UVr&Pqtxct1RpDo!H8qBeiWV_|4ZXpZr|ZNQcSJ|3h5l zIp%oNfLoUFWy?EjPVPD;ndGL=7{?#FCg$adFA*o$imSf3KmNOCBENmSzVpmtoqwOi z({<0ynLW+gs)}#ViysDBQ}mMqPF`K0ysc*cbm4tpo|y07c-%}^Gi27(ioL1vA3N8X z-0!=(acAK^CpXK>F^8Va{Jg#9(u;gmM*)#pCvP8_{PsTk<+3GGmHF{PwS|?>RTQQt zi$7U<@r;a+?Y-%{*^Cos>^UpgHZ#$WKPFY}^^BBfjI|Pbr=5JUpw*>kkH~t}&(cR6 z`twsV{?3rx@P)ZH>Pg%diztp)dAX;8#WvYKxEXNtfJ0JSb0Ncx^^@vi3(os%=B(CB z&bV)EQS!=Tca`Gx*5t>MSFcH)G+ury^yUNoPddM?H+GrXT$caESv5x_ddBKge7##E z9z8j9JiFMk?2yfiHRVr4wpm0bKXNN>;_cQIZIbZ%cz!N_QKxZNutJ@*)2a#Ur*n!j z6;Jpix<o0urXiu7>q+76g%Zs!hqv6&_31q#z+75fxge`uL7}ST{DJr>ZhSo}Uj1o$ zJ^lTW#mgpmtNppT(&xN&n|AsepO#-2zZM*u!@ka?kx6Iw@}v3x68xC*8M$I2uUfrk zxGu6}VV&7-<MwqAWADo|JG<92JHIyVuCWia%zmyEx!}|u*+Bn7(T4I<4F>8{PjMZ- zEo3cZRa(p5`Rj~wN88Uc_VJQY3$=qEo6X@kYCJ!Eug>hS%Rd&&FpGB_KKirk(8=@8 zg}kL_?BDCf9=`HtBb#FCpI22AK23bdb)@*${T*^E9PP8;Y`S3L!*2NT>Z!vq9iPkP zV>kDH4Rn7h7}6~6u>W{&EuT|+Wl?A2(W?RP&qhvgzCPij`Hl~Jf(0VXImKdk7V}>X zX#85C=rk`Zf8Elg^-E4!_fKb6f4S0S!i0bX_tlp*k8i(oerNu=CI;o#OU19sIL!O1 zw~0^Qr%YQ)D*OJLYVSJl(~q-OoR7M(X2KC+-Y3y-<EL)4*vzl8!f}4E>6N!rGp)MX z<}&Z+oRX(~FXH|I&fjn1OyW16EbH>xEmLs$d<yftcX2ib3mIORE)09zs&vFNbfLm* zmc{<_8&Xm>^`u`>cRFx!v+>Ef=kE%XpTA>YAGd7PjevzglKUf<Y%rJT=r5IuZFCAe zV7)wQ+HdWMum75AKTrSSP+1yYnmTi{{@b;4yW@B73hZB^F<)C%IqGb#-RiGFX#snd z+Po}O3kl@3NZ&NWxcjQ&Dg&<ipWHK7Y?`O?{8eD_n()7s((1dmg(XcjnGji1c~iqb z)788A$K%_=juO#bTC&!zpXx<dU9J6d{ZChUgPAPH`uhy0o}9HjVr#v5%jO2*Gat5` z{g!TatxwR`@50KbZY~EusZ9{zSa31$eSBlC$nRr+mVdj=Z>Q#ydAGQKM$GX|WhEJ= z_dm1t=Onz};ZXnf;+r|{+Lv4&X2)|D&D60!BYDlTEBRdbv4Uq4lLddB*>dFnQvHXK zp*ja&e4f1S;;pJjJu@sG-IDMq{J%JydF|3H&103TFTY(He1^%(!S(#4m8<-7cil;i zh&nZgw|tSP{?fwrH@o8kvX172&r#azQ0x2OuVwzpr4vKCWKQ#(JK(X<{LhL_Dc2V1 zteO@UbL)laVqdkor(Yw=vKXIUR-2Qt?hnt^gvM!R$~%&GJ3rpQAa?P6-0Mn#3#b20 z;r7e+<K~ddJlX#CYjhFg^whp(nMLdwIkNM4uEmt+S;*?w=pOnq!^HRmU(<qXSLWSf ze8{qj_x|FIQ?svHa~^%6P@pdUVuwKNY?lw~?pIlxKffG(z4FZm_I{1s!H-Oy`%5c- zOG(vO{8jz_OG6HmOJd<$e5;NLnaooByK~7FKlv0}@%Y1wS3f(uxi}@LFL}kZ(^KjT ztuhlOxGyh|pZlNVYQmZgts15VA{WH@1D-LZEf$%wJiRX^+>d`RtK<vT-rQ*pYaVwV zOMDQN&|&nv(S&RIZwJ=M6Vn1Kr`)Zbef+sqSnfT;%`*ZfExRhr`L@a`*M+_4Sd!x} z@phJ3ow*WECKg^6=UAMteN=M8%r*7QkEbPGn=~(BZ~F#2V~?hW-D}pg-;?|p80Nd< z!L(-+9llf+*-n~VdUk`tLz%g3byjsY>ljpZQh2{EcJs1yw&I#(>LdNKu8NB@=1bh) z^uU89yhSRDKPiVeXCBpTn=teAfywuMkEn;)obB^3+j8Tk?$Zw{s?Nm%s#9J?E-4D0 zFiV=}1}l@x5uT#5_)rZFku?#ad>`lBY5kOO+v%!$E00i;5Nl$hF7MVi*Tdqf{G@&I zjT$9OR3D@jR?lz$HD%U+tK6ugrL_S8pLVEu1U*(tE3-T1TXOQC+${F%Q(FH{zPC3x zYg=-pvB+bkoPsWno}Mn@Q?Z>66MXs?&#-!5q*kxfYq?o_zOaw!&h&Zzqq4kbJwN~a zrIJj(-|UM8Os`sHt1c%`JuG<e?EWhYZRbkH&)D*(--KmbRF?2DXVs@-#{%qr{C+=E zB`74ynm5?+3AfgUOAnndBu;(0=5A7s&5NTq<)ou$-OI^fd%<ODenZiLWy$8}75<0j ziT$n2NJyGG>3{5zRJ(g;89#2Ze|A>&dAnlc83m)p39$^qSL^p|i*w(zf9a7kPk7{i zXGI=!zT>8LD6e&y`B@9A{FV2&%P;-0`RoS1WW%+ub_!K`xrPb+%dxH5Z+%dwl6%?q z^$D*^R=r=|uE)Db<bQ+xh5n3N=4(!*uf8XJji;Z9yWx_itIAbB&d?PiQm^AS-}*3} zHFBp;wCC2GeYV^GX<SHSd-(VOXVIH~DWMCpgs(DhDxGN6qg%e{j(cBah{3bwEvCE+ zi-KpR$uPDt`Gy?dHe=hKMSgu%@|E|^Ryzwtos_DQo__iHQ>&da&p%ZK9s2T6Y$03Z z<oGiFs~b)&_AvZw_;=EpCAk`AeG^S)%74!?-15OR+*E%L_d)wh3#CrETW*ut#Kx%p z@OS;$uM(Vnj2&{arY~mC+aN6Sc+$3G;*)E5Hyw_4$^G|bljGN<uTDR5Yj*BAw%KQ+ z$m6UDrt4<P2b%bbzyBFyEx>!)kLlC?|7MED7n}7}CrCF+b)A!veC}$xvBW~P{@*0o z35{KQyF;5&c%Lq|DVG;g`Tb;Hec)lsN3NUBPwBV!I&}N{g*`$|s~TUra=e(yduGKl zg9TrXn|LVPkjm||IGp@<XYlgXNt^QPvZq{@dB4l=Y~P|yrc-491#w&rSp4zT^@MX_ zrP`v|$_c!ij^xTHXTOjwviZJx=Kg;st8cWl&OXE<eOR#L7hB7(KPGGmE;>i+zsgol zy0pz)k@+Ma+s+u4l=*BE%I~qINUrobuy*w`l_-Ww559k%khAL5-^1T$)*ZSlQryR{ z^VqYo$%Wz10Vzqp@7;gD6l6bP_Y7H}zG2G#9m&ZvA9IHE75wE{HYZ{0&fuauhig-^ z(l*C@yW{#!x-5T_*0c>AI}8767k;jNu>5Suvp3#Jm(9;uNL{@w@O>s%Lg2B>UnYjU z<=DLPe$nLyxdWT#Th6}i<^I;EN@msO_Izc=<c37Qys0zVrp*^+JbWPNlG$#r_G4!w zByEEa{4UrXuyN<N+xZU4i)I~Sz0E&A&hT!>){~QsxSw-Bxh_|xY57y8#!k_4;bh4d zwbH4}IDEG(*8P%uyVP^bvB1(ha*;WzK9#CzPm>+aik+0bdHs6xBhmYkQ&aA4@msd- zCD$e8V~$%@kNtkFAG|cQ#zUp$2a|`%k0;KO<w1<w9GGT0Xb68;oZKt+QDpU|*Dpo6 za#=4}yiWb`;{ua&NA;qX2UC134*lUy6x(eUy3<X_E>~#M`KCpC8W#LrzNvTRBh9b7 zO6RyqrLOBW$+vm5??)ZWzM`}H3c7d|*X5blL>cW^(!unoT_o_&)5|=+<mSfY<%yZk zejA_k@0BRW5|)2+eNDtSUD|SS{;g6wIn8%}&Yo~E$dkA>FLct<E}Mi3X1St?N5Yt0 zKIf{-FMiql_<hl3Q!62f55gWnsc-t?_TQDCw=Zu|=F1JIzFJka9#+4&KKA80IfFgh zO_i^nOybVDEp*LWz)7M>Uhl>7=<@5oCbTVG7&&uOyi3a2Uy<6ZYLm(;zZh^t=1zak zwrKgvCkfkkuUofo-$K7<trsq990|U5?OJKUvye}EKlW~FlL!eoB<`~;?2Sq?Lzu-Z z*<&p)M2|J~@o7mcuL-RXJ#qF^(QU6#LBB<*hf|o-cy$W0SM~gS!2RLO%%xY4-q6UJ z**dSFwNLHx%5V0f*G`3Ozq$Fo{;aPFr|qNvx7M~lDwXU_xTG!c@9&@R!e2sfH?Ff= z@#BO@?#Hv2QkF8$>{R%E`O%RhEqiAC`0Kb)?R#(I)pO@^%3b%$Zu{XCc_&pSX@>BF zOO4Geu2FLhcN^4PtXt6gYPs=cK3n66$Hm!oDVqABN)By220C+H7;<lf{NDV<cDagK z#Pg&#Q4jdK&*;s1%AWd*;n*gjtND$Wo|L;*?TmQ$dCzX0%)J{duEv?iiA{X+e}ntX z9q*HrZ|N~sa(R7Q^jWltf&b^s<ID^%U)nR)m&UA95ve!RW@vf!N?_)JU%xst8+^Ev zeE$V3{An~%^pAbzn&e}*PntJ<R^8|@!}-<pS51dc1V38Idil^x*7}+`rRCPEE8??^ zSseHOKNIPj|1U6Zt-qhPX7nBF%N7i*EDljO4=nI;b9P*vyKR@t{Cgjk=$u>da`Ll= z!Vhy~<pQVO$@>!C&1J4XC;f_i*WrT)i`ASHnm1(iZM68`?|IKK$4f5RF;RtMUk&Sv zyXVR~U;kNoSM`YBl}!f|WV(N}?%(@err=zSvm?{bk{MwKXZ_Dzbz!M2FMIW_v<Qa{ zzqE7yzGt6tqm}Oh(>aMauD1SdxAy8i%NIMB#PPIo!>jd`VazXeo-E!f`}U=V{an2$ z{Y#-=11~K--hWc#-1R%``WJ6G9Q!60s6A2djPIB3r*^_qa=o}#oK(9qjVU;<v`h7P zgK0pEkf5@2qTjtei(b{21;|gI6*?!_AU%DCs#Qw*i~PykemuIzUlR3q>$97RRZCuS zzm0v=Jw0ODeAcViOWEH@oV<4ZPwL&p&e^Gr$=n=gXZmLOF+Q&2+L)1hYqo2LZp7sU z6Q|5M<oD=??t!T}{uLG6EXg{B-z?UxN))YQIL>$C_O(L~rnY}$2{$V6-j#CvP`&A= zkLuf5QdDj2H2-f?RJc%Jt!Y1Rol0}a%dU+T-O>i}*Z*jTTYX_RdVWjtk&2&bQI}Yw z1V?6@@VDB6gED*FW=q_+T+qO0oV9sU^q#fJP96*&!csgHs*EL1SuQl#u##za(%rX; zn<^K*c)I$K?zM^U_Qxmfo+-Ba;w$BvONuKxB&Und-g?cZ|KYhDnP1VX^!xTNJS(|I zAbkf{?fPkX!6*MuTOH@*;{DfRzGrHv#>Z1rw2EVLd{+0pJLthE^(F4H8<*#@$<9){ zIeTQ36Z|||C!BfOsI}Kxz)0+p$%p+>E}!{R`6W30_60l6Id@9GuO{&3$;ObQ^>adA zCVySEcY1Z=sX#sPu31aJ_1Aqlxl?&@-Pbi59j8-gWCkVK?EMyOezq$A{-kD=h9_2! zP8_?>`H;Co<j-8;2FKJBo0l(@P2W9T-{!(!vB}9(J)5IviO)>cl#`FTdOu+MDpkG5 zi>29)av$8UX0QJI`Q@%eE{@d`d>CiO`5LE-s}v?jH%~ck;t)`h{Z_g7Lz=>_No{eh zg-#Aa8lJ&N?mfLA-e|queEI|%r+uc<8}z@etF;!jk87^xaGk{>>mK2vQE0uTRp7%7 z$DI%Rk6k(`)6}!{_u_mDjdI2n7t$@Op7V+FOgYm1v(^00m3Le2-Cy!4zS`DiN506W zT`}iB-d_9COe>QA@*}Zh%l7^_<+j;E=9<dyr_v0O{+s_g`#yH=;un3zb@k-ekc^4- z|IgPxm>zF5L+HSj=?XhnXiVDDyzAeRRZ2!d`od>jwZ6wSDE*V)nG*9MQDkvbTK2{! z@mk4-JI#7;TxZCnz18F>_+e<jL}}vW*<wde*?n|5baTo7SwY$H>!y0`s$4hKcc}>f z)V-T7>}4@8_g<16zwDaXU-wgO%C_@gIHl=(s7($Lc$WT?amA6)b5AccO*=Dv3fpvl z6P7h=uJ*fMIrj5i%E@B&rqilRKUYr-U+qxfw5<HhPGO}!jVu4+Mbtay6+YBs`hRSH z^AU^xeGPW|?EM}oJot7ZS!7Yb@8%3cr{3>Z`<G7>&YzO_eYMNOkFw#+67|=_4=S1* zH)E5Ox_3mq&FNWT3wKM(jHHu0vTS<edB3y&IxJqhyf@rfM`XsC!#{FVKm3&Wx2)FR zvnSWY{lw?w<cpRU8>`PfP~cd*aci8SMX}|Vqt34jCa%7^jg4u>$Aj|}>Kro|?K955 z^th*b<i2>c-XpIr1K&N8bA@F~R_QHd@!?q5vMYE+32Vg9h@j(7tp(XWH#+DDclvLb zJwNRD+-|YwTql&CoGt%i@boB~Q0lk#m)k4v9>3Te(sg#$)^F{$C9CSczYDL}d&YZF z%%Y-Y{BjI>7c|0OJyVjd{-@B())I9;d12e3^n1!GJn@IpzXwmKm1&jsa*kk;Rl1Y- zWX+j_>m$BQJm{?B?KNLg<t?{or;+BpRZm}(YCkK8(21Mz=ena^d*h{V?bDWi?z^CR zQ@Te<Ph_*t`e4?5VX=27i|?smOp|Qb_GH7)3ihNQ+RHcJo&NOFZ=u-p`<Agc$870$ zb@lOTxwvJQ&8FHr8QxXKu@V_K<|MpythjW(=bwe`RloEbneWaqZS#%Z+8yaCes7{t z>HnE73%|<U`e!8fHmGB7%iY;F$!EkH*Gaspa{GL_(AZ0J`9_-u$Gg87eb3z&vH#Uv zBfi@=9@=i&-rBnC=F*56cCqt4)-PMgTKd9R>h|=hF$ZLMm=3&;FsKZ++f~@n+hAfb zF@C|FM|s_T|5>%#7oF#Dd9>hwExUi|v8G8XeBJ5BADx!BsT^WRlIH%@Fjr`^itk^u zd2USd$FG}z>zux9A+PVAq<hSDF12#|AK0%n@;K)1v*z5Z6=$q8?Ddl`&-+sQ$mO|C zm)O}AXSh~=t`Uki`TX|sS{1faI?n>M&381fI_#vG`g@vG(pSfyte>X2)jw2yc}d|a zb6wC1feP6LoEd52v8T>7===<5s&Z-BX2)Hlvb2ojcBUZ9--+!_8Z5mp|A;c(QOqy3 zzG!u4=7r`%K|;dE!!9UDZ11(;O|g0_Bg?6_dfxeJrS^%gMSARCcBe9&{;=swje(@I zLeN$puS`Fdn&t@3p4C^r*Rz$b{cY{3G1KMJ<O@&w6>cg|$jM%<G(SBx(B|8Jc`m(> z&$1IINz8n3GCDmi=*Wi~30%xR;nlVcRoA&b%zqsJcXPqRhwX{4FZKxhiRKG5bicRw z!MPfHt8(ifzn=H|se}cb(leX7()ZOew%3PM-ZO1kc<|5#fpvA_vz5Bu6pH9gtxxa0 z_rrF2NB5rmWlJtTIQdqfiH+sWVGD&{Rgdz;nHEp<V@b`L{G@nS`?Z`+2gTEq3-0lM zXNkBVIO(KBVLP+Y%OWOECc%ea>_6RF^B~XO=egl3*BZfhYx1_T{}DO#<OcJq=t6Z7 zhW4Xdlx(ct@XrdLul%1~Fn?j8N6L(bGXbpM+?M5i)Hku7-Pq+|B!9>#ed|t+HB3g% zEIw+5nI7@g8&>Xl_&cre^LO6B%$Z(xNi_=deqEQ7eigNsqsh@~dZ2Dd$p;<NuVHoa z*V3O}zw%k<s^Ow6x5~v+b!JTctN&@Ly^Ti9ku_#I!jC393Z6>Xe&lS)-W)#DvojBC zCdpaNIv4b>@4~#6=SEr!Hf%Mtu5c_}8=l9U6Y6vQM8^+vSBdKBd6Ql~RmqBJUG}YH z&P)4wubcyx7A~Fir0VCX8%&{R{><l@u2{>q#y!j}ed@Be-VG-{Z&`m?FlFi1ScQXC zGn_WNKDkg5;bFQZ>FNIeeerzFDqncGDod4>^S<+c-?#hGq=eFAO`a-mZ6o??uI4Si zH(9lQ@9Z9~hev8NmtKt27PR%5Y4XIhqm@lj<goZcdC7~FieGrVm@Jh~|NonRh-*Vs z=gXpuZ5&cbHyY)Z1o5%hna!Fyb#^vuV@aB4vts@vr3c$o4mnNP^ZRwmO<U=$f3=?| z&fO$+#VF5`-Gyo9uj3H`$DevIT$nX`_Eb}|E`I&hDRX4v<_WIi`zXtL?eG%r+%PE> zQ~k@8XKz)eXgL1Sl@i*&en#W3+=8NG{oBf1ekHpZ<$O-AldgQCkhF96Cadd{E;t@4 z%()%Aujc(M!zOJ%2fKfoir0hQZdU2oaU^2d*~t1W3McJ<YG&LyvOzu5cUxH31jBiU zgztt=*G>21UM_ez+iUGA({D4k#b+BEi9VHM<xhT+wycLg#s7$+`@G9LdFESZ9=+3} zvOt+-_1alN{u`&<yOvgNzGeHWX@_oEKJu12eJ1t7l-X}{12@H~$gMxZv!SxuE%K<z zES8*<d+Tqlm~z|5Lt}cJ<b1nrTDfnxXV;kApCxti*}fHz^0#uhwHiM$dwOh@{q#-u z87;2sm$V<Nc-`~b{r#+{CllrS_W0(ol~npy%Kw#b%$nJ=<L*zv+R2YjakTQe`93<e z@8qA3yM;Vyx-EbHm)3J#couyyVP=?4{PvlL?@rh&Q=kwwp>Jam*XHf-HvRpr$Ekd^ z!|c1e=+Wl}J2X0VtMv6=p9(2_%57HMm7aci;>E{3qJ|A+{ohJYR&ih1JDWMnXGUg| zw#~zvlWL#XE@dv^Ua>{j@4&vK0^zeZ=RZx|ENJ`JpvPF_7{lr5r4LSvFS$@JnQ&6! z;*Y2Ic2vCH)o7xTr@qaYPwJ#coUHtF-RGA*Bnzh2el$93Vdj?=>Gmq(<X`W@Za<H| zzLx53^M8Yibh@ZkwOfmzn1n9>CqAC4rSBj4EIQOuliS67&6VkO-4AKQPywGmce&3p zmov}S+R(M^z*+I|xeON%Z)bH46Ay8}=JQA0-+ztP$MeReZdM|5<}WyBJ9oXmRf%;K z+tQm)U-6ahHe2+z_gMCV$*saF75nd;+p4|5cDADcbG!C#-xo*sTQalc9`pB0f5OnJ z`1#2OE%#TGD&qcbbXtErRC2o5ruA!rBoxj*zrJhDwG?A##R(E;YR*U<JZZQk{Ukq2 zn_W2nNv53XdS(?j)T+3Q^L&n<J}kRwQ&!vYvln(Oo#=FBN0`ml+S(Uv@AhRM=+%5A z&-HH3<3+|5952r=sd0AP{(fe?mgmd+R#H=xH}!M*zFPil$;J;KoTAP(l~zd#P1|0* z`jUL%>B(YBmR#pf+?y+1{3W{Lte}$G?x{C#A4(2-uyEg;1sPx4WV?gRSA|Y8-lMc) z(xE4r)7w@^D{7ce5ZgLA<>xV{sJP-ArtPlTD#A6aMe%>#>-X7Z|FNtu@|KpZ5z=0> z>->_~70hYO*|9FpmU*Ysozj=JUQSm?v&+j}Q?#l4JliY%3p2lK&$`_msm%S+#(I*o zW$$sGiHGylz0CAhE}C*Z>`wY6{VV6$uKoL%|I>1t#k}bOyEH$Fthsvg(X$;U$7N4i zJz$#j+reh4neH4v=brhd35w|~`_8_4@xx})*?yxgi`Umynn%Cxz4JTT|H=0^7rXyR z9FaI;F*kv`#B5fhv6$kuVC%AH3O?->%KIwXzNam$((FE)y4WhRdR<5F%AEz7Gcvp8 zTKh1m&3>~gvS@R<JD=s>Q@8I;dKx|N{mF0o=fAp0ZRITtY<>13=lqFlOIb4%qsv8- zo;rK+PhKP_@quqOQ-Pyr{buexyZ&D;cM>x)ko@#{Z+yMchLxZA%axDmbFZHE?8=j{ zyR)se4_Tg`*wWTAG0HGWr+sEjrT6{y#dqxXDK)eo{#Dv?cn$yc8_pe(|1P=~iK#9% zJu)vZ*Xz;NUpGCU7A*g)a{sBc&aQ8-j}(<uq)t-R&vwf^mCn1(YyFqG1~<)xC5!Kh zEZya@#_x3T`=n&0t5YI#%TmoFdfwb^YkC<TJ2Q3qoM$~+r+ZpXt^WBZ;_a>;36ImZ zl{21IxVBeB|2*k<Zm~gCLstt!=1uSIGcL{C7;+%Xpj2Uh=Lbcj0_(}X`j28Bi5Ldh zFK|9TXZQR7vzr&=yY4gJHFQ{fyPnhc+$z_XYzzGFE&ml9Vk&1X_^aXaYu3htJWTGt zLi!JPNUS-*XflcEO^o$5)=B3@&EvVRF*cu6u=wJfxcuDA%kx>@cB{wlwV3T0J&~>G z(zbg$Zwt)Yabw=Oxt_af7*Bq>9Pa3TWUE8=d8s*#>rcC^V-OF!@IreXW4No&=?S<0 z7koPB#-sZuc-7^YMFO9kPA?H(p1*E?_ujJ-N1|A6?_A2r>^H4b>Sl>5M}lC5s?CNL zTg4ylzeV()$aipB_ugQOFtT#;Jiq3Kx!ZG@Nb}F<^S#9LIJ!mNO}OnOu{UK}&xP&B z(q``GcVYgVpB_=PXc1?jw}7*a_Jv1le8jW1yX^>lx0KW8z1!Y&>t<E&t=DhOe6-Ca zWmU}SrgW<wnf+oKrZc^L*!X<^Ex01~Tjhm0=gA#*yxd;Xil2o=1x~L$x;5!>V29#m z!R;F+|6TOETrIikp-9$hk%AX3pJxPfFPAJ=Sj@6`ZrPu>gaW5c>Q(U#I-jp^SutU~ ze#x}rq*sw$4s70sI->Xe@>S-ORa(h<gXw#<x9$1R?{oL3UcJG_>b3ETaOF!iFJl4I zn8kZKgT9xC@+G&sHc2~2gg^Csqrf#;q(V3B#SG2D55YmQe`Zc{V$YkZsqkaZtz+IL z%Ra8VVzXco`^L#hKMoz>ZG7>8!)`rOfA6mYSJkV^OCR4jo6F=l>to5^sWbMM@3(mU z&PCkl{-iZxx4y}JsXb+TyQIEEce#qN#Ustr(;i*rx%IKkH0he<{7d!QnBKQ+(KK1k zce81MqIdH&rt-Y+YCqPC?cgjo+oZu`-8$(v`wrm;UVTkVIRaf~Yz_LsE%s_Uvy&Jz zTWwy<A~wsXz9Nz{4lUW}Wh8X^pjz8p=W|;*o+><JKdb2d#+*SwfuW_=mnWi*xmwQp z`p2|}^QKW;nTM=CSMV%nzbs+f$GLMxv#r6zD{J?1x4%^TA-v0g`+=Jrcg@z#;vUnC zIpkEctu{Z|a_NZB^Qq_kx$;&yZ!^9aZ1PL)qSe~gQx@yL>|y5X(XQz^!FKYGOJ=e5 zZ2t*G*Mzv!erL_+i0KerP&wgWDD!i_h@OIAnMG?4#4#|<s<Jri+mqwfFk_SH;u^8n zF>A^sH|Xk?Kc4m}>s8xP7tVhoku9t*qs;PC?zk~oDZPyqjc(%f`ye*mYnkP_4O_!= zU0PG~LM_yf2JgyzxP|ZR%H(s*cMfjPbboce&CTknyth$x`JPAnZ$124G>K`l#XaNS z#TRC7p46A-$G!Y<+>u*bY$KluHW<XG?mxk;A>y}irR$@WYfi1}Sa)j8$<2m;yDgr% z{yP7Yb;_#9vy*#r9UUBIYhC(v;fHYPq}LwLE-taQGSQ7Yc)dBjJN<a^cgBXqN5^k< z?VEa4G<7TUABC{$uyZGU9@ZPiwLdz&bE#>wBgg94tNjzF%bep_C9|L+K)v<ahN@82 z$7~$QGcI;Ke9<j2#lx|apDkY|z+7RrQg|hQkia}Irq$h@`vjv*XRUL+92oWZ#wsbd zofZpf+M<~+b+CNgE)!l8oUoOj`P@8RZGHX8xf0yPDciSLZSuS6b=vCPq6eFoY)o|# ztFy7bEwwqNaMerW0x|t<w{IS44mue5>)0Hp+$xdGG|%kU%fnNp`z}`Vy?H(J@rOGO z-u+CSCj}Q3h3Ktb_q#O4+b=7u_SJ{~&qS6P_Ah;Nt5s>qd=LE%R{I}&bR9qFtWq)4 zr!GM5ao)12X3Gx?-<Fts_T&5e;`i(2J3UOK&hL4&-zxdcBNsCk&(+ES?b^%S?6~K> z6pyn|TGc&kMPPqGMAV)g7L5;{30A9KY_j?5>E>2&cWt!Wl^=@h4hwEN^XKh$uO_#G z&i|Lrr(5ltw8`kz8kVzvihV6+O^{YfvZ$C*vTILHNR#`^2lgpOx4+0Q+J2qawBtt3 z5xphLGIoX}Tr9m+d0LhKec~GNPfa;#Mj{1IXCEr{`*7=c?qchkE~eK%9b0bqZ^QP- zOXa6N+!pnd{d4vcw%H#fp15vU`s3bR|ETimiE$m4zfV1G`ro`*VOn|LG|400x$bpA zH;+3AU#psZJNE+HzY}ZbGW$(+?)-Lb?UKd5zPlbDdc5n?r^A!P9VGVGsmfRdPns({ zZ}Qo^IQgzU|DRu6!hK0yCN1N^ky#V=%f*?*J$jeT#HF_UzX9ha{aMbp1;WF1xbMm& zmPxQ_l~3GycgeRaza&?t&JH}~_-bOFK*f*OOz-WUJ&-hz-<~y*CDOc5O0~IDdsWsS zZRW$iX%|-=kgC7h<uaisZ;{b9wQ8xwQcBaln7Np^sa8+u%Cww%bKZQHE$ob|56uvo zaO<MKm*XO%J6>9niW&kPleD=fZ@i|EP%5FE|7p^loo~-;Pi+6+(D>D9>kJ=vPl4Ur zRhG{6oLc-@S(#hx^a;~M2W^)~g`SEF8+NE{oz%0>UD7mI@@3GiTv;xcrWfanW(M2u zSu}ad!ms%PA9=dszR&yLa-Mf-_@XS)j;^|EYq_UCzxqhTB<=6dZ)wjXKY1LU(A~LP zf7y%^oc}%d>$Hh3u0H)|UA`lmOMR(T4wKLNrc0|YtY2{~*}fw4-O+C|82>e-ey#1E z_@QO4!Mgpd7bB0K*^_er<Gc@duWt<9)4=1nYg6v|CvzI^Ke~GSQ-riua?G=$YfMoY zV)ym(BX(~rKYTBn-&|nt!;8wYj=TK}s&yW6wzG(Kn~Q0_b&UM8eD{ZAjOCK6`<v^^ zcAmSE+U*-0%Hgp@!lZeAqFV6x7dpFaO*VDTpV)Y8f{Jq*ckkL1HW8=IA}@JX@4uP) zE$zj$Gi#PlJhRKffbjzF*R&_Qxs}d#OzpX|OXj_Qq;E@0s$~5oqesRu$3i(+0;6Z` z-Yt{)tLe$kINg~>DLnpq7pyPsnzehSu0TslX8PRy%Bxh%b{@{Xse3l`*;=l5i_=cI zY^#oq@+{P}Q$DyM|6h>uY&)T?`|>Piu2NmNR^0Qw;+M8}_xs=d>-+KU#=dpWKR)`g zlfNw2t~9m7x@4m9hDCp_{I8zFmG}8-XCcpQiTr(4MZ0^KEs=N=c(HA^R#~1wp8u+! z^Ykw~+#$ytbM$qC+#wyYee<W5A8dBL^RZ3PG->UOiFUWQ<?%N>J^nG`<e|FUnVQ=y z4(DFU*3D9P&742c<CycWn8Ob`0`raY)wz#q<UgJoT5mYBZoz7H6B(<BG=aTuN&|kE z?}}Nq$alrdU!pxZ{1)F%1~~5JlKS&aUhHPw&+g)F=WZ1ok&mjr!Pijzy&-lwx9G_g zTSZoVJJ}&_e>11h`h4gshT59E57z`M#d(s_bj(CsoIN-6D)Da!`BuBB{Je2`u53k= z$?8c?wgKJFZbocPX^v&8JhFjOEE|7EPG@qT;UrS(ugo40<@{pz_6*U^3lp?7d4w!> zen`B?e2G8imIKdyv9I?WocR^n)mF{lvgg)qtIW4|zS)W_Jd-ft(&fb4E<N|RoI0qX z*;r7}&3$8o2;bC;aR$uU+>Fz{m8btbp|^~md0Fe_&1Z8DUCOC1F_|xNBje~&KARNr z%{d~B%X21ZC;mCRyf*IekCdfTo=#@mY^YPSd5gQic9~mGddjz(o>x@3#?bJ9M<I2y z@xi-dT6^3VIG!);ILPC=>$CIv?^c^{<vhC9w(eB9$$a*X!j;eF?X9boNh~R-d?o0i z(&l!>MzKFZaA!o`xrXS6lE<Gt;rwC4G%xv1jM^#o9c9Yemkvz!5DoIo<Jcj~!?N_3 z#0>roKN!wDTdZ_^Giyv$_=lwAB^5da%3=v-hhx8;o;BNGSM9e&X`jU=?v736T(j$e zo>jQO#}u2R-+y1z)N|Yz&tnnQb=>&EWerOXxhqE%9Dc0z`?8yf$w8?=MNWb7LOZj@ zhhsYXk4iuKswCx<zQEmq`v~Ljh2@MhzfF2|U~|JI^{0=2F>n3)VEP0Oj$KOph7#x3 zHPknqUU0cVkYPWg>=MUQD-2h#{rYL)#Kd@Q6*r5C*Sa2OE`P_^ZiTo15BRS-ePWF@ zPv}hN6qV{|73L#?D{OXknk30C;*wQ7I(6ri5>fS%FqKI&xE;>!wO;EjHut5`wNg7l zB?;c6%>Rn#PF%s|X?e*>@%7zFbHW$xoj*@5Z@vCGzwNU<Z7#*+i}1gjnq2*N;knOQ z7BL$6%Y;68C-UgOn7vizsLY)|5?q{9<rpItwBNjPyLz|m;)&O;M5!6x`!F%BZDP=` z7~#DV3J<^f9JJ@*be-8HmwN6gPwLF)CsOTxJnz2#{P*q8myed*(4MjCq~bCwZ|UPF z?w_xkdtjrvU#5NXq4TOcH5|^(u>Ur3zrJhA8;(24^Ezg*R7Yp}?3a{l&^hr}(JZz0 zM&Kc@YH9Ir3fGsf_z=@_e%^9hzFq6QRp#$~Q+~PP%6{KTlWn{od%RIquE;p=@*?k- z#vZn392Hake{QZgsWwYfB4pz)#;#kT>6sfmA1uz*m>{-iiGzy#tP}I6u<tI+*z;f~ zYqr((FM1EM7-z}x<}{b-{9n83ha1C|Vv$|@9~BrJetqML`oVzzNe&F>9Q$@`FJ(J> z^WFZZpLKYyG}k`fAiQVlZw8TDH%=U#sPS)i;Z~oG^AwC0Ii+m!Td+yPTVP^H>JIKu zlNk}wB{M$=cR2mJeZ0ljeBvxa=T|y{Ub(db`SAghQgdFMNn7#FQESnqJfqu*U*5Mf zHFssc?^xi?C@PVduPr<)*7^w7hm|$E+(jHyR^QP#YuHdRnR|0y`)<Yu#XHvTQWku> z!0J-fhTrDr*%JL;D@Mqf85itwm8rdzCufqeI+laS{Q4^+|JXf+cb?{DIQ=&0pR%Rt zxT??8*FK)L71Na!rv;dYM=L#$x~IJKmPq2W{RxW-%V#njGf-;O?7KN@p3RLfX)C#` zl#@0eF?+ehT9d~*-*3xx{@Bl#XDq*c;ChW-*1ZEunO}rm<nrsExqB|N#W5$F6_0i` z+$=E9tX<S|hH=jOH)SkB`d7|A3SPBjM`Q5j7%BCqPec;$t9QseW}cfUS#d|<r>{@E z(2O(o8?1a5wyDZ!R=@IQ;JTr_DBGc|NKX3Lb-iaAU7mls!`v%m9&T$byCgc>s4w;| zpJY~KeDtM!@vMXAMOx1YDY^=u;&A)!&nLgGHd@rHrLns|)uOB-nl-!mgM-EFR*{}> zo9r20$gDaXyCYh+XMZ9Kw>EF(<QO-dYUPD1j<o&yqM~7z+9NA)`%~z><>nre9g-7g zsEV}pe{4K)b7k}vq5LH8^a)Epxt)HW$tUKnqmcH#A#~$cTdUl?9?7{cB`+>2;#pP1 z7L>R<fPa^@%bD|OC!grf{r7)!$LG_1%_}#Qe#!q8U#``3#yEykm@g#P#___3sZ3iG z!e6g^xbEF$;r7{l48o5JRtdXjuv#bH_`;^iY`C~9GN?t)<W_iIPv*spwOx}YEfalK zQSf4JzJui&$D2o^r_6i!{@uN8r#IHb#fIGdKlww4Uym8vfe4EytEx5&bILsWA*9Y} ztNrpq)6t$)HO3WZJKoI~_<VQ%%`C<w=>x0Y)E-NUoj;4=)V5%yCl)RfeSCu3w*~Ee zC$wXB-Qt@k%x*O(XI+b#%p_6TvVWO>`flqZawW&ge^mP&d-}<Kj*#@PPiL<$G2Pgg z<?O9}wT81%q_@5yXz3g69v7oOOy%mHuk#wKW2&WCrwf#p)aGU-{XN9BL*(B6SDM$- z$}7IVeEs=s=o6i-%koX^_2lC^Z!Vm4*}ywHVRu~Yt`!p^pR&4KlNDSw>4i=4xta|z zkDRnDn>f!r|C_p%$L5xC-Z%d>U-ca4RV5tJ$&X)`*OA=%Avko!!c%+pGrO-ieu&|i z%1e{Sk4`@2KhZJERCSZXKTGwh4bPN9oMiWJ=m}hXb-L+v8`To)g;QVu?M>em@Ye9r z!ndBs3ZKjk3gEsRp(YhMyM3{Pz`?I^tP8d=L{|Lya&4pLYs16w-U>dMe;>MOavL%K z(Ag;K$F_XK`8qBC^i((DmwQ?!>UZ7FUB2i}a>epRS1!s;p0O<@QNHlYo&DjwC9<=d za$kteo9C^&Sb%*;5tsMbgPRt+O;cbfwz&MX%y03_mdQ-T0o9EhRstrw%R6SzJ^v_7 zs&dki4!Jk0`m^**ZT6p<%-_aqsd31ZL-%{iK7kqc(gi%dT*Fn1T6(lwS{)^H6ZSmO zDExBxcX@vN{wf8%>c`9;&vvi->hNMQ?~9LDudM3S_Sp2zF4(*3sg8|6U#cXx(M-4I z&n0;)wq5tibh&F+u;yBP5bKUP2dlXcaeJzqO-OC6tyX5au+VzC;p8IgKm5C%)o~tg zvW&Z*xgpimjDO7y3%}Ywu58OreHIN2DwLE<xSN+5%Dc-{-Hx}`K!VpIUpn#4EK|!< z;)*M7{gBGzP`MT3o0Zh#$L9Ot_a496+gCy(GgS2=XDJ+sY1-8uQ2%$KoprU~e&1#K zAJ%Zki!s^$4Cskr7wumcsqC>oQ(aH7xyWSZuIEqxINkg)^Szu${#V5(m5YNP89vrJ z{!^sjWycHQw&s*0*PYFn&Me&ZR5O>|D<m_&(Tl&Zma8aT$--M_U2BP|q0K${-+rD4 zS4KWGUH|FNtHdwYcb|<Zj5u*~sz~k8TN}mqb<K48dm|+CoNKuB?k!=ho*Y+Zm}YN! zB9>6}+vm$qjl16u+g4W9?AX71@6LU5d><LU>bdhODDG2EMvjwqAU~7p#Fo`ALV}N* zmp)~($a1;BF6#1x&$9oMolKSsZ||Z<3=s_u(ZUy>FYc&I^V}P-c%T1;zmIn_J^$?- zE7-~|!nSRF-`}@4rpT-l_+fd#;AGab&yG<`3cgR|7G*FhJ3EUfa?jFt+G{w>cfPq< z*<N_he{t?FmP+pznpIPx-n%@IKjmV{ov}T~@a{~3DLO}85~~j!(Frr%A3XJmnJ|aJ zrfWiJ6YMl|cj;dURtvj3?e^@&7Y@&KYMQv%Zl0`&qI|)A%~0Fr+uJntG$d5_u`%#C zDIT8Pm-mACz$}kO;}tVJ4?0g|c6FCiDNPrcUl1p^AkZ}1>q*1J=Uj`}b9A4WJ<7@d zx4hFcZt?@gE2o9$eL5T2;ToIEI%`5n<J)IXcCvS@UZlU&hw)LyJpY8r+JClo8!wWx zox6bPhk?=@!Fpenhhm;Dl%M=PAmzNjVn_7Z>bKhj=R8@?m{)8a*<W?zxJOAt`FW$D zE6lH+)J|SgH<dAlecy_ZH~O6(u@|o|bGJFjqOSIKaqp^XX|uTtwA`A4q)eLIZi(5P zlbYLMQ@3Z|jePUhSCi~MbDPH<-zCx$a5>_Q_@+xcUo!t{_+lp?{#2yRDYkX#M2m&L z7XD-@7LHGA7wTV8oo#m4XJ(J;(z5|O7uc?MDV{OW_aOg_%<bzxUR}K-Y&F-(#m4um z8vipbaD2AZY>LlY@ieZ@I>OTwljfW__V-<(i_z1V^9)-|oBuLOt#=MdF6Z3+>+z1; zBAjm}1wH?5+{Y>{z~}t+*s57ermH&VpIvrcQCv<!R3-g-?s}hDySE$*((asa?bm!+ z^>_OW?N_ddtJ7nB<@J4jY@c_~*=5`(T^k?$nDU6PHaXc(r=x0na@Z8XIVXPqz0qEF z_0yV`ocUaif9o!XJWZK*+5Xft*9so<4C6Q6FVjsowY-><^i1{AFO#P~KJj$k6s&Z# z=GtJ%ex0$VQ-8mO&hyPLQ(`(6pMSY0?MT+G^*?{Uvu$~6>iPfZKD#|KyKe3?@M4)> zp8UEX;HO<n#+g~BkwxntXnXyAaJnL;>}~&#jj?*qxb8}Cb(_Sy@b@giE%I*f&P+&N z*lcm$^x2Z?H%2$3b3X98-!zysaqBgU({{ZxEf#R^TEY7ucK*Yg!MReqc4<8hJGsEl zW=7zlYYS?+F5Nx3WD2{x&L5udi#YjZjZ5xrDqd3eeBw=umc6Fg>pT;e@i;^?Uz0bH z{%~{p)1tsm2kYyzl}+3vZf7xYu6$W><dT?R=q2VT=H<dO#5s*GoX_?sS-4KI=FiJJ zmItyYE<33%@1wZ6Q_qRPKjoy>X{Jc!<7#Vo7xpweD%)ML^Kss+m-<fd@{K8mWzqaj zE0%7V`u*9;NR3Y4n1*0=<vs0Xa!+k{I^Fty&-=5K-k-ZxYO&cf)EO98mNKq%t(P&p zYTOstpQonrLHqUb1g5JW-dFGVF1kgf@<HuIQN8^?M3|1YI0h^fs;`)&UBs~|IorHs z-7O>SGi8r=-HDt0N9T#|-826hEDndyn$NZJZT(jJf06s|D*0tE%&Kt<%Ct}2w)boC zsqMQfu4PU*u|c}gGU2iFlFL`ky)u0#%I}uDctmR1<1?xoGsB)%xE9V{q%Sbfm%C;s ze_6ZUi_+;TPRo@Z8cl!SKH15onWwNyfpMRUTLcTIPD7qnmhj8{e(Wlo!3kEG!UuoK zDjnY%!68@lgZ+?5LA2{$CD*-eD>qc_+&Fm$1KWqA$?eK~3pt;dDp{|yy0*dZ#~zO* z9bXnXC`?q?{?TW4ALI1Nb7S-FybnLW;L6{&?*>Kx*J-J#)t_sSSN=F-jr;eCiF3K7 zS8;T-c}%i6oAoTPO1WkEDV3a%s?Sd!75C;@L@5b9PCw1ac0-(B)z$9pvya`^m(N~( zIB)BU>!Rm{{Ju3+)z_^J+xS4^hMn|_yB4-98`fDoxH#*{qsA2n8xFj`(vf?8v#kGF zDaU)f=MHxNlc<pOy&yYn`{o}hAKsn4(AfWEvhka#XPQ?oRSQY3KFpZ<+gEpq>ypae z`)6;c8h9;h5jJQ1cc@Q`t0(;N_XLT){Jrm;Sk|r2C_Gss9x0Jjam*kr_4WszNnI*A zUOKON&L^uKer&5`#(Z{p`x5&c-%WRnWc`Bk6gQXgU0>GW;dw)Bme23>B{>t`7pG^x zU`d~D@rJMa`~016YZWBt<o@3@E9s%b|18NJPO{z$Go;wB2?mC+sYEL-4a~~dcxjk@ zEk)z|j{>W!(+e&XR`8tZ*nA<Q@Xwx#x;wcOI`3L32j9Mu`NZ<r`cLK)a?Ca)E}yxY zHRJ5NfLXsM{bFiqnsu&k&BDmLit`?yN?NE@`?$2&_J*rIgYN(BJ6>LK=Dv9??$>qo z&oe$WM{4nMpT1PBW_G9D%vM)8+IhLFQ2QO>i3R7E>WgJdtUs@yV|ZF~_0-Kb(>RpB zYFxSKS(g#_?S?|GOu*m2Pj9cc`~T)KzutLsZ$<U4Xk*LfkFO?kIdqpZEBt)6+_utj z;ttNtvKdEqyy(%Dy>rZMVb~X)h)o`SOCE-YDrdbb-2U#$-viZKd8;yZl{fnyc0O-< z_ja|eh0vDvX$+ozhrX2U*G!ekUAR@>&1Rc#<MS?$OxIg8l|Ly@H$Jksd{*1}@~YPJ ziur1`S-BJPC1!JYIZs@%^7^R>=9h#QUQgxk)92gv+ED7-GDpr;diy4w{w@13qnX#c zkdgI<`r@3!DOLC6C+L`OYpLdWZepu4XF{__-TV*9DeVrA%?eH}P`GVs&>M3^<Z-fg zV&%qSotPQHaUp-3?)+=`-C)@n;lgm*pliL=rN=L)H~e`Lx+YO-X7=3a8xFH9HR5V@ zkdAT4OFm>5ylwaFe&*c$^Zb%RG&5cG7xwFHDXRZ|aHg;`U;R;m?H58WmT=G7zWU6M z%Gqxw%`$4+m|<u7kzba(Df8T$c@bK*THJk+r}VidRYlnpAKp0Ie0}njeDSWhMaJ8D zr+se?<Y${vR($oTuv%Ebf1{kTle#|`Px^JPoZWMM>&r9E30gJHA$c2BxRsVnPZwQ% zNR&fy>hJ%ipVz8wn68#%pLk>Ek(%n)*HaqGw^UDDSS!V8@NR~cfx)SX^2^TW&Q4LD z6>(T$zQe>xoh@Y@>pb(=xTS5kENcABY;#NgcaZi()xwOhii4Z2r_Y<+_)q@3@_(=G zKJ!)-U!9w460rH=uLTD-%e;N4e&NTzRc8$+H}Tdr{>tULE4Di!KX845aYS72Dz)iB zufB^n-g#!wQ!}YPW4b}Z>bXxmBLsKPKfnC#!j1W>+=3IhcIN*Kxm#aRCecy%)nual z+)uWxx9+V`;lBGbu`hD*{=+<8p~w1q7Q4?b%6PNAKDKxH%7+@q4sibvDlDkKk!$|? zY0f3LkJZ<6+I#bkn5cde5>i>RH_WFgb;i`0kC}wd{8s+C%zP@7{Py$jCw@-bax0>@ zee2AZB9_-h<@&R(`0Vdm+r6Od^q(^~vU8Q^KV5EAP?q#LmGRDzKm1$VoJ*4)Z+#!$ z8kM+h_Qa>(jvSqpJ!yU_o5ArezP;|te`#Nx6~FCM-r+kL%%_~g3b-}GXD{nG&^(!U zReay#!wX!B6J7;>xp}0=#Mbhc>GGWFa_NRT$%jWRGZyJO?0i^ZqUiQA(dMM^m%Oa1 zf_#@LKE0yXLV8uqu9w`~%U~_-v&~U-Sy<zdwa;vxK1jaUlF(H4;njAYN~!MOs~<g1 zY)_n`;`39)h{yU&%SqvOgXvck6CS*_`f=ibn$?2o8uwrPN?Q@dAbz#H?F)N}*S)2^ zpLgH>{Ji^l;(IgGsZ(;q)teGzzq}Wo;cT!t=alcPlTsxDHWinz=`Edd{)dO;qkPAQ zhEksQuW-(l-?V?$q3$E=e0$<T!v&`Ftdv*I{QKH$DgQPhM!$1C9k+KY*}M>l)mzHA zjBjd*=;W&p`VMj?r}6Cam{oW2jP;3(Y0EbH%<_oR-(JZo^=it=a6Ri2A7f=K#hcRk z^^e|k>JW*Yc6iAz|BVYbYp3NudhzD<e(pVL%7KB8RiC>R%${_GZ|x(s>d7IEasLGm z?K|u|Z_+0{&x+%V7EQHF2zcwH;uh6o6S>mYIph4&8!ntuwSksy*JefNJXyH0r-e&X z#HGWc^zhTyj}M>ynz-L;*)H276O><XJkcRLL2{o(i8<TF>6f^fER!C8c^~CkoPRaz z&VSJ>?_(C#X3TTn@%iE3)%rTx0uDxdmRbGwek#0jjqL4D$(zKUSiS!FC#vVL_cQme z6GBZ+w<`L4WIrWT?<I3E`x&cj?uu7(?ZGF%Z*a~1HLLESyd$UH_Ty`luP2-K81C+x zV{rGSt7-1jeP&zpb$QH^-Q#WcOnC9`&O82whY9sNJC3hixGn6_o9M+46?pD{{QJ%} z{JBPRlIYp}hKu+A`!dgdN6*gfCw>dNhAxnL#w@*KueE4Nz)L1c=JU<_mT2Vkt~E*9 zKYMfD?ioq}LHXQbwXADf?_K6Qx&D65x0jFKKK*GD7JTaQyb0eleHqpmU2%Ev!MW;c zzlz#Efy?W4jd%R)kG$Xz=iqa^Pd#jtX~!+ckZT*;vzZ>AJI-A<<=V{!FXJ5To88{8 z`aSntK=95Pv${j<d$-TEQ+;xBN@mLjMxNP=4lnzlJu8IaB1=q`U8{E4=hDm9B9EHP z{KkD~(p?2R-6w1!JJvW9^e$gk=6jTdan7;zfuWhVbDzCiTmAZ;npvtZuf{>89aB<8 zBR(Eq^+Uc&eC4zor`|03w92x?|NXk}^Y_}#m6a;<uX|+rziF4V{!eoq|1W8goKKfA z&GvpEQ~KF*YF((37uVFdsI?B-7w^eFy2k%H)NG})qD&uuiKKDS>%6n_Cl0P{*n7P9 z<hc*d3zK)+x;{HPCux$YyugXtrKgy7WiC4QXkUK$H<u?`<uN($U-*7GyldxI`xX5q z9V?`a%{Ho8@@)Fw%ll6}{!G2lj?bHyDs@CFS#Py?(0_TS&$nycC5eZ80w%p_x$M0` z)A)gpn4#OH(;XrTGZNxMA3T|5+%l!Ze)I8`&9kQ!Eq&M)vSa4!d*7m_KjZMeC>UtJ zb>r<;-6x&D4m)M_SZosP`4YZong5=>Z86+`Lq!dns(Q6M8m=$j+x>jq@1IkPr%(Sc zHudYz^<PR#Z=@O&Y{);={<$hJpO=Y6;Lno9r|;~ZF?;cc`X3Q|sYQ1kf2wmYiSJ)_ z=cZ1`yrkP}Hk?fB$o+rqwVe-xqMYt=cHyq#Ee?}B7oTxC9L;|BjL*~MRuh-K7WjLq zZSM`vnB#L_7hA-npLDWzn47#jXojNhjbmXiC;Xl_PiN^Gy|ZVMG$OwJub<B!F{R65 z58G6Mzdscxxme|-9A3q|WXkiG=l%+_&;C`luEB}XH^)w9p4Q77cfQFv$psYsbFQoZ z`EYl?Jr@^eeo*9MlRb9VoR6K|d2|=^BIyi+-<L(tS*~jm+IaS3p5DJJZO_;?D*d_t z?A=*Y|NU}VF-PKg9%=voxJP3B&*Up&OWv8UI&Za`T}<#6yN<Pl!%Xe8Sf7K{mNybQ zF5FF4bP-B%z9n$rLa>&KfFavLo(b$>2H(2Ymq{xB`>CZ`qy90`<n``yLGKc~?EJ9F zefI-aCW!LCdwEsEN99AOr&Wh#;@rBRw|k{eu4%jdB4yEsJ`abxSudFnDu0uG5?$e~ zBEmVTYv!rsHKI%|f*ET+zMs>o`ieg{z310oDakF17Af-HIbpncP5s4~-!oF|WmCjH zJ#$_5EI7K$e(%%FIqX5tCPr?){@MSm<67HWFLc*`^V;mb@7bzXIg6VsD(}r-`S$Fp zD@r!AOYVFRnxJF2vfj+<hMd&d&lje0{bJIU-8U)s>amqfi?%H~b>_p3iECE8v|GD= z%g<@jachjtf}aUmm&6&e&lPKbSvPC3_N#*P4N*sb_59A^kY8+fXqF#y()Xa>b%#1m z950;o<mp89%b(;nEEDOxeesOrH?17js}g~(>keIX44hq1**d9A?zv%=W8jy0Ui)Pv z7Vxcl!+LMyUZ*{?e;D0}*%Ma0I(hf6%Ee7(*@xQKUl;V?u;FrJ*>^SJ{FSPin~#)# z5nRvk;M%pFJn8?>fBQfA$iWU*VTl6v>kX3b6Ad*dEv|Jq+xWgz<s-Y{1n;R2&bxDI zT{b^4y`kb`&&$XOcZ-xS&e&<NVP&tl<Vu!Z^Y_TG%{eW=Ecl#Rv}fL|4g(>vD=!>{ zF6xS0<Nw8Q(~xD?qWJ&a4cC;Gb#~0W9VeX}{o#>rw9bntD`Cej$@xb--(1}1q;W?y zWee~5%6>k%CmJ{MpNbi*T5x?2o8v<<hK8qtUw85={*5_M({c3H0;dkcSu^~1&*0vd z!6^_qWug*Wd&u!0F~@gK{IEsf@t)X=LE>w!oUeF(cFBV60ihu~H!8TEuCQx)EScfv zJe$4a;)Kmx*rxA@byS;rK=Ka%jqQmA>!!(EaNGNXt4O(^Gkqmjy~6d29_6{S7|wR| zS}V-%e`9)bs`7;1DLP6bt5PRd?3A-yleXeu?zb#2$3I*f;@0$X1wT8Jv3QRM`@i$W z3^%LS7ijj_FoZ2#^YhK#sBRWLTh}kTtfGp1H!pY1UYjE5aA=oRv#VEqh+@Ou6YJKg zr|Fr>n@WcBXDwQ)Y^>Uw&F{BW|J)kc@Fayz%M8+Eqr$^n*}i!lcXnMO^=r<n6Q$V# z-!4r#8ti%PvDJ#~#s&Qb(PyTnTzP*mi6u#Nb^OBgo+Y(6j%e;bvRYWrft9OvqKIcV zYx)!&tKbK>v?uroT;ojMVrW%&S~kBt`e3?G)5N3VkMFzu+IY-PVZudef5nF1f@Uvy zzqm>-INy9wR@3qQ=EG|@f2?)8`0-p*)+|0jofT$B3>F=n;7~P-|K)?kBNODx&b%_Y zFk$Ye#GezGH^#j$`P#RWcgC;MXDd^`Ol;%Ww~WtFW>1la!pzHUB`0p2SF}wMzn-~3 z(YoFBpyKhTmnuHZmGP_zUVd?(a7|lOnwG-ml?Rqe{hDF5O1ROC{l=*r=Cz^*QZ}>m zdBs0|T;dcb{YK%)n(4>)D0iQ<XER>W>NB}DwZm<3>xG0P=1tlcch}Tu9$(qq-Bys* z$0h$`+wAwLkJjw;$|&a+Tjf2mKk@3(mC8q#D9CpC29_20G;a*=eVn{oX!)YGoccE{ z_04<29-5h|WgiQ+KKDq@_R`5q9g3&frqo8ayR*b;x1GLj)bPVm`qjqT<U;$~68{tp zw!K;JoO0B8$wT9NQxmFkgDi}^r3HmAmL6NyIk%T>;?J3%<2TLO%P0JKYu8dH-niqe zH7yI78`FB<|2nbvitW5;HP-p-N;j=PZ)yBG+NMv|&*eVr@u|^|CmxwDa!q~vv)MxG zPYb;zKm0Y*wycQ$Y5LPKRy6jx0h@?l;NKJM%fHV5a^lI?#D%3<e0m37C9Kf%_fb*t zYbx@-WAo^`joN}qo-S_=SXeDzxzFI_hN7J>CVi-6)~uP%FmYSNrgyF9H~N{&e4EOl z$lcZ5(UQ0G;>x{m-z-=!ZhmCrpNCJmb?(kiDlM78%~5f5ewGL4^7-yN6$NJT^<Ua^ zT`A0HSweL2#_;L-hTD7tIQS~hI-I}%JU+$#w#EDe)*V|eJ)6t<+J;H)-|hVJ--j>S zM4Iul22K(Uz07-glkD}+%?4gejc>;63(%RWeKl(D#hk6ycjM{}WacUeI0f*idvv8m z^ocX_?>XV9SMx!c|EGq7Vpl+q&>0uaQvrQkNj-;D)*LACIWA#yK&0l7#IYpKvP8|i zByJ^@0`7iK_bQ_YdhZ_E<vmuE-1zKuqtxlLnDhBOZS0&bLOYeuZo80FeD?e1YuN$; znI&wKk3K7?tZ58TQPow}R$sqh#ga9PRxMk%aOKjwY#(=3{bI9SCTZE&ut4cr-8r__ zgMuC*tdbHs>$-B73`M3nFGDe6nn!9;YtYhb8KqUt7gM%H<d(Hxe)_GVw(j4w7nk!7 zEKoc=Eh_Cuk@lJ`r?M6wTVt5Fwsgs?u*n7j2TVJcYq{^4cF<CSjYYrfg=0o>%~atB z-yQ4tRVvgrF+N=VR_LzLe?G3C);o^$F1=xR=75BNMvatwm*C$m5ug1ze#dz6Wz2i; z;;6KwE#==HS0yWDgN<)@O`Lr5lERBcYh4Z&t}*|Xps%y$XIaj>I<Y;SOFJ%{*9}l~ zf9u0)Y*6^rAn}QoiI%2HwwJdk!}6&dm1kZWo;IABSN!S0xs#2y>N9Pt?YB*f5z*m$ zr1Mgy>d6b&0I~9zi`^%DlnnW0mMLwNJ{Y*=L)W>jZfSg*7U^#hJ9Duvl~s0rQuFn= zE646C%-9rXwJZ6VOJ0bttbk(GwUd^HJ++Kw8--nLizV(}oP2^I@7Q&P-=%+FRQcAQ zmE*KIoOP(CW0B#~5aTMzlRIA+6dEi~`L^(`!pG}oKayphCBE`per-+>OJnLC=XDvG zB|NX%{wZe%{8)Y5OgY@~f%I|y-?nd<4hoy@YkDf$H050L)Dr(pacOV1W@Qag!Hr%k zk~L2jM8&u*uV#;xZV|c>aP;O3zB4Bk9-F#eFSoq?;6;LJ^s)dS37Nq4X&>BvJXzx} zIcwVHn=F^lr)4Q7i~EJ%?-lS}wY_!2;b|qE2PW(=m2&y^H*eNemu0CB-PcJ8f9GgO zSk|?&@yB%5Ny?H34X?h+>y!_kuJthLnRB&|v%{|6S>3Zr&su-owf)i?wN0t_U2l1G ObqfAV3zhd{V*milBu&o% 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 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 delta 1825 zcmdmUim7KaQ#}JC0|NseLjwadLxO*>zLDF8$mI+Sjb|7b7!s0m6ALcSS>(^a(4@n_ zz<4UTtVBV65~~&i!vqZm28N8Zg7n<mBDX&<Ff{*QVBnsfo>*MKz`!8Dz%a9gfq{V| zJ*P5F^rlS|0|Ubw28KGOjMT&wQR9*q3=H*m7#JALGBQ%@6WQ-En=mjmu3%tbP|3(G zsbDSUGiG3D5Mf|ooRX8DoEW89;l;pEFTlXSa3(jgqJXiT$B%)b?gIk@gF;?nZtBm| zGs77eCQM*pU>7gQFD}{JuF}K6Fnt9B1LN(2qSS)M@5Qqi82TqLFfdGIU}7+0U|=}G zB+9_dz|O$2m2Kib+0B9c8MXCH3=9km%q<KlP#IPhMg}GWZ9`LIQAJZ@(G;dVDImZA zR>!D=O`S1F9Y|413IjM;85mN)>ex0jGB85SN&(41WK$X18JIz~GB7d7O;+lYtl!UA z!sNtsmU#<HJ8LkTE!$dlBMy0vb)4;7E?ld)gLqVU<#|8wZRSrBU=X+|ctWUBSWft` zNTkS4(NfWeVh6>yNaRa0O0JNaC@m;`N2XflvTUOqmt3>Fr2JxqRE777=ajmX^Hls) z{8Zklx~j>k?bEQ(_^G*8t6aNSCr#I`UiX?_ufCf8QiBvje#2Qt>_!pBTE-hqd`(W7 z?lKcHn`HLQe6a<iMXJR|%b8Yr*8J8}ZQ^V>ZCBeR+MTw$Z}-`r5$tV71_pb}Q*QD6 zHeVUInO}gscw^H{uvbC!|Cj$YSPnB?WngCDfCMK41H&%{BZkSo{oI=y`YRZDm|GYa z7<Cvx;m0s(qB3LZWR;0dOz;0s&X_2#2{H(TWx$p(FdSiE2D4-sSQtR5NR2^(frWvM zL1FT$i3%L=|Ns9FN-C4DO;pf&|M&m@|BwG4{=fJCj6ci%EdI0b&-_30{>=F^`_HUD zlmGPm>HL%bCr2QafpN0oB>Bk>lQ>lw*&wk6@&zL(@<ABHfni1l24;|IYX%lpHg*n9 zE^Z!PK7Ii~Az=|wF>wh=DQOv5h*~*$1w|!g6;(BL4NWa=9bG+r14AQY6H_yDkp9UI zlLRI^OyU;`W?*1&hUkEh7D&<@n*%1z=BXEB<OBN|q#%$1=0ZjWE`~s;I1>XmLo}4l z%%IAU24%A_h%$6T*{lq_3=5!aHY9OgMk9u`P;ov6DaQLywgAlhdIkmtK?W|ypP-;; z;bdT7Sj5B(Wiv8}FfE0$nHa>Fc0$?A3|>s<p==fgEoMn5o0UO|*%``aLlWm@N@0$L zit{m;upWf61sFt_>R}cLGKjE#b<QuSEXqvJC{fTz)>JSuFtF4$GB7kya7iuBOwUsY zPR>ltOHS2M@XSlr<3d+#XaZ7fq2Qg7n5W>FoS2fDTj`w`k{S{3n^=<Jl%JEL;8~KG zlbP(6pI73RUzDDzV5C=XpkSqdP^Ak}22q7oFf6sGI5R&_!9dSI&jj58P}k~Ub*_Sj zO?i2_UT$JZMpj~lUVc%!ohFxaem$y(vH1b2Gdm+OFA?G^h;ALO^30M9g`m{p)S|M~ z6a|pC6#No%Q<40m$Hf(rky#9p3(ij~DNig)Rmdz>$jMAj%_~k#saGh?OGzzKD9K1w z2=??*@GnTsgQ)g_sL)Y>`Pop<P!D1nRI@^2Sz=~RVp2}30@x*q3T}>p3W+6FTp1-L z1y=g{#mPmP1trCL#hE!EC+qvW`Jl^)AfymMzd36DXJ!#6hJ1z`h7<-*h7yKEh8%`W zhGd4xK8qDOQ^DDUiGg`?*Wv?Aj9QbumfVqXb8}%Y&C7Ikb905#ZlKJ>`2RlxKLFJC B$oBvM 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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%0D; 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 N42%qn|Nk@a0|33)pO*jt delta 20762 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 Zx?1+D@0IP=LKR6X85kKD|Nm#;2LQnd>h%Bs 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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 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 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 delta 1784 zcmX?dn`yxTrg{cO1_lN`h6V;^h6Mj$eIwV-NIeFIjwK8X3<=4(i3OMEEb?by=wxAF zU_6yvR-z!!z>>wlFr9&cfgvNUAU*fC$n6gd3|$u(7`UgWCl(hlFfa%(Ff5Q@U|`@# zq?^xl(;fq~%-14GNLjMT&wk*bmh3=C~s7#JALGBQ%@6WQgM<}fgHG%zqQsAS}p zR6O$F$!1_^d&9uMI3*`PIq~Im&SeY?tuGiD7|!G-RunK6^W-uxw4PvKU{J_Q%uV&v z7Fx!@Fg=5Tf$dU3esRg(c9k9mhIuv&42-u6ic$+2zZcJ9V3?M{z`!t-fr-J0fq~%! zlPCi-13Lr9R<?=%WH+k{I<(X?fqcZYham+j!^*<Qz+|9pXlg8~Xlg8)!uTZx1Q@{T z7<I6zGX|*xDN0FU00%1rLkd_O+h#@vMu=G{AUTL^D#H>6W{|B6ObiN>4^5M--@!PE zDV~{y`7O&i*8A+@>^nJPIrF$Qx#hX<^JMTE^4am13PcHt3O*H@AUsWEhG>cyr`RrW zYw<-A1rm=Wk4mkSE|w9Kxh1<rPEPKPe53pog&B&PirbZ9mA)u%Q_)f7SAD7WLcL$T zUn5B4oaSq-wK@ViUv!u0CFzG7R2e4J8!;QLGnO;HZ?e=h$n>n4so4Z`L-Sq>d5dn# zSj!Do8dm+*9M(zJhisf|ZrZM}>#~=zKkLxxXyka&$=u1?Dc&g;>}^H{hOSWOiShh4 zUm3WWK@rDrW7A9)kXJ$U|C|5SSfrWGGB7c4K!THjf#DZ}5yRxS)44Y*%&1`GVcNsM zz^KCj3O|O)3uY=arcORG(~0T*|H&M)<TXKo2EsC6+ZY&*FffBzG7KyXD;O9U)EE>P zSQywC6efGkQs8+1|NnnbTA5rnOF`@X-~a#rKmLFC|K9&I{w({m_|L*W^Z(5IGw09j zKePT!{?qfP^H2Vt9D!5@#>p3F$xnVTi&K@64H8`-=QDz0AA~_17-nQ(U<RqSW?*4u zW9Q)H;^yJy;};MV5*85^6PJ*bl9rK$sFjmfP*hS@QB_md(A3h_(bdy8Ff=kYF*P#> z>7V>ymcZl(v-pLA85kIxAvz$W1(Gz!<`1)G^VEwm@`3#fQV_@hb0H%G7egRaoQZ*r zAsWhNW>92EgtA!}1R0v3Y*q$dhRIMi8<IFLqY=Xbs5l>k6yqf*TL5N$Jp%)SAlL$C z21XW61_p*jjBh~Ez{1JE$RNVh2W2xc@GvccvY8p2nASnrEDTCaAE0bj1}SDCD4PvQ zoR=wuSqCc4$6&%b0m>F&5Mio^Ss)0qz&XF5vM4h>qeMX?SyREtz`#=1$iUD*!6mgg zGd)isI5{&lFF935!80#ej|*L~p$SN_g@SiRVxEFya$-tqZl!l(NNPm9Z(>P?XGvmC zX0ls;UWr?NQF^L^k)DBqm4bIYT!Ah`1wsc@AS|`0I5R&_!9dSI&jj60r~`Gdx==yG zro6mdFE_CyBP+2&FTW_=P7~eL^#<6S4b_>Qk(ieV@d!k>4p(_*NrpmDYH?~&S!#*` z$U6#tiMgo?2xseYafM`L7DMEM^V3So6N^$6GK&>*GLuvDic?b*O7l`uixf&SQWb(d z>wOgb3sUnSs(m0TbQEBIHq<lJgO~=@tdLlin3<E9l#{9ec1fawn`59tVu=-3MoCG5 zmA-y)a#3bMNwHpWW)8^7`u=V{xMdie873cGDYsdA#VuyeRB+;FVql&uwB`U4qt@h0 dYwpOnxw){H=4HCNxw%4VH&7N~{QsYU9{@3|$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 zcmdn9iSf<>#`<!9H#Y`G1_lO(gct@s5WV&Ygb!k)V*g-$BL;>r3kC*;V2}paPVcnj z+{6L~hOiz628Kxt3=C&jlz*5emz5|mFvNn?IWRCVWXLnHWTh3P=Q1#aD=;vy_AoGT zProg4`$KwSaeV;;LqZ4x0|N&X3#8{%rZF%ux-c*Vc``6eJ@P)t=Uzr?VhRI8$OHxk z1~U+rESa_`BO^7DfgwzSfq_Aufq_AVU5;sKMs7(314GCO1_nl71_s6*U)=e;bMliD z85n{$FfcIO1L3B9(I0aYD+(AGf+sLA)H5hBFfb@E*6`%!CFZ6wFvM0cFfev8FtB*V zXjU{8<QJDPFvPPkFfax%Ffcw1YQAM!P?TE0z!0;Bfq|iufq`La<M-lO6}RS8vnEJi z-}LQ_%&pk9Gg410M4XgaoYXVPBBlML@10}5bBgj${otzqd8zvQx37lA5b(LW-t)ih zZtc_8e2W$;raqrtYW(BuoMeR=3=Q)anHU5l)a-u3u_Zgh$WC&-@3GUu^9xIpnl4@c zU&gfm=Fw~S{!0I`{9|aakS%`yFW+k?t!G8HxoprASg?(2&SNWuz6TfAUCq~eFVbJy z(VnlmuKH17_#7s_6NSmrU43Py+)Ry%g$wF^A9U2{UU*XRsOfjSao>gev%QWin$+C6 zEM(=vCoXDpwWcpyp0+7?@tT;TQ>rWP$iFPnntayBPiN!Hm-Urz8smRnU0r|X%^L^( z?JLsnn6RX=PulzUaOCU{$LG~P%m4rF;`I8ZRyGs+lgqX2(qwOL&99GHy6c%+TMk3Z zXNDi9KOWZ`aM|DKX%#3a5tz{+H7P-R_5GCH|CiV>a4>D;>_}cM(|N<nAT0IQeVLaG zSF9MH_J3=87|q-k)1d8q;COVyTch(uX=^{FtbH_VnZcAfnLg)C?#NFTzFDHRdhL>2 zjo8~$zvN#IUgvUp`SPV&*UuH7;(fO4m6$kNp=ACu9yzbLxcZ&el8@ZhNt#Qfg>!M; zf5_8%%Jb)8dzY@3p5r1DyN)h>Fv;%!XPux11D*!^H@6Dy|F|2Q=zD$;QVL8s#Kqwk zb78T=3C{J5&o}VJu_)$kf0nypD__pf#})5CxF6qkCiYbeV*z7Kbz1vf<=@}Vy_GBY zRmCNF{m09NOU%|~e=6~+ciqu7VUm&Q%b$m<^+LUN>aBP?tL*ND4|_~(pSEq86y-W? z&M{~0bop+Dk0G0;X`Wc(d#w4peWF(L=?%IO;wSU}ACM4w7;d`wvidi_?-Ncud(CQN zw|&PB4dF~leYH)Bvu6tZ6bf9SuII7WOJkz)(M3n(q&K-AD>JRyqBB#U;n0Kn-KBpt z{}@_u|G%>(>%>ht6+i8|sS<4GItp{y6IiZ`Fc}rRJvbwRUD2legtg<T!k4puEPmZn z`r<{CVS%<ROXsI|x}k4pZ;Vc4HPD;!T3NGD_lJ~*f0q4HK|h&npMD<esX1CQO`9vO z6|DBYcA97DpQuH11B<i#cCOiLY<Rg~e*KRAnC~ey?=$BA>|84Q=2fckx<&uRSKfKD z>gAhV_V?pGI`py&*36jQC+haJL0R?w=_OZ#_ZpZ_eEsV7)#GQFCx3h~bLG;C_ln&f z7cWaL`f#i<;?>GlpZ!|TFa2eT3|g{i>FUi(W7$py%n>>D;?$968%{mnTx<Jtg{^^j z($lKVQBn1;L_0dRo_4cJ)|tEcWkvng8|)4j{=O6Xr}j_i%psvaIh(8ZwM$I(Zqey! z*!*~RgZBgN%#?~F-z)S5u7>$GOB^ok>$n;kyZ`AfCrx&n_Ee@DH{K?u${&02@%8~b zA;T@g55KnV+_`h<&ZR##P4?q?XP3J2-NKyYqNJp>q)v0G%k@@^=e&H`_I}REoEoFa zzTTmHtLFckt@T<*`?^%&$}9Y*mH4&2HS{=cdVd$|eB<11cP7$E^SVWH4X@^u6>1j2 z3wJh$KT@oGf8@~C^AkHdT#np#aXgvw=hW2sPgL?_o`xvxE4QC{Lh^mE%cuN;>z{6( zXKLXz-(GiOZTspS7kc{o>n9`xduRysghflTJ29WE5aDrPUf0N?(mDIU&e`ft6<3d) zHDcJx=hdsd-{D@^#xn1t@BF`LzuF`BIwVCwMR>M#{085(maKC=9=D%0tGjKh1OJrs zEIG@=w8P!JN{@#eU6^y~>$3R^cg0=XqTifTT<^Dw^Cfp_*0Re{L0-$ZtFEeVFU^X} z{dXuSs<Ux&?9aw|8LI;9B7-kl2zn*W(Uo8M^p)!5*~jB#yA$mK3-wIOzLv(uo=7QQ z{~<~7y78R1O2w8_><SC&{H^xipYlh$Tiw~X<F1oirP7|fIo9*d9<@I^ujj*mzWc_` zqe=Da&mDH0-uPFf*39Q%;*a&qu6Fk@*Lz)DwVBU=Z_Zu*IhU;jLbs?#@%o=K`~4{< z;`7B1FWlQ-tE|a8=sDeQU#0ek569WoExxX3T__ar=$Kf{57|qr&hkuSck}Wp<y9>e z|H8E_+^%`j%DXSDy(f$8H#A#jqn_<^c<u3^S227{2SjT%tgTHV<@J}f+8Ub3o>pC~ zefV>|`}Fj({W)dNHy!N|75x}eZnOWw?W6bAH(xukB-igdf5~!XrJnG)Rr^fL?WUht z_H4PE(;U}tcfYps*PrzG`p~J~Url<Wg^~7>N!4j`UW;};zwp!ReSqTLl9Ziw0t^cu zKKnBNvHq@ke;U(t<|_H|G*0I_;-Fr7Zfjz{gY3@(a$oCb#GLkC$0{j(f02@HLreem zg>yCb8;e;7^w@4|eR7N6eBxy8h+@VXS&NUtj9cYo-@W%e;-u#DaLTf4y_5Vp-436f z?`iHEHTBZ+>njxw*7O+#Yk9|S$l?xj(reiey7gP+`Qow{9J9AbL~eED{(1A!BZ+JN z_0tTT=3K6y@W|dzre3ta;MmIlmqZJnP1bJL-V-Lg^L$16^_Q+rDK-AH1R0tamjAzY zcH;R)$B2f>A1r-ee@M|(VNs6x_}K3B#1q}?POWk{X7$L1_W_f{g|zm9Kg*o#`*v@$ zcTdUIHFQ2-(7E*J!-YpDd#ksLwTXYaS=awGccRV8JND6xx~0lokFN99Xa6tutjg7R zU2MCZXJcnW+78uqPi|X%{&VD2qqg9gr{Zrs_Ri_(zOhyK_<iApRsWYrzU6wp=E(M5 zxwDe&WzoTf&1?1^=1#AAt2}X2V#k{tpE=8atMi>Zb);Zxkm(txl_9HdZmjtH=H;@9 znSIxGwTkjTH%fi};m(tQ_=7SlSNxk;UlD$&;Mn^5mkVRJPO?o)Yw_UGNm;a6{ZCft z@%d%HubHe_@KLsU(GnH5sjKo77=#wg{xE6%@3(H6^V8NdO?1C<to8kr*$<EBb;|$K z__2_0&$sNYz3KugW>#03+~V2zf(m!u?95;Mr)jEd#69!d67s8eEMAeT$$8l#_gBhA z|L%r*Z9n#>t9`jkBYdhJPMD-MW9y_{eLughK5IC?FgxVNq_pb~{ym%}V<px7Msn^6 zm-Jm(qFn`o3m2ESJem0H&6`7=^Wr_GvhON3+Z1s<WNo&NpwxTcbmc_J+t&a8Puc17 z?arZFhdee4dMZb)k6Gn^@BdNfsXt%V@c(nz5^$q>McVm#akkyZ-`&-D+PHwnVZWn2 z`|pPmF<DWIIg-RAFLb?Mn`hwAps2_E=)<ZfM;LDGa;k4BI-2p|v93?_o9OkK{BusL z%}JM8zH0ZkC6B|WALB7e+aopEr{ZwNYW3<VX9}h4R)u|=tZ2Q_w<kE{bH}$M3xbX) zv;S7fn_wVZc=N7rl45-d*D)83Lbdvp8Qv*#Dzc7k`oA#5(Qa0XPt?b$PZo;&^OD=0 zlq~*!x4$H7QjX6hDdU-)=KKC1`@UJA$gwQM*j$j?*zMx^8PNi5r;5F22sU$6a(G)@ zDgCrrprO+2kNK~t8Lh$vtoJhA7+Ak75_x?>B|6hEo^cZA&Xa-%w9Tj1hvsUmFADc; zUtb(N<8mACPJ_D)F*6-*<T!3WU7C4+$Ll{crz-!RzU&zL9Omy5TE;E!)-8E*?suHy zr;5P%YQMmJ%uzh2gnz%$R9seaQ_FMv<E$lhuk6wopK__G{uTJ$QS2Ob>X~JC2WQ`U zg>IP@S0~RrefiqH;NN|=E9%}Ymr$=)tneuN>dsPaZx^7qs(9tY0*ga8mF8Kc^2>NG zO+Tjf>Bi-VKJ_AYy%l@EUzmJif`I3SjHU@X$7kw%zy7^##?DI?d(w}(Bsr~AQA}1_ zeu~jnPI1wb|I0jl!{$iW+uEoLybR`(d(yGu9czE*f8M|1e+||g=&%1RIHf^bH&3O} zp}wlwj-~nEE{AjN+r^la>yGb}y>XN2`gW=EmBKv-Cgg4@Jy4prm-z`7gGzaAZ_mT1 z4`C_lHCm=t5yfn_TCM+X9q^ajzu|{>+uF#I>cpbC_nr09I;D8!Cr#V*=BZrmgA<>= zTsqv{%OQ8S^n&Ef{niIvEqr(K$Lmag|2rXQZQq{yx}v&0O5$uM%qBh!(Qylue7Sl; z&oLIEhw}4pp6K8A{8P5uuaBKUHs!hbGo({ueoWc&^GnsnPj8ah<#bdotO`D(cOqiW zqOScP8AW_HL~wEZVvM+Xc3ELWtNW~Jy$u`IDy43J+J9rFeY5ouzvwqleQ%wXZrh+) z_N+Uyeu15RaesYCYi^~`l1{yQj%6+<YpveiE{Lwm*zx6sz|P*=!a9QA@|HSxDhki3 z`=kAOrSSAO@3_D35&AjNT~EO<Po>%9$D+sVn&Iy>pBw1B2;NlfA1Pg}z4&X`18p%+ zA*HS(tEa1%*_J*3o9WajbFz=q{)zpbqBzAx2iNbGY?HVfz4JGBJ%b~^)PMJQ*8T(O zKet7*GzkQ}2;^A!`?HkCxgA$j0t?hiT#7ntF1s+iW{L<)z3QO2=jYm0&$s{VUzERd zR?5M&*RIjGoKL-F>&)iAUw!`W^jGYgu2$7;2;3Zc(X_(gK;=a3%aYqaoyidHI@u{V z?JECP?UKnn8TD$b8GkL8dlpk)S%30nLHF)Og;{mVFZrYLZ!Ua4@o3in&Chov?U-?P zc6EC4B^MVVFRqgl6YK4hS=Cy-RQ>!;+TMKX-F@`q-aggMK6VN>dhP$OJ)FD!BKr=* zORKGWmN<qwc-`QtKN4lo=I+~iLgcslp$gS2$9>)kUD2!l%bV1*l>6kO#3lDt`|35; z+&KA_M}1u$hts{XRST@bdzN&l%y{(3+|!f8=GXUi?(!|?zu4YlaGfJkFS0{LZ+&Cp zqRa=26%Lv#*}3xb#8`%7TC2sB4pnh5uG)3U=f2luPL-n>o4<B#yC<+CPN(R`o|@-J zFRO?1>7McRwU|0DNl%#XVDq24+tNx+W<}NI^*b2Ki$33x`VpsD@BQ|bukOVb^QH;x zcZ>E<`WG;%@M7xo-MjUd<dg-smu!`3sxjI7`;TXyz_;(FVkz||vKPe!gKlK;@09S2 zc`E!{s<!r$-IVWF9y7N*Dx3E}MJG^4&Tp2?M9-S9qArrYXAGQg`*D2JD^LwtVtsY- zlhgV)R7~spCv4gK-iEV&-S*Wz_DxRPvZ7@r!so1Xca+p<oizJiBZuOn4fYpbUy)(l z|NoBI`z;?!Z#+6C-zl!=biggz|NI1JT^U8D^b_XWH5od#Ufa!D(W}v4kofk;!rHSp zXHHz`wNhK&=%HuLrJ~1<Q|y+l6VBP&{BG*ku7)~^BWF{N)z&{+>C$pclebsmpp<(! z-<|JYp4VJCx5WDP)pVgLQq_*<VtO{mT+g^#UimlcVS$O0$B7+^!I{m4VpDyJ4oVm* z9Xk_uu=4-mnf~=3xAE#c|F-X-d~Ljvt@Vy|ZraD%3@p6l_`RK)Z=OkEnrNsjGw<w; z)(Rz&pr#ob(I+C-3qP@_ufF!SKA!9T?JatXdfg`mYCB~mG%G~sxE)fQ{QAh2MN5vy zI~R#xUG{92?>(V+Iqkn62ZVChOyS*e^U~`BJNK<qs`-{)^UGSk;{ECKwjV#(N~im; z)q5YA<I~3%S|S_pVd)Q6!|U%YCVIX!(fxV$Vt)TSyM<HtKArT%@8cf5+j=7PsrC$3 ziPnL0W3KV{<)l5o{&_`iR?()1S-Y*4gnn5avmz|vd#ehkqY7`gzw{i#?F~KOxMcY* zzIys+XULolzG2_@{w=HTTp4T4kRv_w?#cR{3tk*>dlzHmbEK?h>Y}c~f8TE3xP5lX zrn4(nc!+t<dHvqnIsS02@;QO8|F3_IPwlFom{j*5q2uSDumveUuFZCOH0^>)b@y+# z+aZ?g>^;SJ<4(-iG+7*&^ya2I&!d)%rM`|V9IOm~^v&;0d)S(<&XQyJaF4^=%D!Ed z9_u+Z_E-K0$+kXllTD(CaaNmQcu$X6xyPTy(|6uoeAsX6rP=4BxTY2MKQ!&zHoNxI zEsq_!vGwx%SmLftI_YDuvO;iai2E9z%;^TvdTxTPwkfBZQ*@W96dsFw^1*9yW>lBq zxuCs&6HoF@_c|r@^0ST9>bSG(*|&vwG~c%fIv`UR`{huepUbHYckCsD{~U|2`M}I( z#Peo-aoM%Cug>o@o71@d-#12)J*kJ~9w;<)yRY<(a^xthe|}BEup)TM=GImDywZ1d zMHX~F=9qok@a(_Y9g@P?j2;H>@0?x}p4GejSM9p!dtouRSAV=F@$kL&AJaAWE7ePW zJ><VPb^4Lg*)<DZSLn1H+0ixY@TBu^4}RfR7whMp;^tC+Frc;Yxkrz^bN@{z*TY4t zSGpal{~W)g;`pPA%Ay_h5#mQe3jga#*XysSz11h*az5Y9Er)5(`z+QSx03$XP7=KA zCNyV@p>kP=X6l-D-N}+}S3mgP>MXV@aMoLQbFr(Ok77<4Q^}HN_o^N*T`pgp^7+%R zqukjq1J&!+ov!>fZ-v&q6u%F@C(F;dRg=SHb1R6e?B=}`ferHeYgyA<t?QX0wl>us z3SH}}snK?D-bvOPmYs)^o-cWLeeRCm6U)y_%$e&{)8hWguvJGW`s~>yi<UWwMaOP= znSQ}!?u}InVk?*JHQ~4_eO^VU)5>#A=g*x_pXP*x+pcuc*!N6qWyFkJ>DX<(8k~O* z3Z!v)UY{*(-&AXp<fiFTDdcj3XP&!ay&LZzrZXve*Y-yWMb_~ds=1zdrlW87<KN4d zyWf3THQRGzhl0rM=Q0i#+GphN6f9zk`(5V1w_|JE!vhVQ-_BGsv`|~ewO{cb&$BIw z&Q9yYnOv;<x1IiaWpA~beZ=2$)qht0ezx~SssDqJl}qk--fH%C<_^B(y=mXMUT!gK zam_RJ^DKpCZd&Xd`7C!!OYwoQiLDVwO@xJ4SI_xX;a8a0{`7!G@{zm?=TuLB`|2q) zQE`#Ty3C6Y9{=C*eXdula@5Q>8`DlDsMY^T^;UWtvx4CjulW0-wf}5tUX|N@^O&T# z^-bKJd#XClMzL>vMU&q8ZDf8@(y%A*;?;LzbAxg}E^4V)m#=?uuy^-6i=9<Vc0Q5& z@J+PnqJfS6{Oii@`?pI@S)07L!E?%;g@?a)?VsbnB-s0swNT!Vt$xc=9ena;rMwmK z_VGUYMZ(L}Yx^_)&V?r$*B$;SGnq@X)Z$!xa>uoVdrB&r=KfD4<<9Z?oImT!f5VJx zO8Nb>JD&VCmb-f6)XMtJwR@K@x?R-8C%@<ML3#6P32T-6lYZ;OW?5eUr|eoeX^)a- zPO<*gwIc54*8jIkEPX$7_dBcI=2KnXRrc@nnD6#SD){!K&ZB=q4k<nRz#L!vSlw4O zBk9qv_~^ffI*xE`|9JlLhcaWc#~~6M|8^`%)hVc&{$z=)md$$Ux@Pmt)Adhf1(x%2 z%FGi#Vd79-v;53_H9q+}yVDc%s+Po@TB@w*d??c<ja5bQL*b^U_u8Jv$NK(lT0Q@# z@{^YNJ!==8-V(p@ty8~YkK5GW8J4Q|mb{!N@Tz5TZ*t_Ud36%$%VuXPwYj*=aqTM+ z{nl=3Q>yXt<&>Tc<qxkOa5lPAty9WS?;GZDQcJB=nf0}oi2l9`=Rd#JyKy;fG%&VM zPfB?ibz;@^{jP$sd;ZPeWB+0T!xP_*dN+HP$Q!KZxASdkN?w;(D|VyMVYh0@mJN>| z#WG1K9PZWax!3ZP;eho+ruPlp+vexj9{+H|K|Xw^;+4ot8zrvU@0t2R%$+0eZYJZu zoICX!*V*hftA5qUE^k#LA{@T!x7@*n%-s)NthQY_@vYY^U7h>p(Vyv3uD=v}YJS{` zK0kL}Ok7;$!koSDJNLb_uK)c)boR#!9*eC0-xcSN@0C9HG5;n*y|Tyu7lv1MKj?jb zf@x)LYCNN%>-4AR)-EW26#TT#1d>_q++XGWWk$UN_b%Uci;YS?IKAzC)%5t?<=xh= z_eFmz{lj|g(!!-r-b$BOZ(X;1D#yx@?B5%6OC_#MlK<2A;SZ<u$$3^E<VsT)FMn>v zEBRhlF2McK)SfuiY2FpD)@<B=Y3hckScMf*DQ{;^S-Hp1dgmO6nrA0Z=t{lY6MXGu zXWO4C=393?Es?F4VR&}z#U$~?!39Eki!<8J%iKRZCGZK$8rQ4G8Z`rW<V*t_7Pf4> zxl7+*Pu9YqIGesTY{xIvH2h|)wRT;;HsXE2m4kNQ1iSQPN_K3yzrlH}<)upuESdp% z_gpsjUT3i?|8?cem)5Pp)BWS`?JxiJ<c#NX8?z@ZA$1-;tnLkOW9l<mELEm@EiY;K zA#<x%YRS~YY9%*6^*3$LcToGvdcD)_?CGu7Iu+|WT;1ogNALVPXL^48$A~!sXWzx8 zpPX_^#k9a+zWiFB&|@w?Zn%j|&ko+Lre`O8bmkn3C2s8#zu)fie3G{6c}hl5p<LGT z1druUXV=@Na)@+YtvdEgY1tXO`f$Fp$(dQxE&tY@kNWHH`{hY{{m-ib=l@>LOkVPH z-<GQ!f<}?&rj)GP_j~)7^?B>;c-AYL=sIwl1zg;=Kp@EAr$&Ur3{|tUW%r~smhR8K zS9Gak{=w~`CAYeqqr1MA1>|ThTAlQgh5udw_ts}0bWIx?gzsl)Yw4?P(zp42MEQGt z?A|TU^j!I0PkwZ;>g~J>zWsMi?&gbz{%@|&xL~)MlW*ekX%PkX3%(h?acOxx<@R!c zI?ckZ8@EsPxpciYHl=pWsm=O4-dp24JoFCDoiU+I>w2*HrSIQob-1v(wl7+Fl)3ir z+g|rn<?_1c$C&w-PXB(RRi%yfopr&U4clc-m&nv#Q*1r{`f=DRCuO}khreA}cduyT zqF}*H^{m5+w}el(9x_~<aQ2v5QP+p7*FEpnY!p1zBFJ0zxSlhxtt>UXx{6U?*`2tb zY<~^rwBOIVwVZ!qQ={IaXw?&ptUOcf7Cd<8Uu&m+O_j@VkCcwh?cOhD8OwX~%C8lv z&k|NT-n(s@TD=vstVTG)0+yWp@7H~8+O4|WPbSuOhmF~zkl$6GZcbWw>EFS5_tTB7 zYPQ{-vPx6ZrRjXerGvdI6bkOlf6E%ZZQ;rQt$-P`7B(_hOMn0J?54EDSv?7*U0-(1 zy_pkn_ij+@a}7Z;kEZo&qb6<)?OyiebxuXqHoM9ht1tX*{;Z*CQ?GqkGbKf5eN4<N zS+f;qlAWJ(*~Z?Tf5o>qAYb47M!e_2ML!SSQ)}(>m%5oIc3LEE?yQOx7BYv@gq7>{ zd{4UCD=cAr(f;CeBD37DZLUu$j(ktBFKFv|yg1r9A~jS{@eu3c(n%L@A8MHJ;_i=J z<v+&VYg)Dz9}hczJZox_;;X!R%S7imqrDdw+Lo}3vo)W+98%5ys4gq?%fHSNtJ#-W z@4kM$IOOy6?lobzq*T6ac=&3iP+j8n?x*3W0`m{w**l?6y5o@6acB1Ky}vIz&s=Ax z>a3$vZ4|ij!}WVdjEcCtU1erwx@X_5U0m5H&*LuUo#=Fo)$qStQ;NofsrDOeTIxMD zmqfnUX`JjaNt~ZYWvYY9l>M!GVzD#4&OX^}Yv>%FvFG3FnEi8G%-1m=YMO2Te%IAs zem|O)-4)&_c}aq4+b8w)EXf^P^e*lW=Gd@S%X%(DI(NYRS5G6uA0##u6z|?~b8qk= z%QdV;58{kk-qoh92&=7MwuCcW`RUekM{+s$)qhWZy`;L+<i|GaM;w|zBfEF|@1L=M z)7+Qt;k&p_&w9D}$wHR5QU=xg9(-Dvt*A0fX8zv4RpRMVF7i1#c00QABh458dGveV zuIGn-zmJ*tG3U^qpYshw?xsX~@BeXprANShiCzCJne@#UtEzbHPKuJ8#?oFZp30*t zasAD_#pMDF^+A0nru_{5wXlDJ!z|XTOWn&<PpWU};kahw8udNVVco~sh71-=?OZ#H z_r9z+dnMd-Z`7i*H#mMx*jAyn@o1bE<Ib;wyS!L;^RotCnsXv?3IE4uQ;#||SI_f{ zj@z`%*lpt3hZB|OdnFy&zhLt$iwOazQYOx{Gm1Ua%kMqW!{D4&J>RK`0()2Nn3&vC znav|4c9-LEu>W7??Ji*~;w2*fE)v?4S|`Q-k6I>sTIJkBA#TP)Pj=TIE?yTJ->RQ; zOkZ|=sO3R!@6UT}58YDIicP$IMa3cdT7b;XZMht}*+)M0RtI-Hc6_C`B(l(c;@1}a z3u$}`TjW--E_=t+5dLtge^vcETmIO+Mc3!Pe%`+}Y`)yOeRI23G^Kw%cDBsx)+f&Y zL5Ulh&XhfIGMnmQKCPv`=b7kV)rZyU2VQ(Sc4E1-$=b~a|DP6ldCze9p>Gf7n96X4 z2aD`jHKQlUzV04pl2_QSzfVKTGdET!iB0#|so9+<KT*<C{M5_v3SD7E7nOHa`Sqsz z^k4pJU1_V@8vi#`Lpbo<ueWEK_pTP5vQmXt`DoSFbmNEL+Ppj#=J9Cx?A>p5!a_^T z?`OBby`|CukH7U+&fb`@&1hH1&*0fdABk-)*_RpO@vNh_^~16JyFYY8njXfla`{>< zwf?=Mw_z2ZZ{vgcbsIM4>Fi;ef8EEXW=q`DdXMu$FQs-g=y+_Bd#Z1|L}Bj-j>xv{ zi#KgwZ(|kUC%tv+*B94>MAz6_9j*HK@f7!Yo6`5T(&ck3x9+L0E8Bj1(!5on$%*As z^S@j^{kYV0Rq34WZI^sgH`zJ4yJ|B0cq!4+`)}c%Ko#qYJKuj=|83WnMNjw@ts-uP zzh_JSHRZ{l`W;`hf5;`CE2)mv4T?HF$2T%4@Ji<ekNaOD!jCyk6Kl&X(0lvlsp;(i zwQgBy^U|9(`?sabZ&y3LPJ6L?b+zB`!>hLlue9jvd-#1(pbK~Iu_beDW?IQTDr-@e z-u_R@P}%8){9@(Fma02?ub(^T|1B-qEo9QfE7>Xg4X*g695JtdcTE3}QQjg!FYYU| z*ROC0VYB`EMSoJFs%n&x$hYJL>=XW7?``z{;AdQOd`bdGyIaS$TM64UInIZBMe!`S z^mA|3IrpSFefih5EBbAD81wSPUr8NEeEa9%Q(N!u&66LOF5j;`muF@{=Y7c{ORhH_ z+3$T8JpDN7aX(Y^o}~|8+^OenYkqrl*OY5Zqt1(1cbVF5&(;$O^Ei1}`C0aQkzLas zFSF~jxoz|IY01uM;%g?zTjZ*p7QOrRO>Fmhb=~vdzr9<1qGHX1Cvrh)@pEQyxV~6D zV`+Ip(vd%N&hPoJD43*`%jKe<92oUz-|u<9v?niiEo)Ltp67h{(XshTk54`-_*n0% zopWr4cCVJh4CV##rGGcE<k$b^*|av;bnnDx4ZmJ-71w7iy7y~cdtdASwHy16ZQK5D zsh<R+!a=n+5r1c2y}Q-f+4$F&H4i6cWL)v8o7}x&OSrY^%L~)KODX&akNUG@?iD+p zRd44kVToL5E8e^Kd9g>!i)nh-(vSGMz0v<4bfW(C|CTq0+6te<Y&W|5<>AZAO@9yH z7dBpGcFA&W!rZvTpaPXd+n5`7n}s|LPR0JOO6qv_X<~%`J+6<^{||S}FrWIL{U3jw zxyb{IJy*7@;&`RO^*&^+z@3?4PK^~M$G^V4waP{DR<r+RzB!u5t}f2~<GXNH(QDOr zhwj|SxVv)7r(g9=0nE~~io(^6Zl_DAzujWLJ-_RR>sr&(uhNySO64`hc3x*y{kK%} z=YRcox({ye+En{+ubJGm5{ENB+ft&JS(H6F(kFYnv2B*gOB2m<g~!$vx6RL-`H&`O zynm+m=eq}wpE+~p%%52`x7?p=aBZE-&&`;r|98#a>v4bn%M0nx>Z=#BRXcr3;(PTS z%X=rAZ@iP2JZHYR^77sDt9Csv>Y92xUiV3{>SEWAO>+6B*B4td?_-@J^f>8a$cH&E zop+^~M7+y${rTbU)tNhMt{CM1=iSZQRsDeJ%c{FeE``3BAKFuqzPkFGP^VJQtnz={ zf5QIQUU5~w_^2T6^Xvm1Kb+^aZ>s-b<>>l*fmS^G>>mlABZ}6~(=49&%A&5x?49Vz ze3>bIO|_CeQQ}`uEqVBYXUR>u=+D*ecIyv`AJow1TfFCv*`;F%kFUp^UwZz-Pga>? z)~`!$34F4@zLBdr(#M1KbBal%)^aXG>Hm6n|G89NFXK3$B_S=|-o8H}tWIrutNq{Q z^}3ETk`s%5-+t~8e|*ZJ=Ubgt&F>KtRxc|PT<|G_y^jA6!`em9HnbTmWVw8JgVI~) zQ^#AaOD<$y51Zw)WQktIyXJQLf43C5G}f50#~W*y)i+zU_AY<4ar+io_3syL^TIx9 zf1M*-zL;y_uHbX&dn$HGT)o`srt)jq;#a5nLN{yIi|q@VJ@f7R{Yx6=$%shJ6V~QZ zEAj4KUhe;8)8<Z<ZQHhf>^=DFg^mBh*Dtj9f00NKikfeyq!q?#Co^3*)i&tj@rB!0 zeai0m9C(ap(}E)kCrag1gX&v4WHvLGq>6C8%gL9EmMV!pT64#=#O;FSjj6W!HxBG` zd>Cx*vhTx*YSH>PZysfIvnT#gNcIxCw`75UYWmLo;w!BaYDE3@cuVD~4sSE#vnjVc zo*=km-e(JeWeveM`}F(Xhbr!`a0y)fW4FTwrMSPAzTEF8ILQ~?owuj#!3VSBU-S)| ze>n&99oxRYvaIHK#@5}d!}s?Hxb-?*-jyNywcXg*^G&>2n?YhkecyprEq9L<MV(oT zw}wAgl6`Tf)}wd#2U)#SkMctGuGpTRTF?FU-JjdjUl;CPQX#*WPw-M)Fk^N2Grg+} zuit)qsA+oMTx;vjCGVzf%66A|xcXk+u@h(HS6@GO=hA|(CDU}v9;qc5JmcE?)ccmb z{EnTyHjHN`-8>-?x~<{$;#1c&>pS^!7*aVVNHIOH?l3y@qT55v@v6A<gtYQ_hZ#M; z8+@Ny1x>M3ZMk=*_vnX(Q<z0%_X!@{d0l9YeNchL=LR0fBCj8kd=U&QB<9VGdY}B< zKkw-4=BTX~J*Jp+e)`gXATla$O1tP3kHcMI3DWNDJ8bNf1>Ict1W9Js8SFEvdRuQR zIj2MNb>xe$9TVa%=X}e3v~~8}S23oS*RI$$F<A6=%)E`PeP`CGWMx%u-FAEW`@e4Y z^bU6BGabCr$H08Re9Q7I)jK**XT6Q;`B?RD=VOUt$+Uf+e$Toeqh;p(^V$p9l`C(} zW&QE{1GD_opZDulvNSmtw8XLsusP`W+3G$2S6BZ_V(CYh-7W$fUJGYTF1c*HkH@Xx zM_Y?iu`8$g6nVdvc>j02oh8d$nPy!1)_HYm;M+}6XVh(cCvG^TIb%wX+hG}H7H8J5 zlmAO?-bp7tOB7@0)7w#V+Pk{!l4!*2^~Z&MTeH))X3v=Yd*{v5o7dhHI~I1W<i6va z@9*|rP7bwLU+>bzxyEVt1mB}(Vd7I?`Q15Z(IoN9=hDkBQ}^_(&y}|>S}goNc~Xbe z#M|ySF8PJ`E}8w|Xo(qP)b4Lz!alz7d|S*B@c&%>LD~D#e;zKJ#^e{~sF7G@&@Cdc zpu_pe^seT0iJ^G`3Abyz`$J{UJt~ve46R>sWrMZgf{p^OCqJ&&D^F|B{qlJB>+Hpg z($_|vOMkp>;lkj8tSpW4N}sd?$`v&V%;~pGS%i1x6<GZ9WZ~7hdHh3sL;UR-*Q?ZK zZk{U4y(lIn?Vv|Z=_8&Lji9yNTjxG~>@s(&<HgOzVh@)wn?z}5?~O9~{V7akW82!# z&(!UcQj|Pv1ZLI6UbX*j+EjmZ#g*wDIyDJ;d6}=dtyFo|Y^`EXeA2t;fX+XwOBeZm zJ($t5K>XNpj{>D1x-0?<oR{xVvp9ZTWWvSiTY|oOE3oh!H0F=Dmx?p#eR%BEC!ghE ze(F84#ml3@Tx}NolxWvIa{o@_oIL)n6YE+}KlNIwx4mZ5%*MFWcjq`fsM|SjQ+@E+ zC3AgDe*LiOeweaH;$Va1Q!(|IKYbQjCKwnWPMUVlS1@g5lTbQ)yyun4WqW4UeBHgd zS3>^l{Y803fl=&iGm8Hf-JG2}!|>0i(}lW6_ja?fo?5Z1N>H)px&3{~1L1#T@3`KV zkCI{7+VEhpLWPH?K{Lm*h;N6V`2YQLWm!^9z4!;q)UqdmXZ$!5_44-4yRxBrKf|Zv zyXRHDD2kNp3*W6Ct`)l9hUeeE{*RB61il3BJpFXt?~51z>~MYmv*6i<KP>4FUw`?; z7AfPfdS0JufoZb()-8D{Vo45`!qX0Y{#(SVGp*$E%AKr2ws*Z%rT?a#@)WswA~a%G zoW`+_M@tUZcc)6-n|~(otH*4O2GQc}^AZ`dwgh$k+i1V8#Bau)m{Zpt`(15RzFPJ? zyyn3&r3*I>9jKR%obmkP_O>WFgO$w(6r~Sv1ugyE?%dL;@WWL_Lh#MB_x>-}uDsaK z5PNRDrofb{@b{vk?fDU9PbTEY<S%)BHE!`OUGMfcK0Sxn=B=nN+AwvY^fRT5!nRkk zVRxHL6&H849_9@GeecY(%a=0FoVWJWE;hNj=9%`>rpa3BEs0ao=en)C*!^|!s(Blg zHN|g>J=3}Dr<y+9(tNe5@NCYxn@Wy&ya~;|{PUc~=D;KK|13V#G4ti(i9VY{=62p* z$#u}p^3sW^CGV!>oVQtJqP((xGuN_>*{;=<VQaOQP2BWl=j+XFFI{+ecg6oJn!&E< z@b%)%%*DphPTYt8`7{bMZD?l@=6PbU#_+_UJ^7Q|U$34yC3m4}MA9YwUuB0PSMjH1 zR(|^WSN7PUuf=mcQ}jcl-#uKOKJ9^XgXY7KR4LD(38pvng&u25=twQSxkG;4ZGn2x zo9mY8pON56eyL;7Vqp|}G5&97tM8;>g9k5C#Tx=Q%G|wT;H0otYbTez!+Y28w&_u+ zJ&CM44pg6z@Ba2yg`>_p+>l}7<*hA0%!Fbui!`&ue|ej~`{T0H;@`{6+ui%WxQjM8 z>FIGty>I<K>#@FF#J97Lx0KHD3UZsJ{9nPa{?q!WHBYA59_ckb^zQtZ)A?KPR5dRN zv7O2DcI8vG$vcxZWxsqaHjfR+DsFw$T&J}+b@{8AORkzOnQU#T?xmXcY%<q_O+uHK z$6Z!_nO_&}(zB{y-S4*PGqx&sKIvJUR9i7GBQ{*VdQ;t_b?Vid)~Rh~UH<J|=}T5+ z@m~L$kkdQrTax}JAAQR=ugcIudXK5q?Bb029kbIVm`@ZxY*>0V<-ko{R)%BE)AkxN zc(5=Y+#$2s;Qs81KV+;|X}*w|bGhm9hQqc~Cd_G{>srCK&Zg<Q4dc$M>=KhW-LG5p zMb3F@E>fzyws~J+)t3FYdStcF&%9B0<k_j-mUSoJxSh@3eZaDQ;l}R~6?^)N*u(E% z_Fqz7eM<Q|f8u_zkJ}&qKH=;eA|J-3HtlEi41TjE{9No$XBnUT{p{`!k&tOEmnF;1 zIk>_CEw@FlsQpzu-BjV##b?(h@7<L<f7LNvi~2S3pJIO4z3_jtX6@TJ+wCV8zkG4% z?59U>?XN{XIC<K;|KpXj%4eJFgE{X1lrA@WVBd4@Gt;hCIq7+pD-#cLFW}m<ovFl~ z`QTHR^9z|iRUMoW<sW){>Ee?=X36+Cy;v%)7cW(NF1h#EQsdn93)y9NKM*-wbV)=% zbg`m(*QXRaJN=DiA2k{3IxcOW{(kSGtuJRyu2*FCIq)f{Z?>P+%-i3$%-k1WTohFA zFW<TR@kXB>M`?~kpNCRYuQDIn`a<*flEof>_C=>XxhoOWCUno+Vou01mzL$M{pMZX z+uq&~c<z!Z<Eh@B6@C214udzk^7Y4_-SIH^akt^PTAv$l<3|2h>~jytZ<%q6OD{!# zO>}DCvHL!gtFlXk&%IIFe{C~keN_pc`-RMsq<RaRxUVmD1)e{i{lr~va_scN9wv^h z7Z_camznkHeTnMz(tIf?W#tr}a_n%^sy|5<Z?@Z1c(fMZH2=zS+V6CV($z{2%eLLO zFLEqYx^=zc4r^eh-&ON)ZO^4S8Mm!dALg%@aW#Ffec(@Bzy`NPF&B=@GcUNg^3gMe zlasote#hUh|93oulR<aJ{rJL<y8M6cUF2K4c>CW=G6ozc?Y%k}*}f?q;xO2CborY8 z28Ddh{_778yX${)bZq`P({J%CU+ciu#ibG9PPe~!*c)DY@%zw(r=DvIayrf}Elo}O zc--oi$I+#2SAN}Ddp4}dFH1GA(ob`J=FU$ye&pQfbx39EEl#R8V_&+|ad*_4BX4(h ztaSZ-@zZX*<!J&7jt1ubHShiQ%%tjjKsM7tb%u!sMXOnC{A2_es_ar;z4YDmd|6Me zx{P;`q-(+Jg|FA~$z~p%F24J1lxo((%LP#<X1@3-5OzrT@|M!gIcxGRvtHdW@0Gjw z!Ts-AR=l(IJJdO=fpdb#y7Kyfjwx5fKDTIw+{-#UZ~x0jHCnHpi7J>_UXJL>SR1)o z{HVa}-%p}9E&BHQaoL&`1`G*aDSA&u7soKN8J#<$yY39nwi#2`-nbalvZ-QwQuL}- zocVpbpWgZ`Ex7%HTf>}*^WHuzUm*PA+IO>4GmLI<&lIcK<?Z%lxvUnGcW|Hcx}f?x z-8nfc?ri2`p5!g5blz{RRKNKghr@2h@7C?|epqpMhp+KUz1AO&KaZcftMuTLbB3tc zQ_=NHS{Y<s>R8Dco?7-eVD5vTtcm-UMlqk@FuQ+A<P7ihSH&x%cJEs7$ct6%!QrM8 z7X>W7OPqJQV&Zo+YF1mS`k&MB;WMtWm8!ogTvVU1cE`(<?8>7X?Y~zZaJ0D~k$Erm z%hH984V#N*O)}j3Y|i=JCnVF7^*GxePP4kVj$zXM+x*F`3=Y?V4=+1cThu?{gEr6d z@8<n$_0E=Y?F>;$(qf8jJAF&y-^+;`EM!%7H1f{bP{Z2j{P&{grz<5-cKrJFT<1B% zrp^^|2e-ZX{iHs8%8QR8&p$Wk?Oe(z)@u<Qc}V-1TIA;2>#p4TT;|=FvN5(ya@{jt zRkr(`5!?SOT)w?zlEtDQf9HR<sA&BdX}we7SK9NVTU(Y^A5EO#oNwN}ch>FQTUWTe zI=d?S!ur2C-kmJdKI$LjzqstpF9jZvl<Uk1JvAJ+<ZR9`^sPBl(pCR+N&1TnVY8zu z+!0aJtUs=(onS3kV)w-8|2n_27xp~gH%9drxv$`Ud2+koxpb}GN}-vmXXc!*kk(zA zcunZ!me)`EUd}%LCgcCieX_oSzn}f!mP(h7+b$LC`u1=4%n0>czoM?a3+wS%WEQ+) zj`iMO4-NkP`FXLtman#ag<a)N+4{u>E7Px~GMuuI@!P@^FT6>sX8tVCt2JL<u}|5w zl<5$U_fj4exs7HkDq?q6y?b*~I9s_UbMrL6NVY1zdE8$w%D%qbEWJ}8=jjhC_RN>c zQ;WT9ndSFd?E1T}>L26j*uxS1H#+B*IW=Z&na9v|yD$5E?1N`#risp9Ij@4}GyB$% z`rvH$iZxfa@7@ykc8Ww>&cs<k-e>EjE>GS$CvQ(t$-K<Zm6tt39PGpP6kMo|7vZ`Y zQ&*v5yvSf@c>L#Ybu8ak<-NBpPAg7}^?f3-=lNf!U#m~O5ZOBMYK7mqKTAt{PR>-G zp|$XMl*^14Ec-JW&UNT<vvMV#(p?g;%4R*IVxmU<DyF4>c5!g?o=&#>`@zw1(S_*# zDSNDXlw0OGE2mB1?!UU~Yu4_-wWdB3C!1N`d3&Tbudcv9*x(HJ^Y_~g6aU^nH1#Cw ztpkj=8>Xz2d1!L^_C}Y~vnHNv??<h8GUv&jb(U)DZ>KbPnq9nSl%my<+`aeU$*erL zURlqqt2xV?ELrP?4A*2uoiFlc@K#Ujn>`~^V0vh$tZcZk;jMR5x!>-vm1aIySQ7WM zI89~JnRg{7iyF2WMq8T+A6y%ubU*KUl7oT3xwJQjk9f^X=}9T8c2oU#HoBqS-fHvn zi}n&x&l@(&Y1lBcOnz{Mt;4vr@Towem)r94{cGL3jO6xy>9)OIFL>Zi%B0G|sA)+> zKaRDuYYVp*{%7B_Eu$cGy?x;`hq$XV{WRYnDG{~hKhGW>TE?`D>DfuiQ@gEa7JL)m zvrl^B;$6bJlJOyxq5s!BwbNZ>y?5z7N4MfVF6A|Ij`X=roe_0^Q>j<BG52x#cOiSq zDxZWHxYTT)lu;RYHt_YoR^R&jb^XTWiZkCuzufegrTrA^@n1Wq3b8vG{hirvF=KM? zqny(R_k8=-SYmjxg}c{yYJQ8k*uPINzR0^zZx`RzsBQGto$Hfjh-J_ZT^GSaA%|in zEGv3D^8h0&uk_bh3zI{0SFv-P<lkBG?@Qd)J2zLEX+7=Rli9huW9m{bOPO^V{`Hfl z{y37sc4xvvmB^&HeIFfMM2t3Vv*-`IeSYpai8C3cb7Lk)o>6{wan(Vk%*$FwLd8yV zIF(FZomckk+0HqFo#A40o*7OpI(&5E=I)sO)Zlr`BJOf^znl|bdjDm-{mkB1yMzN( z9_-k7Xyd}@$~9+R95Cz^^X~3{FTxve)-7(SRJ}&?@sbTfa>?$Z^7lD@=s&pM=jT<| zYZV}WQzB}=%_0c{-i(45wqIBcMZ~suKU~GR*RSONztXAZA2QePRA}U5TK4Md)0=rq zr+8NPsa^1t(5jiG_i&<$wc<vv#dfX5yqg*eKINaAr(m^AvgE<J8IJAD8=TaOOWV1a z=084mQsh}ZQ^A?NfopB-7&Ck<id4>?oT1$QF+%-fzSfoHPE}v^6Z?Kj96WWv-SV5D zlHR||C!Afse2n*EXfv49p~O&a&!EFLJCk+2`}^v>pE|zYWsmbe@wV^RofX0Qo=wN& zv(}#xp7-Jki}=z<FVqwy`_BHB7TwM%D6{*htLK%MOh>oxud4r@Es}g}gHlD0(T}zE zar-}B@qe(Nd+C}4HWA@J%v}GD7}k}FpJV!Up*{cp!5tAlbevMS?pivSFSIdP_b&OM zzfO|d;kqPuRyWR6eWgYX;V&;gu=oA)P)`q9@BdS6&$r7RI|TezmoW<#{rF`hd@P;S zLTpC&;p+nP#H7pQbqnR|jZC|k+5XNpU)AhZy0&^*=#`3hriCm1{ZW3NWVPY*eUav; zflgtZ&Q_X6+X9RhO8-~YNeny1&%W;5yj#bXB|W;^U;0ZdM?P4{v-EMgTdC+DK_9zc zflizgdH!saP+V61UYjTQXsyPPukx`~o7ooZDS7#9_tr;0(|LQgYOBZn+EV}5dc(R# z(St198+W#LntlELQ0!<%&%xvS%Sw{BUF>f=cFL(KVH0P@CxccCr6c#m=S=#jY$jr~ z)8^pri|zZOD}8UiQ@%I#y63*elh*I*l@olIW>n<tyT9_($)z19C2uXetyON#ootaD zkTg}jP3*5!tL{k$<}+_Z>?gz+Jv-(aT%WVx|GisYYorYu9R+eDjueDe81k*-W|`vU zH6!g|Q~AZ-q5~VRdbDu$JnYk1VbNkBKc7t{>7(7j^9>IQeyeY<caUVBS^D_nmQ{b{ zug7VM<m(%+TB7<s-GynVn4r=tj-^+e#4oTvSQ=j?W@5S}TAPI-m}jx|iWOZIf$X7| zuRO08bdpf{mc*k|JBxYg%-SWH$4Z5Hl+#+=xBL>QbiJClcOm}-oy+b`{0rLuhub;6 zI(Vyg{sOswBJv;WW33W<O4TYqK03-DQ}ciK{h!yw*V#Y3rro{y^jW`~j~0g{7&OJH z?%AOAc)NyM@q(|XEO<AZ*kQ2aiHAqn1*6$_zI}{m`dq(pPt2t2^G;knxJjY2<NW%E zKUHU*xjR*0&zEx6KYh~~eHJC?SU%mrF!A@{|C3gW2|VaBa0&iu7`@KDBa_Q*|JU4O zJLE)t4;ThJdFKC@^yB!KI+1<94X;8+uwMP&*7Vsf5?1EChRux=ZvU71pQR(gkQhC2 z+A=QBGC$3SUi~NB>eUa=-}Bdxfo=Nv-wTwFH@2ut9Ns^#z-jWj^y0eT^;};2Jlz*9 zkk}%k%yQb!bElK!;rmZ!JZO0MaPMM{7m;6ftM~XD{qR&?#PWhAv}gIvoo&mR=dUqp zv-olCiDI_a`p=sERmMDJMh)|J6#YB%?%T0XHSuE2e<wVTtnjLzJ7Kv+z2nueQ~5nP zXQuHrJ^np$>)#uPnHPO7NSqbUx?e5w#yhi`pQm4`zgx;(U9rQ&b?c$HzpuX}&WV>P zn!pfK^>zLP&5}12cJr>dfBty;MYeOUoWW{V{_CE7@;S{0N#BbuD|syz&blSR*}tad ze^i&i<d;XToVp%6Md4pZO>J6r<^H4fJ5^?I6|U&@y7SHEU9bN8KX;8@vD^sI>@_mm zVsYTHUd2ige-=lrf9@fsx7XfzZg<Fzab5McU%4;7>=)l3Cws;6dPlir!Ll#@dH;nE zJ~*-dqp%56<O!i!j8cXoKa!)|SE?Hqx;gIt>(6m4;kNbC^GsqlubD=__~6gUy3pW4 zvPk_mNz<GrPVstXW3|0`Vv2v1|FB;u{c>+%7@JFa^Ulip`yE|^sUjPlS)DpI?A32D z+<!x6a_hwF(Ni8g4tn)?dfB%AwK`|EN-cHLTF6x*yDsz2TZ^Z^LS*Z0q~*#S9=)^h z=l&^t)Z*BF_xH;q)Tc2AR7U)r5oqDL-gf5%%Pzx&dQ;0i5vwesR_e}p>$rV`(dOX$ z^A{bhNq={=<(%b;d(+l(xO%F{>U=rk_IHL`h^%^pLHRScqHj-U=`dgTaVGKPfmg38 zV?FLJzj^4)webA^vc1W6jGrpBj>>4a9@@J6T;$qoNm*MXFGwh9bPD|I=s#I0UA2Bq z{&U9#hqupF4SBG)-hf-UL&=e!Q^Dk3*vz)TSN?fNZ>Vr{Ur%H(diG;S`qgYbj~|EK zCZ^}Vdn*?oEp;Vnx)+zf-{j?<%|-S%Cm-=^wPoS%-t=I7sgC#L<;*8uO?h&CoA}dA zwjK5D-3yK|o{#hWRbo8RxPSfojPjQYW^_p=^jO+`_fq+~vHOhA3X%FfD>wh1`KCBH zy?t-S_8(&0$zNA~=S{vB&3C|W-r6gxf6knL`s>!$cXyW7Wb|2P7Mu`E4KwL4X83x^ zV1E1_5oVvpdB$=!K4px>i%YKsm?jsb#vSaxZ^v$+KJmor<KjVb?FY5(j~u&n>*hZl zt_k<|TUfp1Ur=v%<y)h&WwqG6!g_Yjbp;D$g6hxBU^sU1;|@;dmPfy(G`gyIS7!O} z_U{($5;!1IQ}J;zYgT@Yf}xOvnOuza^uop;#+SAK7Cf6ezxH_ay!vk^Ur*P2)4Qwe z@4cMWQSV;ed98DLF(223WHYVvvfnQsKd&RT_oK&Gp~jCqg@5yu9t7(8yWO_<9v6JK z{@<_s>y`H|&Cb1bsbte6HK&v_M?Dq`X<XmgExmh|U7+6P%^Ys)H_j6D%A2>fn~jm- zP{k#0mr45ZYcp7m%dgDr%wM+e>J0B2wp~{{_)hJbx9a=s>6^q(rrkIDahgr>`zp!T zf8Xu*S^Mi2x8(ONd`t!bPA2ott%>{Z5OZ+)N#`}k>r+`?$T%I5dwMm0;(5-_AL@q{ z&h&PP2z+l}`_w>vl9h{tS(s?!a$VPx@y7*a?1~;{ujhQ*+J51MdgbS>tJ$m7`_}7i zmFiy}BKKbBinOEeS$(~VNjeE7enEnN>YY2Dhn&*Bnv`hQ@SU|ODd_G@8>74=Jto7r z%9ym&8G`*r4E4fFmbrbOoctKiTv7h|@ZPOc-0IPLryhBEcFp4*ZmcqMUutUowOAj@ zxwC32^VQ26>x}mnygTym<Z>B-t{$bwyIWp;dC<|y=%N1ZS4OmQWc8Z`YoB$$oT>fO z@zBeZbKlGLL)X7C-7LZoY`W<QbIgyOn;T{dW$In=pFd-N;j<qvTk9vso6g#N`}yj) zy(<kJ9>0{W;jL>3yWnamzS(vK7njEKq{>BX1{SJn=?p#0yG89DD=V+QmTdg+5wpYd zb8FUrwR)PQ_VUODt~Do4N%q`kIg~%mfAW*?CvR@-4f$!eqioBC$)^?GxSl$`ljl|U zW}OaG|0<JmFLoitJ6=XNA3d$IuGifrlrr)C+xIr>7&~iTN_Ad%-0yCAW~t_G+c~*Q zyS2LyEfHaGkciXVXX|k^=EoMNGu!WPnbaRCVZBU2%luJmY@p)Xk2)8H<F7oplD2N% z?cI4BZ~tGnc|nBlvfx##rbg`D8>i*&ceQP~fLo`vbVaSm&M6o5eto!b>)x83QzkEE zs!tPs9mVe$dC_o&1EZ77&eq3F=k_u5*jlQ^P8S#4|9R{5-y8O4u`XQuSoy(ypVaNU zx=*dRb9eeGeeW}63pOyO%;a9VR#<B?*N<ke%RU|zm+ngLl?a&o<j4BOGwZDEHa97M zxp8yqzMUUhXGcBDn#;G5_w-k-_@0CfW_wON@R}vdULP^L{!wLEX8Adx*Zf63AGEI> zUHsG|w(;-cVt=u-t;PB^icQ;pu8t9!YL>UkbGB~4>$l>Iw*Oy#YLWKr_?n6GD<fDH zH(iQ;Sw3qA!+m%63zrHU*&SAEdpa?`_hnd8<nJ^k)9qWmZIyw&dC;ng&XY!u5Ag5P zI(VJaVv*3tOoj0JitkVNAKaB(!MX1Lsej3VJsY2H`f=I4hv$9%5#5AE+a54(^U1T{ zc4A}F@|aUe3(71HY%UkOEmSFXyT*y}@29DYHCMUMuiD3Wfb&ZI-R()wzP;<#I+<1T zn7dE6F#qaBlhg8t>e+M`%6_r_-!DAZYN5uO0uccL7Y11+dDZIE>$&S&7i;P9aZB<? zitWvh{N7tL%SWtnk8;HYP1pA`s)B!o=jOIdi}RoIblo8d4aqV&o9}sN4HP)Pf8Qo| zB=X^6*#mQJT-M#2u=*i?s?FS}xRXo0>=xMsYnDm57fD{!yIy@@PWIW-H4~)T<9s`h z%rk#;d;jwLXDeP-9VyuQT2#FLaJ^<iTDoM#u6wmRckll5<>=q0RBQInH?I``X6-+A zWTxw~?bA$o3Rms<b-h|U?$^?zpWOEOcE7(rNoty;t>nA%!}4ykU+D9FP3BxvklHmV zHBiidCW}tNLXMlo%&eM4;;caq8s}Rstm#?ba$WG)%7WANSr0!bJc|$ao0VIWtaOgA z{+R!%C^?-orBS_6D+9KBzj`re+F!|8tt*#*Xzf3~t6K6&pr7pGlJ-g+)>FI(x7+>e z6S}A?wcjvimFR3&<E5IM`nAcbn`~!$%vu#WcfUz^*UA{(Gq?SmJ}2dCWgk8q>~7h| zv2^!?DD7T9^Jko<p&HAzYr{HH9%n6kA~t76S7$xzohy%LWp(x0bibR+_-AWiNTHyu zxrs;@qi8Urp@a1cX2UndddfbG_K$BLD-gGtY5H6);*db%6V07LeETGod(K@v+InoG z(DW=D$Gb=NE^RF|c~D=yUp_p)MdL=Mlwthd*Nzu97`VCLKWe6TePQQiGXoxp<i^S% zi;r76L#vn8PcXPL_4%W3^M3uSo8oe*_UO4I%A$vMT#)n^yA-zS*fq0c|H#hsZ&u3G zm)M^2Je4fQ_>-UQjMA>9M;fH}{CnDb_2A^xYh}-RGIm*rALJ^XxoEY@qQ`ThH+D*g zr{6c<|K~~nE}duPTV{W_|A0M1IG5)-mq3q^@_`p0-Zdl~lNTtdf7(~|#=-2+ugzP% z43u_o&gQB=D|qnt@#%;28jK~w>z+(`urb79y-#?5z~+pbA3mkH{S-`YDtDhUx&C>4 zr_ULY5B~3GK2Td>v}s*^*^|kaSF}zG@V0v<80hxmtfzR&t-06s9{pBzQGcn&AFql> zje*?zQkCZ1?)%-#yD?^G_vE(v<b;h&YnW$iKh3`D<Wy4J9rafBwS0t5=riqiG5^(! z*V_Gd4)AzYw)ytq{qhmzZ-4rHdHnuXW$_)YHGjJPJ(B<bpp)PJzU8-f$yN;3rLWc> zJ@Wh7_Djc}eUsSwDgI$XNtdkU-ziKjo&T4}Y5i}R$lr9r$Gn9h)SJ^kJb?XH&+d9f ziSl3EckTa*^5mX5yz1oSqfgy>&5b?R-nqD8X1`U|?q$Zk>(4GVVVYCRt(})^_gLlf z(~NJY-mloull$>he$_I8{#V>L_c;BXb?%PFzMRAS7gS5iDgw?VH@#L9V|lNrwjyC4 z|99D5<=xN!ou9|awo{~Mg0}k3bMtP>1#aPawz>Xgi@L=wmg!dlBoF^|6r3NDrPi$d zc-zm4im!H`>@|z+{f<3<vNK_4{-UBq24byyCeDBTByE-P)t<?RqVfWDX7lWp|H|>W zN=3@ovSqf`@*AsDS8Zm_OPSxD<dM>`e$)HVr!5QZY#0Lt^TQUeOj|W^!^%TS#(Neg zWqW(?t~7raQNJ>lQ)uymxocCWrCn_k>i*%fz~5HCM#bs<x%y+Ve{8QfWGjbg3vlox z@dygNFl<}ED&gp{tMZf2hf`PImqxubdg>W@b$V1T`>{1jz0>Z@^UT;{bKsKTpKCKd zy9oW$ap66+J?Pc!J~`W6c{f5^YwN0CN4^qE`e81`^>SkPe}i}Rvo|H=9ewxU?c2AL z-7Xp(S>7+t-tpS_({sN&nZG!?VrPa69Oz(rU?uQ^SvkZnl;Kca+Vq>@42tRTK0Oy> zjZN-E$ebz5o?3IQPmAg8p>?MYPdxt8;GNyFZbyq*BDWR>1gmXcdi;Y2-@mC(<qpKY z`D^<}?AE1%3zvNT0~c+3dMLd9ujggn9{(e6ZW^r)TPf*h))w$vGmpDB%e(X4qn|xV zM}2tTf6{UBd2H|g<w>&5HkExpSnKCiK0BA2)BkNne_8u1b{5SB^`0(0B@X2#enx>) zC*D>0uyOG3n{!}s^F8l#Cz|Im96xenX=}L69nQ=R%mNV;uD<gWxREnILFvTi{q=VF z*L?d;|9><Omg;1BUvm7!Izw;U8u#!Y{Pj!@3qC&H{xx~pqq;ZxVXO;f>YwkP_P|8# zVAMgLtNiZ!{-}QWmzX2QVOLmEs8Vm*ZmC@T@bZI3Wxf{%8%|$}E>4J9B(Qj&@uvxM zjQFOX46l2Zm|eSO#hRD%Bm-+a_Gm1Ap<3Zt|B&%VSq`I`ORw<l?RPY;H*<uFbsox4 zc-SkSC3B4N&%6sK4mm#4ik~AO=)9&N@?4pD%+<{wzdx+#X}EQ+G=wSS!7pKT-bq^< z8PDIiZ8ee6(N1pd`mB(~ry)8MjTFL9o?mwM?VPT&Vn6>b3Dx>LbIn_U=|anv#)`go zN<8c_BPUa4>%`|phhKNU)?YFs@tvEcXNA?$Bgsx~9EVEoU71|%AX#5pXg!lN?>KLP z^`HOjclzv?_FaEyoe})#-!2Em=|?*r*}DAw_}AIbpdsG2?3>{azT}N@`DW3n2aV^> zde5zPU}YEovV#W;4llaW=w+E=G>0$6O`GXD-~E%7f^)4ECcVjA&?IBt>*RFwSzV;2 z8TZE}XLmfzxPAQS{Xbu?=zdCeu1^wi(VZ6F^R9E%#=l#-HC>91y|wPl>3Lc8?fO3B zlZz*AaWavr^*pSwr>QS__ukdJ&72~le0SJx;$XcpJu+Xr_vMcer|S~WQh(>vI5V6) z?x1QL?9QrDaNp3Z=}W!OVTnGCRzqDbHKW#!e*SkJoc8XEdMAf(bbNg5(TAzp>z3As zzxwFo6}YHiZ_KJWU)H4fycBzVb=UXnpQUPg_4)Op9ePgB4zG7_QZ;Tjzud+8KQ+HB zciV?EVM{~TzWH@NeAnmFAHQDQmYEtczpG6$j;TxK&_si#n+xR^c+coMWBD?8@_Nrd zKi?j#QJn6#)69y?z4cGh=ZCU&4F`{%cWsW=oL^sK`d1>N{^I@qqq%=1_oOj&);%!P zzo~yz*ZIZKOYf{rUp$ESY&7)H32`~|dS;XM$GI)C+aK^u*}ihB(f9Z*89v*;aC97b zd^$w>$wyV5o<|`oEkib@YOw`A`6=r5tEyzl`bd*ztHWxHJrA{*3XVDQHY+U4H0`Q1 zPs`Hajy$Jczxm~5*G@0h9;dkm?|AZW>F3A$EY;_qRQcmg`W>ct>r-#MwU-O+e|M>B z^+V0M$1eG3uY2vEqq}ZhOo=H|TkM4mVee(*qB@N<=DyyNcV*JsopH~z_!&37|D%59 zfprGkS{`vjg_tkO-ePXkM3{mfoY&m>sbJRDnrp>Ayk`&ae3!0I?^fo?hzR5@+y933 z#N(q!3tI%QoRyYa!JVgizW(w0^mWOf;#-^qH~TCxS)a}_e{S;W(qoFN85=fBo(|}V zyyGL>^U(ZXnb=0}Tls6^3T+uuJteE9Ps+2{yX?*|m=n#=lzbqi#na$$%gF;3JUr)o z*#Er!b?R1@<%_v&dPP=N^>u$8!}U{6axr=QF#TF#^wwoh?`p%_zp_L+f@%|HnVO!M z5>?AHF>d|i%DK$`C!?nvY8Seiw{hG4Yd;g_?QfpNnf&b7UgOo`tKa1WpIcK`u<dqu zQoilfjn<LQf{&L=T=_V=)@%jy7V|rnjC0f&c9=}+F+TOzDv}{kHlO*q<5j`>pRVo> z>f6ow&V5~-YMqvmAsY7g(c2O&bG?>+Z;sxo2=5se6nf`xkP$m6EX-~Ek>^8vc;BNN z2k%{tF^o-_mlwG)RWf+ajzdMWmo5JithM1r=c?YFCseAuH_N{<f3BCV>%H~I)aEI7 zjSc=hIMXIv`|ixT(;xG_R|$Q{`sc^M@V)-ny4imp6t-q*`=>o#d7{XS&F{~rPtm)+ z-oNv5{%y_o=O66L{T^2PrT*19hIq-h*X({VA6~)El<bhSV}hE<#Jv*&7&)~joDWdf z*jZX%b!ew~;?55@TFm~|Y5GY#eDlHXW#++$Zx*L;B(>O<u3zzCr$o`&)a`TEx{1!4 zdR^~Dn0mcaLq>s0(x;}J<U778(!B}-bLv8N)$4ALQMI<wc%7zoxbctexz65?+WM=P zx>@EewG6abBoJ1%Nbqls;`N}H_fw~E&pn{6-(6)YDm<-2n!!KwN?f)(mv_F`|L~^d zrVah|Ykut8tUhU5TjQ&|*ubjI^YuRdcj!1Lxmf;x#5?19>tZYAsK_2=_di_!<aTxL z`|i!;(6Yef<{TEi6!E5_1=}wyvGh!t_rlt(yuL`Tm|r+?%HGcliyl8WNNTzNF<>Hl zSife)x>(EdUoR#ubzJ_`YFT66A>YubLm$_2`XAZo{AOi!|Hg<t=U@07cu;idmFe5_ z`5EVKZg!XycgO5wvUq*tjCaY;cc$~-f5(;S{VGmtZG_V1%CDNb6OU{=ncn)NR3VFh zv+IYybw}Us-G9;VR!rmHi~A#1Eau!Bf9y=<`_7Ury16~G)|?R$KI{AY&9le;`#3F* zzY*uGkl*0)btn585hfAIp9fwmSJ&{#O6pw~Se8+|(3PW?L12@4<+I6m{Oj3-Rtco6 zR^NUttlIc%+RV>KZfN;0FM0UBJX<_y{qnnu=BUr!#i+=oYI6SnI=T6WqspFgS{Lf^ z*OXoCt@;=@<<-3dmv{~{b<Df6@UBV4{#6ajQd^=FW*z@}C1$aay!cX$29qo4rN1BC z*<Sp}MC>$M@T23Cf9AcPX<Vo_Ln!c(dHwkhCk_P$?CQFlQSKXbwI|Q~)S|CW-*XPV ze!5so()iVb*1*zNTvd#7W#;W*?6FT*aO&K0%Oxp<-&tFB?hKy&Au`jRuD3TlRq@R~ zXPsX9q|k$V`wll>F*}j_F7N8y4Yi4i=a=T|wU;IAc_3)I_s5OY{^Geu4qe)RfLp!j zri;<+dar~tAFJxtUZ1nP%IAH#Z~X<IU=uILfU}qHZeMS5d;W5ZiB$_8g}>1IzqvKU zEcC!JZn2byUXQ+umlb!;JlY-3=&W`1{=LY#Q+xMBFYjL?WtH&rW(x<qMCB*(?3v|~ zH*YL`{!X7$ukQI#mzvcoJ(F{P>A3`?r+E7H=$z!T>Rea9sGMgpn?T988-Ywqm?RFF zT;XP4Y5Y4_&d@+nZqnKvFGcI-x^fAA;roAf<@MD0DH{S#s0tUCl*nz^(so$$ltC!Z zyQ&SJi>lq*O=QpM>7Txro|IT=x!}n9p9`A0=B$sICx6}gL3Bu<&pdHKuboAYW*y!4 z?^#Zd+T<BClp|TAbL#&#oeY}!+)Rv{=TqzL{|U)~U(z;yIy6bP^MLkhTkaD%@(c^+ zTKX9Oi9NTmBD_pli1k8Q_?stJ^N;=vHa8G^)A`!L;lAXNOU1>_pW}M=eYzL^|L3I% ze_tH8sIt2~W3So%g%9NaaWHRwW<TFi!m|9Ic4XW81)^VAtn6*P9RzNiu5V;oKB0*- z?1Z8clW<|TvCIcv%ipX1uaUfPXwv<ur`dlmzV<9?d#vv1lP<ASbyID9UcSC8{K}|v zw|YCbnn>yuqpt$&=@&Hawu-e+UOumN?*r8}I=aHUzHXV-v2pS=^YeSt7ER*1Y+b=w z^6J>vCA<z(KTQpa{%QN@8&`Dsk&RWk_1{9K2%LVzkTB13Uy;l0$Y6&(cMm?WwcWjA z_tIAzPlcSCZnSiEq4Cc{%gZiHwf#(rn`1ZEcW!_B{au;{)1{S9L_J=+{G3vc-<_Ku ziVulyX}@RF7ogR_F`><A+r)Qms>!znOq`4lYc1lqC?1!c8(?$uW?cO1^JZC|=Z!9K z@k}wOSB<PPm^g)Zv1hT0oZ6YkmWeMn?2v7%7e4(b-7l|naj@hw^}K@j8`)TUBnz(2 zi2WPse!L}GjotO~o4fYUp3jNWxutRKRq6Zh+rrcS-TI^QwB~ZT@`mMEQDIy5^rUI6 zdneiEXc;WoY_D2;;mNJEt(N+e13uhLvNyPNymIE<5Qq9@mlHiTS18?eneyv|Qu?iZ zyWS;ijaz%t=+LJBq3@SRa5X(pNaW7EceG-~KjSF<z^)lb+f+Q$Tg-3Gttw4i9A1^l zZ2np>=dst^dm0z#8{d8Zw>K!;TwK*gS4nWuQJK>_tKOWt_)dyhaHC{H-QfUJcTRx| zo0WYdod1Y(ar~Nlr2c;?)0X=mf<MlCX|H-)vggJ*u?GTm4PtKgs~0=oKmOOB<Ip3y z<4yNZ^P26O7W~Iz&nK~Yx+OuL8zRaX&Odk&eO*d>>zcV|Ht!M2fB8g`Df9X~{Q#jx z3-ycV6hsvp*zdl0J3n=Gy7r|1r}cKv==iybY5vBFEi2Q%@&2i2VtRQ>h7)uIDCm69 zyvb(Xs`bkly_i&(g_$q0TxZ?GmdUQiA<eOub2?WFHz)Tep3A&X_+|L_2_y*?3+V}~ z2tN_Y6*Uuc7O#?smz0uxB{fxgw#;1FOgTQe{qhd-%N0r$o-3YGTBls0BCT>?b*GxL z+DG*^^_v=VHT5+2XeDX=)ZVRQs4JrTPVcS$6#Xd%;q?ZW4L=xdG7&ZTX}a1h-8{yk z-ZIsS!)mj&vh@?2Rkq=_m+Y+UrrMj?PjXOknBbV?xYbG5X^JzibGq|!7k8I?u4~=; z-4)$0dGvXjdtURh@tWlIh=Boo;3*>m1DDwf{&;?yuMFJGFF^jjt-taujQ)S~zZ%PA zS0BN8-3iQVWD|H={ePdowz)R<{>^RTXVcDT&N)=MG3|Co+U;#`%k?JBx$<`UBk>vr zg}n^FCg`tN#1_nV%I#_JzAf_0-Z;hIU+A+xc=<zP-M~ft0ZTpyrpz+TYgW419kW$A z>zCnvzN61XPWedwz5n5*&6F8Bx8Bc@?rtb^ZOe1;e%n;vaFc6)=E<9W8Yz0qd;^tc zCrr%MxN7x9f8u*l%Xf?BZEJOJQ*^%e=l`P8m$w5lmla+Qcs6fQ$iDykHQOzVn?8oJ zq$<tIKAocLd_F)o@K~&5kznc%))y6@wl}Mv+##L%i^uVD+fKHQiMsLO%F)La4qtJI zpX)qNVAB?{SEn7PO!n3GFZ-M>KY9D96cL*zpNr0|Ri2>w{y~cE$)$!xS5oqfx=i|% zZnmb)@}H;r;ib-#7f!z}Ux@g9fv@H67N2kB6H@;;SHGL_`M<ZRZg-&T<X&GHHhzXh z@7YdFUhivEZ)21m_9OqGz|oRv52rCPJJ-t?2YmNicGW?Zi>HS{<+flUL&YthuBDPp z3?eQ3eJ*JXMx0zik<G`XdK!1{zC44W{PYQ?jOzRCw?CJEXAWReVBqCATD<xK%Yx=_ zbt~UrW|Efaxa@21++%c3WV6nO)0*KnA2u20_+Hm8NdLOwkXfHaY<*5!rP;eTpN_|s zUq4z}ksCibXnNO_B?^@%z1%Jd39jGqWZNnG)KAxn(j3GEc^P7~?UXk^@{3`sUpujR zot%S!+xfq5R|GcS+LkMw`1$s?$0Fx1u)mo6Rpsujw`X<EojZ4CJHw@(j!i<|r`Icd z;L5HLwQ%a&-ncmCN$dj&>F}h+$7^D5N?CktwU=MHW)6SMgMu%-(_a`TtjwBh#jCa^ z-8!|*LOx}GS(B}Y%!c*PjY5w}c%Q$je5$BERL}a|wPNO(dsFJ7e=@Y&huW=sKh4m! z>JsazpjNHe&-o|&pFZF7pwGte9h>k<=gTKnzxonmZ5*_+>+8+ab<Zb%lYjdD=c+^R zmFMlUPSRO@v?@FLe%%lK`}yDF_be#2I4g5D)O^nBr+X6ecf5`)Tl2`fe(epuz@zJv z_J!Q@J$9mAO<4K*XMy*r@`lB0UU1qg-(8wf_EmlV#_2uZBC?GBX}zBqGWnTXpTU1; zmmi|>y@eNMof557i4HcJEq$kK-*JZI{i|wzujbnKyS%=pVegIoRyVKjdaY@++5D@x zrsb>Ok6gP}oM4qxcx~<J_TNSN#P2PJseeqb3s<hc8`WZ7_TPWr&+Y$JpWDv*wfrUn zL&dG6gd~RM|7UsJcy2hzH7M*b^8w}MY1`CA+6BwY&F<X&`JY$l&yTOq;~fG#B3wdz zVw{4!qTIs#;v54#BV9u$t4FBRpT7OvTOdZ-frEjOVfUWhySc3lSy^?HC%t&-o}G}9 zl9QB`CfD1#bn4dLwR872FAfelr?)O}_s;5ys><I#e*N@bVzkrg=2aWfle|Y9He|V; zH@tn_z&PG@tCYU+9=j$N1D?BUPABfPiJg=^FLh3h#NDD_2aFe1d||%GJ)ykA_*}8w zX|_vB?)q#OyqQ~;FMSwsBTMMF-_py|jAc)K$PqrF8f`A%oOrfny6W=G8FR}oa;!Pw zaIGvWm+RIJTkS`pS(V3k?Vq|dR`cz4JxwFo;#ckKHu$bt(Z9x~_w3dE_bh97-deLK VE}w6I#nprv42%qn|Nk@a0{~8Sn}`4a delta 21301 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 R3soeoWME`q{QsYU9{|nh>ka?_ 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 zcmXT-cQayOWME)m2wB3w2cp**FffF8K*T_NRLqvZ(CEXF!8u)Akb|pfjX_hB1fv;~ z3UjjscVip_ivnwh7khImPot=`!*tO%Gg$N3HG+P`R)}0(y;4Gw!;J5M^nK%o|K}~% z9TWJ+a!)5Zx|yZ;!90V$cRQOto2*MvzTnn#SG^_L#J<}}{93O~yTR&XXA?I@EZXo& zu0*8i)Y`<b%#PX_I<wVS0`;vQ+5FXAWF)sOB=4VS)%F`Hjsa^ws>hksKNP92iFsvs z|K#kA?ip_;tCTmy&;I{vQGDE&-Aa6Y+**2Fi}gI0USeQjoGfruBkkM@SE=rz**kun z`*k^VC)eFurgnRBuT|eqXJZmn>f#d!&Y9eKL#uOh%K0;^vafnw{Iu%Ps(;Vs{$3@o zk?MD8Ny}yXJIqR!@19J$@Z9f5b=~x-_VfP#yKwHed8mm4Baeq#!o>;cHV+tYh8+{% zbLC@f-T(0DtN*Weyo`2n6Z5p35Ft7x@ZPdF87dbqpQ-Mt*lRoU(9~OdRXt}rcCQWV zj&vybUHJCy@A}Zok9vKqT$gRnJezXQ@MUtFrSt|S&;JM7Sx!yyU*fScK74cKI$4pJ zd-K-thHhIftnoN7^X+f7%*!)x)~a9Gs8T-vfFkGdu&Jx=UN+ubtq_~k(dKkWu&aPW za8l0yh*gUpSw3K0uc=<~rd==7JbLZS)9+6h>xG|}`9Hl#uIGs5tpAH^l|pX6I-MvY zcze;qx>M7BIaf`Zx#X+qnv>VR9X^v<d02RJZB(F|pK*%PF}F7<$!lC$7kzlzW##G{ zZflm87nQv)*Yt74(nXEG8m2z~zt{G#09$Gq>%Xk#f^-)~w*NKL-%HN*)tRf(z?gYU zitWX#>YrxDv!fj9tmBwAu?o#N9oKoq_&FoHll%FOzk64v{r=Y^q<E@vmrUhM@ocW? z(f!@$Tpt&G{P!>R&3#tRH<JW5YDYbATGV%dwP@jv5Qj%H2MewR>=H5B`rxBa&~nS> zO?u1EEnO|qeQECMYpyTXmA>u#`!IaR+i7Bp1cYQh1sUDlwj+9$@`LYcnubpQobr9_ zul!iwylq;<#skNWsD&lI{G4`9{NmH=0uS7Fv<Z4no7Xn?-%6t^yS~ki{+unWAh+p+ z9z($0tNCRNvd4v(bADE)d<bRVWck_R8T*y*=CyVYe~W1|F8wc)8y=wl?sq)*jeX(_ zd*o_)7VNzx)Uxu)g^H+_AL=u!qE^)XUh-+3oOXeUfau)d%%yYvcI}*29r<+rpKsH? z@BBagR<^Bp)DPYNHa6Z9=Zan3Kl%6K();gc@4bE`AU=Gd^5m>Z|Gq5Fy&h}Hkb5PH z`LKTuAG7WC9rdqw1UB4g`gi|NtCP1}OiAG814$Kp+%vhA_b<5PV4(Rxg(vXIOZyTT zo1=H?xOC(KtNhr5{N@SF`)|F|DSIV%vTjDB@7r{Nbx&klN^A=_QdIv)yHE8m_B{D) zgUr1ezOc2L&!3yDZ&Ix?b9#F9=+x&LQ#V+z*J!<It>ixA>E<gR^5rcjd<wkRw0@a} z|NH0vv=b$#C2RU=GCzK|c!A`#ZyT*uj5tnx_PX#>Yr)y%Gt$}0Yxr8Dwr*Ng^)hw+ z5(c~1E?4gL&bfUj+C%f@{&=&+=e{jo@yTjQxZ3_sM`dNnyKT+VhnL(tylWxb?CEJ7 z6$e~$yjL>BOc6ZI9K3%QyKQ-d%f)|=djB;uFCCKCUbS)NO8fn@lDEAs;QhCVRc4P9 z`-^=`RGf?Brl?DLt+Q-il$yYC@wA7$VB!|8OQzrN_NWO6s>gc<6g5gnnSPX6bMkFM z@2!f9udE7Jy~ru%-+cR`V}Iw2iT*Av=8~T${;+;B;YhJ8XN!u?>l5~>YbRxIZBLz4 z<i4bt#VT;p^7l@mtL^6LW&gP*Kk?j)PuCy5ynTMhM%xQ_w{&+MdG^~Q>1pHH$sHLX zZada*)EA0pf454Z_5)Xf-l^K39=rU`t(|sieW^3E(jVXJ`zA*C9Z{X5`Dk6y9E)sL zzD$1MHRnR={>zkX4piKBpH=8ts)9j(e#a}-gWs%oZsz1K_*Hbg{<^}^&53@l?);*6 zr^{$+&39g}u)u%91$_+(0TUiBwl)^-!%fYC2VY0KN&U!cEd0UgbKre&)fC=G3)Ll+ z7pwHDpWtBH)YLL(fr5U91_ztdL8rii0HHl6mN;;WF8ifEDb$Mh<2ltCPBli)k}ewr z9lTN_W7d2kq|IFBtaa3>Q_G`H-*_>jG_drYk@5PdVCNlDy;q)H(Ck;S?Z0y=GWJ1U zYj<Cc1lN>1&lh|bH><b(YkPO)=TrJtViUvE=2{<At816>HaQ-3+^CW#?Xc?Wbpfph z(w7u+KUsA9d*RQFO`e-uS~Yu%P3-lxm+{4ygfQ&YaJRg9q@pr2cA4)IT~V*@tlcI> zGE*wOymu%+Pw!cG*uQY!-Q>EiO|o74_|js%P8J?1u{j<()6eFr(#i+^3Px*1W>&Tq zD9r2q6w==HsWeU0XL(m&<#7!?_ZIz3|7hP$FQPswy>k2WKDye?dt1O!t+S$>Rg<)0 z<LW0?IO}%AU9>7WxG?zk+>izLc+%rs+};S-9+UpPLXhX`*FqVo%&W6j{5k0=FZpf9 zM~|bA1tW^WPHLpxdnk75&!v2qn7B%*McuPBcW*8heX3L>+?U_9W#h`rr}UP-x-M32 z>T@J;*1Lb#7Ya4)l@92gWS7sJmc6v-Rr{&7%&OaIQyc>i87#fTwa8j2I69;}?xLN{ zf8}KyF2Wm*-PwFqHo5j*;^KKV(gKpqiOUbaYQ4E=hHu%|kR~bPBEupL@t8UDC-3e4 zwlYEC+@!MjwyCNyGr9IQdnqTMG+ooPx+P_f_U*dsGaB!mENv`U+~_o`=@YY+5l8!t z2P+z#`dFW;_u7c~Z9Evs+&YK*RCI62A>W(}c?%|RJN{hj=JwDmr=Xg-^^T&({>_5= zcUpPh<t>;{%@SLw?{K1hR{1_b``8+mT^^hz(hWNV)xT^JEpW(>W&CngG^5+^2xs?g zuKEPeSVf(++AaTfIZ3S0Z#uY3DIzSK#ktfqn`gQ0DaQqzAxCVlrIgQU<9&Fs@Tj`% z2diUwi+m3!H~pXaWU_Nw>*5bju1ikp3)AD=cECI2P6($Ghx>!hz#g4%n(0rcZrZ=) zh+f0rvy(-ObZg=>fA(|9UhclTFQ-zGBYf^d-zUbWHlNTj_Dc(n%iA|YWAo|XzuVq_ zdYaR_zQ;4wE^?Ysw9d-RIEh)aa<ooPU2^)fvx}9OR*u{w@lV~mirkd{CqL?9TD0R* z^y7DL-mK#7s0<3-Wp8@*&cpZ{Dv#F1PFa3sHdm2B`JuG}oR?Nj_Rig#bZG6-u8<i^ zP3CLl_g?Az)Z#KvkH1_b?URJfl3DEU=RU7F8{NQRD0g?~_Yabb8eU9Wdx$}C?a7{B zZzk66HmK=6G<Qe%vWc_S3+h#r{gwLAc`H=6&}CV9ph8=S)wSza0=8F0+RFyB^Uu2_ z-}u*#Id&O)-rb8|f4wa{%u&20A#h8-(}G>f?-X(uS$yD;StIxDM`eM@qlwNnZf}iZ zVi(U*nYdKnys7(+Lx}Z!S*uoKQ`IzIzrT~C6>KNUiJQh%W?i{-NvMNM`N<mbfb-X% zzn=YFsp;#9S<{Yu$V%yTh`MT~b?|zFW!fX_{M*H1E`sU0Rtr;ic=EZ;x!QFrRw5;T zle>ythUfC$fR+ggbte0~ozBcnno!qh@vHK=Lz%!^;oW!MEmq&s=6v*{^Q)85&ej4+ z+wEf3iHOCEn&gF;y`8xD$fkS-SBGTTMJKMladDe;q?Xs}_4k#*e``Iidu=?h$c-h> zSDWz|UrGJ@g^6y*8jiZe3RRniiEmgpsm-xJDWK}XlE#;gaUX8}Y+R@%SX=Y<tzD;% zra4R4`B$xO9Z6CuE#E6Y7%Uci9rD{aZ-Qgwgmj(xNAtgFT=?`u@j!!yjnOM6Hh!k_ zPoI9D*i*;Fyvxolx@fZ6g`czM2S{56y%9Ld&HLkJpJM4M7dGiFA=^3+yfyw&-`G|f z-@oGrYuszr$9#K}rZCKlzxP)>`rM^twuGL^Ise&z9s1>SvS9N0iwRw!t2+cfZ(VYM z>19Ls=JYrBL)L$Z(pBiy*6h?U?p=Ifd;A4%!^njHDuxZ}Y3q(oJlSJ@N!zmWhw-9R z4=FkEYkzVKuSt0dGrs5f`h|C~z>1LV7mMU;xp-Y}`aEG%oAqdV+R-Ts{Sxnn<cTH) zw1tIc^xjO``oHVd$-}irY=3%0UJm=;wZ%3pwu1ZWyYK~!r&k4;UblNv@$SNVUx|ze zlj`l#vUhYAtvg!jQ4p&8GNZ>tU5mFZ_x-Z!qZ+aEpEFrp|2prMY`S1jk=O2{n<X>S znikHu&F*O}8MOYfu+i0>3-9eRD#`CszW6>o=;7ydul_qeJMUeXveRSLR;AOD^@5Jg z$3on{cW|vLUhwHiu2IH>Wl4MaxXMMYW`1~}R<oA*O!Hl{9I=D$tIIy_aIH1Fy8rQ3 zqu?`vSJzLHbiU*JdB*JQZAo(y3VfHyxnJ{kshub_N!;x=hs1K9-Gw_|Y+V(yd!~Da zXh5pvOVhqBJED_M?D(?a0dx7vBb808+)6UaT;HSe^tgS5de^OcJ(DN&&5Xr5o0N2Z zx|~i`;GO+~CGNRask)^&W9aTPuU{XV{&BT~OyB~yJ&(ly+-I67;k@nT+`^4)89i$A zv-<xO?Y$aVxNz#6k0&;Z1>N9s4hb~(`6YBQ+~}+Mtl;}g>?#$e7%*JFtJ}-B-%V=u zrgL8o^#pYJhDgmi{BNg5M)xUh|MG`P-)1U=v)<z6%VU;`*~6xO=2$_TY^DlN^X$f> zzMfyFu73U0JLidbreyVH_x^pa^qLE=<%fH&+t&5%Wlor`9DmJLm1!=QJm2s{EC2P? z;Q#5j<l&zxDR-Tf3{3|Qsw<tj>wi-}qq=nB@6YjP#9t=!M!hzA#lL3LhOSw;KbMBR zw^&`5G3(5gPqodhp(j{ZE&A)(^6ik`%hgY~ckwrGU+)`|sk!QXwL_NaJsX$57bG*w zdvCZca|t*5czSN5Dc8h9Ha8iS<O>VK9)HNJ-yQS#dG2!eM&6j1IaxO)1zwt~t`>dK zd2m|R`QKZQB_6Wnaye|&^0s@o@0N+0H)G~rvyA_8%jLIjuRSxX`C{Hrt7nP)YrL{? zMMh-a7qJafZJAQ-zCCW$KN<33<(8)Xrf({K3r6bSzV`6Tff@UplRl=Zw})(AGc(7r z+%>(#q;U1kv#gh@rf<4ynxWAB<~aAt8ly<=bekxfT#sIns8?$|4EAnvoolwqG$P~J zjej0n!#_sx{*wJLL#cmdZ<SD%-h^XjRY#aJtuvI01x$5UZ{=M&$7#_D=|vOYTb?~p zY-hT8VoYx`Yx9l>|4D@(c7Hbie2?3x{N|S%lT^GGch?zRoq42<W68V~=4C>QcYZRl zKQ-;IMJ3<ltJ~*V6q+W#J~8uDm-IF3#pkc`Y|xk6bTIJ%_Z^87o%_D{_3V4;-8|#; zt?(QE7b5!CpSpTA#3<pK;%BY*Pg+Cv=be<;d?RDY-z#Zv(sy2dl9;i@WA)R{*9>Jl zKM3xey_hT7$G<L5@~P>sllMifJmWK#G|gPF&+B5BcTUlP@bHVP6lU-Ip<Cb_^T3iZ z&$`I4biRD?`h`vVgs<fY8SB|(G8|kr@!xT?HAh`cj{lo)xc$7}oX?B>c+CE;UKw-i zh~lIey&aMpQWss_P}9<}EwZS+YUZ-Mh9`wt7sFqb%1ufxSoU#|#G&Mc7aw0sRPKz= zGM<vU=I!*3h@Qtb`$J6rbS7yZS*UeLO>&aJGs%y^UQZ_93`&r@=yNv5_R8hj#c#rm zZ#@0D+sHQTf#lQTm5Z+**g4a}J}7_Z)i)+_XV#u|DPJ}9pruXafg`%{Ke-;yPMtY3 zBuw-t567C`1=D(b-ISuL_~zW%Vbs&SH&*M$(x_l(ldGQd_)EIe?!9j)tp2nprDucK zj+jSB51Cy&a&^t8ALs69mj}N{y)tu2#!)Md5`m+$X6wCtv9C6C;>!ijB4I`<JBq8< zi1(`{etx*6sxjVXw(#s-5e~(*h4CdN<xRn}gK|?`5-*x|AIdFh6Of;B^;~)H+IGWu zD<A$t1q-;&h`(WcbS3Aa<?PFOX)~0v!n_JLTyZhe;|nQh*!YAct@2N1V&DG{3rsib ztXwYtN$|hV?KKP7UQY`5uDRe`bANr9=M>RI`xn92qoh+h`ZdKq7fW@0b2)#KtE6CM zMEWm{*!(GfyEW>(#UAhRt6y}}&|=jti))KD8`~B&RaxH6S6g;#>(mne_sU<d1p2@J zDKP7_tN8>M<Ci{$#R79nuN}<GUC^Ium^!=j(6aibH%@EZ-c2|%?cO;BzO#vO#|*z` z$bPhCW0s10@^f06(!|XiU4<W6id@cYo;@@0Lqzd4jl}&+CP;i$x?8Pzn&%4R(Hh?M zYNvRAS{`ZO+vB!Ly!Y_e-4{82K0dv6>&;f{jrpIKMy%Pw<=^t*dBE{?2lxEjvGYm7 zwQuk5m~7wd)^EBcN1`lQN~e77t?qR<E-l?I`gV7YhQ{%Um&<d#L|&`ZUU;CPVPyaM z^WxT`5>I}|x1A18xecVNf?TfM+;iK^;O7M?`Ltsf_4ybqj!pkz<Ce;rdim0|o8sI$ zOwwC7_U*KlmtHvKkI1e~f3D7aQ5Lc|_GjR+>sQp%?Rjq(KGJdsw>;6HB5%8E+4&B) zqM~QMn?FVrr<`QXs&jcHxkLKFg5`Ia&0foXh+O|dA@lj+eLa&`=4u~X?G~0XOWI-8 z+o>G81j|=>WL+#!eHF6rx2Ej;G`SX)wwnbLx$iXu8-2aL_Ba1D_8+&7&uqM_GHcfN zlU*KH<b*0dwsyTaq}shS^Rlt`u}S|_%HIp^{2tB`de(gVS@E4wcfQ;9wD|JB%=qN7 z>d~z3rQDyB-({uvKA*IOH<!Ee;CCIr`9hnsO1>;vsyOR1pXl<YxJuirTNAUN+q<-W zzPy&>gJ(c;i=J1_sXu>@MF({kY06t?GjCN`wRe8&%q3Svs{8#vndDls`SO@8G7MW< zvs9|gdhyhI+t;3Y+U|RTp?*=guKnidsz+HOZq*a7HYs@trWU9e)|k!NSbEk<{_}CW zRda10U5H(Fo69y#^6Z`^A!e;EJDnE=^GM8={dYxgty}N&<Lhji*MxM5zI?2#{_g6J z8>#~GW?p9}P7O1@IlFb<Qirk$9)|xO1h5~y9QHtE4_nEUs;;XMpW1)zUh;b7ZidR^ zf|)Uowr}5mZ;R-x^r!nDge{K!y(TWf@v1uS?BuOsoTtU~1*J1QT^&5v%z4~c`YK7~ z1y@kztaXKx-mW;9k*+h1Em83O*_03eBjSG+>vdoCh-lZWcr){DPVRQ+^&8St!u|`1 z`p;hf@v_ji&5|b)_VRacI;zmKZ^?;-S^kbTZ^g{yx5w|&_`(#p{CaU*ZI-j)4U3eE z=8t~sux&kNvo@wKXwCJzowGV}Yx93kn8ED#{t{z<?G)~Z`soFCeq5FQA9-uF=@pB~ zuSMqED&{y4_+qBOvz2$N*x7@Qt4mH&jTEd`)GxaC$@O$ozk%?S2muE3*;Ws~Omlcx zRPf{(`}EU1O16tO{M#g{EYCDk<$JhZ(80Ggp|d-?`z&|6d}o;G)M4<;Wg&mjUxS>q zxZWEj4YrI&_$%y_&%AjY6!OnWr@VBQsr;k27pF@^9?`L7n|ycU`d*$hUF;{Aw>tge zG?;SyVuhlL%;EiduU{~~+%EchL-E|(sXuh=qdqybs_M*iO_6Z;xo_R~4U=xad%bf- zQs%~Mfp2#yFwORVG3UC}mQVb1wbtxP>9FdYS$E)|<h?Ts6CNz#j(9r#SGa_1U|w!W zT%M6pSlN-Hq8^>6R~KyJ`8N5sw^x;HXej^M{tg$VT^Y8l|K+r`H!gdyN2z#E)pM!S zt7_-|>eZGH(7pV-M19}8JG(#sV45hC(i<*PnSE0<d3(&~O^g?Ww^k>(I(!YEDQzcq z$C0;f>)Fbd$yeAnZrB^KHeBre^{>yuO^&TvB6P7kqr&0Mv~sD><&makD;qPFMU5}H zr0iX^Hm<awPp0I+ohLSGojFYs&$$aZp4l$G+upvpo4087(LL4c`;`A?eth$Lq2$Vc zM$H>bH{6wRT@jw};sTqfV??cymFN#!71MW9EoZ*fGgd$4pFR7Z>BL}jsZeQ`OIhc3 zTV9_RCcfgJ^XU_1C9S{2w8J(nW3|^+KOlT>P52CxXY*2g=KY*6e0chaZ5g#H)={s+ z4IkG$xV9oeJ4n-|Vi!}_cDtO5N{dd<eOziKZ;{UQ=&<^-V;=YJy9Pz}?>anlcM+4k ztwZY5)hS0qa)0zp&hx$ISGs_m&%aB+VoB@EIG>7Z>b31F7RaXFI69g4DC5Qd3s_!! z%C&m9wDLstm5Zl@Q-8C6(S6SqB5CwFwV!L!&RHQ-SG?ZF{Kz!_Q-d7m$xpG$&deEY zZmwTiO@j{f2g!-8Zrm$cHa$b@ouQzpy5_HK`*|Wemv2=HFld@8VPn(qf+xx-<+54E zO!ngQU9GKwL9^~SpG{AmdBWLqSMJ)jWdHf1k6#{0_c?5}``!|^!kc#2o@KvV_RfGO zeHG)qE9+-?zq9z^zi5X2>HYZ?#X(zs@SM>}wETa{@9hDp)L8l6i^~7fzFk<SP@sA) z`|4_!-^!Ub5rLLjwWf_66Mjr$jJunx_$z2j_z|XU>2sJbt}#AYAQt<7U5vt|Zu`k5 z=Y#b%ud3M_{kwMCvE?~m^Xch(4#aU47MSdidsK2z`SN!03F%yhvC7qH&hMrL2c=i= z+FF&TMr{e)w}g4i>FU+9L?qdcs85dCp&KBP7jiIV!<_EK1(wGur@GCaxAZ|hyUXq9 zmw^fLrw^xeq<{S^-ZFg$Tj&2xo|z}#&*9;@)x<uli$Sw}=8-k3YeR3_zfkm(^-eu} z^JALGx-|DU>`ToP`+A;c_dR{J{8XJz+s+g7@{P2u%Jx{9Ui#R?6Q5Tpx-~vfsek_L zejaHV(R&W-b?V<ZxUS#Az1uJ{HB+K%$6o(*<BPp%VmfvcxfHg%xh9<)Ah1)^%uK_% zYU-i6tTQf_e|CC4QE0~xsjzO@^=m%-s5yG}#WuU=1qU0Fk1Drz7EVq0yVkmp{n?Ss z{woC?rUrW=r|IZ5CjOXfyLq|NeyND-lebS4eJa)STk-;P-K`_}BIS$RZ&=x%<umut zmgcYj5^-_sImW5si~q`8+T$2rqNH^1>Z`TV#?O4bSQcN?YAoG(_qu`ef9Weqo9<6O zzB)$qXh67N-~L7ZVMizK`?#*ys&MTkd(+$B8rEheZQy%t+o5!MOMGqh#Ro}_&rAR9 zzONyY`C?_zsYyqci-*j*S)pNfDtyMNsv{N4?lW4Rsa20;d}z4B<A1l6qq)}vQU2KW zx|cIL*L)N=eIz|Oav{Uzj3BugGlZV5+pd1cB)hEtm`^dQ-?g)%h2JXV;#@lZRbSqD z`gO?{iC2=*Z`N5=Iy}ud(;c()ySS<9{s|AAY<B+JK0kZ;w}4!;-;&n9my5ISa(COe z``@qfzq#3YF~+mbm-J^(kex8g{A&D3&8@qRzAK#ER=4GQ=F*w}3zDuidYAL0_P=qH zIQ;zihBq9Krtl?anDu9{Ir}OcJngnIaiwr%8VkSd8%@@ybDwY4{#4EF{PEu*ehCZL zNbZ;CelcHsa{OYdt!uz{g%dAhb9=de=uNI+VixYt-^a+T(AH(};@-dg`?Sw*2us_& z$?izZ-mE0G%Kz_UeI!+umQC>c@nfB}QAl>o+e&-cO6y5UULQ7aJW9!$x!c}o%B|b4 zK8c=wKiTuy)BmSjo=N7%X{mJGyk91DaCY5SJ&|0ucHfZAEkfSwOpfi{GylZHrmhWv zs=qSx>YZ9SX6-zewwjyy>+9<!=O#)x&iS_eNA$M+j}~w$6>d1@_&USA_cXItzmVIV zb=S*2mHmo#j9c_rdiB|0f#^NoFC}h%vZ!0s=Ua>D>}xBv{<3a2`u_5;TKRU4#U0h5 z4x;+AI}deSTdd(LB^BncC=(M9XFs!0+9zcF<Otu=oB#GdYTa*lV_LjMUVOBae#qIA zOXbhr-nO+g$H3a{VEEjhJC1zj`55p*T=Qe*$^&ms#TTRm-Zb=&vMJZy?OzwAwNq(Y z&5r-Z>Ss=dC%u;6S!#aAy18BTPWYR*jj!Cdx4xLNe6RepD(0H|@(b_(&=Ypr&tfIv z$F^Tsuqx{N+JXyP>Jv8{P3SM$_M(|B$v^0ooD0|czO(=K8+@{5QE~sy^e$E1`0b6) z$*~bL*B|}P$LudXtLn|k@?#l2Gmp5>{oI`#I<;F#-uuY8t3IE1<@d$O-Rzy+)c-8< z)SI-oH&&SE-jvhcAK&O*X1(?qYir<s)0dMsJD#>awouXS^qKp1fpLpIoqHN~GSutS z!&JTEUm>fGzj-5@esx*Zsf*e7_pV-{8S|m`>*2R-FHBoLN`)L-DfwJ)O<@Up|3A~I z;Sn?EtN#9Qs`%)yDa(&noO2M;|9bwn@npF@S8ul6HTVDQSH_<v{%gU1q28+%1wzNO z99yFw9&>KpQ^?P36#d7>hU=8n`Om^0Zi;#8%I%fA^G|Y3keT+TwCS{m-};A1OBDn+ z#5Pw3NmV@1_YS>#&u_u%z|A~I)^4j)+di}3qkPhiqp8el53=L@j&E>Yzc#b1EiLv< zL8jk@(3rSehx7K;G;TAFNZNk-RI=8B*N%VPYPW|^|G0meg~L2Cj=0m8#Qz=YaXGh! z|Ca1Nox)q@Gaq(6Wms~%>z9H2rT46_X3ahGt<T!*ZU?LM-pKb~mWu10$`kY1wBn%A zZU4H<clP>r8>TOGci5=dxuop(H7ldY`&%m|*2kwv@P1uhxx8vs%JH1G50|Ak6wh|7 zSd;wE{f$`g2`7`+UuHWPX*unk&{h$d8~ypEPr$C*ZTo8YFU*hZ)SZ*DaenZZ>t<WZ zdnaE%$L#%DU;=|;@kxQiE4SaA_!i)L=y=PLsI6gK=U6+|S{ht>)Ac4p#A<Hemt{+w zz31DV&rMh!%W35PxMAy67SVqUrl&2|eT;v#-8rYDz|2@OQ96NPOYp7IEq?2|tExFd z`&8yg>i^?+nq}+o*n54~oX}&x?izB+CYSzyy;Sr)3q!<gV~L%boQaCf&rLa1?uz-o zb&=S#-NEqO`y1ayR;*$5*w@(DaEOCRQO0edmdEP$)T^Nlr4yL82+#UB=W^mP-RrX_ zu&8a-Q)|9|uA%#Ryu3nTVW9lVIRBl+CfO$1KPMh%-n3!Xa-kbX;>5Ss{9kvqFJbbo z%ChZCb?O;sA6&7=#`~|An(=NuS-(jpMmN;sjMWly6Pctlrn56loWQHCpqaAao3ZEj zgrLM**Ex&lUY$Bi%Pc`)P4xFn&5Z5bzkA|S`0WmKe^m7|XEFS}v!nP%nn8|NbL5E! zroHl)#ME5YiABmN7@BFcH<d>6=&|v<yR$OZ-`{w~t!wj7)D|ifN9<Pd>S0-%7h-Zz zrI)#-p)2C`-jiQWJ+=LO^yr0ia|PDO1@dfCtX(qGUN1>vN61>oj^mC|(yZs@-Y%WD zr6%p-bcF|1R$rfNF16!yY1rL;V#kgPj~28t8ccaS=Rw(~;HYm)*s2yr$xpaA`=#%j zXE!a^9*bPKt}N1a!>gZl|C}OYV%|vJwe8|!c&d1@plEBiMJ6}*=Y5*{cw54+g@{fS zzx8GEt}jNS+1DBFR9;Bq+Vz}!+Wz|eM)oW*W!%=X$;Ojx!)6=V<QTVfA5fJ#-Y#>I z<y7-7$7TWE#!ET3dp*rA@k(3}D0=Go<*M_6FIzUgD|@kpfARg&pjl!Q%x4%k6$^W` z-CX$iR%*|mvz5}eGdItvXxzbAC%jc)*NxMMSAG1*?!ek6^5x@%O?s+tw`Kjj7_@Mz zzSS+B={tq@oXGyf<iBliSb_JGE9d=u6*Z#1`6lh$T9X^yH(P&&>m>F|*Oy2H{@UMl z)hyU%p?C;OW1ZEZrd^I*JO>J{sm$*`pkT4v+06UUrie9bvtsz!gA@xiZqAfE8*R{h zx<}PozLw<!!^CH4x6U<WFVwM;sTD|DUAC~VG0Im$;NxS->wOALUh`Sj+`Ll!-+QNV z*5rfv-D|{)59j5@1cfARKDSTp(E(cq*GdKVf~dw_SB_8cS|ggfDnrdU{H*N7@A{Lz zx;-mh_$S<}XSt(L%K-xxF*e24JG@*jF-xQsJndcHtr8G+s@i98(9LQA=fve*4<>V6 z;(oKIg3tJEh9FOV{HBFfCgwuh%B!n>|CzVxQfL*Q*=3`OckfksSH7Q89j&*wA$b3u z?JJ&M|L!$!75}qsncuy--o?dDtaZD&W6_FB%3I~<Rr6WY*Qb6|<_S`(JoWCY&Y@Y+ z4Qf}5t{N>|?!T$8=CZQ%tY(HZ(dJ@CukBOku`Tf6c~M@xN$x<+?`7LVKbGh`+5FvS z?<=mJBHyaI$olWs|MH13tIWLc>$%CY{%!gxg-gzydlEQ5Z}OQ*?-%gS4~^A0pJSsf z^YFr9x!aF?R&P0H^J!K=)9QD9{DwDP{u6rE^VHDK>^l!PU-OBSYo#0W{%J`_%;$LF z%+GZF)lYLKvvtlfyN!OEY`&Yz^T{?;>MwiH!nGf#cd^WW^7!=qcteNM`?t<L`e-`I z@aFXufA8t%7TcX|DdS2CmD9@cy>!I=*!i!OKUDw7vRH^W#Bi|u(rUQtmv`)ah{xKQ z_P&vE`75=T?_C%1`7T@4T)sa!FO4~WzPeEEs=Z7k{YdWIa=ZUEJ*o+ZE8_!q9N=Er zTy!HcHt5*iZ@DXy!juZr+LxDn**tThPj%jVt>T94)Q`LR=P(_f;4tHNrISO^3<Kxi z=LC;x1=u@wd;Pa=*>r)IhjBr5*mlmZHV+QZ<e7Tx@$U8S5`CTBdHKau6qc>(`&1|U zwkFw@nMGm3%4+F`+!+lwd(xP6{%-O4bca7Sy>5%ouZFXk9IyYpF5dN7WlCQ0;)474 z&RR|{Uc9<$$--%0?+CbyOg&U3z<Xq$Q`#Kgefg_beY<dM+KESOd78|V6M}xHzCN9E z&1Ehdds^(-eU2;mp09u9a-+I*&&^3s^YT<ZJGwT+do_NlWBcR0`QTjh&Y-p@OErVd zTOIDSZ?qDuS?wqBm;E+}gsk`DK=ZE4W;a%xHx_gJ`f|_K%GFkaA5;J3*nKzgf3U@A zlf6}Oo4&`iZ@$kM7ZoYbyd<?*>uANS<I8M&MOSJ$iX<z3Wl-HJd*xuwS??N|``@NL z57?Fd=Q5K-t{C^u4LnH)TXfGHaAtV6tkvcj$Fk(9E2<lRPkQIew5l+0ncr{K*FJlm zztndQKI$Or*^&5JL*eh&V-rKBw9n{HvR6|``2RYdxm)A?vJICOG6!^A?MP-g*=w|P z?h=h}cC)rc2y@p~ZTiJ=`cX1Zf!mu_&bn;xv&wJ$TJ}1&Pjg-)DY9I)^Vlo34L>%# zZb_aWcK+E`X_iGs4vYI3GFGl${OCuf$!ylfm(J4?Kg?YHfMa@v<Q>LOJI`F%VljUO z(}`2fi@!@5`5$0)W|?r>c=GS#-%sp%vX^I``0NzkX|D_qNHQK+IcHzxt}6<!r<AGj zyY8EHF`GB$L{9PIKl8i8UhH^Q<A3tJsKKo%4d*_7KG+tzcXidaf(!Ev^_Fb-QF+Mv zTbGoBPT$)nQ?D@oO`YT762uj#!qdbi;(hT;@5XISZd3lf($?p>+OcTCx^;pt_%}V4 zb1isz?V=o?)5i%Mhkftw>U>#Nx3gckOku;!uCwvWm@`gRSaMvD_;%hr@lfsg-*Hnm zUa|gi+Hv{b|M6QFwCHop{1Ec=$6mQbI%%#qyLH;$U(vcYd3G_!Z&9=V?|w~r;&lH0 zDX%ygv9&8}8SWfo{b^xq+rS=EX0h-_y<6R~1sc!Z*#9`eboC(D-G)_+TVglG2N`;b zIlX-JPATepy88|eDfZ9y2fkDVY<In;vAOSzcjnout<qnU8`s=j+`;#-=6l&<g{H4d zuSi_dl{|GJrCd{6=fZyTNh?=|2^KPG|E%S3d*^v|r97Y7w`?Y*@19Fj{lh1{Sl-&i z^#0hB<NkL$E-B1EJ8SKf!dxx^rwxK8eTSU<YXc)C-zgWzeRV8&R@x$OZRoC=uy!`@ zr7hcMuR6n|5PIapTq|w;4M|@6lfz#3`>Sj)S-#JaZ`zEu6I~~d^2#`{EWfu^R_syI zrFiF$j~fJ8MBPm#tAl<wf9zegKIv!`fBo0P1|FBv-`&cNOOmxKGgo;yN3TTt8$*E` z+udhcY$tZ6Xmcd`YNkA1SGT#>b#;+Q=1RA>R$c37#r1Ce92?+gb?nL3$>usc9~mD0 zEd9dva_GU^Tdbyk>;3D#QeOU;=r_NNYk65OVoinie*XVvQTjQKn1xmGCs)7p?Yv?h ztaID&kM7b1E&5UwHxpvs@#|`HcRjJ3n45h6Z=b{C2mkWrCU09Hmm69bw=Cah|IcrV zev@u>$ZhEPWGm*`$SYsK{br);m#VWaH(hz_J4?3lILvbRx$41(FSC2g4+K2F+b9zr zw(N+}%zaX#+{Y@s{(ZeN!=b&wwO;b6zHOwk=ZO!zJ1Shd`a4!n`saH{W5vVt6<t%3 zCT#h2{Jo>l0SS)a841fy3EhaD^<<Gsqp**(uk_c#)EOV%9baO&+5JRjnZbl7DfKzI zMLu!5$8QC?Zex;vv}e_%&vJY9TbZ9W2(o!wY;q9&;hV=0pZw*y+{`6`ueHDZSN$9M z?q6NhtS`cAWu^(rwmeK%ci;Z;>u>ph^%vGGn{{)|@^q*Fn#a>_#%<ku#^`%}!T+14 z+B~mRZY{VXaCrw$ey-)|>#>_l;`07Y`}nzE)a!$Sb!6lHS&CY!I|RBdpMG^$TQbd$ zTm7JzNsPuLt_7BbhYzzp-K_La$Zq?UHTM&5Of+@)e!k%H;+Hikx*UNWbNQl=OU6XZ zs*T|A+uh6k`R1OvdZI_#L-TLfZJE1R=wO_+P}<*pArEV+mM`wt)|n>#ea5%VIyKEb z#pf3+VLW;1aFh9`Y5gm_w#htqc)<Lhf4hKS#u}b~VXrk#NqPEhVwGDQlD4aSX<Nl% zn=d&GYij0Ska~UDFI(MPf7Q~{3QUhK24@GpXBObhUh6bf(^y;3##77i&Q^Q2pcw{? z%6?Zrv@_3XYTossHfAByrF~l-Mode#%6_nlC7#W9<}b~K+y38nh+Xg?+BsoanfIcu z$0-Xw^_*;a#_0d7DdzKXwK-f~UpiY9&P>?q;{7jWVyer9B};@1eovk9S9#T@RkiE? zg`Sc!eRambGgf!4wQ!N)W5;FU9+d(u3Q@09z8LT9IK!VlWA)Aqfg^uSW_LcCA>G;5 z<9t1YL*4aQyxrxv=}}GhPG0&Q>vXNT<mz>`OmP8;xJFi`p5i6q4z4*Gta>jU)>bEl zm<qBTF#8-ag>CY3dC5s1cINa=|DY{kcFHNGLdT)W|3}Y{Bd=x_uUn<`UF&&ix3k5g z&N(KMc?&PBdoVxo(vNkHvsWoCE4)36)k(|s%g2dxPo;i&_TcEz!|ok?GN*U^73#=h zJRBZwd@8@jH`Dd9^qhOo#G|ht-Inq+uhRCGQ-#OEPrG=wF8tzt+QFjO!gi%&|NT4W zpWj8#|IcyI>d38)3*YZlU9zks!t5TWa{U7HGm#adl4kR+o=xTWQE{OvzKds*wS(vN zZ!gOw$~Fq*t!jEYMeTP#Phg<k$+k~^k#i@fu4FqL#@YDV?DaN=3CSm~PIl_vu!iH| zQmyFveb1#i=Y4GnIo!Oj^&RiW7A<4m+Xkn%XjS{heicgWI6R@^x$DCxUIO>_N*)W@ zIx$3DUoNTBNBLIBp+L76?*n>mOqK3@RK6}*H0{Bxx5uvi<j_)%n7n1p&d%@Io0kOD zOt<q)JTNJ8{_^!k8gs<ocC9L(^gg0<`PMig&pkpf9ed}kICNTHq(A-aToEyD)}QeU zidMc_m@hiX;Z($ZhC^G$|2lgt61u>3H*(R@#V#{%?K0Bh;=W}2>brQ1VZ|X;Rj$n5 zmDN1)C!B@bE<EIz_Gx}&$n5sDO;1?ajO{f7l@=sLY}Wey=%tO;!4v!MKl)z0e&ZK) zy>l<U*J_H*RdaRac`PQfr`lYx!z9tOZ?#vqM^)IQS0C*s3yBKk1gNd}VRJdY=I1Mx zY4*FE7o7{972F$TlEu9BgLpqDFMGe{w6OhqCAdB=WmkEr_da!Hbj6QTo{1axq$a=a z|Mw!iRPyO^zLTX^+f{rkdriCQop0W7*}L4UXbR`8w+l<!wI4rFbW*IXHdz*`X>sC@ zP36f=%OllpKKRdir#ak5sysdZPf9S8Th{-x_LuGjysQ2o)4czsq?2jH&ux>Fj3>oc z8olOmE_v{%-TbJG`0Isn5vPS!6jG{BzMMX5_3A(W?W>*V%yCnx-)U-oOnv8qC!0?d zXq-7bFZ%smQxzX$_6=DK>r2;64mJ71|NM{YP77uZ&o%LPs~4R+ziQ^aIc$c?{l8Nq zR@V8e8E)b<c(J;1vzfZ|85eQ=A_s#XTaI^r-#lZ+S=Q!q`=2?f4{LIBAO9$3_`<%W zgm-V|t{-m~eDN1PD5uXpEBU-5<F%0TEStrV21hQs?ajT<>#;=m{kQ8XJGpne8s9il zJHdu^&MYteWu@GVr*y7#R&BGJc<1*Fms<<ucoHXnKGN^Ruc2whyJZ4{PE^hltLGnY zg>9I8NQmK~Qq2ZNnM<c?u1$F`SwfWALxhR>z$ZJwe^buO1ZN-k$t`toT7B5`lBT2o z-?XzYIQRRwfIx#}O@C^Ln&{&{e#>?UH%993`I4J-*ge2%M#APFZ+SE_ZL7Uy(|SB6 z2u7(39GP5j`{3X5Uwg0Ggsgbj?;xUfp)$*+&mwopyp$594O#qidOumuT+qU9p1h&& z+RL)?t^864j;8k=XYuu3`gY-g5QCFHKla~f6zw=RLp)okEd9k6DQ2(r5)A@3er%CR zyK7YY;&S+opE;M?x_4jSyF+q@&eFXr6$Q53)cSkv?`($6UpqaRH!EC^kYD-ikO;p| z4Wl5}18!IK+p~`!ozSc(6t?5dmY|iVlTO}eG<N;7Fg7!(EaJEV|1)#lk~_ce%$V4~ zIblXz=q8h8PhWP<eN%fe&fcp~L2gk^+~n$;?+wqjmBgs2-db@wB(|YNJT++R2bQNx z*>+u9BY53g>Z4X@x!1MYyGNI;=Ucw!aqkvg(JP*uGe5YBCin&>sJCwQeLC4lzu9S_ zLC8_LZtJV&*L{yBulQVZ+k$Cw=%3Z{%%{G|^3_l3`S<0={k<ofyja^;&&XO6nYo*H z($&4o4;X24JUXq-nY{M)#NWqGFPA;Fu_wLE?1S9%u*mgqDyq-#z4X`9ef7tl>+1_$ z_*IrinTvc(+3m0D{Bde~Np0;XSN*ho=l*XAy`MiPG+~d$j>+m*>rB5oUYaRY^Cj)L zT4nlsqtu;uX0CcV+d-g3(c<XwDbv2y>1ImA#(Jw3CiZw8I5V*(?`Y@x>^D_%Ow&$= z=;@}G&X!cEk=tW<e5>Q1IXkS@=tw88-m*0MQ<m7jAT7Ijx1W07P3eqiw*0v5lT`Z4 z$!RX$pSCL0DpeF&`Fnf6khmPMbp4e}rKN>oANOwV>G`Dc-LE=$>F!l`f}d?R|Mej< zZd2>aR9Bvmumw|i*x!FS8<4XjV5iEBKL*@f_m|AP&UX4}pxwztvpcmB=RS2YtCept zS*jDz+wm{KEn<6Zv@QF-#vQAhm7X)Tor==R*7!8f`Rw)JC)>l>Z|Pgf<nXl^T6FvE zZb_Q2yu;6hMfuccP7XVpFqQtldpCc4D)@peC`eLk%Tt{h`*{w>MsGLcF4ub1b8pS0 zdJUW1_d^7}bI)EHB(pQlr#38Pvy0f;BEuUTvu3~Fa=kpqdDo1eyPThC@t*$j&&B!n zAG=D6&;FV%oSuAdmdw#Dt^V2dA>Ng9)w5bjrnYHPQg3DJ7(}^*3_M!-)8BDxN5<(W zygjwm*g$pq#;bcwxr#Q$-|(HYq+*+S%pM=@=)XU?;-X%!h!j4N>DxQgseQdh#L9>( zL2O#h71gyFXT4qap9~Omuh5L2#@Ern_bSlSMDuaktV6r+-<Z2}_s^Jnvb<7vwGMr5 zNY8xvMdAF3-D*isO-ydiy*aPmebSlw^J{M#-&%Wd>N&Gip3WM1-9SEW3-M2HIT@}A z9Pml`v`qGTnaq<;@0-1+Z0lqFXN8<9oWjYf*~Z1DAd>5*{8vY5(`zmNt&DH4m&}<f zmv`TBs;9B|v`eqUmj3yZ%r*7@hR6FEV*)?VyeF{Y{WHTw+54u(-*$Qx`%c)e>+Xzw zr~XZ=ICyOH(r2X)`A)d^f0Z=&X7v0?-GuMC-(1%UJl*WJ-{Fez?j1j5en=_*tIJ>R zbU1$c=ALiYzuVLWAM)BQ6_I&2^~e1Kvz)%a`gl&qDs-*1)-%RyX$Ma8b2UlkTgIoX z3Ky$9E_Y<|S-);`)$;iYht%5ZUgeq^O@1$Xc_I6YSyz6io$St<B4(r>+$SC7-*r)7 zdL%=x-4vGNl93k=cId^->*lj=Q5V|T*gwBwa_OW0;yf=;ZpvZZDCe%Sd)>71FL4PD z+dLUxdQPksoAl_h(wF;^HVJ*42?^|tMw>4EZa6q8^<l{7jnCyX)BkobJ#wpTf0=ak z?(rWwi}<3LV>KC`&kt2BIJCR8=3#w6<9F)^PWL14ED&AyC4c6}T{e0fdQa(JNnpMI z$XseeW^dSr&LqaLt~dS`#@FqC2uVg7e$v<5@@eO0#wpy1no$?^vv!(1I=JGx#{Rn5 zb=mKZdb~W@wdv)Im*-P#*caal%bor5#O775|IIn)IBiqUe6=~d`pfH`AI>NAa4wx^ zGJh4HwE<)H<=kBgRgsee9<ZG3dUgBFYp<tEM5?tIc3ffF?9$-#zWV9IOxYJN4hTiM zmd>?%nVjYrklEz<OH;1Lp#Sl{-8?$Ccc%n~{}(<Rn{oBcDLLk<l!((`iftb3iOaqD zyXpE8p4<bilRgLEDt>yaG|ZS~joy~J+?q=bu?t<ko6WFgle?^)`O#smLByUDZ<yjN zS5NGjY;$kv1;wfYm)U<@FH1!#oKoL$LNI@O_vKIb0<+DQ{?rb7bmbG1Wa%r1Zsqs6 zQAcz4AO2B2TR%{{!B6>-`zbG>b-OnH&N?#FY2LnNar;7U*_eIGKfGR1bnW-2;Wa9m zuC~qonZA7*k|+M%=ns9IB)V%OlkKt3hnym3X>8f0t@FWSt;604-v#&ooOl1_gM_bg zGiLuZ*k+!`yhm=sY`=3Jc?Va_X8NWoR=nZZXO-*Xt3RimedBvXCi!~f+1XqLXU!)z z9SYJ~Y%eFz*>#IQ`*7zX-@7T7CzyQA2>N!_H{`A7W>3dLM}|3Dtk<qw@7^b0n%c#x zsqZ4!%<$Fl?B0~8hJwDuxySuZWZ!zU;OMhAUM!1tvS0T~N_xq-R*=6|S}Q7eb<%@F z)-KE&9FpRe<};oDvBdB=r`6N@Px$wz_Nu;RHx{*sy5`On{@~g7`{z%d`}6kYou;lN zr{-<bL#ME1bxz+}<WcOeP_g}kl!8dgeg2HCVdjCCMO02t$)2Ofc+~A!p0{{T+6k?h zd99-Ei)BB#EML0);aOAlGoNds7kNG0uf~zP^Vk~Q(=!g_*{bqYN_pxTedyU7Q}*fA zmYPIaj`}arMof<-xYdte>-EdMzRo1{Qr^abe3jIOOM2d413b68?s>6R`=s&XNcn#+ zwirk98%VN6EPN~`Y5wZ(<2z-E*>@$M{aoy?+WlpTRjsIT>XE4vI2IIWh%sd_o_y32 zJCWhYk`wc%>!{zc&3M&uzC<Q-$|Tt<UT!Ss#449wj*Py0L{xu*4vS{Yga(P1{fEx3 zIs8OQar4;=c1vyi?^uc4KX7AJg~W27z^R+}`)N*V34NOIH9B>sM(F3(6H^!aS$l4? z(z<u&>yhMq?#TT=XYCZ_nfTbj$i8NGLQBFs`ws!y?#T~k@lP=|^z*$vNr!9Irpc!S z&TPK^GyZzV+vg^Z{jYAG3+?wzeiS9rwLtuy<x}pOy-{gT6OaEl)?asG|AGn42D^$A zmS5#NxF$^ddi9)$4NopE6kQqJ{)2Ueg<h^dv+Qcm?EjxqwmW}2vgMZZW)YkC^i!`F zB+ab9zf#96dO}0Qs?=KZZtp{X^ZaTb<WAp`cYUASt3sZMCSJ2P+^p?3SYcJje4=fg zwZ7Y5eXFP2J_^5`Xg)`ZZH-j0ez^B0`)`|c(l5_%WwUaP6g)cJ{P?T4(ffC?9eQ~_ zWlpOD153H>o-1m%g``pnH*NmQnv=UN-ILo+@!%Z0O;<m$Np7gjTKOdIZHj=yn}@dA zC&ljQ9(829yf9$>Lh~yu7Qfl$Hf4&(e-NMc_-XB?jLwta>o)j5F}diJ$kgO8gEQVI zD&*xk&S#-+`u1<WFL|<T_WfU)Sti+!zpPYCoY6JItJrbonx05+O*6aSW%pM6W9(XQ zaJ;37rP=n#(?^U?rgmRcnYcG*;^hf<7MUK4>)*9k`u@#{LVxNsb*mn3KPWdNHfH7O z?0KfMyGmTQs&2jiao6Yj4wHT3y9|V`&R*jilN)?+CU=a|^UgbqWBNY3C4URzl&F2S z`S&*7ruByBEH1gMl|EtrON)CFTjo;#PX5QcuE)MQ_^LD6bFK7c$&5{NrkuXIkSXfR zvWCF-zOjE#hO|^T$J>N|zSHM1W8qp(k+VyR87lg}JBuj!T;b_#nCGl^$Xw+`joV3) zdpnfenJ1-r^>|$J-<i2$XMLV8^WlGIPMk4y6?*&OM(WMWN~{d;=S#458Eo0}Y4fb- zWmZhL7PvQX=VvZsyrdI!c&Veylg`~bM|(|9SYN4RZFqh*YO(3E9oLVZRi4%UyDpYH z+F!CxcE(G7A@`k?5zH@-nO?fcHp{MI*^S<LD;Bv&Zu_0NW!o+e&r+5Uhl5FXUo_d} ztdZ81>|{FL@cZ6%rmiJ+?{(@LMXC&g)Y#cGE6xas>}V5V*6MMZpI)$U<}Pu&MPd^a zCms+;m~sAQrcOz)^ZKm{wkG=&gB%wv{~K{8e$86Wq&qv7MX&N|^6kA}a3)!N_4{+H z*|Tr<UX`lqebC-N?PN>TGL3&6hpnG9l|7nl+}W&T`MIw_QpY$yQgH5)=ShLj--nmQ zHEA7@omDpRmdMV{olp2Zy-uFL&se?jt;?L<YrNk(usxhszJ?((b8BLQX#c?ls_skl z&x9Otd6IHnVuNk$y)%b)#5^l5`;=_CSIFtqEDkGCRwu4&>e^BhKNVjqaAiNY?{?zr zYkBuutGfzVgNt5yM;(wTGEn}u+w(;AbFNGSiL&5o%iirJ*TRZQx*mHy>f|o8Jt%qZ z_LIj|at_ZPyH6<7Z9bWvZhP|g_R`=#rvk$cI{R<+(9E5y<`gTxw)KGG=|>q0vYod% zX+^WCpI&0leJM)jK!smi*CZ8@>X~1zi}#o6yDq+T;^iwlg|qc?8A+GZJ7yjB(<v&S z#q<<tCTp^nDLJBA1KVFWXZ-WkWubqDZcdq0pS>fE?{RwYE$AJbeOpO2&ufpMLc1 z_U^Qc8u>ZK>z1zDzKzBEpTN)0vJ6rdhcd;~E*{b|FwT5>w#GPctI2uG=sD6(cNH@o zZS<U?ZIX{halbG;EOP$ik^rwnQ}>pQTN5K*O37q#ZTCv*tZtp|XY2cdUy$Xa-e!XZ z4<E4}*nLl1Sb_a?qn=nL?<${gho--wo9|Eke@5@qlorota_$Vw$u%>=H^qgl<2UJ& z5oHXQGQXQ~MRK!1$3*$e?s<0(K8Std^7`%*RuhS7yX$|)-wZK$ut~2>^5=_(r{rGv zHn7DktGXs&p#0HhjcLZN`?4D!%FR2Kw&Fc=@uUealo=*f9TVq#_i@n_gE=M4#|q7x zEUL6BHNO_8TD+PSJjq_EL$Kv}n^HyFjfrwy4|e>}TOb^{fq!}QaqYj$zjm{)oGqoR zz|_&(*2}S@Eq0#iLC)|9OZBN=E-F8;KQ`;mmx+Rh8x5pSZ{;Zs{ocX(PHdS+gSCD1 z>3^SY+`sF$_tbqe?v-=TPkHUV%k=WXvul4O&U|(=rR0s4ZCm(e>8~!6Y`*Q!bP#&m z;Bb(A@vI%8SHFtf)KKdeSG$*Z`dnDy_qk7#jO4z|%ue<%co5CD|Dobn2c7ljf?WQo zm!50nuPmI}w(g9ErQapqgC>ie8I-2a;5xK6W}cX>=Ehlpi&h@p)pqRdo`|#2+_%!2 zT7+!-SF&GN{>is@$86)d7p=N~%_%!v6q@kj)|(^7HOI`q=$K1BcJ`Xxc!)1|wqe;3 zb1U|<pM=9+Pj-Lov$QXvYx>DcMk!PK)U8!d&GRjIqFZ!)L#;H+<H@$W-`}v={O#z~ z9l_q}PI<SNR<7WFv-q*eKIZ*XwwSYD@hR?=Q@XaGg7XdYw59%xfv4yBBxEJ-5D<Ge zb=j7=Tj$@Z6_&ZBmXTAa`~JTG<LUU;=9acDHK7@P2XCFrI)B19@;>{smY+H@8=3<| z%hyMDCruI!np1asVLabPzkpj8eir^&btuI5Lw|Kail(V#LdvelsGGTAirW?jy%P9t zebwspS3N)JRqEwE8aI6R=Uo;m7gp?9KmXgm=cea%)7HAJj5y(V+2!9!-uX5*x4i#O zSo}aCW<vMM<nzu##nX<&WL^@p-8s3VMvHZMlj!LWAGPDl=Iwd?WnZ+-Kdqf_mN&_I z@fEDR?R7ryMOceLh`;ly*61lrp%v;m!sl&FrLJlHtk6i<zRpLZNath2^fTT|kNZcd zRXErBMol?C`LIdm^oDiTc`t7+ov_CB{5!|!$6fbbzj>!FTDDiVeQlv>C`Z(;4OfpS zuKzn}d1=n2^0%JGYnhl7b-uC7_38_FEIe$Qt7vfl@`jLvpUVG@C%fLZyA;i$<M_#0 z%IRpF#HPjZ&ve)pnSk?<CA-Q-qe?s8c{O?EQCD`mG~3AV|6KLi{rcBUub0l4P<Fgj zO*G;mXFp^3qH|o077|Ao^c^BL1YRuQzNj^Sr>p!b7ojLIy@v-h{Jj*jl~(PT$Ic*p z=41K4uC0&bCzbt}TlR8$yijk-;inf&^k=DD7ioE$tjjRxL0OdZ!m1PvX|XM8hM5a^ zZ*Mo6Dz?M?S6bf1>-SgAFuxWurSN{MkC)||+hS8=`dOT2+V9Sm<oI_&`+V5uxZSh7 zk2TkcAHB8GW+}hAjL%Wock?2q9DjW!*jR{{Q+v(I9nB|~RT=c`I32X@jaq8<mG3|6 zjCIO3Uh<H7mboaLf4XPe<nK&54UR6cVa~o4AABvIl%8JZA;h|#^@BuxZsH63zRY5| zpedVM&uHfTQs{9xeQ@oy0KGn@PYyqW3=C^e_sy`d?rae;7Wv&*VZyiL?wx18CwsT; z&fspEwsZB3NgmQXr+?})vl+h;UiJRuoQZ1_UR+<RVA0hhT={)nK;LF_*`x0c-2OdJ zTy%2%gEh<F2b^(Qvf*aYC4p*xy&I(`ny0ViXbCeqS1lt`zuS4zCZR*(XDg+WWuo`( zvX7Cm$QEzT5PJ0dyN^G|o5xoZ{`)6-EnA+oAbj83>{TBke^0$yCGlq3YS{xl?`6xB zpXsoiPqdtQM|-=`5hlf%$CdYN&i(Yt@0R*YsecBc-yCO{?ql8X>FCK7ch^kuzUk3X zu}<gD?`w@Jf2O$adm_GV!~a%`rdZyrNw+M`-bT1ZXB9>4f2HZNCcwzWfB%m1{4IM# zyEgRezdFl*K7ZHTD7&czyM3;Hw)xVZ>G<fk2Y3Cx6|QgmI5#nE+bj6iCM;Wx>66Si z4*$FzAH0j-9nxNVikqe2R91Ll*{jmqVfp&)da4^&uYPkR_mz@E$M39_Dtrx_og7n| z&gpLscV+O~`RS|ePUAclSJNPN=l6B)DiuwK`2Q}6kYnI#srBe(T0DDRMTj)(E<@Ev ze9S#U6F2OOwGMr<^yL)AzI*)!PG7#xvQm|}<#xNcl|Ajfa+<K#!e(Bb51vP^AL80y z`J?Xcwf~lqO~2PXR#~92?OL1Gk50LUFyFsw$0ir=dTh4OGhp8Pw4xQ8{oIU|mR%_m z|FQ1=o1%u|!~-T57w(+8w9L<GjqH8K$A3(OK2^$Wd%E$=q5~Ip=(g0pvt6=UGu!sr zoTh+?hsW7I%4Sa8XLHt0o&AN0tC2&+l08N#5kI(I8a`b6;?BI?b_Q}>>c`8|CBB}W z6A`{b>e@EzvwZ$J&n=#>k+)y<g{P6_LGp{OC*K8LT=-gHpLKMBh1!fDV>ZzPj5cMH zjE?Aq>8r{aoNV<wHPzFGL&(JYQBRWcY!4R0Z_6}hpS-nlN_uuez^>--=r??eU#H!; zXA&~2>w$(rsR2jm%T4zgu9fd<GMV1G)kJ}b&Hd-uu$h8EmwCAQ1=$umf1dNTb4AD@ zDNdo)r#FQ}L~ihwem$+~`URH52aHYf66gQsPuX_rk#l{?swYtrx^wn(JT1EQ;KjoX z3)ijlIvAK`<g;^bF8uNDXjbXEE*2}b?^^q2pPwgi^GcIqpxZajx!ne5RVFOeeE%}& z(|5UCN9C5!zD;Kq1|79djl6cdB5-BPVTHI~vJ;PWR+~RP{#=Hy=_23PfLSYM$_cj| ze-$!u?S+Lx+2yw`T@MwFR*IO|tb9e{S<v5Anz^$Vrq=Ix+$5#4W8sdLe>Zk-34S=w zo^^V|$raNo1^x!C{-A!SH(T3Dr`UeuQ_DXpC)S<hFW9Jh!pVAD%en)`L1!8@Wv^eo z@a^uhTdSUabboy{$LdA-jk8;~`FXyO=Dbol@BH!GabGmui??xecCz*eXCDs_{wTJl zBdU06P`~jPU)Oxz02PA^DW6X|CfgXZ^tG;iR@0s~ec2kX&$+ts)%h+bwa+A-=K5Sc zUv;-mZ1J1D=UV@KyP3LbPm@sI)rN`>|8kzaklrWKZC|VF6DW4!X18$s%m}XZ^(zxK zd>71AOlvF3<@&w*+OZ2MB1fm4)4lSjowdut;h@q*`LoU!CA0-hY|_*gKXzchzVMD& z)NPH0roSI;*3$SU6KW+jy<(dC(#umO)cblY(%5DoZl1$=XZw^Z+c-)L<c+puv@P2H z{z28|sBhO7Z@Il|sgeH#l_REco6G$3*WN5;n|{Q`HvNFc%=MS&Y;8{C%FEbev}c{m zrbMB-yG9E2Q>Pe|P4(TQGmYnM(C&&Ahdk3_<a1rWD@VHWw6m7_JAE%ZDe?NqA-Cf% zw!1uDxFBiQ(~OG>R@<|~WwyO?jcwVN+tnUba4J|{%(Tg+r8&!Gv-#x$=T{f^Yb`o( zX(#XNnC)HJ^Yi9%S#S54GpD3~>cpJ8+jBR(+;w7hM4?}B%@&ntl|w0Oi=IR-n-RQQ zw7)WTnOE$x&SY-ucTe{+&+U?4lksb%+NP-MJW>JDn?ie}7xp%=ioRNQc<;Y=!Jl@T z`j?zHmj3W1viwi)wocwG%lsd9<`Rw7A7A%nX*oXOJg4cWv46wWJ)XkcZhoxFzc#OW zxMJegM!lP-45k?^o;K5D&!o-U%(=gF_5O=}uxy)d=ecX4TP8ZL*z8<z;ON<m9a*7A z8nreHfB(3z{S5!S<ly9$yzNte{}s~fpWaaL=6Sj0#NG*u8bZvEFrC>tTl~GC#o_ah zQ&c+AyZH+R4<^03q@Z%r^XG;lK1W8iwL3$sCi2bIxw(zWGgUYJj&6O=Ro!X&EVXZJ zrrcd$cU`qB);-)YxqYH>byf3(FZ0g`ADBCZVZv_#+3&5lq<Tx+o;&^eu>ZU1yvucO z;~vI`|LW!6TCi4I-E4oH&{Kti=Sut!KSeBDxah}eech8?Ti-4#dVAyEx(%zvZYbOO z*NCpjWeJ`3q^;ELrj$m=-D4}RXdPp94zjX;_4iIC`#z74r9VrjvF%&Zx_ZwU-mj{P zs}^}Ccv#y>T=y*YUezZ(+2Z%wi_!HaF&^^we%ksz&(XcNSSf0DK6lLj%A?L~+pca) zPix=uvfOcRP5858qPxnru3;*h?D^fAsYyUt;^y6o%old1o7HBg7v|;VU3Zo~dBJVT zw~g!NPtHo;b82tyk%d0tq1V?<59TiLc>Zg?yY)ZAznXswH%om#b#%Lc@7FnE0UwsK zIxG_9S@Frey2`BS*!g~kw>s`lfytVx=3?7J<}q|z9r&`da$e6b+iO$z9gQ&gmh$f5 z+s2)9(&Ucu%-DC%;0`wvi&5pxZKaL5*S0<ksO)*@BEE;;Pk?WtsFiQU&y0POB%R9^ z?mGYNYP?@F*M6bCH6=yI+h;G*z9Dyef`ZJYJtoID3(r3uCb_HU*uva-QsOzk+c@(4 z9(TGYFJHCcO@kp*LE&VUsH0yJc1>^f-ZnWrQtUN%ChziqO*M*dHz=(B`f;9hbKUaH zN}nh5lb$Q<KH%cj^4#gJaO&)=rDjL#1XkvU8d_gxsp5^uHcu$K?fN{5H7n+s+9}KF zD@){Ji*`)yIJNkNt#6}b{0h~5ez&~OPg|U~JLue!rntL7x35UHJ$3xHwWUr;B6PC@ zV_S*g+yi%Serk(8vbAaE^@>g9ItRD$y7is?f1FYAgTcS;+z%I=&Wt$sLVw$HX5IMe zD?goul;@W6U+*&fu{c*)F+=IvbHA6tPrOoks~=V`s=OPN&n2;QnwBwt<&4=kuN?Yj zb#e37d$ZST&yVu_7vNvyD(RlN-Bq)?kU3_bfAETwa^;NmAsSC_>i5sMam!&VS8dn# z8K)n7`g3%}He(irRrc4^Vi#s_6r6dv_2s&y?~lKK{#-!CZO`Y0_jalsI@?vTfX!jT z5#a}wTT7Qs%3gCMZibpyXWK0)W8I{lXs@~95!-oMm$Q6$wR7cvzPoEVtAF=!@4gn_ zzb4x<X7ZD@ADnt5wl+kti{{PW)4AM5*3&iDiuZ|+{ksQGFEG6QHlr%`N(9@-J)Pg4 z{GHjd`OM=BqLRLkCTM)*oWAzmosKUBqKda>h%%ku*5RljA=Pq6?mqvX!@rZ(HSyR^ zJ~rw0`@H14mu9e4$-ghZQfj+xk=X{X{EsdPr>f)BZ~Na9zWRQf-v#z-^;b5Ts|$pj zh<8}QH2Dl?aB!V8>-Plv4f_R-UX5SYctLR4rY`%5@w2R~4GxBGYJW04Vanax<~mjB zt1CD+FD*Mz-p#y9Ztk^}hUscw&OAI;+J8Dkw)(u`*XF`Q!YU;U{Q@sV&rh(ryHPD* zi^~BO>nA_<&%5@2{hI@8IcLuF&kR`dwIe^^lM<T;^O<MC@|-2V4H_$hud7GJO1&29 zZCoz1e&cc5eB%jD1zWa8e?6NnG~t>@!U>+-+e^Ieu(peD|M&lI@Z9R$$|}|0yEbm| zw3QR&yC~ie&6!+v$#Idokx-Jx68GyqtZ!I_kN%ha=vnDimGrA*QDS@VkD9pMN1AIc zNE)rK%eW`^QRnRwt;)<ze5u|lhLb<HOmtgz@XNaEHYL_^T%NPiK0H`CZQ+|Wn+waP zh`!JNzV1I;;iDPXFa6|Ap0hMo=<H+TH?~4w?k93ZE?`#pxkYTjf_bK^Tx;6?-)P^L zoXz!l%JN8K8{Q|YKNuc}J^bpzo>1NQiybEaY)$O@enLHFaqQMtKWD8Ld&TB`>vrJ& zOJ*NRww9gO%$r@#t$ou>)jTDUD}92;*)BzXtAiC4`}Vcm^N%@xjNkEGl9`dsV)JBK z)u(*vk1ou(Ez>bqH+ylmVMt2e!c&V6r+H|uD%Uzxx6xpS=Lyx9b9i5~zAj%P@^xeC zxmvE;lXXRpTmsJ?Pii%a;%<#E$zS?au6cpz`72v{*3YYbVvxPFed%KTS7%itEv(vl z8fHv6cyKEB^p6cue4pL^m?vGy+iw&1(rdZtJv+s7>yMf)5uIka<@{s8;<rgUM!rwW z@0_%b{l|NTwXN@K>nFFm#wpX5w>(_EQMvVy)A<9k+gIKSQE4^2^}hMn#&h?RCg?F+ z_)Op{J8*m3v+z?crH6UMkH)A;6<P9VuWRK`$W9O9In=xL7~3vJNzJH*S(T?(o^`j> zo_DCvNpnwAp0|zagnId9Dd!()f6?81``y;Ie80#ePdV7@j~GPSYNqT@(vrP3P3=wW z{Bs6g7x?e*d%pbPgxi_xrdzg|b|3T;an(8*VJs11Av&Y^vrdSV?O_A`F99tR8-6*@ zJGw2he7o+~ZOb~Ba$9TNv9$=!n`$m5AL-$<-@(c^WTW-{ck||bob*7YB=(8nzr_sK zSF=X*HGJ3+oh%=3XTRIvbA08`qYMXrOFpm9xp3b4Syy2z-{H;QO&A>-;&uh<zc)xQ z-50&%q|U+kU)vb&9E!jDK>pW+`JSFdk6eFWPZ8^?yW6x&_j3HD^#XU7A6nLOIQh2z z!jB^AoA<aDoqaF<R>|aV*{|sPODZOr-ucJ6#yQO~gnyT&Lh*85ZI$!xcbnH8x*#{r ziuu^ILfNltZ?+$}v0;_7<&FJ(eUU4DqMKHUJ>|aewk|IHXxx(O%S+e;AO17o*K7aY zTXo-Ro#QwD20oMGjjvwTF}?DhY&-wMk1SRV>jSG~O<jVg9NgrY#Py1=Z0>8$rSpG9 z%V(yZJsGyU&W%?kZ>2@Z_WT7kE<ClrGPD+av`|%DmHUhB<Sn0k&Wkq|b{VgqkiN~A zEhulw$A4E(HCNwB-K@+o$?kP81H&}d(%IJ^Rd5;jO=FNbzQ=A>)w>@TozBF&drMb5 ze4*DfY3<vKw-P2UOuK*aW8wMS|0>ox&+KQXJ>#3kR`u%|!#*)a2T#9q4x3hWP2=8C zy5_~zmCjmsJlu2FZc1`kaMxm`^vmB`D>~zNKW=GDdE{ZX<)U?=z^%z&9#)zPmY(%x zTjO4o^Wo&zSu>;7pIkaGL4H=q<Jaa)Mp`P{4+gEgxlA{g|4feM%g3TCkA3J8x*sqt zciZhUPv4T@_SfrdSML3<8pgDx`>T{}V3^6e*1fBfZk(5Xk;d$KTR^*XchohuJ;gN& zs}h5x@_Qt%o?r1dZ0DoUVCzev<;^;!4yu)EZwylZu9UuhODe-*-L;7mcsR_h)BNHU z_8RH19y$8gM`S_5t*LKzi)Y;MDoWVXq_%H<f7i7armrV3tl8R|XEP;c_WRJAIqSFB zEI)TQZerF2vtvJ3>I**>eP-;RQ}^J1@UyM9-|CNi^en4pZdA;8Au%JOfJLa)-@(Jh z$H_~~_5XQ|l`AqcUcQi&m^mYIM`gv&AFM2`Ev_y{kEp6FU6Pve^ogj*)G48_T7>Lx z2VK5!>Ehz^4Dk;o(%FT5CTWI9%`J?dq4VwUgM!MM#sC#I#fYW_K{u;yl%9XpnZKai zW7kx9DYyE#B{fSbJhZafQ?K>q^L1@s@PqH?{byapn-5KqGyfYemA#!WbIyHLOTiCY zFR1W8E4wOqt*P(nb3gxE?PvdOKXRveTJEb=`j?+(ws`I8%iX0~y!ERrpX(BhSgnwP zJC>Qd_O0Hj*~uaM@43^pM!VUEw<YgZX4k0Z+99ykmbvNnE5GLd!e(`U(;1fizR1JM zvgBTPZOn18O^V;%9xz!pWvA`7-#XQN^OzMHm><ZoSTH_6V(`E=nIT<i>+-qATlF)< ueQM_=_A@I8ZM*eoYs#1PvcA~~i*q{W{}QpV|0{g6ifz?4iMMeK3=9A)CDvj9 literal 20096 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 JfbOdg83C=h^ZWn+ 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 zcmbQy&UEG<V?6^S0|NseLjwadLxO*>zLDGgiE|hjvNtd=FeD`BCKgm5R%~Nn$Pr** zVB|?ID^Xx(6yRcDsB~apV6aLnNYA|?a{B`VL#_-11NZdw#Nq-51_l8JhI$tU1_qAw zoXWI?8<`Ur7#Q9#Fr+7Cq$Z|FHc#8hz>t~2z`$UZk&#-T$nMX)fPo>qhk=1XB_p?_ zLTI5(J_AGM0tN=gS2_8~iB%#~dKnlpKnDNFO{^$jZ0E6OV8{qyU|>+lOUzA;@2@sz zV5qENU|>lr$S*GG2~}9hz)<^yfq^l;peVIqQqP}L3=9=p7#JA37?>E07#J8%Fo`lS zGq5voY-QW{FEE{*0UQX`n-66OF{*&sj0_B#|E4{O=ePOFz|H)Efq{YHw*JZwFnUwg zA4Vny)yZ5rs*F{W4RV|u6l9qd{#!6aF}-8>rNF?@AIHqVz<7#j8_1Pl6PXwo7?>Ft z7(^JD!F&-07KR_7Kx9y0U}2D&yer3I@|PT&$ws+WObm>Z3v;bDZ^=vMspn)U0_kAk zWME)e1U7?_g_D7iL5^V&RGf){gW&*_&CKAza01F^VbEX{fU;Q`q!=xrY&IluUZy<8 zAgDMWg9-Bi24{wRh6094h9ZVchIEFE$#wPeo4xCfF*7nu7HCprte$Mt^lh?UvpXj! L&=~*!XW$0_q(_1( delta 1645 zcmX@}k8wsjQ#}JC0|NseLjwadLxO*>zLDF5#5x9s90LXhhJ@tY#Db#PAq@-+ITIKd zn3R&sN)(tG1-KX(s%|haFj%D(r03ocx&48GA#V!<1NZdw#Nq-51_l8JhUN(j3=ACU zIhAQ^vwi#+7#Q9#Fr=T$NKH%;=`4B5z>s-|fq}s+BO|pwk=>tp2?Ik84+8^(N=9x; zg@m5W6b6PY5e5dvA36ESi4PB)NMm5g0BQJ_n^;l6*u`Vdz>u+rfq_9GFEKauoe%$1 z28L=81_ri21^LA#x*HDEF)%a<FfcII78IoxOzQb_ih-fZhk=2ii-C#3h=GCO1d}KO zGXpyV$5ytD{{qwNnHU%t7#P1Wq(DVkSr{3Z473eRjYSnrjYU%!by7fp0isR^n>u5V zI*_826b5jRGBBio)v;}6WMG7tl>(B3$ks8GFtCDbWnf}Z+MJZZ#;9X_)cB_HbC5$I z_=|FkPCUQOR|an87a)~4HqB&%(VKfR|1k0~=`pA>eqmr>)L~#?NSWM~t;$$8c|*37 z$NT@x3jZw_qL|(>{8C_G=#OJ&U|>AOv<(zwV8<~tFff3y44B8jD8s-EX2~$HfRY1) z4TAy$3xmvLqZ|vS_x~qn<=8O2|2uhEjun$Y-Q)*3Hj{E$>KWM}UIDp@5fm~Y4C25r zBLf373o9Et2PYRd4=*3TfS{1Dh^Uyjgrt<TjI11kJcELwlCp}bn!1LjmbQ+rp1y&h zk+F%XnYo3fm9-6nt(`rCgQJtPi>sTvho_gfkFTG9KwwaCNN8AiL?jCX14Gp0k2y-F zu`ml6;$q-TD5C^QgQ;jRSz1<ERbDaqV~#v`LQ)1pYFc`HCPVUOsoYeadND>ma5#Vz z2123%O!6}XLdBUFSQrwZY-R=(h7>59g+YX&1IlJ);ANNtWwRlP^D>$<tb~g5F-S2! zfU*S`pyt;zFfa&$EnsF~WZ`6BU|7WX3ludhoD7T%a!hleY$gT{rd?1rGlK`yAt;-L zL4%nK%4TJdVm5-Z*^tC}nev!@pyGTCCaf@X1Q_I)>R}cLf-G>(FQ_caOwTA$&`8!) zFfuT()HO0NG*EC!EzV5OQwUDZOwCJ9)lu-wOV;B;S8QkkQf#5%ospQQ;Fz44lA2rT zofwiD5g(kGR~(#Ll$qv~pOfO2pI73RUzDDzV5DcDP;aGxrbZW}2%A_~YEf}!ex8DX zo`IeTy5&%p>R@%Mf`(0bdAVM0Vo63;VufCQQM#Qb)cN%Y&th{wRA+WZVqPM|M-bgQ zT;-W1845wE#i>PQsVNE|Pbv5%=BA?iMvsdtBqOsJq98awt)x7$C{-b|SRp4fIW@01 zwLV3mG%qE!NTDPnRUz2ZN5Q`!H4mcN2ckkp0p@W-JwrW+X;94yiDikIIf+R*sS04{ zBr3Q$1}Y?$SaD^PloVL$>lY^%Wfqha>lJ6_fZVO`@8*Lh!;K_0*`Zp0vuxEdW^QP{ z{@=`CH2GtWC}Z7Zwz_X@jC_pzi~^JY)VV9Om*!=<y1BVPX;&!i2FgW@42=K(Gw=fd D3}$u^ 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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 delta 16756 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 Zrx$Qb)N3~*gXCSi7obXy@&A7YegKLo7>ob_ 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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 literal 15732 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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 zcmezHk#WgO#(D-u1_lN`h6V;^h6Mj$eIwV+o!$%#2_G037!s0m6ASEg;@BA&5(5|* z7+I3bN)(tT@NZ#Y$g5yrV6aLnNYA|?a{B`VLsAF>1NZdw#Nq-51_l8JhLSl93=ACU zIhARJ&U?8S7#Q9#FvQHtNKH(U44Jl<fgx@Q0|SFuMn-CVBD*}(ItGS>GYkw2DjB&Y z6@T3IDi|2z?l3SgzRSr^PE^d~n#RBoyMlp%;a6^AMFC?Qk23>9YzG4agF;?nZfc@< zO&J42-WCQ1mZF0E;*wU$KjI7w#TpC@jD-b7sRfgI{+wc9$bG}Wz|h6O#9+k0z;J>| zl!2Lnoq=O3+s1#LG3*TBK&aXLD^`S2jRC@AWMKGQ)U_*~-{va=H}eYy1_p-P`YS)d z=*1TCOiT=|lid<k8LKDfBswuE$WGpnC@;^%z`(%Fz`!8FzzjB3gn@+t6qpta3Jfd^ z5|h6rnoZVAvYMQgWWmJ1IC*1|;p78J?3-UCC-c;EG8BPyv2ZdlFf0O_!^pzPz{nuS zum~#7#K6OF0Lo@&@L@OuWwS8oFiJq#tPE0&E>Jcbk~l9@9%CF-oR7hT`3!?ILq0<R sLnT8ILncEyL&oF-#e$p5i<wv$YbIBf|Cn4+5zY<rFCzov|Njj90B9F~;s5{u delta 1633 zcmZ4TlJUbw#(D-u1_lN`h6V;^h6Mj$eIwT`k-7{Fi8%}m3<=4(i3Orgn^GAV63;L& zFi9nsl_)Sx;NQZ)P{6~$z+jbDke+)(<n{*!hU6Cv4BXSx6N?KN7#IW?7%E;cFfeeW z=TxS-9%KE%z`*c^fgzSHBQ-HaB&y^o14FzB0|SFuMn-CVBD*}(CI*H?4+aJXm5khy z3MMAKzYGlVJ`4<ue{%AZ6aDX{S1~Zei7+rQGUO&!6fk!3I5RNBeqmr>P{>QnO_l#9 zSjfOo;K9Ja&R39MTw?HXVif~Jc?1IkV}C(WYQdzQKc^TN@*5Z!7`hmk7>pPg7)~&W zGB7i+GjMEW+xV|Drk;s`fq{W(4?_x6l$C{%fyqGI(9~E|(bQNph4D)Y2rz)vG3sDb zXADvYQk0Scawy2a6tFtB&5R6;5VKN1auC^ih6)B&kRk>q2BpojVmTPK^b++-^_s!a z!N|ank#No+p5Nvx12;1$C>d^Sn#l%I526>Jh-2bo{KC-6w1<I#QHOznA!YKZ1XafR z$sZD&Jl_9jR`_qh5XJP4;g<pfLw_7I0|Vn8rfs0`0-Mgvz`y{)GGHD9qX+{tm?gu& z!T^dYD+UDy76z%wMTuri@BdF;k!Z#A{_o^Ri54sZ^$d)Y6_bo78zgboGqORv0&*22 zC}cnw#DQT(1_ovpRyKAHPA+a9UOs*SK_OugQ894|NhxU=SvdxI1_ebWWffI5bq!4| zZ5>@beFH-yV-r&|a|=r=Ya0ezJ9`EPM<-_&S2uSLPcLsDUqAnVz@Xre(6I1`NEQYL zhN#JkNlK=%Fbf$NVh~ISs}w>($Y?NCR$f(IQ8`&LNuE1CF_R%JJtHoQA!&0^QYufq z7$YAzC_oAW8DRcnWZ-8Ago-mUurVY+*~|=T3~5j{3xgO#50uTyz{{`*%4S0n=Vdf! zSPvEFV~}Ee24xGt%&%u)U=Rdbz|6qN!pXqEu!sp1S0FYcgB;T$P)xCKGB7dlFdcxh znHhYT&Oq5L3_8pbP&O-r6tfGI&4wh-%aq3)2NmaIFkyx16=0BKs)t!12(rLAzo4=x zGd-h3K_gjH!N|bCQrF19&_KZ@wKy|9Pa!xtGc_+cRY$=yFIkTZU9q7FNU?>2cSd5K zf@5-GN@{MUcVb9tM0{{!UU6`0QD&NFNn%cBvRi&$iCcbAda8nvUcG^Wl>(Y7U5GO5 zqG72;#hLke3I=)xdM4;jfVx))tAiCZY|6{a^>PzSGO`jY^zw_+?KHXS(T%|73#iWQ zjKsV|h`%7Zb-2niOEMIKQj1fI%2HDlKps=@OUzA0_mLhKS4c)?F+@Rdep*R+Vo|C> zX0bv}eP(iMUU6!QLTO$~YLP-oMyf)vr;mbvL24dEwGTvrjsnc%hI)p25YuuXQVNM> ziJ3WxNja$sVCN(%xH$$YB$illWt5Z@Sn2B*Cl_TFloaa~XXb$1t?%#V1D6rRkeb|( yuejMgpNWOBezI5b4>m>tMnOiQ$xbEVitMF%nXYbbE>PMPO1pt_4deg+4EzArFK@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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 delta 15560 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 U)12YU7pE@_j0}wb|1<Cd0BY^&>i_@% 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 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 UxbzPkUwkCjqBm;s4>el`0K_Ws#{d8T literal 15024 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 YN~`?0I3fAh-gl|;TD?8t{-B+x05-ZRTL1t6 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 zcmezJf^o?M#(D-u1_lN`h6V;^h6Mj$eIwV+om~tJF*ytj3<=4(i3N5#aqJ8XF=rSU z7+I3bN)(v-`42NNWPV{_V6aLnNYA|?a{B`VL+k|x2JY$UiNysB3=9Gc3<WX_3=ACU zIhAS0|2Ks)FfhDfV2F^&NKH(U)S9-RfgwtPfq}s+BO|pwk?lLPBLhQ>2Ll6xN=9x; z#cxUJ84L_j5ey8B?{e~!6Yt6%f62fQslvd(@GCd5qJXiU$CQB~l7)eRK_M?OH#H%) z?gRrvmH`6;OGQC`aY?J>A8`hTycG-#jD-b7sRfgI{+wc9$jo41VCZ6CVlZN0U^u}f z%D~LP&cLyiZR0=o2v$%K)NC$`6k$|jU;qaQBLl-_(I*n|{5D@1xS3xtFfcIO)?fJ< zMlaqH#l*y*F!@l7Dr5EJ7covu3bK=RV&&zT7#J9s85kHu7?{E4h%m4)d|+T;uwYPN zU}2D$Toh|Ic~z{{<Y%!KlNI8uHmAfV^VD-P6oHhpa56A3ECL(A$im6M$RNkC2rACR zz{hX^%4TNpV>kz8voPo}%0Sty3{s3<P&ONqI4@HkV+vH9kHLib5`!~CK0^URB|{NI wCPO+y#$@|^!O2kte4APFZ!k~3Tcp5PGx=Z9kI8?E!?{5oW@KRe|DS;$0ICXrqyPW_ delta 1618 zcmZ4Tfbq)<#(D-u1_lN`h6V;^h6Mj$eIwT`kvR+uF)tVx7!s0m6AMJ0Hl;E!#Ck9= zFi9nsl_)Uv^B-nl$nIcZV6aLnNYA|?a{B`VLwpJY1NZdw#Nq-51_l8JhLRix1_qAw zoXRxikR$gQ7#Q9#FhsOuq$Z|_7?eC`V2GN)z`$UZk&#-T$o8Gtm4PAV2m=FyN=9x; z#s8JkI~W+EPB1Vq{>jNtPUH+y@Md6$oWQ`q$dH>@QNY;5W6Hn~39?8bFEKZ@K;3I8 z14H%^1_pNVg8bqVgO3xd7#ND~FfcIo7ZjxyOzQb_ih&{P4+8^37XuT65d#Cm2_{hn zW(IZ!j;(AP|FK8ZGchnQFfi&cq(DVkSr{3Z473eRjYW-3jYU%+fPsNnb)X<+U`PR* z$F`Y~fe~U>N=gdI6ATRX3|S1UAUheD7?c={HcLdZF>2{3=$Pm@fun<wfnk39h0u6@ zo39Mq%%G@XxUp#_J4gqJUhERZ#K-uBL4i>R>}&>xl*w)}s*LrMb7GvB-v6JxAx2)E znSp@;gk``cGBAoTFoRh#3@i*kK#|9wz`(*FHThkP8AyvttQFJyzmwx)Em#EV85k!o zjMbmKA(pqEkqzQxkll<R|AR1y1H+6A49qO7Z0sDIT--doeEb4}Lc$`VV&W2#QqnTA zat!he3W`d~DynMg8k$<#I=XuL28Kq)CZ=ZQ7M51lHVn3Q_6!b=PR=f_ZtfnQUfw>w ze*OW0LBS!RVc`*xEDQ_`QIi+ODw)Q@EM#DaK`<e#QV0bhqrp^Jc~x~q<>ZC2^4#%> znG9*^8F5(*Nt@5brt;K_G4g?f0;Dhy6!Rbk10w@JLm*U~iGiIV0m^1(P-jSovRN3! z8Tz1XRt8>%rBF5-k~lA;Im0HXI3I%)<4Y)80A_wY0|SE~*aBt-Mix#628KmU%%Ip| z;bdTBkYid3Wiv7GF&&1onHl_;E<)KX40_D+P&O-r6tgds&4wh-%aq5Q4i)EPFk!t4 zWeYIKG1bE?5CmD^oL^8`l$oAUqM(tisbFMaV5w_lU}&J=l3JXZo~IC;oSB-JoT{VX znU}1`g|67p1f<wP!8;={Pr)%cF(oy((mOFEH6lJZF|Rl{wJ0+!C^fw_C$Y#aKd;0s zzbHLb!Khx(K*34@O_?rK9S-5J)S}|d{5%B%Jp(-xbXP!~tb^6f3K}-$<>h+0i6t3X zi4}VJMd|f+nnZa7sxvzyF)tC~HIQyQO&zZC%#sX+pw!~jqO#N!1(4Si{1S6h(fy>y z#TAl~SqxDSoS#-wo>-KskXc`>kdv95npd2fqEMQbl3Jutl98$q?CGQ6UyzyyQSAd! zprZiuxS^h*9>g@LUWLT6#LS$;q?}X*uyYa>+#CZH5=*SOGD=Dctn~GZlZ!G7N{aQ0 zGjl-h*7tYwfyjtplbZY|OL4M#4&UaBSvQy`ugFtmte<=;?*|*B0HYwI(Bwn;;fm~~ Xd6}+mZZ1&T6-v8-3JAvk{~7oJ)Sz;X 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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 M8zTeb|Njj90O4)~F8}}l delta 14412 zcmaD*^`x%8+~3WOfsuiMfx$k7fe%ENltB0(HY)ZH);D5cFkZpHz!1#9z>wg&B{C;D zH?e?$!T1jY1EU861Cx}f)27tqvJwRb2I~L@1_nI_1_mppe*VL01?jmA45ls&46NM@ z4BXRih}`~=o>*L8z`$T1!@$760mTC8IhAP)42&)e4Ek#r7$RDfLyp|fNKH&(U@#J3 zU|=u<VG)Cp=NTEPi3|+J9SjT%@(c_NDs11GT{Ch^Di|1yJQx@l?HCvs|NLJmy(1?- zIgx?EP=EpKD@F#+AO-K-#EJq227?a_4D}2O3=9kkj7>bId5O8H3=Gx{3=B+17#P^a z3)H=q7UUO~FfiD;FfcGmFfcIo8+@EtRZx^#z`$U2fq{Xcj)8%pYf{gjQx&)F?qN-c zxjxmP=G@MH_WKtucd(lnD|t&@@G#0q@!rO|Ek$I8s%qIK19jiYMdrLFPt8(`f`8n8 zQ$Iaw;isUTu{!$3@5T1DR{XjDJ8hoZq*VR?A9^3X*js(By7=AB=W_d)nsgXyS`Qs? zV13)9q!^H&e(uc7mvd&G*q3WLd+CRx`%gX6XFBN1@If|;QT)e)Stpl2GA>@qp>W8M z;e!v8;OyxW4E1Mc&8X3;WL<G`p=m?DY(m|>C(q>P*WVWRP)j-bO6S?i3Fq6KMfi?h zb<(Tp-<a{nTrA$>;qsu4m7flZ*zMoJ;c%hr{!zo(X58;0J{l?==sdZc$Fa4=qa{5w zQt<F+9!8rd7bL_2_S7mDY%Y}N<T{*Z-f+7pn(^{$M)4g@%a*xVHP5ke^%eQu{nI7y zY-!HLoU^}bUR2lL+PUCxce)i{{{6luf7qHDy{%`Qduh*m{a~{=L+b1r#{@4WruFS9 ztWR9`pFb-y-EY;h72Z68wv*Yiq8uKJ#LHfMu5fPptn+g$i|@`XKJBgEcUI2UVsH8R zbwMk1XX>;ab1DqZe8uyuduNVfz?<`_%3&Q>F1(7hShC`enK<W4uX?40pQN?3KL(l# z@(as%E$90AFUfHKN3(<aT|1Tb`z;B6Ic1K1n4H{)d*$~P)pmxOpL=jJxP3;F#ylSl z6Z7}RQ-qg`Tz$U#aoN!ig*xn8_)fpBcf7b~pY^+d)I;%a{>-U(pfc~vijKdN@>T@> zG#7lE9eZ`&4eP$Bxn~w#a}cyFuD>HSZT~i|!gcp8?fO<7S9h1@lJTDQPrqvYUj~C0 zyS|A2(fO;J)5tVs!QLrSTHn5HNuT8Vbz#HwN{&LN7M)9+4qFOVZB!IXax$?H-r@4Z zVztHQD+1|`N-`T~O8SWeWgeWP)E?Pd(se(QHI%bmDa=ZaPyF|9?w=urbvbh)W!Kj0 zwp~AwJKbGe%<cH|<1w?ca%NwNJzA^xa__NiUvjNh`F;%BV^P(;d;Rg(oU6C+U+wwl zeE)6m@BFV{ze+?-HJE&@>h72QC(9RP@crL($L3B{Ma-_BX(z33Op{=luv4Y3HM3?~ zT!$l{TcTK;@y{toSq*iiSsZvWPWEzT>{_JTysmzi$EBsg4JY~-lk1*Lx)FPrg>8jF z%<mSJmzx*7zO?bw;>(|xx-@$89Qs#VU7mk`mb`9HS^2Tz&X~EPAF{bBF1`+Qn(L@o z=d>cH?rZc)mpjjb^-e$SD%PBvR4C1~ZN)0C6<lF1VIGe}=l@#T$jqD@TW$UNQ|@h3 zv5!^K%08>h>rZadUf5|`+jn~TJ2$QOlT`nld2r@}*#4Q4#<tTJUcP^?^2x2YD{sCz zF*7&z_sWf_&tC{gHXjU$F8GjiZSh2>FZz?-UE3;t+UJn@{nCv0-ae@o^Iuu-tyQ)& zc(LQl^e>ga*xoc9-oP_opLJR~|6BQ+_olDAJadVX!K@W861Y`5`|243D}vmPJ&;gx zV3A?nu4$3gY@B`YTIz#5KE98RB8Td;MExIW-(g@8QqJsbX1wv{)ncAy&wnm|5^1%$ zygbuAyI5`62VI5Ruc!HGd!@3jJ{_pjbwBi~k_pp&g~)w+-)^NSTbeHE2;3NTQ{b6) z_i=MC*5;*`3SC#`h&4LRKg(P1{^vHg+*W7lyRrFYeY55@nNJK<YAyNy!Q|(A<Hfhx zmb6rt%WxKQP2BK3Exi2wJw2`ZH7hqNFE9@Nw2j?Ks*3;1BGIMKTo%ho-CO$WgvY0= zX}y!|CS>~cJm15s`|QL$>FwpZ@3}I5i|xHxyO{I-#A+4SLk1HM*;P$mZCNm(>Qa5J z?ZhYF91qX!xMq6d=}Tqqg#u>Zj&@sRGdj#T{{B#U?(Wh@OowM(<Z8&>EW!1dIh%JH z=OMkd%xmO}d8TqNNSe2V_gUt{B5xKB;prlGj(^|FeP&YlgfeM`IB`CqdaFnJV#TW- zZC~S3^=OY}>Ym?sk4=eOWNnwW>s<Vv_j^u@@Yjp{lx|!1qpid$-Sv;w@`uMCJ^cL0 z^zoOde{X(vueZ(Lb%gowjHBm2m`_Q_&U9dO(s+71dKUAlfS3~<z6=V?dU+a(hD%f# z1gh9?lz2y1drMDm|8*{5f9}pJUyD@VOqsBEi|ERjrI%b4dqN$3mgdfU(jRfHe8$u7 zS0@(5Ts>Pgy*}hbv@h$)(0r|9g(_j`zgT@Pn;m*F`(DC@-v>BWbN`AhN?v^Yy2kE5 z2UnO}y0K#_tMcr_3=>}8@xPdVL5{<D+m*$qStPzpK2mPc?rGu8VPwR4L(*YN-$%tv zD*+BRAx6Wy|7r}w1d6wwkuX1F7~Hx1?2QI->x&m`waR|fJiQ-S|N82u{Qtgte{I`d z`D1R_@~QR5UmxXDY@8m)I=}U(wx<Hag*_8=*6TKY4CRbrzhRLUr`NditjY$pdYO-v zJj%>$XJhs<D9JD~%u#naP|I+@Q7!n;+@nr9Z=4?g{8;D^!LVUv`h{r4b8l^0;u5>E zwyPCgKfYq`akY%Z!orKs_9xXxm&r#gouIq(QRi!hA06j~PE4C1oEWJjXv(t6XyvYt z7L#pfNuQRVc(uN8HQVnwDGQ>f#>*J<D0syG^8Uj%w_PFS!M&5qqgvN<y7bwfk&t6P z!eJG|+mvi{z0qiP<D#Uj(yf6mX3?#NB3u=!!e@`DEbV*Gdi!lex>a|mvc|F2df6>! zAIxoj9KCzD^yJ@c-{P$&q|cMrNL#tlPUOvpcIUKpEAK6mW{;k={jA+LYh&imo8@(m z-oM~z-6mI?aXi4|@~imb>x-Rhn+n?*J_ILSyVK39aMB`hX4T#%2BXG3EQd0uPUz5W z5Y{=u%BJujcXh^VgLMogO>GKIFU?DQLsRNI9R-?KeGvb#>{+9aMc9eL?}xT2w@%iV z4q7{Xn*Bc`7ys)M+NVved-|yT*zx*b!c+EiJWgVhW%!}`i(|=yS(CiOJ&%a>v~0}X zHeKLATvL|E<~%M(2L`8zDDGPZuLSlcm8CyQYR%bvtkZk>&r?q}O<lU`p9t$u(d72! z-*~>}nAb1;wc<|g_VW6FDwW5+_Fbts_w`-*^nBUZS~<Bd4zJI#-m>;d|54lT)yYfQ zYwpcWuG&<(=6b99a`)YvTYrQ(JPdyj{*#OMu>RCPfhw8YO1aXfj2yz|rgX1mZ}`CD zF{y?p<)-mUrG_G&9fsj^UYa%X2%WriN$VHek~3E)E|OU}rTzxbIt_!@3mTPJc8R!2 zyznn%eg1U^uWw_b%(Wj{;+qdS`YqqdJ#+I<mAux9)iKwC|IAZ<QgrhbUqm{4muubM z{++ou&&`wjGIOTGn$6plZ(qA3&=+tfSVDRIk+$hROV7T^o&Igthl4w3r<a6g1|0kK zoln$_*JtSjkI#Ae=S!}!*YA#w?wI7(-lqIBph6>DoPXm!&8yX4=1DGIyVg;TK_P?X z!23&&A2e#r(c4+m(IBknBC~#15f|6f#iv5H=6ClA<Z=l%g>2dr$CQ61du<*Ae<e%y z1+o7u{Dv(&tiI7p-u&RLtvI|fS^f0W>h~K3zPhXS-bk$KIdy#5z3=;0zW-BS^;6`Y zqPBbeqF*VTi~>p1|8ea<@>1_We(VXQ2{*3tDw&BE^|EYdVD?O#w84Mdo*(9ur$0%( zVZ<T2aSP-2-}jG|E?NFqD`PfyV0v|NvWA4gUpwDMCb3mcA!nB7ZWOFCoM@0dCx4;L z^ks|I+RJ`ixgx+W>Phl`^MFOMtG4S2@YkPu`?g|9kB5=!??bP)HOFl=-Mf74>sfaN zc_ep<%zSs>{!@bN%YS9Piu-DQ-C$BWZ1v^Ldyk02Kj-@1+bhWVxNiTPH_WTvUF>&Y z^ZKw|Jcm2t?kvuYksg!sHyUejg%xX;PF6Vm#=<}>@~WF5duW0pqh4;)jGx;D7n>#V zyXWkasSjjR+kBZRzJgJ5!_nYftSXYKKbM(S^qky$)%;Y>u|C13B=7R_Z6>Wgv8_DI zT5la&qZ)SLTBnzu(zcSbO`%EcPH{Y&cI-_swGQijzG3(Nh8vS_8@^8L$ojwI(bsBg z;hRZ0Yw|62t5%okrR_Ya`m^Volefmw%9wZOG8%T5$aB_jQ+4)sXIha~s<O8J)16Nd z?$PeQYESdqiGQE+zoTDPF5-pvuFjsEq9lK%?Ci_)KTfTZX)=9(GHoA!!~I1Y&UM6< z9I3jyp;JjTtaMICPJMe{=k^OFSF5?2GDH7<kBA7JA@uC_&PC6=ve@^X{}JF5J88?A z-znmAmoHp=dEWXd|LaRv+)nNN{^#!Hu6BV2NA>B;))(~7Z;`vfC?B2qZGuZ*VxG{% zIX;s<=*rx8nP&b&jhEp7$BjwNd*oD$O+{{pXYQ5h(l{Shn6jmOd3lDy_3KwBW^F!H zxNn_Oe$eGRS?e}&%l6ORtf1SXIB9K0jUxNi_-zISbE5fp=W}NTedy?_zbQEPoqfrN zx=ZexRFqTO@9nTLnQ)%h_WGo=qWmup>gpQ)dHJKXn(ei2d5V%I>+$Up4_mF@MQ}(* zA8YoIxVL@retmn38Sj55oc?j4RLoS>-FrjY`m%$56`N8_6enBS70a+C{+Bpe^K4Sc z>DIhM@t$m%CmrMZC+(E#I()x3z@>iH+D8Gc`>U$M-J^~?{yKek>&>K#X|r`BTTLCU z<Tq%|HcWYaFsA-$V$GWEJN9n23$QXT$|&F8*O(9=e&FuTyUjw9hueM2-^=yBnx#Cy z-|Q>zs*WO~SL;`QK4!G4J8otM-<A0luXYyiHZnSzlzXPMpgrXI#4m53>`GR-VzR^f zZvBnKx2Ik%|9Yii;euDQ&uv$8V_fm*{p0kvHD7r{7i%gmlKuWm+ivEbSuO8wio8i# zc$h)Pts(tdU$GmjN@sJ3XK0Fbl)xbkri`#&i3$JL*UWS0Q(3fJ%hvA44^~mtqDRZs z5+)rvck1=N*jeELllDy7{GnH-^KM=0oO!Ds&6rfsTc2yt@Wy8;n@G3Zrst0yzw%pu z&aE_Uvz|h9iPNT6Pv#u(d9v)`)GyK%(h>=dd#*4sT+L7F=?j?~mGpZ}fKfubjE$UV zlj`xH#JZbjew6B%K3F>a=boqf)Azsme);bTqi4H+XsthSH7jp=+oxhX$<$?DdA_3e zBUui7zbw9x_twKJ^<DBDCj-}>RoEuJDSA%EDWQu~O!UKdmW8q$oH|K;s@K-#w+_eh zY93Xyn0hXpckkNlYgso#>w`AD31D8fJ@@pEGI@y^r4Q>&7ClaxaC5r1nR*nTUJ$2x z0GHW9JKJsB%Rg-q%J$>mGGB9I-^7UULr+)j{xL__lzDoc+v%FJ+lg%TX<omDRv67; zXiW)9d3b7tRPb~M<{%THuEY0UOba+u;Isb8a{;w)eLVbpU!GeVeH7D9$=D#fUHVSb zslKK)IfdRge6Mbt(`T!@B&UA)G&|volV(^&^YX3EGMRfQ-2Tr}hc|b<|IKuoTR*|` z-OaUG8f$vy_T*SDZ3&*{qqEWWhE09twPyY~1y_5Y)EeI_IP9`pvDLX*?)|hXZG#t` zyXrolJ<NQ1{e|0qN{#1BaJ-KzQmm4nqbs(KbJ6U8N$gWEFn@MCz4m>fBKL`X1q;Ma zKRK)OeVfYVZ|j4OHZNn(VEuD}OMj<;OXk%_ZH`P%onpDN+Qvn1@`{QVY}ohuSncY^ zhw8-`O|CV||4G~7AGqe6%=H;N6AnCD=V_&OY0|+EtC+9LH#g1f)lahff8g|r{q^ZT z&lk@A^IPqedrI>~dGAkQyBePMPqX*>!n5&nUe`39ogakD7kgyy-20qy#)a%HC!UA$ zzuh1jSAVcqXf<ce(Ve1N^=muBHkch<o!q%IuJ1u~d%eOJIfrfAmup|Ubmsu)%5F~I zgUKBo$(mPYDXabC?y_=QcfW8?)5;L_o8PZCwzl6(xjU(M*Cg}PFQuhYjcx2DI`@B4 zef6*Nqcd-??z_3ZFDtffFFt=UIqdxkw~q{K7l_RBSpMqOH<g%|%8K<$_jVpu6}jEp zvA<u7Ki%nOSp3iF^}c^yr}Wm`3Ap{3(c#9a@0V3-Id3V3dbKpE{CS#{HsND#b4L2Q z#U@*q?_DfZvOLFdeX66D-rrj)p4aZFC%$@lXZH8i?%VUamzHl&XFs;BVnW3A4-fnG z`|g?)Yjdx>e3^I4){Tr`|NhRmwXu=qcAfP#VMA>97Mq%9`@Y{ZczkF@{XqtfXACbm zqZoxB6<k|6f8BWw&#kI=MP6C-ZdEN|Fx|PfyQMjy$zIL+ba;1s$i^(2eJf{G30f_G zcJEi%`Lq1LJ8Im^=6~7q*6w=a-{1VJ{(kOVX?s{R%8|>iGW<l>ulUN6EABO#FCKjl zxOZ!J_QM~qqnH^u+!<Fi&tv1adBIVy!#MebU-+S#);iBg&qb%Cu77jpT~>tJ@m(?p zxAQGDivG}`o;J%cICRlmOTisW4;%iQtlifCXnpN3%{!t0?wsPXwQasX_gA*fs|&B6 zevv9DZoT*7>68<z)hsGgSrY5@+keW;&}e38U~F69A2Ca+_E})fx0C9IvH$idyzO6p z>VAF0Dw*>|yC*cxUHZ^!imH=?sN@FD0wbeMIz|U3nXX(g;e%I0+l5;)oI6Xb|D8{8 za|z15nWPwaVy1NI{-ax`FaDc*w}1bI-JjRpFPR(l?w#fD4+Z!C%}wUs{p*j$N#Sn0 z(s%2GAD><PuYLKc|61jhQFgyKS^M>FKfY*MiO|d~%)RyH_cwi6X0`a#RcTk%#cH=X zgq&aU+zec$6uj0vp?Jl~g|8Xy*dMIf#vQZlM@ZQ0&y)Xq&zLj!dBORe#ZRASEd5jK z6F*1bw4Q|(H$(h`5JQR8Pup!LhultoeauHa{Y`P+^XuxpN6XL6TRgRUkx-(0*!pMr z+aElebecu!gTkcX8K3L(AH7xAm+rUH+h_YO+Wg$pb_Py=P7aRxcTUx_E+>|5E42EP zWFH<Bx#(2haoZb3yhia4E*$vrk72TkXYPC(p$b;fQ}u!WgiWtadD-_;@O0OLS<<Xq zOfMat^UrFA_RFvvs-9apu62Jq<k2(dPJPkg6(`-bneEaYHh6DX&-dz8Q~k0v5lxAS z+{N3L_OPsVsp4LGxl3wZwA-AWUqjbg`)+=hzt=og{^q?iJu}Oq9!7t=;=FOAgF<j! z_>;dIg`-vOKkTz#u}<}0OYrJLg3ARGjfEzPNnBfThhv3+*0Gw`$5t6`<I0-fvGMIz z-J-pQ)$e|(SN#;)FZ_{#;ZPyNv!$XL_3iC?5+`!_T3vUEZ(KEN@8nHSHmub8?X!Y) z*HO1fZr?aYt&AA{4{Mp8t)8_+_SWJw@6gFl)}(D>ns!zGj^oiqH&}I^q^_FfA-p{y zQB{O%_VId0x9KbQUhZw&p0$koX}jNo?YeeX1?J`c>FAyiwr5SI_llag3-<Bf7r1rl z$ex<l^<NUVt5^U1v;LiK-{a4>d3f5_&9#g8R~8x<cgRw(L0Nm5*MHwbLJbX)g)K+B zK6rNe&OP_JbIIAA=Ch;zN4NX$xq0Vf&RiGm&Ii3u^X;6v#npv=6zxghUHH+qY|nw! zPyH`lUnp4hFxJd>YnFF~^H$ZJnj5wWW;<jvZ#ciM+t8uDZFyMXi&tAE1S`tR)skWj zt@}66@?W#_>7(P{ZW!+O)4%QZtG}$z%~^T-l6IB<v-3Z(JO8^}Ep%~>d4<6JvQG}1 z^E}+o&$C+NdgxZ8>#u@YJufe<tWLhT+b&V)=QovI&+^~N-zawf>A${K>A;1G|6jM; zNh%o4UsI)Ao#VfY^<DkWfc?kr_cXD12(9zvJh}C4X)4RcBhwGp@bwrUVozvwUiM+N zwM%@%<9QZmJZ2nPZjx>H^iFdA2bsN*-|m@Y>YS-_v9++R4cM#LQd;<Mdd0h0JQ3FZ zFGBuBKUA3ZU&?U90+*_&-P%GQwW5`7CGfN9Ur{{imm<fkcGAc?{Nx_b`bo;{n|zKp zYHZro{g^2*>632wQJ;U-28*AZxb|$uH8vl`jJ2-~Qx&FUR(|DtSiNPfJL7~IbD5PU zrLWeX;;9nd`t^>f(T)2PGuQODSiU~|S~c)b%T7DbC6~7OSP7kUe(coeopd(Z=Sa4! z_#yXoCzt1|+(=3&3)pRb@oC@EJj=NHiI?}!*}reAsOVAkw>#dgc=XabC_ch2p+(uq zbB9|}zFk20dd0r8619sb89w)TcU1hv)EifIwU^m^esI=**Txw$cYc2M{TJs(t;5%E z1_ram1sYA#@Rn1#X?Wmk=(4#hpWd5dTKF*3phdpG^1^e5R-NCB6$`F#d<~F)^>E>& ztx{U`p|_r}<m;NAyDBmLh3Udc6JE97Um$M$_cnj;j@WlGFH-FKi#O;0jGyPs&M((5 z$0xv=$r{LiRsQAOs#Sg2pOiblD?So_uTwuaPvK8=h|}&VQ;ZlnV(&2j)U0LRcKEp0 zIyIFy4opQ70%dbLKP(aEbCu!GF;2L$lJiQ#HMWH90ricd?JuS@2ZuIhSZjM9C`{aT zZAPN^e8UJIRp~{Qo+2N*ovOmL&u{y;x+D6mb?FnI50@Wiy6Wv_iuN}(-RWDuYW@A& zGo-f_?d~}-_wwf7PHILgbITR?pLTum?sLArYxnNBeRm}0&JNtXd^=m}(Y?0Da|}xQ z&&QVML}wp9@o!6Geforr*N*9Csy>)nt$X%)xp~a)+JBBG@2WE^s4%{``bFf0L40DS zLsCe0cve)Q@{(12a~+RwT^(sFYhs)hy*I(ph4oIuYEP@b2biDBEx2rKT=B8Cgst`Z zVcpv@YaI@KT<v>kRr%&b$Lq{<j+QX&D{Yu0E+DZfxTP<9=OszcnM(B*Vl&ru2#bBc zy|;VehKSy-gPX2rf0J1>@y(5$UnfL6*)$4O@$;8`_q~7r&1Hf8e=g7e8>6qf`#Ad< z-TOap`cHO#Zz}mNf`^@t&%FFq)A~4usw3ZQzQ+V?c;>M~(A?;nWN}2+{cAHS74HZp zG<E-sImcD7Xr}^e<vZ;)6AIdbp47j6zrOlb_X|(EOE)e%Pfsaho~(Z{J)?SO_N0?{ zw?95R*+twxyKUjc-`ZO?@)z8ydiccnt>D~^QK9VtX-(5gYtOxIcNKWt^J9+SzGrI9 zx_5Isr!8yX+`A?`(8=uNp-%4TzpY$X4=sEwzUYv~uX&Q*OIpR3X!-aWd`c@8$qe#S zuFtyo^u)|%yGvF6#vRq(xbx}K7`;zLz4z~5u1L$Askgvxr;KL(7KO!&@^`ZPzp)Ru zvwd46d!)auIyTSg5$DR!7LD<<9yLD=zW#ve-1^ArVHUr9l<Pm%Pwu|Xwf17cv9gaY zYm}N89=?p6I%n}D?#^?YO6INheShM_xrx7Lm2Y`eTmL)#;*TS1Pvo8Ef9%YExBBhP zf4ber`(^F_HGWyhx9erxr$2LUu&X`$FmtN;Ue4w2_gNYg7%$w;-6>VCmU8ONewE15 zu+_SeuCv1?Dt`4^b;^8IK-8seZ)@cz6n+u>YxTwS$S$Sz`=33W#yPpT?vHxhuGiXe zTQ1dFC*RllFY2~$Z~fC}RgSTO4OMR|K3<!2a6%(Lr);XM;HF0__+4hLpSVl%isCM| z4{MpSdbTTM+}pP*Rid>xa$TBhw5LIUfR~wJTm7z2KGO{i?*GY%jIDHA8}46nq4amr zQ+w_Il8SN~2_lPIG+x+OdO9}$6AL*p<(An>W)BT6#;G$-nY>-U)rG&F>3{jB$?koB zxPO0MDL#LeP<~fT(1X)k%{$o}KZYybS}(N8W5+vRC*7G!^96rCQSZONzC3Qt>?Gp` z17Ev82G27EHi_TqSY7)$&vElxk;;b6E6cRE+-)^Gy+$|JrB{8&^TSK^53c^5f6H>` z<|7k4byo&;U%ERtD|t)JhX*{)b3E!bTbY!EjT^lCANuS4eQ^I>ICt@}$NqV<AAMHy zi2Y@`Pj)|J>;}<!`yM!M*&DQa*8b3xWoyK^UTeLKR1bZ)W6AX7!W|B!MROMAl(_m7 z%ciZo`cYE$Nw3DXw|TF#vi&<s3Y@QIi`Xx6+oZQO<P2wa+*+*_Nfr{TW=wEWR4n_s zv3{a$VXDQ|H4mGzk5BBlHqX^R@qMi06zkb)-ae{MNwzmDHr-d<-S+vU+n)-VyS5+a z{5xWODT{sQw`YHXs%vBV%ua1wS2jtoa+-tI{~e0gqTXk6O^oK}lJoyG>yP{;E|-O} z(cXFvlDA%aPFg9o-JBu0tmsZ+w+g43wPRe%;w?G#E{dPRJ{)k|{O_&#(f_siUU_|K zc@D2vF8aByEi8+PA(E-mGa-&`{&ss++qovnve{Y(vkzYkvC4gaBVmb9V_0+0*FRr2 zW~|7*@K$@P`=aD#6~(y`35`ChSBkI|?aj+y=X-p6TJH(l-)urRIoDt7<S}&B?w_9i z>h(p_zn_}fw$^7da1`$2zIVF(px6wJozl`KZZ~3bHwka%VNS|zGM%r=vGt!w`jp+e zGyATF9Y4j$?f2oA!7aPkgYT~&GrRuA!s5#Pho6kZ&gZYZzWs?+(8FUN=f*jyD9wF4 zFDu~NQ}zqJ{QWy#ABp5z<k4WmzFqX&@2^wD_}ZOXgpOX=oO}HvTm4%Ffg?Zm%-j66 z+Pr4{6Xq!q<+3Ly^=NG7bWd9~Gq0L$cHXCHy&BWse|YjN<C$8Q!vb)?6lpm#eKx9a zO=>$dm-DiSQ1h}2hqEIi&uZr{bXlvu{L;kWBf;G2J+i+K|B8s7{77q?smZ(hODmW+ z3S6F0`I*_<%V5D$X^|Rsv-<csFM_HyENo3uOTWl-RNVSrxmPabSmVU-D35hZ^j_7^ zIsE=`zLWHqPkqu3ZV{rh(pXa!jvY32zxP^gu8d1aM1z~dZr#k4Z4u0$e^^ZQ`ns&j zsWl+oEoJ)cAM-w3`t_Jg^r?8?+HW$UOri_#9{Q2y+Hv;WNw(5QQv4IsGhRQbUwAKX z<sa#F*ECPoR-|0Gefw;QR7TO=U9*j6tMn{>eysLiz=isfjD+78b}k6HUvi-Nu7COS z3tLT7j>{j~B(qrGk=rK9h(qv(RR6-0_tdqRLiqA8>}hiO=ec4le~jqKb@3)2q9x~Y zwKYdJhDAMl^<&wpZD&qiXgV9U)wg>!>&9F4NqY|;I-%ZDx$YFR*4x;15tFY)E}!gk zeSYkXt=w0cosDWwmIf3>>)qsd+J5|W|D(5$_g1F94wPk-h`+1zkMp0@lmsTfL&d6_ zZ@x}rNet0c6%39neI&bpX>!Omm1RuF1y-L5w`be+Zma*Uo4FldHyv(WZI`&Ne$f<1 zmcHdox|a3*xqVu*ZY)#lmziZ_S!#6g;ygdu-YvVQ96Oh!6|ZA;obysyvE#W-k20ep zu55Ygvbn4!+x6O(?UvSB`T?y!QzETB{MP4|SxazgdX*HOPhkJF=Cqz`sHAs^mz>y? z%769Y;ZbT!E8jod<*Y0CX@AcDGk@#2E+0MjEyUe@)!nIc>%Y$4+ql>D?3NQ5`QD~) z{a?8Kp7!x_;iP~^PZo7)1ePcMnR3*_e6rR4uVu$4O`9csZ{qboCslr*eth%LMW>&w zF2yJ0Lpqm49MNs}<yYuoe!#truVzIGgV2m@FD1bVD!1>iTU8#m`fv<mmescNZNJPK zyZUN3RKH?rGCni)nsJ&+y=2!(uPYy;-dry8dl-IW2Y;@0O|i!zVW<6SPP$z4A`Y}~ zk4>)qa`=7adK;0fo2&Ny60Om4*uc$T=jeZ{)_wi`8|5jN-^`zq?f7u&0kz_^;B331 zhVXo^U0&fr*N^W$H#c&@rJcp%`#a|A_A|x)n(A%&W07yZtxbWWQ>V=S9gg+)9K<~) z-F+Up-z$2{HQz0Q3$MJ`QgN*y>w#C4PFCgJ*%wxXtPa(@7d&nKit{^*xw$*K(sx*2 zmi{iBeD>s;%=3?{xTgGn$-k-5=iZkL>r@p@DRu{egNMuC{&;tAQeLZxnxK_n+yTzM zKhle@^a@-y>@z#EoiRvy$<M16+rn;a3ajUiR{LHlYJKtfm8~MCHm19`{6E&rF7i!q znJ(||M~RnW@8(5m`p>hisqmX#r?j)*eUt8)$L~t*c{qd_K0N&YjO*!<rr?D#><iu( z^xk4TA68WUuFQ?cB6N}K#)U<z!}6c6p1q}LmcMInXYH~pUEz1b8?OC`<X`ow+)pTL z3*X|9dUdyyH6~4~w9ax*I2_BZIN5LORuk9POm*A6r!Hi+F1dZhWzC~B>59jBeBYDv z?*|0jwc4H-e0^P7`^W1-xlx&a#n#6@oZj9hD|>9`HHLI8E1f-V?W{SXDi5pvUfnGC zXieyaYrdP4M4qo+9D288!=l+PQnkf@zx;coQK?#191&G-&iSWxQP(*UnL`U-$<~VR zPrP2T&9bU3!#H1qgJY_2$<~WMr-np74d7}CySqC}K5{AdxxzOecJt54x}a9&o;SaI zy9WE--DO|4rfxG`s{3DtukKsvle4`#=k0SAeBWKor*33?TGnyr)xI-j59AB?xhZtM z^D=nGG-big&Xi6ym--K(vPoMNvz4z|vFKU(g{VJ@Ni(kB`aL3J2gBOlSAQm($;B|9 z{k8r6mCx@hgI8v5Ro>1fbZ&ZswOy%EW*gfz*Th71H_sbPu@84itz$`g{#~#2YfY!@ zt(7d_`Lgar{5|;YUyN72tjW`PLi<#Y|5-o#8sGi*hxwkKf7y89dYO!Web)ZT?$;AH zBu|$8A@jUeVp74XCzk`8Qd&|@cAx3<tqM!;J9p-7!$PyAZq-hkO&c6y<_3B`-?u^1 zuj8eN?8=Q?QzINj{Ys*BwS)~L-yE5-+EenC!5fZ+2ha3B<cqJiin@Nybe?=pa9zox zt5&-v-Fk3z_kXXKDP8}kzRx_pqxpAzm7CZmsSp$OcMpv}9n8+TTC%Wc-ZIBOX)iL2 zg$2UHH!nM($9$zEV#lT(OkAc3x_@jQ>!i3AubnZmA(GdjIO$)_u5Yhulb$PHm9WSW z(33fM{f&)Auh^IBcgOVmnQvKtmASu?*+8}G7-w|glw7_0n;Ehn$1gt;B>nW%e*62= zGV0g(-&{IXcFN}RjH{U?+cvCCa9VZwd+_SjA+i_ULPSlDedGBZv3I$-{44HCx9z8A zy??OdRQl%J@@tDtBy0DE8Ll|{ZoU-1ioxWtTfw`oJuxnsF8H#`jIVFyjYI7-uf)7B zGyj?5Ty9=yZNJMrZ+%$9`3m{m)-;QvgWuMxhuxmtS$|h;ac-{m#Lh(r3f=v$-cI0q zAi?!;rc{8>U8A4slf-APH1jTbAG$Tn(M8EpaB7IQ<X;PsoV!*}zU{g^YfJvK583hE zOCmQdFD~S-Je>76<H^_WJ@!8y{D>{zy{jbY5L-c2{DJdMB5~nHDlP^S6+@eUFeo<Y zD!<tg%)LVDyjDwnKj(%L85PZ4Qax7}JhRGRJ@Cw&sYU#>dFZ7rx~%gjhWefo;mU6Q z@KJchmLtohQ`QMzxi~wDS(EkR-z&lXt#_N>o$<aODd+2bx2hmwb;^&ApKIdO&cqm8 z3yHJIm>ib9<YlD2#<qr9|AO1U*rbHdoawmh;QZ1?e@_Qr-@gWpg!&Etzbf9j<lK1K zN-jV0hrxAwmnr(w+mkbV1gDmVzgSpaTy^VVfM<T@G}X?lS$r)j`}QAuG>>=jq4ae; z20PYT9jLrEGh@Z)+cv_gQ#YJ&d6HA8|Lkq{QTNU*1vj+Py@g(G`7U9-W}(efTcI1P zg|hZ7JP=cSdtFSQ>{P+qR(IAcuTK}RyQcB~ZQxyr-B)b?^f$9PmlwU)=hwaeJ=tVK z;T;9bufL98*85|~!1Vut`Hwxb67Cz9=5_u(Zn^iJ!B?-?EoZM89W7ZG)V;xF;?9{Z z?=_3clBE9X$LvVEy{+xq!hLq%JYHY?Fip*5o#aO~)4iI8d;T1nUsGOWbkDBy)bUH# z>)n1oelm~yo8&s5`*-BKN_R}z{&W$0*_sS3!veDvoqcC+@p65gV`Zo&u`eyBZmII* zmrq%&S}j%wXdYh4wQ}p3B)iZRFVqzeztq)v`}XD6I|~++g}r`v?%BG@Qj<zgu2|TS zaq#Y>4;ps!FFh*zUiM|@kG!7PCQ0Y{uBI*PYf^tMufMg9O?aZ>qq-?~e6maA7aTig zJuN?9L`sa|{*mX8n`dip75lzytJwdxDDU&43)DiDeEFOb()HGF`Eek7+uE?GA5*lK zm%lBJx_+-D_r%{z)2GGPAJ=|&;I`VYdmnC9*}pq&TPUZUzHEQX`{TA36n0H-&2HY@ z;ujZ}At5QbX{Liky&%W&*2=XZr?eGCu5*@!gkF5}@Q9+>h0ysu?5b0x*~8xCWUP*> zSKhx|Q7du#?WZve0&|w${o!G{PIhgWajKf3pwg|UDI$iN3uEsq+-~1`u;KSQnTcFi ztIIx~QF<HqL|(zd!S2m6QI3z6d>#2a_w=4p{;|98g8CD!33>gui&X2=_8NvJb?!G6 zIVESbZJVjtw(5?ax4APFo9*_j{m!;)w_+xX(5%~w%~U7#t~&lUGygnC-~N9=oY8uJ zEq^FPe6m*G#cVOPOE5e+%r!?;{wVjHtMmPq1#L=MwN_Sklgyrf3Oi%w9%MdIU)m_V z|6%&|<N5zgKSuW(Z?mgA{B!lu{Q5Ep{)o=UKW`s4C~<UiNDuz?c7iBFR`n!)#(Ue+ zGX6Pf$q0w)Z4GKOyw3KpHEEG*=ykPVU54`cS)8-ER;^gqb}#7F|D#;DP5w##zjs`L z<6@A@X5Y}Ge;6*7F5EWZ@2?QU*~0e^$e#1K5%zRt=I^t2?|ON6?%%1huSd>NM`X&C zdX`VUNA`0H9Mfo?zi9XWx4-7zIG0=@o4RZ{Yv_JAyBhoFZR|#(W;+si#gD}Ha?bah z>9k;j#=l9uzB1F*r<BiG;Bd-(TGr()67ww*cigsV2(7eov3s-W{{8UO&41mT+RvU_ z`<GW$ym4JqyN!>D$dclz+mt8vSvaYeRV2;2HchJj^HQcSl2#HgigtczxGB5MnE8iN z-JN@rnYA6=8qRI1YUN;@o7ADP?f))D`A@PlbGUyU?c+(&KC8I;c=r$AC)VxVIjbh* zy?>MC|JC1cmfo^b%le25r7G&LGj~s(?)8B+`n5>bq7YxNg$DZ5*B<|6t2E`z8_S6r zLR0?A{ru4S-?RShC-(n_Z;LvjcC^&A1RIB0GD|US3H_02y=PPSCA*#Fsj=r5ubj1u z|6lqQ+tQp>@7J&NTF<8TCSv{je#>8Ve>);R202`3ED1KZWy@IbHB^e@cTuF^hG%oS zv)QV)Z3v87@ki;tdthyQ*8lvi)xR?X94e(4t5>%xo{6maF6`e??<^pGpO;0JLFdrR z%Zg05S{vLQU%lmFd%HM%ZEKy+(l==m+SC0nU%y{|`1iejap#Wh6MLTg7QHV2$MJLZ z2MfI^=ck`nR=SjTR9}+$DJ%C)J{v9`Hod>1f7xo8r51>PO0b#y*4w;Q<=B4Zc<a~i zWu_Kp+3(n>8O{=Z;_9ITm-XwfpZWNZIsLB7zPV>7ZnP{9-u(OA_g@0}AFh8b;q$*^ zwcgb_xSH=f@6`Q`>4op!-Y-nn`Ftd3iFwKGhb@*56uJI9`pfoiVaB72leh1?ty2H_ zvG?`&_F?}HJxV&-z3}cFdBJn0k{eHT3zSC$AF3BUbn1$W&Hoo`)AM(3y`jJGYlmMw zuk7{U^67^;oSg49&$oLp>6O@gjrurc2DKkP+b;xfyIWpp_hOcgB8T0F%*3zp{JGlR zKW=tUx8N);E`Dl1XRhx5S9fIA%==a$b;Wdbq-BTWG>f*6Uyjz6e0yZgxG=)@Yf7Qd z)ng(X9j$WB_eP4AF6D?{x#ExA?#F&nzi#ip>RWFtzqjn+g5T}-CIvGtD);-HU!W}_ zmsj^v`<=;0kFRT!WR3r<730{KqPv@2G1_zS)lC^?3Oac|mag#m`(dl+k{`^UPH6sQ zNu9O!ftj<_a+b8{zr1f)mP%Q@l)mruzsoAxXv?#_wI4-0_y4<f{omHtiYMhWFZVq0 zSRmT4_S`B#tNMh7&+F5@-8b`F{tx(JFSuIEmGk3YPCX~3m$7HsK8tSBdRT67^l1Io ztCH+uk&9m5n^#cr;c|{(=-V@o`{#dDWR-gEqx5;l&4PA4@7RN!@~K8&x(<1Z*cLA< zUif(FS^by#3bWQ%d=pjs`?uZZ<Kn34WhR>1J0>Uotek#rn}7F|dMo1%r?!gTIJWbe z(vp>D{gS%ppNdZu=IrsZ4L-3yVdh@Opr+Q9E{hUgD?VrE*H1gM<$kN~KY{Fmr;=J% z9w|<pWw%(jsz2`iv+481f+jrWUUTuO+mx@r+TL*gSf6_H%h9&m%jG)@#W}ayeZM<z z{jm>i(kJTwXP%$C&aStA)yylO>d!56T6I}p<2}=Y{tsX8X<nPX;d)@#wr$(OqkdR4 z)x0YVuiUk;eM<8Yp6*I@U88GX<`w7L*>wf&S$+D$r0!jZ+2f{6stfNwU3>b^Luu2J z&))SxRUaL8%(jVJoITxp*^7PI{%_}fUvc;I@8yd*B|okxPqB+E-?n;jaav~G_D65u z)W5Kbo<2wZqnzs$;fpV;-K3mWdb#|#{zF*i$9CJkrn`n;t_KHSU4CQ!-|G2E^<lMH zjQhFgFBUCu{>P-SR;rx8UGS3U@z}z5vg^<Cu+L25e0OVYrQ*Shth&p-cP@Uo&sB;; zp6_=3t}p+c>v#7(2>ucK$G3W0phVn9hO26CrVFG-hy<tfv2U$A@oiCwvCN}j@oQyw zuXJbU+buo1RZD)~n&VqeM-&~~`NRIf`-`9W%MKQOeb01y>VED!;k|FCY0Lj8f2`PX ze$#>CH?0Q*H~g1goBZY}c%MQ2=4%Ebj9NMhIwm?!U=c<JhWYUqLgV>uzA|t#zX0v5 zxUp#_JB*$zU?f$)HBrL${qMiqavyW=KYMfA+tkNxmeS_M-=>KzH(0(@F)wl3`Qq5Q z=aOaKJg{Y0A;4h$#9kvbyCUV!;qXnGYs^2m-F0Zva##4+`qBQF<TJ_S`;kRT$wB`o zbtv7lDCn<v^KifDw5pd|&(1g^o_jR>k=(=;x<3}G3#?BTSiN5`>{oqlM{2E1_Wf6R z&*T)&X*g|qx7hY@U3atg2{oVC_Vit%g>UvIY<bjVQ0SBXu)C@!<WXCcvjn4QxA-rM zrV##l6XYkqU-^B9_V&yC2bA_)xp}zGv_Iii<1twlk2@3jH+?-4B+mVttKjG~>1X@c zVicTnt{#*r6|6m3xu*BQJgJ%LHk+S{vDb7swzo0<iL9GZ_QP`9{{IhqUmS~fS#Q3G z_v^1iH^lkPBKec~3bK6n&#YMD<Is@vfP-~krYHl$<QQW~wkn4GWgHHZtBsB7_xwM< z=EMCa#jcmKhxJ+6+WuLjEqG_^bGyMyL_&hm)<kGML&dEae`lu#N0ER3D&KB4J>BDb z%+|<nqW*;3+s~|Se`EZYI_qVsoixLX$#)YN8WP!?KE8{7Am_mHWcAY~4;N**lP6sC zW?k$}^pQTO6r$4=TBvkx<(yS3`=nORyj8zqa@CT#CDY!i88c5<zjvdD%d7qOSU2kQ z9g&>+_to14d70XCm&{%{^XIhuAG6l~m~_6P?|5Z{wdI4G(br!_#jfDKGVxaU?yTtC zmAqTmU0Zi)ebBl|Yd+c4RZ8w`n8@3an4_j}uw@;CM2gOuoHsIaV(!@Nsrkdy<a9`B zQPLx!NkR3Oj5ZbVeB$Bi@;arpD(jWhtf*U7yQ+S%wYeQrTbA}rY+BegGoEc_-+1`? z{LbmE%X=p`FYcb*zPf*mjgAKu7bZRwoan&4h{M`Q>|l@MbZysXF3l%5eOmRZ%Zn-P zn0lJglBMZKQVmrY8C17sOIO@l6Z&-4Yd0R*_Gu4|b|~E6xp|t24qLs?8AdjyK#|sm z|L<An3*F0ZN(yLbaM;q7R3>2H;GHRGD4oH*R$)s=nPBM$z8^Aw4xHjTR?mFmSd(K} zTFjG#;~M5`cAo4!qq6<#{I@5Z^}c+YxO>(9KVO-%pB=dCY-VP6((mJPnK^$|&EF(z ztN*e%nfo<;|1k}5zL&b?q5p47)r)>rS<iCu^PTO#`JV+&+9YzQSt!}bM8!qvqR`{n zk*6KPy)$=lpV+_u@qy5%Sy%Mq&1PF#RzExQ=8V0-|Ievg*WR_^FPUPxVzP?*S-(qu zFPiqwo<1e5?{rVH)U=tMd`I8D>;5rAuQ)o$esgeKj{e)0_wRzEe@)3Y-~I6CstsQg z>Lc3@ZklIY>f>Z<6=3>(lm3h7b$g?yO__0|Wd93`e_K+mtnTKRr6oH5%b4F=QgH3Z zMe}c+{!TY#H+%Oj?&Y?;yWx4&+2E?560tW~<?BwmTvREqQ}>v@dBaB2$pWpXcYK+& zOKW*d@QIn19(EiPoo@XxL%rkW{`~E}w>xe|>)qU1U)ox$F=LCgck@5fn-{u239O1+ z{dDuK(1X(NyQXi8ethu7Yw<bBom|mZ3T7y~Gd$#wloGP`crs_f$`!iP3mDtNb2**5 zd<?kH9q4G4)H3VXSDLr@_p2J6J4-Xx?D{s5b5_&F17Q{2oe!+<D2KLAKk>@?aPI=k zFpY#(NsqHaj>+}9Hrcw1=YDs%Ut!9Br*8SatKu_zzc~b5e)0BS(Xo%`m#?u~e&dB< z!~vy_|BH{L&-lx8?!u4i+ZHQ+Yze>leHQ=JWS2!Hx5Qr_*>f(FSIl;AUQYq5_RT+U zr|~FR3V$sAATJZ-XzVC`m%aI0ms1j3*!<Y5Qy;9fnpAddmhBObM-uf@v+i5>+gTi0 z@IQAq@8WRl-&^z!Ch1=1%>UTnv~&B-h_yG4Z++Atr}VISj#q(qpZhZ76#^{MYvcC# z?QY%pr2n7F^Z3&XQa4oG$~oxlq{kq^aNuWM^!aUn?Qd^0(ii$3yD;~5&EzwaudvRV z$WZ2H`ZiTSQBhM>S6N$q{el%s*3>UrwQODD{J(q_FD4xBvv@V*v7g1uEt}6-zHjQ* z+xezz^}3z!+GgkNeA~Bd_q(0%8{6e7-*hgYSNX0rJg)lj-0yZjUQ9l}@5igz@9TcN zoPPh`kJt16M{UWvyv}*K-rZlyiDy>uc2C@rVjVQGuO~G7n(pnMHJvA1?YIJaf~G7M z3Vocp%xAW7{;`}Zi{yIWyz}~O#LFYYdtl4Njg~EC+gdL51>EYqYHMh2KG9S~d8^9A zv+9QCnyM2ul_qN{Og6PJwl$w<yJdlevATV~rGoNg%LNv~OU_<BdzRH}w^OD$!<R2k OUl<q}82|rg;0FMtGR&(0 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 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 Z3xYd2R<_Dl?&#WAsJ!2&N0Nbo0RXWC+fM)h literal 13708 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 XC!lEhb@I$;)B8V`oY}IDpP2yw=Ou9G 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 zcmZ2;fbqe0#(D-u1_lN`h6V;^h6Mj$eIqxn%mWMzUJ?up3<=4(i3JSZj5-VqUKI=s z3@*uKB?=7QT*(X!VGkG>81&K#(sOT!-2TA8;I)T=fqQy-VsQZj1A_nqL-Y*>1_qAw zoXWJj8|I}mFfhDfU~vDGk(!ty6*{eifx**(fq}s+BO|pwkwcjA4FiMc7X}6fm5khy ziiq{BE({EwAPZ}9@{<!e*(E(07(5vm7#JLK6DtZBYk3wkFnE9*ppciCn;OSoW5U1? zF2KORl2DLeTw-}@vpoYtG{_+t1x2X^d|i)DFffFLFfcH5F)%S0F)%QkU=n3uW?*OF z*vhu?-$QqH25=zAPY&{oQUNm=85lNoa5%>E+k9o<W_|&(`?mhduP}P@4bKUaOT3g> z<r$cmMJLbkvSVUcF!_#`yd@I@0|PSy1A_<yGuR*z1{MYbP*5;%Fo5I~7@`;!{Qu9u zz@Wh32x9$z{QvO(ItIqgK0fh0^_&bvAdM`X3=9m5z(z5$a56A5NH8pdiZe0rG3<h} znHfA7PC(f#3>u6AP&O-r6r%-{&4wh-%ap+w1Qq9FFk#-s;LMQEP{2^hP{feQkj{`X pnLk#3^PT7e%#-KFD=^AW-WP8tz+Re{X<*=Jz`)4B`2RlxKLE9udpH09 delta 1669 zcmaE`opH?p#(D-u1_lN`h6V;^h6Mj$eIqySh*t~@UNaaN7!s0m6AMc7>b5d4c>Q2t zV2nyGD^XzZ=1OK@h^Sy-V9-k|NYA|?a{B`VgHH$p1NZdw#Nq-51_l8Jh6EJ`1_qAw zoXRu>yPrE47#Q9#FnGjeq$Z|_MwiTDVDQ|+z`$UZk&#-T$RW)5o`J!ugn@xUB_p?_ zB08JZg@M8I4Fdy1M^1inVxY5a76XH44g&*&TW(@S0b>KtVg?3J9|i^ng}lVvRO@F8 z7cekHtYBbZ`&^J;TypV>QUe1+{2T@bhPHyD)B?V)M<*B<!a?SBF)%S0F)%QkU=n3u zW?*OF*vhu?-$VC$CI$uu21Xr*6sRaG3nK%QfwrNkv8b`Bv1keeFfb6S4iuye3@Kpq z*fujVFha~qNl5`)#K6Fy#BhOu1;k-sV$hoW$-_@ag;zyUMIYo22tIw^_+31|%~u9) z<`*D^H#W`WfYFmvJST85>VVzMz>qTelcy@H5(5*{gUK>pc1-X8Pmb}DuV-dpU;tqm za11jrgfK9JSuzYP3>FLw3|tHx3``763<?ZU3=7`>|NkEppbU--3*P_z|NsBv|A+tA z2`GVefUE^$Mm7ex03#?cKo~3oB^V)Af_U{H0xM==Wn<^y<l^Sx<>MC+6cQE@6%&_` zl#-T_#j2c4!C)fv$q}IjS;^)tUhzEjVvKz7PzZ!X7MSE=2!x6=F|aelLfOm=Dhw%5 zHVcCYLkE=2%D~Go2g+tc66a+!VOR+j=VOp!ybEOuFhI=*1*{<00%itA7ET5RhDD6u zL2=8%$-u}U!88-fW@6xD+6ZMcGk7rVhq751G?>|;Y*q#-W_>7|4N07rDTCP)D$d7X z!U{7-fI)((9%g|c$O7m5g36-I^o$Y(jbu#)BLf3VT_XcS0|l4V;>`3sh2Z4O)V$<W z9R<(4WIZl)#fByz#TE+Q8Hsrcj>(BBskxQji6N;G@xjSOnFS?5sp+LTiA8Stc_nW7 zMd_&uMtTMc^;QbVYILEBu!)7G78Pga=P4NI8R(gyTMl)p4pyfsXxNmOm+R#wmSkil zR_NsyrQ2yjonMdeEH?K;b!KNI<|RUW1ktU-Ri0Urp%9c>oLW?tnxX*ml!9MkZYqjz z^tiY}GBS%HvcdUjCFO}lsS26J3OSj{sd>ezDGH_ac`2zy3MCn-3c;Q}3jPJDc@Wh; z5EVKKFkc($8R|hygKAbtEKAJHNleN~RRFssQNhhIP$99ziYud}q`*pFzZe|q#d^h= zIUq;t`@8vI%5cD>Cf^BH+`Ksa9P{LYXhlY)$&;e(3>cXiSr}Q_OY<@f3>*zWw5yw& S3zT++(r)1F!ubC`13v&BoKiLb 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 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%0AuwIuW?#?&yTt8} z=kM{cS3Iw&`TnZ-ZuLbiD?B5%Nqz5`bN5V2==;B~9?jUH^li3F-sYq0{yK>7)Sprw zuQB8A>~gt9@~@9h-}{A^<MM_}=MKC4dHp6*E3w4nx$=>7%dUQEwNd@pu>9AQrXBZ# zUMCtpXXLwc|L@szri`1{7J{QP=O8O%ivt70hP~S>%9;7Lm$0-m<xD$Z!SPIH!-g$I zrN!SreEIb4<JZsPovKYCYT+88S-oM)<8{g}dwn+I<&oiKh`qt_fq{{M@&A7YegHb< Bzj^=w delta 11848 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 I|1<Cd0ML$tIsgCw 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 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 B`9S~x literal 12064 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 W*>ujG`}JG<j_Y~nZ?P~iFaQ9;@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 zcmey8GAFj4fsuiMfsdhqftew}KUm+$IdQTo1B0{)0|P@sa&BUQx}c{h1B3Jw1_nl! z<gyY41~Aarz`(%3lU9(PdsXE22L=Y284L{E)6)}+3m6y}1Q;0frZ6xtaHQu{ru9!| ziezA5c*DRTu_7ZiF-0P2+EE4uDG3G!2D6Ne)cQoW$xPQ67^DRl7#LJCa!V=-0yy&+ z7^DIi7#Q~D<R>TAuc+)|V36Fxz`&4{n^;l6aF(Z<fk6^vfkIwlZfZ<qwG0D;#vTR+ zmWYD<;*uF3FRx}`&=p}|V5}=BN-cPF!NZDyLBoK7fuWv(iNT10f#C#`C<8MCI|Ij7 zwvGQTGV^ONux%D&WHitgHZwL7GoE~xMU9!6muWI9>oSBKBTP=2{U5iZ9Yo%7vohNU zCRR%Zw#{0TB{*f-#EgxM%#0^na+<Sc<{0F8u}m)J^q#z*vqW5lfo-!e#1bQMQ4tX_ z88$W%QPIh(xTMmUQuz6~I2E<ct(@(gt<1F*Il0gU7#NrsCjS4(IE$&6L50DSfn%$M znlK|1$j!*cu_-I5o7ym`*|3<In3$TIA<Io(#ieCPz#0sDxhB8oI?QCFKbe<TZu2E> zOGXIW3PQ<kPUk&{Dg>7~z;6eVnIyP|iIsEmIze|P3Bk$V1(k&aC52i3+*-$Iw6IEt zSx7>VlXbF=kgTi$1KVakPymU8JfS8iU~Xn+Zf0z51dfvwAx$<GW@aWnmdO)^0(gxX z*fy&%fTGMuj&1ULAx&X(vjkQSHg;w<CRRp9CjN#v0ny2J5>h-|Tukqnm{^%On79}x zS4(Iyv2ktA6V7H7S75MWaAn}y?rdwUD#FNYpbd@T_aZLL%mOTvO+_0N6d1G_Od0GL zTp9Qsc$^%}%?$LlltdU=krYc$elMyC)*vO;si451$6(Fi%@7IF5aR1%XN*O|T`^m* z1{v{<g2oK73>;fMP1P7caS8Pdv$+}LWI+i9DN_@3b7NBz9DdX0;$pO76O!a&tz?rB z<8m-(WR~FP6K7^Lci<9}V6R|hNA<cY8`r-_Y|O%3c9twW(h}TkmR8KXBEo#kR+ens z64E>@mUdj+43m#Zq_cub1%t`+BrWUpn4+2HGHqeH%gn~?$2^t!5{m#!F3Td8ORSo# zlh|U}J30J0+Br^eig9LgR&(}p&gb07d64rhmn2sQHv{)H9z~uI1_p2`!^pre^{b{! zJipCX25#mTpn~MK{>pDK`tO;4i&!O?gFqz*0~1J;fq~)I<S40KObq6em84Z!^%<C$ z7Ebn&wqw#_o7^KUFAq}1%)r1P!oUo+L4<*Y;R6E$g9U>E0}F%1<V(_KleuK9CcDX4 zOm2{|+I&P-ou{6Yp$Md$g_D7SVG#oZl+DN>#;^#=W@6xD*a2lTGq^DvgR)r|)EIf7 zY*q#-Mk6Sj4N07rDUHzwD$d7X!n}#WnIWH{fT5D1h#`|9ogriMPo3+`lP?-5Fd9t$ UWRNg9!tf6lIDi=c|7YL_0MLRMu>b%7 delta 2284 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 b1@_XsOjkEI7bxutrQH}985sZnXW$0_d^GIR 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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 delta 5155 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 Cca-Y@ 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 zcmXT-cQayOWME)m5WT^`2cnG@FffQVLc~CPRLqvZ&?3db!#Q1Ckb`Su#4<5PGbR=0 zMj!4B1{MX@-gNe68J>FSCT(TGZOvOI2?kp3l>GDb<FSG#OHOKa8vWTdZR@|z8}-LN z{S45Xy|!Cv^ISfg`j%sMC;v8Y`}+Q^9=G?Dra*3q2#$^}-`VBg<`y!#C0$LelC+Q3 zx7u&~{O^eg3ewwl{*4RSzI4}i-f-1J362#q=N<+eNe=nS!T#ZY#_M!f&Uw$;*!LNC z)LvY(aMFUATNf=`aXD1I`MdoAi#LDv>&s009e!f<q3XGcrW0TLcmz$qd}d+2`X=R; zRh~lge7+Q{k60Ql_xaS9XLd!mL*4|0gmflfKK%cs&TV_;*Kezu_9?tt!2Qjqbd|~3 ziWE($-m~nR=IoiPI<0mI^CsqRZ5`IXIrd5)Tjcy=hku}R;IcjCu2UCjU!J1bUBk2b z{x@UJ((N73^Hi2Tzq+kpw!+yUkH+dhyM*h-9F7>>;gE5#5mskNc=CPWM`oVRhUfpp z8UHA>=I?Jd52$&+hMoIc`J^jLB1@Nvq;F)9PMf$Vc(VY*PT_+I92>Mhe7WxZQ`kXD zOjSTTs%hr4S??<!34Lr)iCmgBIjj5Cx>x(6mhpvTUlGij`)iNef}O%&LwN+9k6y6% z@#EUCMd->33x$PVW!<6kFMine!-(y{e*4XLg!}jAHh<mo|LLFfKmK11+WU*!$9}o; z@5;9+)`pfJkGvPQ_uZl1G(TiteyzxFjc0*dOaw1P3qNxV5_r6T!(r;3j#IG#Tjsq! zr)!i`&Ncsl-{<$v8+w^!+?~|bR~=ryWrd=jgR6}C%a`^7_w8EiYPx2WWnA79w6a6s z*5Bu>%<p%eo%7v6G+}!ne}|=sLc;7&W=7p3Gs6S^1+OnXVK=Y;eof!KJ=#+j{RsUM zF-bUW!TC9Ap|76hHI}6`TxtKhEso(_#g?GR%U>JLZ%*2*V<vy#<b*kAI6c{KJ(gGy z>Amj`n~)T@*Y4H_AC~k_VTg5mvBy8*vcthWmAYEbMUMz<Z2D`_P@UiAv*%qvD^GsO z-BtT;bD!GZ_jBs&drLA-PTjhvclO&o#xfBx%<Kh~i`kXj9HQ@N_%f7~3ak%(`o31p z!joBi)3&yT&-Ec6gc#PTs^9XF%bkAI`MfOi@rS$mtqi!+6i<aub2YB@447rAH*2{V zr?+!J5PM>I#3d8fB~j*=O5<3Hf?D*GHMX)VetwhtidFfN<X+?X>wdEdYF#V}y5B2x zgh859asHb_bLBWW1v|VZcFd|)6}WUmC;b142eBspN6u*F6=t!lRy%sRd}Gl3z+D!* ze_pSPFk1SywC2~hNkw(xHOHncZhG?L-lPpqA0#J4Y!!3JSaC>O=;y(uoI&w7BSj_$ zERKm({(JMt?LC~XveE*HtM2dRR9xPX6rnq5v+?AUp<xZeW=xzZUtfIqmiRkit<t&o zN<y4c$`csk8Oj6L=I>wHU20IweKhvzUdAu?3&ew(^|gN7$p|RuS#X5qN21UlLsrHa z%#AbJ6wb6JoM{#~Q?YoVn9gb;W_wk!fBr85)&v@d2TE|c>fCPP5?*jjCBuOA;S6TM z8EqbCS~bov>!z*Q!BKs|p{CC5Rz^mx;Ti6ynU8M0b6?E-(XHmv1cuC2O<N+ir#`+p zGreSvf4bBB<*tt>wJa%`lO&U`>Mz{JGId$Dsnhqn&pQ8kdzR<wWrR&p+ura=e9zws zH}-9zy?t@{29DLUcD-dN`@v|cve0((^$BO3ElXRT|Iu9GvSH7XZ95y59o#K9-85L) zcJ8Ayz5RzLUQoAQVNtpFAdds*(&c{9vTf$mT-7hd8Q$ibU=_D^m6!(SnRNyH)%%~8 z{_&h+zT4{BWAod~4Me|vTCqs5C}&cl$2U!DfA@)j``HfeG4LqsKCF17(c8$ryNhqN zG3Tk<OKumj^$T<SeRWLFG&}!x+wA6ay@wg@-P+{~YZ9E+a%Npq-~H1k>Sf~=9gR@+ zf*LKE+qb2(UsgA&J6>wZOm*FCd}5cnThesaryH-%t7LDCb1g`kzbJG~#U2iKqp(dA zdzo$qo!{u={^-oaxzArN+BeJc?a8K<zVnPLg+=qTR-c<F{kZK7^IoY#N+Gkp-doFj zM(u94^n|R|(1@!sQHJk7Ex560w&x9L-s;6-OEdiiZcoydZ9ZkK_ab2O>!VvZXUgZy z+WC53u4Vi;PP?61){B#tG458Yu)c6pY2V^GD;7;(RxQzYjdSnCDKeAptlQ(r`evDj z*4dxTLHhzWm<06su2pmW>=VALAYi&CS5;*&o2^~L;)N?E7Ir8sNa_g?Vk%e^)Dz$) z5Mb%Hf`c*QqDhazT!jT*JprOj8y08v1UL&^;OQ|iW_jSW+2Bx4Q^OsJgThQ37Dn|1 zxC;c>9y`~z<KmWz+r9O{iz8=WYT2~VlJ^wvCI@e&SdJ*>mlwo5#P8`=J5@Wgm9Q8s zFrL5|+sN}G??lTy2emJ3Mho>PSo+rAscTaT3-sQ2wC|IY+sO})7A{Q<{n+p!o|l24 z(|$#vA>V;ohJ<+!a_xf}#2qA<_&*CbXzUX_(mDC#14EZbFV4I<K6z=))S$Rq+m@X0 z_jcXyBq%H_n90ZK(3PF<Ym^z0($vQ{JM0`AR|MnyhntcnhOFu4TV|##T)=Y0wzGiq z=qkZvZk3ZwQy;#!ZtVKS6e;Sl{6b-TR#(t6nPZi2tJ{US&lo2~WbK`EETJJP@xw|P z3!U1=!^d{5to>*ED2(ILwQi0}i@Q%|Te)+IxgKJE|2|>MuPKk$oj<IowXY?@k@fLb z*>%UP4gF%83|S}1oW3>dN8g&))qVoA{BPYo$K)CQe6h}tdFmFDQ~jgvYEDsDE+$aw zcx#EEkc#`7Z0q>nGyE1lT6g{~W3{!#!eh4>#gor<ovgm~dXj8s(2>Bb$c6u%T7DJI zpIhgY^M6@xZ{kb)VjI5~AGhcAZ<=#XzduT$TyT=&-Rk2%tQRkg<UX|S^@i#C(~Bc? z&WFx=9Hf)Zy1deZQCmrDfl$DF`J(*`TA1H$=1p)ryl|#oK{U7D_eBb}&QWU^Rvh7T zX?ru<BW1}M%@c3t6s(&3j$hW^qIJ3f$Ikw{k$fk%ZM-MqIY0idPd?k*%vtUC^Y{!k zoZsyJFzsoA)DDepicTL)8~WyEdB^_KS{Jg;%yh+{diCc!yi{XqD@<MY_KW1-?<|{Q zy5WDYx0u(Qg8zN}vEqC5UR!(*pQc{5uXJOV(lRlXO27D`_Q_=lnPF!;9CfrNysYH< z+W&k<%dPmbm69PHIf2*0Eb=Ej5;$7=>|~xowUl$mmMf21-oGg__;%zKgMMcE{38z^ z_cz{I`rYB`am#a}w;R7)2%XvSpKDhdGymS5ye}VSF9<4IP|yGL8*lWhOI1JfCsmsr zi;cLoD{=PagU9PPmR-C3>QC6Zf2{9?oxYtqeAQvw*%rgw9ELY{`M$pOD*B>KtBK)@ z2(}bEzFo@xqI)F`id$DZ9P<AaV0d<G+^4M;nd#Yy8K)0T%$x7__2u~!t1PqhE#F7q z|4_Ghx}|>SiB)`NN?zO2sv0%?+gG#94H7orz437H5+ApxikTY^dO1A~Ej`iI-yQSg z*;=0oD~s8j#Cexpw28W1-TLwJjMZ#gS_(JKD3!guxVyvPW}rFO>*RG;qZaifOmHix z*|=~1Tpz!=R%_YbNCoa)C&l}2UwpUj)~&PFgmo4sbx9g8yB=Qg{EM^r1f|m-)_J(Q zK5W(c_Agk~WVuKGmCbHJ=EVj2$$R>*p9>e4U;f!)-evJ6Hxn;KN*GT%)g!WT!66y@ zmHA$&v)cPV7jWvc-}yavMmqoA7n8qyOxE4ILeXu_?5D-c&e_h=`1J8y(6V=}7nK!D z(yK3}7dU?Uu`7!qkKv^3y|^ld10~g|`<Pl9RMNyRRY!0sUOF>(zttY&m_Jz$zD>39 zNtIVroc`<NdpD7W2E7l_>o;zX4NN!aldQD<x6i`;{!_kn3M=ovf4lGCcfI$^PIM)- zt}4CoYrj6fddY6rMRDuizbik-&l|k+_Vnw@uYIz)z80PpH8B6-lJHZhxR*nMueS79 zb@~?T^!HaT^-QjB7Q8wmzx~0zt{u5XQm>P?q-WU6ewmyps#Lg7-Qx3Ny^4GGTv6W| zR$JfCy*Xb+WF}wE&v$)%ioTU`GEe#S&-_1fS8kC*(}l||JDhah+r<g|zc%Ih_kv~h z@qrKa|KI#-!-NA&=jJ_Mz9&?meowUD<@r-0EMz9i{RpT%_<!2;qDAg%?=26W_PhJ^ zbF6&ouXxv}g4T!@spo$?k9eJXXFI3qz=T&D&VRe!l9v6$Lo%)HmF?0O6FoDY#?5+n z{3ti)krxejG-PHj3d+%swmHmVcK7F#blqb*6IDCw4(BCa%I&oF-{(7FeT?jODdUu< z+Pm(1Z28c6y>`yG(8?QsZ}nc?c=dNi?VdR+cdljqds=u+;cwfAt(DjR_x%0*%dgsh zxBa<YD%1RC^2YDU(7WF5c)nQI$4q?hkDRZk*6SbH)V<9rRO~XJMTJJ$?T_;x>71Lh zc<u4+N2|(jOp<wX%{Avu>-z9*voC+>ot`_-xuBr^=#!ASdJA8;KHWdJd8_J0wzBj4 zn1a@vz0@`L$^F22y2&5pF3Cv$++NI_9sGS&*g`Musgp|0C1h_0?fyMqbMD99SH0J_ zzTJKMyH?HD(07^hub5pZS6v;DYu`B4Gxz<Y!=3!mC;F`pp9wub_hMacUGg8(irCOY zs-_hcdyYjvKDzk7{LlINOJCY=e7O7Adxbadq8GHLtjbubU7FE<cbk~h?8W!$_x^ui zugLRG%VV+m)zpo_7kjOC`W#OW*;q2m_Vhfr<Ev);ZsAO;4>9^#eOmjjNbw=_61^`u zAwSw4%G=M^{><-nWV?&HYB%$`nSacmyfCv-v3pYU$7Q*V-iQ0QL(cznTF~Qdqqru0 zT6drKv>$u6y1w{y@5wvfvvVy3mMjVNm*BX?uHF``7I5l*{+&(7KgjRrl{+7|?PqoD z`Kj|8?*FVm`h08HW7ZA6Q+GCJT}^Pv)Xe_da>ZC=vi*D`^Gcn~6K^}1Xj?RS+17H@ zN4;FRe*297692NCToN8vxGnUYp0NF5ia_dq5eez%v)(K{>EPFwqB6(%zuo02$IJh} zysWdB(>}gv^`EB<Pb24x=ZVzDeTigHm7bz~{*)>2Sx#l?)Y4g*=`Wvr{-n0^(>%9r zsz#6JhB=@5eDU!A6X&&_HXCUrOw_ylC-c+J#RB`o=2z9cj(&J{seQ(8gNC@z|M(pf zmAiPj!#6y+V9nhk#x^4>{Ew-BgYoi3lO!KS8Hp$-E_`44aqhN+z>@`)KNtLcdFxQs zK2?dF%IE64mni19-9Bg~5UwXPPjkvoo@vwhyS<u^8f|al)oD*_)7JX@Is0$h>*!a1 ztRAXc_}u<z9Qj)Q)@|+dHPh_xU0&y+aeDvSrS_(4uS8Arp1nGGb>{v}LGqI2jxP=w zI0c)o^HEzBs28Ts@i6zxpIN8OX6?$K__OEP<aI&HlM44)mb~BU^)<vZe9xxy&%aa! zdmjlo=u;Q6ca_eey_u7(lXl&Tjb8Vx=<_m;@=0H}uIlnwYJY@(@6TV0{mV{^9o70B zrr{qyB{xN;rzAA=ZO=2o{r49I_kC^OWBJOu{F`~yx3w2OXiI&S?lb@K?A5<_mkd>w z`ua>wT^(LH;nnA|caI}~{aRu1PAuPZRYAQ^=*57%(r;~xf}T}bZ?!+D8@(hv&(mj_ ztkeFQua{Q7eC$0<@92gl>3dFnyZFtX=VPyhR%>lf^Un)U?tXkN6;iKXtg~VIqPT-P z7j36aRz8^gUQp^w8~@vw&c~Cgeq4y(BlY89Kvq~>c6@8i$!B}kTzR-@r{lk?w{<jE zX1dg@4T+KVU$S&r#J14SU!;%UFUgTw6K=D<<Nh{psb77MPE3^8BXQJY#;VxD>21HZ zd)-^t+vd7K((lxLZ<hHwwjRM8N7TypPdVZ~QIL(3>7j6oi>l*AAwk0>PGY_mCmL0m zRGdOmR3tn#RF}ksSaTJ#il<bYP3V64CLpn>(w6;@ZOz}a5))g!pMN#m{Z%E5N2Ng_ zNhf@<eR<H5^JW)+^4&J-d1&Xs6{_QuT~-v-q!)Gd_?(NWt>1i--ydueG0oF)%(?t# z_J=7#ANF+F?UFk;E#=QK;R*3f414zHi$7lbZNK#Y{U<)Edown)GZ?S*3FW+c^Xs}} zCmSElX}T-?mv^^9+@bqtfACqqoHJ{KqgNH<y06t!CNk^lNo#i=eKNmL#^J;L-da1A zpB+c!UffbV+<ql+@q{4b(@mD2RZEs>Zpbv<&3XTN;G(T|FBf^OJ{|HWsz>|x?W1xg z#r`t3s@Ae+mY*$t%y38H3iq8GE2<B0GHsMt>Bx|i${yl-N@W?77th2t7B3T~>pZ<n z0+$EYthr#}Qa1H+mhTjyhoQbY2EEh0&uSQTw<JuneC+z?==BLk+cH@S_bi<lQy8+? z<=B#Af-^cbme=}<^rmc6OFOkUNbl>$oPG75C#>t<x9x7<_Wa%ti+Qb=o-mIPo$JE0 zY~`68$IZ(h`)y}so%gBj)XneQU6S*BkG<=1d3pU!W>!M4mF?_feLY9pm!`D6{ZxDL z^%pDQTgCm{v0<|hzE8?A+J4pe$h6&mA}?keh&{+%yh6Q0XHwte&kAQ}&%AMJ#@!!( zeiU2T%{N_^Ju^Nz<5S%8<d&VOm96L9E~rbscTHPon|VR7Hc(jU;6CS#Pj4>UHf_Va zeJ1;ASARS#|3x&;d+Y0nCt5Ne`5I%F>m9Dzl5uGbzxQfClW7y@#jUDfG(Ye}r=4wY zaYg$K-Qei~%<Gf)7DiOQ`+E7I^o?T&TF&e_pl$Qu#H_C?+TWEO=28jS_uXsr)J((W zw-<ysM}^w!_si+cwfge4vR_Zihg0^`>q%{`Qc8Aq)^49O7rj{M^zzKhm$$^1bY9}t z(n~AY$<w?xZ*JMVDY@59{hT0k^OwDfx5>|=JjZXjg;y+M75rdvf;a1+dc-3a{n(lY z)2qq+Suxi_<ld&gD!8F~<fm1Bm{v7o#mok&pATBAlHPc{d%CF4?h5x;$G?l@+7l*r zvQ5aDcj$@O%UPQjG@f!&=+Lgak&uwfoap)au1<fWMwH(40Ns2`@7@m*=OU+eRQ+D^ zP+s`#9_^1TlU|3G*MvN)jeHTHvM0s<qp(P!=A7AzCVr)xG#6JWDgQQha`4deHtUYO z)7kJnQO0x0gl3bXiS0aZ-0a>og$Fb^-RM>lS<JFj!`brJ0)4H3&bk-<j1nD=5<Q9% zU5O_aab3OhuTO06y;bk+YZu)+@nvhpYw3IPQ#B>htHRbTU%tF}!~X8Vo9#+2k5bl_ zONc-7S$p2*ZpMZ0=7wskJXgh*vdo!%<LfF%Q?1Tu)mLY;R%P+tFe`eo-K%ic)GKS( zRPD_Q=v~FB{{BhHPMKB3rFt3_t=dbcCU?AE?Kbhf!SBZs7upRQB)%Wmvs;#xL2aF1 z(_>Yc@TnnvQDLE70sYFh$1A!SHY;ymw<l=&{e`!Z73RnuJn6PpT6tQm-(F@01^}I^ Bz6JmQ 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 zcmeB)KM_{Xz{tSBz{k+Qz|4@~AFOZWnmF|<1A{~j0|P@sa&BV5ypDq&3=9%?7#J9i zB$t&aFo1#T4h9AWp0tAW+^ZtDKQJ&zE?{8bo}QjqT)@D<Ai%(&?ZCjmz>%I)ndVv4 z`<;P-;SB?Wm_kNsVv3~iw4)3R;tdQ83}zV_sr8ARHH>u(3=$Cx3=Aq6xg`~4ZyC=s zFo=UJn3t2EoESGVQjmc`T!(>yAt*PoqJZHjPZ|S*I1d8@gF;?nZfZ<)wHyP3>JbJ8 zmWYD<;*x@8b8;9Mv}70<7*z_2QVSkk@UUWFP_<xSV5nzcVlZN0U^u}f%D~LP&cLyi zZR0<24kkJ2$pSnIle2jwnPikE@8gl1T)?>sCThba31h+)n8DP&;Cc;{gsZcJiJ&Wo z>k{GJ2vT#LHxFcvIbS7{wCLnbe8o(n(wo)!U6`2oxHsntiZU|Eh)iw~ieO~hd{>B- ziCx4(WLmX=@#Iy)GMiaNpE0V(mDf&en^;>O=Pn{5&(6rmEiEGAjwHwcj$Dn&b>cZ{ z3=j?@1H)Q1)|_~Lo39Mq%r8KZd0T%aD25n7^kfl<4NMH?lP^iAvZ^yMF&9t%BVos+ z#WvYSQeK{kfq{XUfq_AUff;PD2m=el1_lNO4F&}U76y*VO_FMpS4nD3z9y+LNlI(8 ziL^RTJtspENHq&50|Ub%uzp4sP6kE>F@{A@aV7>nh8<8gGlLt$F({jbL5-0I%4TJd zVl;xX*^tC}nbH`2pyGTCCd``{oEh>N3K%LGiWo8((it)~XKGz%p6sZnz^E}fNiSgX R4!unr42%qn|Nk@a0|4}mrNRIJ delta 1715 zcmX>R))QaPz{tSBz{k+Qz|4@~AFOZWniRc@fkEO20|P@sa&BTl*LCq01_sFp1_s7k z$z>%93}B${!@$76lU9(PdsXE22L=Xd69xwE>FJ5Z1q=)f0t^iLEes3{9O*fgY3uf0 z2C?5TFo^YJq$Z|_1ed&IU=aVnz`$UZk&#-T$XUbK#K0hNg@J)VB_p?_qV^;c8v}!c z1_J}bnw<RP#LSEN)eH>cGZ+{cB61Te3K&lCq%kmvS1>RzDC8yPrh1)vvW<a3J%WLO z?Ri0damlWNC{+dqJqHE`MyG<J)PhGBJggWP)Xp$4Fw`?JF&Hs0Fq~i#WngAtXW-b% zw(*}h2a~MKWC0$9$=N)TOtOlT_wmS0F5p}R6Sd)zgfZa?%wXzXaJ_~}!qr*AM9`JP zb&2q91gSaBn+Gz-oUf8eMr86PzG5a3na%3_E=)}PT$^(RMH!jogeJELMKJPgzAMDa z#4cnbG_6{|c=9S?na!-C&lu}tD{3dUO{}embr%tlXJ=&OmKG6lM-pUUU;@P!qYgs~ z)W57Oj0{W$+J>gaqQ<7iqA3tSygE=~VPHrBo5v=ynUR4JVpvK_3IjMLX-^gs&(Y#m z;kMv*0}C)RFx0zz{u<A3^Ob>{`31;5H#W`Wgwd0ih;QIy31={8)L~!%VTP2+VG^pW z+6+w0_LCbV?3mvFpL{?<UY(hNfdPbNz@{=VTw!1avt$@p7<Mo)FlaF-Ft9LiP5vjL z2GXJ;sm1jE?_@to4Hf}y2FA&alJb)$Nb;I6vO(MlvY!zYIv@<<z%V1k8W5L-6+|+y zK{fL*vvY7xZj_W|=3?N6iU~}fAju^nEXW`VR?5J@AOd0VKo#&X@$zk+CTYl1FUH6R zb}&djkOAfjMh0$%K&Utq13N<ul+Dbb%#aLavoHuVv_aXd47?08p=>rJab8AahGkH3 zJ_aeqn^3j@%=~%=1_nW}1<VYLETHgT#P}H$hAf;6j0|E-Q=x1o20o_MP&PAz8`DlG zn}tD*=|7as${@w83T3k)iSsh0G227M`4~)CmqOVB3}Q_6Fbf1h7C7e@R2F5XXOt*t zBx@=d85mgV8W|WGD7d5+XQt;V1Se;v<|U`<D0t>2>v5qgHZ%b#wovfSNX%1kOioNm z&8_rK3`vcM56-MgH3~{iFU?6Ta?8&vamz1CPgO9|Gf=RqS3pvt3sr+fC@i(8I5R&_ z!9dSI&jj6Os55o2x>G^Jro6mdFE_CyBP+2&FTW_=P7~qwdZ<saIUcGrJ0meK5#k+) zZXK@j%#sX+pw!~jqO#N!1(25%{1S6hk^Q2_#TAl~Sqza3&QB{TPb^AR$ShXK$xKeo zD^5*OD9uYrEvi>2$w*ZQ_ViKkFG$UUsP=)V&{2SS+EC9>4`LcrvqEB7VrEWaQckJ@ z*eQt$ZjONpi6vHC86_nJR{HwI$wiq3CB=HhnK>Xg>-)R;V3%P5Nll)hrnos=?HKc9 v87)Od?a6jp0c?yCjFOB}ll!zbDY2L4WxBe#xj<=GDD4K$EsX#FGw=fdU?7AT 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 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 R2FrJ#?8wN#`2RlxKLF9oAm0E0 delta 4803 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 DWr6D6 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 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 literal 5392 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 G1_l7cL2JJN 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 zcmdmC|HZ7HfsuiMfsdhqftew}KUm+$b?4-b3=EtJ3=9kj$+?LIS|R>X3=EtH7#J9) zB$t&aFo1zr4g&)NPg+5G?p2Z79~c<8LKqmhr>7?t7cej|2rw{6gXB5Vb1Ktn&d6+I zU|@K|z`&lAk(!tyT089|0|Unr1_lPRjEvO!L^d|YPYev4HVh05DjB&Y73MpC+b}S2 z++ko~h|9@OP86FY@{oan17xsKZem3N!y4|N3=A9r3=9kkd5O8HF|pMO3=Cow3=Aw0 z1^LA#)%wP+3=C2i7#JAl6cnWvJi6dv#lRr?hJk^ho`H$Mh=GCO1d}KOGXpyV$5ytD z|Lhr=1i3fcGdVIdr3y|CW^<T)h_#<7Rd91KTQ?(<Am8K%?D^~r;9!!Ne2BwGjRC@8 zWMDA!;@K9@Z}XLboB0JOSZ?dD`~jmUTW}UIF~m*Y#;M9G&cMX<Y4QV3J0|s)lNGq+ z>zNoB7?>Ft7(^JD!3K*kurM?*Ffhn42rw`+@GvMaXfo(C#4=Pf)G{n!I>vN|nOR9n znOptk|NkIwGiWgAGejfFGAT(ZbEv=g|NsBv|9Adh|G(yc|Np-KIe*>%8vW(H`~5E0 z4Lz_uAjdH<FibwfCA9ekw>nQfCqog)2`rop3=E6Fj$<WME_vV^{<gXJX)E*a2lT zGq^DvgR)r|)EIf7Y*q#-Mk6Sj4N07rDUHzwD$d7X!n}#WnIWH{fT5D1h#`|9ogrhh qtn_teZcu12FfjaYW-ywp$Suk!F<DIBV6u<A7Y73)1LOby4Ez8s@0S1o delta 1676 zcmexjw!^-jfsuiMfsdhqftew}KUm+$bysu)0|VzB1_p+N<lMx9|02`QF)(o1FfcH# zN-ir=U;qON5XqBPke+*0<n{*!2JROO4BXSx6N?KN7#IW?800rFFfeeW=TxTciLPd2 zU|@K|z`%YkBQ-Hapt<BN0|TcB0|SFuMn-CVA{!gyHwFgI9SjT%DjB&Y6}GIuXE88v z`Y<ps<mBWhCrV|@^fEATfE;9zn^;l6u%7!T0|Un%1_lO&yu{p8pVKe4GcZW-Ffgz^ zFUT)030$0F#K0i;g@J)#S3yx~!J`WvRtyZ{4Gatn^$bi5MhpxLCzwPTm>Jj^IJUBF z{AbU|B*eAZp2?A!DM@5<Fq^~VL#+KwNg|tr*}55-gm@=EV9&2-0{NFwham;3kClay zfyqGI(9~Ge*wk1w1p*ith*bv)bOweLuz75o85tNMW~HR0fGuKRV31}AfS3j%Cns?@ zXfYpUzRCO?9AAtK4CNhyf8+UWzA|t#zX0jEv1uk3jGlagqkxa;9YY+W4g&)SGo(zm z;#6goW?*7kJvoKbF6I4yW`+M23{kABn71h~F!aYUgY<&20@wx+AB1JVJO+j(49sAb z3<C>82Ll6x9D@J@GXo!k0)r-lK0_=+HA5}K0;Xe3cbJ)#q?EbUU%vl8`46WY)BC@Z zrMP5R1f&@lCp&TpPY&Q>fnieyMm7epp&)x1K|u$?APx*OGBAJ~0phZ-f=C87bW>oa zfoNuS4o+lwRt5$x25w{#kSby@7XyPJ*gggxeA=0K`8IoT8S>PNG4jEE6377a6(a*T zLm*U~iGiIV2Fhk;P-aMmvRN2}8QP$1Rt8>%nNT(xk~lA;F~c&bI3I%)<4q`A0A_wY z1IWD~3z!)gSvVOO7#1;p2E`Z)Cj%pc7}HcJn~8ysX*HD1%;3hf6Ut^`P-FTJWwSC! zF{?t^Y)Im~Oli#aP;ov66V|0rwg7_|Q$5TAL68N``303lnduoN3L43p3PuJ7mbyj; zh6V~Qsl}P;c?!YFnW=fnsX7XtdC7WQ=!y+ZK#DCCyfYH>6daQiQ&Mv)y%R%HBjSTI zt5S`FQqxOw5{umO^Ge+Ei_%jSjPwi?tm+kzl;}d$U=a#SEh^5;&r>kaGte_Zw;Ae8 z9jxwD(6A{lFW1XWEXl}9tkBCZO1INQxV;|gQ*4fh>deka%u9rL2clbtt30zLLm?=& zIJKxOHAMmBB?Z64+*D-0=y7p{WMmdYB!lzQO3D+9QWY|b6>>6@Q}c>bQxr<`Qc{cR z6-qKv6@oo|6#NTP^B}5yAS!eeV4gPAGt`5a2Gy*PSeBTXlbDo~ssMIMqJo=aph9Aa z6<0<{Nr9EVesOY9W<g1@UU6m)$j$oxZa&y$SU^&nUx__uo_s+{kx_c`Cn*CqMs7wP gM&8Lv(q2mJrFogIZf-76+7(K>fpZGu|Njj90NZ|WK>z>% 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 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 Mh>?Nu|9=L401&`aOaK4? 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 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 literal 3728 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 T7EeDczab*Fal-_51_lNI_t`l^ 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 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 OE(TCsF#i9~zz+ZjiH#Tl delta 2976 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 A#Q*>R 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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 delta 4612 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 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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 OzwRH;%;>XWU;qGI!{6)x literal 5028 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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 zcmcaIgQ=m9sh)w6fq{XKp@D&!A;CXb-^kUw_aFm9u?GVKLqc+HVnLIe^ezU5;uQ=G z40n>tN)(uE`C=Iu8bExjw1V{98zQ$qFff#~FfedWPfsi^U|?VnU|?wb!N9=4k)BhT zb|Ut1H3I{~8wQ5_QyHm=DdLl-tzuv(e89lKV3v`QTA#?O!6?bVP^`khz@U<mTT&qs z$IryTP$a>?z{r!6pPU%nZ2pLWq2LAs10!2*VnqSt1Ri$=hJqao3=9f+iMgps%Jm-@ z7#f~1Ft9Wf<QJD*KE8cA14C;H0|Voff}+%dNj-l~F)%d9FfcH5F)%S0F)%QkU=n3u zW?*OF*vhu?-_Cq?25=xWZPqGOU{qs(@E92wCb20w#`D{JW#DFh!N9=4a9e-nFBm<! zq)4Tn;T%I1g9?KcgEE5*!+M5g4B-qe3~CJP7%UkMGFUNaF(fmXFz7JIGMF&vGUzbq zGUzcJWLVE&$)Lty$zaEz!yv;T$e_U>z#z;Z#-PR^z~I4P$soia$-u)P!eGH5%wWMF zz+l24_5Uw}Far;R41)-R0mC&0D+W!51O`in`V9;Q3@i*z4Dt*H49X0$3@i*D3<eCm z495SzFt9L~Ft9KvF-S0YFi0}6Fi0>6Fvv1UF(@$@F+5=~WC&--U|?X#VA#qq8>}mV zA&J40;SfU!gFk~M!&ZiH215o(24w~d1~~>r1_1^Q1~mpv22}<Hh7Ans87?#EFfdM@ zSE9(sGWkG>lY@#fv%-H1hA5_O3{Mpp82aOw85kJXGbMu}2^_dg3=9m+3=9k+49sA@ z2m=el2?hoRJq85^76!h_UZpydD@qL}uPW7JVql#7uvB-maCr((JtspENCyii0|Ub% zuo;XjoD7T%3Ji;&;!F&D42Pg>W`+QU3s5!-g8`!gl+DT@#TWo(vmuG|G8HgpLB;tP zOqg#mI5Xrk6fjgW6ftBnq%&k}p4s-FdGgFI1;(b$ySi8yCm-p~<6vN9VEq4|fgb=O CWTlP( delta 2140 zcmZqZW4bbfsh)w6fq{XKp@D&!A;CXb-^kS`axMcy$pHoihJ@tY#DYv4$;S)~r3wrT zjGvOrN)(uE`C=Iunk^U@7_8C?(sOT!-2TA8P%gs2z&$-ZvABSNfkA+Qp~r`Tfq^4E zr!tM}joldr28K5b3<YKxsfj5<GfPe}FcbwaFff>9WTe(7vT88SVqhql!@$6xl95|d z!C4{C!@y9~!N9;Il9QjD*gawSHwK167X}7Kp4`NW0>;Ta?hFitDhvz^3VDgSsl9%J z(-;_<OBfi~l?(EVORk;TBgnweHG_eHaZ^E2YQdzQKc^TNn$|EdFmy36F&Hs0Fq~i# zWngAtXW-b%w(;N2{CXw^1_lO39flOBC@Tvi1CxQap{cQ`v8l0W3Is4P5UUOpqznux zVDs2EGcqtj%t}c~0b9htz|hK2$G{5WFfcJFY(7;W!l-5b(}LGR8XO&r3=EU(&(4eI zxB1Gz&HMtS?#8B>TrhevOOZ-F6EDL#CSHarCSC>=CSC?BCSC?*CSC>^CSHd1OuP)s zn0Oh&nRppon0Oh~n0Oi1G4V23GVwATgsRnI;$=u?;$<*l;$_fb;$@J9vUQ<+5UmGQ z4>Av=7i12IwqxRDs0V2RStiKD%b>x;%OJqS%OK3e%OD1|5XAR@S}MfE%OJ_b%fQ3L z%OJwU%U}Uj3!*{lK#q`N;{E>@Dh^TyG8?4UfQgsk8r0F6OuP&U5Hsr;HZburfFxO% zcp03Scp2oOd{8KWd;<~(IRK=Fmx-6bn2GoQ7bac?kT}Rf5Us?-%OJtT%K%abav(?y z#0NPFWQG(IF9S%85fd-N6DD2;LujaGFxB%iFfj2lWH9kEY-QqQm<=@qWEseXNld&9 zo=m(9hnRR7N|<;V{2{Ies|7_1$RLn~Ajg72L5_)+K@l2?pwI*bHORNBOuP&VOuS&v zf}-IvD0&!m7#KJ}1Vah~!(^3WWyaRY9>q>f@BdHkDVA4fW?*0dVHt2*0%bjBFiVDk zh2a7N1A_sB0s{+!z~ocKIv_3IiVc|F|DCK>qQ@f8%D^}|u|#=tK?#37BO3!)8z|K= zf>J&RgE%nE$iTqN!pg?Z!O6wV!^_7nASfg(A}S^>At@y-BP%Dbps1v*qN=8@p{b>< zqpPQHU}$7)Vrph?VQFP;V{2#c;OOM+;_Bw^;pye=<Ll=i5Ev935*ijB5g8R76U!PG zpOBa|Ik801G!<qeC{H2SU{)=dgc8Y6nt`FNesW@oJa>9#Awyn%L0S<**5;;?RGxY< zMn1Tw0zsJ`tb>t3fFTen&cwjZkO*ZnGiWemK-nw|5)2cdY*q$dh80jY8<IFLqXolO zs5l>k6ysYcTL5N$Jp%)SAlL$C21XW61_p*jOzaF0HY0-q(@H3tiGh#lB$Um}5WsXD z%4T6OU{;5+SsA35!=Y?8BynD*0_H-fI3I%v>q978fI)$&9%g|c$O7m5g36-I^o$Y( zjbu#)BLf3VT_XcS0|l4V;>`3sh2Z4O)V$<W9R<(4WIZl)#fByz#TE+Q8Hsrcj>(BB zskxQji6N;G@gbE3spUnPC8<S0sp+LTiA8Stc_nW7Md_&u^+tLI3RVi}>U5zBafyee z78Pga=P4NI8R(gyI|S-#9jwk)(6A{lFW1XWEXl}9tkA2^FG{!5B+4&Po!J?Qd5I9; z>47!taFu74WGDos7N-`KrKTu=Jg4B7n45~>D?Ki*kc`Y?h>GC+w370~`l3{Y%wmO{ z%;eO(;?xv{(!7+^B88HSRE1zq9|iw{)I5l4ABX}S1(?qb^$hhOra|>8B$g#+<|HQN zq$+^jlc?b47^sj~V#SqFQc_^0uV0*8lvz+xtXG_w19G^&znf1+i3BdG$p@PBH@7xE zVCI2TatsXrn;DEICzgmZwr*}~WnpAv6lN4*6rJ4FmZ!vCnwRP7=H>#WU7@raI6pD| I|Ife=06i3-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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 O+|0np!1(_^13v&bl1Zfi delta 18411 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 HV&De==BHgz 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 zcmXT-cQayOWME)maIRqB1JOMX7#N)8AYvdsDrQSyXfEQg;+!rn$idb4(4}#gB%>LV z3UiAHcM}f-ivnw(GJCTTPa~JKLAhwpZT%gx85?J<W$$s}kY*PUc`UkEX*;uP$iCPK z|Lx_~+fAbw{zY_MI+=IZ#$aR5y%mRNO3NKH*mgtuq`FnW7B{i@sdjgsl%C6ucJz1r z^Ux_rtXp+f#*K}y?#Rc^Nx53tc;fb?ReKhxik&;-QFy2{-ag~c2Bm`&7dVCfcx1dG z_lbYeCnuNe)Y9*7<Sy8;RM;^*NLpO9zDa{oR7pcgOl#-=t23uL<uv}BqyO@>fZ3BG zSMiD&yVgC;Jo$RB)$cVa{ZH<mD>x9sxV`bbWz({cdtRqSWs2Os`Na86%H|)6@*KLq z8y@_hxz;>rN|MR+JsoFV-kd%X(aq(O_*A^KYt}j|9~*`ZQ@rJFuxIVQa^B-=eQH{{ ze`})7s%2LmT{}NLs8x98lh>CGG8hE-%04$c7qr)Zu>DhgYlZAY&bwA8DuedPl`IXu zWi2SB!tCYN(YSdU(}}ObV!r#b3x4rjC@Cwy=;p6;tK#US5F6h;NuFneywARf+EcO7 zcG2w*huUWFh55)W`=6ZTBV$(e-)i$u&F9-y3|LZ5D<(LaowH_NnDO-5zMu^gKIpYG zupBR#u)N}#`NG?08?`?!y0q`<de!B9nQGOOu9xK3^`Cmjc-i?b<Ns$rk3Wn#s%|o2 zhJBpr&g_L*FaOWX+GfnHk@7)CS;o0u@#?njb91$)ciT&+mpdjfEMs+X;tqP$cu9DR z_Q6M!CNT)?VV|&TLM5MN5X0k1yBOl0JUvr<VrO|?^2<+MmtyB?{qEXUAg|aw`<<S& zg55bU6@v_`+Y6#Z+`>7&%5qy=3(4kS@6*-sOJ44zrLwK<#Y=`sx0cL0^*P7b_^Mlp zc3_Q8MvOzzJJ*|5ZHc#I@BR)AROAeCHM{WOnS=T@wVUS|R!K(sFj$43XZ~EgKK|aq zsT!Y!{oD3mTz@~t^5?>G`NhWn^n(+-=T%KQKhL$6x5$H?ab796%G#=(jCGksSp|23 zqmA_I+>fZ3ZJvF2&a|*wj_Y47i+izk`t7Xfbm`p9xtr&1JI=nZ^sZICuglWsmA}GE zV$Xj$by{x2;j-#@-}-mIFS<UTTM+R3|JqyEzFGYJU;TFJ^LdqzHoEh^eZW6kaS0!1 zqRJ26l`1<E^f;2UqcZ1e|NZ)P_kvBgN?+YtW8Tuz*6Qx!=6YPh_t}jdKU$6~c{1h7 zmJ;u_t7+vHv3dS!VP$@KadnOhuZM@k1Vx3#1xAL(21h?%pU?1Y)3eO_*{7CIzsAt3 zo^s4*<^0vtw%IM%z1;i){}%PF6$|f(T;XVlQ{N%apuR<bks;vwk@wZi{yuwD*8kM_ z`flN_hR+t>moC>Yh_`Ru|5xOtY+&8F>Q&GE1N8s93O+4O^?q(!!282Ywy|TrGdttW zJ=Yx<ZvA1^<U9Y^CO^yQv-fKH?(JC}{#+*3mEX?V@KnBxt-9%^(o|nbk<&KK*_X|9 zf1SEC@0B{6N0_nO=CvW`ikVG1o|pvl36)P{bT3>yy^5XrEX(UuU5kBP1!50$E#3>O zly5M|k9&PAxA_*!*AMv}2kWmL%&A#6b=B)He`_Vz-gUY0#p+r3x;>s3gZA;}KX#1W z?s9j}m*))!yp;nA1lDudrZVl>?XbOiRo&dR1+y=UC>Y0bh5wJJoXEp{rc-0u@=PPa z#TUfu#q_FnObp@JuXj3AIdP`Qn&%b4XGPa;Oqy_Da=%rdLrcZ$6768s-HSOoCaphg z@IY?mg{2qWmxixjRQ~L;tN!JTj4fdw!<NZftq}B-oX^3L`;*Cd;na_u*M6)%-eBN( z)9-&o<=UM=mGNm;)m@h>NS{4&xqRcs`<F|0X?#ewpTcnMr<Gl8b*EMRFDHIU7v|>o zqK|L0YBDMZO*gvY9K1f_w%n%drjOw+4f;&nYOmBa@@`jXPx0Ed*umtB%J(-dr&y!7 zAG*#7?cz?)VQA0cQrsZX`6`#OWyAW;u=h%BtY-ss6r@$yQ$2p>`hBzBRk6_SFMG6g z9Z$JdY0E{0l9h*@lr2+=MO-b|TrI_pTJRmUlvA}}RJ9abYN5HC>Fb2@ub~&$uW$Qz zZ`I`+?%@%g#umMsCrmgT_@s#ERH4qPVi~Oh8?7QHtwJTO;z>dI84i-BIg-ZNNh}pp zrm=QhQ-1e)8K;zE^5u(7TPEo1Xh&~T(w@8Q>Q57?+kC5h%QADNmRoPGFfG0KA|aT| zaToX9O%bt)a_m#3goR$Q=WRUjkM;BQ^IzuWZe7>aEo+-`;n1V71LglJ_`hD1m$qU% zBIuzPvf-~lZ&$6`-kA=1+jh%eKfhzGPhiY0(Z?@08t_edBeU;@AydNPUkWaZl|Nou zX67sPs$;|Y!kE1x+}D`qYR;Qh;lHQP{^ieuYkzxQK4{RoHKE_*s?1;M%+EZhTRWeb zPTa6dzSU?wZ(Hiyg$7Y`F6<H0I(0S5$4+*3PTaORibZ^1c`p{viLAbRt(>cx`Pce6 zpPAIJxA@jxy3><7?_`yp|LjS5CXrlb>wROK7G7;z+mioFqC-sOtfTCY?sHKd;x0bw z&6{sz8@yj|RhfmoYRdN=k3Rlh|6mnka>N(jtqx|-%vxT`%(}mzyDX?E?KRUemOD|; z^OdH}{dFy*PIF^Qsr~vkhhL2=<Gu>@IIX$O{CLI9&x$d9tNSjAZFrM8N&2tEVNb3@ zQ!*z=M>7RyXFPg+g709(?1&@sB@EXL^zCm<`z)9L>7>^#zV;S|?H8ZCRru!e&g9;e zwMQrSZcx!`H}bBY&Aj>Q-d;A9o=f7X?MwO0Gs=}Vq%Vv6JWJbSqb*Cyl)DMtwLJ{M z-H#k59Ts}%ao14P*gx-7W@o{&cQua|ikm;(<gz2E+}7|TTUGaa*)Q{U@|!>1=u#2% z-A1rxr{;RqL$iPFZ|1!4TVr3qb{T(e$;`hDMTcG;TDa|4NY#~h{;snBLe?55YQM_z zsa}*<FZJr<@`Z8rQm>*X_5J$$GULGfKDD2hi`kU<*$o%k&lmY^J^i-K#|^Kasqa}G zlG&!fx@N}ovkD5H$1HfS9&<XY{Q23g2mAj|cfWl5avqCB&^pUCZG{syo$+19DF5hv z<5ah)TRom!eo*Gw8vJrwuyt3a#N~hDH+OmnGq!#0>T0p^X<2+oCPL-9#_v$0bqwkO z&a<wcIoEwyd2z)fjUWYq3!fAkb(-e)L>;;4R2a13!1TGn!eY@f(X-k;&p74o2#=XK z>7~Z{Gn-cxc%2Vj*0IRtn1D&o^k)r)(;W_)Pt91BGesjxr18klpvgi~Qm16X;+8pf za0m+82PIzeK4P)(N!O1ypUEyQo+alvrk=^%D$?azdezHP^6VUc>-k61^I9$zN#1O< zHhKMdP1~!SmPMgqE!AvQg1<TMtUTxtY`;Bh<GJ9DrrUEjtqJOV#yV-8fh1#%v3i2k zt7S*Mmib=oPf}3T{3@FzaGv3D>C2SO3!e)}g|5h3ePDOTUnUi?)t=@q`;-~=HB7(F zi0+qLqr*Ap!`i((YpioB`OK;^zIQ3;$NM;TELnIg`qa6jb-H#dc72y~U&b)=Qcw1U z^4M#Ak9Wyz`rE}cEqx1T|8j}il{2PiP4HdXk#@MBVdFvpcbQVjnWc>DQoRzoRXH>N zz1Nml@Mm)9U8A^f&UY080w;+EU-F%L;P#fKI*iYH)9>2m&+eSM=Y3L>FWU+Zt?T#x z9<?}c@3gX+VX4^*|3vK%>y-EDf8p%$eQqZ{MQ;kT%NflCkBT)JW^+xF*H^Baw9MrD z{$GpsROvImK6Y88$eyuyiYV)^j@wG{n*>!=o~`V0U2@=`t#qsDInlVw(_TnTiLTn= zTO+S2*OgvxJ89}{p@LJF_GGcuWCtsq|IVOW_Pkew$!Y$K+I72`RxQ?2{qgm!7-L}I zgnJYA*428*z6zYnA)LRjMCw4q>_u{w9(4!rDjFHuMepDBR7fyK#BH+dR=>5XDI%3S zY!_!NpVDUCVS7a8p85xcPn>qQHhJ9L?6G9xZ#SvG>wg6oo0#2R=I~vqe4_1~x4YuD zI#2mA^Jdt(1aH$LH!W2g&)EGHIIyi|(sLt$OR7E6h9XQ#moF5jsx4Y_?#On-?Ag2l z8~=uiuFQFAr<G=8S62S#@hX9B2OTEAc36Eh&2md}|IHK8$>N+#Iu_d)y?t87KW|3+ ziiO)!9&YCQpzT~C<9g<BiH3v9rm4!zHA%~YB_svP?q|HR{2Y{Wr0bS;m!`%$&bwD# zmey+COcFG|lfKVCP`uQ#*HnTr;E-|O#Z~pTTg+}xIq82Um?zXR=*ZHQUn(9>vWas( zG^Jg`ci)5?x1OjR|L0T5XkXAUX~B%caZG}Zc`nKRHtUYhDdhcmO}gyOyY8unyW2Vz z*_^G;4Q(vcliFLnaal?F6GNuw?mp{odn}09xm-gtdJ}id$sc!|Vuk1TYPX73+O0X7 zE4h7T#iXR{#n0F$*-YD$psvb(^HjWmRq&$+k7e&()o54}nfq$z(yzg53Rjn%FO}OT zS2%g`v#AqBmwpv<(A0^Z{oLoz#wjn~&78XX;flcKkEeUyPc`zInO7okd-cU|yA>f9 zlD5rZ_5U)l@(GXGwf%A@os)SV%7z5hA9nNjY<;;R_V?Cxi*{>nPnB4(qMT#NpQ^Tw zTlyl*bCw#vk}f;xv$~&Q^OV4z;I7GbN>+=)+f{vI9oQWXi)ZR~HvJJ=>vV5X$fj;) zfkk$)8Yyc#XO!&fQ~u&H<xw%O<fS*emL7WXuO=)q&Bg3X&i+Yxr!MlnnpDfUVe`y| z3~%Eq%f%-NoqeEwVCOqIuOlh<gO8c`&MW+z>*O-qae>NSS(_}OvQsW8?XLqG?%V1x z*8K8|WqXu)Z)U~Ks*fu9+{t^cS!UfAX8IoetAF{Q)SfP*qAv;3%Ti{qyE-d7E9F$~ zq2L?d87ar!IL+A_{<J0Y<}ahz3v+h}W-@-@u1qT1SFo&Kyjt4yux|Fd<<I9`X*?<O zu5B8t`vHCZSSKsBs-Njcn0rpGmrg5YlD7L)JiBGRO^9ahMcKmGS2_RJ@T@lKUube$ zJ+tP*g0H5hSUxIFek!@NbG4e?Nek8+s<qCGRz`%lBpljv$SWbY@}ic-((7VA*TNMd zQ_o4Rv)z&zvre^RhGY0&`{xC=pMLfn_S~kj$eYXi<`uhZa}=EFgw7-#V?2}cM9qKO z?VnFJIi@czT(sn;%d&qdCry<;Gw-X3+Y{BZi(Su5s#JE9n6JBYT^xTaw<^cO3oFis z%-ywPn=XSolb+AP84q5$oINYX=-parypG|b_N;q1+m89I3|XLe`08V(JyoAq-1_JI z@Vc_nl$wb#mnYU|HT~Fd&hTWL(DQwpj}<QdqOw7ErycA1O@<n$j@MpFuMd_H(D?E< z%EGYp@g*-!OW)`sr*7lT$Bq?Dnt#+~*HyP4Hm%bOu6{nft;18y=3!{0)VV%SA?J#B ze?AA9tTTT*b#DCA-mWfxs};BPrW(CsyQ3GjjoaIAZt(ks|CXhvvt-=XZ{BRD<vY2C zr$;K>W;xTo1;?DXiDvuC$}%QrO*vOJ!$#_htMYx(z<Eqx?yI}=mpDHt-na3b&-cqO zOQ%*9e7LJ6cwcOW+$z1y+d`N9e@g5sHQL+87_M%jcCJa?e}|hg|JC#j4?^bn&Og$2 z_34tJQ`O((yj6coXPekt$v4!u<@QeJy}xjJ&!<1;>M_>~<TSr7Q+F*s^!CL5TPf;~ zdKUSst~&es(1aAfS#vp67rA9Dytd`t_t^WPAD;0p?6vWK!*EWsW#)3X?z68ZuL%hA zo!fA=IgaCv)!Up2f=z;vb2a8lYrowg`!2O@(c#^z-V26S&%AL&;=_{{e%bj>uiNjb zew`Om@B7)M`#`*m=bskG$!&A`DnI^QD$$izrTp^3iK!(`C#2UEN{eh~a9{hIp}5{b zI5umIrX#EQ_cwoa-*=}(?EaKezhU=Rrhh*S)|`y`yM57h|0N8fm-nrFRnP9Q^^e0p z{|&KqvzN`RS+?5S_SUuSyK=Zq?sEl)7<%mum@4I&oA^)SuE~O!Yb$oYaOyiJb<8r| zZP8urlA9-7AKVt&%I5n}qocoSZ{(rfJv&W5t5i?gvHsW6@25{n&UmwFo$eE*a*jQ# zC+*tyaMrr;OKW%ic~a&2J~X%@<5kC{H>_XTx~koDkLn4W`Z8y7uji*_dEAwsH$M#D z{MxnQuB3KK+rdeTt}y$%>wQ0J^ZM$n*`abFI=5yO8R|-Bl>4@e><+W}epfi$dC|8( zPn*lUnP;WrG<i?zoOv1kx6`?-e(}u6$9Il>v9e_U;^?+KyO>MS|FkGa+{7)Rmb347 z%=^F=y0uVyg<!~OlWC3<_bg-Kda<}Icyo7D?abnp=d`5OE<Vhb9Bj;^#&V2JJFlew z(v2wxs$JyU%cCVWPVQxVXBDv4+-bJR!IE0O@Dda2ZJUy<nJm@k^Jofq?$4WbHFVFh zmnm`0rHf{NygmDgSN_8On6%T;Jx|$pO-lZydxiZ|?4-pLSLU4)2n=x(GVf_^s0|B~ zJ+@iiBl5rjxh3EH)}Jnn*|_JY_`(%;BHQFYR0{6-zpeY=>`n2leuu*DFL-}s?V@vY z+<I><xg=!1Xy?t43(5szr(K(GcT}BZT6{Q}->@dJW82(<3ksUI`?%d|Bwk<g%aqnF zO@HvtwEo=`KAw*|91ppzR#04U#eJ!8b>yki$lS#p41d4z|9WL}TIAT|hc>4~I#Typ z=x1#ylHRMNXVdU%<JG#eTg)C9*G=UMc4#&#_mGwIoi}@i(8q+%Pg^*wuD)emaO%-w zQ^uk#3H=-G_p#@9PrmG5H|tTfl7Vu$m$PTWlZ|O#FBt#IGWow@*VZL9KO>4cKIClD zz4=ip>kq>t9^b2uHRe`_=4`XpSm5(}&SGa{`Gu*cliiZKVow-Ze6RGJtvpe&^Ne*o zqlv8gBE`q;$AkplSt#C4zB#XV<MCAAZ#PYCauOzFzuA&v_&hJqtbF%dmF&DD-{g$) z?rsR>HZqFs$*^yU3}Do}AtNB6^YqG^urG@&!d7N*n;yB+np*y7^3IH@LXS7DsAGQ1 zHK!*t*5Kq$Bi@T_IwJnY>)aUsJa;p{AJOi@5m%-d<kkFq{&j(RRlOxEi&m!uUX?G8 z*<Lui{MdoojHfL;t&_hf1m8E<7&ZB$#Jqm>mn$3Qb(`M2^tE8q(Hxbx>nk*>x|Tok z|5wbu+CzJB`$yByb4v1emNZS<AlyD*TPpM{cjU{38R4mlOO;wHG<!R~F01_4xTmcn zyGeNN%(%rRJaea=+Y@}In*Z`LJvN6~FJHYm;&ktG(b)^?iSjF$FFVgwG&0_Dr<qkv z$)kZ~m0CuL&+LU)?oF7QB-B;IqH5^9F!oT-9?=_;^Xndk7CNhGUSc#3|7g47`3q(i zxi4l$Nk(e#+~0iJrSbKKOk0)Ut?l2+X6AFwO<TFIKJnlr#+z@qIok*2>f2R(VBB*u z>fg`l)3X+D?Uc3Qu6p~_dX-F8x5hTXiFJ3Dx?R4u@cQdrjkoe=Ztn22JadnoBP{ig z$kHRvmDO0PR!w^tdD*0Q+6KQ&*)o+Y$6om-rY*STFeC00_u<mwV`|^mi=H<BmAvxH z>ors6i?T&IA9N|rb+|Xpf8MV<i%K3J>P$K{b<(t#lD2yz?|y5r_UgD7(X^-Igmj72 zyXqkRA9;1$A+1Yi@boD$Ew_ym`q@_2Ez-E?Uv|ffPc{uYM~~)kUV1g<x<%}CMd6yX zJ3LSPOcpL)u%Oh*%xF)MU%aTXq+L>7^A$O*SN?tJ>Y>rQl&$Noq<dZ~_`M`x!$a1P zD}jgjRGod=*Szp6s0dr3`u0}D^sAfaNalLn5fpsdwXEQp%$={EVbx||?VssbzW&$m zeY}S2g{0%<tKH%Y&o4RSZTE2N{3$YzZXWmAcsa^TaBu9_lglQ2R1Ic`4|u0DU9fQe z@!5=wNkL1af3D!=o3FQcgLv6#w%hxjz3>vWI`QCKz##*bDVs!Fd30|xM?J7Ocj|%* zOQpvpU4fjRv;4AsU!Htarxoas@%<RLe(2H0SAK#<2TtAEP@{8lb|(L;eGewyV`kwx z*;1r&dFrI^E-p-}?@CnvxK(WW_0Gmgx9(H({v{u`n%=g#aHrPd(4-Z6AG+`8<J_+D z{dUv!^mEmbi%-^EII~w&UC{fl{+TmV*Zeh|^TIwW^7l;bpnGqBJ1WiX@Q(9Hd355W z*q_56@;McE&kL3Obxfd-cdy{7RVlyuIimHfr+(9l7P=tAeusxcj&<P)=5Ei-1Jc6D zo!mtaH!G(v?{b~1qoKELSvsqt$!Wg7sYUN6u-sp8$za~W4vz(bnqkKu>nuw-AuY_S zm{UEW`EhT0_x*(CjfGPqJ?}MqQk$Y=bmUI^?b+YgojB)p(paR<obf?rcEc)B(Ta*R z&n3sp4`~IQG~sUNNHvb%$7*V_WV*^?)9!yqPx^cOs64P>*Y?zRGwmOJUewj~IQ061 z`uVd{enl2tz2LO9=c2{#X;Vb~{_Xs1EAVUmt7booRg1c|zg;C|rCw)$!t>_r)t#M& zPt+P`OGd}!`S+aryd{2tOlTIHkR!|9^_{<-y;&-fFJ|egGr=+DQ22vKhg1)%=)FpR zJ15&HMRnzlqUQ-^TdsXx6{pZI%ahXTXTT}zrJvMWzkFg;`RS=qGdsfW1f|b>{E+Fa ze|zstSw`2!L}reLj}}e7wR5ICP@e2D-{se(EeXZP3nsPIOYvQM`2X<C%Bl52Yd1dL zU6QHz+&*TR!LIa~{_YdriLz>XhwymRO`hf^FZZ{kK~YmfzA<WR_~A?DhyG01vugH+ zN+rFDeXs9x<cH*)yuK&(ag9m2(it&5roRHBH7b6I0<+hh`M5NE{_C3ENjpAV&rMd_ z=y*_NQsp&{y;FZLy|dZ*9q0S(Ge6uScZEqRh2>j6@?LLs{b!or`iqYZ-43ug=~dN- zEzQY}bxE$Mj3}&2;{E$^I@kPD%L6!ebTph#Xiz9|%7{AIcHf~h-}j$|!iyJ|)*pOd zV8X!8D<k?sQsG3x2Ud>o1p#Iq50$Q&OaDkY`E9@H@|E6Bw^ca`nLqsE;@;c1qhb5^ zPmK4ZS(GH3rP|Ioo6ldNP&(P_##$cl&P}_tayH-mBY&>#pns$G9+&6tuT-?&?fSp+ z=gRr}9t2H08L~R`;Ms#(>S2$YAG`Q)owvHNwM)d(m8VN`&O6EEgS)xJ-95R*=dNCL z(`x7M1>rFgaX0>T{!b2hAGN#TcHaE(8%xged|t*9DIR@2^hxA1m%GBR-0!>259{vm z_x(O&{)^A)Z-l(Av#K8X?Xh!<(JIr<FGtm5_AsnE>-{MD`i1Q(oab^%qd1he+pGVV zEv>4ldh<oIRA+<b0e8X284e3CJ-piAwob=2(dOT`dA}A<Rmv@Dy*%-U;XcWw<==g+ zz3)!U;@i8+|KJw|V>N5%(3ifE(Pu2rIc0i1kXWaqC%-{|!p4=+Dj)fe&K8aiT3LF2 zS+dN^^J^2MW;-_a?|RqV_k=f7rQpD%3c-d%fg}~K4*6C4Sik(c@BcGqzT%dub2$&b zGfrpOTK}m3w*!OdC#U^y^7?qb2Xao)x7lQM<-zReJb{y^um73EaCYC(73?wlBPV;k zIceyY{Y=qf`}VgSUAM|qjLq^AuGpj-CO&EiYTv_aqR1C={)xfTsh1mHRv!pW)>QOr zUwu+9i8a+fcilYs*y3Y93_WYy7X=$+97^1i`O@pGr{4nq%S_3$8beQ~#qkOqw>^DQ z`I*7Y_y4B0|GQ(h<l$`rqhD{jXUDE?7OZdHP<H&ytu?CmqYigYxbbJniVrW{SvMQ> znlI?)Pn&MR{pncqp|caOPWsH8|DCt?q`P~&%8pDO_Wqtjv$kCNTlq&|lK#0WTftA? zG_U#ROlAIdM7=+n{qN6Ras2DoDVbhMvS(i%(s1jyeRnA%_fn0<<PDGZ9^`6lUKDVx zYPT;lv)hjMH{STmXwB8$b}-qf<=Ko=#XioZCwFekXe>P=Dm;14^A5FV8FyZCFG%GT zJiJ_B-&|co-`$yCO@699e<rKUQBhTQ?z{2&)m+j3?g8eSzjRKnzPr@?w9(@Udcq7X zQf4WyxtpG!lk__?rS&$iy-#}A%g?dmQIG$;&`UcL&bIyTEMcSD!A*C&CiKnt^OI5X z|6~6pujQE?#1CuK2Po<Z6-m_`?N2V(ET381|CTu>aAHJ>RAk7uW$QHFym@Kyx8&v5 zpZ;fGPg^%Rf2ZD59_jV5cRRf2?V8+_(A#l(j+L&x?Cz6aO$%E1p00acx>Z~6@9!<^ zc=GGNcAR_>FFj9Q&ar!n@xLV}j(bmyVvn@F`RS^V%&~6fbq>=f?2xU^epb~P@yo4( z`)%zl$;4T^66zbmHI~GDHWjwND`|8z?Wt{y*sOM!)SXWzvHNa*a!qae^5wUmMhaYW zSGnPL%40I4c;E4~PyhWp*D&5&v^RENP;d6~UUjJo_m>>q9d;*tx4fM4HLK6X=afdU zW8KQ2p3rvzwQNqdcTexCR+zx}G1OYiaO0uifP_UUOCp*a9S*Hlar3Zy>AOia!fBEO z=X!=+zeU&?EQ?+`WfgH<;a(ardFkTLf2ps^gdKZ>Tk=E2*cN-QXXu{J(B4p0b&J12 z?aY%XJF#hzlU79hUu*mHmzdP*@>~4T@2*{LzjA8U6suSHYH2(3s)`zOH@tQ0>3vpu zZm&t@t1X8^|IFXXZM(*-`Q4eP{;nzZagnXd|22BIJ^!5g>%H*f{Ip%mzb@VR?^K7^ zM%TreDr;3FEt%iWY+dU0E0wve|8d5D@2DdyD*4XL;XAXbJ8s7+G2N2sdp2=RFLw)h zawa-LB3q_^^SrZjWEz)gdf&`(ij&A%@{WV&hrvAKv_q=SjFlUnT~=;3XuYr^Uxz*Z z(xvPvP3*_(_e(Gu%zsyQ%<bbV_v5EU3ci-fyY^q6qMza9-r?G%p1Mfh=H~hH{&Lx$ zSiiqo6s5T9%PHN$?@O0H4*GR`*8*p;4LjApPQKb6G>KpEsIP7PUzua)yAMdt&TA+( z<lo!4!mjT8k*)Ji#RdgUFgoO`rW|%<h2zmyZEv1n`S+`)JrM3osJ|}U^ebVl{91PB z4QF=pS{V90;Fa+#Xj;4DM8k}T{~6XbFE_Y9Py6Jiw{P3$Wxew8{c$~ddp8B2>6kq| z?_S-W$gKyi@^<umTAJRIzT~&Y%uBg7<?KfOZ<9Q4ytHx`kLTXK&__Gfh-JgnDV*%j zOs{{+jI;N=fAi!S(Q7Kvcb;Cf=8Pz6Q?gssbg6aWG~t<#WVfH)kg2j@N#(qCt)?F` zT)8LAo~-=!@0!1rRtxrQ-_rimP;YTfUjLQT`xw>dJYDzc#fCe3j&3-0Z1K~l%Hh)z zj^y^PDVn+ZvBRG1(<(CA6`tBQD+TMKqfhU4^ja<d|HJdb&N<3vbKiRK6;{1tu+^Ns zx6h$NOT{2wRdV`@XYSK=?gi#5?Oo65+N7&!yH(54Ub)2Z9E-y;osTRJ&z-%s@vhMO z#VJR!*H^@xx#Q(F^9^6{)ffNwpU(>}eeHItf4Qvw{SODZbCd7?x4*er>ioSon`gG= zx@Ko)ew)%(`*1qvn)~tP^M3u9>tP@E=H~8G>Y-BVy}vwOr~GgHpxx3mzfM&5tmU<5 zi<q<5)qgqM-LJOu=jOYAJmvTPIJm~*%eOThrNY0zDFuHkdArZb;rL0hH#3bA&T`6i z7P%IknSXlfUy(Mg90!&ehs|zFt?g*a-z|81-}%TFoA$c~^LoTbR&Q@D*U{NC;hXEN z)<dnbAH&&yUSIo_@yQe3&7w0(v|hI@kSejR|8Zj0{hlw!)};SSKd*My+EnwyMg#R5 zlk_((cq{K_Sa^5U5|?d1iX)bqFwYact#G%pZkv*B__V&V28O@hmkjs(vJU^X*{yPm z|BkP`0tHQnrE8iLtXR_|cUFA!nt$#)yIAg)wkrp8Lu{;{oHW0-;sdwEKWl;RZ?YX0 z@`VfDpJ?29cZOfB`L|WJ7pAOz@2ggJXXmX0OMiWowRk9D#((}fr}T=ZR}-G~ip>94 zoB6~1XNUB=`TIV<%Cmj4Zq>%ZzaEcYMRa`RHR785cZdEJfmkE0h3(=C-aK3S@UQpm zW&8K&^lJ2Y7kd@C1sr~qz3yY4?*^L*d+n=V9=gY#W42O*$M_=u(Iq>pV@%CztCs$J z&$eT}WY@jD^J8DH)Boi+_3HJb-!^`K-xtXq5PC7YkA2BQhxx25zu)b9A6j{T|Ly6F z4B31of4h~>WXFmAzHjo1RrT2VgOT5s+&|PjLqJ*QWw`L9T3PYQ`WiW}9&eYDUAsxa zFszi<S+{}p&~CX~I@{V~cd&Y~8@!1URSTQORJn6?cb4yEkCh#h0{2PUc`e&}{;I>K z_Q_uR+c*!ErOZlPShs&3H&aY=-Fv6QTa?Y38ushWRjFRlxa0d)uk9CCiBIQHoh0Pb zC~T{jk)FnVAY)6^l)2SMYE{Cg^oF@NGo@`?V0-svirPVsxt&WUEkE+L#HmpCqprwB z{_cpld#hewh<oIe>_30s?~8jD#BVt<NxgDsaD_(dl$A$s9NOY@ZpJHh(+7KIe){Y^ z_116Y2D|$S3ZA}p87a#1ADy_g`XoE!6~TE=->q4_Bf#U4W&6|Tl{@Xuu6I<~d1-TJ zf&<T`t^ZUcTJ9W-wLWEi+)Tk_eWL>R>%Oq<lPAS5O)>wF!O8ac%!bYDn&&$t<m-s3 zHEtC=!kNMzb?ouC*FOx6jQCw+^XAr^{(diB+S+R4pVQms$@xwAGUudc{KD<$qhBl* z(poe*yraax@Y>W;f#ow6Srj&;Ju%W$IedFoN~Q9oBG;z1%iGUYBqh)M|8e!sy?Jlv z`z9X9n(=-9#8Bp(Y5Z@tH8_-8y-4239@hJ(oqc_neu=QB>Xaw9XK!?r^6frewzqFZ zp@rZ6)JJj^h28E?^R{ZeEfN07xw2r7hUdGxk*}l@zLlI!y`LM|aZ+QlUeSxK%UC07 zcOD1~oV85$bjUNM_VA8Kos+-Y1beTY=rgymHjX|n+xYC6;wdBNDZZO${BS>BwB%Lw z*~b}j1{3SV0<@wSytBUl`M6^B?B)DCT1o%ID-<?)oxAbntYQ3=*Na2aGdHDO-Q2Qr z{k+SCKlhcJtU2}b^553NYcA26=T9_VToRtPyy;JiN}WQ)=>umSuk8KMvu8?A)p}F0 z)qiIl@L`*?-)Pk;|DQ`1rTfiPt+<!5lRGW+{p+5r&OLV~B`#XA;HT&|fx?|@7oV8? zNT;_n%l21YhQyu<j)&3zw}{33{(Rm@Znwmj?HjyrGNl~e`1QcA4dSAinJYVQGS|!v zmdMvxeQCxN<DCIX`^D2XmimRht;-LLOH<6{T5~&#GoD4KYJarkqrcnKE*7oiS=3R; zv{&lP6U+HVQ@GlDm*sD<TybT}f#3Rz-d+?6ar+q*wDJgxe5s;nq1m+**PrXoR!c4X z8`${%VCsDdg@%{@IUU=sUw_&nddByeQqacxY+d$;Z4aCZ|Ji4<_;hCd+bz=>1;4T< z%XBi?%7)#Hkr6Wr^t*ATzx`N?QPo2IY45z>y}i1oQZV3ymVCL&m6u||I<L~tFRO^$ zom$iLEFhk}Gv`<J<|n=>J7qs;ZP5HHZpUt%e&pmm&odp54|eVpk5+N;ef#<J>o|qa zZYE0?oXltn2@<-vCVt}5>texW+5xk|xUO91<oWUK?aR!w@7Cz_rp}5FdU$Y&%g#!n z(%C8BS1tX@_-CQ+eA6;xYhjIG4R1-FeIBiso2LCT{_u2t@R{6w(_7cn-PD~j=e(1& zOyruSXD7dLeaLvF;WXcJu|1Om=TuF8=eTgIZ#n;-d)BMh_=wI~7-lJKd?Cq6beWfJ z-Rs+0!jCU+lbkGEb314Yd&A%5`69C}b8UaobA9z454SkGtv(OUZk+n~D|VY=aq+AF zs-p8$8C8#NKgiK~z|2lHo1gn@>{hqclc$OGFMEBO`72MtH=iS7FTP!${Y@Z!!OV4a z!hze>Hf3qa)r#Ls?KyQzH`A^wp-J6XDPOMILd0Ki+E%YnvHJ-jAJQAk+1uVutGT>H z&Dct!XPJ)auiF>qy9Nh4>fDi8!~N{}jaidy?;WY|4@}y%TFo=?M}^IfCx#w#OxGWj zoRxbbcIo`Qtir`_R=%CAuwm6Mi9f$Lu8rDRasElw*T<{QJ*?3ynf~&W%#+0&zBR$p zcfTLooSb;=s#9~mCAXC|Yo*NmBS8<k#lO$}nc?EtIrZPA1((+BnR5I0gR~o+uPkHC zUKLzP_gN_@kj|O2RZ{A7o<U_%q*=G=VfT|F^OiIO-MZ*7v!VX%XMw|}x>K2~Y;45u z2g}Y8{kUl96lPhDTf4H&BqHR$&b--jNnAy>d4}S{Wk1C8A0K*cynl`G|Ldy-0y(BX z|FQ7eoR>e#gjQUZ?|gIo^5cmIR<uayyi$DYn%(F1Pceu0X`jgQWo=ilXLfxI<Vv{s z`)k^Y&-yZPw#vTCm_HqsIo0s#o1WV3S(8qkW`EA_`~1b-3roV+7B|0{yF`8d3yH{T z1IE>RdDqO(J1Kc`T6l>~<H3fUx3{;ahxq@lh`;W?*GI})Y`^Sm(d|9zk950dx3=1B zSzMyBAVBR#S64wbm$H)h+T718?woLC=~Ft^)0MAKuQVkudE<3+uIa)vViwqVZeWPx z2{e%OeRJqS+u>m0u9Zr%;w=hd%1+xhw=(j{etzq4*8Hvilk^2SKL7N>D!0fh?|pYD zaM8SH8x)r{WX-$wbmG@bQx_!#cINPWv0l%W-5qxOvGHT0gX?nDX1g8re(bvM!hccO zM-6H2J<Lz;TtB5Tf4hcPT)I|i&()091L~)RZ8n@T-)`fgp?^Pg*@5>fekQcMb-dkg zA7%N<pQAPX`qZV{-ZNaVIlu4!(wxZrZ6e}~?_UZ^sC4{1c}_Sk?8l`gdyhL*w@%-( z=h5Cr>uRF7#B}a-wwqLD@UQ%P)Zwm5XF3b>QC<%9yh5S5$**cH<~kJm);yU1eswwL z&Kbo!C64apzoFy9^+KuB_(V)^_k+R;#{f;MT?J+Chu57?ebu`7O_AfVqmQrlZ+n}1 zddieT3Bh0E^2C$<I4_7?*n8rcRPBc@9U0dTYeYAkpK-Q!VLsceji<i8Im@&ztHPwD zB;wv*ri?6=Z+yN|GPj&f8G6gpYW{6=_-Xh}qps`;=hn{~Jm2o$^KLQg1EvoijMEDX zEqyc+oUd_J{B(7b`_8z7VM@ZevX2krejYub(Woymt-Nk^cGiM#JiN2cI9GQbOMAP0 z?x%;W7KTwtd%1PfGyP+dy5jvf(ktZe3w>k?dmZ*hN_A&7`$3-n=^OcbbPJypa&1q` z{vfTQ{;^qO$yad>M~4f)TYCH+O^^>z+uQGQGBNaoKto;~x7;l*9%ZKe68BW@stEm8 z|M8$X)OV{>jpKuPAKy)vW7(!3zwK+U)>g5ue`nh|fB#QAdHdI<bT5Ifg0j#2>e4p9 zCVY<J%Ur`_>>g(I<kUOw2>BzGMLGX2KH`Wzv%TWUXUomX7k>tRd!BM3((~?mcQb}p z6}S7|e(tXR@rmo{^YcfeBz_m&%h0em<ZvqC-^H7=bPhQyF?%LGV!UxWLiXJsq2{eg z^V-iSnYe!vs>qh+kutM-`JQK@#^c#LSFrRR+I}rdKPf*^e5<8)P1c$4qT};8%KtvD zmOeE<Y`xB*{N3f#jhEWXT+hCHnwx)0UZ&Eg<#Ydrig$mNbZ1<znU$7NKI7;f`-f{k z%(qegVYjf>c%A&D%L>jpx8DEJe5t=-i^XHZ>2C7P&pw5JU%X?&N6TPkm7h6ZZ<nXI z=V|1{7|dsO6iELk;2Sgh-j%N{3)<h6)=fQbJZVOyq6Ui!lc&#Jo;gQ<bxuC#ePGhe zP6dud1@^n=eSa2axotx#OY?!l9oHqk8@2E@<ka5T?{=hGqGf}iL+v%~8|BhhnzPh{ z&p-eC<kNu(l^G(>ymoHz{+SuP`b+He8#+#Drbhza*{r#H!1L(pk0E^vWs`N2?iTXp zeC6ic=XR-Gj(6+%hi&blRlR+If7Sat=Wp=0zu4brSNHN{c&BXA#Hxs#m~~v8YU_LN z-}~QU@WE7*eRc6N`=5b}Ls;g_wQ^n8{(p*aj7;R;uA}RIHz%xr+tXjR=WvJWiDPRb z!u@2<ZcUu@{^Wz}6%*c@em}<Z=JvFPjenl6Z}^e>z)mgw#0%$KORY!jpY4}uUj1rU zJ<(|Gl%vP0uRc<1DZlkzD_c=wlauq-%=ed*X6%Zayp3VgA%T_-v*m?*LOON!PK)Ap z+#nbgFuSU`>FAfQvi>|0ia$y;^_SF4WJ+AjEzVhy>o_^wVBxWS)u*R~aKyHA9;~X^ zdA`I+U*+k^i8CF2KAbgAJ-x?G=)?7EmYX84)xUCROHo_%z*BL3z;k)2qZco^96Hp| z#b5R$d2{51{gs;bM`q1^ba{GYjR^0?na>OVuv(|29_^W^buwbvik0`h)p=U3zrVYo zhxegG{Bq}Q*$ZCluV1sKJyb$Sr;Iz*==m(mQ%8Do-Z>`jIlf6#DDYgQa`CD7u38Dh ze~dq?WiL0JpO{fvBh!52wAmZeZ_hT}%qcLqUH3l!d+^EGDIe@Rofud5g-Sl+`?B&E z(>sAM)zu!KUM9SM+8Te2!TNLn=fUS24FY(3xPC6)xWH}c?@PZ_y&l`F<8zr1Shb}^ zyJ$1B#GIMh(c3mF__Tl0S<u|Nkte~<l*{j5;fEusHL4u7_sT@qb|&Zxc{Bd*JbEqY z(jtkfv!z@5yjHS3-S9T(XMr(SRajAn*o&s*j72+d>$~TsUlZ19mNmPdad)SGz54rg z8&++&?eu;6(R;O5E{FPNmAGB9dFgoI+NQ~C*Sgxe=xi5QCEoC3#&(I1Z+m-AzTf}z z?ehG8fBv2C-`@VadvkN_egQ{+llNTDK1|(q``+g%0w1d4w?A5)>(R{kG_F9xQ1i)! zR+nyZqZh$9W4fN{-<RKJCbhLag7;M2?cP~}s&aY(t-pjC7}tpg&Cznwe!b+v`r>od z`BpclUs$1bIM6a<_v%=uztwZP{@X~#3f@{1bUgLaP3@Fc^{ZU_IVW*WXL{~=<lIu_ z&j<Ma+xPW{J@?=KtLRSjWVNiMa4Sj0qIu3WdY&D%;m*>*w(Y4xicCT!j5c34^!`Xa zwQ!mtx7J0?)>D2Trf++?ZdI$zdbuF)+F!T#?LNfeeR#&x2@KI!m+uef6Fkfy@vr~L zZV97T`|IW2_#WRm^^WYVTf4JzSIA6QZ97+0*5~@4;<!`yE^m1L%I)xmIa^|-SZvKD z57-@TW&3g{&v#Bi(y2og@AUKb9QJ2+JX~_LOlD4DL_u_T(B?Z2PNuUS2;Ooxv48I+ zvC@ZeXMURUOSI`EvdR@R)a}WRI%uXM>8sRP#Oh%;+4gfo+-#njZIN#u$=)kWy?AfE zf@kB-CzVQbKd5-uEjqLF#G3h@b2O90oR2si7oU60b+vYK$Aj6iCWTKvXC6(}`+YX% zWw^CZqm}w;rsuy~7V|Hd)@5{3^5u+>33@xj)^1A{EOBQKUbuVv=FH-oqHaeY=G^%k zelPU;zU`A1UE^MI^}F!r#HUXc678mKnQzfx#O5_~YU1+O4^AI`^{Qr}ep+CC`Kil0 z!mgVq?CYqI4=p@!`PVCjuvLDm9BLP_Oue${(BcUH=C>!jn)uw@a(F5@BML7*n`P)! z@Vm-xt$zF6YtipYM48u{UCnlHvr;;$c52b>xxJBdvW<?~tl*d;^j!7P0iNHsP1)&Z zm;Xy!E7U$a)VJnn__L~Aj!In_CT>=Dc_kdTJ&>+qc=$@cm;GMW_Us=W{dYD5&w1im z<+!9uQZhJL_I0JwgBO)1Z^RDsFaBEhzNX8`G-*ooH=Un)iIW~poyop?;d?jMf`d{v zMIE);43Z^F8k|m^Up^x+F49HETVm?;TY58PdwyQycr~?krRLrHs%%Y9|NkmA(h)nK z_Ks13e*=&9pBm-wCN3teniK!u|2$)P@>{;frfL6QF6u8k+hM5e@vZpewfNT;kM-TP zPYqeUQs;_If?lrq{o0P5OOGzJ-Jz>idnvcqFY<uZi=`!N>g{%F6bm``aL;YM-F{}N zk@&VPeZTMV@11k$!U7AKsb{XvbN3XjPE9?#aNn%vS*x;VE^Su}*!jlWvg~j~<WsfH zUw7=eQ)U};A?$ubz<RdDKmV^Pwg2eG_C#XJhFh22Rwmfy&HkFQAX`x7%59N57q2k8 zTbfT$61Y+Or22uOz$2>`YxC2t>vzqW<NxKP;1glXnC*EJ1%i(T9a2*i75#80>Hi@k zOO+;hjvcJ8R35Fn|JQmS_tU4HwPhPu|N1AS^*nTM6^F&FlBB)ehpa8u1<o#;GhH!2 zG4INzYuhFUUV6HRnbWYOT(V{F=ChN1*4~}DEAJYw;g+Y$%=%k%O0z7!^!q=VA*Hjg z<zl{jW6s2E?biRVPG7$+VRPsH?a0q>8Th}tvDiP`>K9QqktJsF&izc6cf4DD?5ay{ zNcLtkmmJ+!A0##hyA>DLp6%9QIe#X<{&&vok}dsg?-zy0*B_rcZ}*O@0BP@QkzUUI z`<s^XF00@4TC8~m-wL}`cJ@(Wu_w+<Gx*xSHBj}*Es4h5Bj0vzU+19tVD;5VbLP7@ z?yBlv*G*V@b@}ASix2<(YP$T<;bj?$@wS_kn4|7@@SfY9cFt&t=3e{gAkpf@$>-B5 zy$`=hWs?<_bTxmb9&<eD;H@|9G8XQ;Z`YX{YZymprWrVY=J0cneeJdN+$*2Z{}<$E zi=|cPFy1})E~xUzf!Ub_k%!Fk-0lZ$ouC`m6>&wv<nq&_3rtNX{A-_|YbVZBu`O5c z>!OZ#d67qh-E}j&85Ispwe3q?U@)`2VgHxw%P;?(`*rKhE$hCuUgTP|U~c-F^~X&7 zSIia``7?{@{p4S3=0=4%_KAhE@<@e!YK>3$*bt}Zua&iVuH@xh%LWmV7fxpv{JP_s zasTvD#oC`gu7#=0oW4IXQ)ua4N&Re-TJFi~4{zZA{>Z^f$(-q9Ot_QF@y9V|v)xLn z_g0*nA=UBsu<Y@6p}Vtw@ua@C3f#wBocM2oXb01g+jpHh*A~USEVv)!u+FM!RlV)9 zjmnp#C*3}0m62-}cU|`Iy945pOu@mK|2D>cySwL;=`qIT^UwP|2><(Q%f@%U$9?zS z-#X#E=+1A`<Wgd8FAu!>e3hEU!iVBJi@KtwykDL5)#&i+yJx@t+_E!5Klt$j-vwuQ z0;>8n;=GM>+7_5?5j<`6>_OwQ-CG4W*Y@!*3)5a~bV<Fb{>Jf1OE=4^aeiAVC?xY) z>hd}tol1@!>wo*2W*eSXyK%p|*lB?-+m+js*hH8Q+1%bJsh58J*^cuDeM>Y>PWz_+ zuIu{pN3UG>a<wcvIjL*oL+{4f#xmm0w<6ET%~q<{yLR(!uiTsb{!hm5x~;QT9t!@x zqHw*z<;-kd?YQ#^k^1M7p47RCS-2R5?*1&cIa^!a*RJr_kzX7am>#jq{1kaACGbML z%tlb5ghl+=&0q^L*P`baEdLypU1@4)=>3*6!MQ3v=K9x%KjiyfE)V-Gq-tKZ;d%7? z-&b@WnC>;(UH^wg@{97k&YD{VcH!DCD_Gs!e3>rx+?>##^62nk*%t}&J_;U^Pm6yj zmK&OszL<K#DEX$wirR&DKQOj!ReRKRuI=VoHP1gcltaJHZQ!5&VUCwj;HHGdE}_@9 zdd+OU7AWL+?M#7_|KlSX>K2WbbAJ?E*tJS(r-P%~r_ItE=dKa#E8AMe!1dEtP<cnO z@qDwZb;}jM-1)lW0ejtw(~JIoGvBlOP{EWF`V&8%mDAm+y3j>lKH=3*-8WOFv(I@k zQNA#_Q@mh}r|E{!Npof%vvIGL)NPXI(^vOs-F;_eXa7%$l2ZqT^50ZWxSUm)=VCYU zZ{vIE4Miea(oL7;|2<mmaB8=GgqfDuZtM3SB<Jtt`ozh5?!>-U(fN;mNg2vp-P3!) zb<@#%m%x2V|21EuZJ+I#Z5kZvq{s1d!Ex@Q8(n)D*<U(+<kmU0&ueoEZ~m5|1>fg> zN||`TIp3c#wxZ6{@~N*@YO2=MTk$C|>C+2;NW06q*)UDo%(>f(`@+|XmQ#=CsW+Z6 z@^YR~)0<PhfWN;dbY1f~foJ8WrDdK>VjVe5zt82gq#styGGDgxb?UB&;PREd7v+99 zB(A+0^+ou%^R5QN)faWImLBKawrz%tRpW-32^TInt_r_2y~>D9{=NRWZ{N+XE322C zl`!QF?cbRv^vWn>_lb*#a;35>pJurioMoJ{dDgV5J5}A5&tkG}H&|Q8t(&XBCmUfs zN4Db1Gl9TYO3w=xvL#;Of9^Kd<==(1B3k>{4+WZ~GTssIcQKxF>*2+lAJ67-dOlf~ zKHXa1->@X0`2U2Kci(%fj<G-69QC>(w_ILyD}&>f&<#N{DWWM0AKpBC`uDXszuQ;7 zo2?G}pg!N~gzD++UplXP8}1qv$>%Riyf*F4@dYyL{mV6EgMNNlB(U)Jm-W?CY9!vj zkH1_jq`lb0QYk+><^1GpH>WBXUhCsJ&r<KRdWYAx+qE8tH>BvTDLDC&FN3?gcwHdF zxsq=`OR_IVU(;F1+a%)6)V9|9n@>#}-%p{^q`zldj+Cx8{H}Ykl{tH9zlytd!`aQO zvFZ1EEIF3SOY$veW~y0xy7-*xvpd_nCY&s&J1J<j@37NW5v?fKk86IE%`e-k=wWzk z>zAvstmUuPaK3(WeY(%zb&ro2|J~xP5Mh)bo?Y5jvU@pm$CEyFcQ%XkH7j;jXZVGD z)MfqVb#$8SPd`VYW7;JruZjrv9xK-ik(qUTrRJU<&gn6#>n*Nswpy~Y@Qc4ug{8nI z9_~MNH!f;>o7h@iTeIX`8#kk5*qOJ9J!uAvKfL147ERQ=!}#DxppDO+=}{-nRDYa! zqxI0YmNK1PUE$tuC;ZY}`*UsD#Fe=Zc6$Fg_M89em6w69eyj^~)j6;)YQ@<VT%qnk z-~V~eu)cArlJU}=27^6{GUv~DZ&azu@6G>y&VB8pfG*u;Ui(kUqFuLp=5}71cby|t z?V7~<pQ}ywM)YVWAH9_6wBf*nqfzf{ral*(C9Atg?eCO_tY@T-FznhA<!GSuKjN9} zEcFwtUo(EY-M_&6E$f2k{HHGycb;GmwQDfgSUh)5p!fkc9-c?6R^OPdes9~`+5K_t zx=SfrZwo#Dv*xbT6Ysfo=XREsFaDMJ_o4O<<40bfpZ=P;&t69U?YkeRPiDm5)2S~v zF<z21<JFmIU(;kZE9g#(`8kby>E4P!6Z@z7le=8Q`R-)ZKWCpLFZ22D+~m#2bnjZp zUAt;;d~VAzGxw>1{~RjURv#~5kq=l`uGD(+L2Q5V+Y9Z{GU-N1J4GjLUH6zlPFUl` z$D?U8BU5G<KC-$VFB2Pe>cF+kz^|5OFKRx_IzQhx+hD)zpByW`We$z+X1Q2#vTj|+ z_Qu?)VTIVgr&U`++E{raCofK%P!Y`hM!T&ts-ceS>Uk%9-DUMRPu}**-88jzd%?wb zcgvI4YCUya$Rw;FyW#t!&#WddPNbetiw-&vl03cZ=iILo?dEh8$=%vte@|g+h>V$h z!_mGI?qa-V8K=J;QT()gsmH$Z291J8^_Na@I{1EMVf}Nu-B;`GSB;OB^LKB0P{cd? zwCd~P@|N^T^ZLZhj+Zt)VfFl(X?yt1>`ljX=l*s2&+PhlKeNfT6NiJUc2^w!&$W0{ zop7(LtCB%KuZ9C_cK4?(>-IeAO+LYtE^;7+&*Q=N!@MFAVsbpML+AQV)U;7uTyrz> z>&rw*4k_intS1J{Ms70O-Pj*9O-MX*LnA>TywtB|iol7)=EH?^_FtT}X7$PVx2Bsu z=N$@jTweG*c>9)oPnkdGxttBcPyLc^zxY;*%RTap))eC%%uM@?{(oKlZOdZyS4T4U z7mFUd&cML%-*(Hq>D3k=r6rfN^)WIWU{zpvVAyfc-9c65O!WQt^2J%k{1u&D7N;*y z`Y`pjkE1(R)RQ;q?5P%p8~RgX=Wr~aXrZ)JLvZPdIg2c}%#UtU;TA0taB4iLkh&sJ zja@^C<$((4Y0hgop0|bnZ&R2sM{2QLwC{{RL8S{s)yi0}FPOT>b>>!%?u|FxJPR#N z7HLlGh+OQVq`At=HQVlDS00bJrC-eY%Wn1A3!KIE4BFPca#@=<X@!%lRnTN3C8?nK zZdVS!-XLC~F+Wqw_hG4IvuS5<TPMrrrbn44D-u$&M2p>BPr3=~iF-LJF0xs1L_)ws z%E;!$iZhQA9NO+aP4qTUmbDZ-6BJrE-Ce52^|9n5p#x#POBXyS^$$4t>g$4u*OxoG zduI#qtjM~1>afU}7aY=(XD*pl#LKC^+urk}_ViMprQ3vBi=2;gDf4za|Kq%$77+O9 z>7-O?_9gB+Zlt+HOKDdvw%;}XM`7&|-@k3WJ&)$kKYBKReWv(9))uyMjg_u4q83V@ zvdeYS_|MA)IaKut+b!K_dGNBq6!kmqUtLo|moMn6Zk)UE2t)Iwv_nqM6I`AxdZu2% zbUa1H<Wl)u)n2XH=Jysw`lW5NnKq$&zE#kxN|#6C9g}xTKNLRI-z>l_##pYG^dsUU zx9LNFtIdCoihSDWb33&}FmBzs*&hqGFb6Gl5OY<Z9<EyM<Z?e~HTU7veaW$*`$NSp zPkL$jnDb`&M4cN8mqkjQI(pFT%AW6k<{b0-a-+BI>7Gk{o_F_F277ONT3~<phGeu} zndjXUli2ykqW{m?>2Ocr&dU!^FJygfn3z9P;OBMa%S~S=9-Ze9bg1}`ZO{DV`-LV4 zh5L`p@9h8NWjOcPlyyw~t-C_6ZB@J?q->EDz2wT_@^-emYL62SYc}j_(g?1!ENuzR zTe{+@t=Wr<>I%L~0@JO1k6yTu753ft@{`PjxywFVPnJCKdQHrUb!Sc-$O-IE=Jei_ zd(>2(ts>)=MVi!<NXrL{7oKz35OL~FOv`#F@7U7NjLx-PExU?JZ@&ne)$=2I|AhY3 z9ZBJzgH6|R-QRKI62r;=EJe)~HH`r(ZR_*%-oKNVn?El;?!M1^`42z8{{8&>yMK_$ z;i5eXUYl+vZM`Y$H~seGuRoa&23QF79u+<rVm0~fQ|_ZdJA>9<l|CD``|{hb>>QyX zJ*_^EdHs)m?D;O_p<x*Jsq4DU^R-8A>T-H|d0m<`am^EzBw_Wy?-m^m8Xb)m9tCW> zZ}%K?DbH&?Tj5@u^GM76lhW;wvT4irtzJDZ^v*4tmGkCG&)wX%tZKy`Uag#D(XCrc zt`>V$vEQ<)-X+<(Hn+#=;>~16=KZOC#>bz%ds?)6Zg<S)osDyZ50u9LbQGxB{D{GV zD{|_+W`^5!9c+ysZXY{bqj$n~jlzw+mfwPT7#JEA-0w_nC@o=oV6%eReeYBDHH)A2 u&9ZR5rumM8!N_s*#vOA!*3P&rD^}#__=B?`=^o>=OU(gGPi7S{F#rIvs%(S+ 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 832/878] 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 833/878] 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 834/878] 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 835/878] 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 836/878] 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 837/878] 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 838/878] 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 839/878] 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 840/878] 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 841/878] 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 842/878] 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 843/878] 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 844/878] 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 845/878] 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 846/878] 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 847/878] 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 848/878] 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 849/878] 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 850/878] 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 851/878] 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 852/878] 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 853/878] 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 854/878] 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 855/878] 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 856/878] 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 857/878] 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 858/878] 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 859/878] 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 860/878] 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 861/878] 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 862/878] 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 863/878] 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 864/878] 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 865/878] 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 866/878] 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 867/878] 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 868/878] 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 869/878] 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 870/878] 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 871/878] 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 872/878] 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 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 873/878] 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 874/878] 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 875/878] 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 876/878] 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 877/878] 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 878/878] 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;