1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2026-01-25 12:23:42 +00:00

Compare commits

...

549 Commits

Author SHA1 Message Date
jeremy@jermolene.com
e26d0175eb First commit 2021-05-31 10:26:21 +01:00
Bram Chen
652e8b1262 Update chinese translations (#5740) 2021-05-31 07:37:01 +01:00
Joe Bordes
82ec63e711 style(App) eliminate whitespace at the end of code lines (#5735) 2021-05-30 19:20:17 +01:00
Joe Bordes
51fd02d9b6 i18n(en-GB) apply grammarly recommendations found while translating es-ES (#5733) 2021-05-30 18:51:44 +01:00
Joe Bordes
1a6d3e686b i18n(EditorPreview) translate difference view caption (#5732) 2021-05-30 18:49:57 +01:00
Joe Bordes
e694145eec i18n(es-ES) update to version 5.1.23 (#5731) 2021-05-30 18:49:03 +01:00
Simon Huber
3a740b23bb Add tc-small-gap-right to tag-pills in tags editTemplate (#5727) 2021-05-27 14:07:50 +01:00
jeremy@jermolene.com
082aeb92ac Revert "extend lookup op flexibility with 2 parameters (#5315)"
This reverts commit 81b5fe944a.

See https://github.com/Jermolene/TiddlyWiki5/pull/5315#issuecomment-848725198 for explanation
2021-05-26 13:25:19 +01:00
Bram Chen
903cfd98a6 Update chinese translations (#5704) 2021-05-26 07:54:05 +01:00
Simon Huber
eaf1da66b6 Add color-scheme: dark/light to the root element ... (#5720) 2021-05-25 22:22:21 +01:00
Mario Pietsch
c6ed4aa84e allow us to import formerly blocked system tiddlers (#5479) 2021-05-25 22:21:57 +01:00
Mario Pietsch
123666c240 Add th-before-importing hook mechanism (#5464) 2021-05-25 22:19:58 +01:00
Mario Pietsch
68930ceb1b Extend keyboard widget (#5648) 2021-05-25 22:18:37 +01:00
Chris Nicoll
fcea51bb95 Fix typo in saqimtiaz username (#5721) 2021-05-25 21:06:30 +01:00
Joshua Fontany
8d7930f660 Update sync methods (#5467) 2021-05-24 21:16:23 +01:00
Saq Imtiaz
7a41283c6b Format:titlelist operator (#5665) 2021-05-24 19:28:43 +01:00
BlueGreenMagick
c30ce544d1 Fix ViewToolbar items inconsistent spacing (#5473) 2021-05-24 19:24:37 +01:00
Mohammad Rahmani
dcba17fc5f Correct pointer shape and color for disabled button (#5692)
* Update base.tid

this PR addresses the #5625

* Update base.tid

The extra space has been removed!
2021-05-23 18:13:04 +01:00
Mario Pietsch
2ab0474e14 Fix configuration list of HTML5 block elements (#5469) 2021-05-23 17:50:27 +01:00
Cameron Fischer
61714cbda3 Fixed super minor issue with import pragma (#5521) 2021-05-23 17:39:06 +01:00
jeremy@jermolene.com
8fbf52e419 Don't issue plugin reload warning for plugin-type: import
Fixes #5719
2021-05-23 11:19:46 +01:00
Xavier Cazin
3fe5b77770 Updates to fr-FR translations (#5718)
* fr-FR help for the use-browser-cache param of the listen command

* fr-FR dialog heading for drag&drop image import in editor

* fr-FR translations for PutForbidden & PutUnauthorized errors

* fr-FR translations for TiddlySpot and TiddlyHost saver information

* Update to fr-FR translations for named filters in $:/AdvancedSearch tab

* fr-FR translation update for the render command help

* fr-FR update to ModuleTypes translations

* fr-FR help update for the sse-enabled param of the listen command

* fr-FR update to ControlPanel Basics information

* fr-FR translation improvements to TiddlerInfo captions and hints

* fr-FR translation for the Layout Switcher caption

* fr-FR translation updates for Layout-related information

* fr-FR translation for ConfirmAction

* fr-FR for the captions related to tag input clearing
2021-05-23 11:07:55 +01:00
jeremy@jermolene.com
485779f5b2 Fix crash when accessing variables in filters that don't have a widget context
This should catch a large number of crashes, including:

Fixes #5716
2021-05-22 20:00:24 +01:00
Saq Imtiaz
3fc7895af2 CurrentTiddler variable consistency in subfilters and prefixes (#5691)
* Make currentTiddler variable consistent in subfilters and filter run prefixes

* Updated filterun prefix and subfilter operators to use ..currentTiddler instead of outerCurrentTiddler
2021-05-22 19:43:37 +01:00
Saq Imtiaz
bf25c4d34a Docs for new system tag $:/tags/EditorTools (#5705) 2021-05-22 11:07:55 +01:00
Saq Imtiaz
10b20657cc Deserializers[] filter operator (#5673) 2021-05-22 10:50:11 +01:00
Saq Imtiaz
0003d70132 New text operation insert-text (#5707) 2021-05-21 10:35:40 +01:00
Joshua Fontany
81b5fe944a extend lookup op flexibility with 2 parameters (#5315) 2021-05-21 10:11:23 +01:00
Saq Imtiaz
270ead4701 Eventcatcher: Fixed FF and IE bugs, added stopPropagation attribute (#5711) 2021-05-21 09:43:20 +01:00
Nicolas Petton
1ddc3ab037 Add throttling for changed tiddlers prefixed with $:/temp/volatile/ (#5458) 2021-05-21 08:51:15 +01:00
Saq Imtiaz
05d38054c8 Drag and drop images in the editor to import and insert (#5699)
* Merge

* Clean up

* More clean up

* Ensure image import works when type is not set, clean up post import actions

* Removed spurious new line

* For non image files insert a tiddler link

* Added documentation for new settings and features
2021-05-19 21:52:43 +01:00
jeremy@jermolene.com
c7f6cedc43 Update release note 2021-05-19 14:23:54 +01:00
Mario Pietsch
ec1df7edf0 Fix whitespace in themes (#5700) 2021-05-19 14:12:12 +01:00
jeremy@jermolene.com
dbd3f835bf Fix crash when sorting by non-string fields
tags, list, created, modified are not stored as strings by default.

Fixes #5701
2021-05-19 14:10:39 +01:00
Odin
fe12a4adbf Update releasenotes 5.1.24 (#5670)
* Update releasenotes 5.1.24 

This includes changes up to 06-05-2021

* Incorporated feedback into release notes 5.1.24

Incorporated feedback and moved the '[[ActionPopupWidget]] to create floating popups that must be manually cleared' under widget improvements.
2021-05-19 13:21:22 +01:00
Saq Imtiaz
b267a71f2d Dropzone: persistent dragover state fix (#5688) 2021-05-16 14:01:46 +01:00
Bram Chen
e7b3f69162 Add chinese help texts for use-browser-cache (#5677) 2021-05-10 19:27:48 +01:00
FlashSystems
f4d7b2c7f7 Network performance optimizations for node.js (#5436) 2021-05-08 16:05:39 +01:00
ualich
e699cf1fe8 Display tiddler link in 'Target tiddler already exists' warning (#5672) 2021-05-06 12:25:29 +01:00
jeremy@jermolene.com
d8ac00a108 TiddlyWebAdaptor: Avoid crashing if server sent events not available
Fixes #5663
2021-05-04 17:31:37 +01:00
Mario Pietsch
cf56a17f28 allow unusedtitle macro to use the prefix parameter and fix wiki.generateNewTitle() (#5361) 2021-05-02 19:26:50 +01:00
Saq Imtiaz
3f98686153 Extend <-popup> to create floating popups that must be manually cleared (#5655) 2021-05-02 10:20:39 +01:00
Saq Imtiaz
cb44cc0f2b Add :sort filter run prefix (#5653)
* Add :sort filter run prefix, docs and tests. Also extended .utils.makeCompareFunction with a flag for caseSensitivity.

* Documentation updates

* Move case sensitivity handling entirely to utils method so it is reusable
2021-05-01 13:58:40 +01:00
Saq Imtiaz
44df6fe52f Fixed issue with widget not being available to filter operator, added test (#5640) 2021-05-01 10:00:32 +01:00
Bram Chen
cb34c695b5 Update chinese error messages for the put saver (#5650) 2021-04-28 14:22:23 +01:00
Saq Imtiaz
07caa16e87 Extend dropzone to also use the specified deserializer for strings either dropped or pasted on to the dropzone. (#5601) 2021-04-27 10:15:27 +01:00
Simon Baird
30d23196b6 Add 401 and 403 error messages for the put saver (#5638) 2021-04-27 10:14:04 +01:00
Jeremy Ruston
bf773eb39a Add "average" filter operator for arithmetic mean (#5612) 2021-04-27 10:09:13 +01:00
jeremy@jermolene.com
4a99e0cc7d Change "index" attribute of list widget to "counter", and use 1-based counting
Extends #5611
2021-04-26 14:41:26 +01:00
Saq Imtiaz
e2379b599e Fixes Action-listops bug (#5644) 2021-04-26 11:29:16 +01:00
Saq Imtiaz
8203ee06c3 Allow suffixes for filter runs (#5252)
* Make filter run prefixes extensible

* Make filter run prefixes extensible

* Support rich suffixes for filter runs

* merged conflicts

* Pass suffixes to filterrunprefix
2021-04-25 19:37:47 +01:00
Mario Pietsch
ac15334bb0 Add support for disabled editor toolbar buttons & docs (#5294)
* add dynamic toolbar buttons + HowTo

* remove some whitespace.

* move howto and improve shortcut logic

* move howto

* add whitespace so it can be removed in an other PR.
2021-04-25 16:17:32 +01:00
Mario Pietsch
8849ed0d46 Fix refreshing of select widget when attributes change (#5635) 2021-04-25 16:05:02 +01:00
Saq Imtiaz
ca1cf7bb41 MessageCatcher docs: corrected typo (#5632) 2021-04-25 08:24:02 +01:00
Bram Chen
80133895ba Update chinese translations for Saving/TiddlySpot/ (#5633) 2021-04-25 08:22:03 +01:00
Simon Baird
5e236d35a5 Revise the TiddlySpot Saver settings form (#5628)
Mention TiddlyHost and link to some documentation on the
configuration options.

Also remove the TiddlySpot control panel and backups links since
they no longer work.

Notes:
* The last three fields are no use for TiddlySpot or TiddlyHost, but
  it's possible that someone, somewhere is still using the old
  store.php from Bidix's UploadPlugin, and would miss them if they
  were removed.

  I'd be happy to remove them in a future PR, if it's decided they
  can be retired.

  (If they were removed, I could delete the last row here:)
  https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot

* It's still called "TiddlySpot Saver" which I think is fine for
  now. TiddlyHost might use a different saving method in future
  so keeping the existing name seems best.
2021-04-24 08:54:44 +01:00
Jeremy Ruston
85ba7ac041 Extend list widget with "index" attribute (#5611)
* Extend list widget with "index" attribute

* Fix refreshing bug

* Clarify performance note
2021-04-20 09:15:11 +01:00
jeremy@jermolene.com
a725da2b39 Merge branch 'tiddlywiki-com' 2021-04-18 10:10:39 +01:00
jeremy@jermolene.com
7878e77e96 Update docs for PUT and DELETE APIs to mention CSRF requirements 2021-04-18 10:09:49 +01:00
jeremy@jermolene.com
c325380231 Run the SVG optimiser on the new plus/minus icons 2021-04-16 09:25:07 +01:00
jeremy@jermolene.com
a6a2535c3a Add plus/minus icons 2021-04-16 09:21:47 +01:00
jeremy@jermolene.com
caec6bc3fe Update SVG optimiser script 2021-04-16 09:20:39 +01:00
jeremy@jermolene.com
ac022ec79f Fix typo 2021-04-11 11:28:21 +01:00
jeremy@jermolene.com
89546b3357 Add a hidden setting to control HTML sandboxing 2021-04-11 10:10:16 +01:00
jeremy@jermolene.com
55173c17a3 Remove obsolete link 2021-04-10 16:42:25 +01:00
Saq Imtiaz
7f3fed2f50 Update DropzoneWidget.tid (#5598) 2021-04-10 10:23:16 +01:00
Saq Imtiaz
eced60853f Extend Dropzone widget (#5597)
* Extend dropzone widget with optional actions invoked after tm-import-tiddlers message has been sent. Allows triggering an alternative UX for the import

* Allow restricting a dropzone to specific mimeTypes via mimeTypes and mimeTypesPrefix attributes

* Use a mimeTypesFilter instead of the mimeTypes and mimeTypesPrefix attributes

* Updated refresh handling

* Syntax cleanup

* Replace references to mimeType with content type for consistency with existing documentation. Update documentation for DropZone widget
2021-04-10 09:48:50 +01:00
jeremy@jermolene.com
b9647b2c48 Ensure Fieldmangler widget doesn't propogate events that it traps
Fixes #5593
2021-04-08 16:56:36 +01:00
jeremy@jermolene.com
953fb9f237 BibTeX Plugin: Force fieldnames to be lowercase
Fixes #5591
2021-04-07 17:43:41 +01:00
jeremy@jermolene.com
b90aad9cea Fix typo in filtered permalink example
Fixes #5588
2021-04-06 13:13:12 +01:00
jeremy@jermolene.com
e2d35751e2 Rebuild readme.md and contributing.md 2021-04-05 10:11:29 +01:00
jeremy@jermolene.com
fdf89f83c2 Fix typo in v5.1.24 release note 2021-04-05 10:11:03 +01:00
jeremy@jermolene.com
dce425ecb8 Update release note
Apologies for the delay
2021-04-04 11:48:24 +01:00
jeremy@jermolene.com
55735d7552 BibTeX plugin: Report errors more sanely
Fixes #5581
2021-04-04 11:25:39 +01:00
jeremy@jermolene.com
a8fe653e3c Update contributing guidelines 2021-04-02 14:45:17 +01:00
jeremy@jermolene.com
013218b852 Further updates to contributing guidelines 2021-04-02 14:39:29 +01:00
jeremy@jermolene.com
c976aad5e0 Update the contributing guidelines
Following the discussion in #5484
2021-04-02 13:15:39 +01:00
jeremy@jermolene.com
28521d82f3 Revert "Extend transclude widget to optionally set variables"
Actually a partial reversion, because we're keeping the minor refactoring of makeChildWidget() in widget.js

This reverts commit 80ee5adb14.
2021-04-02 09:47:38 +01:00
jeremy@jermolene.com
54d3782167 Add version banner for docs for #5383 2021-04-02 09:34:27 +01:00
Cameron Fischer
ef6307a64e Do not escape double quotes in tiddler DIVs to save space (#5383)
* double quotes are no longer escaped in html bodies

* changed tiddlyweb's html-div-tiddler; documentation

French version still needs a translation though
2021-04-02 09:32:32 +01:00
cdruan
3b35411aba Change css-escape-polyfill to a tw uitility method (#5552)
* Replace css-escape-polyfill.js with escapecss.js utility module

* Add $tw.utils.escapeCSS() method and invoke that function within the
  escapecss operator.

* Add test cases for the "escapecss" filter operator

* Fix $tw.boot.doesTaskMatchPlatform() so it works as expected if
  a module's export.platforms contains more than one values

* Add missed files to the last commit
2021-04-02 09:25:01 +01:00
jeremy@jermolene.com
d6ea369f5e Edit text widgets should use default text for missing fields 2021-03-31 14:15:01 +01:00
Mario Pietsch
55e44a9554 This PR add tc-tiny-gap-xxx to the vanilla theme. It is similar to &nbsp; and should replace it. (#5574) 2021-03-29 16:45:12 +01:00
Saq Imtiaz
860568136f ViewSwitcher : use Button widget instead of LinkWidget (#5573) 2021-03-29 09:02:47 +01:00
Mario Pietsch
85835ebe42 fix 5424 add button is in new line (#5425) 2021-03-26 09:32:12 +00:00
Joshua Fontany
3d608892bd targeted fix for 5366 (#5416) 2021-03-26 08:42:31 +00:00
Joshua Fontany
5be647b610 Fix 4461 (#5522) 2021-03-26 08:41:41 +00:00
Joshua Fontany
a2e7cc51b5 Fix 5483 & 3483 (#5504) 2021-03-26 08:39:32 +00:00
FND
c3955c3cf9 Add another podcast link (#5567) 2021-03-24 21:21:45 +00:00
jeremy@jermolene.com
226df2ad7d Fix exporting of tiddlers that begin and end with double quotes 2021-03-23 09:27:16 +00:00
jeremy@jermolene.com
8d763f7682 Merge branch 'tiddlywiki-com' 2021-03-22 15:24:15 +00:00
jeremy@jermolene.com
f5887d9e25 Add a link to the community aggregator 2021-03-22 15:22:49 +00:00
jeremy@jermolene.com
7f202f35b4 Minor refactoring for clarity
See 9af68297cd (r48540814)
2021-03-22 09:50:54 +00:00
jeremy@jermolene.com
9c31ff1fb1 Use window.setTimeout(fn,0) for $tw.utils.nextTick in the browser
It seems that best practice has now moved to using zero:

https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout
2021-03-22 09:08:32 +00:00
twMat
0beac47243 Update SelectWidget.tid (#5556)
Placeholder value - Correction of previous attempt.
2021-03-21 16:55:18 +00:00
twMat
99bef2614c Update SelectWidget.tid (#5555)
Added instrux for placeholder value. [Ref.](https://github.com/Jermolene/TiddlyWiki5/issues/5544)
2021-03-20 22:43:35 +00:00
Bram Chen
a44a8c31f0 Update chinese help texts for render command (#5553) 2021-03-20 09:43:36 +00:00
jeremy@jermolene.com
8aad7b00ab Render command: fix bug with multiple variable usage 2021-03-19 18:35:10 +00:00
jeremy@jermolene.com
a38dc17300 Extend render command to allow multiple variables to be passed 2021-03-19 17:09:53 +00:00
jeremy@jermolene.com
9af68297cd Fix transclusion refreshing
Missed off 80ee5adb14
2021-03-19 16:14:15 +00:00
jeremy@jermolene.com
80ee5adb14 Extend transclude widget to optionally set variables
Partially fixes #5199
2021-03-19 15:37:59 +00:00
cdruan
743d9c56c0 Signing the CLA (#5551) 2021-03-18 08:57:43 +00:00
Cameron Fischer
427eb6d085 Refactored filter tests to use nifty spyOn method (#5550) 2021-03-18 08:57:21 +00:00
Mario Pietsch
715ce6b603 Add tag: Community Edditions (#5548)
Add tag: Community Edditions
2021-03-18 08:54:54 +00:00
jeremy@jermolene.com
a6958bfe85 Fix css-escape-polyfill.js on old iOS
Fixes #5546
2021-03-14 10:34:41 +00:00
jeremy@jermolene.com
7b1a0c6e6a Fix ES5 issue
Fixes #5545
2021-03-14 10:27:05 +00:00
jeremy@jermolene.com
e157d16b72 Add data-tag-title attribute to tag pills
Fixes #5543
2021-03-13 13:19:12 +00:00
Mario Pietsch
05acf3dce4 fix wiki.search options invert init problem (#5542) 2021-03-12 21:12:06 +00:00
Quentin Minster
37fd52e6c9 Signing the CLA (#5536) 2021-03-10 22:33:50 +00:00
jeremy@jermolene.com
85646e5db3 Update tw5.com docs macro to allow macros within examples
This was supposed to be committed before 9eda02868
2021-03-09 18:11:36 +00:00
jeremy@jermolene.com
9eda02868f Introduce messagecatcher widget 2021-03-09 18:07:07 +00:00
jeremy@jermolene.com
8980927b54 Build empty.html with the main edition
So that we get the OfficialPluginLibrary tiddler added in c69a3e827 included in the empty prerelease
2021-03-09 09:23:46 +00:00
jeremy@jermolene.com
c69a3e827a Include correct plugin library in prerelease edition 2021-03-08 23:01:55 +00:00
twMat
3c9ee052a3 Update SystemTags.tid (#5530)
Interestingly, in spite of the missing quote characters, the tiddler renders well on 

https://tiddlywiki.com/#SystemTags

but not on 

https://tiddlywiki.com/prerelease/#SystemTags
2021-03-08 18:00:41 +00:00
jeremy@jermolene.com
81546c5bf4 Menubar plugin: Add optional dropdown-position
Fixes #5533
2021-03-08 17:47:04 +00:00
jeremy@jermolene.com
5e4430dbf9 Fix Radio widget to refresh selectively, and use the checked attribute properly 2021-03-07 15:49:07 +00:00
jeremy@jermolene.com
93f4b5dac9 Merge branch 'tiddlywiki-com' 2021-03-07 10:33:08 +00:00
jeremy@jermolene.com
b58e4236b7 Docs tweaks
* The "tip" macro isn't designed to be used in a table cell (it generates a blockquote)
* We avoid full stops at the end of table entries or list items

It seems to be incredibly hard to police consistency with documentation but I think it's very important
2021-03-07 10:32:51 +00:00
jeremy@jermolene.com
60e40b5af9 Merge branch 'tiddlywiki-com' 2021-03-07 10:25:45 +00:00
jeremy@jermolene.com
6e93770459 Update RangeWidget and RadioWidget examples from #5158
@pmario we avoid using the details element because it doesn't remember its state across refreshes. It's not something that we should encourage people to use if they don't understand the limitations.

I also simplified the radio widget example because putting all the options on one line with a vertical bar separator is not a common way to display radio buttons.
2021-03-07 10:23:14 +00:00
jeremy@jermolene.com
d56e8764a1 Button widget: apply aria-expanded attribute when controlling a popup
Addresses (1) and (5) from #5519
2021-03-01 17:59:29 +00:00
Bram Chen
e84c87ef37 Update chinese language files (#5514)
* Add chinese descriptions for module-type `utils-browser`
* Fixed typos
2021-02-23 17:26:17 +00:00
jeremy@jermolene.com
ef76349c37 Add support for utils-browser modules 2021-02-22 12:11:39 +00:00
jeremy@jermolene.com
010fa140c7 Bug issue template: Add section about configuration 2021-02-20 10:43:01 +00:00
jeremy@jermolene.com
625ea364c4 Fix typo in Chinese (Simplified) 2021-02-17 12:49:45 +00:00
morosanuae
5ad1193eb6 Create TW Icons by morosanuae.tid (#5495) 2021-02-13 20:16:06 +00:00
jeremy@jermolene.com
0ed32fded9 Freelinks: Add a filter for which tiddlers can be the targets of freelinks 2021-02-13 12:03:35 +00:00
jeremy@jermolene.com
50d0b6ee50 Modals: don't crash if options.event is missing
Raised here:

https://groups.google.com/d/msgid/tiddlywiki/3E83D2D3-42B2-4AA1-A042-52AB1D7B9B15%40gmail.com
2021-02-13 10:28:31 +00:00
Cameron Fischer
c0dc2669c0 Preallocating in LinkedList's toArray method (#5488) 2021-02-11 13:39:50 +00:00
jeremy@jermolene.com
40d21f607a Docs: Minor formatting tweaks
I was cloning this docs tiddler to experiment with docs for a new widget and noticed some punctuation inconsistencies
2021-02-07 12:48:06 +00:00
Joshua Fontany
bfa062f23d Fix filesystem (#5465) 2021-02-04 16:11:07 +00:00
jeremy@jermolene.com
9f9ce6595b Make it easier to subclass the wikitext parser with a custom rule set
We can now pass arrays of rule classes to the parser constructor, overriding the rules that would normally be used by the parser.

This allows us to create custom variants of the wikitext parser with their own content type.

It could also provide a basis for a new Markdown parser based on our existing wikitext parser but with new rules.
2021-02-03 15:13:56 +00:00
Simon Baird
12f1847475 Support upload saver without username/password (#5455)
The default behaviour is unchanged, but if you write "yes" to
$:/UploadWithUrlOnly then it will assume it's possible to upload
with a blank username and password, as long as the host is set.

The motivation is to support a upload plugin compatible upload
service that uses some method to authenticate other than the legacy
upload plugin user/password params.

Without this patch, the user would need to enter something random in
the user and password fields for TW to decide the upload plugin can
be used.
2021-01-31 15:32:18 +00:00
jeremy@jermolene.com
f2aba29d94 Update to KaTeX v0.12.0 2021-01-31 15:11:12 +00:00
Nicolas Petton
6a55069609 Fix the right margin of tags used outside of the tags wrapper (#5440) 2021-01-29 18:16:41 +00:00
Dyllon Gagnier
3eefb3cce6 Fix backtracking issue with regex (#5401)
There was an unnecessary
2021-01-29 15:26:25 +00:00
Dyllon Gagnier
2b41661721 Signing the CLA (#5445)
Co-authored-by: Jeremy Ruston <jeremy@jermolene.com>
2021-01-29 15:25:43 +00:00
jeremy@jermolene.com
a360adbba9 Ensure dropzone is full size even if story river is empty
Thanks @jeremyredhead

Fixes #5446
2021-01-29 15:22:43 +00:00
Cameron Fischer
4c7dcb83d1 Fix for #3306, inline/block widget glitch (#5452)
* Fix for #3306, inline/block widget glitch

* Just realized we don't need to set lastIndex anymore

* Forgot that parseBlocks doesn't use options
2021-01-29 14:57:30 +00:00
Mario Pietsch
010158db81 Fix tiddler info area content bleeding on close animation (#5453) 2021-01-29 14:34:06 +00:00
Cameron Fischer
45355a7fcf Wikirules now use better macrocall parser (#5451)
* wikirules now use better macrocall parser

Before, wikirules would use a deficient macrocall parser which couldn't
handle certain types of arguments. Now it uses the same one that the
widget parser uses. Less code!

* style changes and removing weird switch statement

That switch statement made more sense in an earlier iteration.

* comment improvements

* oops, wikirule macrocalls could do ONE thing better

* '=' wasn't allowed for widget macros, but why?

Now they're allowed for both widget macros and macrocall macros.
2021-01-29 13:26:31 +00:00
jeremyredhead
f77015ea18 Signing the CLA (#5454) 2021-01-29 13:02:29 +00:00
jeremy@jermolene.com
8bab081c9e Remove illegal character from filename
Fixes #5430 for tiddlywiki-com branch
2021-01-27 17:21:25 +00:00
Joshua Fontany
4667139864 Rename TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid (#5430)
* Delete TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid

Delete file with illegal character in filename

* replace file without illegal character

* fixed ext
2021-01-27 17:18:54 +00:00
FlashSystems
2e47f277ac Fix blank favicon if root-tiddler=$:/core/save/lazy-images is set (#5423)
If image lazy loading is used with node.js the favicon is blank. The
line `-[!is[system]is[image]]` excludes only non system images from
begin saved as full tiddlers. But the `[is[image]]` line includes system
images as skinny tiddlers. The created HTML file has all system image
tiddlers (as the favicon) listed twice. And the skinny tiddler seems to
win in this case and breaks the display of the favicon.

This patch fixes this issue by excluding system images from the skinny
tiddlers list.
2021-01-21 17:07:28 +00:00
FlashSystems
ea12994f47 Signing the CLA (#5421)
...to contribute some code.

Co-authored-by: Jeremy Ruston <jeremy@jermolene.com>
2021-01-21 17:07:13 +00:00
jeremy@jermolene.com
b4605e3573 Merge branch 'tiddlywiki-com' 2021-01-21 17:05:58 +00:00
jeremy@jermolene.com
674d55db06 Docs typo 2021-01-21 17:02:21 +00:00
leehawk787
678ec7b3dd Update Saving to a Git service.tid (#5427) 2021-01-21 17:00:38 +00:00
leehawk787
53ebfffedf Update cla-individual.md (#5426)
Co-authored-by: Jeremy Ruston <jeremy@jermolene.com>
2021-01-21 16:59:39 +00:00
BlueGreenMagick
1ec532ea50 Update WikiRuleModules.tid (#5429) 2021-01-21 16:57:12 +00:00
BlueGreenMagick
3c3f1b60c6 Update cla-individual.md (#5428) 2021-01-21 16:56:12 +00:00
jeremy@jermolene.com
ae273a08f1 xlsx-utils: Fix demo spreadsheet
Somehow it had an error in it
2021-01-16 16:09:42 +00:00
jeremy@jermolene.com
36de5f65ff Core plugin images: Add missing classes 2021-01-16 15:39:05 +00:00
jeremy@jermolene.com
7be1e7e5f8 Xlsx-utils: Fix crash when using deserializer
Fixes #5400 (broken in #4601)
2021-01-16 15:37:50 +00:00
Nicolas Petton
b205da2007 Minor cleanup of startup.js (#5409)
* Remove unused var declaration
* Remove trailing whitespaces
2021-01-15 16:55:52 +00:00
Bram Chen
ffc8feea0c Update chinese help text for parameters of listen command (#5410)
* Improve help text for "csrf-disable"
* Add help text for "sse-enabled"
2021-01-15 16:54:03 +00:00
Peter Neumark
ce8c03250c Other Resources: fixed TW5-firebase URL (#5411) 2021-01-15 16:52:44 +00:00
Nicolas Petton
82b7167d55 Update the Notebook theme tiddler (#5387)
* Update the title to be shorter.
* Update the description to follow the description on
  https://nicolas.petton.fr/tw/notebook.html.
2021-01-15 12:20:55 +00:00
Nicolas Petton
afa490a0c1 Fix a typo in WebServer Parameter_ sse-enabled.tid (#5407) 2021-01-15 12:20:22 +00:00
Peter Neumark
8344d13efb Add TW5-firebase (#5408)
* Added resource tiddler for TW5-firebase

* Signing the CLA
2021-01-15 12:17:28 +00:00
Nicolas Petton
17b4f53ba2 Add server sent events (#5279)
* Create server-sent-events.js

* Create sse-change-listener.js

* Implement server sent events

* Convert to ES5 and wrap in function

* Use the host string from tiddlyweb

* Improve comments in sse-server.js

* Can't use object reference as key

* Add retry timeout

* Fix a bug

* bug fix

* Fix formatting

* Fix ES5 compat

* capitalize comments

* more fixes

* Refactor tiddlywek/sse-server.js

* Extract helper functions for handling wikis and connections.
* Replace JSDoc comments.
* Fix formatting according to TW core.
* Simplify the logic for adding and removing connections.

* Fix formatting of tiddlyweb/sse-client.js

Fix formatting according to TW core.

* Fix formatting of server-sent-events.js

Fix formatting and comments following TW core guidelines.

* Extract a debounce function in sse-client.js

* Avoid using startsWith in server-sent-events.js

startsWith is part of ES2015, while TiddlyWiki uses the 5.1 dialect.

* New sse-enabled WebServer parameter

* If not set to "yes", disabled SSE request handling.
* Add documentation for the parameter in core/language/en-GB/Help/listen.tid
* Add new tiddler editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid

* Disable polling for changes if SSE is enabled

* Add sse_enabled to /status JSON response
* Store syncer polling status in $:/config/SyncDisablePolling
* Handled disabling polling in core/modules/syncer.js

* Simply boolean logic in syncer.js

* Delete trailing whitespaces in syncer.js

Co-authored-by: Arlen22 <arlenbee@gmail.com>
2021-01-15 10:37:55 +00:00
Nicolas Petton
a8457f7f9e Add a community resource tiddler documenting Projectify (#5372) 2021-01-13 12:51:48 +00:00
jeremy@jermolene.com
ca95f1069f Fixed comment parsers to match end marker correctly
Fixes #5396
2021-01-13 11:48:42 +00:00
Nicolas Petton
65ffe96cc2 Fix broken aria-label in $:/PaletteManager (#5397) 2021-01-13 10:18:27 +00:00
Cameron Fischer
b8a9826f23 Cleaned up jasmine test suite output (#5377)
* Cleaned up jasmine test suite output

Also testing for expected log messages, instead of just letting them print
to the console every single time, constantly making you think there's some
warning you need to worry about, and making all those dots not line up nicely.

* switched single quotes to double in collectLogs
2021-01-09 20:53:17 +00:00
Cameron Fischer
65932a9b21 Memory efficient linked list (#5380)
* Outlines of the mem efficient linked list

Need to stop for now. Found problem with $tw.utils.pushTop that I need
consultation for.

* Link list throws when given non-string vals

* Think I got rid of the last LinkList infinite loops

* LinkedList push better; fixed coding conventions

* Cleaning up LinkedList code and tests

* Ready to ship new mem efficient Linked List

* Switching to double quotes in LinkedList
2021-01-09 20:52:34 +00:00
jeremy@jermolene.com
af897361c7 Fix name of default branch for GitHub saver
Fixes #5317

Missed off 8cd13e2f89
2021-01-09 13:34:21 +00:00
Simon Huber
4858b24cfe Fix #5308 - WidgetSubclassingMechanism not working with widgets that add EventListeners (or logic ?) in constructor (#5382)
* add EventListeners in the render() method instead of the constructor

* scrollable widget: add EventListeners in render() method instead of constructor +

... move logic from constructor to render()

* linkcatcher: add EventListeners in render() instead of constructor

* fieldmangler: add EventListeners in render() instead of constructor

* edit-bitmap: initialise editorOperations in render() instead of constructor

* list-widget: initialise storyviews in render() instead of constructor

* vars widget: execute Widget.call(this) in render() instead of constructor

... not shure what this should do

* Update fieldmangler.js

* Update edit-bitmap.js

* Update linkcatcher.js

* Update navigator.js

* Update scrollable.js

* Update list.js

* Update vars.js
2021-01-09 13:25:48 +00:00
CodaCoder
5125b91b3f Update Formatting List Results as Tables with CSS - Specified Columns Methods.tid (#5375)
-moz-column* seems to have been dropped in Firefox. Added the non-prefixed, standard properties.
2021-01-07 18:22:05 +00:00
Cameron Fischer
b632cea6b7 Fixed issue where [lookup[]] could emit undefined (#5376) 2021-01-07 18:19:50 +00:00
jeremy@jermolene.com
eadbd62e6d Fix "modified" dates for tiddlers modified in #5353 2021-01-06 15:12:05 +00:00
Cameron Fischer
e280f89ca5 Converting [links[]] to use better LinkedList (#5369) 2021-01-05 17:36:18 +00:00
Mohammad Rahmani
87b9dbcda1 Remove extra dashes in page title (#5370)
When Tiddlywiki has no subtitle you see extra dashes!
2021-01-05 17:35:26 +00:00
donmor
5832002feb Docs: Create Japanese (Japan) Edition.tid (#5324)
Added the Japanese version tiddler since the Japanese version of empty.html exists
2021-01-04 11:05:41 +00:00
jeremy@jermolene.com
6a98106679 Update styles docs
Fixes #1691
2021-01-04 09:15:28 +00:00
CodaCoder
d5175e4fdc Update EventCatcherWidget.tid (#5335)
* Update EventCatcherWidget.tid

Changed "JavaScript events" to "DOM-initiated Javascript events". 
Removed the quotes from `"event"`. 
Tightened up some of the language.

* Update EventCatcherWidget.tid

Edited/reworded as per discussion(s).
2021-01-04 08:40:35 +00:00
CodaCoder
58010e089f Signed CLA (#5363) 2021-01-04 08:39:41 +00:00
Chris Nicoll
6edcbfd0cd Fix typos and Refnotes URL in kookma resources (#5365)
Co-authored-by: clutterstack <clutterstack@gmail.com>
2021-01-04 08:39:14 +00:00
Cameron Fischer
be70e5851d Taking advantage of linkedLists in all operator (#5362)
* Taking advantage of linkedLists in all operator

* Test to confirm [all[]] with LinkList is the same
2021-01-04 08:38:50 +00:00
Mario Pietsch
6f62c4fc7f Add missing tags (#5360) 2021-01-03 19:29:17 +00:00
maki lam
4fe411be80 Signing the CLA (#5327)
Co-authored-by: Jeremy Ruston <jeremy@jermolene.com>
2021-01-03 11:52:30 +00:00
Simon Huber
ac40ee4246 Fix #5318 - remove-tag-button not having the correct fill color (#5326) 2021-01-03 11:51:30 +00:00
Joshua Fontany
bbe94f3544 Cleaned up Customising Tiddler File Naming docs (#5320)
* cleaned up Customising Tiddler File Naming

* revereted to british customis*
2021-01-03 11:50:39 +00:00
Joshua Fontany
03626bc142 always test ext in tiddler title and remove it (#5329)
* always test ext in tiddler title and remove it

* patch custom ext length vulernability
2021-01-03 11:50:14 +00:00
Rob Hoelz
69e595abf9 Add docs on share plugin (#5331)
…and mention it in the "sharing tiddlers" tiddler
2021-01-03 11:48:17 +00:00
jeremy@jermolene.com
e96a54c753 TiddlyWebAdaptor: Don't crash if "etag" header is missing 2021-01-03 11:46:40 +00:00
Glenn Dixon
a8639c3129 Signing the CLA (#5358) 2021-01-03 11:37:28 +00:00
Chris Nicoll
3ae27cab9e Signed cla-individual (#5333)
Co-authored-by: Jeremy Ruston <jeremy@jermolene.com>
2021-01-03 11:36:11 +00:00
jeremy@jermolene.com
9434e95396 Fix PETTIL url
Fixes #5348
2021-01-03 10:48:13 +00:00
jeremy@jermolene.com
fecf622616 It's 2021! 2021-01-03 10:05:02 +00:00
jeremy@jermolene.com
d25e540dd2 Add support for image/vnd.microsoft.icon content type
Fixes #5357
2021-01-03 10:04:52 +00:00
Odin
4ee3ded04a Fixed typo in Community.tid (#5356) 2021-01-03 09:51:20 +00:00
Odin
87704b1770 Tiddlywiki com - Update to the Community page (#5353)
* Replaced the 'resources' tab with: Editions, Plugin, Themes, Palettes, Other resources.

* Added tiddlers that lists the new categories to be used in the Community tabs tiddler

* Added three themes for in the Community Themes section of the community page.

* Added three community made edtitions to the Community Editions tabs of the community page.

* Removed David Giffords Obahiah by his request.

* Added two palettes into the Community Palettes tab.

* Changed the link of 'PETTIL - Forth for the Commodore PET' to webarchive as discussed in pull request #5116

* removed four tiddlers because of dead links.

* Changed the dead link in Tiddlydrive add-on by Joshua Stubbs to link to the projects github instead.

* Fixed titltes in the community tabs macro.

* Sorted all entries into their new categories, updates tags accordingly and moved tid files into new folders according to their new category.

* final edit for sorting
2021-01-02 20:46:19 +00:00
Odin
493b45706f Signing the CLA (#5347)
Co-authored-by: Jeremy Ruston <jeremy@jermolene.com>
2021-01-02 17:52:53 +00:00
Joe Bordes
0ea89970d1 Doc(Developer) typo (#5354) 2021-01-02 17:39:46 +00:00
Joe Bordes
c2c8892aa5 Signing the CLA (#5355) 2021-01-02 17:38:51 +00:00
Jeremy Ruston
7ec6d37031 Fix filename of new release banner 2020-12-29 14:08:09 +00:00
Jeremy Ruston
24646e1993 Adjust placeholder release banner for readability 2020-12-29 13:27:00 +00:00
jeremy@jermolene.com
1e1b52088f Preparing for v5.1.24 as new prerelease
The new release banner is a placeholder; we'll run the competition once the release has taken shape a little.
2020-12-29 12:06:30 +00:00
jeremy@jermolene.com
ac8f521303 Version number update for 5.1.23 2020-12-24 13:38:24 +00:00
jeremy@jermolene.com
2ab5fd9abb Preparing for release of v5.1.23 2020-12-24 13:37:18 +00:00
jeremy@jermolene.com
f6339d437e Release note: Jazz up the contributor list 2020-12-24 13:21:06 +00:00
jeremy@jermolene.com
8e61e37f2b Release note: More tweaks and reformatting 2020-12-24 13:10:44 +00:00
jeremy@jermolene.com
2632ed0078 Release note: coloured badges for different types of changes 2020-12-24 11:47:36 +00:00
jeremy@jermolene.com
7cb6dc0e4f Override crazy browser defaults for h1 fontsize
Fixes #5311
2020-12-24 10:37:54 +00:00
Bram Chen
8620b77b45 Improve chinese translations for TiddlySpot warning text (#5306) 2020-12-23 13:34:23 +00:00
jeremy@jermolene.com
03ad396db1 Start to rearrange release note into topics
The previous groupings were getting too large to manage
2020-12-22 19:12:12 +00:00
jeremy@jermolene.com
9e70e89a84 Update Release Note 2020-12-22 17:34:24 +00:00
jeremy@jermolene.com
2f8a100bab Clarify TiddlySpot warning text 2020-12-22 15:42:21 +00:00
jeremy@jermolene.com
a9a36b641a Filename for action-confirm widget should be 'action-confirm.js' for consistency 2020-12-22 11:50:26 +00:00
jeremy@jermolene.com
625c3de6f7 Merge branch 'tiddlywiki-com' 2020-12-22 11:49:18 +00:00
jeremy@jermolene.com
ddda9a34ae [Docs] Update links to developer discussions 2020-12-22 11:48:40 +00:00
twMat
c0a56e790d Update title.tid (#5292) 2020-12-18 20:19:02 +00:00
Simon Huber
dc83ee411d Fix problem with tc-btn-invisible not correct fill color (#5288) 2020-12-16 16:20:14 +00:00
jeremy@jermolene.com
3c003364d2 Add the Atrounoush's winning banner design for v5.1.23
The image was received with a transparent background, but I adjusted it to give it a white background to ensure it is readable with all colour schemes.
2020-12-15 11:59:07 +00:00
Saq Imtiaz
1e9cc2b747 Fix refresh for all attributes of droppable widget. Add disabled class (#5280) 2020-12-15 11:09:32 +00:00
Simon Huber
f968130696 Update Customising search results.tid (#5233) 2020-12-15 10:38:16 +00:00
jed
e046d5ad76 Create Hook_th-make-tiddler-path.tid (#5274)
Documentation for the hook
2020-12-14 19:20:29 +00:00
Robin Munn
3c3cd4673e Railroad diagram for filter expression now includes named prefixes (#5278) 2020-12-14 19:18:51 +00:00
Joshua Fontany
d50f6b406e filesystem cleaup around hook (#5276) 2020-12-14 09:50:53 +00:00
jed
c1a1e272cc Add a hook to allow modifying the the behaviour creating tiddler paths (#5267)
* Add a hook to allow modifying the the behaviour creating tiddler paths

This is needed for Bob to use the core to generate tiddler fileInfo 

I don't know if this is the best way to make the hook, but it works for what I need

* update th-make-tiddler-path arguments

the value is the current path, the parameter passed in is the original unmodified path so it is available to subsequent hooks
2020-12-13 23:24:23 +00:00
jeremy@jermolene.com
81947edd5c Dev: Update hook mechanism docs 2020-12-13 20:01:47 +00:00
Xavier Cazin
88e29b4558 tabsState should hold a tiddler name rather than a list singleton (#5263)
* tabsState should hold a tiddler name rather than a list singleton

* tabsState should hold a tiddler name rather than a list singleton
2020-12-13 16:15:16 +00:00
Simon Huber
8798ebadbd Add foreground color to CodeMirror selections and fix #5272 (#5266)
* Add foreground color to CodeMirror selections

* Use default selection background if tiddler-editor-background matches selection-background
2020-12-13 11:40:57 +00:00
Bimba Laszlo
a17fa35c28 Remove menubar from print (#5273)
In the print view, a shadow appeared at the top of each page, and the
first lines were not visible.

I hide the menubar in the print view.
2020-12-13 11:37:07 +00:00
Saq Imtiaz
0911d99813 URGENT: Reveal widget - fixed problem with previous patch of refresh handling (#5260)
* Fixed problem with previous patch of refresh handling

* Update reveal.js
2020-12-11 23:24:27 +00:00
jeremy@jermolene.com
93309b0b7d Sort plugins in control panel by name instead of title
Fixes #5256
2020-12-11 16:13:14 +00:00
Saq Imtiaz
c0dd13d446 Reveal widget should update on changed class and style attributes (#5258) 2020-12-11 15:36:00 +00:00
ento
ae61b08ae5 Fix browser testing (#5254)
* jasmine: specify 'after' only in Node

The commands module is never executed in browsers and the 'after'
constraint caused a regression where tests were never run in the
browser.

* jasmine: give the startup module a name like all others
2020-12-11 10:12:01 +00:00
Robin Munn
f60d0ef109 reduce and :reduce handle empty input identically (#5255)
Fixes #5246. Now the reduce operator and :reduce filter run prefix will
both return empty output when their input is empty, so that both can be
chained together with the else operator or :else prefix.
2020-12-11 10:07:52 +00:00
Cameron Fischer
6ca89304a1 Fix for LinkedLists when using bad filter prefix (#5251) 2020-12-10 18:25:53 +00:00
Simon Huber
78c2beb640 Add fill: <<colour button-foreground>> to html button in vanilla/base (#5250) 2020-12-10 17:33:42 +00:00
Stefano Stoduto
e34a88e3e4 Signing the CLA (#4876)
Co-authored-by: Jeremy Ruston <jeremy@jermolene.com>
2020-12-10 17:27:47 +00:00
Simon Huber
0d2b6cf837 Rename control-panel-button to advanced-search-button in advanced-search button (#5242) 2020-12-10 17:09:28 +00:00
Simon Huber
1af1f6621a cursor:pointer on input[type=file] doesn't work in webkit browsers... (#5244) 2020-12-10 17:09:03 +00:00
jeremy@jermolene.com
50d8325d4c Dynannotate: Fix off-by-one error for end of annotation text 2020-12-09 19:14:43 +00:00
Saq Imtiaz
3016b3d094 Docs update for Set Widget (#5239)
* Update docs for Set Widget

This updates the docs for Set Widget to add a tip regarding a common source of misunderstanding for users, i.e. using Filtered List Variable Assignment and being confused as to why the value of the variable is in double square brackets.

* Corrected typos
2020-12-09 11:12:57 +00:00
Saq Imtiaz
da5d12d6fb Docs for :reduce filter run prefix (#5238) 2020-12-09 11:11:14 +00:00
Cameron Fischer
cd5d9bd5b9 Code cleanup of Linked Lists (#5241)
* made private methods limited to module scope
* moved private methods to file bottom
* changed tests to run comperable array functions in parallel
* added comments
2020-12-09 09:46:35 +00:00
jeremy@jermolene.com
1e1aeefd93 Fix add plugins modal
Fixes #5235
2020-12-09 09:07:48 +00:00
jeremy@jermolene.com
1d7091e637 Hide .tid exporter when more than one tiddler to export
Fixes #5237
2020-12-08 17:48:58 +00:00
Simon Huber
4334de88a0 Make search-matches button discoverable on dark palettes (#5232) 2020-12-07 17:29:42 +00:00
jeremy@jermolene.com
bb6d41f3dd Macrocall widget: ensure we separately cache inline vs block parse trees
Fixes a bug in #5205
2020-12-07 16:05:34 +00:00
Joshua Fontany
a878d82c7a Ignore edition filters if not running on node (#5222) 2020-12-07 15:59:32 +00:00
Joshua Fontany
85ff47366c fix viewtemplate quirks (#5224) 2020-12-07 15:58:28 +00:00
Saq Imtiaz
ce5d20b8fc Logging widgets :Fixed issue on Firefox where logging does not work (#5223)
* Fixed issue on Firefox where logging does not work properly due to column names

* Remove second argument to utils.logTable
2020-12-07 15:53:49 +00:00
Simon Huber
2c76cfa67a Use displayshortcuts macro for keyboard_driven_input_macro tiddler (#5226)
* Update keyboard-driven-input_Macro.tid

* Update keyboard-driven-input_Macro.tid
2020-12-07 14:44:07 +00:00
Simon Huber
90f05295a2 Add missing config options to ControlPanel->Settings->CodeMirror (#5229)
* Create cursorBlinkRate.tid

* Update config-language.multids

* Create indentUnit.tid

* Create indentWithTabs.tid

* Create smartIndent.tid

* Create tabSize.tid
2020-12-07 14:43:44 +00:00
Simon Huber
5df0225356 Update Customising search results.tid (#5225) 2020-12-07 10:22:02 +00:00
Joshua Fontany
c3e34b469c typo (#5221) 2020-12-06 22:59:48 +00:00
Simon Huber
e8815b79ff Update CodeMirror Dialog to always have a background color (#5217) 2020-12-06 17:21:35 +00:00
Simon Huber
958f57f2c0 Make editTiddler in sidebarsegments/search available as variable (#5218) 2020-12-06 17:15:40 +00:00
jeremy@jermolene.com
43a3228200 Update Performance docs for macro parsing optimisation
Replacing #5216
2020-12-06 14:02:06 +00:00
jeremy@jermolene.com
96d4f87e78 Revert "Update documentation on Performance (#5203)"
This reverts commit f798eab33f.
2020-12-06 14:01:03 +00:00
Saq Imtiaz
a8c1e6a3bd Update performance documentation (#5216)
Documents the change to macro parsing from #5205 
This builds on documentation changes made in the tw.com branch and is therefore based on that branch, but should not be merged before 5.1.23 is live.
2020-12-06 13:57:47 +00:00
jeremy@jermolene.com
36fe519eff Merge branch 'tiddlywiki-com' 2020-12-06 13:56:43 +00:00
Simon Huber
b2d270a7e8 CodeMirror: Make colored selections based on palette work in chrome, too (#5215)
* Make colored selections based on palette work in chrome, too

* Update styles.tid
2020-12-06 13:00:19 +00:00
jeremy@jermolene.com
005f7c55b6 Restore accidental commenting in 0b1a05d10 2020-12-06 10:50:59 +00:00
Simon Huber
122306fc24 Update GruvboxDark, CupertinoDark and Nord palettes to work better with TiddlyDesktop (#5214)
* Update CupertinoDark.tid

* Update GruvBoxDark.tid

* Update Nord.tid
2020-12-06 09:58:02 +00:00
Jeremy Ruston
0b1a05d10d Cache result of parsing macro calls which don't use text subsitution (#5205) 2020-12-06 09:43:06 +00:00
Joshua Fontany
b0f6d50b60 fix filesystem bugs (#5213) 2020-12-06 09:41:03 +00:00
Simon Huber
a3a7d6450d CodeMirror: Ensure linenumber-gutter has a right border (#5212)
* Ensure linenumber-gutter has a right border

* Update GruvBoxDark.tid

* Update Nord.tid
2020-12-06 08:56:06 +00:00
Cameron Fischer
a857b4ab9a use a linked list for filter runs. (#5206)
* Changed the filterrunprefixes to use LinkedList

* Testing for Linked List

* Finishing touches to LinkedList

* Minor corrections to link-list coding style

* Corrected for sneaky bug in linkedList
2020-12-06 08:54:57 +00:00
ento
c4dcf510ef Ensure jasmine-plugin startup module is executed in the right order (#5210) 2020-12-06 07:29:34 +00:00
Saq Imtiaz
7fd24de372 Tests for filter prefixes (#5209) 2020-12-05 23:10:51 +00:00
Simon Huber
396703c478 An even faster version of the TagPickerTagTemplate (#5207) 2020-12-05 17:38:39 +00:00
Simon Huber
bfc4b447da Add selection-background/foreground to GruvboxDark and Nord palettes (#5204)
* Update GruvBoxDark.tid

* Update Nord.tid

* Update Nord.tid

* Update Nord.tid

* Update Nord.tid
2020-12-05 16:38:08 +00:00
Simon Huber
d957b3e4e6 Update CodeMirror styles to set selection colors based on foreground contrastcolour (#5200)
* Update styles.tid

* Update styles.tid

* Update styles.tid
2020-12-05 16:37:50 +00:00
Saq Imtiaz
f798eab33f Update documentation on Performance (#5203) 2020-12-05 16:30:49 +00:00
Cameron Fischer
fbe5bb229a Fix for filterrunprefixes using $tw.wiki (#5202)
* Fixed runprefix 'and' to use widget wiki

* Made widget arg of filterTiddlers optional again

* Switched to passing {wiki: wiki} to prefixes
2020-12-05 16:12:40 +00:00
Simon Huber
ae5d78b4dd Update codemirror styles (#5198) 2020-12-04 19:14:59 +00:00
Saq Imtiaz
9825b5b4a0 Ensure new variables are strings (#5197) 2020-12-04 19:02:05 +00:00
Saq Imtiaz
8799911162 Reduce operator: second optional parameter instead of suffix (#5193)
* Tweak reduce operator to use an optional second parameter instead of a suffix

* Updated docs
2020-12-04 18:31:23 +00:00
Simon Huber
813e28e1ea Make the tag-picker tags-dropdown more performant (#5195)
* Replace macrocall for tag-button with transclusion of a TagPickerTagTemplate

* Create TagPickerTagTemplate.tid
2020-12-04 18:28:36 +00:00
Simon Huber
911e23ee6d Make sidebarsegments/search button display the count of ALL search results (de-duplicated) (#5194) 2020-12-04 18:27:40 +00:00
Saq Imtiaz
046746ba20 Add :reduce filter run prefix (#5196) 2020-12-04 18:23:50 +00:00
Robin Munn
8ffe138942 Add rawunicode suffix to (json)stringify operators (#5191)
Default with no suffix is pre-5.1.23 behavior, escaping all Unicode
characters for maximum compatibility (avoids encoding issues). New
"rawunicode" suffix allows passing through Unicode characters U+0080
and up unchanged, for cases where you know your tools are handling
encoding correctly and you want less verbose escaping.
2020-12-04 13:19:59 +00:00
Mohammad Rahmani
15be409c42 Minor issue in example of Import Variables Widget (#5165)
an unbalanced [ was resolved.
2020-12-03 22:27:21 +00:00
Robin Munn
c92f9dd404 Docs for trim operator suffix use from-version (#5161)
Trim suffix was introduced in version 5.1.23; docs should mention that.
2020-12-03 21:20:23 +00:00
Rob Hoelz
2bbcc94b4d Add documentation for shortcuts introduced in 5.1.20 (#4324) 2020-12-03 21:19:25 +00:00
Saq Imtiaz
1f5e1205ec Extend Eventcatcher to handle multiple events (#5185)
* support multiple events

* Add variables for event type and detail. Rename types attribute to events

* Correct typo in refresh handling
2020-12-02 21:15:35 +00:00
Simon Huber
6b03105bed Update CupertinoDark.tid (#5183) 2020-12-02 21:13:42 +00:00
Simon Huber
9d5babc248 Bump CodeMirror plugin version (#5184) 2020-12-02 21:12:56 +00:00
Robin Munn
e620aaed80 Fix a couple typos in "deprecated feature" warning (#5174)
One tiddler had been renamed since the deprecation warning tiddler was
created, and there were also a couple of minor punctuation and/or
spelling errors.
2020-12-02 16:59:04 +00:00
Simon Huber
552843369c Update shortcuts-mac.multids (#5179) 2020-12-02 16:55:55 +00:00
Simon Huber
f0eba7fdc6 Re-add minified codemirror, without minification bug (#5180) 2020-12-02 16:55:37 +00:00
Simon Huber
9871c1a6a9 Small tweak for codemirror selected-linenumber (#5181) 2020-12-02 16:54:36 +00:00
Simon Huber
a1ef66ec6d Better readability for codemirror linenumbers + CupertinoDark muted-foreground better contrast (#5164)
* Update styles.tid

* Update CupertinoDark.tid
2020-12-02 12:21:23 +00:00
Simon Huber
fc797f3722 Fix #5162 - tiddler opening position is incorrect, bug in navigator.js 2020-12-02 12:21:02 +00:00
Joshua Fontany
c6bb783308 Fix filesystem regression (#5176)
* $:/config/OriginalTiddlerPaths if no filters match

* fixed & docs updated

* tested with tiddlywiki.files & tw.com edition

* typos

* originalpath to options, propigate isEditableFile

* syntax cleanup
2020-12-02 09:47:51 +00:00
Simon Huber
c3055f92a9 Don't minify codemirror.js (#5173) 2020-12-01 20:55:22 +00:00
Saq Imtiaz
4079f72310 Fix typo in x-listops.js (#5171) 2020-12-01 18:14:07 +00:00
Simon Huber
cc1f32067f Update CodeMirror to 5.58.3 - fix vim-mode cursor invisible (#5172)
* Update codemirror to v5.58.3

* Update jump-to-line.js

* Update search.js
2020-12-01 18:11:40 +00:00
Mario Pietsch
880930da8b Add actions parameter to range-widget + docs! (#5158)
* add actionsStart, -Stop and actions to range-widgets

* fix indent
2020-12-01 18:11:09 +00:00
Joshua Fontany
68cb08749f Docs for filesystem adaptor update (#5169)
* rebased to master

* cleanup typos

* typo
2020-12-01 17:36:38 +00:00
jeremy@jermolene.com
13b69a9c10 Missing docs for working with negative years 2020-12-01 15:51:07 +00:00
jeremy@jermolene.com
b63049b4df Fix tests to work in other timezones
Oops.
2020-12-01 10:52:24 +00:00
jeremy@jermolene.com
6a91dbfe2f Add support for working with negative dates
See discussion https://groups.google.com/g/tiddlywiki/c/aHlyaHr93Io/m/vGcDa6lxAgAJ
2020-12-01 10:39:27 +00:00
Joshua Fontany
dde4182830 Fix filesystem adaptor (#5113)
* ignore .env

testing new implementation

almost there

closer

bug, desyncing

fixed

final testing

final testing

cleanup

cleanup

* isEditableFile flow fixed

* removed `basepath` logic

* callback to delete title from $tw.boot.files

* comment fix

* have syncer delete from boot.files

* syntax

* bugfix: error on missing directory

* bugifx

* remove !draft check

* fix relative filepaths

* cleanup

* cleanup !draft

* catch undefined filepaths in deleteTiddlerFile()

* typo

* whitelist wiki dir, encodeURIComponent otherwise

* test for wikiPath, not wikiPath/tiddlers

* don't need to .normailze()

* whitelist wiki directory, move cleanup to util

* use cleanup util & fail EPERM & EACCESS gracefully

* comments

* final bugs fixed

* improved sync error
2020-11-30 22:31:48 +00:00
Rob Hoelz
abe9af1369 Add documentation for indexer modules (#4873) 2020-11-30 22:10:07 +00:00
Florian Kohrt
6f09a5ee65 Fix link to TiddlyWikiFolders (#4843)
* Fix link to TiddlyWikiFolders

* Better link to tiddlywiki.info reference tiddler
2020-11-30 21:34:00 +00:00
Florian Kohrt
706fc3e06e Fix typo; closes #4815 (#4844) 2020-11-30 21:33:16 +00:00
Simon Huber
6a319940d3 Make buttons look like buttons in CupertinoDark, GruvboxDark and DesertSand palette (#5159)
* Make buttons look like buttons in CupertinoDark palette

* Update GruvBoxDark.tid

* Update DesertSand.tid
2020-11-30 21:04:14 +00:00
jeremy@jermolene.com
fe8606759e Fix parsing of dates between 0 and 100 AD 2020-11-30 18:56:52 +00:00
Mario Pietsch
1de747b182 add docs for radio-actions (#5156) 2020-11-30 18:48:48 +00:00
jeremy@jermolene.com
3406b98af6 Add "autocomplete" attribute to <$edit> and <$edit-text> widgets 2020-11-30 18:48:04 +00:00
Bram Chen
80191903b6 Update chinese translations (#5145)
* Improve `References/Caption`
* Add `Basics/RemoveTags` and `Basics/RemoveTags/Hint`
2020-11-30 17:58:33 +00:00
Simon Huber
367854c81b Update static.tiddler.html.tid (#5148) 2020-11-30 17:56:19 +00:00
Robin Munn
4f13848ca2 Document using double hashes for anchor links (#5149)
This is based on #3836, updated and revised with the edits made by
Watt on the Google Group.
2020-11-30 17:54:45 +00:00
Robin Munn
fd3e77d38f "dedupe" and "raw" suffixes for enlist-input operator (#5152)
Includes unit tests.
2020-11-30 17:52:46 +00:00
saqimtiaz
8fc6910c03 Added string operator pad[] along with tests and docs (#5146) 2020-11-30 17:43:50 +00:00
Robin Munn
4623c45d29 Tag trim operator as a string operator (#5147)
* Tag trim operator as a string operator

With the new functionality of the trim operator in 5.1.23, it's now a
general-purpose string manipulation tool. So it should be given the
"String operators" tag so that people see it in the same list as
removeprefix and removesuffix, etc.

* Document suffix of trim operator
2020-11-30 17:30:51 +00:00
Mario Pietsch
5cbe4c5317 Add radio actions, th-radio-variables hook and fix label refresh problem (#5154)
* Add actions to radio-widget, pass trhough all attributes and user parameters, fix label refresh

* invoke th-radio-hook instead of hardcoded variables

* simplify code and test it with a plugin hook

* remove hook
2020-11-30 17:28:49 +00:00
Jeremy Ruston
4d9e6831bb Rename "references" to "backlinks" in the tiddler info panel (#5143)
* Rename "references" to "backlinks" in the tiddler info panel

* Change docs references to "references" to "backlinks"
2020-11-29 18:32:22 +00:00
Robin Munn
5887c6621e Create "Filter Run Prefix (Examples)" tiddler (#5144)
Move the `+` vs `:intersection` example into a separate Examples tiddler
which can be expanded on later.
2020-11-29 15:45:39 +00:00
Simon Huber
ce937595d7 Add Button to remove tags from tiddlers $:/config/NewTiddler/Tags and $:/config/NewJournal/Tags (#5140)
* Update Basics.tid

* Update ControlPanel.multids

* Update Basics.tid

* Update ControlPanel.multids

* Update ControlPanel.multids

* Update ControlPanel.multids
2020-11-29 12:52:50 +00:00
jeremy@jermolene.com
cc850d7151 Fix typo in list macro
See discussion https://github.com/Jermolene/TiddlyWiki5/pull/3710#issuecomment-735295319
2020-11-29 12:38:09 +00:00
Bram Chen
a21428a33a Add chinese translations for Saving/TiddlySpot/ReadOnly (#5139) 2020-11-29 12:26:21 +00:00
saqimtiaz
12bb938463 Corrected typo in contributor's name (#5138) 2020-11-28 22:05:54 +00:00
Jeremy Ruston
e54f3368e9 Update contributors list in release note 2020-11-28 21:43:09 +00:00
Simon Huber
eb7f59a855 Make "tc-dirty" update also on external windows (#5129)
* Update windows.js

* Update saver-handler.js

* Update saver-handler.js
2020-11-28 21:24:01 +00:00
Simon Huber
b3cbd7d733 Add TiddlySpot-ReadOnly Message-Box to Tiddlyspot Saving Panel (#5133)
* Add message box to TiddlySpot Saving panel

* add readonly message
2020-11-28 21:22:32 +00:00
Simon Huber
28724138d1 Small update for better readability for CupertinoDark palette (#5134) 2020-11-28 21:21:53 +00:00
Simon Huber
62a2a0e579 Fix typo in vanilla/base (#5135) 2020-11-28 21:13:18 +00:00
jeremy@jermolene.com
98e60758a9 Updated Release Note 2020-11-28 17:32:42 +00:00
Simon Huber
c655ec5469 Remove background-colors from framed engine (#5131) 2020-11-28 14:08:16 +00:00
Simon Huber
7d2703bffb Make tiddler-editor iframe same color as tiddler background (#5132) 2020-11-28 14:07:46 +00:00
Simon Huber
09d7a77f1b Add default "tiddlywiki" styles to CodeMirror and Highlight.js (#5128)
* Update styles.tid

* Update styles.tid

* Update theme.tid

* Delete cm-theme-tiddlywiki.tid
2020-11-28 14:07:12 +00:00
Simon Huber
8005c91e79 Correctly add EventListener 'click' for popup-handling in new windows (#5127) 2020-11-28 07:26:47 +00:00
Simon Huber
86a9f922bf Update LayoutSwitcher.tid (#5125) 2020-11-27 21:52:26 +00:00
saqimtiaz
2175be27b0 Ensure that we always fetch the latest sha bypassing cache. (#5126)
Ensure that we always fetch the latest sha bypassing cache.
2020-11-27 21:37:11 +00:00
jeremy@jermolene.com
9637a29e55 Rename widget.executeStartupTiddlers() to invokeActionsByTag()
This method was introduced earlier in v5.1.23 in  5cc1600072

It is not in fact restricted to startup tiddlers.
2020-11-26 12:41:24 +00:00
Mario Pietsch
8320a55fef fix titlebar line-height for chrome (#5122) 2020-11-25 16:27:31 +00:00
jeremy@jermolene.com
2267e31546 Fix eventcatcher to ensure variable values are strings
I was getting some inconsistencies with filter operators that expect strings.
2020-11-25 15:54:28 +00:00
jeremy@jermolene.com
e3bf1f43cf Missed off previous commit 64ac29adc
Thanks @saqimtiaz
2020-11-25 14:07:01 +00:00
jeremy@jermolene.com
64ac29adca Fix typo preventing filter run prefix modules from being cached
This had a significant impact on performance.
2020-11-25 13:58:54 +00:00
jeremy@jermolene.com
94ffb50e04 Fix dark mode event handling
Previous code worked but this matches the spec, and works on iOS
2020-11-25 12:33:39 +00:00
jeremy@jermolene.com
3e3f185562 Clarify behaviour of self closing tags 2020-11-25 09:44:48 +00:00
saqimtiaz
6c98bb706a Docs for switching layouts (#5109) 2020-11-24 21:38:18 +00:00
Bram Chen
4f88d79d8b Add chinese translations for Switchers (#5111) 2020-11-24 21:27:24 +00:00
saqimtiaz
0e247c991d Update modifier variable docs (#5114)
Listing the potential key combination in a single line is hard to read and also redundant when we have the same information in the table below.
2020-11-24 21:19:37 +00:00
saqimtiaz
ce27492b96 Refactor updating of classes for button widgets to avoid potential edge case failures (#5115) 2020-11-24 21:19:20 +00:00
Simon Huber
a9d583b85e Update CupertinoDark.tid (#5117) 2020-11-24 21:16:24 +00:00
Simon Huber
5769cf9784 Fix #5108 - vanilla/reset overrides system fonts (#5118) 2020-11-24 21:15:37 +00:00
jeremy@jermolene.com
c854e518fa Add support for $:/info/darkmode (and for dynamic info tiddlers) 2020-11-24 19:01:33 +00:00
jeremy@jermolene.com
7327a3fb92 Fixed: Shadow tiddlers don't refresh when their plugin is deleted/modified 2020-11-24 18:57:39 +00:00
Simon Huber
50a3c5526f Update CupertinoDark.tid (#5107) 2020-11-23 20:09:53 +00:00
Simon Huber
77971ff720 Lighter sidebar-controls-foreground for Cupertino Dark Palette (#5106) 2020-11-23 19:41:51 +00:00
Simon Huber
e0f4d82214 Update CupertinoDark.tid (#5105) 2020-11-23 19:32:51 +00:00
Simon Huber
af72fdf245 Add caption to ControlPanel LayoutSwitcher (#5103)
* Update LayoutSwitcher.tid

* Update ControlPanel.multids
2020-11-23 19:15:04 +00:00
Simon Huber
519962b4a9 Update and rename MacOSDark.tid to CupertinoDark.tid (#5101)
* Update and rename MacOSDark.tid to CupertinoDark.tid

* Update CupertinoDark.tid

* Update CupertinoDark.tid

* Update CupertinoDark.tid
2020-11-23 19:14:07 +00:00
Simon Huber
c9a77c5877 Create MacOSDark.tid (#5100) 2020-11-23 18:41:38 +00:00
Simon Huber
3d93790573 Fix StaticRiver exporter width of static tiddlers (#5099)
* Add tc-static-story-river class to StaticRiver exporter

* Update base.tid
2020-11-23 18:06:46 +00:00
saqimtiaz
cb62c8c96d Docs for eventcatcher (#5097) 2020-11-23 17:07:41 +00:00
saqimtiaz
aa6f152d35 Add Switcher modal (#5089)
* Alternative switcher using a parameter via tm-show-switcher

* Add CSS class for centered modals

* Changed keyboardshortcut and removed transition CSS

* Resolved wording issues
2020-11-23 17:06:24 +00:00
Simon Huber
72b32946aa Small adjustments for DesertSand palette (#5098)
* Small adjustments for DesertSand palette

* Update DesertSand.tid
2020-11-23 16:59:48 +00:00
Mario Pietsch
60850ee69b Update German Language (#5096)
* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* Don't override browser selection colours by default

Reverts some of #4590

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* Update German Language

* some typos

Co-authored-by: jeremy@jermolene.com <jeremy@jermolene.com>
2020-11-23 16:24:37 +00:00
Simon Huber
8c4d67ba2b Add light "DesertSand" palette - a desert-sandy palette (#5092)
* Add light "DesertSand" palette - a desert-sandy palette

* Update DesertSand.tid

* Update DesertSand.tid
2020-11-22 21:18:34 +00:00
saqimtiaz
3c195b05cb Button and Droppable widgets: improve refresh handling for classes (#5091)
* Button and Droppable widgets: improve refesh handling for classes

* Added comment regarding handling of class attribute
2020-11-22 21:13:24 +00:00
Simon Huber
530b4308e3 Make type input field min-width the highest character length of selectable types (#5090)
* Make type input field min-width the highest character length of selectable types

* Update base.tid

* Update base.tid
2020-11-22 21:12:19 +00:00
saqimtiaz
fa63ac5d1e Add: Eventcatcher widget (#5086)
* Jeremy's original version of the event widget

* Renamed to eventcatcher, added modifier key support and mouse button support as variables

* Allow updating classname without re-rendering entire widget

* Handle tag attribute in refresh handler

* Improve handling for mouse button variable

* Fix typo in refresh handler

* Added variables for position of selected node and position of event relative to selected node and catcher node
2020-11-22 20:47:12 +00:00
saqimtiaz
51ca14861e Fixed bug with default value in lookup operator (#5088)
* Fixed bug with default value in lookup operator

* Fixed test for lookup operator with default
2020-11-22 20:43:36 +00:00
saqimtiaz
d2f87d6200 Reveal widget allow re-positioning (#5087)
* Jeremy's original version of the event widget

* Renamed to eventcatcher, added modifier key support and mouse button support as variables

* Reveal widget: update popup position when state tiddler updates
2020-11-21 17:19:52 +00:00
saqimtiaz
a0f145197c Correct error in operator documentation (#5084) 2020-11-20 21:34:43 +00:00
saqimtiaz
c97003238b Doc updates for ActionLog and Log widgets (#5081) 2020-11-20 18:37:48 +00:00
saqimtiaz
4f07539164 Cycle operator improvements plus docs (#5069)
* Tweak cycle operator to support step size parameter and add docs for toggle and cycle

* Mention that title list should have no duplicates
2020-11-20 18:37:23 +00:00
Simon Huber
5945506169 Revert line-height of 3em on tiddler-edit-title (#5083) 2020-11-20 18:21:30 +00:00
saqimtiaz
483fd941f5 Extend action-log and subclass it as log widget (#5078)
* Extended action-log and subclassed it as log widget

* Do not rename LogWidget class

* Removed unneeded variable declaration
2020-11-20 14:08:18 +00:00
Simon Huber
1339c23b3a Adjustments for narrow screens (#5079) 2020-11-20 14:00:56 +00:00
saqimtiaz
89541edcff Added mathematics filter operators power and log (#5080) 2020-11-20 14:00:20 +00:00
Simon Huber
fd14e94610 Add whitespace trims to EditToolbar Buttons (#5076)
* Add whitespace trim to EditToolbar cancel Button

* Add whitespace trim to EditToolbar delete Button

* Add whitespace trim to EditToolbar save Button
2020-11-19 16:37:36 +00:00
Simon Huber
f591a78f37 Fix small typo in syncer-actions-refresh.tid (#5075) 2020-11-19 16:32:43 +00:00
saqimtiaz
e2bea854b6 System tiddler syncing (#4987)
* First pass at a fix for system tiddler sync issues

* Add new filter syncFromServer

* Undo previous attempt at a fix

* Added a flag to control sync of system tiddlers from server
2020-11-19 15:59:02 +00:00
jeremy@jermolene.com
0d434583ec Merge branch 'tiddlywiki-com' 2020-11-19 10:01:23 +00:00
jeremy@jermolene.com
a81b7fc9f4 Remove extraneous modifier/creator fields
Fixes #5068
2020-11-18 18:21:38 +00:00
Simon Huber
da66323dc5 Remove 2em of whitespace from EditTemplate when there are no visible fields (#5063)
* Remove 2em of whitespace from EditTemplate when there are no visible fields

* Update base.tid

* Update fields.tid

* Update fields.tid

* Update base.tid
2020-11-18 18:02:40 +00:00
jeremy@jermolene.com
0be778fc27 Update Dutch translation
Thanks @gernert
2020-11-18 16:56:01 +00:00
Bram Chen
37f4421ed1 Improve chinese status messages in ImportListing (#5064) 2020-11-18 16:39:45 +00:00
jeremy@jermolene.com
f61906501d Fix issue with Arabic translation
See discussion https://groups.google.com/d/msgid/tiddlywikidev/bb2f558e-5daa-4f18-8dca-73abc61d4dbfn%40googlegroups.com

@Kamal-Habash the .multids file does not allow line breaks in items. Does my fix look right?
2020-11-18 16:31:28 +00:00
saqimtiaz
1a8c6fdc4b Docs: Added example of how to remove stop words (#5066)
* Added example of how to remove stop words

* Moved filter operator example tiddlers to correct folder
2020-11-18 15:56:38 +00:00
saqimtiaz
6f8dca956b Colour code ImportListing rows (#5067) 2020-11-18 15:50:40 +00:00
jeremy@jermolene.com
061b75741b Fix GitHub Actions
Copied from 4ecd885a0c which fixes #4885
2020-11-18 13:14:19 +00:00
jeremy@jermolene.com
d181b96518 Wikitext parser: Refactor a poorly written utility function 2020-11-18 12:05:06 +00:00
saqimtiaz
527638d5e6 Improved status messages in ImportListing to remove redundant and irrelevant messages (#5059) 2020-11-17 19:12:41 +00:00
Simon Huber
b95f9e6000 Partial fix for issue #4721 (#5060)
* Update new-tiddler.tid

* Update new-journal.tid

* Update new-image.tid
2020-11-17 19:08:14 +00:00
Mohammad Rahmani
6d5ea90bfd Add resources by Mohammad (#5061)
* Correct for new GitHub default branch

This PR corrects the default branch of GitHub from master to main. This is ne GitHub repository configuration from Oct 1st, 2020

* Update Saving to a Git service.tid

GitLab still uses `master` as default branch.

* Add Kookma plugins as resources

Some of Kookma resources including TW-Scripts, Commander, Trashbin, Todolist has been added.

* Revert "Add Kookma plugins as resources"

This reverts commit 199fce3a08.

* Adding Resources by Mohammad

This PR adds resources created by Mohammad mostly in GitHub
2020-11-17 19:07:32 +00:00
Simon Huber
eae3da0e9d Make sidebarsegments/search-results-count work with all search tabs (#5062) 2020-11-17 19:05:32 +00:00
Bram Chen
684f13fbcb Add chinese translations for ConfirmAction (#5056) 2020-11-17 14:47:31 +00:00
jeremy@jermolene.com
8cd13e2f89 Change default branch for GitHub saver to "main"
To match GitHub's new default

See also #5055 for the accompanying docs change
2020-11-17 14:47:15 +00:00
Mohammad Rahmani
3b75297168 Correct for new GitHub default branch (#5055)
* Correct for new GitHub default branch

This PR corrects the default branch of GitHub from master to main. This is ne GitHub repository configuration from Oct 1st, 2020

* Update Saving to a Git service.tid

GitLab still uses `master` as default branch.

* Add Kookma plugins as resources

Some of Kookma resources including TW-Scripts, Commander, Trashbin, Todolist has been added.

* Revert "Add Kookma plugins as resources"

This reverts commit 199fce3a08.
2020-11-17 14:45:32 +00:00
saqimtiaz
2b60ab1fdc Doc updates for Modals (#5057) 2020-11-17 14:43:46 +00:00
saqimtiaz
d6e055368d Added docs for action-confirm widget, added default message for widget and improved logic for disabling it. (#5047) 2020-11-16 17:02:22 +00:00
saqimtiaz
fc1721709a Cycle operator and refactored toggle operator (#5021)
* Refactored toggle operator and added cycle operator

* Better handling for operand case

* Syntax/whitespace corrections
2020-11-16 17:02:04 +00:00
Simon Huber
43061e64a6 Fix #5039 - Tag input, Type input and Fields inputs don't delete their state tiddlers on tiddler-cancel/delete (#5049)
* Update EditTemplate.tid

* Update EditTemplate.tid

* Update EditTemplate.tid

* Update tag-picker.tid

* Update tag-picker.tid

* Update type.tid

* Update fields.tid

* Update cancel.tid

* Update delete.tid

* Update type.tid

* Update ViewTemplate.tid
2020-11-16 16:54:29 +00:00
Robin Munn
d8d88c67e3 Fix minor mistake in ButtonWidget docs (#5050)
The ButtonWidget documentation refers to a "state" attribute, but this
should probably be "set". The name "state" appears to be an artifact
from when the setTitle, setField, and setIndex attributes were added to
the widget; at one time they were called stateTitle and so on, and then
they were renamed to setTitle instead, but not every instance of "state"
was found and renamed to "set". This is one such instance, now fixed.
2020-11-16 16:50:32 +00:00
Robin Munn
ffd6a8cce7 More documentation for :intersection filter prefix (#5051) 2020-11-16 16:32:28 +00:00
saqimtiaz
a637f7fb60 Modals: add navigator to handle tm-navigate (#5027)
* Wrap modal in a navigator widget to allow tm-navigate to work

* Move all story list handling to Modal

* Make sure any values for story list or history list sent as variables have precedence

* Code clean up
2020-11-16 16:27:46 +00:00
Simon Huber
ca4cdc81dd Remove reduntant fieldmangler widget from tags EditTemplate (#5044) 2020-11-15 16:04:39 +00:00
saqimtiaz
13499557bf Fix whitespace in x-listops.js and tweak toggle operator (#5024)
* Replaced leading spaces with tabs

* Tweak toggle[] to insert new value in same list position
2020-11-15 16:04:03 +00:00
Simon Huber
a2b2e117e3 Delete all state tiddlers after adding a new field (#5045) 2020-11-15 15:49:43 +00:00
Bram Chen
d9b8a800c6 Update chinese translations (#5046)
* add the tooltip and aria-label of clear-tag-input button
2020-11-15 15:49:05 +00:00
Simon Huber
2aa6e761fd Make Tag-Picker Macro work with every field (#5035)
* Make tag-picker work with every field

* Make EditTemplate/tags work with every field

* Make NewTiddlerTags and NewJournalTags selectable through tag-picker

* Update tag-picker Macro Docs
2020-11-15 12:04:50 +00:00
Simon Huber
7078ca2c1e Revert Tag-input behavior to how it was before (#5041) 2020-11-15 11:42:46 +00:00
saqimtiaz
04bf6e0fd8 Action widget: confirm (#5037)
* added action widget: confirm

* Check for all attributes in refresh handler

* Always return a value from invokeActions
2020-11-15 11:40:08 +00:00
Simon Huber
bb6fee4e1c Remove image-buttons from type image/svg+xml and add editor-height and stamp button (#5042)
* Add stamp button to image/svg+xml

* Add editor-height Button to image/svg+xml

* Remove rotate-left button from image/svg+xml

* Remove size Button from image/svg+xml

* Remove paint Button from image/svg+xml

* Remove line-width Button from image/svg+xml

* Remove clear Button from image/svg+xml

* Remove opacity Button from image/svg+xml
2020-11-15 11:37:30 +00:00
Xavier Cazin
f087a62c99 fr-FR translations updates (#5043)
* fr-FR translations for Shortcut hints

* fr-FR translations related to renaming tiddlers during Import

* Correction of NewJournal Tags default config in fr-FR

* fr-FR update for the rendertiddlers command

* fr-FR translations for new Filter errors

* fr-FR update for the savetiddlers command

* fr-FR update for the savetiddler command

* fr-FR update for the rendertiddler command

Co-authored-by: Xavier Cazin <xavier.cazin@gmail.com>
2020-11-15 11:35:17 +00:00
jeremy@jermolene.com
1b31c25ea7 Introduce <$action-log> widget to help debugging action strings 2020-11-14 13:00:00 +00:00
Simon Huber
02a956b1bb Add Pop Storyview to Manager Tags Section (#5034) 2020-11-14 12:32:39 +00:00
jeremy@jermolene.com
cc3462999b When importing don't use file type as content type
Fixes #5028

I've checked that importing other file types still works but would appreciate a sanity check!
2020-11-14 12:05:35 +00:00
Simon Huber
b63c90e401 Add missing tooltip and aria-label to clear-tag-input button (#5033)
* Add tooltip and aria-label to new clear-tags-input button

* Update EditTemplate.multids
2020-11-13 19:19:55 +00:00
Simon Huber
497b334d60 Change tag-picker behavior when there is user-input ... (#5032)
... in the search field
2020-11-13 18:50:50 +00:00
Simon Huber
fa373a1c6f Make keyboard-driven-input Macro reset to typed input ... (#5031)
... on up/down when reaching the top/bottom of the list
2020-11-13 18:01:24 +00:00
jeremy@jermolene.com
1eac5c051f Menu lists should only use white-space: nowrap in the sidebar
Fixes #5030
2020-11-13 18:00:37 +00:00
saqimtiaz
568990409a Fix typo in toggle operator docs (#5020) 2020-11-09 20:43:44 +00:00
saqimtiaz
09f7ad84b2 Added disabled attribute to input widgets (#5014)
* checkbox widget: added disabled attribute

* Range widget: added disabled attribute

* Radio widget: added disabled attribute

* EditText widget: added disabled attribute
2020-11-09 18:28:12 +00:00
saqimtiaz
445c15e719 Extend toggle operator (#5015)
* Extend toggle operator to support optional second operand to toggle a value pair

* Added tests for extended toggle filter

* Updated docs for toggle operator
2020-11-09 18:27:45 +00:00
Simon Huber
27bed615ab Move styles from menubar plugin to vanilla/base (#5019)
* Update styles.tid

* Update base.tid

* Update styles.tid

* Update base.tid
2020-11-09 18:18:30 +00:00
jeremy@jermolene.com
1ec8b7877e Ensure root template contents is parsed in block mode
Embarrassingly, the double blank lines at the end of the tiddler are needed to ensure the transclude widget is recognised in block mode, instead of being wrapped in a paragraph tag.

Fixes #5016
2020-11-09 17:08:34 +00:00
saqimtiaz
59c6f4447e Import UI : Fix issue with size of rename button (#5012)
* Fix issue with size of rename button

* Add css instead of hard coded style attribute
2020-11-08 23:21:01 +00:00
Simon Huber
343207fc35 MenuBar: Add fallback value to breakpoint-plus-one and ... (#5009)
* Add fallback value to breakpoint-plus-one and ...

... sidebarbreakpoint-minus-one in case that widths aren't given in px units

* Update styles.tid
2020-11-08 22:38:08 +00:00
saqimtiaz
519ce3e89d Update Release 5.1.23.tid (#5005)
Updated release notes
2020-11-08 22:37:43 +00:00
saqimtiaz
71194d8767 Added disabled attribute support to ButtonWidget (#5010)
* Added disabled attribute to ButtonWidget

* Update ButtonWidget.tid
2020-11-08 22:32:27 +00:00
Simon Huber
480e4e2ce9 Make fieldvalue-input a bit larger when viewport is narrow (#5007)
* Make field-value input display a bit larger when narrow

* Update base.tid

* Update base.tid

* Update base.tid
2020-11-08 22:30:31 +00:00
Simon Huber
db48ce5f2c Correct breakpoint for no-box-shadow in snowwhite/base stylesheet (#5008) 2020-11-08 22:28:32 +00:00
Simon Huber
4d85d267a1 Make navigating and editing Shadow tiddlers work again (#5004)
* Update search.tid

* Update Filter.tid

* Update Shadows.tid

* Update Standard.tid

* Update System.tid

* Update search.tid
2020-11-08 13:26:02 +00:00
Simon Huber
98f67373b1 Menubar plugin: make sidebar-scrollable top margin adjust ... (#4974)
* Menubar plugin: make sidebar-scrollable top margin adjust ...

... to height of menubar

* Update styles.tid

* Update styles.tid

* Update styles.tid

* Update styles.tid

* Update menu.tid

* Update styles.tid

* Update styles.tid

* Update styles.tid

* Update styles.tid

* Update menu.tid

* Update styles.tid

* Update styles.tid
2020-11-08 11:50:15 +00:00
ento
e574cb4724 Markdown plugin: add rel="noopener noreferrer" to external links (#4771) 2020-11-08 11:47:44 +00:00
Robin Munn
e72d90c227 More examples for enlist-input operator (#4968)
The examples should also show what would happen without the operator, to
give a better feel for why it's useful.
2020-11-08 11:47:15 +00:00
Simon Huber
c729115506 Update modifier Variable.tid with a test-button and... (#5002)
... a tip for meta-key detection on various operating systems
2020-11-08 11:46:13 +00:00
Simon Huber
9854a4fc08 Fix #4998 - Pressing Enter creates Missing Tiddler (#5001)
* Update search.tid

* Update Filter.tid

* Update Shadows.tid

* Update Standard.tid

* Update System.tid

* Update search.tid

* Create Hidden Setting Search-NavigateOnEnter.tid
2020-11-08 11:43:24 +00:00
Simon Huber
9fe4c4889a Add "meta" to getEventModifierKeyDescriptor (#5000)
* Add "meta" to getEventModifierKeyDescriptor

* Update modifier Variable.tid
2020-11-08 10:15:29 +00:00
Simon Huber
750f56a235 Update Basics.tid (#4999) 2020-11-08 09:44:49 +00:00
saqimtiaz
66636d1a86 Docs for new operators (#4994)
* Docs for is[draft]

* Better error handling for suffixes

* Docs for search-replace operator

* Added tests for search-replace operator

* Docs for toggle operator
2020-11-08 09:34:05 +00:00
saqimtiaz
2a7cdb22c0 Documentation for multiple filter operands (#4969) 2020-11-08 09:32:37 +00:00
Simon Huber
b69b84b38e Update core "tabs" macros to use explicitState (#4985)
* Update ControlPanel.tid

* Update Advanced.tid

* Update Appearance.tid

* Update Info.tid

* Update AddPlugins.tid

* Update Plugins.tid

* Update Saving.tid

* Update Toolbars.tid

* Update Plugins.tid

* Update More.tid

* Update TiddlerInfo.tid

* Update tabs.tid

* Update settings.tid

* Update ControlPanel.tid

* Update Advanced.tid

* Update Appearance.tid

* Update Info.tid

* Update AddPlugins.tid

* Update Plugins.tid

* Update Saving.tid

* Update Toolbars.tid

* Update Plugins.tid

* Update More.tid

* Update tabs.tid

* Update settings.tid

* Update TiddlerInfo.tid

* Update AdvancedSearch.tid

* Update Filter.tid

* Update Shadows.tid

* Update Standard.tid

* Update System.tid
2020-11-08 09:31:39 +00:00
saqimtiaz
ee250bf6c9 Updated release notes (#4997) 2020-11-08 09:26:58 +00:00
Simon Huber
de69ab0d0e Update keyboard-driven type-input actions on "Escape" (#4992)
* Delete "type" field when pressing escape in type input

* Update type.tid
2020-11-07 12:21:24 +00:00
saqimtiaz
cf58dcf116 Add is[draft] operator (#4991) 2020-11-07 10:29:15 +00:00
saqimtiaz
53922d3558 search-replace string operator (#4973)
* Added search-replace operator

* Merge with master

* Add try catch around new RegExp

* Better error handling
2020-11-07 10:09:11 +00:00
saqimtiaz
c41e34793d Add x-listops filter toggle (#4990) 2020-11-07 10:00:47 +00:00
saqimtiaz
5aa4e4cb68 Initial support for switching page templates (#4979)
* Add support for switching page templates

* Revert "Add support for switching page templates"

This reverts commit dbf7682d47.

* Adopt Jeremy's approach to page template switching instead

* Fix default value of recursion marker

* Fixed issue with conditional check
2020-11-07 09:51:01 +00:00
saqimtiaz
2b31c7a509 Multiple operands for filter operators (#4964)
* Firt pass at adding multiple operands to filter operators

* Optimized parsing of multiple operands and added more tests. Need more flexibility for interpreting multiple operands as variables/text references

* Add support for parsing text references and variables in multiple operands

* Added string-replace filter for testing multiple filter operands

* Added more tests for variables and text references in operands

* Removed string-replace operator and some whitespace corrections

* Removed string-replace operator and some whitespace corrections

* Added test with comma in operand
2020-11-07 09:47:08 +00:00
Simon Huber
0bd866e2f9 Make type input keyboard-driven (#4989) 2020-11-07 09:46:05 +00:00
jeremy@jermolene.com
93e7380188 Update default body text font to modern-normalize.css default
Fixes #4988
2020-11-07 09:45:03 +00:00
jeremy@jermolene.com
9003c81039 Switch to more modern fork of normalize.css
https://github.com/sindresorhus/modern-normalize
2020-11-07 09:42:37 +00:00
Simon Huber
900a29fbb3 Tag-picker: focus tag-input after clicking a tag from the dropdown (#4986)
* Tag-picker: focus tag-input after clicking a tag from the dropdown

* Update tag-picker.tid
2020-11-06 21:16:14 +00:00
Simon Huber
b3d0303139 Add editor-height button and stamp-button to tiddler types that miss them (#4975)
* Add editor-height button also to application/javascript ...

... application/json and application/x-tiddler-dictionary

* Add stamp button also to application/javascript ...

... application/json and application/x-tiddler-dictionary
2020-11-06 18:34:10 +00:00
Miha Lunar
feefc4cceb Signing the CLA (#4976) 2020-11-06 17:51:53 +00:00
Simon Huber
d51975b183 KeyboardWidget: don't trap keyboard shortcut if actions and message are empty and invokeActions isn't handled (#4971)
* KeyboardWidget: don't trap keyboard shortcut if actions are empty

* Update keyboard.js

* Update keyboard.js
2020-11-06 17:32:26 +00:00
jeremy@jermolene.com
15e8772170 Remove erroneously committed file 2020-11-06 17:01:13 +00:00
Simon Huber
bc5143f190 When accessing the AdvancedSearch from the sidebar, delete sidebar-search state tiddlers (#4981) 2020-11-06 16:53:11 +00:00
Simon Huber
458460354e Add delete-field keyboard shortcut (#4978)
* Add delete-field keyboard-widget

* Update shortcuts.multids

* Update ShortcutInfo.multids

* Update fields.tid

* Update shortcuts.multids
2020-11-06 16:27:41 +00:00
Simon Huber
78c72b85fb Make tag for menubar-contents dropdown configurable (#4983)
* Make tag for menubar-contents dropdown configurable

* Make tag for menubar-contents dropdown configurable

* Make tag for menubar-contents dropdown configurable
2020-11-06 16:26:44 +00:00
jeremy@jermolene.com
22e25c05eb Remove normalize.css's styling of search inputs
As discussed here: https://github.com/Jermolene/TiddlyWiki5/issues/4984#issuecomment-723169753
2020-11-06 16:24:05 +00:00
jeremy@jermolene.com
4394b8e723 Dynannotate: Add example of view template usage 2020-11-06 12:27:46 +00:00
Simon Huber
d5c4aa250a Remove dependency on wiki.js for story-startup and navigator (#4200)
* Update story.js

* Update wiki.js

* Update navigator.js

* Add deprecation console logs to addToHistory and addToStory
2020-11-02 22:52:02 +00:00
saqimtiaz
70561bd481 Added docs for enlist-input filter operator (#4966) 2020-11-02 22:50:22 +00:00
saqimtiaz
2f5f0db00f Added docs for :intersection filter run prefix (#4967) 2020-11-02 22:49:50 +00:00
Simon Huber
4a6aa865b3 Make Escape in keyboard-driven-inputs behave like in AdvancedSearch/Filter (#4961)
* Create focus-editor.js

* Update search.tid

* Update link-dropdown.tid

* Update search.tid

* Update Standard.tid

* Update Shadows.tid

* Update System.tid

* Update fields.tid

* Update tag-picker.tid

* Update Filter.tid

* Update clear.tid

* Update link-dropdown.tid

* Delete focus-editor.js
2020-11-02 19:08:24 +00:00
Simon Huber
f29d24a1f5 Doc updates for keyboard-driven-input (#4963) 2020-11-02 19:04:25 +00:00
Bram Chen
2818f52f95 Add chinese translations for Shortcuts/SidebarLayout/Hint (#4962) 2020-11-02 09:17:09 +00:00
Bram Chen
9453c4d684 Add chinese translations for Listing/Rename/OverwriteWarning (#4960) 2020-11-01 17:15:27 +00:00
Mario Pietsch
42b965c9f0 Init less parsers (#4954)
* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* Don't override browser selection colours by default

Reverts some of #4590

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* list-widget, init new Parser() only if needed.

* fix braces

Co-authored-by: jeremy@jermolene.com <jeremy@jermolene.com>
2020-11-01 17:14:42 +00:00
saqimtiaz
e9a635dc81 Added intersection filter run prefix (#4959) 2020-11-01 17:13:52 +00:00
Simon Huber
26ade60e93 Make AdvancedSearch/Filter navigatable by keyboard (#4932)
* Make AdvancedSearch/Filter keyboard-driven

* Adapt keyboard-driven-input macro for use with...

... AdvancedSearch/Filter Tab

* Adjust Filter dropdown for kb-driven AdvancedSearch/Filter

* Adjust Clear Button for kb-driven AdvancedSearch/Filter

* Adjust Delete Button for kb-driven AdvancedSearch/Filter

* Adjust Export Button for kb-driven AdvancedSearch/Filter

* Update clear.tid

* Avoid editing the wron tiddler

* Make cancel-search-actions a bit more sophisticated

* Update Filter.tid

* Update Filter.tid

* Update Filter.tid

* Update keyboard-driven-input.tid

* Update dropdown.tid

* Update dropdown.tid

* Update Filter.tid

* Update clear.tid

* Update delete.tid

* Update dropdown.tid

* Update export.tid

* Update clear.tid

* Update Shadows.tid

* Update Standard.tid

* Update Shadows.tid

* Update System.tid

* Update Filter.tid

* Update keyboard-driven-input.tid
2020-11-01 17:12:29 +00:00
saqimtiaz
e7245a709c Add string operator enlist-input[] (#4948)
* Add string operator titlelist[]

* Update strings.js

* Update strings.js

* Add tests
2020-11-01 17:11:46 +00:00
Simon Huber
a6efc14a7c Add keyboard shortcut to change the sidebar layout (#4952)
* Create change-sidebar-layout keyboard shortcut

* Update shortcuts.multids

* Update ShortcutInfo.multids

* Update Misc.multids
2020-11-01 17:10:19 +00:00
saqimtiaz
9fbcdeb29e Import UI: add warning about tiddlers that already exist (#4956)
* Added message when tiddler being imported already exists

* Refactored some filters into a shared subfilter, optimized macro definitions
2020-11-01 11:33:02 +00:00
Simon Huber
ef1b7d619a Make ctrl-Enter in sidebar search also focus the AdvancedSearch input (#4941)
* Update search.tid

* Update Misc.multids

* Update search.tid

* Update search.tid

* Update search.tid

* Update search.tid
2020-11-01 11:23:18 +00:00
Simon Huber
ec70e5c179 AdvancedSearch keyboard shortcut: Let the navigator widget handle scrolling (#4955) 2020-11-01 11:22:34 +00:00
Simon Huber
4de0dc301b Rename $:/core/ui/KeyboardShortcut/toggle-sidebar... (#4953)
... to $:/core/ui/KeyboardShortcuts/toggle-sidebar for consistency
2020-11-01 11:15:53 +00:00
Simon Huber
769ffa19b7 Update CodeMirror plugins to v5.58.2 (#4950)
* Update codemirror.js to 5.58.2

* Update codemirror.css to 5.58.2

* Update activeline.js to 5.58.2

* Update dialog.js to 5.58.2

* Update jump-to-line.js to 5.58.2

* Update search.js to 5.58.2

* Update searchcursor.js to 5.58.2

* Update xml.js to 5.58.2

* Update show-hint.js to 5.58.2

* Update show-hint.css to 5.58.2

* Update javascript-hint.js to 5.58.2

* Update xml-hint.js to 5.58.2

* Update html-hint.js to 5.58.2

* Update css-hint.js to 5.58.2

* Update anyword-hint.js to 5.58.2

* Update closebrackets.js to 5.58.2

* Update matchbrackets.js to 5.58.2

* Update closetag.js to 5.58.2

* Update xml-fold.js to 5.58.2

* Update fullscreen.js to 5.58.2

* Update emacs.js to 5.58.2

* Update sublime.js to 5.58.2

* Update comment.js to 5.58.2

* Update vim.js to 5.58.2

* Update css.js to 5.58.2

* Update multiplex.js to 5.58.2

* Update htmlembedded.js to 5.58.2

* Update htmlmixed.js to 5.58.2

* Update javascript.js to 5.58.2

* Update markdown.js to 5.58.2

* Update markdown.js

* Update readme.tid

* Update markdown.js
2020-11-01 11:10:00 +00:00
Robin Munn
c0b021f509 Typo fix (#4951) 2020-11-01 11:03:59 +00:00
Simon Huber
635ec65d3f Fix alignment of tc-tiddler-edit-title (#4949) 2020-11-01 10:58:27 +00:00
Simon Huber
da06b64845 Fix AdvancedSearch Standard, System and Shadows up/down behavior (#4939)
* add filterMinLength to AdvancedSearch/Shadows

* add filterMinLength to AdvancedSearch/Standard

* add filterMinLength to AdvancedSearch/System

* Update link-dropdown.tid
2020-11-01 10:57:13 +00:00
Robin Munn
ecb3c86e7b Fix bug when location hash contains a # (#4947)
The bug fixed in this commit had an interesting side effect when the
location hash started with #, e.g. it looked like wiki.html##foo.
In that case, TiddlyWiki's navigation processing is not triggered and
the browser's navigation processing is used instead, which allows
anchors to be used within tiddlers for sub-tiddler navigation. To
preserve this unintended but useful side-effect, we check for a location
hash that starts with # and ignore it if it does.
2020-11-01 10:47:50 +00:00
Bram Chen
c6cd4d33e6 Add chinese translations for Listing/Rename/Prompt (#4946) 2020-11-01 10:45:48 +00:00
Robin Munn
77fe6244a2 Fix bug with sortan operator called on date fields (#4839)
* Add failing unit test that shows the bug

* Fix the bug
2020-11-01 10:45:18 +00:00
Simon Huber
f6e485b897 Avoid editing the wrong tiddlers when input fields are empty (#4943)
* Avoid editing the 'undefined' tiddler

* Avoid editing the wrong tiddler

* Avoid editing the wrong tiddler

* Avoid editing the wrong tiddler
2020-10-31 13:22:46 +00:00
Simon Huber
4b5d287c90 Change input-accept-variant actions shortcut from alt-Enter ... (#4942)
... to ctrl-Enter and advanced-search-sidebar shortcut from ctrl-Enter to alt-Enter

the ctrl-Key blocks navigation to the AdvancedSearch tiddler
2020-10-31 13:22:05 +00:00
saqimtiaz
c01e9cef12 Do not save temp tiddlers in single file (#4938)
* Update single file template to exclude temp tiddlers

* Update save-all-external-js.tid
2020-10-31 13:21:28 +00:00
saqimtiaz
655501140b Improvements for Import UI (#4937)
* Fixed bug with old titles used in popup, improved UI for greater rename input size

* Added flexbox utility CSS and use it for import UI
2020-10-29 13:01:17 +00:00
Robin Munn
cae32d39a5 Improve documentation for reduce operator (#4936) 2020-10-29 13:00:49 +00:00
Bram Chen
bc5609820f Update chinese translations (#4935)
* Update chinese language files
* add `Error/FilterRunPrefix` in Misc.multids
* add `Shortcuts/Input/AdvancedSearch/Hint` in Misc.multids

* Add chinese translations for Listing/Rename/*
2020-10-29 12:57:54 +00:00
twMat
4914208011 Update Configuring startup tiddlers.tid (#4009) 2020-10-29 12:57:11 +00:00
Simon Huber
b8fa6f0f0a Fix keyboard-driven fieldname dropdown (#4930)
I've accidentally overwritten the correct file when adding the tc-small-gap classes ... SORRY!
2020-10-28 17:16:20 +00:00
saqimtiaz
9605d94b6c Import rename (#4928)
* Add UI for renaming tiddlers before import in the import listing

* Removed spurious whitespace
2020-10-28 16:03:04 +00:00
Bram Chen
49b11bc493 Update chinese language files (#4929)
* add `Error/FilterRunPrefix` in Misc.multids
* add `Shortcuts/Input/AdvancedSearch/Hint` in Misc.multids
2020-10-28 15:59:02 +00:00
Simon Huber
9a4eb1e835 Add meta-S (mac) / ctrl-S shortcuts to save wiki (#4927)
* Create save-wiki.tid

* Update shortcuts-mac.multids

* Update shortcuts.multids

* Update ShortcutInfo.multids
2020-10-28 14:42:41 +00:00
Simon Huber
e71bf27dae Replace various &nbsp; with tc-small-gap classes (#4926)
* replace &nbsp; by span.tc-small-gap-right

* replace &nbsp;

* replace &nbsp;

* replace &nbsp;

* replace &nbsp;

* replace &nbsp;

* replace &nbsp;

* replace &nbsp;
2020-10-28 13:13:55 +00:00
Simon Huber
c985fd63f9 make link-dropdown navigatable by keyboard (#4919) 2020-10-28 12:01:05 +00:00
saqimtiaz
f5ad5010bc Added documentation for ':filter' prefix for filter runs. (#4920) 2020-10-28 12:00:18 +00:00
Simon Huber
12be7ac7e9 Add ability to navigate fieldname-dropdown by keyboard (#4921)
* make fields EditTemplate navigatable by keyboard

* Add configuration tiddler for fieldname-dropdown filters

* Update base.tid
2020-10-28 11:59:36 +00:00
Ryan Kramer
651619076a add override saver (#4908)
* add override saver

* rename 'override' to 'custom' and use the  global instead of introducing a new one
2020-10-28 11:58:48 +00:00
Simon Huber
57ba4c8cba Add .tc-small-gap (+left / right) and .tc-big-gap... (#4923)
(+left / right) classes that define margins of .5em / 1em
2020-10-28 11:57:08 +00:00
Simon Huber
6a01ab20a0 Fix menubar-plugin search (#4922) 2020-10-28 10:55:16 +00:00
Simon Huber
81e3ab0bc5 Make AdvancedSearch/Standard, AdvancedSearch/System and AdvancedSearch/Shadows navigatable by keyboard (#4925)
* Make AdvancedSearch/Shadows navigatable by keyboard

* Make AdvancedSearch/System navigatable by keyboard

* Make AdvancedSearch/Standard navigatable by keyboard

* Update search.tid
2020-10-28 10:53:41 +00:00
Simon Huber
e43ffe860b Fix #4910 - "Editor link dropdown is broken in pre-release." (#4913)
* fix #4910 in sidebarsegments/search

* fix #4910 in editortoolbar/link-dropdown

* fix #4910 in keyboard-driven-input macro

* Update keyboard-driven-input_Macro.tid

* Fix #4910 in tag-picker macro

* Update tag-picker.tid
2020-10-27 17:33:06 +00:00
saqimtiaz
d0081a7247 Updated Filter docs for named filter run prefixes (#4917) 2020-10-27 16:49:56 +00:00
saqimtiaz
972456ca07 Add new 'filter' prefix for filter runs (#4918) 2020-10-27 16:48:40 +00:00
jeremy@jermolene.com
9eec6ff915 Update path-prefix docs
Addressing @OblivionSY's comment https://github.com/Jermolene/TiddlyWiki5/issues/4898#issuecomment-717207456
2020-10-27 12:32:06 +00:00
saqimtiaz
c9efa23f02 Named filter run prefixes (#4915)
* First pass at refactoring filter code to support named filter run prefixes

* Remove filter prefix for now

* renamed module type and filter run prefixes

* Moved inline handling for no filter run prefix to 'or' filter run prefix.

* Added error handling for undefined filter run prefixes
2020-10-27 12:24:18 +00:00
Simon Huber
3843c61132 Add ability to cycle Advanced-search tabs by keyboard ... (#4909)
* Update AdvancedSearch.tid

* Update System.tid

* Update Standard.tid

* Update Filter.tid

* Update Shadows.tid

* Update search.tid

* Update shortcuts.multids

* Update ShortcutInfo.multids

* Update Misc.multids

* Update ShortcutInfo.multids

* Update search.tid
2020-10-27 09:03:34 +00:00
jeremy@jermolene.com
f6938d6abb Fix external-attachments plugin relative path bug
Fixes #4549
2020-10-26 18:36:46 +00:00
Rob Hoelz
aa7a00d080 Add eslint plus very tolerant starting config (#4872)
* Add eslint plus very tolerant starting config

Addresses GH #1865

This adds eslint as a developer dependency, plus a generated eslint
config that doesn't take a very strong stance on much of anything.  The
goal here to get started using automated style checking, add eslint
checking to the testing flow, and gradually introduce stricter checks
over time.

* eslint: Fix ecmaVersion

See
https://github.com/Jermolene/TiddlyWiki5/pull/4421#issuecomment-587002325,
where @Jermolene declared TiddlyWiki targets EcmaScript 5
2020-10-26 17:52:25 +00:00
jeremy@jermolene.com
4c6de22711 Recognise the image/jpg content type, even though it's not really legal
Browsers also respect it.

Fixes #4571
2020-10-26 17:47:19 +00:00
saqimtiaz
83f976ea54 Extended tiddlywiki.files to allow optionally saving changes to a tiddler back to the original file location (#4914) 2020-10-26 17:36:50 +00:00
jeremy@jermolene.com
3153c588ec Disable autosave in the upgrade wizard
To address @pmario's suggestion here: https://github.com/Jermolene/TiddlyWiki5/issues/4879#issuecomment-704320381
2020-10-26 17:28:57 +00:00
Robin Munn
0ce1843070 Simplify ci-push.sh: end script on any error (#4886)
Use the bash -e option to exit on any error, so || exit 1 is not needed.

As a bonus, this lets us get the actual return code from any failures.
2020-10-26 16:58:21 +00:00
Mario Pietsch
15338e60e8 Get "New Release Banner" from TW5-com edition (#4912)
* Fix state tiddlers for action-create-tiddlers examples

* Get "New Release Banner" from TW5-com edition
2020-10-25 22:03:35 +00:00
jeremy@jermolene.com
f7f55e8eff Add support for username/password parameters for tm-login message 2020-10-25 16:33:44 +00:00
jeremy@jermolene.com
5cc1600072 Introduce post-render startup actions 2020-10-25 16:22:21 +00:00
saqimtiaz
1a91f81976 Update filters for single file to match changes to syncFilter (#4907)
* Update saverFilter to match new changes in syncFilter

* Update save-all.tid

* Update save-all-external-js.tid

* Update save-offline.tid
2020-10-25 15:57:35 +00:00
saqimtiaz
b9234fe238 Update syncFilter to allow excluding multiple storyLists (#4906) 2020-10-25 15:56:41 +00:00
Bram Chen
4cdbe6540b Update chinese translations (#4890)
* Add chinese translations for "Error/FormatFilterOperator"

* Update Misc.multids
2020-10-24 08:22:39 +01:00
Mario Pietsch
4877891980 Fix tiddler title alignment if no icon is acitve (#4859)
* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* add a new-line before the log text to increase readability of the test output

* make eslint, jslint happy

* it shouldn't be there

* fremove this file from my PRs

* don't show the span if no icons are active.

* title lineheight 1.3 needed for eg: gggggg
2020-10-23 19:39:03 +01:00
Simon Huber
a1b486436e update TabsMacro.tid with "actions" and "explicitState" attribute (#4902) 2020-10-23 19:33:46 +01:00
Simon Huber
c3a8cc7eb4 fix error in sidebarsegments / search (#4903) 2020-10-23 19:32:40 +01:00
jeremy@jermolene.com
707e9d8926 Exclude $:/StoryList from syncing
Fixes #4868
2020-10-23 16:27:17 +01:00
saqimtiaz
adf0c1a12a Documentation for format filter operator (#4895)
* Documentation for format operator

* Examples for format operator
2020-10-23 16:25:05 +01:00
saqimtiaz
fd4cfaeb02 Typo in username (#4896) 2020-10-23 16:24:33 +01:00
Simon Huber
ae8ee5b955 Update modifier Variable.tid (#4894)
* Update modifier Variable.tid

This updates the "modifier Variable" tiddler

* Update modifier Variable.tid
2020-10-23 16:23:54 +01:00
Mario Pietsch
7686be7b14 Fix state tiddlers for action-create-tiddlers examples (#4897) 2020-10-23 16:23:17 +01:00
Simon Huber
84479bc403 Fix #4826 - Keyboard-driven-inputs clashes with customized search results. (#4875)
* Update search.tid

* Update DefaultSearchResultList.tid

* Update tabs.tid

* Update SearchResults.tid

* Update tabs.tid

* Update SearchResults.tid

* Update search.tid

* Update keyboard-driven-input.tid

* Update shortcuts.multids

* Update ShortcutInfo.multids

* Update Misc.multids

* Update keyboard-driven-input.tid

* Update search.tid

* Update Misc.multids
2020-10-23 15:58:34 +01:00
jeremy@jermolene.com
794dfb96f2 Don't try to process lazily loaded plugins
Fixes #4900
2020-10-23 15:37:20 +01:00
jeremy@jermolene.com
d254612826 Update and rearrange release note 2020-10-19 09:51:11 +01:00
jeremy@jermolene.com
c8721b38fd JSZip plugin: Fix example formatting 2020-10-19 09:44:55 +01:00
jeremy@jermolene.com
f863acf8ac Update BibTeX parser to use later fork of library
https://github.com/ORCID/bibtexParseJs
2020-10-18 17:05:43 +01:00
jeremy@jermolene.com
7e7ecbe7a5 Google Actions requires spaces instead of tabs 2020-10-18 16:51:36 +01:00
jeremy@jermolene.com
4ecd885a0c Update GitHub Actions to avoid deprecated "set-env" command
Fixes #4885
2020-10-18 16:13:38 +01:00
ento
dbda09b9fc Make test harness exit with a non-zero code when there's test failure (#4889)
* Rename variables to better convey what they're about

* Refactor comments so that they make more sense

* In Node.js, call the wrapper's execute function

The function sets up callbacks necessary for
exiting the process with the appropriate exit code.
https://github.com/jasmine/jasmine-npm/blob/v3.4.0/lib/jasmine.js#L235

* No need to configure the default reporter manually

The .execute() function does it

* Add note on which path comes from which npm package

* Note that other properties of the process object are referenced too
2020-10-18 15:19:52 +01:00
jeremy@jermolene.com
41931082e6 Update release note 2020-10-18 14:42:25 +01:00
jeremy@jermolene.com
5af76c5ea1 Extend TOC macros to allow custom link targets 2020-10-17 13:44:15 +01:00
jeremy@jermolene.com
1446a1e44c Extend tm-scroll to accept CSS selector to identify the target 2020-10-14 15:59:27 +01:00
jeremy@jermolene.com
69c12618d9 Syncer: Allow syncadaptor to customise the login prompt 2020-10-14 12:41:51 +01:00
jeremy@jermolene.com
651fb777ab PasswordPrompt: Return the object so it can be modified 2020-10-14 12:41:33 +01:00
jeremy@jermolene.com
34a51d2e23 Typo in comment
Thanks @saqimtiaz
2020-10-08 17:21:31 +01:00
jeremy@jermolene.com
2fc62c1a52 Merge branch 'tiddlywiki-com' 2020-10-08 16:49:00 +01:00
jeremy@jermolene.com
5ebd98779a Update Quine 2 URL 2020-10-08 16:46:57 +01:00
Gerald
405c618b6b Signing the CLA (#4867) 2020-09-25 13:07:08 +01:00
Florian Kohrt
773dcce713 Signing the CLA (#4845) 2020-09-24 19:08:23 +01:00
jeremy@jermolene.com
87dc67d0cd Update CI scripts 2020-09-08 12:59:37 +01:00
jeremy@jermolene.com
68b455565b Update workflow file 2020-09-08 12:55:07 +01:00
Devin Weaver
c60402b06d Add Reveal.js plugin entry to Resources (#4842) 2020-09-08 11:34:35 +01:00
Habash
c187f4b238 Signing the CLA (#4833) 2020-08-28 17:30:00 +01:00
jeremy@jermolene.com
4eda601a32 Update "Hidden Setting: Disable Drag and Drop" with version tag
Fixes #4573
2020-08-28 15:46:29 +01:00
jeremy@jermolene.com
8bfd8f3a26 Update $:/tags/TextEditor/Snippet docs
Fixes #4603
2020-08-28 15:41:33 +01:00
gernert
ba9de17b87 Update SystemTag_ $__tags_Macro_View.tid (#4604) 2020-08-28 15:38:47 +01:00
883 changed files with 188718 additions and 6389 deletions

15
.eslintignore Normal file
View File

@@ -0,0 +1,15 @@
# Known minified files
/boot/sjcl.js
/core/modules/utils/base64-utf8/base64-utf8.module.min.js
/core/modules/utils/diff-match-patch/diff_match_patch.js
/plugins/tiddlywiki/async/files/async.min.v1.5.0.js
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/anyword-hint.js
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/css-hint.js
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/html-hint.js
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/javascript-hint.js
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.js
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/xml-hint.js
/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/closebrackets.js
/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/matchbrackets.js
/plugins/tiddlywiki/codemirror-closetag/files/addon/edit/closetag.js
/plugins/tiddlywiki/codemirror-closetag/files/addon/fold/xml-fold.js

267
.eslintrc.yml Normal file
View File

@@ -0,0 +1,267 @@
env:
browser: true
commonjs: true
es2021: true
node: true
extends: 'eslint:recommended'
globals:
"$tw": "writable" # temporary
parserOptions:
ecmaVersion: 5
rules:
array-bracket-newline: 'off'
array-bracket-spacing: 'off'
array-callback-return: 'off'
array-element-newline: 'off'
arrow-body-style: error
arrow-parens:
- error
- as-needed
arrow-spacing:
- error
- after: true
before: true
block-scoped-var: 'off'
block-spacing: 'off'
brace-style: 'off'
callback-return: 'off'
camelcase: 'off'
capitalized-comments: 'off'
class-methods-use-this: error
comma-dangle: 'off'
comma-spacing: 'off'
comma-style: 'off'
complexity: 'off'
computed-property-spacing: 'off'
consistent-return: 'off'
consistent-this: 'off'
curly: 'off'
default-case: 'off'
default-case-last: error
default-param-last: error
dot-location: 'off'
dot-notation: 'off'
eol-last: 'off'
eqeqeq: 'off'
func-call-spacing: 'off'
func-name-matching: 'off'
func-names: 'off'
func-style: 'off'
function-call-argument-newline: 'off'
function-paren-newline: 'off'
generator-star-spacing: error
global-require: 'off'
grouped-accessor-pairs: error
guard-for-in: 'off'
handle-callback-err: 'off'
id-blacklist: error
id-denylist: error
id-length: 'off'
id-match: error
implicit-arrow-linebreak: error
indent: 'off'
indent-legacy: 'off'
init-declarations: 'off'
jsx-quotes: error
key-spacing: 'off'
keyword-spacing: 'off'
line-comment-position: 'off'
linebreak-style: 'off'
lines-around-comment: 'off'
lines-around-directive: 'off'
lines-between-class-members: error
max-classes-per-file: error
max-depth: 'off'
max-len: 'off'
max-lines: 'off'
max-lines-per-function: 'off'
max-nested-callbacks: error
max-params: 'off'
max-statements: 'off'
max-statements-per-line: 'off'
multiline-comment-style: 'off'
multiline-ternary: 'off'
new-parens: 'off'
newline-after-var: 'off'
newline-before-return: 'off'
newline-per-chained-call: 'off'
no-alert: 'off'
no-array-constructor: 'off'
no-await-in-loop: error
no-bitwise: 'off'
no-buffer-constructor: 'off'
no-caller: error
no-catch-shadow: 'off'
no-confusing-arrow: error
no-console: 'off'
no-constant-condition:
- error
- checkLoops: false
no-constructor-return: error
no-continue: 'off'
no-div-regex: 'off'
no-duplicate-imports: error
no-else-return: 'off'
no-empty-function: 'off'
no-eq-null: 'off'
no-eval: 'off'
no-extend-native: 'off'
no-extra-bind: 'off'
no-extra-label: 'off'
no-extra-parens: 'off'
no-floating-decimal: 'off'
no-implicit-coercion:
- error
- boolean: false
number: false
string: false
no-implicit-globals: 'off'
no-implied-eval: error
no-inline-comments: 'off'
no-invalid-this: 'off'
no-iterator: error
no-label-var: 'off'
no-labels: 'off'
no-lone-blocks: 'off'
no-lonely-if: 'off'
no-loop-func: 'off'
no-loss-of-precision: error
no-magic-numbers: 'off'
no-mixed-operators: 'off'
no-mixed-requires: 'off'
no-multi-assign: 'off'
no-multi-spaces: 'off'
no-multi-str: error
no-multiple-empty-lines: 'off'
no-native-reassign: 'off'
no-negated-condition: 'off'
no-negated-in-lhs: error
no-nested-ternary: 'off'
no-new: 'off'
no-new-func: 'off'
no-new-object: 'off'
no-new-require: error
no-new-wrappers: error
no-octal-escape: error
no-param-reassign: 'off'
no-path-concat: error
no-plusplus: 'off'
no-process-env: 'off'
no-process-exit: 'off'
no-promise-executor-return: error
no-proto: 'off'
no-restricted-exports: error
no-restricted-globals: error
no-restricted-imports: error
no-restricted-modules: error
no-restricted-properties: error
no-restricted-syntax: error
no-return-assign: 'off'
no-return-await: error
no-script-url: 'off'
no-self-compare: 'off'
no-sequences: 'off'
no-shadow: 'off'
no-spaced-func: 'off'
no-sync: 'off'
no-tabs: 'off'
no-template-curly-in-string: error
no-ternary: 'off'
no-throw-literal: 'off'
no-trailing-spaces: 'off'
no-undef-init: 'off'
no-undefined: 'off'
no-underscore-dangle: 'off'
no-unmodified-loop-condition: 'off'
no-unneeded-ternary: 'off'
no-unreachable-loop: error
no-unused-expressions: 'off'
no-use-before-define: 'off'
no-useless-backreference: error
no-useless-call: 'off'
no-useless-computed-key: error
no-useless-concat: 'off'
no-useless-constructor: error
no-useless-rename: error
no-useless-return: 'off'
no-var: 'off'
no-void: 'off'
no-warning-comments: 'off'
no-whitespace-before-property: error
nonblock-statement-body-position:
- error
- any
object-curly-newline: 'off'
object-curly-spacing: 'off'
object-property-newline: 'off'
object-shorthand: 'off'
one-var: 'off'
one-var-declaration-per-line: 'off'
operator-assignment: 'off'
operator-linebreak: 'off'
padded-blocks: 'off'
padding-line-between-statements: error
prefer-arrow-callback: 'off'
prefer-const: 'off'
prefer-destructuring: 'off'
prefer-exponentiation-operator: 'off'
prefer-named-capture-group: 'off'
prefer-numeric-literals: error
prefer-object-spread: 'off'
prefer-promise-reject-errors: error
prefer-reflect: 'off'
prefer-regex-literals: 'off'
prefer-rest-params: 'off'
prefer-spread: 'off'
prefer-template: 'off'
quote-props: 'off'
quotes: 'off'
radix: 'off'
require-atomic-updates: error
require-await: error
require-jsdoc: 'off'
require-unicode-regexp: 'off'
rest-spread-spacing: error
semi: 'off'
semi-spacing: 'off'
semi-style: 'off'
sort-imports: error
sort-keys: 'off'
sort-vars: 'off'
space-before-blocks: 'off'
space-before-function-paren: 'off'
space-in-parens: 'off'
space-infix-ops: 'off'
space-unary-ops: 'off'
spaced-comment: 'off'
strict: 'off'
switch-colon-spacing: 'off'
symbol-description: error
template-curly-spacing: error
template-tag-spacing: error
unicode-bom:
- error
- never
valid-jsdoc: 'off'
valid-typeof:
- error
- requireStringLiterals: false
vars-on-top: 'off'
wrap-iife: 'off'
wrap-regex: 'off'
yield-star-spacing: error
yoda: 'off'
# temporary rules
no-useless-escape: 'off'
no-unused-vars: 'off'
no-empty: 'off'
no-extra-semi: 'off'
no-redeclare: 'off'
no-control-regex: "off"
no-mixed-spaces-and-tabs: "off"
no-extra-boolean-cast: "off"
no-prototype-builtins: "off"
no-undef: "off"
no-unreachable: "off"
no-self-assign: "off"

View File

@@ -23,6 +23,11 @@ A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**TiddlyWiki Configuration (please complete the following information):**
- Version [e.g. v5.1.24]
- Saving mechanism [e.g. Node.js, TiddlyDesktop, TiddlyHost etc]
- Plugins installed [e.g. Freelinks, TiddlyMap]
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]

View File

@@ -39,9 +39,9 @@ jobs:
- name: "Set dynamic environment variables"
run: |
TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')
echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH}
echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number)
echo ::set-env name=TW5_BUILD_DETAILS::Prerelease built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')
echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV
echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV
echo "TW5_BUILD_DETAILS=Prerelease built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV
- run: "./bin/build-site.sh"
- run: "./bin/ci-push.sh"
env:
@@ -65,9 +65,9 @@ jobs:
- name: "Set dynamic environment variables"
run: |
TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')
echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH}
echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number)
echo ::set-env name=TW5_BUILD_DETAILS::Built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')
echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV
echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV
echo "TW5_BUILD_DETAILS=Built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV
- run: "./bin/build-site.sh"
- run: "./bin/ci-push.sh"
env:

View File

@@ -5,7 +5,7 @@
# Default to the current version number for building the plugin library
if [ -z "$TW5_BUILD_VERSION" ]; then
TW5_BUILD_VERSION=v5.1.23
TW5_BUILD_VERSION=v5.1.24
fi
echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]"
@@ -107,7 +107,7 @@ node $TW5_BUILD_TIDDLYWIKI \
# /empty.html Empty
# /empty.hta For Internet Explorer
node $TW5_BUILD_TIDDLYWIKI \
./editions/empty \
$TW5_BUILD_MAIN_EDITION \
--verbose \
--output $TW5_BUILD_OUTPUT \
--build empty \

View File

@@ -2,19 +2,14 @@
# Push output back to GitHub
# Exit script immediately if any command fails
set -e
cd output || exit 1
git config --global user.email "actions@github.com" || exit 1
git config --global user.name "GitHub Actions" || exit 1
git add -A . || exit 1
git commit --message "GitHub build: $GITHUB_RUN_NUMBER of $TW5_BUILD_BRANCH ($(date +'%F %T %Z'))" || exit 1
git remote add deploy "https://$GH_TOKEN@github.com/Jermolene/jermolene.github.io.git" &>/dev/null || exit 1
git push deploy master &>/dev/null || exit 1
cd .. || exit 1
cd output
git config --global user.email "actions@github.com"
git config --global user.name "GitHub Actions"
git add -A .
git commit --message "GitHub build: $GITHUB_RUN_NUMBER of $TW5_BUILD_BRANCH ($(date +'%F %T %Z'))"
git remote add deploy "https://$GH_TOKEN@github.com/Jermolene/jermolene.github.io.git" &>/dev/null
git push deploy master &>/dev/null
cd ..

View File

@@ -5,52 +5,52 @@ Optimise the SVGs in ./core/images using SVGO from https://github.com/svg/svgo
Install SVGO with the following command in the root of the repo:
npm install svgo
npm install svgo@2.3.0
*/
"use strict";
var fs = require("fs"),
path = require("path"),
SVGO = require("svgo"),
svgo = new SVGO({
{ optimize } = require("svgo"),
config = {
plugins: [
{cleanupAttrs: true},
{removeDoctype: true},
{removeXMLProcInst: true},
{removeComments: true},
{removeMetadata: true},
{removeTitle: true},
{removeDesc: true},
{removeUselessDefs: true},
{removeEditorsNSData: true},
{removeEmptyAttrs: true},
{removeHiddenElems: true},
{removeEmptyText: true},
{removeEmptyContainers: true},
{removeViewBox: false},
{cleanupEnableBackground: true},
{convertStyleToAttrs: true},
{convertColors: true},
{convertPathData: true},
{convertTransform: true},
{removeUnknownsAndDefaults: true},
{removeNonInheritableGroupAttrs: true},
{removeUselessStrokeAndFill: true},
{removeUnusedNS: true},
{cleanupIDs: true},
{cleanupNumericValues: true},
{moveElemsAttrsToGroup: true},
{moveGroupAttrsToElems: true},
{collapseGroups: true},
{removeRasterImages: false},
{mergePaths: true},
{convertShapeToPath: true},
{sortAttrs: true},
{removeDimensions: false},
{removeAttrs: {attrs: "(stroke|fill)"}}
'cleanupAttrs',
'removeDoctype',
'removeXMLProcInst',
'removeComments',
'removeMetadata',
'removeTitle',
'removeDesc',
'removeUselessDefs',
'removeEditorsNSData',
'removeEmptyAttrs',
'removeHiddenElems',
'removeEmptyText',
'removeEmptyContainers',
// 'removeViewBox',
'cleanupEnableBackground',
'convertStyleToAttrs',
'convertColors',
'convertPathData',
'convertTransform',
'removeUnknownsAndDefaults',
'removeNonInheritableGroupAttrs',
'removeUselessStrokeAndFill',
'removeUnusedNS',
'cleanupIDs',
'cleanupNumericValues',
'moveElemsAttrsToGroup',
'moveGroupAttrsToElems',
'collapseGroups',
// 'removeRasterImages',
'mergePaths',
'convertShapeToPath',
'sortAttrs',
//'removeDimensions',
{name: 'removeAttrs', params: { attrs: '(stroke|fill)' } }
]
});
};
var basepath = "./core/images/",
files = fs.readdirSync(basepath).sort();
@@ -66,12 +66,14 @@ files.forEach(function(filename) {
fakeSVG = body.join("\n");
// A hack to make the new-journal-button work
fakeSVG = fakeSVG.replace("<<now \"DD\">>","&lt;&lt;now &quot;DD&quot;&gt;&gt;");
svgo.optimize(fakeSVG, {path: filepath}).then(function(result) {
config.path = filepath;
var result = optimize(fakeSVG,config);
if(result) {
var newSVG = header.join("\n") + "\n\n" + result.data.replace("&lt;&lt;now &quot;DD&quot;&gt;&gt;","<<now \"DD\">>");
fs.writeFileSync(filepath,newSVG);
},function(err) {
} else {
console.log("Error " + err + " with " + filename)
process.exit();
});
};
}
});

View File

@@ -267,8 +267,16 @@ $tw.utils.htmlDecode = function(s) {
Get the browser location.hash. We don't use location.hash because of the way that Firefox auto-urldecodes it (see http://stackoverflow.com/questions/1703552/encoding-of-window-location-hash)
*/
$tw.utils.getLocationHash = function() {
var parts = window.location.href.split('#');
return "#" + (parts.length > 1 ? parts[1] : "");
var href = window.location.href;
var idx = href.indexOf('#');
if(idx === -1) {
return "#";
} else if(idx < href.length-1 && href[idx+1] === '#') {
// Special case: ignore location hash if it itself starts with a #
return "#";
} else {
return href.substring(idx);
}
};
/*
@@ -297,13 +305,21 @@ $tw.utils.stringifyDate = function(value) {
// Parse a date from a UTC YYYYMMDDHHMMSSmmm format string
$tw.utils.parseDate = function(value) {
if(typeof value === "string") {
return new Date(Date.UTC(parseInt(value.substr(0,4),10),
var negative = 1;
if(value.charAt(0) === "-") {
negative = -1;
value = value.substr(1);
}
var year = parseInt(value.substr(0,4),10) * negative,
d = new Date(Date.UTC(year,
parseInt(value.substr(4,2),10)-1,
parseInt(value.substr(6,2),10),
parseInt(value.substr(8,2)||"00",10),
parseInt(value.substr(10,2)||"00",10),
parseInt(value.substr(12,2)||"00",10),
parseInt(value.substr(14,3)||"000",10)));
d.setUTCFullYear(year); // See https://stackoverflow.com/a/5870822
return d;
} else if($tw.utils.isDate(value)) {
return value;
} else {
@@ -652,11 +668,13 @@ $tw.utils.PasswordPrompt.prototype.createPrompt = function(options) {
var promptInfo = {
serviceName: options.serviceName,
callback: options.callback,
form: form
form: form,
owner: this
};
this.passwordPrompts.push(promptInfo);
// Make sure the wrapper is displayed
this.setWrapperDisplay();
return promptInfo;
};
$tw.utils.PasswordPrompt.prototype.removePrompt = function(promptInfo) {
@@ -874,6 +892,19 @@ $tw.modules.applyMethods = function(moduleType,targetObject) {
return targetObject;
};
/*
Return a class created from a modules. The module should export the properties to be added to those of the optional base class
*/
$tw.modules.createClassFromModule = function(moduleExports,baseClass) {
var newClass = function() {};
if(baseClass) {
newClass.prototype = new baseClass();
newClass.prototype.constructor = baseClass;
}
$tw.utils.extend(newClass.prototype,moduleExports);
return newClass;
};
/*
Return an array of classes created from the modules of a specified type. Each module should export the properties to be added to those of the optional base class
*/
@@ -881,13 +912,7 @@ $tw.modules.createClassesFromModules = function(moduleType,subType,baseClass) {
var classes = Object.create(null);
$tw.modules.forEachModuleOfType(moduleType,function(title,moduleExports) {
if(!subType || moduleExports.types[subType]) {
var newClass = function() {};
if(baseClass) {
newClass.prototype = new baseClass();
newClass.prototype.constructor = baseClass;
}
$tw.utils.extend(newClass.prototype,moduleExports);
classes[moduleExports.name] = newClass;
classes[moduleExports.name] = $tw.modules.createClassFromModule(moduleExports,baseClass);
}
});
return classes;
@@ -1129,7 +1154,7 @@ $tw.Wiki = function(options) {
var index = tiddlerTitles.indexOf(title);
if(index !== -1) {
tiddlerTitles.splice(index,1);
}
}
}
// Record the new tiddler state
updateDescriptor["new"] = {
@@ -1270,13 +1295,13 @@ $tw.Wiki = function(options) {
$tw.utils.each(titles || getTiddlerTitles(),function(title) {
var tiddler = tiddlers[title];
if(tiddler) {
if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type")) {
if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type") && tiddler.fields.text) {
pluginInfo[tiddler.fields.title] = JSON.parse(tiddler.fields.text);
results.modifiedPlugins.push(tiddler.fields.title);
}
} else {
if(pluginInfo[title]) {
delete pluginInfo[title];
delete pluginInfo[title];
results.deletedPlugins.push(title);
}
}
@@ -1822,7 +1847,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
// Read the specification
var filesInfo = JSON.parse(fs.readFileSync(filepath + path.sep + "tiddlywiki.files","utf8"));
// Helper to process a file
var processFile = function(filename,isTiddlerFile,fields) {
var processFile = function(filename,isTiddlerFile,fields,isEditableFile) {
var extInfo = $tw.config.fileExtensionInfo[path.extname(filename)],
type = (extInfo || {}).type || fields.type || "text/plain",
typeInfo = $tw.config.contentTypeInfo[type] || {},
@@ -1875,7 +1900,11 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
}
});
});
tiddlers.push({tiddlers: fileTiddlers});
if(isEditableFile) {
tiddlers.push({filepath: pathname, hasMetaFile: !!metadata && !isTiddlerFile, isEditableFile: true, tiddlers: fileTiddlers});
} else {
tiddlers.push({tiddlers: fileTiddlers});
}
};
// Process the listed tiddlers
$tw.utils.each(filesInfo.tiddlers,function(tidInfo) {
@@ -1898,15 +1927,21 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
}
} else {
// Process directory specifier
var dirPath = path.resolve(filepath,dirSpec.path),
files = fs.readdirSync(dirPath),
fileRegExp = new RegExp(dirSpec.filesRegExp || "^.*$"),
metaRegExp = /^.*\.meta$/;
for(var t=0; t<files.length; t++) {
var filename = files[t];
if(filename !== "tiddlywiki.files" && !metaRegExp.test(filename) && fileRegExp.test(filename)) {
processFile(dirPath + path.sep + filename,dirSpec.isTiddlerFile,dirSpec.fields);
var dirPath = path.resolve(filepath,dirSpec.path);
if(fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
var files = fs.readdirSync(dirPath),
fileRegExp = new RegExp(dirSpec.filesRegExp || "^.*$"),
metaRegExp = /^.*\.meta$/;
for(var t=0; t<files.length; t++) {
var filename = files[t];
if(filename !== "tiddlywiki.files" && !metaRegExp.test(filename) && fileRegExp.test(filename)) {
processFile(dirPath + path.sep + filename,dirSpec.isTiddlerFile,dirSpec.fields,dirSpec.isEditableFile);
}
}
} else {
console.log("Warning: a directory in a tiddlywiki.files file does not exist.");
console.log("dirPath: " + dirPath);
console.log("tiddlywiki.files location: " + filepath);
}
}
});
@@ -2046,6 +2081,11 @@ $tw.loadWikiTiddlers = function(wikiPath,options) {
} else {
return null;
}
// Save the path to the tiddlers folder for the filesystemadaptor
var config = wikiInfo.config || {};
if($tw.boot.wikiPath == wikiPath) {
$tw.boot.wikiTiddlersPath = path.resolve($tw.boot.wikiPath,config["default-tiddler-location"] || $tw.config.wikiTiddlersSubDir);
}
// Load any parent wikis
if(wikiInfo.includeWikis) {
parentPaths = parentPaths.slice(0);
@@ -2079,27 +2119,31 @@ $tw.loadWikiTiddlers = function(wikiPath,options) {
$tw.boot.files[tiddler.title] = {
filepath: tiddlerFile.filepath,
type: tiddlerFile.type,
hasMetaFile: tiddlerFile.hasMetaFile
hasMetaFile: tiddlerFile.hasMetaFile,
isEditableFile: config["retain-original-tiddler-path"] || tiddlerFile.isEditableFile || tiddlerFile.filepath.indexOf($tw.boot.wikiTiddlersPath) !== 0
};
});
}
$tw.wiki.addTiddlers(tiddlerFile.tiddlers);
});
// Save the original tiddler file locations if requested
var config = wikiInfo.config || {};
if(config["retain-original-tiddler-path"]) {
var output = {}, relativePath;
if ($tw.boot.wikiPath == wikiPath) {
// Save the original tiddler file locations if requested
var output = {}, relativePath, fileInfo;
for(var title in $tw.boot.files) {
relativePath = path.relative(resolvedWikiPath,$tw.boot.files[title].filepath);
output[title] =
path.sep === "/" ?
relativePath :
relativePath.split(path.sep).join("/");
fileInfo = $tw.boot.files[title];
if(fileInfo.isEditableFile) {
relativePath = path.relative($tw.boot.wikiTiddlersPath,fileInfo.filepath);
fileInfo.originalpath = relativePath;
output[title] =
path.sep === "/" ?
relativePath :
relativePath.split(path.sep).join("/");
}
}
if(Object.keys(output).length > 0){
$tw.wiki.addTiddler({title: "$:/config/OriginalTiddlerPaths", type: "application/json", text: JSON.stringify(output)});
}
$tw.wiki.addTiddler({title: "$:/config/OriginalTiddlerPaths", type: "application/json", text: JSON.stringify(output)});
}
// Save the path to the tiddlers folder for the filesystemadaptor
$tw.boot.wikiTiddlersPath = path.resolve($tw.boot.wikiPath,config["default-tiddler-location"] || $tw.config.wikiTiddlersSubDir);
// Load any plugins within the wiki folder
var wikiPluginsPath = path.resolve(wikiPath,$tw.config.wikiPluginsSubDir);
if(fs.existsSync(wikiPluginsPath)) {
@@ -2146,7 +2190,7 @@ $tw.loadTiddlersNode = function() {
// Load any extra plugins
$tw.utils.each($tw.boot.extraPlugins,function(name) {
if(name.charAt(0) === "+") { // Relative path to plugin
var pluginFields = $tw.loadPluginFolder(name.substring(1));;
var pluginFields = $tw.loadPluginFolder(name.substring(1));
if(pluginFields) {
$tw.wiki.addTiddler(pluginFields);
}
@@ -2155,7 +2199,7 @@ $tw.loadTiddlersNode = function() {
type = parts[0];
if(parts.length === 3 && ["plugins","themes","languages"].indexOf(type) !== -1) {
$tw.loadPlugins([parts[1] + "/" + parts[2]],$tw.config[type + "Path"],$tw.config[type + "EnvVar"]);
}
}
}
});
// Load the tiddlers from the wiki directory
@@ -2258,12 +2302,14 @@ $tw.boot.initStartup = function(options) {
$tw.utils.registerFileType("application/zip","base64",".zip");
$tw.utils.registerFileType("application/x-zip-compressed","base64",".zip");
$tw.utils.registerFileType("image/jpeg","base64",[".jpg",".jpeg"],{flags:["image"]});
$tw.utils.registerFileType("image/jpg","base64",[".jpg",".jpeg"],{flags:["image"]});
$tw.utils.registerFileType("image/png","base64",".png",{flags:["image"]});
$tw.utils.registerFileType("image/gif","base64",".gif",{flags:["image"]});
$tw.utils.registerFileType("image/webp","base64",".webp",{flags:["image"]});
$tw.utils.registerFileType("image/heic","base64",".heic",{flags:["image"]});
$tw.utils.registerFileType("image/heif","base64",".heif",{flags:["image"]});
$tw.utils.registerFileType("image/svg+xml","utf8",".svg",{flags:["image"]});
$tw.utils.registerFileType("image/vnd.microsoft.icon","base64",".ico",{flags:["image"]});
$tw.utils.registerFileType("image/x-icon","base64",".ico",{flags:["image"]});
$tw.utils.registerFileType("application/font-woff","base64",".woff");
$tw.utils.registerFileType("application/x-font-ttf","base64",".woff");
@@ -2421,16 +2467,29 @@ $tw.boot.executeNextStartupTask = function(callback) {
};
/*
Returns true if we are running on one platforms specified in a task modules `platforms` array
Returns true if we are running on one of the platforms specified in taskModule's
`platforms` array; or if `platforms` property is not defined.
*/
$tw.boot.doesTaskMatchPlatform = function(taskModule) {
var platforms = taskModule.platforms;
if(platforms) {
for(var t=0; t<platforms.length; t++) {
if((platforms[t] === "browser" && !$tw.browser) || (platforms[t] === "node" && !$tw.node)) {
return false;
switch (platforms[t]) {
case "browser":
if ($tw.browser) {
return true;
}
break;
case "node":
if ($tw.node) {
return true;
}
break;
default:
$tw.utils.error("Module " + taskModule.name + ": '" + platforms[t] + "' in export.platforms invalid");
}
}
return false;
}
return true;
};

File diff suppressed because one or more lines are too long

View File

@@ -4,7 +4,7 @@ type: text/plain
TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)
Copyright (c) 2004-2007, Jeremy Ruston
Copyright (c) 2007-2020, UnaMesa Association
Copyright (c) 2007-2021, UnaMesa Association
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -0,0 +1,4 @@
title: $:/core/images/minus-button
tags: $:/tags/Image
<svg width="22pt" height="22pt" class="tc-image-minus-button tc-image-button" viewBox="0 0 128 128"><path d="M64 0c35.346 0 64 28.654 64 64 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64C0 28.654 28.654 0 64 0zm.332 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z"/><rect width="80" height="16" x="24" y="56" rx="8"/></svg>

View File

@@ -1,4 +1,4 @@
title: $:/core/images/plugin-generic-language
tags: $:/tags/Image
<svg width="22pt" height="22pt" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg>
<svg width="22pt" height="22pt" viewBox="0 0 128 128" class="tc-image-plugin-generic-language tc-image-button"><path fill-rule="evenodd" d="M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg>

View File

@@ -1,4 +1,4 @@
title: $:/core/images/plugin-generic-plugin
tags: $:/tags/Image
<svg width="22pt" height="22pt" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg>
<svg width="22pt" height="22pt" viewBox="0 0 128 128" class="tc-image-plugin-generic-plugin tc-image-button"><path fill-rule="evenodd" d="M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg>

View File

@@ -1,4 +1,4 @@
title: $:/core/images/plugin-generic-theme
tags: $:/tags/Image
<svg width="22pt" height="22pt" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z"/></svg>
<svg width="22pt" height="22pt" viewBox="0 0 128 128" class="tc-image-plugin-generic-theme tc-image-button"><path fill-rule="evenodd" d="M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z"/></svg>

View File

@@ -0,0 +1,4 @@
title: $:/core/images/plus-button
tags: $:/tags/Image
<svg width="22pt" height="22pt" class="tc-image-plus-button tc-image-button" viewBox="0 0 128 128"><path d="M64-.333c35.346 0 64 28.654 64 64 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64zM64 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z"/><rect width="80" height="16" x="24" y="56" rx="8"/><rect width="16" height="80" x="56" y="24" rx="8"/></svg>

View File

@@ -17,6 +17,8 @@ Basics/NewJournal/Tags/Prompt: Tags for new journal tiddlers
Basics/NewTiddler/Title/Prompt: Title of new tiddlers
Basics/NewTiddler/Tags/Prompt: Tags for new tiddlers
Basics/OverriddenShadowTiddlers/Prompt: Number of overridden shadow tiddlers
Basics/RemoveTags: Update to current format
Basics/RemoveTags/Hint: Update the tags configuration to the latest format
Basics/ShadowTiddlers/Prompt: Number of shadow tiddlers
Basics/Subtitle/Prompt: Subtitle
Basics/SystemTiddlers/Prompt: Number of system tiddlers
@@ -44,6 +46,7 @@ KeyboardShortcuts/Platform/Linux: Linux platform only
KeyboardShortcuts/Platform/NonLinux: Non-Linux platforms only
KeyboardShortcuts/Platform/Windows: Windows platform only
KeyboardShortcuts/Platform/NonWindows: Non-Windows platforms only
LayoutSwitcher/Caption: Layout
LoadedModules/Caption: Loaded Modules
LoadedModules/Hint: These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process.
Palette/Caption: Palette
@@ -120,11 +123,12 @@ Saving/TiddlySpot/BackupDir: Backup Directory
Saving/TiddlySpot/ControlPanel: ~TiddlySpot Control Panel
Saving/TiddlySpot/Backups: Backups
Saving/TiddlySpot/Caption: ~TiddlySpot Saver
Saving/TiddlySpot/Description: These settings are only used when saving to http://tiddlyspot.com or a compatible remote server
Saving/TiddlySpot/Description: These settings are only used when saving to [[TiddlySpot|http://tiddlyspot.com]], [[TiddlyHost|https://tiddlyhost.com]], or a compatible remote server. See [[here|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] for information on ~TiddlySpot and ~TiddlyHost saving configuration.
Saving/TiddlySpot/Filename: Upload Filename
Saving/TiddlySpot/Heading: ~TiddlySpot
Saving/TiddlySpot/Hint: //The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//
Saving/TiddlySpot/Password: Password
Saving/TiddlySpot/ReadOnly: Note that [[TiddlySpot|http://tiddlyspot.com]] no longer allows the creation of new sites. For new sites, you can use [[TiddlyHost|https://tiddlyhost.com]], a new hosting service that replaces ~TiddlySpot.
Saving/TiddlySpot/ServerURL: Server URL
Saving/TiddlySpot/UploadDir: Upload Directory
Saving/TiddlySpot/UserName: Wiki Name

View File

@@ -23,6 +23,7 @@ tiddlerfield: Defines the behaviour of an individual tiddler field.
tiddlermethod: Adds methods to the `$tw.Tiddler` prototype.
upgrader: Applies upgrade processing to tiddlers during an upgrade/import.
utils: Adds methods to `$tw.utils`.
utils-browser: Adds browser-specific methods to `$tw.utils`.
utils-node: Adds Node.js-specific methods to `$tw.utils`.
widget: Widgets encapsulate DOM rendering and refreshing.
wikimethod: Adds methods to `$tw.Wiki`.

View File

@@ -3,6 +3,8 @@ title: $:/language/EditTemplate/
Body/External/Hint: This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself
Body/Placeholder: Type the text for this tiddler
Body/Preview/Type/Output: output
Body/Preview/Type/DiffShadow: differences from shadow (if any)
Body/Preview/Type/DiffCurrent: differences from current
Field/Remove/Caption: remove field
Field/Remove/Hint: Remove field
Field/Dropdown/Caption: field list
@@ -19,6 +21,8 @@ Shadow/OverriddenWarning: This is a modified shadow tiddler. You can revert to t
Tags/Add/Button: add
Tags/Add/Button/Hint: add tag
Tags/Add/Placeholder: tag name
Tags/ClearInput/Caption: clear input
Tags/ClearInput/Hint: Clear tag input
Tags/Dropdown/Caption: tag list
Tags/Dropdown/Hint: Show tag list
Title/BadCharacterWarning: Warning: avoid using any of the characters <<bad-chars>> in tiddler titles

View File

@@ -19,9 +19,10 @@ All parameters are optional with safe defaults, and can be specified in any orde
* ''username'' - optional username for basic authentication
* ''password'' - optional password for basic authentication
* ''authenticated-user-header'' - optional name of header to be used for trusted authentication
* ''readers'' - comma separated list of principals allowed to read from this wiki
* ''writers'' - comma separated list of principals allowed to write to this wiki
* ''readers'' - comma-separated list of principals allowed to read from this wiki
* ''writers'' - comma-separated list of principals allowed to write to this wiki
* ''csrf-disable'' - set to "yes" to disable CSRF checks (defaults to "no")
* ''sse-enabled'' - set to "yes" to enable Server-sent events (defaults to "no")
* ''root-tiddler'' - the tiddler to serve at the root (defaults to "$:/core/save/all")
* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to "text/plain")
* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to "text/html")
@@ -29,6 +30,7 @@ All parameters are optional with safe defaults, and can be specified in any orde
* ''tls-key'' - pathname of TLS key file (relative to wiki folder)
* ''debug-level'' - optional debug level; set to "debug" to view request details (defaults to "none")
* ''gzip'' - set to "yes" to enable gzip compression for some http endpoints (defaults to "no")
* ''use-browser-cache'' - set to "yes" to allow the browser to cache responses to save bandwidth (defaults to "no")
For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.

View File

@@ -8,15 +8,15 @@ Optionally, the title of a template tiddler can be specified. In this case, inst
A name and value for an additional variable may optionally also be specified.
```
--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]
--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [ [<name>] [<value>] ]*
```
* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered
* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename
* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)
* ''template'': Optional template through which each tiddler is rendered
* ''name'': Name of optional variable
* ''value'': Value of optional variable
* ''name'': Name of optional variables
* ''value'': Value of optional variables
By default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.
@@ -24,8 +24,9 @@ Notes:
* The output directory is not cleared of any existing files
* Any missing directories in the path to the filename are automatically created.
* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render "[[Motovun Jack.jpg]]"`
* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets: `--render "[[Motovun Jack.jpg]]"`
* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`
* Multiple ''name''/''value'' pairs can be used to pass more than one variable
* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated
Examples:

View File

@@ -16,7 +16,7 @@ Notes:
* The output directory is not cleared of any existing files
* Any missing directories in the path to the filename are automatically created.
* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save "[[Motovun Jack.jpg]]"`
* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets: `--save "[[Motovun Jack.jpg]]"`
* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`
* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated

View File

@@ -1,5 +1,6 @@
title: $:/language/Import/
Editor/Import/Heading: Import images and insert them into the editor.
Imported/Hint: The following tiddlers were imported:
Listing/Cancel/Caption: Cancel
Listing/Hint: These tiddlers are ready to import:
@@ -13,11 +14,20 @@ Listing/Preview/TextRaw: Text (Raw)
Listing/Preview/Fields: Fields
Listing/Preview/Diff: Diff
Listing/Preview/DiffFields: Diff (Fields)
Upgrader/Plugins/Suppressed/Incompatible: Blocked incompatible or obsolete plugin
Upgrader/Plugins/Suppressed/Version: Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)
Upgrader/Plugins/Upgraded: Upgraded plugin from <<incoming>> to <<upgraded>>
Upgrader/State/Suppressed: Blocked temporary state tiddler
Upgrader/System/Suppressed: Blocked system tiddler
Upgrader/System/Warning: Core module tiddler
Upgrader/System/Alert: You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable
Upgrader/ThemeTweaks/Created: Migrated theme tweak from <$text text=<<from>>/>
Listing/Rename/Tooltip: Rename tiddler before importing
Listing/Rename/Prompt: Rename to:
Listing/Rename/ConfirmRename: Rename tiddler
Listing/Rename/CancelRename: Cancel
Listing/Rename/OverwriteWarning: A tiddler with this title already exists.
Upgrader/Plugins/Suppressed/Incompatible: Blocked incompatible or obsolete plugin.
Upgrader/Plugins/Suppressed/Version: Blocked plugin (due to incoming <<incoming>> not being newer than existing <<existing>>).
Upgrader/Plugins/Upgraded: Upgraded plugin from <<incoming>> to <<upgraded>>.
Upgrader/State/Suppressed: Blocked temporary state tiddler.
Upgrader/System/Disabled: Disabled system tiddler.
Upgrader/System/Suppressed: Blocked system tiddler.
Upgrader/System/Warning: Core module tiddler.
Upgrader/System/Alert: You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable.
Upgrader/ThemeTweaks/Created: Migrated theme tweak from <$text text=<<from>>/>.
Upgrader/Tiddler/Disabled: Disabled tiddler.
Upgrader/Tiddler/Selected: User selected.
Upgrader/Tiddler/Unselected: Unselected tiddler.

View File

@@ -10,6 +10,7 @@ ConfirmCancelTiddler: Do you wish to discard changes to the tiddler "<$text text
ConfirmDeleteTiddler: Do you wish to delete the tiddler "<$text text=<<title>>/>"?
ConfirmOverwriteTiddler: Do you wish to overwrite the tiddler "<$text text=<<title>>/>"?
ConfirmEditShadowTiddler: You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit "<$text text=<<title>>/>"?
ConfirmAction: Do you wish to proceed?
Count: count
DefaultNewTiddlerTitle: New Tiddler
Diffs/CountMessage: <<diff-count>> differences
@@ -23,13 +24,16 @@ Encryption/RepeatPassword: Repeat password
Encryption/PasswordNoMatch: Passwords do not match
Encryption/SetPassword: Set password
Error/Caption: Error
Error/EditConflict: File changed on server
Error/Filter: Filter error
Error/FilterSyntax: Syntax error in filter expression
Error/FilterRunPrefix: Filter Error: Unknown prefix for filter run
Error/IsFilterOperator: Filter Error: Unknown operand for the 'is' filter operator
Error/FormatFilterOperator: Filter Error: Unknown suffix for the 'format' filter operator
Error/LoadingPluginLibrary: Error loading plugin library
Error/NetworkErrorAlert: `<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`
Error/PutEditConflict: File changed on server
Error/PutForbidden: Permission denied
Error/PutUnauthorized: Authentication required
Error/RecursiveTransclusion: Recursive transclusion error in transclude widget
Error/RetrievingSkinny: Error retrieving skinny tiddler list
Error/SavingToTWEdit: Error saving to TWEdit
@@ -38,6 +42,7 @@ Error/XMLHttpRequest: XMLHttpRequest error code
InternalJavaScriptError/Title: Internal JavaScript Error
InternalJavaScriptError/Hint: Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser
InvalidFieldName: Illegal characters in field name "<$text text=<<fieldName>>/>". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)
LayoutSwitcher/Description: Open the layout switcher
LazyLoadingWarning: <p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>
LoginToTiddlySpace: Login to TiddlySpace
Manager/Controls/FilterByTag/None: (none)
@@ -61,13 +66,23 @@ MissingTiddler/Hint: Missing tiddler "<$text text=<<currentTiddler>>/>" -- click
No: No
OfficialPluginLibrary: Official ~TiddlyWiki Plugin Library
OfficialPluginLibrary/Hint: The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team.
PageTemplate/Description: the default ~TiddlyWiki layout
PageTemplate/Name: Default ~PageTemplate
PluginReloadWarning: Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect
RecentChanges/DateFormat: DDth MMM YYYY
Shortcuts/Input/AdvancedSearch/Hint: Open the ~AdvancedSearch panel from within the sidebar search field
Shortcuts/Input/Accept/Hint: Accept the selected item
Shortcuts/Input/AcceptVariant/Hint: Accept the selected item (variant)
Shortcuts/Input/Cancel/Hint: Clear the input field
Shortcuts/Input/Down/Hint: Select the next item
Shortcuts/Input/Tab-Left/Hint: Select the previous Tab
Shortcuts/Input/Tab-Right/Hint: Select the next Tab
Shortcuts/Input/Up/Hint: Select the previous item
Shortcuts/SidebarLayout/Hint: Change the sidebar layout
Switcher/Subtitle/theme: Switch Theme
Switcher/Subtitle/layout: Switch Layout
Switcher/Subtitle/language: Switch Language
Switcher/Subtitle/palette: Switch Palette
SystemTiddler/Tooltip: This is a system tiddler
SystemTiddlers/Include/Prompt: Include system tiddlers
TagManager/Colour/Heading: Colour

View File

@@ -14,7 +14,7 @@ List/Caption: List
List/Empty: This tiddler does not have a list
Listed/Caption: Listed
Listed/Empty: This tiddler is not listed by any others
References/Caption: References
References/Caption: Backlinks
References/Empty: No tiddlers link to this one
Tagging/Caption: Tagging
Tagging/Empty: No tiddlers are tagged with this one

View File

@@ -154,7 +154,7 @@ Commander.prototype.extractNamedParameters = function(params,mandatoryParameters
if(errors.length > 0) {
return errors.join(" and\n");
} else {
return paramsByName;
return paramsByName;
}
};

View File

@@ -115,7 +115,7 @@ Command.prototype.fetchFile = function(url,options,callback,redirectCount) {
if(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {
return self.fetchFile(response.headers.location,options,callback,redirectCount + 1);
} else {
return callback("Error " + response.statusCode + " retrieving " + url)
return callback("Error " + response.statusCode + " retrieving " + url)
}
}
});

View File

@@ -37,16 +37,16 @@ Command.prototype.execute = function() {
filenameFilter = this.params[1] || "[is[tiddler]addsuffix[.html]]",
type = this.params[2] || "text/html",
template = this.params[3],
varName = this.params[4],
varValue = this.params[5],
tiddlers = wiki.filterTiddlers(tiddlerFilter);
$tw.utils.each(tiddlers,function(title) {
var parser = wiki.parseTiddler(template || title),
variables = {currentTiddler: title};
if(varName) {
variables[varName] = varValue || "";
variableList = this.params.slice(4),
tiddlers = wiki.filterTiddlers(tiddlerFilter),
variables = Object.create(null);
while(variableList.length >= 2) {
variables[variableList[0]] = variableList[1];
variableList = variableList.slice(2);
}
var widgetNode = wiki.makeWidget(parser,{variables: variables}),
$tw.utils.each(tiddlers,function(title) {
var parser = wiki.parseTiddler(template || title);
var widgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title})}),
container = $tw.fakeDocument.createElement("div");
widgetNode.render(container,null);
var text = type === "text/html" ? container.innerHTML : container.textContent,

View File

@@ -36,7 +36,7 @@ Command.prototype.execute = function() {
filter = this.params[0],
template = this.params[1],
outputPath = this.commander.outputPath,
pathname = path.resolve(outputPath,this.params[2]),
pathname = path.resolve(outputPath,this.params[2]),
type = this.params[3] || "text/html",
extension = this.params[4] || ".html",
deleteDirectory = (this.params[5] || "").toLowerCase() !== "noclean",

View File

@@ -97,7 +97,7 @@ WikiFolderMaker.prototype.save = function() {
// A custom plugin
self.log("Processing custom plugin: " + title);
self.saveCustomPlugin(tiddler);
}
}
} else {
// Ordinary tiddler
self.saveTiddler("tiddlers",tiddler);
@@ -158,11 +158,25 @@ WikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {
};
WikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {
var title = tiddler.fields.title, fileInfo, pathFilters, extFilters;
if(this.wiki.tiddlerExists("$:/config/FileSystemPaths")) {
pathFilters = this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n");
}
if(this.wiki.tiddlerExists("$:/config/FileSystemExtensions")) {
extFilters = this.wiki.getTiddlerText("$:/config/FileSystemExtensions","").split("\n");
}
var fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{
directory: path.resolve(this.wikiFolderPath,directory),
wiki: this.wiki
pathFilters: pathFilters,
extFilters: extFilters,
wiki: this.wiki,
fileInfo: {}
});
$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);
try {
$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);
} catch (err) {
console.log("SaveWikiFolder: Error saving file '" + fileInfo.filepath + "', tiddler: '" + tiddler.fields.title);
}
};
WikiFolderMaker.prototype.saveJSONFile = function(filename,json) {

View File

@@ -34,7 +34,7 @@ exports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:
exports.htmlVoidElements = "area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr".split(",");
exports.htmlBlockElements = "address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video".split(",");
exports.htmlBlockElements = "address,article,aside,audio,blockquote,canvas,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,nav,ol,p,pre,section,summary,table,tfoot,ul,video".split(",");
exports.htmlUnsafeElements = "script".split(",");

View File

@@ -31,7 +31,7 @@ var parseTiddlerDiv = function(text /* [,fields] */) {
for(var f=1; f<arguments.length; f++) {
var fields = arguments[f];
for(var t in fields) {
result[t] = fields[t];
result[t] = fields[t];
}
}
}

View File

@@ -42,7 +42,6 @@ function FramedEngine(options) {
this.iframeNode.style.border = "none";
this.iframeNode.style.padding = "0";
this.iframeNode.style.resize = "none";
this.iframeNode.style["background-color"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText("$:/palette"),"tiddler-editor-background");
this.iframeDoc.body.style.margin = "0";
this.iframeDoc.body.style.padding = "0";
this.widget.domNodes.push(this.iframeNode);
@@ -74,6 +73,12 @@ function FramedEngine(options) {
if(this.widget.editTabIndex) {
this.iframeNode.setAttribute("tabindex",this.widget.editTabIndex);
}
if(this.widget.editAutoComplete) {
this.domNode.setAttribute("autocomplete",this.widget.editAutoComplete);
}
if(this.widget.isDisabled === "yes") {
this.domNode.setAttribute("disabled",true);
}
// Copy the styles from the dummy textarea
this.copyStyles();
// Add event listeners
@@ -83,6 +88,18 @@ function FramedEngine(options) {
{name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"},
{name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"}
]);
// Add drag and drop event listeners if fileDrop is enabled
if(this.widget.isFileDropEnabled) {
$tw.utils.addEventListeners(this.domNode,[
{name: "dragenter",handlerObject: this.widget,handlerMethod: "handleDragEnterEvent"},
{name: "dragover",handlerObject: this.widget,handlerMethod: "handleDragOverEvent"},
{name: "dragleave",handlerObject: this.widget,handlerMethod: "handleDragLeaveEvent"},
{name: "dragend",handlerObject: this.widget,handlerMethod: "handleDragEndEvent"},
{name: "drop", handlerObject: this.widget,handlerMethod: "handleDropEvent"},
{name: "paste", handlerObject: this.widget,handlerMethod: "handlePasteEvent"},
{name: "click",handlerObject: this.widget,handlerMethod: "handleClickEvent"}
]);
}
// Insert the element into the DOM
this.iframeDoc.body.appendChild(this.domNode);
}
@@ -97,7 +114,6 @@ FramedEngine.prototype.copyStyles = function() {
this.domNode.style.display = "block";
this.domNode.style.width = "100%";
this.domNode.style.margin = "0";
this.domNode.style["background-color"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText("$:/palette"),"tiddler-editor-background");
// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour
this.domNode.style["-webkit-text-fill-color"] = "currentcolor";
};
@@ -166,7 +182,7 @@ Handle a focus event
*/
FramedEngine.prototype.handleFocusEvent = function(event) {
if(this.widget.editCancelPopups) {
$tw.popup.cancel(0);
$tw.popup.cancel(0);
}
};

View File

@@ -52,6 +52,12 @@ function SimpleEngine(options) {
if(this.widget.editTabIndex) {
this.domNode.setAttribute("tabindex",this.widget.editTabIndex);
}
if(this.widget.editAutoComplete) {
this.domNode.setAttribute("autocomplete",this.widget.editAutoComplete);
}
if(this.widget.isDisabled === "yes") {
this.domNode.setAttribute("disabled",true);
}
// Add an input event handler
$tw.utils.addEventListeners(this.domNode,[
{name: "focus", handlerObject: this, handlerMethod: "handleFocusEvent"},

View File

@@ -103,7 +103,11 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
var tiddler = this.wiki.getTiddler(this.editTitle);
if(tiddler) {
// If we've got a tiddler, the value to display is the field string value
value = tiddler.getFieldString(this.editField);
if(tiddler.hasField(this.editField)) {
value = tiddler.getFieldString(this.editField);
} else {
value = this.editDefault || "";
}
if(this.editField === "text") {
type = tiddler.fields.type || "text/vnd.tiddlywiki";
}
@@ -180,6 +184,9 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
this.editCancelPopups = this.getAttribute("cancelPopups","") === "yes";
this.editInputActions = this.getAttribute("inputActions");
this.editRefreshTitle = this.getAttribute("refreshTitle");
this.editAutoComplete = this.getAttribute("autocomplete");
this.isDisabled = this.getAttribute("disabled","no");
this.isFileDropEnabled = this.getAttribute("fileDrop","no") === "yes";
// Get the default editor element tag and type
var tag,type;
if(this.editField === "text") {
@@ -211,7 +218,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
EditTextWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes();
// Completely rerender if any of our attributes have changed
if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) {
if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled || changedAttributes.fileDrop) {
this.refreshSelf();
return true;
} else if (changedTiddlers[this.editRefreshTitle]) {
@@ -291,21 +298,89 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
Propogate keydown events to our container for the keyboard widgets benefit
*/
EditTextWidget.prototype.propogateKeydownEvent = function(event) {
var newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent("Events");
if(newEvent.initEvent) {
newEvent.initEvent("keydown", true, true);
}
newEvent.keyCode = event.keyCode;
newEvent.which = event.which;
newEvent.metaKey = event.metaKey;
newEvent.ctrlKey = event.ctrlKey;
newEvent.altKey = event.altKey;
newEvent.shiftKey = event.shiftKey;
var newEvent = this.cloneEvent(event,["keyCode","which","metaKey","ctrlKey","altKey","shiftKey"]);
return !this.parentDomNode.dispatchEvent(newEvent);
};
return EditTextWidget;
EditTextWidget.prototype.cloneEvent = function(event,propertiesToCopy) {
var propertiesToCopy = propertiesToCopy || [],
newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent("Events");
if(newEvent.initEvent) {
newEvent.initEvent(event.type, true, true);
}
$tw.utils.each(propertiesToCopy,function(prop){
newEvent[prop] = event[prop];
});
return newEvent;
};
EditTextWidget.prototype.dispatchDOMEvent = function(newEvent) {
var dispatchNode = this.engine.iframeNode || this.engine.parentNode;
return dispatchNode.dispatchEvent(newEvent);
};
/*
Propogate drag and drop events with File data to our container for the dropzone widgets benefit.
If there are no Files, let the browser handle it.
*/
EditTextWidget.prototype.handleDropEvent = function(event) {
if(event.dataTransfer.files.length) {
event.preventDefault();
event.stopPropagation();
this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"]));
}
};
EditTextWidget.prototype.handlePasteEvent = function(event) {
if(event.clipboardData.files.length) {
event.preventDefault();
event.stopPropagation();
this.dispatchDOMEvent(this.cloneEvent(event,["clipboardData"]));
}
};
EditTextWidget.prototype.handleDragEnterEvent = function(event) {
if($tw.utils.dragEventContainsFiles(event)) {
// Ignore excessive events fired by FF when entering and leaving text nodes in a text area.
if( event.relatedTarget && (event.relatedTarget.nodeType === 3 || event.target === event.relatedTarget)) {
return true;
}
event.preventDefault();
return this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"]));
}
return true;
};
EditTextWidget.prototype.handleDragOverEvent = function(event) {
if($tw.utils.dragEventContainsFiles(event)) {
// Call preventDefault() in browsers that default to not allowing drop events on textarea
if($tw.browser.isFirefox || $tw.browser.isIE) {
event.preventDefault();
}
event.dataTransfer.dropEffect = "copy";
return this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"]));
}
return true;
};
EditTextWidget.prototype.handleDragLeaveEvent = function(event) {
// Ignore excessive events fired by FF when entering and leaving text nodes in a text area.
if(event.relatedTarget && ((event.relatedTarget.nodeType === 3) || (event.target === event.relatedTarget))) {
return true;
}
event.preventDefault();
this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"]));
};
EditTextWidget.prototype.handleDragEndEvent = function(event) {
this.dispatchDOMEvent(this.cloneEvent(event));
};
EditTextWidget.prototype.handleClickEvent = function(event) {
return !this.dispatchDOMEvent(this.cloneEvent(event));
};
return EditTextWidget;
}
exports.editTextWidgetFactory = editTextWidgetFactory;

View File

@@ -0,0 +1,23 @@
/*\
title: $:/core/modules/editor/operations/text/insert-text.js
type: application/javascript
module-type: texteditoroperation
Text editor operation insert text at the caret position. If there is a selection it is replaced.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["insert-text"] = function(event,operation) {
operation.replacement = event.paramObject.text;
operation.cutStart = operation.selStart;
operation.cutEnd = operation.selEnd;
operation.newSelStart = operation.selStart + operation.replacement.length;
operation.newSelEnd = operation.newSelStart;
};
})();

View File

@@ -0,0 +1,25 @@
/*\
title: $:/core/modules/filterrunprefixes/all.js
type: application/javascript
module-type: filterrunprefix
Union of sets without de-duplication.
Equivalent to = filter run prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter prefix function
*/
exports.all = function(operationSubFunction) {
return function(results,source,widget) {
results.push.apply(results, operationSubFunction(source,widget));
};
};
})();

View File

@@ -0,0 +1,28 @@
/*\
title: $:/core/modules/filterrunprefixes/and.js
type: application/javascript
module-type: filterrunprefix
Intersection of sets.
Equivalent to + filter run prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter prefix function
*/
exports.and = function(operationSubFunction,options) {
return function(results,source,widget) {
// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved
source = options.wiki.makeTiddlerIterator(results.toArray());
results.clear();
results.pushTop(operationSubFunction(source,widget));
};
};
})();

View File

@@ -0,0 +1,27 @@
/*\
title: $:/core/modules/filterrunprefixes/else.js
type: application/javascript
module-type: filterrunprefix
Equivalent to ~ filter run prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter prefix function
*/
exports.else = function(operationSubFunction) {
return function(results,source,widget) {
if(results.length === 0) {
// Main result so far is empty
results.pushTop(operationSubFunction(source,widget));
}
};
};
})();

View File

@@ -0,0 +1,25 @@
/*\
title: $:/core/modules/filterrunprefixes/except.js
type: application/javascript
module-type: filterrunprefix
Difference of sets.
Equivalent to - filter run prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter prefix function
*/
exports.except = function(operationSubFunction) {
return function(results,source,widget) {
results.remove(operationSubFunction(source,widget));
};
};
})();

View File

@@ -0,0 +1,42 @@
/*\
title: $:/core/modules/filterrunprefixes/filter.js
type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter function
*/
exports.filter = function(operationSubFunction,options) {
return function(results,source,widget) {
if(results.length > 0) {
var resultsToRemove = [];
results.each(function(title) {
var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
getVariable: function(name) {
switch(name) {
case "currentTiddler":
return "" + title;
case "..currentTiddler":
return widget.getVariable("currentTiddler");
default:
return widget.getVariable(name);
}
}
});
if(filtered.length === 0) {
resultsToRemove.push(title);
}
});
results.remove(resultsToRemove);
}
}
};
})();

View File

@@ -0,0 +1,31 @@
/*\
title: $:/core/modules/filterrunprefixes/intersection.js
type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter prefix function
*/
exports.intersection = function(operationSubFunction) {
return function(results,source,widget) {
if(results.length !== 0) {
var secondRunResults = operationSubFunction(source,widget);
var firstRunResults = results.toArray();
results.clear();
$tw.utils.each(firstRunResults,function(title) {
if(secondRunResults.indexOf(title) !== -1) {
results.push(title);
}
});
}
};
};
})();

View File

@@ -0,0 +1,24 @@
/*\
title: $:/core/modules/filterrunprefixes/or.js
type: application/javascript
module-type: filterrunprefix
Equivalent to a filter run with no prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter prefix function
*/
exports.or = function(operationSubFunction) {
return function(results,source,widget) {
results.pushTop(operationSubFunction(source,widget));
};
};
})();

View File

@@ -0,0 +1,52 @@
/*\
title: $:/core/modules/filterrunprefixes/reduce.js
type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter prefix function
*/
exports.reduce = function(operationSubFunction,options) {
return function(results,source,widget) {
if(results.length > 0) {
var accumulator = "";
var index = 0;
results.each(function(title) {
var list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
getVariable: function(name) {
switch(name) {
case "currentTiddler":
return "" + title;
case "..currentTiddler":
return widget.getVariable("currentTiddler");
case "accumulator":
return "" + accumulator;
case "index":
return "" + index;
case "revIndex":
return "" + (results.length - 1 - index);
case "length":
return "" + results.length;
default:
return widget.getVariable(name);
}
}
});
if(list.length > 0) {
accumulator = "" + list[0];
}
++index;
});
results.clear();
results.push(accumulator);
}
}
};
})();

View File

@@ -0,0 +1,60 @@
/*\
title: $:/core/modules/filterrunprefixes/sort.js
type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter prefix function
*/
exports.sort = function(operationSubFunction,options) {
return function(results,source,widget) {
if(results.length > 0) {
var suffixes = options.suffixes,
sortType = (suffixes[0] && suffixes[0][0]) ? suffixes[0][0] : "string",
invert = suffixes[1] ? (suffixes[1].indexOf("reverse") !== -1) : false,
isCaseSensitive = suffixes[1] ? (suffixes[1].indexOf("casesensitive") !== -1) : false,
inputTitles = results.toArray(),
sortKeys = [],
indexes = new Array(inputTitles.length),
compareFn;
results.each(function(title) {
var key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
getVariable: function(name) {
switch(name) {
case "currentTiddler":
return "" + title;
case "..currentTiddler":
return widget.getVariable("currentTiddler");
default:
return widget.getVariable(name);
}
}
});
sortKeys.push(key[0] || "");
});
results.clear();
// Prepare an array of indexes to sort
for(var t=0; t<inputTitles.length; t++) {
indexes[t] = t;
}
// Sort the indexes
compareFn = $tw.utils.makeCompareFunction(sortType,{defaultType: "string", invert:invert, isCaseSensitive:isCaseSensitive});
indexes = indexes.sort(function(a,b) {
return compareFn(sortKeys[a],sortKeys[b]);
});
// Add to results in correct order
$tw.utils.each(indexes,function(index) {
results.push(inputTitles[index]);
});
}
}
};
})();

View File

@@ -62,42 +62,60 @@ function parseFilterOperation(operators,filterString,p) {
else if(operator.operator === "") {
operator.operator = "title";
}
operator.operands = [];
var parseOperand = function(bracketType) {
var operand = {};
switch (bracketType) {
case "{": // Curly brackets
operand.indirect = true;
nextBracketPos = filterString.indexOf("}",p);
break;
case "[": // Square brackets
nextBracketPos = filterString.indexOf("]",p);
break;
case "<": // Angle brackets
operand.variable = true;
nextBracketPos = filterString.indexOf(">",p);
break;
case "/": // regexp brackets
var rex = /^((?:[^\\\/]|\\.)*)\/(?:\(([mygi]+)\))?/g,
rexMatch = rex.exec(filterString.substring(p));
if(rexMatch) {
operator.regexp = new RegExp(rexMatch[1], rexMatch[2]);
// DEPRECATION WARNING
console.log("WARNING: Filter",operator.operator,"has a deprecated regexp operand",operator.regexp);
nextBracketPos = p + rex.lastIndex - 1;
}
else {
throw "Unterminated regular expression in filter expression";
}
break;
}
if(nextBracketPos === -1) {
throw "Missing closing bracket in filter expression";
}
if(!operator.regexp) {
operand.text = filterString.substring(p,nextBracketPos);
operator.operands.push(operand);
}
p = nextBracketPos + 1;
}
p = nextBracketPos + 1;
switch (bracket) {
case "{": // Curly brackets
operator.indirect = true;
nextBracketPos = filterString.indexOf("}",p);
break;
case "[": // Square brackets
nextBracketPos = filterString.indexOf("]",p);
break;
case "<": // Angle brackets
operator.variable = true;
nextBracketPos = filterString.indexOf(">",p);
break;
case "/": // regexp brackets
var rex = /^((?:[^\\\/]*|\\.)*)\/(?:\(([mygi]+)\))?/g,
rexMatch = rex.exec(filterString.substring(p));
if(rexMatch) {
operator.regexp = new RegExp(rexMatch[1], rexMatch[2]);
// DEPRECATION WARNING
console.log("WARNING: Filter",operator.operator,"has a deprecated regexp operand",operator.regexp);
nextBracketPos = p + rex.lastIndex - 1;
}
else {
throw "Unterminated regular expression in filter expression";
}
break;
}
parseOperand(bracket);
if(nextBracketPos === -1) {
throw "Missing closing bracket in filter expression";
// Check for multiple operands
while(filterString.charAt(p) === ",") {
p++;
if(/^[\[\{<\/]/.test(filterString.substring(p))) {
nextBracketPos = p;
p++;
parseOperand(filterString.charAt(nextBracketPos));
} else {
throw "Missing [ in filter expression";
}
}
if(!operator.regexp) {
operator.operand = filterString.substring(p,nextBracketPos);
}
p = nextBracketPos + 1;
// Push this operator
operators.push(operator);
@@ -119,7 +137,7 @@ exports.parseFilter = function(filterString) {
p = 0, // Current position in the filter string
match;
var whitespaceRegExp = /(\s+)/mg,
operandRegExp = /((?:\+|\-|~|=)?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg;
operandRegExp = /((?:\+|\-|~|=|\:(\w+)(?:\:([\w\:, ]*))?)?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg;
while(p < filterString.length) {
// Skip any whitespace
whitespaceRegExp.lastIndex = p;
@@ -140,16 +158,31 @@ exports.parseFilter = function(filterString) {
};
if(match[1]) {
operation.prefix = match[1];
p++;
p = p + operation.prefix.length;
if(match[2]) {
operation.namedPrefix = match[2];
}
if(match[3]) {
operation.suffixes = [];
$tw.utils.each(match[3].split(":"),function(subsuffix) {
operation.suffixes.push([]);
$tw.utils.each(subsuffix.split(","),function(entry) {
entry = $tw.utils.trim(entry);
if(entry) {
operation.suffixes[operation.suffixes.length -1].push(entry);
}
});
});
}
}
if(match[2]) { // Opening square bracket
if(match[4]) { // Opening square bracket
p = parseFilterOperation(operation.operators,filterString,p);
} else {
p = match.index + match[0].length;
}
if(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title
if(match[5] || match[6] || match[7]) { // Double quoted string, single quoted string or unquoted title
operation.operators.push(
{operator: "title", operand: match[3] || match[4] || match[5]}
{operator: "title", operands: [{text: match[5] || match[6] || match[7]}]}
);
}
results.push(operation);
@@ -166,6 +199,14 @@ exports.getFilterOperators = function() {
return this.filterOperators;
};
exports.getFilterRunPrefixes = function() {
if(!this.filterRunPrefixes) {
$tw.Wiki.prototype.filterRunPrefixes = {};
$tw.modules.applyMethods("filterrunprefix",this.filterRunPrefixes);
}
return this.filterRunPrefixes;
}
exports.filterTiddlers = function(filterString,widget,source) {
var fn = this.compileFilter(filterString);
return fn.call(this,source,widget);
@@ -198,7 +239,7 @@ exports.compileFilter = function(filterString) {
results = [],
currTiddlerTitle = widget && widget.getVariable("currentTiddler");
$tw.utils.each(operation.operators,function(operator) {
var operand = operator.operand,
var operands = [],
operatorFunction;
if(!operator.operator) {
operatorFunction = filterOperators.title;
@@ -207,16 +248,23 @@ exports.compileFilter = function(filterString) {
} else {
operatorFunction = filterOperators[operator.operator];
}
if(operator.indirect) {
operand = self.getTextReference(operator.operand,"",currTiddlerTitle);
}
if(operator.variable) {
operand = widget.getVariable(operator.operand,{defaultValue: ""});
}
$tw.utils.each(operator.operands,function(operand) {
if(operand.indirect) {
operand.value = self.getTextReference(operand.text,"",currTiddlerTitle);
} else if(operand.variable) {
operand.value = widget.getVariable(operand.text,{defaultValue: ""});
} else {
operand.value = operand.text;
}
operands.push(operand.value);
});
// Invoke the appropriate filteroperator module
results = operatorFunction(accumulator,{
operator: operator.operator,
operand: operand,
operand: operands.length > 0 ? operands[0] : undefined,
operands: operands,
prefix: operator.prefix,
suffix: operator.suffix,
suffixes: operator.suffixes,
@@ -241,35 +289,30 @@ exports.compileFilter = function(filterString) {
return resultArray;
}
};
var filterRunPrefixes = self.getFilterRunPrefixes();
// Wrap the operator functions in a wrapper function that depends on the prefix
operationFunctions.push((function() {
var options = {wiki: self, suffixes: operation.suffixes || []};
switch(operation.prefix || "") {
case "": // No prefix means that the operation is unioned into the result
return function(results,source,widget) {
$tw.utils.pushTop(results,operationSubFunction(source,widget));
};
return filterRunPrefixes["or"](operationSubFunction, options);
case "=": // The results of the operation are pushed into the result without deduplication
return function(results,source,widget) {
Array.prototype.push.apply(results,operationSubFunction(source,widget));
};
return filterRunPrefixes["all"](operationSubFunction, options);
case "-": // The results of this operation are removed from the main result
return function(results,source,widget) {
$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));
};
return filterRunPrefixes["except"](operationSubFunction, options);
case "+": // This operation is applied to the main results so far
return function(results,source,widget) {
// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved
source = self.makeTiddlerIterator(results);
results.splice(0,results.length);
$tw.utils.pushTop(results,operationSubFunction(source,widget));
};
return filterRunPrefixes["and"](operationSubFunction, options);
case "~": // This operation is unioned into the result only if the main result so far is empty
return function(results,source,widget) {
if(results.length === 0) {
// Main result so far is empty
$tw.utils.pushTop(results,operationSubFunction(source,widget));
}
};
return filterRunPrefixes["else"](operationSubFunction, options);
default:
if(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {
return filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);
} else {
return function(results,source,widget) {
results.clear();
results.push($tw.language.getString("Error/FilterRunPrefix"));
};
}
}
})());
});
@@ -280,11 +323,14 @@ exports.compileFilter = function(filterString) {
} else if(typeof source === "object") { // Array or hashmap
source = self.makeTiddlerIterator(source);
}
var results = [];
if(!widget) {
widget = $tw.rootWidget;
}
var results = new $tw.utils.LinkedList();
$tw.utils.each(operationFunctions,function(operationFunction) {
operationFunction(results,source,widget);
});
return results;
return results.toArray();
});
};

View File

@@ -31,7 +31,7 @@ exports.all = function(source,operator,options) {
// Get our suboperators
var allFilterOperators = getAllFilterOperators();
// Cycle through the suboperators accumulating their results
var results = [],
var results = new $tw.utils.LinkedList(),
subops = operator.operand.split("+");
// Check for common optimisations
if(subops.length === 1 && subops[0] === "") {
@@ -49,10 +49,10 @@ exports.all = function(source,operator,options) {
for(var t=0; t<subops.length; t++) {
var subop = allFilterOperators[subops[t]];
if(subop) {
$tw.utils.pushTop(results,subop(source,operator.prefix,options));
results.pushTop(subop(source,operator.prefix,options));
}
}
return results;
return results.toArray();
};
})();

View File

@@ -0,0 +1,27 @@
/*\
title: $:/core/modules/filters/deserializers.js
type: application/javascript
module-type: filteroperator
Filter operator for returning the names of the deserializers in this wiki
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter function
*/
exports.deserializers = function(source,operator,options) {
var results = [];
$tw.utils.each($tw.Wiki.tiddlerDeserializerModules,function(deserializer,type) {
results.push(type);
});
results.sort();
return results;
};
})();

View File

@@ -16,14 +16,16 @@ Filter operator for returning the descriptions of the specified edition names
Export our filter function
*/
exports.editiondescription = function(source,operator,options) {
var results = [],
editionInfo = $tw.utils.getEditionInfo();
if(editionInfo) {
source(function(tiddler,title) {
if($tw.utils.hop(editionInfo,title)) {
results.push(editionInfo[title].description || "");
}
});
var results = [];
if($tw.node) {
var editionInfo = $tw.utils.getEditionInfo();
if(editionInfo) {
source(function(tiddler,title) {
if($tw.utils.hop(editionInfo,title)) {
results.push(editionInfo[title].description || "");
}
});
}
}
return results;
};

View File

@@ -16,14 +16,16 @@ Filter operator for returning the names of the available editions in this wiki
Export our filter function
*/
exports.editions = function(source,operator,options) {
var results = [],
editionInfo = $tw.utils.getEditionInfo();
if(editionInfo) {
$tw.utils.each(editionInfo,function(info,name) {
results.push(name);
});
var results = [];
if($tw.node) {
var editionInfo = $tw.utils.getEditionInfo();
if(editionInfo) {
$tw.utils.each(editionInfo,function(info,name) {
results.push(name);
});
}
results.sort();
}
results.sort();
return results;
};

View File

@@ -77,7 +77,7 @@ exports.encodehtml = function(source,operator,options) {
exports.stringify = function(source,operator,options) {
var results = [];
source(function(tiddler,title) {
results.push($tw.utils.stringify(title));
results.push($tw.utils.stringify(title,(operator.suffix === "rawunicode")));
});
return results;
};
@@ -85,7 +85,7 @@ exports.stringify = function(source,operator,options) {
exports.jsonstringify = function(source,operator,options) {
var results = [];
source(function(tiddler,title) {
results.push($tw.utils.jsonStringify(title));
results.push($tw.utils.jsonStringify(title,(operator.suffix === "rawunicode")));
});
return results;
};
@@ -102,7 +102,7 @@ exports.escapecss = function(source,operator,options) {
var results = [];
source(function(tiddler,title) {
// escape any character with a special meaning in CSS using CSS.escape()
results.push(CSS.escape(title));
results.push($tw.utils.escapeCSS(title));
});
return results;
};

View File

@@ -20,7 +20,7 @@ exports.fields = function(source,operator,options) {
fieldName,
suffixes = (operator.suffixes || [])[0] || [],
operand = $tw.utils.parseStringArray(operator.operand);
source(function(tiddler,title) {
if(tiddler) {
if(suffixes.indexOf("include") !== -1) {

View File

@@ -20,7 +20,18 @@ exports.filter = function(source,operator,options) {
results = [],
target = operator.prefix !== "!";
source(function(tiddler,title) {
var list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]));
var list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{
getVariable: function(name) {
switch(name) {
case "currentTiddler":
return "" + title;
case "..currentTiddler":
return options.widget.getVariable("currentTiddler");
default:
return options.widget.getVariable(name);
}
}
});
if((list.length > 0) === target) {
results.push(title);
}

View File

@@ -13,13 +13,13 @@ module-type: formatfilteroperator
Export our filter function
*/
exports.date = function(source,operand,options) {
var results = [];
var results = [];
source(function(tiddler,title) {
var value = $tw.utils.parseDate(title);
if(value && $tw.utils.isDate(value) && value.toString() !== "Invalid Date") {
results.push($tw.utils.formatDateString(value,operand || "YYYY MM DD 0hh:0mm"));
}
});
});
return results;
};

View File

@@ -13,13 +13,13 @@ module-type: formatfilteroperator
Export our filter function
*/
exports.relativedate = function(source,operand,options) {
var results = [];
var results = [];
source(function(tiddler,title) {
var value = $tw.utils.parseDate(title);
if(value && $tw.utils.isDate(value) && value.toString() !== "Invalid Date") {
results.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);
}
});
});
return results;
};

View File

@@ -0,0 +1,25 @@
/*\
title: $:/core/modules/filters/format/titlelist.js
type: application/javascript
module-type: formatfilteroperator
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter function
*/
exports.titlelist = function(source,operand,options) {
var results = [];
source(function(tiddler,title) {
if(title && title.length) {
results.push($tw.utils.stringifyList([title]));
}
});
return results;
};
})();

View File

@@ -61,7 +61,7 @@ exports.has = function(source,operator,options) {
if(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) {
results.push(title);
}
});
});
}
}
return results;

View File

@@ -0,0 +1,36 @@
/*\
title: $:/core/modules/filters/is/draft.js
type: application/javascript
module-type: isfilteroperator
Filter function for [is[draft]] analagous to [has[draft.of]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter function
*/
exports.draft = function(source,prefix,options) {
var results = [];
if(prefix === "!") {
source(function(tiddler,title) {
if(!tiddler || !$tw.utils.hop(tiddler.fields,"draft.of")) {
results.push(title);
}
});
} else {
source(function(tiddler,title) {
if(tiddler && $tw.utils.hop(tiddler.fields,"draft.of") && (tiddler.fields["draft.of"].length !== 0)) {
results.push(title);
}
});
}
return results;
};
})();

View File

@@ -16,11 +16,11 @@ Filter operator for returning all the links from a tiddler
Export our filter function
*/
exports.links = function(source,operator,options) {
var results = [];
var results = new $tw.utils.LinkedList();
source(function(tiddler,title) {
$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));
results.pushTop(options.wiki.getTiddlerLinks(title));
});
return results;
return results.toArray();
};
})();

View File

@@ -22,7 +22,7 @@ Export our filter function
exports.lookup = function(source,operator,options) {
var results = [];
source(function(tiddler,title) {
results.push(options.wiki.getTiddlerText(operator.operand + title) || options.wiki.getTiddlerText(operator.operand + operator.suffix));
results.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix || '');
});
return results;
};

View File

@@ -91,6 +91,20 @@ exports.exponential = makeNumericBinaryOperator(
function(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}
);
exports.power = makeNumericBinaryOperator(
function(a,b) {return Math.pow(a,b);}
);
exports.log = makeNumericBinaryOperator(
function(a,b) {
if(b) {
return Math.log(a)/Math.log(b);
} else {
return Math.log(a);
}
}
);
exports.sum = makeNumericReducingOperator(
function(accumulator,value) {return accumulator + value},
0 // Initial value
@@ -111,6 +125,54 @@ exports.minall = makeNumericReducingOperator(
Infinity // Initial value
);
exports.median = makeNumericArrayOperator(
function(values) {
var len = values.length, median;
values.sort();
if(len % 2) {
// Odd, return the middle number
median = values[(len - 1) / 2];
} else {
// Even, return average of two middle numbers
median = (values[len / 2 - 1] + values[len / 2]) / 2;
}
return [median];
}
);
exports.average = makeNumericReducingOperator(
function(accumulator,value) {return accumulator + value},
0, // Initial value
function(finalValue,numberOfValues) {
return finalValue/numberOfValues;
}
);
exports.variance = makeNumericReducingOperator(
function(accumulator,value) {return accumulator + value},
0,
function(finalValue,numberOfValues,originalValues) {
return getVarianceFromArray(originalValues,finalValue/numberOfValues);
}
);
exports["standard-deviation"] = makeNumericReducingOperator(
function(accumulator,value) {return accumulator + value},
0,
function(finalValue,numberOfValues,originalValues) {
var variance = getVarianceFromArray(originalValues,finalValue/numberOfValues);
return Math.sqrt(variance);
}
);
//Calculate the variance of a population of numbers in an array given its mean
function getVarianceFromArray(values,mean) {
var deviationTotal = values.reduce(function(accumulator,value) {
return accumulator + Math.pow(value - mean, 2);
},0);
return deviationTotal/values.length;
};
function makeNumericBinaryOperator(fnCalc) {
return function(source,operator,options) {
var result = [],
@@ -120,19 +182,37 @@ function makeNumericBinaryOperator(fnCalc) {
});
return result;
};
}
};
function makeNumericReducingOperator(fnCalc,initialValue) {
function makeNumericReducingOperator(fnCalc,initialValue,fnFinal) {
initialValue = initialValue || 0;
return function(source,operator,options) {
var result = [];
source(function(tiddler,title) {
result.push(title);
result.push($tw.utils.parseNumber(title));
});
return [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {
return fnCalc(accumulator,$tw.utils.parseNumber(currentValue));
},initialValue))];
var value = result.reduce(function(accumulator,currentValue) {
return fnCalc(accumulator,currentValue);
},initialValue);
if(fnFinal) {
value = fnFinal(value,result.length,result);
}
return [$tw.utils.stringifyNumber(value)];
};
}
};
function makeNumericArrayOperator(fnCalc) {
return function(source,operator,options) {
var results = [];
source(function(tiddler,title) {
results.push($tw.utils.parseNumber(title));
});
results = fnCalc(results);
$tw.utils.each(results,function(value,index) {
results[index] = $tw.utils.stringifyNumber(value);
});
return results;
};
};
})();

View File

@@ -3,7 +3,7 @@ title: $:/core/modules/filters/reduce.js
type: application/javascript
module-type: filteroperator
Filter operator evaluats a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`
Filter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`
\*/
(function(){
@@ -23,7 +23,7 @@ exports.reduce = function(source,operator,options) {
});
// Run the filter over each item
var filterFn = options.wiki.compileFilter(operator.operand),
accumulator = operator.suffix || "";
accumulator = operator.operands[1] || "";
for(var index=0; index<results.length; index++) {
var title = results[index],
list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{
@@ -31,6 +31,8 @@ exports.reduce = function(source,operator,options) {
switch(name) {
case "currentTiddler":
return "" + title;
case "..currentTiddler":
return options.widget.getVariable("currentTiddler");
case "accumulator":
return "" + accumulator;
case "index":
@@ -48,7 +50,11 @@ exports.reduce = function(source,operator,options) {
accumulator = "" + list[0];
}
}
return [accumulator];
if(results.length > 0) {
return [accumulator];
} else {
return [];
}
};
})();

View File

@@ -27,10 +27,13 @@ exports.sortsub = function(source,operator,options) {
iterator(options.wiki.getTiddler(title),title);
},{
getVariable: function(name) {
if(name === "currentTiddler") {
return title;
} else {
return options.widget.getVariable(name);
switch(name) {
case "currentTiddler":
return "" + title;
case "..currentTiddler":
return options.widget.getVariable("currentTiddler");
default:
return options.widget.getVariable(name);
}
}
});

View File

@@ -56,14 +56,14 @@ exports.trim = function(source,operator,options) {
return result;
};
// makeStringBinaryOperator(
// function(a) {return [$tw.utils.trim(a)];}
// );
exports.split = makeStringBinaryOperator(
function(a,b) {return ("" + a).split(b);}
);
exports["enlist-input"] = makeStringBinaryOperator(
function(a,o,s) {return $tw.utils.parseStringArray("" + a,(s === "raw"));}
);
exports.join = makeStringReducingOperator(
function(accumulator,value,operand) {
if(accumulator === null) {
@@ -78,7 +78,7 @@ function makeStringBinaryOperator(fnCalc) {
return function(source,operator,options) {
var result = [];
source(function(tiddler,title) {
Array.prototype.push.apply(result,fnCalc(title,operator.operand || ""));
Array.prototype.push.apply(result,fnCalc(title,operator.operand || "",operator.suffix || ""));
});
return result;
};
@@ -105,14 +105,71 @@ exports.splitregexp = function(source,operator,options) {
flags = (suffix.indexOf("m") !== -1 ? "m" : "") + (suffix.indexOf("i") !== -1 ? "i" : ""),
regExp;
try {
regExp = new RegExp(operator.operand || "",flags);
regExp = new RegExp(operator.operand || "",flags);
} catch(ex) {
return ["RegExp error: " + ex];
}
source(function(tiddler,title) {
Array.prototype.push.apply(result,title.split(regExp));
});
});
return result;
};
exports["search-replace"] = function(source,operator,options) {
var results = [],
suffixes = operator.suffixes || [],
flagSuffix = (suffixes[0] ? (suffixes[0][0] || "") : ""),
flags = (flagSuffix.indexOf("g") !== -1 ? "g" : "") + (flagSuffix.indexOf("i") !== -1 ? "i" : ""),
isRegExp = (suffixes[1] && suffixes[1][0] === "regexp") ? true : false,
searchTerm,
regExp;
source(function(tiddler,title) {
if(title && (operator.operands.length > 1)) {
//Escape regexp characters if the operand is not a regular expression
searchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand);
try {
regExp = new RegExp(searchTerm,flags);
} catch(ex) {
return ["RegExp error: " + ex];
}
results.push(
title.replace(regExp,operator.operands[1])
);
} else {
results.push(title);
}
});
return results;
};
exports.pad = function(source,operator,options) {
var results = [],
targetLength = operator.operand ? parseInt(operator.operand) : 0,
fill = operator.operands[1] || "0";
source(function(tiddler,title) {
if(title && title.length) {
if(title.length >= targetLength) {
results.push(title);
} else {
var padString = "",
padStringLength = targetLength - title.length;
while (padStringLength > padString.length) {
padString += fill;
}
//make sure we do not exceed the specified length
padString = padString.slice(0,padStringLength);
if(operator.suffix && (operator.suffix === "suffix")) {
title = title + padString;
} else {
title = padString + title;
}
results.push(title);
}
}
});
return results;
}
})();

View File

@@ -50,7 +50,7 @@ exports.tag = function(source,operator,options) {
});
results = options.wiki.sortByList(results,operator.operand);
}
}
}
}
return results;
};

View File

@@ -8,183 +8,228 @@ Extended filter operators to manipulate the current list.
\*/
(function () {
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Fetch titles from the current list
*/
var prepare_results = function (source) {
var results = [];
source(function (tiddler, title) {
results.push(title);
});
return results;
};
/*
Fetch titles from the current list
*/
var prepare_results = function (source) {
var results = [];
source(function (tiddler, title) {
results.push(title);
});
return results;
};
/*
Moves a number of items from the tail of the current list before the item named in the operand
*/
exports.putbefore = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand),
count = $tw.utils.getInt(operator.suffix,1);
return (index === -1) ?
results.slice(0, -1) :
results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));
};
/*
Moves a number of items from the tail of the current list before the item named in the operand
*/
exports.putbefore = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand),
count = $tw.utils.getInt(operator.suffix,1);
return (index === -1) ?
results.slice(0, -1) :
results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));
};
/*
Moves a number of items from the tail of the current list after the item named in the operand
*/
exports.putafter = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand),
count = $tw.utils.getInt(operator.suffix,1);
return (index === -1) ?
results.slice(0, -1) :
results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));
};
/*
Moves a number of items from the tail of the current list after the item named in the operand
*/
exports.putafter = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand),
count = $tw.utils.getInt(operator.suffix,1);
return (index === -1) ?
results.slice(0, -1) :
results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));
};
/*
Replaces the item named in the operand with a number of items from the tail of the current list
*/
exports.replace = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand),
count = $tw.utils.getInt(operator.suffix,1);
return (index === -1) ?
results.slice(0, -count) :
results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));
};
/*
Replaces the item named in the operand with a number of items from the tail of the current list
*/
exports.replace = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand),
count = $tw.utils.getInt(operator.suffix,1);
return (index === -1) ?
results.slice(0, -count) :
results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));
};
/*
Moves a number of items from the tail of the current list to the head of the list
*/
exports.putfirst = function (source, operator) {
var results = prepare_results(source),
count = $tw.utils.getInt(operator.suffix,1);
return results.slice(-count).concat(results.slice(0, -count));
};
/*
Moves a number of items from the tail of the current list to the head of the list
*/
exports.putfirst = function (source, operator) {
var results = prepare_results(source),
count = $tw.utils.getInt(operator.suffix,1);
return results.slice(-count).concat(results.slice(0, -count));
};
/*
Moves a number of items from the head of the current list to the tail of the list
*/
exports.putlast = function (source, operator) {
var results = prepare_results(source),
count = $tw.utils.getInt(operator.suffix,1);
return results.slice(count).concat(results.slice(0, count));
};
/*
Moves a number of items from the head of the current list to the tail of the list
*/
exports.putlast = function (source, operator) {
var results = prepare_results(source),
count = $tw.utils.getInt(operator.suffix,1);
return results.slice(count).concat(results.slice(0, count));
};
/*
Moves the item named in the operand a number of places forward or backward in the list
*/
exports.move = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand),
count = $tw.utils.getInt(operator.suffix,1),
marker = results.splice(index, 1),
offset = (index + count) > 0 ? index + count : 0;
return results.slice(0, offset).concat(marker).concat(results.slice(offset));
};
/*
Moves the item named in the operand a number of places forward or backward in the list
*/
exports.move = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand),
count = $tw.utils.getInt(operator.suffix,1),
marker = results.splice(index, 1),
offset = (index + count) > 0 ? index + count : 0;
return results.slice(0, offset).concat(marker).concat(results.slice(offset));
};
/*
Returns the items from the current list that are after the item named in the operand
*/
exports.allafter = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand);
return (index === -1) ? [] :
(operator.suffix) ? results.slice(index) :
results.slice(index + 1);
};
/*
Returns the items from the current list that are after the item named in the operand
*/
exports.allafter = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand);
return (index === -1) ? [] :
(operator.suffix) ? results.slice(index) :
results.slice(index + 1);
};
/*
Returns the items from the current list that are before the item named in the operand
*/
exports.allbefore = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand);
return (index === -1) ? [] :
(operator.suffix) ? results.slice(0, index + 1) :
results.slice(0, index);
};
/*
Returns the items from the current list that are before the item named in the operand
*/
exports.allbefore = function (source, operator) {
var results = prepare_results(source),
index = results.indexOf(operator.operand);
return (index === -1) ? [] :
(operator.suffix) ? results.slice(0, index + 1) :
results.slice(0, index);
};
/*
Appends the items listed in the operand array to the tail of the current list
*/
exports.append = function (source, operator) {
var append = $tw.utils.parseStringArray(operator.operand, "true"),
results = prepare_results(source),
count = parseInt(operator.suffix) || append.length;
return (append.length === 0) ? results :
(operator.prefix) ? results.concat(append.slice(-count)) :
results.concat(append.slice(0, count));
};
/*
Appends the items listed in the operand array to the tail of the current list
*/
exports.append = function (source, operator) {
var append = $tw.utils.parseStringArray(operator.operand, "true"),
results = prepare_results(source),
count = parseInt(operator.suffix) || append.length;
return (append.length === 0) ? results :
(operator.prefix) ? results.concat(append.slice(-count)) :
results.concat(append.slice(0, count));
};
/*
Prepends the items listed in the operand array to the head of the current list
*/
exports.prepend = function (source, operator) {
var prepend = $tw.utils.parseStringArray(operator.operand, "true"),
results = prepare_results(source),
count = $tw.utils.getInt(operator.suffix,prepend.length);
return (prepend.length === 0) ? results :
(operator.prefix) ? prepend.slice(-count).concat(results) :
prepend.slice(0, count).concat(results);
};
/*
Prepends the items listed in the operand array to the head of the current list
*/
exports.prepend = function (source, operator) {
var prepend = $tw.utils.parseStringArray(operator.operand, "true"),
results = prepare_results(source),
count = $tw.utils.getInt(operator.suffix,prepend.length);
return (prepend.length === 0) ? results :
(operator.prefix) ? prepend.slice(-count).concat(results) :
prepend.slice(0, count).concat(results);
};
/*
Returns all items from the current list except the items listed in the operand array
*/
exports.remove = function (source, operator) {
var array = $tw.utils.parseStringArray(operator.operand, "true"),
results = prepare_results(source),
count = parseInt(operator.suffix) || array.length,
p,
len,
index;
len = array.length - 1;
for (p = 0; p < count; ++p) {
if (operator.prefix) {
index = results.indexOf(array[len - p]);
} else {
index = results.indexOf(array[p]);
}
if (index !== -1) {
results.splice(index, 1);
}
}
return results;
};
/*
Returns all items from the current list except the items listed in the operand array
*/
exports.remove = function (source, operator) {
var array = $tw.utils.parseStringArray(operator.operand, "true"),
results = prepare_results(source),
count = parseInt(operator.suffix) || array.length,
p,
len,
index;
len = array.length - 1;
for (p = 0; p < count; ++p) {
if (operator.prefix) {
index = results.indexOf(array[len - p]);
} else {
index = results.indexOf(array[p]);
}
if (index !== -1) {
results.splice(index, 1);
}
}
return results;
};
/*
Returns all items from the current list sorted in the order of the items in the operand array
*/
exports.sortby = function (source, operator) {
var results = prepare_results(source);
if (!results || results.length < 2) {
return results;
}
var lookup = $tw.utils.parseStringArray(operator.operand, "true");
results.sort(function (a, b) {
return lookup.indexOf(a) - lookup.indexOf(b);
});
return results;
};
/*
Returns all items from the current list sorted in the order of the items in the operand array
*/
exports.sortby = function (source, operator) {
var results = prepare_results(source);
if (!results || results.length < 2) {
return results;
}
var lookup = $tw.utils.parseStringArray(operator.operand, "true");
results.sort(function (a, b) {
return lookup.indexOf(a) - lookup.indexOf(b);
});
return results;
};
/*
Removes all duplicate items from the current list
*/
exports.unique = function (source, operator) {
var results = prepare_results(source);
var set = results.reduce(function (a, b) {
if (a.indexOf(b) < 0) {
a.push(b);
}
return a;
}, []);
return set;
};
var cycleValueInArray = function(results,operands,stepSize) {
var resultsIndex,
step = stepSize || 1,
i = 0,
opLength = operands.length,
nextOperandIndex;
for(i; i < opLength; i++) {
resultsIndex = results.indexOf(operands[i]);
if(resultsIndex !== -1) {
break;
}
}
if(resultsIndex !== -1) {
i = i + step;
nextOperandIndex = (i < opLength ? i : i - opLength);
if(operands.length > 1) {
results.splice(resultsIndex,1,operands[nextOperandIndex]);
} else {
results.splice(resultsIndex,1);
}
} else {
results.push(operands[0]);
}
return results;
}
/*
Toggles an item in the current list.
*/
exports.toggle = function(source,operator) {
return cycleValueInArray(prepare_results(source),operator.operands);
}
exports.cycle = function(source,operator) {
var results = prepare_results(source),
operands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, "true") : [""]),
step = $tw.utils.getInt(operator.operands[1]||"",1);
if(step < 0) {
operands.reverse();
step = Math.abs(step);
}
return cycleValueInArray(results,operands,step);
}
/*
Removes all duplicate items from the current list
*/
exports.unique = function (source, operator) {
var results = prepare_results(source);
var set = results.reduce(function (a, b) {
if (a.indexOf(b) < 0) {
a.push(b);
}
return a;
}, []);
return set;
};
})();

View File

@@ -121,7 +121,7 @@ FieldIndexer.prototype.update = function(updateDescriptor) {
indexEntry[value].push(updateDescriptor["new"].tiddler.fields.title);
}
}
});
});
}
};

View File

@@ -65,7 +65,7 @@ TagSubIndexer.prototype.rebuild = function() {
} else {
self.index[tag].titles.push(title);
}
});
});
});
};
@@ -83,7 +83,7 @@ TagSubIndexer.prototype.lookup = function(tag) {
if(!indexRecord.isSorted) {
if(this.indexer.wiki.sortByList) {
indexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);
}
}
indexRecord.isSorted = true;
}
return indexRecord.titles;

View File

@@ -12,7 +12,7 @@ Initialise basic platform $:/info/ tiddlers
/*global $tw: false */
"use strict";
exports.getInfoTiddlerFields = function() {
exports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {
var mapBoolean = function(value) {return value ? "yes" : "no";},
infoTiddlerFields = [];
// Basics
@@ -22,7 +22,7 @@ exports.getInfoTiddlerFields = function() {
if($tw.browser) {
// Document location
var setLocationProperty = function(name,value) {
infoTiddlerFields.push({title: "$:/info/url/" + name, text: value});
infoTiddlerFields.push({title: "$:/info/url/" + name, text: value});
},
location = document.location;
setLocationProperty("full", (location.toString()).split("#")[0]);
@@ -36,6 +36,13 @@ exports.getInfoTiddlerFields = function() {
// Screen size
infoTiddlerFields.push({title: "$:/info/browser/screen/width", text: window.screen.width.toString()});
infoTiddlerFields.push({title: "$:/info/browser/screen/height", text: window.screen.height.toString()});
// Dark mode through event listener on MediaQueryList
var mqList = window.matchMedia("(prefers-color-scheme: dark)"),
getDarkModeTiddler = function() {return {title: "$:/info/darkmode", text: mqList.matches ? "yes" : "no"};};
infoTiddlerFields.push(getDarkModeTiddler());
mqList.addListener(function(event) {
updateInfoTiddlersCallback([getDarkModeTiddler()]);
});
// Language
infoTiddlerFields.push({title: "$:/info/browser/language", text: navigator.language || ""});
}

View File

@@ -285,13 +285,17 @@ KeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {
};
KeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {
return event.ctrlKey && !event.shiftKey && !event.altKey ? "ctrl" :
event.shiftKey && !event.ctrlKey && !event.altKey? "shift" :
event.ctrlKey && event.shiftKey && !event.altKey ? "ctrl-shift" :
event.altKey && !event.shiftKey && !event.ctrlKey ? "alt" :
event.altKey && event.shiftKey && !event.ctrlKey ? "alt-shift" :
event.altKey && event.ctrlKey && !event.shiftKey ? "ctrl-alt" :
event.altKey && event.shiftKey && event.ctrlKey ? "ctrl-alt-shift" : "normal";
return event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? "ctrl" :
event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? "shift" :
event.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? "ctrl-shift" :
event.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? "alt" :
event.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? "alt-shift" :
event.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? "ctrl-alt" :
event.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? "ctrl-alt-shift" :
event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? "meta" :
event.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? "meta-ctrl" :
event.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? "meta-ctrl-shift" :
event.metaKey && event.ctrlKey && event.shiftKey && event.altKey ? "meta-ctrl-alt-shift" : "normal";
};
KeyboardManager.prototype.getShortcutTiddlerList = function() {

View File

@@ -2,6 +2,7 @@
title: $:/core/modules/macros/unusedtitle.js
type: application/javascript
module-type: macro
Macro to return a new title that is unused in the wiki. It can be given a name as a base.
\*/
(function(){
@@ -10,25 +11,25 @@ Macro to return a new title that is unused in the wiki. It can be given a name a
/*global $tw: false */
"use strict";
/*
Information about this macro
*/
exports.name = "unusedtitle";
exports.params = [
{name: "baseName"},
{name: "options"}
{name: "separator"},
{name: "template"}
];
/*
Run the macro
*/
exports.run = function(baseName, options) {
exports.run = function(baseName,separator,template) {
separator = separator || " ";
if(!baseName) {
baseName = $tw.language.getString("DefaultNewTiddlerTitle");
}
return this.wiki.generateNewTitle(baseName, options);
// $tw.wiki.generateNewTitle = function(baseTitle,options)
// options.prefix must be a string!
return this.wiki.generateNewTitle(baseName, {"prefix": separator, "template": template});
};
})();

View File

@@ -23,10 +23,12 @@ var HtmlParser = function(type,text,options) {
type: "element",
tag: "iframe",
attributes: {
src: {type: "string", value: src},
sandbox: {type: "string", value: ""}
src: {type: "string", value: src}
}
}];
if($tw.wiki.getTiddlerText("$:/config/HtmlParser/DisableSandbox","no") !== "yes") {
this.tree[0].attributes.sandbox = {type: "string", value: $tw.wiki.getTiddlerText("$:/config/HtmlParser/SandboxTokens","")};
}
};
exports["text/html"] = HtmlParser;

View File

@@ -39,6 +39,7 @@ exports["image/webp"] = ImageParser;
exports["image/heic"] = ImageParser;
exports["image/heif"] = ImageParser;
exports["image/x-icon"] = ImageParser;
exports["image/vnd.microsoft.icon"] = ImageParser;
})();

View File

@@ -132,7 +132,7 @@ exports.parseMacroParameter = function(source,pos) {
start: pos
};
// Define our regexp
var reMacroParameter = /(?:([A-Za-z0-9\-_]+)\s*:)?(?:\s*(?:"""([\s\S]*?)"""|"([^"]*)"|'([^']*)'|\[\[([^\]]*)\]\]|([^\s>"'=]+)))/g;
var reMacroParameter = /(?:([A-Za-z0-9\-_]+)\s*:)?(?:\s*(?:"""([\s\S]*?)"""|"([^"]*)"|'([^']*)'|\[\[([^\]]*)\]\]|((?:(?:>(?!>))|[^\s>"'])+)))/g;
// Skip whitespace
pos = $tw.utils.skipWhiteSpace(source,pos);
// Look for the parameter

View File

@@ -31,7 +31,7 @@ exports.findNextMatch = function(startPos) {
this.matchRegExp.lastIndex = startPos;
this.match = this.matchRegExp.exec(this.parser.source);
if(this.match) {
this.endMatchRegExp.lastIndex = startPos + this.match[0].length;
this.endMatchRegExp.lastIndex = this.match.index + this.match[0].length;
this.endMatch = this.endMatchRegExp.exec(this.parser.source);
if(this.endMatch) {
return this.match.index;

View File

@@ -31,7 +31,7 @@ exports.findNextMatch = function(startPos) {
this.matchRegExp.lastIndex = startPos;
this.match = this.matchRegExp.exec(this.parser.source);
if(this.match) {
this.endMatchRegExp.lastIndex = startPos + this.match[0].length;
this.endMatchRegExp.lastIndex = this.match.index + this.match[0].length;
this.endMatch = this.endMatchRegExp.exec(this.parser.source);
if(this.endMatch) {
return this.match.index;

View File

@@ -53,17 +53,12 @@ exports.parse = function() {
tag.isBlock = this.is.block || hasLineBreak;
// Parse the body if we need to
if(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {
var reEndString = "</" + $tw.utils.escapeRegExp(tag.tag) + ">",
reEnd = new RegExp("(" + reEndString + ")","mg");
var reEndString = "</" + $tw.utils.escapeRegExp(tag.tag) + ">";
if(hasLineBreak) {
tag.children = this.parser.parseBlocks(reEndString);
} else {
tag.children = this.parser.parseInlineRun(reEnd);
}
reEnd.lastIndex = this.parser.pos;
var endMatch = reEnd.exec(this.parser.source);
if(endMatch && endMatch.index === this.parser.pos) {
this.parser.pos = endMatch.index + endMatch[0].length;
var reEnd = new RegExp("(" + reEndString + ")","mg");
tag.children = this.parser.parseInlineRun(reEnd,{eatTerminator: true});
}
}
// Return the tag

View File

@@ -36,7 +36,7 @@ exports.parse = function() {
// Move past the pragma invocation
this.parser.pos = this.matchRegExp.lastIndex;
// Parse the filter terminated by a line break
var reMatch = /(.*)(\r?\n)|$/mg;
var reMatch = /(.*)(?:$|\r?\n)/mg;
reMatch.lastIndex = this.parser.pos;
var match = reMatch.exec(this.parser.source);
this.parser.pos = reMatch.lastIndex;

View File

@@ -21,40 +21,36 @@ exports.types = {block: true};
exports.init = function(parser) {
this.parser = parser;
// Regexp to match
this.matchRegExp = /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\r?\n|$)/mg;
};
exports.findNextMatch = function(startPos) {
var nextStart = startPos;
// Try parsing at all possible macrocall openers until we match
while((nextStart = this.parser.source.indexOf("<<",nextStart)) >= 0) {
var nextCall = $tw.utils.parseMacroInvocation(this.parser.source,nextStart);
if(nextCall) {
var c = this.parser.source.charAt(nextCall.end);
// Ensure EOL after parsed macro
// If we didn't need to support IE, we'd just use /(?:\r?\n|$)/ym
if ((c === "") || (c === "\n") || ((c === "\r") && this.parser.source.charAt(nextCall.end+1) === "\n")) {
this.nextCall = nextCall;
return nextStart;
}
}
nextStart += 2;
}
return undefined;
};
/*
Parse the most recent match
*/
exports.parse = function() {
// Get all the details of the match
var macroName = this.match[1],
paramString = this.match[2];
// Move past the macro call
this.parser.pos = this.matchRegExp.lastIndex;
var params = [],
reParam = /\s*(?:([A-Za-z0-9\-_]+)\s*:)?(?:\s*(?:"""([\s\S]*?)"""|"([^"]*)"|'([^']*)'|\[\[([^\]]*)\]\]|([^"'\s]+)))/mg,
paramMatch = reParam.exec(paramString);
while(paramMatch) {
// Process this parameter
var paramInfo = {
value: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]
};
if(paramMatch[1]) {
paramInfo.name = paramMatch[1];
}
params.push(paramInfo);
// Find the next match
paramMatch = reParam.exec(paramString);
}
return [{
type: "macrocall",
name: macroName,
params: params,
isBlock: true
}];
var call = this.nextCall;
call.isBlock = true;
this.nextCall = null;
this.parser.pos = call.end;
return [call];
};
})();

View File

@@ -21,39 +21,29 @@ exports.types = {inline: true};
exports.init = function(parser) {
this.parser = parser;
// Regexp to match
this.matchRegExp = /<<([^\s>]+)\s*([\s\S]*?)>>/mg;
};
exports.findNextMatch = function(startPos) {
var nextStart = startPos;
// Try parsing at all possible macrocall openers until we match
while((nextStart = this.parser.source.indexOf("<<",nextStart)) >= 0) {
this.nextCall = $tw.utils.parseMacroInvocation(this.parser.source,nextStart);
if(this.nextCall) {
return nextStart;
}
nextStart += 2;
}
return undefined;
};
/*
Parse the most recent match
*/
exports.parse = function() {
// Get all the details of the match
var macroName = this.match[1],
paramString = this.match[2];
// Move past the macro call
this.parser.pos = this.matchRegExp.lastIndex;
var params = [],
reParam = /\s*(?:([A-Za-z0-9\-_]+)\s*:)?(?:\s*(?:"""([\s\S]*?)"""|"([^"]*)"|'([^']*)'|\[\[([^\]]*)\]\]|([^"'\s]+)))/mg,
paramMatch = reParam.exec(paramString);
while(paramMatch) {
// Process this parameter
var paramInfo = {
value: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]
};
if(paramMatch[1]) {
paramInfo.name = paramMatch[1];
}
params.push(paramInfo);
// Find the next match
paramMatch = reParam.exec(paramString);
}
return [{
type: "macrocall",
name: macroName,
params: params
}];
var call = this.nextCall;
this.nextCall = null;
this.parser.pos = call.end;
return [call];
};
})();

View File

@@ -161,7 +161,7 @@ exports.parse = function() {
// Move the caption to the first row if it isn't already
if(table.children.length !== 1) {
table.children.pop(); // Take rowContainer out of the children array
table.children.splice(0,0,rowContainer); // Insert it at the bottom
table.children.splice(0,0,rowContainer); // Insert it at the bottom
}
// Set the alignment - TODO: figure out why TW did this
// rowContainer.attributes.align = rowCount === 0 ? "top" : "bottom";

View File

@@ -25,6 +25,14 @@ Attributes are stored as hashmaps of the following objects:
/*global $tw: false */
"use strict";
/*
type: content type of text
text: text to be parsed
options: see below:
parseAsInline: true to parse text as inline instead of block
wiki: reference to wiki to use
_canonical_uri: optional URI of content if text is missing or empty
*/
var WikiParser = function(type,text,options) {
this.wiki = options.wiki;
var self = this;
@@ -33,19 +41,6 @@ var WikiParser = function(type,text,options) {
this.loadRemoteTiddler(options._canonical_uri);
text = $tw.language.getRawString("LazyLoadingWarning");
}
// Initialise the classes if we don't have them already
if(!this.pragmaRuleClasses) {
WikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules("wikirule","pragma",$tw.WikiRuleBase);
this.setupRules(WikiParser.prototype.pragmaRuleClasses,"$:/config/WikiParserRules/Pragmas/");
}
if(!this.blockRuleClasses) {
WikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules("wikirule","block",$tw.WikiRuleBase);
this.setupRules(WikiParser.prototype.blockRuleClasses,"$:/config/WikiParserRules/Block/");
}
if(!this.inlineRuleClasses) {
WikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules("wikirule","inline",$tw.WikiRuleBase);
this.setupRules(WikiParser.prototype.inlineRuleClasses,"$:/config/WikiParserRules/Inline/");
}
// Save the parse text
this.type = type || "text/vnd.tiddlywiki";
this.source = text || "";
@@ -54,13 +49,38 @@ var WikiParser = function(type,text,options) {
this.configTrimWhiteSpace = false;
// Set current parse position
this.pos = 0;
// Instantiate the pragma parse rules
this.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,"pragma",0);
// Instantiate the parser block and inline rules
this.blockRules = this.instantiateRules(this.blockRuleClasses,"block",0);
this.inlineRules = this.instantiateRules(this.inlineRuleClasses,"inline",0);
// Parse any pragmas
// Start with empty output
this.tree = [];
// Assemble the rule classes we're going to use
var pragmaRuleClasses, blockRuleClasses, inlineRuleClasses;
if(options.rules) {
pragmaRuleClasses = options.rules.pragma;
blockRuleClasses = options.rules.block;
inlineRuleClasses = options.rules.inline;
} else {
// Setup the rule classes if we don't have them already
if(!this.pragmaRuleClasses) {
WikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules("wikirule","pragma",$tw.WikiRuleBase);
this.setupRules(WikiParser.prototype.pragmaRuleClasses,"$:/config/WikiParserRules/Pragmas/");
}
pragmaRuleClasses = this.pragmaRuleClasses;
if(!this.blockRuleClasses) {
WikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules("wikirule","block",$tw.WikiRuleBase);
this.setupRules(WikiParser.prototype.blockRuleClasses,"$:/config/WikiParserRules/Block/");
}
blockRuleClasses = this.blockRuleClasses;
if(!this.inlineRuleClasses) {
WikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules("wikirule","inline",$tw.WikiRuleBase);
this.setupRules(WikiParser.prototype.inlineRuleClasses,"$:/config/WikiParserRules/Inline/");
}
inlineRuleClasses = this.inlineRuleClasses;
}
// Instantiate the pragma parse rules
this.pragmaRules = this.instantiateRules(pragmaRuleClasses,"pragma",0);
// Instantiate the parser block and inline rules
this.blockRules = this.instantiateRules(blockRuleClasses,"block",0);
this.inlineRules = this.instantiateRules(inlineRuleClasses,"inline",0);
// Parse any pragmas
var topBranch = this.parsePragmas();
// Parse the text into inline runs or blocks
if(options.parseAsInline) {
@@ -358,7 +378,7 @@ WikiParser.prototype.pushTextWidget = function(array,text) {
text = $tw.utils.trim(text);
}
if(text) {
array.push({type: "text", text: text});
array.push({type: "text", text: text});
}
};
@@ -386,22 +406,18 @@ Amend the rules used by this instance of the parser
WikiParser.prototype.amendRules = function(type,names) {
names = names || [];
// Define the filter function
var keepFilter;
var target;
if(type === "only") {
keepFilter = function(name) {
return names.indexOf(name) !== -1;
};
target = true;
} else if(type === "except") {
keepFilter = function(name) {
return names.indexOf(name) === -1;
};
target = false;
} else {
return;
}
// Define a function to process each of our rule arrays
var processRuleArray = function(ruleArray) {
for(var t=ruleArray.length-1; t>=0; t--) {
if(!keepFilter(ruleArray[t].rule.name)) {
if((names.indexOf(ruleArray[t].rule.name) === -1) === target) {
ruleArray.splice(t,1);
}
}

View File

@@ -153,7 +153,7 @@ SaverHandler.prototype.saveWiki = function(options) {
var self = this,
method = options.method || "save";
// Ignore autosave if disabled
if(method === "autosave" && this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes") {
if(method === "autosave" && ($tw.config.disableAutoSave || this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes")) {
return false;
}
var variables = options.variables || {},
@@ -197,8 +197,12 @@ SaverHandler.prototype.isDirty = function() {
Update the document body with the class "tc-dirty" if the wiki has unsaved/unsynced changes
*/
SaverHandler.prototype.updateDirtyStatus = function() {
var self = this;
if($tw.browser) {
$tw.utils.toggleClass(document.body,"tc-dirty",this.isDirty());
$tw.utils.each($tw.windows,function(win) {
$tw.utils.toggleClass(win.document.body,"tc-dirty",self.isDirty());
});
}
};

View File

@@ -0,0 +1,60 @@
/*\
title: $:/core/modules/savers/custom.js
type: application/javascript
module-type: saver
Looks for `window.$tw.customSaver` first on the current window, then
on the parent window (of an iframe). If present, the saver must define
save: function(text,method,callback) { ... }
and the saver may define
priority: number
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var findSaver = function(window) {
try {
return window && window.$tw && window.$tw.customSaver;
} catch (err) {
// Catching the exception is the most reliable way to detect cross-origin iframe errors.
// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw
// Uncaught DOMException: Permission denied to access property "$tw" on cross-origin object
console.log({ msg: "custom saver is disabled", reason: err });
return null;
}
}
var saver = findSaver(window) || findSaver(window.parent) || {};
var CustomSaver = function(wiki) {
};
CustomSaver.prototype.save = function(text,method,callback) {
return saver.save(text, method, callback);
};
/*
Information about this saver
*/
CustomSaver.prototype.info = {
name: "custom",
priority: saver.priority || 4000,
capabilities: ["save","autosave"]
};
/*
Static method that returns true if this saver is capable of working
*/
exports.canSave = function(wiki) {
return !!(saver.save);
};
/*
Create an instance of this saver
*/
exports.create = function(wiki) {
return new CustomSaver(wiki);
};
})();

View File

@@ -26,12 +26,13 @@ GitHubSaver.prototype.save = function(text,method,callback) {
repo = this.wiki.getTiddlerText("$:/GitHub/Repo"),
path = this.wiki.getTiddlerText("$:/GitHub/Path",""),
filename = this.wiki.getTiddlerText("$:/GitHub/Filename"),
branch = this.wiki.getTiddlerText("$:/GitHub/Branch") || "master",
branch = this.wiki.getTiddlerText("$:/GitHub/Branch") || "main",
endpoint = this.wiki.getTiddlerText("$:/GitHub/ServerURL") || "https://api.github.com",
headers = {
"Accept": "application/vnd.github.v3+json",
"Content-Type": "application/json;charset=UTF-8",
"Authorization": "Basic " + window.btoa(username + ":" + password)
"Authorization": "Basic " + window.btoa(username + ":" + password),
"If-None-Match": ""
};
// Bail if we don't have everything we need
if(!username || !password || !repo || !filename) {

View File

@@ -89,9 +89,12 @@ PutSaver.prototype.save = function(text,method,callback) {
if(err) {
// response is textual: "XMLHttpRequest error code: 412"
var status = Number(err.substring(err.indexOf(':') + 2, err.length))
if(status === 412) { // edit conflict
var message = $tw.language.getString("Error/EditConflict");
callback(message);
if(status === 412) { // file changed on server
callback($tw.language.getString("Error/PutEditConflict"));
} else if(status === 401) { // authentication required
callback($tw.language.getString("Error/PutUnauthorized"));
} else if(status === 403) { // permission denied
callback($tw.language.getString("Error/PutForbidden"));
} else {
callback(err); // fail
}

View File

@@ -28,17 +28,29 @@ UploadSaver.prototype.save = function(text,method,callback) {
password = $tw.utils.getPassword("upload"),
uploadDir = this.wiki.getTextReference("$:/UploadDir") || ".",
uploadFilename = this.wiki.getTextReference("$:/UploadFilename") || "index.html",
uploadWithUrlOnly = this.wiki.getTextReference("$:/UploadWithUrlOnly") || "no",
url = this.wiki.getTextReference("$:/UploadURL");
// Bail out if we don't have the bits we need
if(!username || username.toString().trim() === "" || !password || password.toString().trim() === "") {
return false;
if (uploadWithUrlOnly === "yes") {
// The url is good enough. No need for a username and password.
// Assume the server uses some other kind of auth mechanism.
if(!url || url.toString().trim() === "") {
return false;
}
}
else {
// Require username and password to be present.
// Assume the server uses the standard UploadPlugin username/password.
if(!username || username.toString().trim() === "" || !password || password.toString().trim() === "") {
return false;
}
}
// Construct the url if not provided
if(!url) {
url = "http://" + username + ".tiddlyspot.com/store.cgi";
}
// Assemble the header
var boundary = "---------------------------" + "AaB03x";
var boundary = "---------------------------" + "AaB03x";
var uploadFormName = "UploadPlugin";
var head = [];
head.push("--" + boundary + "\r\nContent-disposition: form-data; name=\"UploadPlugin\"\r\n");

View File

@@ -17,9 +17,8 @@ exports.method = "GET";
exports.path = /^\/favicon.ico$/;
exports.handler = function(request,response,state) {
response.writeHead(200, {"Content-Type": "image/x-icon"});
var buffer = state.wiki.getTiddlerText("$:/favicon.ico","");
response.end(buffer,"base64");
state.sendResponse(200,{"Content-Type": "image/x-icon"},buffer,"base64");
};
}());

View File

@@ -34,10 +34,7 @@ exports.handler = function(request,response,state) {
content = content;
type = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : "application/octet-stream");
}
response.writeHead(status,{
"Content-Type": type
});
response.end(content);
state.sendResponse(status,{"Content-Type": type},content);
});
};

View File

@@ -12,38 +12,16 @@ GET /
/*global $tw: false */
"use strict";
var zlib = require("zlib");
exports.method = "GET";
exports.path = /^\/$/;
exports.handler = function(request,response,state) {
var acceptEncoding = request.headers["accept-encoding"];
if(!acceptEncoding) {
acceptEncoding = "";
}
var text = state.wiki.renderTiddler(state.server.get("root-render-type"),state.server.get("root-tiddler")),
responseHeaders = {
"Content-Type": state.server.get("root-serve-type")
};
/*
If the gzip=yes flag for `listen` is set, check if the user agent permits
compression. If so, compress our response. Note that we use the synchronous
functions from zlib to stay in the imperative style. The current `Server`
doesn't depend on this, and we may just as well use the async versions.
*/
if(state.server.enableGzip) {
if (/\bdeflate\b/.test(acceptEncoding)) {
responseHeaders["Content-Encoding"] = "deflate";
text = zlib.deflateSync(text);
} else if (/\bgzip\b/.test(acceptEncoding)) {
responseHeaders["Content-Encoding"] = "gzip";
text = zlib.gzipSync(text);
}
}
response.writeHead(200,responseHeaders);
response.end(text);
state.sendResponse(200,responseHeaders,text);
};
}());

View File

@@ -22,11 +22,12 @@ exports.handler = function(request,response,state) {
response.writeHead(401,{
"WWW-Authenticate": 'Basic realm="Please provide your username and password to login to ' + state.server.servername + '"'
});
response.end();
response.end();
} else {
// Redirect to the root wiki if login worked
var location = ($tw.syncadaptor && $tw.syncadaptor.host)? $tw.syncadaptor.host: "/";
response.writeHead(302,{
Location: "/"
Location: location
});
response.end();
}

View File

@@ -17,17 +17,17 @@ exports.method = "GET";
exports.path = /^\/status$/;
exports.handler = function(request,response,state) {
response.writeHead(200, {"Content-Type": "application/json"});
var text = JSON.stringify({
username: state.authenticatedUsername || state.server.get("anon-username") || "",
anonymous: !state.authenticatedUsername,
read_only: !state.server.isAuthorized("writers",state.authenticatedUsername),
sse_enabled: state.server.get("sse-enabled") === "yes",
space: {
recipe: "default"
},
tiddlywiki_version: $tw.version
});
response.end(text,"utf8");
state.sendResponse(200,{"Content-Type": "application/json"},text,"utf8");
};
}());

View File

@@ -32,9 +32,9 @@ exports.handler = function(request,response,state) {
renderTemplate = renderTemplate || state.server.get("tiddler-render-template");
}
var text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});
// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS
response.writeHead(200);
response.end(text,"utf8");
state.sendResponse(200,{},text,"utf8");
} else {
response.writeHead(404);
response.end();

View File

@@ -36,8 +36,7 @@ exports.handler = function(request,response,state) {
tiddlerFields.revision = state.wiki.getChangeCount(title);
tiddlerFields.bag = "default";
tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki";
response.writeHead(200, {"Content-Type": "application/json"});
response.end(JSON.stringify(tiddlerFields),"utf8");
state.sendResponse(200,{"Content-Type": "application/json"},JSON.stringify(tiddlerFields),"utf8");
} else {
response.writeHead(404);
response.end();

View File

@@ -28,9 +28,11 @@ exports.handler = function(request,response,state) {
return;
}
}
if(state.wiki.getTiddlerText("$:/config/SyncSystemTiddlersFromServer") === "no") {
filter += "+[!is[system]]";
}
var excludeFields = (state.queryParameters.exclude || "text").split(","),
titles = state.wiki.filterTiddlers(filter);
response.writeHead(200, {"Content-Type": "application/json"});
var tiddlers = [];
$tw.utils.each(titles,function(title) {
var tiddler = state.wiki.getTiddler(title);
@@ -42,7 +44,7 @@ exports.handler = function(request,response,state) {
}
});
var text = JSON.stringify(tiddlers);
response.end(text,"utf8");
state.sendResponse(200,{"Content-Type": "application/json"},text,"utf8");
};
}());

View File

@@ -0,0 +1,70 @@
/*\
title: $:/core/modules/server/server-sent-events.js
type: application/javascript
module-type: library
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
parameters:
prefix - usually the plugin path, such as `plugins/tiddlywiki/tiddlyweb`. The
route will match `/events/${prefix}` exactly.
handler - a function that will be called each time a request comes in with the
request and state from the route and an emit function to call.
*/
var ServerSentEvents = function ServerSentEvents(prefix, handler) {
this.handler = handler;
this.prefix = prefix;
};
ServerSentEvents.prototype.getExports = function() {
return {
bodyFormat: "stream",
method: "GET",
path: new RegExp("^/events/" + this.prefix + "$"),
handler: this.handleEventRequest.bind(this)
};
};
ServerSentEvents.prototype.handleEventRequest = function(request,response,state) {
if(ServerSentEvents.prototype.isEventStreamRequest(request)) {
response.writeHead(200, {
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
"Connection": "keep-alive"
});
this.handler(request,state,this.emit.bind(this,response),this.end.bind(this,response));
} else {
response.writeHead(406,"Not Acceptable",{});
response.end();
}
};
ServerSentEvents.prototype.isEventStreamRequest = function(request) {
return request.headers.accept &&
request.headers.accept.match(/^text\/event-stream/);
};
ServerSentEvents.prototype.emit = function(response,event,data) {
if(typeof event !== "string" || event.indexOf("\n") !== -1) {
throw new Error("Type must be a single-line string");
}
if(typeof data !== "string" || data.indexOf("\n") !== -1) {
throw new Error("Data must be a single-line string");
}
response.write("event: " + event + "\ndata: " + data + "\n\n", "utf8");
};
ServerSentEvents.prototype.end = function(response) {
response.end();
};
exports.ServerSentEvents = ServerSentEvents;
})();

View File

@@ -17,7 +17,9 @@ if($tw.node) {
fs = require("fs"),
url = require("url"),
path = require("path"),
querystring = require("querystring");
querystring = require("querystring"),
crypto = require("crypto"),
zlib = require("zlib");
}
/*
@@ -40,13 +42,15 @@ function Server(options) {
if(options.variables[variable]) {
this.variables[variable] = options.variables[variable];
}
}
}
}
$tw.utils.extend({},this.defaultVariables,options.variables);
// Initialise CSRF
this.csrfDisable = this.get("csrf-disable") === "yes";
// Initialize Gzip compression
this.enableGzip = this.get("gzip") === "yes";
// Initialize browser-caching
this.enableBrowserCache = this.get("use-browser-cache") === "yes";
// Initialise authorization
var authorizedUserName = (this.get("username") && this.get("password")) ? this.get("username") : "(anon)";
this.authorizationPrincipals = {
@@ -78,6 +82,71 @@ function Server(options) {
this.transport = require(this.protocol);
}
/*
Send a response to the client. This method checks if the response must be sent
or if the client alrady has the data cached. If that's the case only a 304
response will be transmitted and the browser will use the cached data.
Only requests with status code 200 are considdered for caching.
request: request instance passed to the handler
response: response instance passed to the handler
statusCode: stauts code to send to the browser
headers: response headers (they will be augmented with an `Etag` header)
data: the data to send (passed to the end method of the response instance)
encoding: the encoding of the data to send (passed to the end method of the response instance)
*/
function sendResponse(request,response,statusCode,headers,data,encoding) {
if(this.enableBrowserCache && (statusCode == 200)) {
var hash = crypto.createHash('md5');
// Put everything into the hash that could change and invalidate the data that
// the browser already stored. The headers the data and the encoding.
hash.update(data);
hash.update(JSON.stringify(headers));
if(encoding) {
hash.update(encoding);
}
var contentDigest = hash.digest("hex");
// RFC 7232 section 2.3 mandates for the etag to be enclosed in quotes
headers["Etag"] = '"' + contentDigest + '"';
headers["Cache-Control"] = "max-age=0, must-revalidate";
// Check if any of the hashes contained within the if-none-match header
// matches the current hash.
// If one matches, do not send the data but tell the browser to use the
// cached data.
// We do not implement "*" as it makes no sense here.
var ifNoneMatch = request.headers["if-none-match"];
if(ifNoneMatch) {
var matchParts = ifNoneMatch.split(",").map(function(etag) {
return etag.replace(/^[ "]+|[ "]+$/g, "");
});
if(matchParts.indexOf(contentDigest) != -1) {
response.writeHead(304,headers);
response.end();
return;
}
}
}
/*
If the gzip=yes is set, check if the user agent permits compression. If so,
compress our response if the raw data is bigger than 2k. Compressing less
data is inefficient. Note that we use the synchronous functions from zlib
to stay in the imperative style. The current `Server` doesn't depend on
this, and we may just as well use the async versions.
*/
if(this.enableGzip && (data.length > 2048)) {
var acceptEncoding = request.headers["accept-encoding"] || "";
if(/\bdeflate\b/.test(acceptEncoding)) {
headers["Content-Encoding"] = "deflate";
data = zlib.deflateSync(data);
} else if(/\bgzip\b/.test(acceptEncoding)) {
headers["Content-Encoding"] = "gzip";
data = zlib.gzipSync(data);
}
}
response.writeHead(statusCode,headers);
response.end(data,encoding);
}
Server.prototype.defaultVariables = {
port: "8080",
host: "127.0.0.1",
@@ -89,7 +158,8 @@ Server.prototype.defaultVariables = {
"system-tiddler-render-type": "text/plain",
"system-tiddler-render-template": "$:/core/templates/wikified-tiddler",
"debug-level": "none",
"gzip": "no"
"gzip": "no",
"use-browser-cache": "no"
};
Server.prototype.get = function(name) {
@@ -167,13 +237,14 @@ Server.prototype.requestHandler = function(request,response,options) {
state.urlInfo = url.parse(request.url);
state.queryParameters = querystring.parse(state.urlInfo.query);
state.pathPrefix = options.pathPrefix || this.get("path-prefix") || "";
state.sendResponse = sendResponse.bind(self,request,response);
// Get the principals authorized to access this resource
var authorizationType = this.methodMappings[request.method] || "readers";
// Check for the CSRF header if this is a write
if(!this.csrfDisable && authorizationType === "writers" && request.headers["x-requested-with"] !== "TiddlyWiki") {
response.writeHead(403,"'X-Requested-With' header required to login to '" + this.servername + "'");
response.end();
return;
return;
}
// Check whether anonymous access is granted
state.allowAnon = this.isAuthorized(authorizationType,null);
@@ -182,7 +253,7 @@ Server.prototype.requestHandler = function(request,response,options) {
if(!this.authenticators[0].authenticateRequest(request,response,state)) {
// Bail if we failed (the authenticator will have sent the response)
return;
}
}
}
// Authorize with the authenticated username
if(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {

View File

@@ -17,7 +17,7 @@ exports.name = "favicon";
exports.platforms = ["browser"];
exports.after = ["startup"];
exports.synchronous = true;
// Favicon tiddler
var FAVICON_TITLE = "$:/favicon.ico";

View File

@@ -21,29 +21,37 @@ exports.synchronous = true;
var TITLE_INFO_PLUGIN = "$:/temp/info-plugin";
exports.startup = function() {
// Function to bake the info plugin with new tiddlers
var updateInfoPlugin = function(tiddlerFieldsArray) {
// Get the existing tiddlers
var json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});
// Add the new ones
$tw.utils.each(tiddlerFieldsArray,function(fields) {
if(fields && fields.title) {
json.tiddlers[fields.title] = fields;
}
});
// Bake the info tiddlers into a plugin. We use the non-standard plugin-type "info" because ordinary plugins are only registered asynchronously after being loaded dynamically
var fields = {
title: TITLE_INFO_PLUGIN,
type: "application/json",
"plugin-type": "info",
text: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)
};
$tw.wiki.addTiddler(new $tw.Tiddler(fields));
};
// Collect up the info tiddlers
var infoTiddlerFields = {};
// Give each info module a chance to fill in as many info tiddlers as they want
var tiddlerFieldsArray = [];
// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them
$tw.modules.forEachModuleOfType("info",function(title,moduleExports) {
if(moduleExports && moduleExports.getInfoTiddlerFields) {
var tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);
$tw.utils.each(tiddlerFieldsArray,function(fields) {
if(fields) {
infoTiddlerFields[fields.title] = fields;
}
});
Array.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));
}
});
// Bake the info tiddlers into a plugin. We use the non-standard plugin-type "info" because ordinary plugins are only registered asynchronously after being loaded dynamically
var fields = {
title: TITLE_INFO_PLUGIN,
type: "application/json",
"plugin-type": "info",
text: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)
};
$tw.wiki.addTiddler(new $tw.Tiddler(fields));
$tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);
$tw.wiki.registerPluginTiddlers("info");
updateInfoPlugin(tiddlerFieldsArray);
var changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);
$tw.wiki.registerPluginTiddlers("info",[TITLE_INFO_PLUGIN]);
$tw.wiki.unpackPluginTiddlers();
};

View File

@@ -22,6 +22,9 @@ exports.startup = function() {
if($tw.node) {
$tw.modules.applyMethods("utils-node",$tw.utils);
}
if($tw.browser) {
$tw.modules.applyMethods("utils-browser",$tw.utils);
}
$tw.modules.applyMethods("global",$tw);
$tw.modules.applyMethods("config",$tw.config);
$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap("tiddlerfield");

View File

@@ -24,6 +24,7 @@ var PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = "$:/config/RegisterPluginType/";
exports.startup = function() {
$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "no"});
$tw.wiki.addEventListener("change",function(changes) {
// Work out which of the changed tiddlers are plugins that we need to reregister
var changesToProcess = [],
requireReloadDueToPluginChange = false;
$tw.utils.each(Object.keys(changes),function(title) {
@@ -38,6 +39,7 @@ exports.startup = function() {
}
}
});
// Issue warning if any of the tiddlers require a reload
if(requireReloadDueToPluginChange) {
$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "yes"});
}
@@ -45,12 +47,35 @@ exports.startup = function() {
if(changesToProcess.length > 0) {
var changes = $tw.wiki.readPluginInfo(changesToProcess);
if(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {
var changedShadowTiddlers = {};
// Collect the shadow tiddlers of any deleted plugins
$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {
var pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);
if(pluginInfo) {
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
changedShadowTiddlers[title] = true;
});
}
});
// Collect the shadow tiddlers of any modified plugins
$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {
var pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);
if(pluginInfo) {
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
changedShadowTiddlers[title] = false;
});
}
});
// (Re-)register any modified plugins
$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);
// Unregister any deleted plugins
$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);
// Unpack the shadow tiddlers
$tw.wiki.unpackPluginTiddlers();
// Queue change events for the changed shadow tiddlers
$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {
$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);
});
}
}
});

Some files were not shown because too many files have changed in this diff Show More