1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-06-26 07:13:15 +00:00

Merge branch 'master' into conditional-shortcut-syntax

This commit is contained in:
Jeremy Ruston 2023-10-14 09:21:20 +01:00
commit c689b8e812
198 changed files with 714 additions and 183 deletions

View File

@ -104,13 +104,15 @@ node $TW5_BUILD_TIDDLYWIKI \
--build favicon static index \ --build favicon static index \
|| exit 1 || exit 1
# /empty.html Empty # /empty.html Empty
# /empty.hta For Internet Explorer # /empty.hta For Internet Explorer
# /empty-external-core.html External core empty
# /tiddlywikicore-<version>.js Core plugin javascript
node $TW5_BUILD_TIDDLYWIKI \ node $TW5_BUILD_TIDDLYWIKI \
./editions/empty \ ./editions/empty \
--verbose \ --verbose \
--output $TW5_BUILD_OUTPUT \ --output $TW5_BUILD_OUTPUT \
--build empty \ --build empty emptyexternalcore \
|| exit 1 || exit 1

View File

@ -2674,6 +2674,18 @@ $tw.hooks.addHook = function(hookName,definition) {
} }
}; };
/*
Delete hooks from the hashmap
*/
$tw.hooks.removeHook = function(hookName,definition) {
if($tw.utils.hop($tw.hooks.names,hookName)) {
var p = $tw.hooks.names[hookName].indexOf(definition);
if(p !== -1) {
$tw.hooks.names[hookName].splice(p, 1);
}
}
};
/* /*
Invoke the hook by key Invoke the hook by key
*/ */

View File

@ -3,4 +3,4 @@ title: $:/language/Exporters/
StaticRiver: Static HTML StaticRiver: Static HTML
JsonFile: JSON file JsonFile: JSON file
CsvFile: CSV file CsvFile: CSV file
TidFile: ".tid" file TidFile: TID text file

View File

@ -19,7 +19,7 @@ The following options are supported:
** ''yes'' will "explode" plugins into separate tiddler files and save them to the plugin directory within the wiki folder ** ''yes'' will "explode" plugins into separate tiddler files and save them to the plugin directory within the wiki folder
** ''no'' will suppress exploding plugins into their constituent tiddler files. It will save the plugin as a single JSON tiddler in the tiddlers folder ** ''no'' will suppress exploding plugins into their constituent tiddler files. It will save the plugin as a single JSON tiddler in the tiddlers folder
Note that both ''explodePlugins'' options will produce wiki folders that build the same exact same original wiki. The difference lies in how plugins are represented in the wiki folder. Note that both ''explodePlugins'' options will produce wiki folders that build the exact same original wiki. The difference lies in how plugins are represented in the wiki folder.
A common usage is to convert a TiddlyWiki HTML file into a wiki folder: A common usage is to convert a TiddlyWiki HTML file into a wiki folder:
@ -31,4 +31,4 @@ Save the plugin to the tiddlers directory of the target wiki folder:
``` ```
tiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder explodePlugins=no tiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder explodePlugins=no
``` ```

View File

@ -1,5 +1,5 @@
title: $:/language/Docs/Types/image/svg+xml title: $:/language/Docs/Types/image/svg+xml
description: Structured Vector Graphics image description: SVG image
name: image/svg+xml name: image/svg+xml
group: Image group: Image
group-sort: 1 group-sort: 1

View File

@ -1,5 +1,5 @@
title: $:/language/Docs/Types/image/x-icon title: $:/language/Docs/Types/image/x-icon
description: ICO format icon file description: ICO icon
name: image/x-icon name: image/x-icon
group: Image group: Image
group-sort: 1 group-sort: 1

View File

@ -60,7 +60,7 @@ function FramedEngine(options) {
this.domNode.value = this.value; this.domNode.value = this.value;
} }
// Set the attributes // Set the attributes
if(this.widget.editType) { if(this.widget.editType && this.widget.editTag !== "textarea") {
this.domNode.setAttribute("type",this.widget.editType); this.domNode.setAttribute("type",this.widget.editType);
} }
if(this.widget.editPlaceholder) { if(this.widget.editPlaceholder) {

View File

@ -34,7 +34,7 @@ function SimpleEngine(options) {
this.domNode.value = this.value; this.domNode.value = this.value;
} }
// Set the attributes // Set the attributes
if(this.widget.editType) { if(this.widget.editType && this.widget.editTag !== "textarea") {
this.domNode.setAttribute("type",this.widget.editType); this.domNode.setAttribute("type",this.widget.editType);
} }
if(this.widget.editPlaceholder) { if(this.widget.editPlaceholder) {

View File

@ -28,12 +28,8 @@ function getAllFilterOperators() {
Export our filter function Export our filter function
*/ */
exports.all = function(source,operator,options) { exports.all = function(source,operator,options) {
// Get our suboperators
var allFilterOperators = getAllFilterOperators();
// Cycle through the suboperators accumulating their results
var results = new $tw.utils.LinkedList(),
subops = operator.operand.split("+");
// Check for common optimisations // Check for common optimisations
var subops = operator.operand.split("+");
if(subops.length === 1 && subops[0] === "") { if(subops.length === 1 && subops[0] === "") {
return source; return source;
} else if(subops.length === 1 && subops[0] === "tiddlers") { } else if(subops.length === 1 && subops[0] === "tiddlers") {
@ -46,6 +42,10 @@ exports.all = function(source,operator,options) {
return options.wiki.eachShadowPlusTiddlers; return options.wiki.eachShadowPlusTiddlers;
} }
// Do it the hard way // Do it the hard way
// Get our suboperators
var allFilterOperators = getAllFilterOperators();
// Cycle through the suboperators accumulating their results
var results = new $tw.utils.LinkedList();
for(var t=0; t<subops.length; t++) { for(var t=0; t<subops.length; t++) {
var subop = allFilterOperators[subops[t]]; var subop = allFilterOperators[subops[t]];
if(subop) { if(subop) {

View File

@ -81,6 +81,9 @@ exports.parse = function() {
} }
return [tiddlerNode]; return [tiddlerNode];
} else { } else {
// No template or text reference is provided, so we'll use a blank target. Otherwise we'll generate
// a transclude widget that transcludes the current tiddler, often leading to recursion errors
transcludeNode.attributes["$tiddler"] = {name: "$tiddler", type: "string", value: ""};
return [transcludeNode]; return [transcludeNode];
} }
} }

View File

@ -79,6 +79,9 @@ exports.parse = function() {
} }
return [tiddlerNode]; return [tiddlerNode];
} else { } else {
// No template or text reference is provided, so we'll use a blank target. Otherwise we'll generate
// a transclude widget that transcludes the current tiddler, often leading to recursion errors
transcludeNode.attributes["$tiddler"] = {name: "$tiddler", type: "string", value: ""};
return [transcludeNode]; return [transcludeNode];
} }
} }

View File

@ -265,6 +265,8 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
// If we are providing an counter variable then we must refresh the items, otherwise we can rearrange them // If we are providing an counter variable then we must refresh the items, otherwise we can rearrange them
var hasRefreshed = false,t; var hasRefreshed = false,t;
if(this.counterName) { if(this.counterName) {
var mustRefreshOldLast = false;
var oldLength = this.children.length;
// Cycle through the list and remove and re-insert the first item that has changed, and all the remaining items // Cycle through the list and remove and re-insert the first item that has changed, and all the remaining items
for(t=0; t<this.list.length; t++) { for(t=0; t<this.list.length; t++) {
if(hasRefreshed || !this.children[t] || this.children[t].parseTreeNode.itemTitle !== this.list[t]) { if(hasRefreshed || !this.children[t] || this.children[t].parseTreeNode.itemTitle !== this.list[t]) {
@ -272,6 +274,9 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
this.removeListItem(t); this.removeListItem(t);
} }
this.insertListItem(t,this.list[t]); this.insertListItem(t,this.list[t]);
if(!hasRefreshed && t === oldLength) {
mustRefreshOldLast = true;
}
hasRefreshed = true; hasRefreshed = true;
} else { } else {
// Refresh the item we're reusing // Refresh the item we're reusing
@ -279,6 +284,12 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
hasRefreshed = hasRefreshed || refreshed; hasRefreshed = hasRefreshed || refreshed;
} }
} }
// If items were inserted then we must recreate the item that used to be at the last position as it is no longer last
if(mustRefreshOldLast && oldLength > 0) {
var oldLastIdx = oldLength-1;
this.removeListItem(oldLastIdx);
this.insertListItem(oldLastIdx,this.list[oldLastIdx]);
}
// If there are items to remove and we have not refreshed then recreate the item that will now be at the last position // If there are items to remove and we have not refreshed then recreate the item that will now be at the last position
if(!hasRefreshed && this.children.length > this.list.length) { if(!hasRefreshed && this.children.length > this.list.length) {
this.removeListItem(this.list.length-1); this.removeListItem(this.list.length-1);

View File

@ -1,5 +1,9 @@
title: $:/core/ui/EditTemplate/body/default title: $:/core/ui/EditTemplate/body/default
\function edit-preview-state()
[{$:/config/ShowEditPreview/PerTiddler}!match[yes]then[$:/state/showeditpreview]] :else[<qualify "$:/state/showeditpreview">] +[get[text]] :else[[no]]
\end
\define config-visibility-title() \define config-visibility-title()
$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$ $:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$
\end \end
@ -10,15 +14,16 @@ $:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$
\whitespace trim \whitespace trim
<$let <$let
edit-preview-state={{{ [{$:/config/ShowEditPreview/PerTiddler}!match[yes]then[$:/state/showeditpreview]] :else[<qualify "$:/state/showeditpreview">] }}}
importTitle=<<qualify $:/ImportImage>> importTitle=<<qualify $:/ImportImage>>
importState=<<qualify $:/state/ImportImage>> > importState=<<qualify $:/state/ImportImage>> >
<$dropzone importTitle=<<importTitle>> autoOpenOnImport="no" contentTypesFilter={{$:/config/Editor/ImportContentTypesFilter}} class="tc-dropzone-editor" enable={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}} filesOnly="yes" actions=<<importFileActions>> > <$dropzone importTitle=<<importTitle>> autoOpenOnImport="no" contentTypesFilter={{$:/config/Editor/ImportContentTypesFilter}} class="tc-dropzone-editor" enable={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}} filesOnly="yes" actions=<<importFileActions>> >
<$reveal stateTitle=<<edit-preview-state>> type="match" text="yes" tag="div"> <div>
<div class="tc-tiddler-preview"> <div class={{{ [function[edit-preview-state]match[yes]then[tc-tiddler-preview]] +[join[ ]] }}}>
<$transclude tiddler="$:/core/ui/EditTemplate/body/editor" mode="inline"/> <$transclude tiddler="$:/core/ui/EditTemplate/body/editor" mode="inline"/>
<$list filter="[function[edit-preview-state]match[yes]]" variable="ignore">
<div class="tc-tiddler-preview-preview" data-tiddler-title={{!!draft.title}} data-tags={{!!tags}}> <div class="tc-tiddler-preview-preview" data-tiddler-title={{!!draft.title}} data-tags={{!!tags}}>
<$transclude tiddler={{$:/state/editpreviewtype}} mode="inline"> <$transclude tiddler={{$:/state/editpreviewtype}} mode="inline">
@ -29,13 +34,12 @@ $:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$
</div> </div>
</$list>
</div> </div>
</$reveal>
<$reveal stateTitle=<<edit-preview-state>> type="nomatch" text="yes" tag="div"> </div>
<$transclude tiddler="$:/core/ui/EditTemplate/body/editor" mode="inline"/>
</$reveal>
</$dropzone> </$dropzone>
</$let> </$let>

View File

@ -10,7 +10,7 @@ first-search-filter: [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[d
<em class="tc-edit tc-small-gap-right"><<lingo Type/Prompt>></em> <em class="tc-edit tc-small-gap-right"><<lingo Type/Prompt>></em>
<div class="tc-type-selector-dropdown-wrapper"> <div class="tc-type-selector-dropdown-wrapper">
<div class="tc-type-selector"><$fieldmangler> <div class="tc-type-selector"><$fieldmangler>
<$macrocall $name="keyboard-driven-input" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes" configTiddlerFilter="[[$:/core/ui/EditTemplate/type]]" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter="[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$button> <$macrocall $name="keyboard-driven-input" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes" configTiddlerFilter="[[$:/core/ui/EditTemplate/type]]" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter="[<typeInputTiddler>] [<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$button>
</$fieldmangler></div> </$fieldmangler></div>
<div class="tc-block-dropdown-wrapper"> <div class="tc-block-dropdown-wrapper">

View File

@ -9,11 +9,17 @@ button-classes: tc-text-editor-toolbar-item-start-group
shortcuts: ((preview)) shortcuts: ((preview))
\whitespace trim \whitespace trim
<$let
edit-preview-state={{{ [{$:/config/ShowEditPreview/PerTiddler}!match[yes]then[$:/state/showeditpreview]] :else[<qualify "$:/state/showeditpreview">] }}}
>
<$reveal state=<<edit-preview-state>> type="match" text="yes" tag="span"> <$reveal state=<<edit-preview-state>> type="match" text="yes" tag="span">
{{$:/core/images/preview-open}} {{$:/core/images/preview-open}}
<$action-setfield $tiddler=<<edit-preview-state>> $value="no"/> <$action-setfield $tiddler=<<edit-preview-state>> $value="no"/>
<$action-sendmessage $message="tm-edit-text-operation" $param="focus-editor"/>
</$reveal> </$reveal>
<$reveal state=<<edit-preview-state>> type="nomatch" text="yes" tag="span"> <$reveal state=<<edit-preview-state>> type="nomatch" text="yes" tag="span">
{{$:/core/images/preview-closed}} {{$:/core/images/preview-closed}}
<$action-setfield $tiddler=<<edit-preview-state>> $value="yes"/> <$action-setfield $tiddler=<<edit-preview-state>> $value="yes"/>
<$action-sendmessage $message="tm-edit-text-operation" $param="focus-editor"/>
</$reveal> </$reveal>
</$let>

View File

@ -20,7 +20,7 @@ code-body: yes
<$navigator story="$:/StoryList" history="$:/HistoryList" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}> <$navigator story="$:/StoryList" history="$:/HistoryList" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>
<$dropzone enable=<<tv-enable-drag-and-drop>>> <$dropzone enable=<<tv-enable-drag-and-drop>> class="tc-dropzone tc-page-container-inner">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]" variable="listItem"> <$list filter="[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]" variable="listItem">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -1,2 +1,2 @@
title: $:/favicon.ico title: $:/favicon.ico
type: image/x-icon type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -1,2 +1,2 @@
title: $:/favicon.ico title: $:/favicon.ico
type: image/x-icon type: image/png

View File

@ -1,9 +1,14 @@
created: 20141122200310516 created: 20141122200310516
modified: 20201213161842776 modified: 20230923031318421
tags: Mechanisms
title: HookMechanism title: HookMechanism
type: text/vnd.tiddlywiki type: text/vnd.tiddlywiki
The hook mechanism provides a way for plugins to intercept and modify default functionality. Hooks are added as follows: The hook mechanism provides a way for plugins to intercept and modify default functionality.
!! Add a hook
Hooks are added as follows:
```js ```js
/* /*
@ -13,6 +18,8 @@ handler: function to be called when hook is invoked
$tw.hooks.addHook(name,handler); $tw.hooks.addHook(name,handler);
``` ```
!!! Params and return
The handler function will be called with parameters that depend on the specific hook in question, but they always follow the pattern `handler(value,params...)` The handler function will be called with parameters that depend on the specific hook in question, but they always follow the pattern `handler(value,params...)`
* ''value'': an optional value that is to be transformed by the hook function * ''value'': an optional value that is to be transformed by the hook function
@ -20,11 +27,29 @@ The handler function will be called with parameters that depend on the specific
If required by the hook in question, the handler function must return the modified ''value''. If required by the hook in question, the handler function must return the modified ''value''.
!!! Multiple handlers
Multiple handlers can be assigned to the same name using repeated calls. When a hook is invoked by name all registered functions will be called sequentially in their order of addition. Multiple handlers can be assigned to the same name using repeated calls. When a hook is invoked by name all registered functions will be called sequentially in their order of addition.
Note that the ''value'' passed to the subsequent hook function will be the return value of the previous hook function. Note that the ''value'' passed to the subsequent hook function will be the return value of the previous hook function.
Though not essential care should be taken to ensure that hooks are added before they are invoked. For example: [[Hook: th-opening-default-tiddlers-list]] should ideally be added before the story startup module is invoked otherwise any hook specified additions to the default tiddlers will not be seen on the initial loading of the page, though will be visible if the user clicks the home button. Be careful not to `addHook` in widget's `render` method, which will be call several times. You could `addHook` in methods that only called once, e.g. the constructor of widget class. Otherwise you should `removeHook` then add it again.
!!! Timing of registration
Though not essential care should be taken to ensure that hooks are added before they are invoked.
For example: [[Hook: th-opening-default-tiddlers-list]] should ideally be added before the story startup module is invoked. Otherwise any hook specified additions to the default tiddlers will not be seen on the initial loading of the page, though will be visible if the user clicks the home button.
!! Remove a hook
You should clean up the callback when your widget is going to unmount.
```js
$tw.hooks.removeHook(handler)
```
The `handler` should be the same function instance you used in `addHook` (check by `===`). You can save it to `this.xxxHookHandler` on your widget, and call `removeHook` in [[destroy method|Widget `destroy` method examples]].
!! Example !! Example

View File

@ -12,6 +12,9 @@
"empty": [ "empty": [
"--render","$:/core/save/all","empty.html","text/plain", "--render","$:/core/save/all","empty.html","text/plain",
"--render","$:/core/save/all","empty.hta","text/plain"], "--render","$:/core/save/all","empty.hta","text/plain"],
"emptyexternalcore": [
"--render","$:/core/save/offline-external-js","empty-external-core.html","text/plain",
"--render","$:/core/templates/tiddlywiki5.js","[[tiddlywikicore-]addsuffix<version>addsuffix[.js]]","text/plain"],
"externalimages": [ "externalimages": [
"--savetiddlers","[is[image]]","images", "--savetiddlers","[is[image]]","images",
"--setfield","[is[image]]","_canonical_uri","$:/core/templates/canonical-uri-external-image","text/plain", "--setfield","[is[image]]","_canonical_uri","$:/core/templates/canonical-uri-external-image","text/plain",
@ -20,7 +23,7 @@
"static": [ "static": [
"--render","$:/core/templates/static.template.html","static.html","text/plain", "--render","$:/core/templates/static.template.html","static.html","text/plain",
"--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain", "--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain",
"--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain", "--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain","$:/core/templates/static.tiddler.html",
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"] "--render","$:/core/templates/static.template.css","static/static.css","text/plain"]
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -1,2 +1,2 @@
title: $:/favicon.ico title: $:/favicon.ico
type: image/x-icon type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -1,2 +1,2 @@
title: $:/favicon.ico title: $:/favicon.ico
type: image/x-icon type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -1,2 +1,2 @@
title: $:/green_favicon.ico title: $:/green_favicon.ico
type: image/x-icon type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -1,2 +0,0 @@
title: $:/favicon.ico
type: image/x-icon

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,2 @@
title: $:/favicon.ico
type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -1,2 +0,0 @@
title: $:/favicon.ico
type: image/x-icon

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,2 @@
title: $:/favicon.ico
type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -1,2 +1,2 @@
title: $:/green_favicon.ico title: $:/green_favicon.ico
type: image/x-icon type: image/png

View File

@ -15,7 +15,7 @@
"static": [ "static": [
"--render","$:/core/templates/static.template.html","static.html","text/plain", "--render","$:/core/templates/static.template.html","static.html","text/plain",
"--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain", "--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain",
"--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain", "--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain","$:/core/templates/static.tiddler.html",
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"] "--render","$:/core/templates/static.template.css","static/static.css","text/plain"]
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -1,2 +0,0 @@
title: $:/favicon.ico
type: image/x-icon

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,2 @@
title: $:/favicon.ico
type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -1,2 +1,2 @@
title: $:/green_favicon.ico title: $:/green_favicon.ico
type: image/x-icon type: image/png

View File

@ -15,7 +15,7 @@
"static": [ "static": [
"--render","$:/core/templates/static.template.html","static.html","text/plain", "--render","$:/core/templates/static.template.html","static.html","text/plain",
"--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain", "--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain",
"--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain", "--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain","$:/core/templates/static.tiddler.html",
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"] "--render","$:/core/templates/static.template.css","static/static.css","text/plain"]
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -1,2 +0,0 @@
title: $:/favicon.ico
type: image/x-icon

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,2 @@
title: $:/favicon.ico
type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -1,2 +0,0 @@
title: $:/favicon.ico
type: image/x-icon

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,2 @@
title: $:/favicon.ico
type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -1,2 +1,2 @@
title: $:/green_favicon.ico title: $:/green_favicon.ico
type: image/x-icon type: image/png

View File

@ -17,8 +17,8 @@
], ],
"library": [ "library": [
"--makelibrary","$:/UpgradeLibrary", "--makelibrary","$:/UpgradeLibrary",
"--savelibrarytiddlers","$:/UpgradeLibrary","[prefix[$:/]] -[[$:/plugins/tiddlywiki/upgrade]] -[[$:/plugins/tiddlywiki/translators]] -[[$:/plugins/tiddlywiki/pluginlibrary]] -[[$:/plugins/tiddlywiki/jasmine]]","recipes/library/tiddlers/","$:/UpgradeLibrary/List", "--savelibrarytiddlers","$:/UpgradeLibrary","[prefix[$:/]] -[[$:/plugins/tiddlywiki/upgrade]] -[[$:/plugins/tiddlywiki/translators]] -[[$:/plugins/tiddlywiki/pluginlibrary]] -[[$:/plugins/tiddlywiki/jasmine]]","recipes/library/tiddlers/","$:/UpgradeLibrary/List",
"--savetiddler","$:/UpgradeLibrary/List","recipes/library/tiddlers.json", "--savetiddler","$:/UpgradeLibrary/List","recipes/library/tiddlers.json",
"--rendertiddler","$:/plugins/tiddlywiki/pluginlibrary/library.template.html","index.html","text/plain"] "--rendertiddler","$:/plugins/tiddlywiki/pluginlibrary/library.template.html","index.html","text/plain"]
} }
} }

View File

@ -4,6 +4,7 @@ modified: 20230820114855583
tags: ReleaseNotes tags: ReleaseNotes
title: Release 5.3.2 title: Release 5.3.2
type: text/vnd.tiddlywiki type: text/vnd.tiddlywiki
description: Under development
//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.3.1...master]]// //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.3.1...master]]//
@ -11,27 +12,50 @@ type: text/vnd.tiddlywiki
Improvements to the following translations: Improvements to the following translations:
* * Chinese
* Polish
* Spanish
! Plugin Improvements
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/1be8f0a9336952d4745d2bd4f2327e353580a272">> comments plugin to use predefined palette colours
! Widget Improvements ! Widget Improvements
* *
! Usability Improvements
* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/7747">> editor preview button to automatically focus the editor
* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/7764">> file type names in the export menu
! Hackability Improvements ! Hackability Improvements
* * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/7737">> an automatic build of the external core TiddlyWiki at https://tiddlywiki.com/empty-external-core.html
* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/7690">> the default page layout to better support CSS grid and flexbox layouts
! Bug Fixes ! Bug Fixes
* * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/7665">> `{{}}` generating a recursion error
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/7758">> ordering of Vanilla stylesheets
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/fa9bfa07a095548eb2f8339b0b1b816d2e6794ef">> missing closing tag in tag-pill-inner macro
* <<.link-badge-removed "https://github.com/Jermolene/TiddlyWiki5/issues/7732">> invalid "type" attribute from textarea elements generated by the EditTextWidget
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/7749">> editor "type" dropdown state tiddlers
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/7712">> handling of "counter-last" variable when appending items with the ListWidget
* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/6088">> upgrade download link in Firefox
! Node.js Improvements ! Node.js Improvements
* *
! Performance Improvements
* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/7702">> performance of predefined patterns with [[all Operator]]
* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/issues/7671">> favicon format to PNG
! Developer Improvements ! Developer Improvements
* * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/7751">> global hook handling to support removing hooks
! Acknowledgements ! Acknowledgements
@ -39,22 +63,16 @@ Improvements to the following translations:
<<.contributors """ <<.contributors """
AnthonyMuscio AnthonyMuscio
btheado BramChen
catter-fly BuckarooBanzay
cmo-pomerium BurningTreeC
CrossEye EvidentlyCube
flibbles joebordes
hffqyd kookma
lilscribby
linonetwo linonetwo
Marxsal
mateuszwilczek mateuszwilczek
pille1842
pmario pmario
rmunn rmunn
saqimtiaz simonbaird
stevesunypoly T1mL3arn
TiddlyTweeter
twMat
yaisog
""">> """>>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

View File

@ -1,2 +0,0 @@
title: $:/favicon.ico
type: image/x-icon

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -0,0 +1,2 @@
title: $:/favicon.ico
type: image/png

View File

@ -20,4 +20,4 @@
"favicon": [ "favicon": [
"--savetiddler","$:/favicon.ico","favicon.ico"] "--savetiddler","$:/favicon.ico","favicon.ico"]
} }
} }

View File

@ -17,7 +17,7 @@
"static": [ "static": [
"--render","$:/core/templates/static.template.html","static.html","text/plain", "--render","$:/core/templates/static.template.html","static.html","text/plain",
"--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain", "--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain",
"--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain", "--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain","$:/core/templates/static.tiddler.html",
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"], "--render","$:/core/templates/static.template.css","static/static.css","text/plain"],
"tiddlywikicore": [ "tiddlywikicore": [
"--render","$:/core/templates/tiddlywiki5.js","[[tiddlywikicore-]addsuffix<version>addsuffix[.js]]","text/plain"] "--render","$:/core/templates/tiddlywiki5.js","[[tiddlywikicore-]addsuffix<version>addsuffix[.js]]","text/plain"]

View File

@ -15,7 +15,7 @@
"static": [ "static": [
"--render","$:/core/templates/static.template.html","static.html","text/plain", "--render","$:/core/templates/static.template.html","static.html","text/plain",
"--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain", "--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain",
"--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain", "--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain","$:/core/templates/static.tiddler.html",
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"] "--render","$:/core/templates/static.template.css","static/static.css","text/plain"]
} }
} }

View File

@ -527,6 +527,29 @@ describe("Widget module", function() {
expect(wrapper.children[0].children[15].sequenceNumber).toBe(53); expect(wrapper.children[0].children[15].sequenceNumber).toBe(53);
}); });
var testCounterLast = function(oldList, newList) {
return function() {
var wiki = new $tw.Wiki();
// Add some tiddlers
wiki.addTiddler({title: "Numbers", text: "", list: oldList});
var text = "<$list filter='[list[Numbers]]' variable='item' counter='c'><<item>><$text text={{{ [<c-last>match[no]then[, ]] }}} /></$list>";
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
// Render the widget node to the DOM
var wrapper = renderWidgetNode(widgetNode);
// Test the rendering
expect(wrapper.innerHTML).toBe("<p>" + oldList.split(' ').join(', ') + "</p>");
// Append a number
wiki.addTiddler({title: "Numbers", text: "", list: newList});
refreshWidgetNode(widgetNode,wrapper,["Numbers"]);
expect(wrapper.innerHTML).toBe("<p>" + newList.split(' ').join(', ') + "</p>");
}
}
it("the list widget with counter-last should update correctly when list is appended", testCounterLast("1 2 3 4", "1 2 3 4 5"));
it("the list widget with counter-last should update correctly when last item is removed", testCounterLast("1 2 3 4", "1 2 3"));
it("the list widget with counter-last should update correctly when first item is inserted", testCounterLast("1 2 3 4", "0 1 2 3 4"));
it("the list widget with counter-last should update correctly when first item is removed", testCounterLast("1 2 3 4", "2 3 4"));
it("should deal with the list widget followed by other widgets", function() { it("should deal with the list widget followed by other widgets", function() {
var wiki = new $tw.Wiki(); var wiki = new $tw.Wiki();
// Add some tiddlers // Add some tiddlers

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -21,7 +21,7 @@
"static": [ "static": [
"--render","$:/core/templates/static.template.html","static.html","text/plain", "--render","$:/core/templates/static.template.html","static.html","text/plain",
"--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain", "--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain",
"--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain","$:/core/templates/static.tiddler.html", "--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain","$:/core/templates/static.tiddler.html",
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"] "--render","$:/core/templates/static.template.css","static/static.css","text/plain"]
}, },
"config": { "config": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -1,2 +0,0 @@
title: $:/favicon.ico
type: image/x-icon

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,2 @@
title: $:/favicon.ico
type: image/png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

View File

@ -1,3 +1,3 @@
title: $:/_tw_shared/favicons/classic.tiddlywiki.com title: $:/_tw_shared/favicons/classic.tiddlywiki.com
type: image/x-icon type: image/png
tags: TiddlyWikiSitesMenu tags: TiddlyWikiSitesMenu

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -1,3 +1,3 @@
title: $:/_tw_shared/favicons/links.tiddlywiki.org title: $:/_tw_shared/favicons/links.tiddlywiki.org
type: image/x-icon type: image/png
tags: TiddlyWikiSitesMenu tags: TiddlyWikiSitesMenu

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -1,3 +1,3 @@
title: $:/_tw_shared/favicons/tiddlywiki.com.dev title: $:/_tw_shared/favicons/tiddlywiki.com.dev
type: image/x-icon type: image/png
tags: TiddlyWikiSitesMenu tags: TiddlyWikiSitesMenu

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -1,3 +1,3 @@
title: $:/_tw_shared/favicons/tiddlywiki.com title: $:/_tw_shared/favicons/tiddlywiki.com
type: image/x-icon type: image/png
tags: TiddlyWikiSitesMenu tags: TiddlyWikiSitesMenu

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -1,3 +1,3 @@
title: $:/_tw_shared/favicons/tiddlywiki.com.prerelease title: $:/_tw_shared/favicons/tiddlywiki.com.prerelease
type: image/x-icon type: image/png
tags: TiddlyWikiSitesMenu tags: TiddlyWikiSitesMenu

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -1,3 +1,3 @@
title: $:/_tw_shared/favicons/tiddlywiki.com.upgrade title: $:/_tw_shared/favicons/tiddlywiki.com.upgrade
type: image/x-icon type: image/png
tags: TiddlyWikiSitesMenu tags: TiddlyWikiSitesMenu

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

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