tiddlywiki 5.3.0 → 5.3.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 (448) hide show
  1. package/.github/workflows/ci.yml +9 -2
  2. package/bin/build-site.sh +25 -5
  3. package/bin/ci-test.sh +16 -0
  4. package/boot/boot.js +18 -7
  5. package/core/images/new-journal-button.tid +1 -3
  6. package/core/language/en-GB/Exporters.multids +1 -1
  7. package/core/language/en-GB/Help/commands.tid +1 -1
  8. package/core/language/en-GB/Help/savewikifolder.tid +2 -2
  9. package/core/language/en-GB/Help/server.tid +1 -1
  10. package/core/language/en-GB/Types/image_svg_xml.tid +1 -1
  11. package/core/language/en-GB/Types/image_x-icon.tid +1 -1
  12. package/core/modules/commands/savetiddlers.js +1 -1
  13. package/core/modules/editor/engines/framed.js +1 -1
  14. package/core/modules/editor/engines/simple.js +1 -1
  15. package/core/modules/filters/all.js +5 -5
  16. package/core/modules/filters/encodings.js +6 -2
  17. package/core/modules/filters/json-ops.js +95 -1
  18. package/core/modules/filters/listops.js +1 -0
  19. package/core/modules/parsers/textparser.js +5 -4
  20. package/core/modules/parsers/wikiparser/rules/conditional.js +120 -0
  21. package/core/modules/parsers/wikiparser/rules/fnprocdef.js +2 -2
  22. package/core/modules/parsers/wikiparser/rules/parameters.js +1 -1
  23. package/core/modules/parsers/wikiparser/wikiparser.js +31 -8
  24. package/core/modules/savers/github.js +1 -1
  25. package/core/modules/startup/rootwidget.js +1 -0
  26. package/core/modules/startup/startup.js +5 -0
  27. package/core/modules/startup/windows.js +2 -1
  28. package/core/modules/syncer.js +160 -122
  29. package/core/modules/utils/dom/dom.js +3 -3
  30. package/core/modules/utils/dom/dragndrop.js +4 -2
  31. package/core/modules/utils/dom/http.js +19 -3
  32. package/core/modules/utils/fakedom.js +5 -1
  33. package/core/modules/utils/utils.js +27 -4
  34. package/core/modules/widgets/browse.js +10 -0
  35. package/core/modules/widgets/button.js +15 -3
  36. package/core/modules/widgets/checkbox.js +14 -1
  37. package/core/modules/widgets/draggable.js +16 -5
  38. package/core/modules/widgets/droppable.js +14 -2
  39. package/core/modules/widgets/image.js +19 -14
  40. package/core/modules/widgets/importvariables.js +1 -1
  41. package/core/modules/widgets/link.js +12 -2
  42. package/core/modules/widgets/list.js +176 -19
  43. package/core/modules/widgets/radio.js +4 -0
  44. package/core/modules/widgets/range.js +4 -0
  45. package/core/modules/widgets/scrollable.js +66 -1
  46. package/core/modules/widgets/select.js +35 -23
  47. package/core/modules/widgets/transclude.js +88 -45
  48. package/core/modules/widgets/widget.js +42 -47
  49. package/core/modules/wiki.js +3 -3
  50. package/core/templates/html-json-skinny-tiddler.tid +0 -1
  51. package/core/templates/html-json-tiddler.tid +1 -1
  52. package/core/templates/store.area.template.html.tid +4 -4
  53. package/core/ui/AlertTemplate.tid +1 -0
  54. package/core/ui/ControlPanel/Basics.tid +2 -2
  55. package/core/ui/EditTemplate/body/default.tid +12 -8
  56. package/core/ui/EditTemplate/fields.tid +2 -2
  57. package/core/ui/EditTemplate/type.tid +1 -1
  58. package/core/ui/EditTemplate.tid +1 -0
  59. package/core/ui/EditorToolbar/preview.tid +6 -0
  60. package/core/ui/ImportPreviews/Text.tid +1 -0
  61. package/core/ui/PageStylesheet.tid +1 -0
  62. package/core/ui/PageTemplate.tid +2 -1
  63. package/core/ui/RootTemplate.tid +1 -0
  64. package/core/ui/StoryTiddlerTemplate.tid +1 -0
  65. package/core/ui/ViewTemplate/body/default.tid +1 -0
  66. package/core/ui/ViewTemplate/subtitle.tid +2 -5
  67. package/core/ui/ViewTemplate.tid +1 -0
  68. package/core/wiki/config/OfficialPluginLibrary.tid +1 -1
  69. package/core/wiki/config/ViewTemplateBodyFilters.multids +2 -1
  70. package/core/wiki/macros/colour-picker.tid +6 -6
  71. package/core/wiki/macros/image-picker.tid +5 -5
  72. package/core/wiki/macros/list.tid +95 -78
  73. package/core/wiki/macros/tabs.tid +9 -1
  74. package/core/wiki/macros/tag-picker.tid +2 -2
  75. package/core/wiki/macros/tag.tid +2 -1
  76. package/core/wiki/macros/toc.tid +3 -3
  77. package/core/wiki/tags/ViewTemplateBodyFilter.tid +1 -2
  78. package/editions/de-AT/tiddlers/HelloThere.tid +2 -2
  79. package/editions/de-AT/tiddlers/community/Fur_Entwickler.tid +1 -1
  80. package/editions/de-AT/tiddlers/external/tiddlywiki.files +1 -1
  81. package/editions/de-AT-server/tiddlers/system/favicon.png +0 -0
  82. package/editions/{es-ES-server/tiddlers/system/favicon.ico.meta → de-AT-server/tiddlers/system/favicon.png.meta} +1 -1
  83. package/editions/dev/tiddlers/images/favicon.png +0 -0
  84. package/editions/{de-AT-server/tiddlers/system/favicon.ico.meta → dev/tiddlers/images/favicon.png.meta} +1 -1
  85. package/editions/dev/tiddlers/new/HookMechanism.tid +28 -3
  86. package/editions/empty/tiddlywiki.info +5 -2
  87. package/editions/es-ES/tiddlers/Forums.tid +4 -5
  88. package/editions/es-ES/tiddlers/HelloThere.tid +2 -2
  89. package/editions/es-ES/tiddlers/Typography.tid +1 -1
  90. package/editions/es-ES/tiddlers/images/favicon.png +0 -0
  91. package/editions/{dev/tiddlers/images/favicon.ico.meta → es-ES/tiddlers/images/favicon.png.meta} +1 -1
  92. package/editions/es-ES/tiddlers/images/green_favicon.png +0 -0
  93. package/editions/es-ES/tiddlers/images/{green_favicon.ico.meta → green_favicon.png.meta} +1 -1
  94. package/editions/es-ES-server/tiddlers/system/favicon.png +0 -0
  95. package/editions/{es-ES/tiddlers/images/favicon.ico.meta → es-ES-server/tiddlers/system/favicon.png.meta} +1 -1
  96. package/editions/fr-FR/tiddlers/images/favicon.png +0 -0
  97. package/editions/fr-FR/tiddlers/images/favicon.png.meta +2 -0
  98. package/editions/fr-FR/tiddlers/images/green_favicon.png +0 -0
  99. package/editions/fr-FR/tiddlers/images/{green_favicon.ico.meta → green_favicon.png.meta} +1 -1
  100. package/editions/fr-FR-server/tiddlers/system/favicon.png +0 -0
  101. package/editions/fr-FR-server/tiddlers/system/favicon.png.meta +2 -0
  102. package/editions/highlightdemo/tiddlywiki.info +1 -1
  103. package/editions/ja-JP/tiddlers/images/favicon.png +0 -0
  104. package/editions/ja-JP/tiddlers/images/favicon.png.meta +2 -0
  105. package/editions/ja-JP/tiddlers/images/green_favicon.png +0 -0
  106. package/editions/ja-JP/tiddlers/images/{green_favicon.ico.meta → green_favicon.png.meta} +1 -1
  107. package/editions/katexdemo/tiddlywiki.info +1 -1
  108. package/editions/ko-KR/tiddlers/images/favicon.png +0 -0
  109. package/editions/ko-KR/tiddlers/images/favicon.png.meta +2 -0
  110. package/editions/ko-KR/tiddlers/images/green_favicon.png +0 -0
  111. package/editions/ko-KR/tiddlers/images/{green_favicon.ico.meta → green_favicon.png.meta} +1 -1
  112. package/editions/ko-KR-server/tiddlers/system/favicon.png +0 -0
  113. package/editions/ko-KR-server/tiddlers/system/favicon.png.meta +2 -0
  114. package/editions/pluginlibrary/tiddlywiki.info +2 -2
  115. package/editions/prerelease/tiddlers/{Release 5.3.1.tid → Release 5.3.3.tid } +23 -21
  116. package/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid +1 -1
  117. package/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid +1 -1
  118. package/editions/prerelease/tiddlers/system/TiddlyWiki Pre-release.tid +1 -1
  119. package/editions/prerelease/tiddlers/system/favicon.png +0 -0
  120. package/editions/prerelease/tiddlers/system/favicon.png.meta +2 -0
  121. package/editions/prerelease/tiddlers/system/temp-my-scroll-position.tid +3 -0
  122. package/editions/resumebuilder/tiddlywiki.info +1 -1
  123. package/editions/server/tiddlywiki.info +1 -1
  124. package/editions/server-external-js/tiddlywiki.info +1 -1
  125. package/editions/test/playwright.spec.js +25 -0
  126. package/editions/test/tiddlers/tests/data/conditionals/Basic.tid +26 -0
  127. package/editions/test/tiddlers/tests/data/conditionals/BlockMode.tid +37 -0
  128. package/editions/test/tiddlers/tests/data/conditionals/Else.tid +26 -0
  129. package/editions/test/tiddlers/tests/data/conditionals/Elseif.tid +32 -0
  130. package/editions/test/tiddlers/tests/data/conditionals/MissingEndIf.tid +26 -0
  131. package/editions/test/tiddlers/tests/data/conditionals/MultipleResults.tid +12 -0
  132. package/editions/test/tiddlers/tests/data/conditionals/Nested.tid +38 -0
  133. package/editions/test/tiddlers/tests/data/conditionals/NestedElseif.tid +60 -0
  134. package/editions/test/tiddlers/tests/data/functions/IndentedFunctions.tid +24 -0
  135. package/editions/test/tiddlers/tests/data/functions/WikifiedFunctions.tid +1 -1
  136. package/editions/test/tiddlers/tests/data/importvariables/WithSetWidgets.tid +23 -0
  137. package/editions/test/tiddlers/tests/data/importvariables/WithSetWidgets2.tid +22 -0
  138. package/editions/test/tiddlers/tests/data/importvariables/WithSetWidgetsAndMacros.tid +29 -0
  139. package/editions/test/tiddlers/tests/data/list-widget/WithExplicitTemplates.tid +29 -0
  140. package/editions/test/tiddlers/tests/data/list-widget/WithExplicitTemplatesInBlockMode.tid +32 -0
  141. package/editions/test/tiddlers/tests/data/list-widget/WithExplicitTemplatesOverriddenByAttributes.tid +33 -0
  142. package/editions/test/tiddlers/tests/data/list-widget/WithJoinTemplate.tid +30 -0
  143. package/editions/test/tiddlers/tests/data/list-widget/WithJoinTemplateInBlockMode.tid +32 -0
  144. package/editions/test/tiddlers/tests/data/list-widget/WithLimit.tid +25 -0
  145. package/editions/test/tiddlers/tests/data/list-widget/WithMissingTemplate.tid +26 -0
  146. package/editions/test/tiddlers/tests/data/procedures/Nested-indented.tid +20 -0
  147. package/editions/test/tiddlers/tests/data/procedures/TrailingNewlines.tid +22 -0
  148. package/editions/test/tiddlers/tests/data/transclude/CustomWidget-CodeblockOverride-TextParser.tid +20 -0
  149. package/editions/test/tiddlers/tests/data/transclude/CustomWidget-Simple-Indented.tid +33 -0
  150. package/editions/test/tiddlers/tests/data/transclude/Parameterised-Shortcut-ParametersIndented.tid +20 -0
  151. package/editions/test/tiddlers/tests/data/transclude/Procedures-Double-Underscore.tid +26 -0
  152. package/editions/test/tiddlers/tests/data/transclude/Variable-Refreshing.tid +27 -0
  153. package/editions/test/tiddlers/tests/data/transclude/Variable-Static.tid +15 -0
  154. package/editions/test/tiddlers/tests/data/widgets/DataAttributes/ButtonWidget-DataAttributes.tid +27 -0
  155. package/editions/test/tiddlers/tests/data/widgets/DataAttributes/CheckboxWidget-DataAttributes.tid +22 -0
  156. package/editions/test/tiddlers/tests/data/widgets/DataAttributes/DraggableWidget-DataAttributes.tid +27 -0
  157. package/editions/test/tiddlers/tests/data/widgets/DataAttributes/DroppableWidget-DataAttributes.tid +27 -0
  158. package/editions/test/tiddlers/tests/data/widgets/DataAttributes/LinkWidget-DataAttributes.tid +27 -0
  159. package/editions/test/tiddlers/tests/data/widgets/DataAttributes/OrderedStyleAttributes.tid +15 -0
  160. package/editions/test/tiddlers/tests/data/widgets/DataAttributes/SelectWidget-DataAttributes.tid +27 -0
  161. package/editions/test/tiddlers/tests/data/widgets/ElementWidgetEventAttributes.tid +15 -0
  162. package/editions/test/tiddlers/tests/data/widgets/ElementWidgetStyleAttributes.tid +15 -0
  163. package/editions/test/tiddlers/tests/data/widgets/SubstitutedAttributes.tid +5 -3
  164. package/editions/test/tiddlers/tests/test-filters.js +5 -4
  165. package/editions/test/tiddlers/tests/test-json-filters.js +40 -0
  166. package/editions/test/tiddlers/tests/test-utils.js +23 -0
  167. package/editions/test/tiddlers/tests/test-widget.js +62 -0
  168. package/editions/tw.org/tiddlers/$__favicon.ico.png +0 -0
  169. package/editions/tw.org/tiddlywiki.info +1 -1
  170. package/editions/tw5.com/tiddlers/_tw_shared/favicons/classic.tiddlywiki.com.png +0 -0
  171. package/editions/tw5.com/tiddlers/_tw_shared/favicons/{classic.tiddlywiki.com.ico.meta → classic.tiddlywiki.com.png.meta} +1 -1
  172. package/editions/tw5.com/tiddlers/_tw_shared/favicons/links.tiddlywiki.org.png +0 -0
  173. package/editions/tw5.com/tiddlers/_tw_shared/favicons/{links.tiddlywiki.org.ico.meta → links.tiddlywiki.org.png.meta} +1 -1
  174. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.com.dev.png +0 -0
  175. package/editions/tw5.com/tiddlers/_tw_shared/favicons/{tiddlywiki.com.dev.ico.meta → tiddlywiki.com.dev.png.meta} +1 -1
  176. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.com.png +0 -0
  177. package/editions/tw5.com/tiddlers/_tw_shared/favicons/{tiddlywiki.com.ico.meta → tiddlywiki.com.png.meta} +1 -1
  178. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.com.prerelease.png +0 -0
  179. package/editions/tw5.com/tiddlers/_tw_shared/favicons/{tiddlywiki.com.prerelease.ico.meta → tiddlywiki.com.prerelease.png.meta} +1 -1
  180. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.com.upgrade.png +0 -0
  181. package/editions/tw5.com/tiddlers/_tw_shared/favicons/{tiddlywiki.com.upgrade.ico.meta → tiddlywiki.com.upgrade.png.meta} +1 -1
  182. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.org.png +0 -0
  183. package/editions/tw5.com/tiddlers/about/Archive.tid +82 -0
  184. package/editions/tw5.com/tiddlers/community/Chinese Community.tid +20 -0
  185. package/editions/tw5.com/tiddlers/community/editions/Tidme by oflg.tid +16 -0
  186. package/editions/tw5.com/tiddlers/community/plugins/FSRS4TW by oflg.tid +10 -0
  187. package/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Posts.tid +3 -3
  188. package/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid +3 -1
  189. package/editions/tw5.com/tiddlers/community/tutorials/GitHub Saver Tutorial by Mohammad.tid +5 -5
  190. package/editions/tw5.com/tiddlers/concepts/Macros.tid +7 -3
  191. package/editions/tw5.com/tiddlers/concepts/Title List.tid +5 -1
  192. package/editions/tw5.com/tiddlers/definitions/Git.tid +9 -0
  193. package/editions/tw5.com/tiddlers/definitions/GitHub.tid +6 -4
  194. package/editions/tw5.com/tiddlers/definitions/GitLab.tid +13 -0
  195. package/editions/tw5.com/tiddlers/demonstrations/TableOfContents/Fourth.tid +2 -0
  196. package/editions/tw5.com/tiddlers/demonstrations/TableOfContents/SecondThreeThree.tid +11 -1
  197. package/editions/tw5.com/tiddlers/demonstrations/TableOfContents/Third.tid +2 -0
  198. package/editions/tw5.com/tiddlers/filters/decodebase64 Operator.tid +6 -1
  199. package/editions/tw5.com/tiddlers/filters/encodebase64 Operator.tid +6 -1
  200. package/editions/tw5.com/tiddlers/filters/examples/jsonset.tid +59 -0
  201. package/editions/tw5.com/tiddlers/filters/examples/jsonstringify Operator (Examples).tid +7 -5
  202. package/editions/tw5.com/tiddlers/filters/examples/stringify_Operator_(Examples).tid +5 -3
  203. package/editions/tw5.com/tiddlers/filters/jsonextract.tid +8 -0
  204. package/editions/tw5.com/tiddlers/filters/jsonget.tid +8 -0
  205. package/editions/tw5.com/tiddlers/filters/jsonset.tid +64 -0
  206. package/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid +14 -15
  207. package/editions/tw5.com/tiddlers/filters/jsontype.tid +8 -0
  208. package/editions/tw5.com/tiddlers/filters/stringify_Operator.tid +12 -15
  209. package/editions/tw5.com/tiddlers/filters/substitute Operator.tid +3 -3
  210. package/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +1 -1
  211. package/editions/tw5.com/tiddlers/hellothere/HelloThere.tid +6 -1
  212. package/editions/tw5.com/tiddlers/howtos/Constructing JSON tiddlers.tid +3 -3
  213. package/editions/tw5.com/tiddlers/images/Favicon template.svg +296 -0
  214. package/editions/tw5.com/tiddlers/images/Favicon template.svg.meta +3 -0
  215. package/editions/tw5.com/tiddlers/images/New Release Banner.png +0 -0
  216. package/editions/tw5.com/tiddlers/images/{New Release Banner.jpg.meta → New Release Banner.png.meta } +1 -1
  217. package/editions/tw5.com/tiddlers/images/favicon.png +0 -0
  218. package/editions/tw5.com/tiddlers/images/favicon.png.meta +2 -0
  219. package/editions/tw5.com/tiddlers/images/green_favicon.png +0 -0
  220. package/editions/tw5.com/tiddlers/images/green_favicon.png.meta +2 -0
  221. package/editions/tw5.com/tiddlers/macros/CoreMacros.tid +1 -1
  222. package/editions/tw5.com/tiddlers/macros/TagMacro.tid +3 -1
  223. package/editions/tw5.com/tiddlers/macros/examples/tag.tid +22 -1
  224. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-close-window.tid +2 -2
  225. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-download-file.tid +3 -3
  226. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-edit-bitmap-operation.tid +3 -3
  227. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-edit-text-operation.tid +2 -2
  228. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid +2 -2
  229. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-http-request Example Random Dog.tid +90 -0
  230. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-http-request Example Zotero.tid +4 -3
  231. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-http-request.tid +4 -2
  232. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-modal.tid +2 -2
  233. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-new-tiddler.tid +3 -3
  234. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-notify.tid +3 -3
  235. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-external-window.tid +4 -3
  236. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-window.tid +12 -5
  237. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-permalink.tid +1 -1
  238. package/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-save-wiki.tid +3 -3
  239. package/editions/tw5.com/tiddlers/pragmas/Pragma_ _procedure.tid +2 -2
  240. package/editions/tw5.com/tiddlers/pragmas/Pragma_ _rules.tid +2 -2
  241. package/editions/tw5.com/tiddlers/pragmas/Pragma_ _whitespace.tid +7 -3
  242. package/editions/tw5.com/tiddlers/pragmas/Pragmas.tid +3 -1
  243. package/editions/tw5.com/tiddlers/procedures/Procedure Definitions.tid +4 -2
  244. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.0.tid +1 -0
  245. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.1.tid +1 -0
  246. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.10.tid +1 -0
  247. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.11.tid +1 -0
  248. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.12.tid +1 -0
  249. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.13.tid +1 -0
  250. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.14.tid +1 -0
  251. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.15.tid +1 -0
  252. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.16.tid +1 -0
  253. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.17.tid +1 -0
  254. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.18.tid +1 -0
  255. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.19.tid +1 -0
  256. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.2.tid +1 -0
  257. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.20.tid +1 -0
  258. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.21.tid +1 -0
  259. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.22.tid +1 -0
  260. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.23.tid +1 -0
  261. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.3.tid +1 -0
  262. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.4.tid +1 -0
  263. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.5.tid +1 -0
  264. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.6.tid +1 -0
  265. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.7.tid +1 -0
  266. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.8.tid +1 -0
  267. package/editions/tw5.com/tiddlers/releasenotes/Release 5.1.9.tid +1 -0
  268. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.0.tid +1 -0
  269. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.1.tid +1 -0
  270. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.2.tid +1 -0
  271. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.3.tid +1 -0
  272. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.4.tid +1 -0
  273. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.5.tid +1 -0
  274. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.6.tid +1 -0
  275. package/editions/tw5.com/tiddlers/releasenotes/Release 5.2.7.tid +1 -0
  276. package/editions/tw5.com/tiddlers/releasenotes/Release 5.3.0.tid +1 -0
  277. package/editions/tw5.com/tiddlers/releasenotes/Release 5.3.1.tid +87 -0
  278. package/editions/tw5.com/tiddlers/releasenotes/Release 5.3.2.tid +184 -0
  279. package/editions/tw5.com/tiddlers/releasenotes/Releases.tid +4 -2
  280. package/editions/tw5.com/tiddlers/releasenotes/TiddlyWiki Releases.tid +1 -1
  281. package/editions/tw5.com/tiddlers/{Saving on Browser with TiddlyStow.tid → saving/Saving on Browser with TiddlyStow.tid } +2 -2
  282. package/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid +5 -1
  283. package/editions/tw5.com/tiddlers/saving/Saving via a Minimal Web Server.tid +8 -11
  284. package/editions/tw5.com/tiddlers/system/tw5.com-styles.tid +5 -0
  285. package/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro.tid +1 -1
  286. package/editions/tw5.com/tiddlers/variables/Behaviour of invoked variables depends on how the variable was declared.tid +52 -0
  287. package/editions/tw5.com/tiddlers/variables/Behaviour of variables invoked via filter expression function call.tid +10 -0
  288. package/editions/tw5.com/tiddlers/variables/Behaviour of variables invoked via filter operator parameter.tid +11 -0
  289. package/editions/tw5.com/tiddlers/variables/Behaviour of variables invoked via normal wikitext.tid +11 -0
  290. package/editions/tw5.com/tiddlers/variables/Behaviour of variables invoked via widget attributes.tid +11 -0
  291. package/editions/tw5.com/tiddlers/variables/Variable Usage.tid +5 -49
  292. package/editions/tw5.com/tiddlers/widgets/ActionListopsWidget.tid +24 -2
  293. package/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid +2 -2
  294. package/editions/tw5.com/tiddlers/widgets/BrowseWidget.tid +3 -1
  295. package/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid +3 -1
  296. package/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid +3 -1
  297. package/editions/tw5.com/tiddlers/widgets/Custom Widgets.tid +3 -1
  298. package/editions/tw5.com/tiddlers/widgets/DraggableWidget.tid +3 -2
  299. package/editions/tw5.com/tiddlers/widgets/DroppableWidget.tid +3 -1
  300. package/editions/tw5.com/tiddlers/widgets/GenesisWidget.tid +1 -1
  301. package/editions/tw5.com/tiddlers/widgets/ImageWidget.tid +2 -1
  302. package/editions/tw5.com/tiddlers/widgets/LinkWidget.tid +3 -1
  303. package/editions/tw5.com/tiddlers/widgets/ListWidget.tid +27 -2
  304. package/editions/tw5.com/tiddlers/widgets/RadioWidget.tid +3 -1
  305. package/editions/tw5.com/tiddlers/widgets/RangeWidget.tid +3 -1
  306. package/editions/tw5.com/tiddlers/widgets/ScrollableWidget.tid +27 -2
  307. package/editions/tw5.com/tiddlers/widgets/SelectWidget.tid +4 -1
  308. package/editions/tw5.com/tiddlers/widgets/SetWidget.tid +17 -1
  309. package/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid +2 -2
  310. package/editions/tw5.com/tiddlers/widgets/examples/ActionListopsWidget (Examples).tid +12 -1
  311. package/editions/tw5.com/tiddlers/wikitext/Anchor Links using HTML.tid +1 -1
  312. package/editions/tw5.com/tiddlers/wikitext/Conditional Shortcut Syntax.tid +62 -0
  313. package/editions/tw5.com/tiddlers/wikitext/Styles and Classes in WikiText.tid +52 -19
  314. package/editions/tw5.com/tiddlers/wikitext/Transclusion and Substitution.tid +3 -3
  315. package/editions/tw5.com/tiddlers/wikitext/Variable Attribute Values.tid +5 -2
  316. package/editions/tw5.com/tiddlers/wikitext/Widget Attributes.tid +8 -3
  317. package/editions/tw5.com/tiddlers/wikitext/Widgets in WikiText.tid +1 -0
  318. package/editions/tw5.com/tiddlywiki.info +9 -3
  319. package/editions/tw5.com-server/tiddlers/system/tiddlywiki.com.server.png +0 -0
  320. package/editions/tw5.com-server/tiddlers/system/tiddlywiki.com.server.png.meta +2 -0
  321. package/editions/zh-Hans/tiddlers/images/favicon.png +0 -0
  322. package/editions/zh-Hans/tiddlers/images/favicon.png.meta +2 -0
  323. package/editions/zh-Hans/tiddlers/images/green_favicon.png +0 -0
  324. package/editions/zh-Hans/tiddlers/images/green_favicon.png.meta +2 -0
  325. package/editions/zh-Hant/tiddlers/images/favicon.png +0 -0
  326. package/editions/zh-Hant/tiddlers/images/favicon.png.meta +2 -0
  327. package/editions/zh-Hant/tiddlers/images/green_favicon.png +0 -0
  328. package/editions/zh-Hant/tiddlers/images/green_favicon.png.meta +2 -0
  329. package/languages/de-DE/Exporters.multids +1 -1
  330. package/languages/de-DE/Help/commands.tid +2 -2
  331. package/languages/de-DE/Help/server.tid +1 -1
  332. package/languages/de-DE/Types/image_x-icon.tid +1 -1
  333. package/languages/es-ES/Buttons.multids +2 -0
  334. package/languages/es-ES/Fields.multids +4 -0
  335. package/languages/es-ES/Help/listen.tid +1 -1
  336. package/languages/es-ES/Help/savewikifolder.tid +16 -1
  337. package/languages/es-ES/Help/server.tid +1 -1
  338. package/languages/es-ES/Misc.multids +3 -0
  339. package/languages/es-ES/SiteTitle.tid +1 -1
  340. package/languages/pl-PL/Exporters.multids +1 -1
  341. package/languages/pl-PL/Help/commands.tid +1 -1
  342. package/languages/pl-PL/Help/savewikifolder.tid +19 -4
  343. package/languages/pl-PL/Help/server.tid +1 -1
  344. package/languages/zh-Hans/Exporters.multids +1 -1
  345. package/languages/zh-Hans/Help/commands.tid +1 -1
  346. package/languages/zh-Hans/Help/savewikifolder.tid +5 -1
  347. package/languages/zh-Hans/Help/server.tid +1 -1
  348. package/languages/zh-Hans/Types/image_svg_xml.tid +1 -1
  349. package/languages/zh-Hans/Types/image_x-icon.tid +1 -1
  350. package/languages/zh-Hant/Exporters.multids +1 -1
  351. package/languages/zh-Hant/Help/commands.tid +1 -1
  352. package/languages/zh-Hant/Help/savewikifolder.tid +5 -1
  353. package/languages/zh-Hant/Help/server.tid +1 -1
  354. package/languages/zh-Hant/Types/image_svg_xml.tid +1 -1
  355. package/languages/zh-Hant/Types/image_x-icon.tid +1 -1
  356. package/licenses/cla-individual.md +20 -0
  357. package/package.json +4 -1
  358. package/playwright.config.js +46 -0
  359. package/plugins/tiddlywiki/codemirror/styles.tid +5 -0
  360. package/plugins/tiddlywiki/comments/styles.tid +8 -8
  361. package/plugins/tiddlywiki/dynannotate/docs/readme.tid +1 -0
  362. package/plugins/tiddlywiki/dynannotate/modules/dynannotate.js +28 -27
  363. package/plugins/tiddlywiki/evernote/modules/enex-deserializer.js +82 -23
  364. package/plugins/tiddlywiki/evernote/readme.tid +1 -0
  365. package/plugins/tiddlywiki/evernote/samples/sample-enex-with-image.xml.enex +2 -2
  366. package/plugins/tiddlywiki/googleanalytics/googleanalytics.js +1 -1
  367. package/plugins/tiddlywiki/googleanalytics/settings.tid +1 -3
  368. package/plugins/tiddlywiki/jasmine/jasmine-plugin.js +9 -2
  369. package/plugins/tiddlywiki/jasmine/run-wiki-based-tests.js +1 -1
  370. package/plugins/tiddlywiki/jasmine/startup.js +2 -1
  371. package/plugins/tiddlywiki/qrcode/barcodereader.js +90 -0
  372. package/plugins/tiddlywiki/qrcode/docs/barcodereader.tid +44 -0
  373. package/plugins/tiddlywiki/qrcode/{doc/usage.tid → docs/makeqr.tid} +4 -4
  374. package/plugins/tiddlywiki/qrcode/docs.tid +3 -0
  375. package/plugins/tiddlywiki/qrcode/{MakeContactQR.tid → examples/make/MakeContactQR.tid} +1 -1
  376. package/plugins/tiddlywiki/qrcode/{MakeGenericQR.tid → examples/make/MakeGenericQR.tid} +1 -1
  377. package/plugins/tiddlywiki/qrcode/{MakeWifiQR.tid → examples/make/MakeWifiQR.tid} +1 -1
  378. package/plugins/tiddlywiki/qrcode/examples/make/make.tid +5 -0
  379. package/plugins/tiddlywiki/qrcode/examples/read/BarCodeReader.tid +17 -0
  380. package/plugins/tiddlywiki/qrcode/examples/read/read.tid +5 -0
  381. package/plugins/tiddlywiki/qrcode/examples.tid +3 -0
  382. package/plugins/tiddlywiki/qrcode/files/html5-qrcode/LICENSE +201 -0
  383. package/plugins/tiddlywiki/qrcode/files/html5-qrcode/README.md +398 -0
  384. package/plugins/tiddlywiki/qrcode/files/html5-qrcode/html5-qrcode.min.js +1 -0
  385. package/plugins/tiddlywiki/qrcode/files/tiddlywiki.files +20 -4
  386. package/plugins/tiddlywiki/qrcode/makeqr.js +1 -1
  387. package/plugins/tiddlywiki/qrcode/plugin.info +1 -1
  388. package/plugins/tiddlywiki/qrcode/readme.tid +15 -0
  389. package/plugins/tiddlywiki/tiddlyweb/html-json-skinny-tiddler.tid +0 -1
  390. package/plugins/tiddlywiki/tiddlyweb/html-json-tiddler.tid +1 -2
  391. package/plugins/tiddlywiki/upgrade/UpgradeWizard.tid +2 -2
  392. package/plugins/tiddlywiki/upgrade/favicon.png +0 -0
  393. package/plugins/tiddlywiki/upgrade/favicon.png.meta +2 -0
  394. package/readme.md +1 -1
  395. package/themes/tiddlywiki/vanilla/base.tid +45 -14
  396. package/themes/tiddlywiki/vanilla/settings.multids +1 -1
  397. package/editions/de-AT-server/tiddlers/system/favicon.ico +0 -0
  398. package/editions/dev/tiddlers/images/favicon.ico +0 -0
  399. package/editions/es-ES/tiddlers/images/favicon.ico +0 -0
  400. package/editions/es-ES/tiddlers/images/green_favicon.ico +0 -0
  401. package/editions/es-ES-server/tiddlers/system/favicon.ico +0 -0
  402. package/editions/fr-FR/tiddlers/images/favicon.ico +0 -0
  403. package/editions/fr-FR/tiddlers/images/favicon.ico.meta +0 -2
  404. package/editions/fr-FR/tiddlers/images/green_favicon.ico +0 -0
  405. package/editions/fr-FR-server/tiddlers/system/favicon.ico +0 -0
  406. package/editions/fr-FR-server/tiddlers/system/favicon.ico.meta +0 -2
  407. package/editions/ja-JP/tiddlers/images/favicon.ico +0 -0
  408. package/editions/ja-JP/tiddlers/images/favicon.ico.meta +0 -2
  409. package/editions/ja-JP/tiddlers/images/green_favicon.ico +0 -0
  410. package/editions/ko-KR/tiddlers/images/favicon.ico +0 -0
  411. package/editions/ko-KR/tiddlers/images/favicon.ico.meta +0 -2
  412. package/editions/ko-KR/tiddlers/images/green_favicon.ico +0 -0
  413. package/editions/ko-KR-server/tiddlers/system/favicon.ico +0 -0
  414. package/editions/ko-KR-server/tiddlers/system/favicon.ico.meta +0 -2
  415. package/editions/prerelease/tiddlers/system/favicon.ico +0 -0
  416. package/editions/prerelease/tiddlers/system/favicon.ico.meta +0 -2
  417. package/editions/tw5.com/tiddlers/_tw_shared/favicons/classic.tiddlywiki.com.ico +0 -0
  418. package/editions/tw5.com/tiddlers/_tw_shared/favicons/links.tiddlywiki.org.ico +0 -0
  419. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.com.dev.ico +0 -0
  420. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.com.ico +0 -0
  421. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.com.prerelease.ico +0 -0
  422. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.com.upgrade.ico +0 -0
  423. package/editions/tw5.com/tiddlers/_tw_shared/favicons/tiddlywiki.org.ico +0 -0
  424. package/editions/tw5.com/tiddlers/community/editions/TiddlyMemo by oflg.tid +0 -16
  425. package/editions/tw5.com/tiddlers/community/tutorials/Install and run TiddlyWiki on a CentOS 6 VPS using Nginx.tid +0 -16
  426. package/editions/tw5.com/tiddlers/images/New Release Banner.jpg +0 -0
  427. package/editions/tw5.com/tiddlers/images/favicon.ico +0 -0
  428. package/editions/tw5.com/tiddlers/images/favicon.ico.meta +0 -2
  429. package/editions/tw5.com/tiddlers/images/green_favicon.ico +0 -0
  430. package/editions/tw5.com/tiddlers/images/green_favicon.ico.meta +0 -2
  431. package/editions/tw5.com-server/tiddlers/system/favicon.ico +0 -0
  432. package/editions/tw5.com-server/tiddlers/system/favicon.ico.meta +0 -2
  433. package/editions/zh-Hans/tiddlers/images/favicon.ico +0 -0
  434. package/editions/zh-Hans/tiddlers/images/favicon.ico.meta +0 -2
  435. package/editions/zh-Hans/tiddlers/images/green_favicon.ico +0 -0
  436. package/editions/zh-Hans/tiddlers/images/green_favicon.ico.meta +0 -2
  437. package/editions/zh-Hant/tiddlers/images/favicon.ico +0 -0
  438. package/editions/zh-Hant/tiddlers/images/favicon.ico.meta +0 -2
  439. package/editions/zh-Hant/tiddlers/images/green_favicon.ico +0 -0
  440. package/editions/zh-Hant/tiddlers/images/green_favicon.ico.meta +0 -2
  441. package/plugins/tiddlywiki/qrcode/doc/examples.tid +0 -3
  442. package/plugins/tiddlywiki/qrcode/doc/readme.tid +0 -13
  443. package/plugins/tiddlywiki/upgrade/favicon.ico +0 -0
  444. package/plugins/tiddlywiki/upgrade/favicon.ico.meta +0 -2
  445. /package/editions/tw5.com/tiddlers/_tw_shared/favicons/{tiddlywiki.org.ico.meta → tiddlywiki.org.png.meta} +0 -0
  446. /package/plugins/tiddlywiki/qrcode/files/{LICENSE → qrcode/LICENSE} +0 -0
  447. /package/plugins/tiddlywiki/qrcode/files/{README.md → qrcode/README.md} +0 -0
  448. /package/plugins/tiddlywiki/qrcode/files/{qrcode.js → qrcode/qrcode.js} +0 -0
@@ -104,7 +104,11 @@ TW_Element.prototype.setAttribute = function(name,value) {
104
104
  if(this.isRaw) {
105
105
  throw "Cannot setAttribute on a raw TW_Element";
106
106
  }
107
- this.attributes[name] = value + "";
107
+ if(name === "style") {
108
+ this.style = value;
109
+ } else {
110
+ this.attributes[name] = value + "";
111
+ }
108
112
  };
109
113
 
110
114
  TW_Element.prototype.setAttributeNS = function(namespace,name,value) {
@@ -819,18 +819,41 @@ exports.hashString = function(str) {
819
819
  },0);
820
820
  };
821
821
 
822
+ /*
823
+ Base64 utility functions that work in either browser or Node.js
824
+ */
825
+ if(typeof window !== 'undefined') {
826
+ exports.btoa = function(binstr) { return window.btoa(binstr); }
827
+ exports.atob = function(b64) { return window.atob(b64); }
828
+ } else {
829
+ exports.btoa = function(binstr) {
830
+ return Buffer.from(binstr, 'binary').toString('base64');
831
+ }
832
+ exports.atob = function(b64) {
833
+ return Buffer.from(b64, 'base64').toString('binary');
834
+ }
835
+ }
836
+
822
837
  /*
823
838
  Decode a base64 string
824
839
  */
825
- exports.base64Decode = function(string64) {
826
- return base64utf8.base64.decode.call(base64utf8,string64);
840
+ exports.base64Decode = function(string64,binary,urlsafe) {
841
+ var encoded = urlsafe ? string64.replace(/_/g,'/').replace(/-/g,'+') : string64;
842
+ if(binary) return exports.atob(encoded)
843
+ else return base64utf8.base64.decode.call(base64utf8,encoded);
827
844
  };
828
845
 
829
846
  /*
830
847
  Encode a string to base64
831
848
  */
832
- exports.base64Encode = function(string64) {
833
- return base64utf8.base64.encode.call(base64utf8,string64);
849
+ exports.base64Encode = function(string64,binary,urlsafe) {
850
+ var encoded;
851
+ if(binary) encoded = exports.btoa(string64);
852
+ else encoded = base64utf8.base64.encode.call(base64utf8,string64);
853
+ if(urlsafe) {
854
+ encoded = encoded.replace(/\+/g,'-').replace(/\//g,'_');
855
+ }
856
+ return encoded;
834
857
  };
835
858
 
836
859
  /*
@@ -70,6 +70,11 @@ BrowseWidget.prototype.render = function(parent,nextSibling) {
70
70
  }
71
71
  return false;
72
72
  },false);
73
+ // Assign data- attributes
74
+ this.assignAttributes(domNode,{
75
+ sourcePrefix: "data-",
76
+ destPrefix: "data-"
77
+ });
73
78
  // Insert element
74
79
  parent.insertBefore(domNode,nextSibling);
75
80
  this.renderChildren(domNode,null);
@@ -95,6 +100,11 @@ BrowseWidget.prototype.execute = function() {
95
100
  Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
96
101
  */
97
102
  BrowseWidget.prototype.refresh = function(changedTiddlers) {
103
+ var changedAttributes = this.computeAttributes();
104
+ if($tw.utils.count(changedAttributes) > 0) {
105
+ this.refreshSelf();
106
+ return true;
107
+ }
98
108
  return false;
99
109
  };
100
110
 
@@ -59,6 +59,11 @@ ButtonWidget.prototype.render = function(parent,nextSibling) {
59
59
  $tw.utils.pushTop(classes,"tc-popup-handle");
60
60
  }
61
61
  domNode.className = classes.join(" ");
62
+ // Assign data- attributes
63
+ this.assignAttributes(domNode,{
64
+ sourcePrefix: "data-",
65
+ destPrefix: "data-"
66
+ });
62
67
  // Assign other attributes
63
68
  if(this.style) {
64
69
  domNode.setAttribute("style",this.style);
@@ -250,7 +255,7 @@ ButtonWidget.prototype.updateDomNodeClasses = function() {
250
255
  //Add new classes from updated class attribute.
251
256
  $tw.utils.pushTop(domNodeClasses,newClasses);
252
257
  this.domNode.className = domNodeClasses.join(" ");
253
- }
258
+ };
254
259
 
255
260
  /*
256
261
  Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
@@ -260,8 +265,15 @@ ButtonWidget.prototype.refresh = function(changedTiddlers) {
260
265
  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.popupAbsCoords || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled || changedAttributes["default"]) {
261
266
  this.refreshSelf();
262
267
  return true;
263
- } else if(changedAttributes["class"]) {
264
- this.updateDomNodeClasses();
268
+ } else {
269
+ if(changedAttributes["class"]) {
270
+ this.updateDomNodeClasses();
271
+ }
272
+ this.assignAttributes(this.domNodes[0],{
273
+ changedAttributes: changedAttributes,
274
+ sourcePrefix: "data-",
275
+ destPrefix: "data-"
276
+ });
265
277
  }
266
278
  return this.refreshChildren(changedTiddlers);
267
279
  };
@@ -53,6 +53,11 @@ CheckboxWidget.prototype.render = function(parent,nextSibling) {
53
53
  this.labelDomNode.appendChild(this.inputDomNode);
54
54
  this.spanDomNode = this.document.createElement("span");
55
55
  this.labelDomNode.appendChild(this.spanDomNode);
56
+ // Assign data- attributes
57
+ this.assignAttributes(this.inputDomNode,{
58
+ sourcePrefix: "data-",
59
+ destPrefix: "data-"
60
+ });
56
61
  // Add a click event handler
57
62
  $tw.utils.addEventListeners(this.inputDomNode,[
58
63
  {name: "change", handlerObject: this, handlerMethod: "handleChangeEvent"}
@@ -116,7 +121,7 @@ CheckboxWidget.prototype.getValue = function() {
116
121
  } else {
117
122
  list = $tw.utils.parseStringArray(this.checkboxDefault || "") || [];
118
123
  }
119
- } else if (this.checkboxListIndex) {
124
+ } else if(this.checkboxListIndex) {
120
125
  list = $tw.utils.parseStringArray(this.wiki.extractTiddlerDataItem(tiddler,this.checkboxListIndex,this.checkboxDefault || "")) || [];
121
126
  } else {
122
127
  list = this.wiki.filterTiddlers(this.checkboxFilter,this) || [];
@@ -215,6 +220,8 @@ CheckboxWidget.prototype.handleChangeEvent = function(event) {
215
220
  if($tw.utils.isArray(fieldContents)) {
216
221
  // Make a copy so we can modify it without changing original that's refrenced elsewhere
217
222
  listContents = fieldContents.slice(0);
223
+ } else if(fieldContents === undefined) {
224
+ listContents = [];
218
225
  } else if(typeof fieldContents === "string") {
219
226
  listContents = $tw.utils.parseStringArray(fieldContents);
220
227
  // No need to copy since parseStringArray returns a fresh array, not refrenced elsewhere
@@ -323,6 +330,11 @@ CheckboxWidget.prototype.refresh = function(changedTiddlers) {
323
330
  $tw.utils.removeClass(this.labelDomNode,"tc-checkbox-checked");
324
331
  }
325
332
  }
333
+ this.assignAttributes(this.inputDomNode,{
334
+ changedAttributes: changedAttributes,
335
+ sourcePrefix: "data-",
336
+ destPrefix: "data-"
337
+ });
326
338
  return this.refreshChildren(changedTiddlers) || refreshed;
327
339
  }
328
340
  };
@@ -330,3 +342,4 @@ CheckboxWidget.prototype.refresh = function(changedTiddlers) {
330
342
  exports.checkbox = CheckboxWidget;
331
343
 
332
344
  })();
345
+
@@ -52,6 +52,11 @@ DraggableWidget.prototype.render = function(parent,nextSibling) {
52
52
  classes.push("tc-draggable");
53
53
  }
54
54
  domNode.setAttribute("class",classes.join(" "));
55
+ // Assign data- attributes and style. attributes
56
+ this.assignAttributes(domNode,{
57
+ sourcePrefix: "data-",
58
+ destPrefix: "data-"
59
+ });
55
60
  // Insert the node into the DOM and render any children
56
61
  parent.insertBefore(domNode,nextSibling);
57
62
  this.renderChildren(domNode,null);
@@ -108,13 +113,19 @@ DraggableWidget.prototype.updateDomNodeClasses = function() {
108
113
  Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
109
114
  */
110
115
  DraggableWidget.prototype.refresh = function(changedTiddlers) {
111
- var changedAttributes = this.computeAttributes(),
112
- changedAttributesCount = $tw.utils.count(changedAttributes);
113
- if(changedAttributesCount === 1 && changedAttributes["class"]) {
114
- this.updateDomNodeClasses();
115
- } else if(changedAttributesCount > 0) {
116
+ var changedAttributes = this.computeAttributes();
117
+ if(changedAttributes.tag || changedAttributes.selector || changedAttributes.dragimagetype || changedAttributes.enable || changedAttributes.startactions || changedAttributes.endactions) {
116
118
  this.refreshSelf();
117
119
  return true;
120
+ } else {
121
+ if(changedAttributes["class"]) {
122
+ this.assignDomNodeClasses();
123
+ }
124
+ this.assignAttributes(this.domNodes[0],{
125
+ changedAttributes: changedAttributes,
126
+ sourcePrefix: "data-",
127
+ destPrefix: "data-"
128
+ });
118
129
  }
119
130
  return this.refreshChildren(changedTiddlers);
120
131
  };
@@ -42,6 +42,11 @@ DroppableWidget.prototype.render = function(parent,nextSibling) {
42
42
  domNode = this.document.createElement(tag);
43
43
  this.domNode = domNode;
44
44
  this.assignDomNodeClasses();
45
+ // Assign data- attributes and style. attributes
46
+ this.assignAttributes(domNode,{
47
+ sourcePrefix: "data-",
48
+ destPrefix: "data-"
49
+ });
45
50
  // Add event handlers
46
51
  if(this.droppableEnable) {
47
52
  $tw.utils.addEventListeners(domNode,[
@@ -166,8 +171,15 @@ DroppableWidget.prototype.refresh = function(changedTiddlers) {
166
171
  if(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass || changedAttributes.actions || changedAttributes.effect) {
167
172
  this.refreshSelf();
168
173
  return true;
169
- } else if(changedAttributes["class"]) {
170
- this.assignDomNodeClasses();
174
+ } else {
175
+ if(changedAttributes["class"]) {
176
+ this.assignDomNodeClasses();
177
+ }
178
+ this.assignAttributes(this.domNodes[0],{
179
+ changedAttributes: changedAttributes,
180
+ sourcePrefix: "data-",
181
+ destPrefix: "data-"
182
+ });
171
183
  }
172
184
  return this.refreshChildren(changedTiddlers);
173
185
  };
@@ -58,24 +58,25 @@ ImageWidget.prototype.render = function(parent,nextSibling) {
58
58
  if(this.wiki.isImageTiddler(this.imageSource)) {
59
59
  var type = tiddler.fields.type,
60
60
  text = tiddler.fields.text,
61
- _canonical_uri = tiddler.fields._canonical_uri;
61
+ _canonical_uri = tiddler.fields._canonical_uri,
62
+ typeInfo = $tw.config.contentTypeInfo[type] || {},
63
+ deserializerType = typeInfo.deserializerType || type;
62
64
  // If the tiddler has body text then it doesn't need to be lazily loaded
63
65
  if(text) {
64
- // Render the appropriate element for the image type
65
- switch(type) {
66
- case "application/pdf":
66
+ // Render the appropriate element for the image type by looking up the encoding in the content type info
67
+ var encoding = typeInfo.encoding || "utf8";
68
+ if (encoding === "base64") {
69
+ // .pdf .png .jpg etc.
70
+ src = "data:" + deserializerType + ";base64," + text;
71
+ if (deserializerType === "application/pdf") {
67
72
  tag = "embed";
68
- src = "data:application/pdf;base64," + text;
69
- break;
70
- case "image/svg+xml":
71
- src = "data:image/svg+xml," + encodeURIComponent(text);
72
- break;
73
- default:
74
- src = "data:" + type + ";base64," + text;
75
- break;
73
+ }
74
+ } else {
75
+ // .svg .tid .xml etc.
76
+ src = "data:" + deserializerType + "," + encodeURIComponent(text);
76
77
  }
77
78
  } else if(_canonical_uri) {
78
- switch(type) {
79
+ switch(deserializerType) {
79
80
  case "application/pdf":
80
81
  tag = "embed";
81
82
  src = _canonical_uri;
@@ -99,6 +100,9 @@ ImageWidget.prototype.render = function(parent,nextSibling) {
99
100
  if(this.imageClass) {
100
101
  domNode.setAttribute("class",this.imageClass);
101
102
  }
103
+ if(this.imageUsemap) {
104
+ domNode.setAttribute("usemap",this.imageUsemap);
105
+ }
102
106
  if(this.imageWidth) {
103
107
  domNode.setAttribute("width",this.imageWidth);
104
108
  }
@@ -138,6 +142,7 @@ ImageWidget.prototype.execute = function() {
138
142
  this.imageWidth = this.getAttribute("width");
139
143
  this.imageHeight = this.getAttribute("height");
140
144
  this.imageClass = this.getAttribute("class");
145
+ this.imageUsemap = this.getAttribute("usemap");
141
146
  this.imageTooltip = this.getAttribute("tooltip");
142
147
  this.imageAlt = this.getAttribute("alt");
143
148
  this.lazyLoading = this.getAttribute("loading");
@@ -148,7 +153,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of
148
153
  */
149
154
  ImageWidget.prototype.refresh = function(changedTiddlers) {
150
155
  var changedAttributes = this.computeAttributes();
151
- if(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes["class"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {
156
+ if(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes["class"] || changedAttributes.usemap || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {
152
157
  this.refreshSelf();
153
158
  return true;
154
159
  } else {
@@ -49,7 +49,7 @@ ImportVariablesWidget.prototype.execute = function(tiddlerList) {
49
49
  this.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);
50
50
  // Accumulate the <$set> widgets from each tiddler
51
51
  $tw.utils.each(this.tiddlerList,function(title) {
52
- var parser = widgetPointer.wiki.parseTiddler(title,{parseAsInline:true});
52
+ var parser = widgetPointer.wiki.parseTiddler(title,{parseAsInline:true, configTrimWhiteSpace:true});
53
53
  if(parser) {
54
54
  var parseTreeNode = parser.tree[0];
55
55
  while(parseTreeNode && ["setvariable","set","parameters"].indexOf(parseTreeNode.type) !== -1) {
@@ -43,6 +43,11 @@ LinkWidget.prototype.render = function(parent,nextSibling) {
43
43
  } else {
44
44
  // Just insert the link text
45
45
  var domNode = this.document.createElement("span");
46
+ // Assign data- attributes
47
+ this.assignAttributes(domNode,{
48
+ sourcePrefix: "data-",
49
+ destPrefix: "data-"
50
+ });
46
51
  parent.insertBefore(domNode,nextSibling);
47
52
  this.renderChildren(domNode,null);
48
53
  this.domNodes.push(domNode);
@@ -138,6 +143,11 @@ LinkWidget.prototype.renderLink = function(parent,nextSibling) {
138
143
  widget: this
139
144
  });
140
145
  }
146
+ // Assign data- attributes
147
+ this.assignAttributes(domNode,{
148
+ sourcePrefix: "data-",
149
+ destPrefix: "data-"
150
+ });
141
151
  // Insert the link into the DOM and render any children
142
152
  parent.insertBefore(domNode,nextSibling);
143
153
  this.renderChildren(domNode,null);
@@ -207,8 +217,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of
207
217
  */
208
218
  LinkWidget.prototype.refresh = function(changedTiddlers) {
209
219
  var changedAttributes = this.computeAttributes();
210
- if(changedAttributes.to || changedTiddlers[this.to] || changedAttributes["aria-label"] || changedAttributes.tooltip ||
211
- changedAttributes["class"] || changedAttributes.tabindex || changedAttributes.draggable || changedAttributes.tag) {
220
+ if($tw.utils.count(changedAttributes) > 0) {
212
221
  this.refreshSelf();
213
222
  return true;
214
223
  }
@@ -218,3 +227,4 @@ LinkWidget.prototype.refresh = function(changedTiddlers) {
218
227
  exports.link = LinkWidget;
219
228
 
220
229
  })();
230
+
@@ -28,6 +28,18 @@ Inherit from the base widget class
28
28
  */
29
29
  ListWidget.prototype = new Widget();
30
30
 
31
+ ListWidget.prototype.initialise = function(parseTreeNode,options) {
32
+ // Bail if parseTreeNode is undefined, meaning that the ListWidget constructor was called without any arguments so that it can be subclassed
33
+ if(parseTreeNode === undefined) {
34
+ return;
35
+ }
36
+ // First call parent constructor to set everything else up
37
+ Widget.prototype.initialise.call(this,parseTreeNode,options);
38
+ // Now look for <$list-template> and <$list-empty> widgets as immediate child widgets
39
+ // This is safe to do during initialization because parse trees never change after creation
40
+ this.findExplicitTemplates();
41
+ }
42
+
31
43
  /*
32
44
  Render this widget into the DOM
33
45
  */
@@ -38,8 +50,8 @@ ListWidget.prototype.render = function(parent,nextSibling) {
38
50
  $tw.modules.applyMethods("storyview",this.storyViews);
39
51
  }
40
52
  this.parentDomNode = parent;
41
- this.computeAttributes();
42
- this.execute();
53
+ var changedAttributes = this.computeAttributes();
54
+ this.execute(changedAttributes);
43
55
  this.renderChildren(parent,nextSibling);
44
56
  // Construct the storyview
45
57
  var StoryView = this.storyViews[this.storyViewName];
@@ -59,7 +71,8 @@ ListWidget.prototype.render = function(parent,nextSibling) {
59
71
  /*
60
72
  Compute the internal state of the widget
61
73
  */
62
- ListWidget.prototype.execute = function() {
74
+ ListWidget.prototype.execute = function(changedAttributes) {
75
+ var self = this;
63
76
  // Get our attributes
64
77
  this.template = this.getAttribute("template");
65
78
  this.editTemplate = this.getAttribute("editTemplate");
@@ -67,6 +80,10 @@ ListWidget.prototype.execute = function() {
67
80
  this.counterName = this.getAttribute("counter");
68
81
  this.storyViewName = this.getAttribute("storyview");
69
82
  this.historyTitle = this.getAttribute("history");
83
+ // Create join template only if needed
84
+ if(this.join === undefined || (changedAttributes && changedAttributes.join)) {
85
+ this.join = this.makeJoinTemplate();
86
+ }
70
87
  // Compose the list elements
71
88
  this.list = this.getTiddlerList();
72
89
  var members = [],
@@ -85,18 +102,54 @@ ListWidget.prototype.execute = function() {
85
102
  this.history = [];
86
103
  };
87
104
 
105
+ ListWidget.prototype.findExplicitTemplates = function() {
106
+ var self = this;
107
+ this.explicitListTemplate = null;
108
+ this.explicitEmptyTemplate = null;
109
+ this.explicitJoinTemplate = null;
110
+ this.hasTemplateInBody = false;
111
+ var searchChildren = function(childNodes) {
112
+ $tw.utils.each(childNodes,function(node) {
113
+ if(node.type === "list-template") {
114
+ self.explicitListTemplate = node.children;
115
+ } else if(node.type === "list-empty") {
116
+ self.explicitEmptyTemplate = node.children;
117
+ } else if(node.type === "list-join") {
118
+ self.explicitJoinTemplate = node.children;
119
+ } else if(node.type === "element" && node.tag === "p") {
120
+ searchChildren(node.children);
121
+ } else {
122
+ self.hasTemplateInBody = true;
123
+ }
124
+ });
125
+ };
126
+ searchChildren(this.parseTreeNode.children);
127
+ }
128
+
88
129
  ListWidget.prototype.getTiddlerList = function() {
130
+ var limit = $tw.utils.getInt(this.getAttribute("limit",""),undefined);
89
131
  var defaultFilter = "[!is[system]sort[title]]";
90
- return this.wiki.filterTiddlers(this.getAttribute("filter",defaultFilter),this);
132
+ var results = this.wiki.filterTiddlers(this.getAttribute("filter",defaultFilter),this);
133
+ if(limit !== undefined) {
134
+ if(limit >= 0) {
135
+ results = results.slice(0,limit);
136
+ } else {
137
+ results = results.slice(limit);
138
+ }
139
+ }
140
+ return results;
91
141
  };
92
142
 
93
143
  ListWidget.prototype.getEmptyMessage = function() {
94
144
  var parser,
95
- emptyMessage = this.getAttribute("emptyMessage","");
96
- // this.wiki.parseText() calls
97
- // new Parser(..), which should only be done, if needed, because it's heavy!
98
- if (emptyMessage === "") {
99
- return [];
145
+ emptyMessage = this.getAttribute("emptyMessage");
146
+ // If emptyMessage attribute is not present or empty then look for an explicit empty template
147
+ if(!emptyMessage) {
148
+ if(this.explicitEmptyTemplate) {
149
+ return this.explicitEmptyTemplate;
150
+ } else {
151
+ return [];
152
+ }
100
153
  }
101
154
  parser = this.wiki.parseText("text/vnd.tiddlywiki",emptyMessage,{parseAsInline: true});
102
155
  if(parser) {
@@ -106,6 +159,24 @@ ListWidget.prototype.getEmptyMessage = function() {
106
159
  }
107
160
  };
108
161
 
162
+ /*
163
+ Compose the template for a join between list items
164
+ */
165
+ ListWidget.prototype.makeJoinTemplate = function() {
166
+ var parser,
167
+ join = this.getAttribute("join","");
168
+ if(join) {
169
+ parser = this.wiki.parseText("text/vnd.tiddlywiki",join,{parseAsInline:true})
170
+ if(parser) {
171
+ return parser.tree;
172
+ } else {
173
+ return [];
174
+ }
175
+ } else {
176
+ return this.explicitJoinTemplate; // May be null, and that's fine
177
+ }
178
+ };
179
+
109
180
  /*
110
181
  Compose the template for a list item
111
182
  */
@@ -114,6 +185,7 @@ ListWidget.prototype.makeItemTemplate = function(title,index) {
114
185
  var tiddler = this.wiki.getTiddler(title),
115
186
  isDraft = tiddler && tiddler.hasField("draft.of"),
116
187
  template = this.template,
188
+ join = this.join,
117
189
  templateTree;
118
190
  if(isDraft && this.editTemplate) {
119
191
  template = this.editTemplate;
@@ -122,22 +194,29 @@ ListWidget.prototype.makeItemTemplate = function(title,index) {
122
194
  if(template) {
123
195
  templateTree = [{type: "transclude", attributes: {tiddler: {type: "string", value: template}}}];
124
196
  } else {
197
+ // Check for child nodes of the list widget
125
198
  if(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {
126
- templateTree = this.parseTreeNode.children;
127
- } else {
199
+ // Check for a <$list-item> widget
200
+ if(this.explicitListTemplate) {
201
+ templateTree = this.explicitListTemplate;
202
+ } else if(this.hasTemplateInBody) {
203
+ templateTree = this.parseTreeNode.children;
204
+ }
205
+ }
206
+ if(!templateTree || templateTree.length === 0) {
128
207
  // Default template is a link to the title
129
208
  templateTree = [{type: "element", tag: this.parseTreeNode.isBlock ? "div" : "span", children: [{type: "link", attributes: {to: {type: "string", value: title}}, children: [
130
- {type: "text", text: title}
209
+ {type: "text", text: title}
131
210
  ]}]}];
132
211
  }
133
212
  }
134
213
  // Return the list item
135
- var parseTreeNode = {type: "listitem", itemTitle: title, variableName: this.variableName, children: templateTree};
214
+ var parseTreeNode = {type: "listitem", itemTitle: title, variableName: this.variableName, children: templateTree, join: join};
215
+ parseTreeNode.isLast = index === this.list.length - 1;
136
216
  if(this.counterName) {
137
217
  parseTreeNode.counter = (index + 1).toString();
138
218
  parseTreeNode.counterName = this.counterName;
139
219
  parseTreeNode.isFirst = index === 0;
140
- parseTreeNode.isLast = index === this.list.length - 1;
141
220
  }
142
221
  return parseTreeNode;
143
222
  };
@@ -153,7 +232,7 @@ ListWidget.prototype.refresh = function(changedTiddlers) {
153
232
  this.storyview.refreshStart(changedTiddlers,changedAttributes);
154
233
  }
155
234
  // Completely refresh if any of our attributes have changed
156
- if(changedAttributes.filter || changedAttributes.variable || changedAttributes.counter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {
235
+ if(changedAttributes.filter || changedAttributes.variable || changedAttributes.counter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.join || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {
157
236
  this.refreshSelf();
158
237
  result = true;
159
238
  } else {
@@ -225,6 +304,8 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
225
304
  // If we are providing an counter variable then we must refresh the items, otherwise we can rearrange them
226
305
  var hasRefreshed = false,t;
227
306
  if(this.counterName) {
307
+ var mustRefreshOldLast = false;
308
+ var oldLength = this.children.length;
228
309
  // Cycle through the list and remove and re-insert the first item that has changed, and all the remaining items
229
310
  for(t=0; t<this.list.length; t++) {
230
311
  if(hasRefreshed || !this.children[t] || this.children[t].parseTreeNode.itemTitle !== this.list[t]) {
@@ -232,6 +313,9 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
232
313
  this.removeListItem(t);
233
314
  }
234
315
  this.insertListItem(t,this.list[t]);
316
+ if(!hasRefreshed && t === oldLength) {
317
+ mustRefreshOldLast = true;
318
+ }
235
319
  hasRefreshed = true;
236
320
  } else {
237
321
  // Refresh the item we're reusing
@@ -239,6 +323,12 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
239
323
  hasRefreshed = hasRefreshed || refreshed;
240
324
  }
241
325
  }
326
+ // If items were inserted then we must recreate the item that used to be at the last position as it is no longer last
327
+ if(mustRefreshOldLast && oldLength > 0) {
328
+ var oldLastIdx = oldLength-1;
329
+ this.removeListItem(oldLastIdx);
330
+ this.insertListItem(oldLastIdx,this.list[oldLastIdx]);
331
+ }
242
332
  // If there are items to remove and we have not refreshed then recreate the item that will now be at the last position
243
333
  if(!hasRefreshed && this.children.length > this.list.length) {
244
334
  this.removeListItem(this.list.length-1);
@@ -246,10 +336,29 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
246
336
  }
247
337
  } else {
248
338
  // Cycle through the list, inserting and removing list items as needed
339
+ var mustRecreateLastItem = false;
340
+ if(this.join && this.join.length) {
341
+ if(this.children.length !== this.list.length) {
342
+ mustRecreateLastItem = true;
343
+ } else if(prevList[prevList.length-1] !== this.list[this.list.length-1]) {
344
+ mustRecreateLastItem = true;
345
+ }
346
+ }
347
+ var isLast = false, wasLast = false;
249
348
  for(t=0; t<this.list.length; t++) {
349
+ isLast = t === this.list.length-1;
250
350
  var index = this.findListItem(t,this.list[t]);
351
+ wasLast = index === this.children.length-1;
352
+ if(wasLast && (index !== t || this.children.length !== this.list.length)) {
353
+ mustRecreateLastItem = !!(this.join && this.join.length);
354
+ }
251
355
  if(index === undefined) {
252
356
  // The list item must be inserted
357
+ if(isLast && mustRecreateLastItem && t>0) {
358
+ // First re-create previosly-last item that will no longer be last
359
+ this.removeListItem(t-1);
360
+ this.insertListItem(t-1,this.list[t-1]);
361
+ }
253
362
  this.insertListItem(t,this.list[t]);
254
363
  hasRefreshed = true;
255
364
  } else {
@@ -258,9 +367,15 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
258
367
  this.removeListItem(n);
259
368
  hasRefreshed = true;
260
369
  }
261
- // Refresh the item we're reusing
262
- var refreshed = this.children[t].refresh(changedTiddlers);
263
- hasRefreshed = hasRefreshed || refreshed;
370
+ // Refresh the item we're reusing, or recreate if necessary
371
+ if(mustRecreateLastItem && (isLast || wasLast)) {
372
+ this.removeListItem(t);
373
+ this.insertListItem(t,this.list[t]);
374
+ hasRefreshed = true;
375
+ } else {
376
+ var refreshed = this.children[t].refresh(changedTiddlers);
377
+ hasRefreshed = hasRefreshed || refreshed;
378
+ }
264
379
  }
265
380
  }
266
381
  }
@@ -350,8 +465,17 @@ ListItemWidget.prototype.execute = function() {
350
465
  this.setVariable(this.parseTreeNode.counterName + "-first",this.parseTreeNode.isFirst ? "yes" : "no");
351
466
  this.setVariable(this.parseTreeNode.counterName + "-last",this.parseTreeNode.isLast ? "yes" : "no");
352
467
  }
468
+ // Add join if needed
469
+ var children = this.parseTreeNode.children,
470
+ join = this.parseTreeNode.join;
471
+ if(join && join.length && !this.parseTreeNode.isLast) {
472
+ children = children.slice(0);
473
+ $tw.utils.each(join,function(joinNode) {
474
+ children.push(joinNode);
475
+ })
476
+ }
353
477
  // Construct the child widgets
354
- this.makeChildWidgets();
478
+ this.makeChildWidgets(children);
355
479
  };
356
480
 
357
481
  /*
@@ -363,4 +487,37 @@ ListItemWidget.prototype.refresh = function(changedTiddlers) {
363
487
 
364
488
  exports.listitem = ListItemWidget;
365
489
 
490
+ /*
491
+ Make <$list-template> and <$list-empty> widgets that do nothing
492
+ */
493
+ var ListTemplateWidget = function(parseTreeNode,options) {
494
+ // Main initialisation inherited from widget.js
495
+ this.initialise(parseTreeNode,options);
496
+ };
497
+ ListTemplateWidget.prototype = new Widget();
498
+ ListTemplateWidget.prototype.render = function() {}
499
+ ListTemplateWidget.prototype.refresh = function() { return false; }
500
+
501
+ exports["list-template"] = ListTemplateWidget;
502
+
503
+ var ListEmptyWidget = function(parseTreeNode,options) {
504
+ // Main initialisation inherited from widget.js
505
+ this.initialise(parseTreeNode,options);
506
+ };
507
+ ListEmptyWidget.prototype = new Widget();
508
+ ListEmptyWidget.prototype.render = function() {}
509
+ ListEmptyWidget.prototype.refresh = function() { return false; }
510
+
511
+ exports["list-empty"] = ListEmptyWidget;
512
+
513
+ var ListJoinWidget = function(parseTreeNode,options) {
514
+ // Main initialisation inherited from widget.js
515
+ this.initialise(parseTreeNode,options);
516
+ };
517
+ ListJoinWidget.prototype = new Widget();
518
+ ListJoinWidget.prototype.render = function() {}
519
+ ListJoinWidget.prototype.refresh = function() { return false; }
520
+
521
+ exports["list-join"] = ListJoinWidget;
522
+
366
523
  })();