tiddlywiki 5.2.1 → 5.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/.eslintignore +5 -12
  2. package/.eslintrc.yml +17 -1
  3. package/.github/workflows/ci.yml +3 -0
  4. package/bin/build-site.sh +1 -1
  5. package/bin/build-tw-org.sh +97 -0
  6. package/boot/boot.js +44 -17
  7. package/boot/bootprefix.js +1 -0
  8. package/contributing.md +1 -1
  9. package/core/copyright.tid +1 -1
  10. package/core/language/en-GB/ControlPanel.multids +3 -1
  11. package/core/language/en-GB/Fields.multids +4 -3
  12. package/core/language/en-GB/Misc.multids +1 -1
  13. package/core/modules/commands/init.js +1 -1
  14. package/core/modules/commands/savelibrarytiddlers.js +1 -1
  15. package/core/modules/commands/savewikifolder.js +1 -1
  16. package/core/modules/deserializers.js +7 -10
  17. package/core/modules/editor/operations/text/wrap-lines.js +5 -3
  18. package/core/modules/filters/crypto.js +27 -0
  19. package/core/modules/filters/insertbefore.js +1 -1
  20. package/core/modules/filters/is/draft.js +2 -2
  21. package/core/modules/filters/listops.js +2 -1
  22. package/core/modules/filters/lookup.js +29 -6
  23. package/core/modules/filters/prefix.js +30 -12
  24. package/core/modules/filters/removeprefix.js +16 -6
  25. package/core/modules/filters/removesuffix.js +20 -6
  26. package/core/modules/filters/search.js +1 -0
  27. package/core/modules/filters/suffix.js +32 -10
  28. package/core/modules/filters/untagged.js +1 -1
  29. package/core/modules/filters.js +4 -2
  30. package/core/modules/parsers/parseutils.js +2 -2
  31. package/core/modules/pluginswitcher.js +1 -1
  32. package/core/modules/savers/gitea.js +2 -2
  33. package/core/modules/savers/github.js +2 -2
  34. package/core/modules/savers/gitlab.js +2 -2
  35. package/core/modules/server/routes/put-tiddler.js +1 -1
  36. package/core/modules/server/server.js +37 -12
  37. package/core/modules/startup/browser-messaging.js +2 -2
  38. package/core/modules/startup/render.js +7 -2
  39. package/core/modules/startup/rootwidget.js +14 -0
  40. package/core/modules/startup/windows.js +22 -9
  41. package/core/modules/tiddler.js +3 -3
  42. package/core/modules/upgraders/plugins.js +1 -1
  43. package/core/modules/utils/crypto.js +2 -2
  44. package/core/modules/utils/dom/dragndrop.js +8 -6
  45. package/core/modules/utils/dom/scroller.js +11 -7
  46. package/core/modules/utils/edition-info.js +1 -5
  47. package/core/modules/utils/pluginmaker.js +2 -4
  48. package/core/modules/widgets/action-listops.js +2 -2
  49. package/core/modules/widgets/button.js +1 -1
  50. package/core/modules/widgets/draggable.js +16 -9
  51. package/core/modules/widgets/eventcatcher.js +34 -30
  52. package/core/modules/widgets/image.js +10 -0
  53. package/core/modules/widgets/importvariables.js +1 -1
  54. package/core/modules/widgets/list.js +3 -0
  55. package/core/modules/widgets/navigator.js +2 -17
  56. package/core/modules/widgets/radio.js +2 -2
  57. package/core/modules/widgets/scrollable.js +11 -9
  58. package/core/modules/widgets/widget.js +30 -14
  59. package/core/modules/wiki-bulkops.js +20 -15
  60. package/core/modules/wiki.js +39 -17
  61. package/core/templates/tiddlywiki5.html.tid +1 -1
  62. package/core/ui/ControlPanel/Cascades/FieldEditor.tid +9 -0
  63. package/core/ui/EditTemplate/body/default.tid +2 -2
  64. package/core/ui/EditTemplate/fieldEditor-default.tid +3 -0
  65. package/core/ui/EditTemplate/fields.tid +6 -4
  66. package/core/ui/EditTemplate/type.tid +1 -1
  67. package/core/ui/EditTemplate.tid +2 -2
  68. package/core/ui/MoreSideBar/plugins/Languages.tid +1 -1
  69. package/core/ui/MoreSideBar/plugins/Plugins.tid +1 -1
  70. package/core/ui/MoreSideBar/plugins/Theme.tid +1 -1
  71. package/core/ui/SideBar/Open.tid +2 -2
  72. package/core/wiki/allfields.tid +1 -1
  73. package/core/wiki/config/FieldEditorFilters.multids +4 -0
  74. package/core/wiki/config/OfficialPluginLibrary.tid +1 -1
  75. package/core/wiki/config/ViewTemplateBodyFilters.multids +2 -1
  76. package/core/wiki/macros/list.tid +2 -2
  77. package/core/wiki/tags/ViewTemplateBodyFilter.tid +1 -1
  78. package/editions/dev/tiddlers/from Heigele and Jurke/Syncadaptor.tid +2 -2
  79. package/editions/dynaviewdemo/tiddlers/SideBar-Open.tid +1 -1
  80. package/editions/fr-FR/output/images/Blurry%20Lawn.jpg +0 -0
  81. package/editions/fr-FR/output/images/Newnham%20Horizon.jpg +0 -0
  82. package/editions/fr-FR/output/index.html +5051 -0
  83. package/editions/fr-FR/output/text/Alice%20in%20Wonderland.tid +3709 -0
  84. package/editions/fr-FR/tiddlers/$ _config_ViewTemplateTitleFilters_fr-default.tid +7 -0
  85. package/editions/fr-FR/tiddlers/$ _core_ui_ViewTemplate_title_fr-default.tid +8 -0
  86. package/editions/fr-FR/tiddlers/$__deprecated.tid +9 -0
  87. package/editions/fr-FR/tiddlers/$__editions_fr-FR_util-macros.tid +1 -0
  88. package/editions/fr-FR/tiddlers/$__editions_tw5.com_doc-macros.tid +69 -5
  89. package/editions/fr-FR/tiddlers/$__editions_tw5.com_version-macros.tid +15 -0
  90. package/editions/fr-FR/tiddlers/$__editions_tw5.com_wikitext-macros.tid +2 -2
  91. package/editions/fr-FR/tiddlers/Block_Quotes_in_WikiText.tid +15 -8
  92. package/editions/fr-FR/tiddlers/CamelCase.tid +6 -3
  93. package/editions/fr-FR/tiddlers/Code Blocks in WikiText.tid +27 -16
  94. package/editions/fr-FR/tiddlers/Community Links Aggregator.tid +11 -0
  95. package/editions/fr-FR/tiddlers/Community.tid +6 -4
  96. package/editions/fr-FR/tiddlers/Creating and editing tiddlers.tid +11 -11
  97. package/editions/fr-FR/tiddlers/Deprecated - What does it mean.tid +17 -0
  98. package/editions/fr-FR/tiddlers/Developers.tid +10 -5
  99. package/editions/fr-FR/tiddlers/Federatial.tid +11 -0
  100. package/editions/fr-FR/tiddlers/Formatting in WikiText.tid +12 -12
  101. package/editions/fr-FR/tiddlers/Forums.tid +27 -13
  102. package/editions/fr-FR/tiddlers/GettingStarted.tid +16 -14
  103. package/editions/fr-FR/tiddlers/Glossaire en-GB -_ fr-FR.tid +3 -1
  104. package/editions/fr-FR/tiddlers/HTML in WikiText.tid +77 -28
  105. package/editions/fr-FR/tiddlers/Headings in WikiText.tid +2 -2
  106. package/editions/fr-FR/tiddlers/HelloThere.tid +15 -12
  107. package/editions/fr-FR/tiddlers/How to export tiddlers.tid +31 -0
  108. package/editions/fr-FR/tiddlers/ImageWidget.tid +33 -0
  109. package/editions/fr-FR/tiddlers/Images in WikiText.tid +69 -0
  110. package/editions/fr-FR/tiddlers/Importing Tiddlers.tid +26 -0
  111. package/editions/fr-FR/tiddlers/JeremyRuston.tid +9 -9
  112. package/editions/fr-FR/tiddlers/Linking in WikiText.tid +108 -19
  113. package/editions/fr-FR/tiddlers/ListField.tid +6 -6
  114. package/editions/fr-FR/tiddlers/Macros in WikiText.tid +5 -5
  115. package/editions/fr-FR/tiddlers/Macros.tid +17 -8
  116. package/editions/fr-FR/tiddlers/PermaLinks.tid +19 -19
  117. package/editions/fr-FR/tiddlers/Philosophy of Tiddlers.tid +2 -2
  118. package/editions/fr-FR/tiddlers/Saving.tid +63 -4
  119. package/editions/fr-FR/tiddlers/Share Plugin.tid +15 -0
  120. package/editions/fr-FR/tiddlers/{Sharing_a_TiddlyWiki_on_Dropbox.tid → Sharing a TiddlyWiki on Dropbox.tid } +12 -4
  121. package/editions/fr-FR/tiddlers/Sharing your tiddlers with others.tid +18 -0
  122. package/editions/fr-FR/tiddlers/Structuring TiddlyWiki.tid +6 -6
  123. package/editions/fr-FR/tiddlers/Styles and Classes in WikiText.tid +11 -10
  124. package/editions/fr-FR/tiddlers/Tagging.tid +24 -18
  125. package/editions/fr-FR/tiddlers/TaskManagementExample.tid +3 -1
  126. package/editions/fr-FR/tiddlers/TiddlerLinks.tid +5 -5
  127. package/editions/fr-FR/tiddlers/TiddlyFox Apocalypse.tid +46 -0
  128. package/editions/fr-FR/tiddlers/TiddlyFox.tid +6 -3
  129. package/editions/fr-FR/tiddlers/TiddlyWiki.tid +6 -4
  130. package/editions/fr-FR/tiddlers/_TiddlyWiki for Scholars_ by Alberto Molina.tid +2 -2
  131. package/editions/prerelease/tiddlers/{Release 5.2.2.tid → Release 5.2.3.tid } +15 -11
  132. package/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid +1 -1
  133. package/editions/prerelease/tiddlers/system/download-empty.tid +1 -0
  134. package/editions/test/tiddlers/tests/data/tabs-macro/expected-html-tabs-horizontal-all.tid +33 -0
  135. package/editions/test/tiddlers/tests/data/tabs-macro/expected-html-tabs-horizontal.tid +43 -0
  136. package/editions/test/tiddlers/tests/data/tabs-macro/expected-html-tabs-vertical.tid +43 -0
  137. package/editions/test/tiddlers/tests/test-action-widgets.js +55 -0
  138. package/editions/test/tiddlers/tests/test-filters.js +225 -64
  139. package/editions/test/tiddlers/tests/test-html-parser.js +15 -0
  140. package/editions/test/tiddlers/tests/test-prefixes-filter.js +5 -5
  141. package/editions/test/tiddlers/tests/test-tags.js +19 -0
  142. package/editions/test/tiddlers/tests/test-utils.js +10 -0
  143. package/editions/test/tiddlers/tests/test-wikitext-parser.js +14 -1
  144. package/editions/test/tiddlers/tests/test-wikitext-tabs-macro.js +86 -0
  145. package/editions/tw.org/tiddlers/$__DefaultTiddlers.tid +6 -0
  146. package/editions/tw.org/tiddlers/$__SiteSubtitle.tid +6 -0
  147. package/editions/tw.org/tiddlers/$__SiteTitle.tid +6 -0
  148. package/editions/tw.org/tiddlers/$__StoryList.tid +3 -0
  149. package/editions/tw.org/tiddlers/$__favicon.ico.png +0 -0
  150. package/editions/tw.org/tiddlers/$__favicon.ico.png.meta +4 -0
  151. package/editions/tw.org/tiddlers/$__palette.tid +6 -0
  152. package/editions/tw.org/tiddlers/$__palettes_BlueFlavour +165 -0
  153. package/editions/tw.org/tiddlers/$__palettes_BlueFlavour.meta +8 -0
  154. package/editions/tw.org/tiddlers/$__palettes_FlowingSun +165 -0
  155. package/editions/tw.org/tiddlers/$__palettes_FlowingSun.meta +8 -0
  156. package/editions/tw.org/tiddlers/$__themes_tiddlywiki_vanilla_metrics_bodyfontsize.tid +6 -0
  157. package/editions/tw.org/tiddlers/$__themes_tiddlywiki_vanilla_metrics_bodylineheight.tid +6 -0
  158. package/editions/tw.org/tiddlers/$__themes_tiddlywiki_vanilla_metrics_sidebarwidth.tid +6 -0
  159. package/editions/tw.org/tiddlers/$__themes_tiddlywiki_vanilla_options_sidebarlayout.tid +6 -0
  160. package/editions/tw.org/tiddlers/HelloThere.tid +14 -0
  161. package/editions/tw.org/tiddlers/Table of Contents.tid +11 -0
  162. package/editions/tw.org/tiddlers/TiddlyWiki.tid +8 -0
  163. package/editions/tw.org/tiddlywiki.info +30 -0
  164. package/editions/tw5.com/tiddlers/community/Contributor License Agreement.tid +3 -3
  165. package/editions/tw5.com/tiddlers/community/Forums.tid +16 -13
  166. package/editions/tw5.com/tiddlers/community/Signing the Contributor License Agreement.tid +2 -2
  167. package/editions/tw5.com/tiddlers/community/plugins/TiddlyClip by buggyjay.tid +3 -3
  168. package/editions/tw5.com/tiddlers/concepts/Cascades.tid +1 -0
  169. package/editions/tw5.com/tiddlers/concepts/Customizing EditTemplate Field Rendering.tid +31 -0
  170. package/editions/tw5.com/tiddlers/concepts/Field Editor Cascade.tid +17 -0
  171. package/editions/tw5.com/tiddlers/concepts/Filters.tid +15 -10
  172. package/editions/tw5.com/tiddlers/concepts/Macros.tid +1 -3
  173. package/editions/tw5.com/tiddlers/concepts/Pragma.tid +2 -2
  174. package/editions/tw5.com/tiddlers/concepts/TiddlerFields.tid +2 -1
  175. package/editions/tw5.com/tiddlers/demonstrations/Alice in Wonderland.tid +3707 -4
  176. package/editions/tw5.com/tiddlers/demonstrations/Apple.tid +6 -1
  177. package/editions/tw5.com/tiddlers/demonstrations/CustomStoryTiddlerTemplateDemo.tid/Styles.tid +1 -0
  178. package/editions/tw5.com/tiddlers/demonstrations/CustomStoryTiddlerTemplateDemo.tid/Template.tid +1 -0
  179. package/editions/tw5.com/tiddlers/demonstrations/CustomStoryTiddlerTemplateDemo.tid/TiddlerTemplateFilter.tid +1 -0
  180. package/editions/tw5.com/tiddlers/features/Importing Tiddlers.tid +1 -1
  181. package/editions/tw5.com/tiddlers/features/Modals.tid +2 -1
  182. package/editions/tw5.com/tiddlers/filters/Filter Operators.tid +9 -5
  183. package/editions/tw5.com/tiddlers/filters/all.tid +2 -2
  184. package/editions/tw5.com/tiddlers/filters/butlast.tid +3 -1
  185. package/editions/tw5.com/tiddlers/filters/examples/butlast.tid +4 -3
  186. package/editions/tw5.com/tiddlers/filters/examples/insertbefore Operator (Examples).tid +28 -0
  187. package/editions/tw5.com/tiddlers/filters/examples/lookup Operator (Examples).tid +5 -0
  188. package/editions/tw5.com/tiddlers/filters/examples/prefix.tid +4 -3
  189. package/editions/tw5.com/tiddlers/filters/examples/removeprefix.tid +2 -1
  190. package/editions/tw5.com/tiddlers/filters/examples/removesuffix.tid +2 -3
  191. package/editions/tw5.com/tiddlers/filters/examples/rest.tid +4 -3
  192. package/editions/tw5.com/tiddlers/filters/examples/search.tid +6 -1
  193. package/editions/tw5.com/tiddlers/filters/examples/sortan.tid +5 -1
  194. package/editions/tw5.com/tiddlers/filters/examples/suffix.tid +3 -2
  195. package/editions/tw5.com/tiddlers/filters/insertbefore Operator.tid +21 -5
  196. package/editions/tw5.com/tiddlers/filters/lookup Operator.tid +28 -10
  197. package/editions/tw5.com/tiddlers/filters/prefix.tid +17 -2
  198. package/editions/tw5.com/tiddlers/filters/removeprefix.tid +18 -3
  199. package/editions/tw5.com/tiddlers/filters/removesuffix.tid +18 -3
  200. package/editions/tw5.com/tiddlers/filters/search.tid +10 -9
  201. package/editions/tw5.com/tiddlers/filters/sha256 Operator.tid +18 -0
  202. package/editions/tw5.com/tiddlers/filters/subfilter Operator.tid +2 -2
  203. package/editions/tw5.com/tiddlers/filters/suffix.tid +17 -2
  204. package/editions/tw5.com/tiddlers/filters/syntax/Cascade Filter Run Prefix.tid +2 -2
  205. package/editions/tw5.com/tiddlers/filters/syntax/Named Filter Run Prefix.tid +1 -1
  206. package/editions/tw5.com/tiddlers/hellothere/HelloThere.tid +3 -3
  207. package/editions/tw5.com/tiddlers/howtos/Concatenating text and variables using macro substitution.tid +4 -14
  208. package/editions/tw5.com/tiddlers/images/New Release Banner.png +0 -0
  209. package/editions/tw5.com/tiddlers/macros/list-links-draggable Macro.tid +1 -1
  210. package/editions/tw5.com/tiddlers/messages/SampleWindowTemplate.tid +2 -2
  211. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-close-all-windows.tid +20 -0
  212. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-close-window.tid +39 -0
  213. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-download-file.tid +6 -1
  214. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-window.tid +16 -12
  215. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-relink-tiddler.tid +26 -0
  216. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid +4 -2
  217. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-scroll.tid +3 -0
  218. package/editions/tw5.com/tiddlers/plugins/Highlight Plugin.tid +3 -1
  219. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.21.tid +6 -0
  220. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.22.tid +6 -0
  221. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.23.tid +6 -0
  222. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.0.tid +6 -0
  223. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.1.tid +6 -0
  224. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.2.tid +162 -0
  225. package/editions/tw5.com/tiddlers/releasenotes/Releases.tid +4 -2
  226. package/editions/tw5.com/tiddlers/saving/Saving on Browser with the File System Access API.tid +21 -0
  227. package/editions/tw5.com/tiddlers/saving/Saving on TidGi.tid +26 -0
  228. package/editions/tw5.com/tiddlers/saving/Saving via WebDAV.tid +3 -1
  229. package/editions/tw5.com/tiddlers/saving/Saving with Polly.tid +29 -0
  230. package/editions/tw5.com/tiddlers/system/doc-macros.tid +25 -1
  231. package/editions/tw5.com/tiddlers/system/doc-styles.tid +5 -1
  232. package/editions/tw5.com/tiddlers/system/download-empty.tid +1 -0
  233. package/editions/tw5.com/tiddlers/system/operator-macros.tid +4 -2
  234. package/editions/tw5.com/tiddlers/system/operator-template.tid +6 -3
  235. package/editions/tw5.com/tiddlers/system/style-guide-macros.tid +5 -1
  236. package/editions/tw5.com/tiddlers/system/variable-macros.tid +4 -2
  237. package/editions/tw5.com/tiddlers/system/wikitext-macros.tid +17 -3
  238. package/editions/tw5.com/tiddlers/webserver/Using HTTPS.tid +17 -2
  239. package/editions/tw5.com/tiddlers/webserver/WebServer API_ Get All Tiddlers.tid +1 -1
  240. package/editions/tw5.com/tiddlers/webserver/WebServer Authorization.tid +15 -3
  241. package/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ admin.tid +8 -0
  242. package/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ required-plugins.tid +8 -0
  243. package/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ tls-passphrase.tid +10 -0
  244. package/editions/tw5.com/tiddlers/widgets/$__editions_tw5.com_widget-examples_qualify-transcluded.tid +14 -0
  245. package/editions/tw5.com/tiddlers/widgets/DraggableWidget.tid +7 -3
  246. package/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid +1 -1
  247. package/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid +7 -6
  248. package/editions/tw5.com/tiddlers/widgets/ImageWidget.tid +9 -1
  249. package/editions/tw5.com/tiddlers/widgets/LinkCatcherWidget.tid +2 -1
  250. package/editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid +3 -1
  251. package/editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid +2 -2
  252. package/editions/tw5.com/tiddlers/widgets/QualifyWidget.tid +39 -0
  253. package/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid +7 -6
  254. package/editions/tw5.com/tiddlers/widgets/ViewWidget.tid +26 -8
  255. package/editions/tw5.com/tiddlers/widgets/WikifyWidget.tid +2 -2
  256. package/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid +30 -4
  257. package/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid +3 -3
  258. package/editions/tw5.com/tiddlers/wikitext/Linking in WikiText.tid +44 -1
  259. package/editions/tw5.com/tiddlers/wikitext/Macro Calls in WikiText.tid +3 -3
  260. package/editions/tw5.com/tiddlers/wikitext/Transclusion in WikiText.tid +2 -1
  261. package/editions/tw5.com/tiddlers/wikitext/Widgets in WikiText.tid +3 -3
  262. package/editions/tw5.com/tiddlers/wikitext/parser/Block Mode WikiText (Examples).tid +51 -0
  263. package/editions/tw5.com/tiddlers/wikitext/parser/Block Mode WikiText.tid +35 -0
  264. package/editions/tw5.com/tiddlers/wikitext/parser/Inline Mode WikiText.tid +26 -0
  265. package/editions/tw5.com/tiddlers/wikitext/parser/Places where the parser ignores WikiText.tid +14 -0
  266. package/editions/tw5.com/tiddlers/wikitext/parser/WikiText Parser Modes.tid +16 -0
  267. package/editions/tw5.com/tiddlers/wikitext/parser/WikiText parser mode transitions.tid +59 -0
  268. package/editions/tw5.com/tiddlers/wikitext/parser/WikiText parser mode_ HTML examples.tid +72 -0
  269. package/editions/tw5.com/tiddlers/wikitext/parser/WikiText parser mode_ macro examples.tid +55 -0
  270. package/editions/tw5.com/tiddlers/wikitext/parser/WikiText parser mode_ transclusion examples.tid +56 -0
  271. package/editions/tw5.com/tiddlers/wikitext/parser/table-example.tid +8 -0
  272. package/languages/de-DE/ControlPanel.multids +17 -0
  273. package/languages/de-DE/Fields.multids +6 -5
  274. package/languages/de-DE/SideBar.multids +1 -0
  275. package/languages/pl-PL/ControlPanel.multids +15 -2
  276. package/languages/zh-Hans/ControlPanel.multids +2 -0
  277. package/languages/zh-Hans/Fields.multids +4 -2
  278. package/languages/zh-Hans/Misc.multids +1 -1
  279. package/languages/zh-Hant/ControlPanel.multids +2 -0
  280. package/languages/zh-Hant/Fields.multids +4 -2
  281. package/languages/zh-Hant/Misc.multids +1 -1
  282. package/license +1 -1
  283. package/licenses/cla-individual.md +13 -1
  284. package/package.json +5 -3
  285. package/plugins/tiddlywiki/dynannotate/examples/viewtemplate.tid +3 -4
  286. package/plugins/tiddlywiki/highlight/files/default.min.css +9 -0
  287. package/plugins/tiddlywiki/highlight/files/highlight.min.js +1401 -0
  288. package/plugins/tiddlywiki/highlight/files/tiddlywiki.files +2 -2
  289. package/plugins/tiddlywiki/highlight/highlightblock.js +27 -21
  290. package/plugins/tiddlywiki/highlight/plugin.info +1 -1
  291. package/plugins/tiddlywiki/highlight/readme.tid +18 -47
  292. package/plugins/tiddlywiki/highlight/styles.tid +10 -5
  293. package/plugins/tiddlywiki/highlight/usage.tid +48 -1
  294. package/plugins/tiddlywiki/highlight-legacy/TypeMappings.multids +8 -0
  295. package/plugins/tiddlywiki/{highlight → highlight-legacy}/files/default.css +0 -0
  296. package/plugins/tiddlywiki/{highlight → highlight-legacy}/files/highlight.pack.js +0 -0
  297. package/plugins/tiddlywiki/highlight-legacy/files/tiddlywiki.files +22 -0
  298. package/plugins/tiddlywiki/highlight-legacy/highlightblock.js +44 -0
  299. package/plugins/tiddlywiki/highlight-legacy/license.tid +27 -0
  300. package/plugins/tiddlywiki/highlight-legacy/plugin.info +7 -0
  301. package/plugins/tiddlywiki/highlight-legacy/readme.tid +65 -0
  302. package/plugins/tiddlywiki/highlight-legacy/styles.tid +82 -0
  303. package/plugins/tiddlywiki/highlight-legacy/usage.tid +28 -0
  304. package/plugins/tiddlywiki/internals/editpreviews/raw.tid +1 -0
  305. package/plugins/tiddlywiki/markdown/config_renderWikiTextPragma.tid +1 -1
  306. package/plugins/tiddlywiki/markdown/wrapper.js +33 -22
  307. package/plugins/tiddlywiki/menubar/menu.tid +1 -1
  308. package/readme.md +2 -2
  309. package/themes/tiddlywiki/snowwhite/base.tid +2 -1
  310. package/themes/tiddlywiki/vanilla/base.tid +13 -3
  311. package/themes/tiddlywiki/vanilla/sticky.tid +1 -0
  312. package/editions/fr-FR/tiddlers/$__core_ui_ViewTemplate_title.tid +0 -46
  313. package/editions/fr-FR/tiddlers/Images_in_WikiText.tid +0 -48
  314. package/editions/fr-FR/tiddlers/ImportTiddlers.tid +0 -14
  315. package/editions/fr-FR/tiddlers/Sharing_your_tiddlers_with_others.tid +0 -16
  316. package/plugins/tiddlywiki/highlight/howto.tid +0 -10
@@ -57,8 +57,19 @@ Tests the filtering mechanism.
57
57
  );
58
58
  });
59
59
 
60
+ describe("With tiddlers in the store unsorted",function() {
61
+ testWithAndWithoutIndexers();
62
+ });
63
+ describe("With tiddlers in the store sorted ascending",function() {
64
+ testWithAndWithoutIndexers({sort: "ascending"});
65
+ });
66
+ describe("With tiddlers in the store sorted descending",function() {
67
+ testWithAndWithoutIndexers({sort: "descending"});
68
+ });
69
+
70
+ function testWithAndWithoutIndexers(options) {
60
71
  describe("With no indexers", function() {
61
- var wiki = setupWiki({enableIndexers: []});
72
+ var wiki = setupWiki(Object.assign({},options,{enableIndexers: []}));
62
73
  it("should not create indexes when requested not to",function() {
63
74
  expect(wiki.getIndexer("FieldIndexer")).toBe(null);
64
75
  });
@@ -66,14 +77,16 @@ Tests the filtering mechanism.
66
77
  });
67
78
 
68
79
  describe("With all indexers", function() {
69
- var wiki = setupWiki();
80
+ var wiki = setupWiki(options);
70
81
  if(wiki.getIndexer("FieldIndexer")) {
71
82
  wiki.getIndexer("FieldIndexer").setMaxIndexedValueLength(8); // Note that JoeBloggs is 9, and John is 5
72
83
  }
73
84
  runTests(wiki);
74
85
  });
86
+ }
75
87
 
76
88
  function setupWiki(wikiOptions) {
89
+ wikiOptions = wikiOptions || {};
77
90
  // Create a wiki
78
91
  var wiki = new $tw.Wiki(wikiOptions);
79
92
  // Add a plugin containing some shadow tiddlers
@@ -104,13 +117,12 @@ Tests the filtering mechanism.
104
117
  }
105
118
  }
106
119
  };
107
- wiki.addTiddler({
120
+ var tiddlers = [{
108
121
  title: "$:/ShadowPlugin",
109
122
  text: JSON.stringify(shadowTiddlers),
110
123
  "plugin-type": "plugin",
111
- type: "application/json"});
112
- // Add a few tiddlers
113
- wiki.addTiddler({
124
+ type: "application/json"
125
+ },{
114
126
  title: "TiddlerOne",
115
127
  text: "The quick brown fox in $:/TiddlerTwo",
116
128
  tags: ["one"],
@@ -119,8 +131,8 @@ Tests the filtering mechanism.
119
131
  slug: "tiddler-one",
120
132
  authors: "Joe Bloggs",
121
133
  modifier: "JoeBloggs",
122
- modified: "201304152222"});
123
- wiki.addTiddler({
134
+ modified: "201304152222"
135
+ },{
124
136
  title: "$:/TiddlerTwo",
125
137
  text: "The rain in Spain\nfalls mainly on the plain and [[a fourth tiddler]]",
126
138
  tags: ["two"],
@@ -129,44 +141,75 @@ Tests the filtering mechanism.
129
141
  slug: "tiddler-two",
130
142
  authors: "[[John Doe]]",
131
143
  modifier: "John",
132
- modified: "201304152211"});
133
- wiki.addTiddler({
144
+ modified: "201304152211"
145
+ },{
134
146
  title: "Tiddler Three",
135
147
  text: "The speed of sound in light\n\nThere is no TiddlerZero but TiddlerSix",
136
148
  tags: ["one","two"],
137
149
  cost: "56",
138
150
  value: "80",
139
151
  modifier: "John",
140
- modified: "201304162202"});
141
- wiki.addTiddler({
152
+ modified: "201304162202"
153
+ },{
142
154
  title: "a fourth tiddler",
143
155
  text: "The quality of mercy is not drained by [[Tiddler Three]]",
144
156
  tags: [],
145
157
  cost: "82",
146
158
  value: "72",
147
159
  empty: "not",
148
- modifier: "John"});
149
- wiki.addTiddler({
160
+ modifier: "John"
161
+ },{
150
162
  title: "one",
151
163
  text: "This is the text of tiddler [[one]]",
152
164
  list: "[[Tiddler Three]] [[TiddlerOne]]",
153
165
  empty: "",
154
- modifier: "John"});
155
- wiki.addTiddler({
166
+ modifier: "John"
167
+ },{
156
168
  title: "hasList",
157
169
  text: "This is the text of tiddler [[hasList]]",
158
170
  list: "[[Tiddler Three]] [[TiddlerOne]]",
159
- modifier: "PMario"});
160
- wiki.addTiddler({
171
+ modifier: "PMario"
172
+ },{
161
173
  title: "has filter",
162
174
  text: "This is the text of tiddler [[has filter]]",
163
175
  filter: "[[Tiddler Three]] [[TiddlerOne]] [subfilter{hasList!!list}]",
164
- modifier: "PMario"});
165
- wiki.addTiddler({
176
+ modifier: "PMario"
177
+ },{
166
178
  title: "filter regexp test",
167
179
  text: "Those strings have been used to create the `regexp = /[+|\-|~]?([[](?:[^\]])*\]+)|([+|-|~|\S]\S*)/;`",
168
180
  filter: "+aaa -bbb ~ccc aaaaaabbbbbbbbaa \"bb'b\" 'cc\"c' [[abc]] [[tiddler with spaces]] [is[test]] [is[te st]] a s df [enlist<hugo>] +[enlist:raw{test with spaces}] [enlist:raw{test with spaces}] [[a a]] [[ ] [ ]] [[ [hugo]] [subfilter{Story/Tower of Hanoi/A-C Sequence}]",
169
- modifier: "PMario"});
181
+ modifier: "PMario"
182
+ }];
183
+ // Load the tiddlers in the required order
184
+ var fnCompare;
185
+ switch(wikiOptions.sort) {
186
+ case "ascending":
187
+ fnCompare = function(a,b) {
188
+ if(a.title < b.title) {
189
+ return -1;
190
+ } else if(a.title > b.title) {
191
+ return +1;
192
+ } else {
193
+ return 0;
194
+ }
195
+ };
196
+ break;
197
+ case "descending":
198
+ fnCompare = function(a,b) {
199
+ if(a.title < b.title) {
200
+ return +1;
201
+ } else if(a.title > b.title) {
202
+ return -1;
203
+ } else {
204
+ return 0;
205
+ }
206
+ };
207
+ break;
208
+ }
209
+ if(fnCompare) {
210
+ tiddlers.sort(fnCompare);
211
+ }
212
+ wiki.addTiddlers(tiddlers);
170
213
  // Unpack plugin tiddlers
171
214
  wiki.readPluginInfo();
172
215
  wiki.registerPluginTiddlers("plugin");
@@ -197,7 +240,7 @@ Tests the filtering mechanism.
197
240
  expect(wiki.filterTiddlers("[!modifier[JoeBloggs]then[Susi]]").join(",")).toBe("Susi,Susi,Susi,Susi,Susi,Susi,Susi,Susi");
198
241
  expect(wiki.filterTiddlers("[modifier[DaveBloggs]then[Susi]]").join(",")).toBe("");
199
242
  expect(wiki.filterTiddlers("[modifier[JoeBloggs]else[Susi]]").join(",")).toBe("TiddlerOne");
200
- expect(wiki.filterTiddlers("[!modifier[JoeBloggs]else[Susi]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test");
243
+ expect(wiki.filterTiddlers("[!modifier[JoeBloggs]else[Susi]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three");
201
244
  expect(wiki.filterTiddlers("[modifier[DaveBloggs]else[Susi]]").join(",")).toBe("Susi");
202
245
  });
203
246
 
@@ -211,6 +254,8 @@ Tests the filtering mechanism.
211
254
  it("should handle the lookup operator", function() {
212
255
  expect(wiki.filterTiddlers("Six Seventh 8 +[lookup[Tiddler]]").join(",")).toBe("Missing inaction from TiddlerOne,,Tidd");
213
256
  expect(wiki.filterTiddlers("Six Seventh 8 +[lookup:8[Tiddler]]").join(",")).toBe("Missing inaction from TiddlerOne,8,Tidd");
257
+ expect(wiki.filterTiddlers("Six Seventh 8 +[lookup:8[Tiddler],[text]]").join(",")).toBe("Missing inaction from TiddlerOne,8,Tidd");
258
+ expect(wiki.filterTiddlers("Six Seventh 8 +[lookup[Tiddler],[tags]]").join(",")).toBe(",one,one");
214
259
  });
215
260
 
216
261
  it("should retrieve shadow tiddlers", function() {
@@ -219,31 +264,31 @@ Tests the filtering mechanism.
219
264
 
220
265
  it("should handle the title operator", function() {
221
266
  expect(wiki.filterTiddlers("TiddlerOne [title[$:/TiddlerTwo]] [[Tiddler Three]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three");
222
- expect(wiki.filterTiddlers("[!title[Tiddler Three]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,a fourth tiddler,one,hasList,has filter,filter regexp test");
267
+ expect(wiki.filterTiddlers("[!title[Tiddler Three]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,TiddlerOne");
223
268
  expect(wiki.filterTiddlers("TiddlerOne [title[$:/TiddlerTwo]] [[Tiddler Three]] [[A Missing Tiddler]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,A Missing Tiddler");
224
269
  });
225
270
 
226
271
  it("should handle the field operator", function() {
227
272
  expect(wiki.filterTiddlers("[modifier[JoeBloggs]]").join(",")).toBe("TiddlerOne");
228
- expect(wiki.filterTiddlers("[!modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test");
229
- expect(wiki.filterTiddlers("[!is[system]!modifier[JoeBloggs]]").join(",")).toBe("Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test");
273
+ expect(wiki.filterTiddlers("[!modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three");
274
+ expect(wiki.filterTiddlers("[!is[system]!modifier[JoeBloggs]]").join(",")).toBe("a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three");
230
275
  expect(wiki.filterTiddlers("[field:modifier[JoeBloggs]]").join(",")).toBe("TiddlerOne");
231
- expect(wiki.filterTiddlers("[!field:modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test");
232
- expect(wiki.filterTiddlers("[!is[system]!field:modifier[JoeBloggs]]").join(",")).toBe("Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test");
233
- expect(wiki.filterTiddlers("[modifier[John]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one");
234
- expect(wiki.filterTiddlers("[!modifier[John]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,hasList,has filter,filter regexp test");
235
- expect(wiki.filterTiddlers("[!is[system]!modifier[John]]").join(",")).toBe("TiddlerOne,hasList,has filter,filter regexp test");
236
- expect(wiki.filterTiddlers("[field:modifier[John]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one");
237
- expect(wiki.filterTiddlers("[!field:modifier[John]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,hasList,has filter,filter regexp test");
238
- expect(wiki.filterTiddlers("[!is[system]!field:modifier[John]]").join(",")).toBe("TiddlerOne,hasList,has filter,filter regexp test");
276
+ expect(wiki.filterTiddlers("[!field:modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three");
277
+ expect(wiki.filterTiddlers("[!is[system]!field:modifier[JoeBloggs]]").join(",")).toBe("a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three");
278
+ expect(wiki.filterTiddlers("[modifier[John]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three");
279
+ expect(wiki.filterTiddlers("[!modifier[John]]").join(",")).toBe("$:/ShadowPlugin,filter regexp test,has filter,hasList,TiddlerOne");
280
+ expect(wiki.filterTiddlers("[!is[system]!modifier[John]]").join(",")).toBe("filter regexp test,has filter,hasList,TiddlerOne");
281
+ expect(wiki.filterTiddlers("[field:modifier[John]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three");
282
+ expect(wiki.filterTiddlers("[!field:modifier[John]]").join(",")).toBe("$:/ShadowPlugin,filter regexp test,has filter,hasList,TiddlerOne");
283
+ expect(wiki.filterTiddlers("[!is[system]!field:modifier[John]]").join(",")).toBe("filter regexp test,has filter,hasList,TiddlerOne");
239
284
  });
240
285
 
241
286
  it("should handle the regexp operator", function() {
242
- expect(wiki.filterTiddlers("[regexp[id]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler");
243
- expect(wiki.filterTiddlers("[!regexp[id]]").join(",")).toBe("$:/ShadowPlugin,one,hasList,has filter,filter regexp test");
244
- expect(wiki.filterTiddlers("[regexp[Tid]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three");
245
- expect(wiki.filterTiddlers("[regexp[(?i)Tid]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler");
246
- expect(wiki.filterTiddlers("[!regexp[Tid(?i)]]").join(",")).toBe("$:/ShadowPlugin,one,hasList,has filter,filter regexp test");
287
+ expect(wiki.filterTiddlers("[regexp[id]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,Tiddler Three,TiddlerOne");
288
+ expect(wiki.filterTiddlers("[!regexp[id]]").join(",")).toBe("$:/ShadowPlugin,filter regexp test,has filter,hasList,one");
289
+ expect(wiki.filterTiddlers("[regexp[Tid]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne");
290
+ expect(wiki.filterTiddlers("[regexp[(?i)Tid]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,Tiddler Three,TiddlerOne");
291
+ expect(wiki.filterTiddlers("[!regexp[Tid(?i)]]").join(",")).toBe("$:/ShadowPlugin,filter regexp test,has filter,hasList,one");
247
292
  });
248
293
 
249
294
  // The following 2 tests should write a log -> WARNING: Filter modifier has a deprecated regexp operand XXXX
@@ -253,20 +298,55 @@ Tests the filtering mechanism.
253
298
  expect(wiki.filterTiddlers("[modifier/JoeBloggs/]").join(",")).toBe("TiddlerOne");
254
299
  expect(console.log).toHaveBeenCalledWith("WARNING: Filter", "modifier", "has a deprecated regexp operand", /JoeBloggs/);
255
300
  console.log.calls.reset();
256
- expect(wiki.filterTiddlers("[modifier/Jo/]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one");
301
+ expect(wiki.filterTiddlers("[modifier/Jo/]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne");
257
302
  expect(console.log).toHaveBeenCalledWith("WARNING: Filter", "modifier", "has a deprecated regexp operand", /Jo/);
258
303
  });
304
+
305
+ it("should handle regular expression operands without crashing", function() {
306
+ spyOn(console, 'log');
307
+ // We don't really care about the results. Just don't get RSoD.
308
+ expect(() => wiki.filterTiddlers("[all/current/]")).not.toThrow();
309
+ expect(() => wiki.filterTiddlers("[prefix/anything/]")).not.toThrow();
310
+ expect(() => wiki.filterTiddlers("[title/anything/]")).not.toThrow();
311
+ expect(() => wiki.filterTiddlers("[/anything/]")).not.toThrow();
312
+ expect(() => wiki.filterTiddlers("[//]")).not.toThrow();
313
+ });
259
314
 
260
315
  it("should handle the prefix operator", function() {
261
- expect(wiki.filterTiddlers("[prefix[Tiddler]]").join(",")).toBe("TiddlerOne,Tiddler Three");
316
+ expect(wiki.filterTiddlers("[prefix[Tiddler]]").join(",")).toBe("Tiddler Three,TiddlerOne");
317
+ expect(wiki.filterTiddlers("[prefix:casesensitive[tiddler]]").join(",")).toBe("");
318
+ expect(wiki.filterTiddlers("[prefix:caseinsensitive[tiddler]]").join(",")).toBe("Tiddler Three,TiddlerOne");
262
319
  expect(wiki.filterTiddlers("[prefix[nothing]]").join(",")).toBe("");
320
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]prefix[]]").join(",")).toBe("ABCDE,abcde");
321
+ });
322
+
323
+ it("should handle the suffix operator", function() {
324
+ expect(wiki.filterTiddlers("[suffix[One]]").join(",")).toBe("TiddlerOne");
325
+ expect(wiki.filterTiddlers("[suffix:casesensitive[one]]").join(",")).toBe("one");
326
+ expect(wiki.filterTiddlers("[suffix:caseinsensitive[one]]").join(",")).toBe("one,TiddlerOne");
327
+ expect(wiki.filterTiddlers("[suffix[nothing]]").join(",")).toBe("");
328
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]suffix[]]").join(",")).toBe("ABCDE,abcde");
329
+ });
330
+
331
+ it("should handle the removeprefix operator", function() {
332
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]removeprefix[ABC]]").join(",")).toBe("DE");
333
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]removeprefix:casesensitive[ABC]]").join(",")).toBe("DE");
334
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]removeprefix:caseinsensitive[abc]]").join(",")).toBe("DE,de");
335
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]removeprefix[]]").join(",")).toBe("ABCDE,abcde");
336
+ });
337
+
338
+ it("should handle the removesuffix operator", function() {
339
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]removesuffix[DE]]").join(",")).toBe("ABC");
340
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]removesuffix:casesensitive[DE]]").join(",")).toBe("ABC");
341
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]removesuffix:caseinsensitive[de]]").join(",")).toBe("ABC,abc")
342
+ expect(wiki.filterTiddlers("[enlist[ABCDE abcde]removesuffix[]]").join(",")).toBe("ABCDE,abcde");
263
343
  });
264
344
 
265
345
  it("should handle the sort and sortcs operators", function() {
266
346
  expect(wiki.filterTiddlers("[sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne");
267
347
  expect(wiki.filterTiddlers("[!sort[title]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,hasList,has filter,filter regexp test,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin");
268
- expect(wiki.filterTiddlers("[sort[modified]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,one,hasList,has filter,filter regexp test,$:/TiddlerTwo,TiddlerOne,Tiddler Three");
269
- expect(wiki.filterTiddlers("[!sort[modified]]").join(",")).toBe("Tiddler Three,TiddlerOne,$:/TiddlerTwo,$:/ShadowPlugin,a fourth tiddler,one,hasList,has filter,filter regexp test");
348
+ expect(wiki.filterTiddlers("[sort[modified]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,filter regexp test,has filter,hasList,one,$:/TiddlerTwo,TiddlerOne,Tiddler Three");
349
+ expect(wiki.filterTiddlers("[!sort[modified]]").join(",")).toBe("Tiddler Three,TiddlerOne,$:/TiddlerTwo,$:/ShadowPlugin,a fourth tiddler,filter regexp test,has filter,hasList,one");
270
350
  // Temporarily commenting out the following two lines because of platform differences for localeCompare between the browser and Node.js
271
351
  // expect(wiki.filterTiddlers("[sortcs[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne,a fourth tiddler,one");
272
352
  // expect(wiki.filterTiddlers("[!sortcs[title]]").join(",")).toBe("one,a fourth tiddler,TiddlerOne,Tiddler Three,$:/TiddlerTwo");
@@ -291,6 +371,7 @@ Tests the filtering mechanism.
291
371
  expect(wiki.filterTiddlers("[sort[title]reverse[]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,hasList,has filter,filter regexp test,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin");
292
372
  expect(wiki.filterTiddlers("[sort[title]reverse[x]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,hasList,has filter,filter regexp test,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin");
293
373
  expect(wiki.filterTiddlers("[sort[title]butlast[]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three");
374
+ expect(wiki.filterTiddlers("[sort[title]butlast[0]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne");
294
375
  expect(wiki.filterTiddlers("[sort[title]butlast[2]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one");
295
376
  expect(wiki.filterTiddlers("[sort[title]butlast[11]]").join(",")).toBe("");
296
377
  expect(wiki.filterTiddlers("[sort[title]butlast[x]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three");
@@ -316,10 +397,10 @@ Tests the filtering mechanism.
316
397
  expect(wiki.filterTiddlers("[all[shadows]tag[two]]").join(",")).toBe("$:/TiddlerFive");
317
398
  expect(wiki.filterTiddlers("[all[shadows+tiddlers]tag[two]]").join(",")).toBe("$:/TiddlerFive,$:/TiddlerTwo,Tiddler Three");
318
399
  expect(wiki.filterTiddlers("[all[tiddlers+shadows]tag[two]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,$:/TiddlerFive");
319
- 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");
320
- 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");
400
+ expect(wiki.filterTiddlers("[all[shadows+tiddlers]]").join(",")).toBe("$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8,$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne");
401
+ expect(wiki.filterTiddlers("[all[tiddlers+shadows]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne,$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8");
321
402
  expect(wiki.filterTiddlers("[all[tiddlers]tag[two]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three");
322
- 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");
403
+ expect(wiki.filterTiddlers("[all[orphans+tiddlers+tags]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,Tiddler Three,TiddlerOne,two,one");
323
404
  });
324
405
 
325
406
  it("should handle the tags operator", function() {
@@ -330,11 +411,11 @@ Tests the filtering mechanism.
330
411
  it("should handle the match operator", function() {
331
412
  expect(wiki.filterTiddlers("[match[TiddlerOne]]").join(",")).toBe("TiddlerOne");
332
413
  expect(wiki.filterTiddlers("TiddlerOne TiddlerOne =[match[TiddlerOne]]").join(",")).toBe("TiddlerOne,TiddlerOne");
333
- expect(wiki.filterTiddlers("[!match[TiddlerOne]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test");
414
+ expect(wiki.filterTiddlers("[!match[TiddlerOne]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three");
334
415
  expect(wiki.filterTiddlers("[match:casesensitive[tiddlerone]]").join(",")).toBe("");
335
- expect(wiki.filterTiddlers("[!match:casesensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test");
416
+ expect(wiki.filterTiddlers("[!match:casesensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne");
336
417
  expect(wiki.filterTiddlers("[match:caseinsensitive[tiddlerone]]").join(",")).toBe("TiddlerOne");
337
- expect(wiki.filterTiddlers("[!match:caseinsensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test");
418
+ expect(wiki.filterTiddlers("[!match:caseinsensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three");
338
419
  });
339
420
 
340
421
  it("should handle the tagging operator", function() {
@@ -348,6 +429,9 @@ Tests the filtering mechanism.
348
429
  it("should handle the untagged operator", function() {
349
430
  expect(wiki.filterTiddlers("[untagged[]sort[title]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,filter regexp test,has filter,hasList,one");
350
431
  expect(wiki.filterTiddlers("[!untagged[]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne");
432
+ // Should consider non-existent tiddlers untagged.
433
+ expect(wiki.filterTiddlers("[enlist[a b c]untagged[]]").join(",")).toBe("a,b,c");
434
+ expect(wiki.filterTiddlers("[enlist[a b c]!untagged[]]").join(",")).toBe("");
351
435
  });
352
436
 
353
437
  it("should handle the links operator", function() {
@@ -383,6 +467,11 @@ Tests the filtering mechanism.
383
467
  expect(wiki.filterTiddlers("[list[TiddlerSeventh]sort[title]]").join(",")).toBe("a fourth tiddler,MissingTiddler,Tiddler Three,TiddlerOne");
384
468
  expect(wiki.filterTiddlers("[tag[one]list[TiddlerSeventh]sort[title]]").join(",")).toBe("a fourth tiddler,MissingTiddler,Tiddler Three,TiddlerOne");
385
469
  });
470
+
471
+ it("should handle the listed operator", function() {
472
+ expect(wiki.filterTiddlers("TiddlerOne MissingTiddler +[listed[]]").join(",")).toBe('hasList,one');
473
+ expect(wiki.filterTiddlers("one two +[listed[tags]]").join(",")).toBe('TiddlerOne,$:/TiddlerTwo,Tiddler Three');
474
+ });
386
475
 
387
476
  it("should handle the next operator", function() {
388
477
  expect(wiki.filterTiddlers("[[Tiddler Three]next[TiddlerSeventh]]").join(",")).toBe("a fourth tiddler");
@@ -404,21 +493,54 @@ Tests the filtering mechanism.
404
493
  expect(wiki.filterTiddlers("[search:modifier:regexp[(d|bl)o(ggs|e)]sort[title]]").join(",")).toBe("TiddlerOne");
405
494
  expect(wiki.filterTiddlers("[search:-modifier,authors:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,filter regexp test,Tiddler Three");
406
495
  expect(wiki.filterTiddlers("[search:*:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,filter regexp test,Tiddler Three,TiddlerOne");
407
- expect(wiki.filterTiddlers("[search:text:anchored[the]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler");
496
+ expect(wiki.filterTiddlers("[search:text:anchored[the]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,Tiddler Three,TiddlerOne");
408
497
  });
409
-
498
+
499
+ it("should yield search results where 'default' search finds at least 1 token", function() {
500
+ expect(wiki.filterTiddlers("[search::some[one two]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,one,Tiddler Three,TiddlerOne");
501
+ });
502
+
503
+ it("should yield search results where 'title' finds at least one token", function() {
504
+ expect(wiki.filterTiddlers("[search:title:some[tiddler]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,Tiddler Three,TiddlerOne");
505
+ expect(wiki.filterTiddlers("[search:title:some[tiddler one]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne");
506
+ });
507
+
508
+ it("should yield search results where 'tags' finds at least one token", function() {
509
+ expect(wiki.filterTiddlers("[search:tags:some[one]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne");
510
+ expect(wiki.filterTiddlers("[search:tags:some[two]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three");
511
+ expect(wiki.filterTiddlers("[search:tags:some[two one]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne");
512
+ });
513
+
514
+ it("should yield search results where 'tags' finds at least one token / casesensitive", function() {
515
+ expect(wiki.filterTiddlers("[search:tags:some[ONE]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne");
516
+ expect(wiki.filterTiddlers("[search:tags:some,casesensitive[two ONE]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three");
517
+ });
518
+
519
+ it("should yield search results where 'tags' finds at least one token / anchored", function() {
520
+ expect(wiki.filterTiddlers("[search:tags:some,anchored[one]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne");
521
+ expect(wiki.filterTiddlers("[search:tags:some,anchored[two]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three");
522
+ // search:title
523
+ expect(wiki.filterTiddlers("[search:title:some,anchored[tiddler]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne");
524
+ expect(wiki.filterTiddlers("[search:title:some,anchored[tiddler one]sort[title]]").join(",")).toBe("one,Tiddler Three,TiddlerOne");
525
+ });
526
+
527
+ it("should yield search results where 'tags' finds at least one token / anchored & casesensitive", function() {
528
+ expect(wiki.filterTiddlers("[search:title:some,anchored,casesensitive[Tiddler one]sort[title]]").join(",")).toBe("one,Tiddler Three,TiddlerOne");
529
+ expect(wiki.filterTiddlers("[search:title:some,anchored,casesensitive[Tiddler ONE]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne");
530
+ });
531
+
410
532
  it("should yield search results that have search tokens spread across different fields", function() {
411
533
  expect(wiki.filterTiddlers("[search[fox one]sort[title]]").join(",")).toBe("TiddlerOne");
412
534
  });
413
-
535
+
414
536
  it("should handle the each operator", function() {
415
- expect(wiki.filterTiddlers("[each[modifier]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,hasList,TiddlerOne");
537
+ expect(wiki.filterTiddlers("[each[modifier]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,filter regexp test,TiddlerOne");
416
538
  expect(wiki.filterTiddlers("[each:list-item[tags]sort[title]]").join(",")).toBe("one,two");
417
539
  expect(wiki.filterTiddlers("[each:list-item[authors]sort[title]]").join(",")).toBe("Bloggs,Joe,John Doe");
418
540
  });
419
541
 
420
542
  it("should handle the eachday operator", function() {
421
- expect(wiki.filterTiddlers("[eachday[modified]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne");
543
+ expect(wiki.filterTiddlers("[eachday[modified]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three");
422
544
  });
423
545
 
424
546
  it("should handle the sameday operator", function() {
@@ -446,7 +568,7 @@ Tests the filtering mechanism.
446
568
  });
447
569
 
448
570
  it("should handle the '[is[missing]]' operator", function() {
449
- expect(wiki.filterTiddlers("[all[]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test");
571
+ expect(wiki.filterTiddlers("[all[]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne");
450
572
  expect(wiki.filterTiddlers("[all[missing]]").join(",")).toBe("TiddlerZero");
451
573
  expect(wiki.filterTiddlers("[!is[missing]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne");
452
574
  expect(wiki.filterTiddlers("[[TiddlerOne]is[missing]]").join(",")).toBe("");
@@ -457,11 +579,39 @@ Tests the filtering mechanism.
457
579
 
458
580
  it("should handle the '[is[orphan]]' operator", function() {
459
581
  expect(wiki.filterTiddlers("[is[orphan]sort[title]]").join(",")).toBe("a fourth tiddler,filter regexp test,TiddlerOne");
460
- expect(wiki.filterTiddlers("[!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,one,hasList,has filter");
582
+ expect(wiki.filterTiddlers("[!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,has filter,hasList,one,Tiddler Three");
461
583
  expect(wiki.filterTiddlers("[[TiddlerOne]is[orphan]]").join(",")).toBe("TiddlerOne");
462
584
  expect(wiki.filterTiddlers("[[TiddlerOne]!is[orphan]]").join(",")).toBe("");
463
585
  expect(wiki.filterTiddlers("[!title[Tiddler Three]is[orphan]sort[title]]").join(",")).toBe("a fourth tiddler,filter regexp test,TiddlerOne");
464
- expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,one,hasList,has filter");
586
+ expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,has filter,hasList,one");
587
+ });
588
+
589
+ it("should handle the '[is[draft]]' operator", function() {
590
+ var wiki = new $tw.Wiki();
591
+ wiki.addTiddlers([
592
+ {title: "A"},
593
+ {title: "Draft of 'A'", "draft.of": "A", "draft.title": "A"},
594
+ {title: "B"},
595
+ {title: "Draft of 'B'", "draft.of": "B"},
596
+ {title: "C"},
597
+ // Not a true draft. Doesn't have draft.of
598
+ {title: "Draft of 'C'", "draft.title": "C"},
599
+ {title: "E"},
600
+ // Broken. Has draft.of, but it's empty. Still a draft
601
+ {title: "Draft of 'E'", "draft.of": "", "draft.title": ""}
602
+ // Not a draft. It doesn't exist.
603
+ //{title: "F"} // This one is deliberately missing
604
+ ]);
605
+ // is analagous to [has[draft.of]],
606
+ // except they handle empty draft.of differently
607
+ expect(wiki.filterTiddlers("[all[]] F +[is[draft]]").join(",")).toEqual("Draft of 'A',Draft of 'B',Draft of 'E'");
608
+ expect(wiki.filterTiddlers("[all[]] F +[!is[draft]]").join(",")).toEqual("A,B,C,Draft of 'C',E,F");
609
+ // [is[draft]] and [!is[draft]] are proper complements
610
+ var included = wiki.filterTiddlers("[all[]] F +[is[draft]]")
611
+ var excluded = wiki.filterTiddlers("[all[]] F +[!is[draft]]")
612
+ var all = [].concat(included, excluded).sort();
613
+ // combined, they should have exactly one of everything.
614
+ expect(wiki.filterTiddlers("[all[]] F +[sort[]]")).toEqual(all);
465
615
  });
466
616
 
467
617
  });
@@ -606,16 +756,27 @@ Tests the filtering mechanism.
606
756
  rootWidget.setVariable("tidTitle","e");
607
757
  rootWidget.setVariable("tidList","one tid with spaces");
608
758
 
759
+ // Position title specified as suffix.
609
760
  expect(wiki.filterTiddlers("a b c d e f +[insertbefore:myVar[f]]",anchorWidget).join(",")).toBe("a,b,f,c,d,e");
610
761
  expect(wiki.filterTiddlers("a b c d e f +[insertbefore:myVar<tidTitle>]",anchorWidget).join(",")).toBe("a,b,e,c,d,f");
611
762
  expect(wiki.filterTiddlers("a b c d e f +[insertbefore:myVar[gg gg]]",anchorWidget).join(",")).toBe("a,b,gg gg,c,d,e,f");
612
-
613
763
  expect(wiki.filterTiddlers("a b c d e +[insertbefore:myVar<tidList>]",anchorWidget).join(",")).toBe("a,b,one tid with spaces,c,d,e");
614
764
  expect(wiki.filterTiddlers("a b c d e f +[insertbefore:tidTitle{TiddlerOne!!tags}]",anchorWidget).join(",")).toBe("a,b,c,d,one,e,f");
765
+
766
+ // Position title specified as parameter.
767
+ expect(wiki.filterTiddlers("a b c d e +[insertbefore[f],[a]]",anchorWidget).join(",")).toBe("f,a,b,c,d,e");
768
+ expect(wiki.filterTiddlers("a b c d e +[insertbefore[f],<myVar>]",anchorWidget).join(",")).toBe("a,b,f,c,d,e");
769
+
770
+ // Parameter takes precedence over suffix.
771
+ expect(wiki.filterTiddlers("a b c d e +[insertbefore:myVar[f],[a]]",anchorWidget).join(",")).toBe("f,a,b,c,d,e");
615
772
 
616
- // Next 2 tests do weired things, but will pass - there for compatibility reasons
773
+ // No position title.
617
774
  expect(wiki.filterTiddlers("a b c [[with space]] +[insertbefore[b]]").join(",")).toBe("a,c,with space,b");
618
- expect(wiki.filterTiddlers("a b c d e +[insertbefore:2[b]]").join(",")).toBe("a,c,d,e,b");
775
+
776
+ // Position title does not exist.
777
+ expect(wiki.filterTiddlers("a b c d e +[insertbefore:foo[b]]").join(",")).toBe("a,c,d,e,b");
778
+ expect(wiki.filterTiddlers("a b c d e +[insertbefore[b],[foo]]").join(",")).toBe("a,c,d,e,b");
779
+ expect(wiki.filterTiddlers("a b c d e +[insertbefore[b],<foo>]").join(",")).toBe("a,c,d,e,b");
619
780
  });
620
781
 
621
782
  it("should handle the move operator", function() {
@@ -775,10 +936,10 @@ Tests the filtering mechanism.
775
936
  rootWidget.setVariable("sort2","[get[text]else[]length[]]");
776
937
  rootWidget.setVariable("sort3","[{!!value}divide{!!cost}]");
777
938
  rootWidget.setVariable("sort4","[{!!title}]");
778
- expect(wiki.filterTiddlers("[sortsub:number<sort1>]",anchorWidget).join(",")).toBe("one,hasList,TiddlerOne,has filter,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test");
779
- expect(wiki.filterTiddlers("[!sortsub:number<sort1>]",anchorWidget).join(",")).toBe("filter regexp test,a fourth tiddler,$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,TiddlerOne,has filter,hasList,one");
780
- expect(wiki.filterTiddlers("[sortsub:string<sort1>]",anchorWidget).join(",")).toBe("TiddlerOne,has filter,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test,one,hasList");
781
- expect(wiki.filterTiddlers("[!sortsub:string<sort1>]",anchorWidget).join(",")).toBe("hasList,one,filter regexp test,a fourth tiddler,$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,TiddlerOne,has filter");
939
+ expect(wiki.filterTiddlers("[sortsub:number<sort1>]",anchorWidget).join(",")).toBe("one,hasList,has filter,TiddlerOne,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test");
940
+ expect(wiki.filterTiddlers("[!sortsub:number<sort1>]",anchorWidget).join(",")).toBe("filter regexp test,a fourth tiddler,$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,has filter,TiddlerOne,hasList,one");
941
+ expect(wiki.filterTiddlers("[sortsub:string<sort1>]",anchorWidget).join(",")).toBe("has filter,TiddlerOne,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test,one,hasList");
942
+ expect(wiki.filterTiddlers("[!sortsub:string<sort1>]",anchorWidget).join(",")).toBe("hasList,one,filter regexp test,a fourth tiddler,$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,has filter,TiddlerOne");
782
943
  expect(wiki.filterTiddlers("[sortsub:number<sort2>]",anchorWidget).join(",")).toBe("one,TiddlerOne,hasList,has filter,a fourth tiddler,Tiddler Three,$:/TiddlerTwo,filter regexp test,$:/ShadowPlugin");
783
944
  expect(wiki.filterTiddlers("[!sortsub:number<sort2>]",anchorWidget).join(",")).toBe("$:/ShadowPlugin,filter regexp test,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,has filter,hasList,TiddlerOne,one");
784
945
  expect(wiki.filterTiddlers("[sortsub:string<sort2>]",anchorWidget).join(",")).toBe("one,TiddlerOne,hasList,has filter,$:/ShadowPlugin,a fourth tiddler,Tiddler Three,$:/TiddlerTwo,filter regexp test");
@@ -899,4 +1060,4 @@ Tests the filtering mechanism.
899
1060
  });
900
1061
 
901
1062
  })();
902
-
1063
+
@@ -128,6 +128,21 @@ describe("HTML tag new parser tests", function() {
128
128
  expect($tw.utils.parseAttribute("p=\"blah\" ",0)).toEqual(
129
129
  { type : 'string', start : 0, name : 'p', value : 'blah', end : 8 }
130
130
  );
131
+ expect($tw.utils.parseAttribute("p=\"bl\nah\" ",0)).toEqual(
132
+ { type : 'string', start : 0, name : 'p', value : 'bl\nah', end : 9 }
133
+ );
134
+ expect($tw.utils.parseAttribute("p={{{blah}}} ",0)).toEqual(
135
+ { type : 'filtered', start : 0, name : 'p', filter : 'blah', end : 12 }
136
+ );
137
+ expect($tw.utils.parseAttribute("p={{{bl\nah}}} ",0)).toEqual(
138
+ { type : 'filtered', start : 0, name : 'p', filter : 'bl\nah', end : 13 }
139
+ );
140
+ expect($tw.utils.parseAttribute("p={{{ [{$:/layout}] }}} ",0)).toEqual(
141
+ { type : 'filtered', start : 0, name : 'p', filter : ' [{$:/layout}] ', end : 23 }
142
+ );
143
+ expect($tw.utils.parseAttribute("p={{blah}} ",0)).toEqual(
144
+ { type : 'indirect', start : 0, name : 'p', textReference : 'blah', end : 10 }
145
+ );
131
146
  expect($tw.utils.parseAttribute("p=blah ",0)).toEqual(
132
147
  { type : 'string', start : 0, name : 'p', value : 'blah', end : 6 }
133
148
  );
@@ -392,10 +392,10 @@ describe("'reduce' and 'intersection' filter prefix tests", function() {
392
392
  rootWidget.setVariable("larger-than-18","[get[text]length[]compare:integer:gteq[18]]");
393
393
  rootWidget.setVariable("nr","18");
394
394
  rootWidget.setVariable("larger-than-18-with-var","[get[text]length[]compare:integer:gteq<nr>]");
395
- expect(wiki.filterTiddlers("[tag[textexample]] :filter[get[text]length[]compare:integer:gteq[18]]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake");
396
- expect(wiki.filterTiddlers("[tag[textexample]]",anchorWidget).join(",")).toBe("Sparkling water,Red wine,Cheesecake,Chocolate Cake");
397
- expect(wiki.filterTiddlers("[tag[textexample]filter<larger-than-18>]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake");
398
- expect(wiki.filterTiddlers("[tag[textexample]filter<larger-than-18-with-var>]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake");
395
+ expect(wiki.filterTiddlers("[tag[textexample]] :filter[get[text]length[]compare:integer:gteq[18]]",anchorWidget).join(",")).toBe("Cheesecake,Chocolate Cake,Red wine");
396
+ expect(wiki.filterTiddlers("[tag[textexample]]",anchorWidget).join(",")).toBe("Cheesecake,Chocolate Cake,Red wine,Sparkling water");
397
+ expect(wiki.filterTiddlers("[tag[textexample]filter<larger-than-18>]",anchorWidget).join(",")).toBe("Cheesecake,Chocolate Cake,Red wine");
398
+ expect(wiki.filterTiddlers("[tag[textexample]filter<larger-than-18-with-var>]",anchorWidget).join(",")).toBe("Cheesecake,Chocolate Cake,Red wine");
399
399
  });
400
400
 
401
401
  it("should handle the :sort prefix", function() {
@@ -405,7 +405,7 @@ describe("'reduce' and 'intersection' filter prefix tests", function() {
405
405
  expect(wiki.filterTiddlers("[tag[textexample]] :sort:number:[get[text]length[]]").join(",")).toBe("Sparkling water,Chocolate Cake,Red wine,Cheesecake");
406
406
  expect(wiki.filterTiddlers("[tag[textexample]] :sort:number:reverse[get[text]length[]]").join(",")).toBe("Cheesecake,Red wine,Chocolate Cake,Sparkling water");
407
407
  expect(wiki.filterTiddlers("[tag[notatag]] :sort:number[get[price]]").join(",")).toBe("");
408
- expect(wiki.filterTiddlers("[tag[cakes]] :sort:string[{!!title}]").join(",")).toBe("Cheesecake,cheesecake,Chocolate Cake,chocolate cake,Persian love cake,Pound cake");
408
+ expect(wiki.filterTiddlers("[tag[cakes]] :sort:string[{!!title}]").join(",")).toBe("cheesecake,Cheesecake,chocolate cake,Chocolate Cake,Persian love cake,Pound cake");
409
409
  expect(wiki.filterTiddlers("[tag[cakes]] :sort:string:casesensitive[{!!title}]").join(",")).toBe("Cheesecake,Chocolate Cake,Persian love cake,Pound cake,cheesecake,chocolate cake");
410
410
  expect(wiki.filterTiddlers("[tag[cakes]] :sort:string:casesensitive,reverse[{!!title}]").join(",")).toBe("chocolate cake,cheesecake,Pound cake,Persian love cake,Chocolate Cake,Cheesecake");
411
411
  });
@@ -102,6 +102,25 @@ function runTests(wiki,wikiOptions) {
102
102
  expect(wiki.filterTiddlers("[tag[TiddlerSeventh]]").join(",")).toBe("Tiddler10,TiddlerOne,Tiddler Three,Tiddler11,Tiddler9,a fourth tiddler");
103
103
  });
104
104
 
105
+ it("should apply identical tag ordering irrespective of tag creation order", function () {
106
+ var wiki;
107
+ wiki = new $tw.Wiki(wikiOptions);
108
+ wiki.addTiddler({ title: "A", text: "", tags: "sortTag"});
109
+ wiki.addTiddler({ title: "B", text: "", tags: "sortTag"});
110
+ wiki.addTiddler({ title: "C", text: "", tags: "sortTag"});
111
+ expect(wiki.filterTiddlers("[tag[sortTag]]").join(',')).toBe("A,B,C");
112
+ wiki = new $tw.Wiki(wikiOptions);
113
+ wiki.addTiddler({ title: "A", text: "", tags: "sortTag"});
114
+ wiki.addTiddler({ title: "C", text: "", tags: "sortTag"});
115
+ wiki.addTiddler({ title: "B", text: "", tags: "sortTag"});
116
+ expect(wiki.filterTiddlers("[tag[sortTag]]").join(',')).toBe("A,B,C");
117
+ wiki = new $tw.Wiki(wikiOptions);
118
+ wiki.addTiddler({ title: "C", text: "", tags: "sortTag"});
119
+ wiki.addTiddler({ title: "B", text: "", tags: "sortTag"});
120
+ wiki.addTiddler({ title: "A", text: "", tags: "sortTag"});
121
+ expect(wiki.filterTiddlers("[tag[sortTag]]").join(',')).toBe("A,B,C");
122
+ });
123
+
105
124
  // Tests for issue (#3296)
106
125
  it("should apply tag ordering in order of dependency", function () {
107
126
  var wiki = new $tw.Wiki(wikiOptions);
@@ -169,6 +169,16 @@ describe("Utility tests", function() {
169
169
  expect(cv("1.1.1","1.1.2")).toEqual(-1);
170
170
  });
171
171
 
172
+ it("should insert strings into sorted arrays", function() {
173
+ expect($tw.utils.insertSortedArray([],"a").join(",")).toEqual("a");
174
+ expect($tw.utils.insertSortedArray(["b","c","d"],"a").join(",")).toEqual("a,b,c,d");
175
+ expect($tw.utils.insertSortedArray(["b","c","d"],"d").join(",")).toEqual("b,c,d");
176
+ expect($tw.utils.insertSortedArray(["b","c","d"],"f").join(",")).toEqual("b,c,d,f");
177
+ expect($tw.utils.insertSortedArray(["b","c","d","e"],"f").join(",")).toEqual("b,c,d,e,f");
178
+ expect($tw.utils.insertSortedArray(["b","c","g"],"f").join(",")).toEqual("b,c,f,g");
179
+ expect($tw.utils.insertSortedArray(["b","c","d"],"ccc").join(",")).toEqual("b,c,ccc,d");
180
+ });
181
+
172
182
  });
173
183
 
174
184
  })();