mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-07-20 18:48:55 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed71c8262a | ||
|
|
2ececf21c7 | ||
|
|
7516d96eed | ||
|
|
4bf7e9d192 | ||
|
|
04cd3081e4 | ||
|
|
d27716c1e0 | ||
|
|
7f7f36d986 | ||
|
|
86a4e18134 | ||
|
|
304858c7c5 | ||
|
|
7ececf9e0f | ||
|
|
521e530e11 | ||
|
|
4c29dae4af | ||
|
|
f5317dc225 | ||
|
|
c952450c2e | ||
|
|
1eb7ec4402 | ||
|
|
9a0bbf831b | ||
|
|
a30854a4c7 | ||
|
|
869557f7d1 | ||
|
|
856057be81 | ||
|
|
c9f1154643 | ||
|
|
748f04c9e3 |
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
# Default to the current version number for building the plugin library
|
# Default to the current version number for building the plugin library
|
||||||
|
|
||||||
if [ -z "$TW5_BUILD_VERSION" ]; then
|
if [ -z "$TW5_BUILD_VERSION" ]; then
|
||||||
TW5_BUILD_VERSION=v5.4.1.
|
TW5_BUILD_VERSION=v5.5.0.
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]"
|
echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]"
|
||||||
|
|||||||
@@ -9,15 +9,14 @@ Serve tiddlers over http
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
let fs, url, path, querystring, crypto, zlib;
|
let fs, path, crypto, zlib, URL;
|
||||||
|
|
||||||
if($tw.node) {
|
if($tw.node) {
|
||||||
fs = require("fs"),
|
fs = require("fs"),
|
||||||
url = require("url"),
|
|
||||||
path = require("path"),
|
path = require("path"),
|
||||||
querystring = require("querystring"),
|
|
||||||
crypto = require("crypto"),
|
crypto = require("crypto"),
|
||||||
zlib = require("zlib");
|
zlib = require("zlib");
|
||||||
|
URL = require("url").URL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -260,8 +259,8 @@ Server.prototype.requestHandler = function(request,response,options) {
|
|||||||
state.wiki = options.wiki || self.wiki;
|
state.wiki = options.wiki || self.wiki;
|
||||||
state.boot = options.boot || self.boot;
|
state.boot = options.boot || self.boot;
|
||||||
state.server = self;
|
state.server = self;
|
||||||
state.urlInfo = url.parse(request.url);
|
state.urlInfo = new URL(request.url, "http://localhost");
|
||||||
state.queryParameters = querystring.parse(state.urlInfo.query);
|
state.queryParameters = Object.fromEntries(state.urlInfo.searchParams);
|
||||||
state.pathPrefix = options.pathPrefix || this.get("path-prefix") || "";
|
state.pathPrefix = options.pathPrefix || this.get("path-prefix") || "";
|
||||||
// Enable CORS
|
// Enable CORS
|
||||||
if(this.corsEnable) {
|
if(this.corsEnable) {
|
||||||
|
|||||||
@@ -255,4 +255,5 @@ ViewTemplateTags/Caption: View Template Tags
|
|||||||
ViewTemplateTags/Hint: This rule cascade is used by the default view template to dynamically choose the template for displaying the tags area of a tiddler.
|
ViewTemplateTags/Hint: This rule cascade is used by the default view template to dynamically choose the template for displaying the tags area of a tiddler.
|
||||||
WikiInformation/Caption: Wiki Information
|
WikiInformation/Caption: Wiki Information
|
||||||
WikiInformation/Hint: This page summarises high level information about the configuration of this ~TiddlyWiki. It is designed to enable users to quickly share relevant aspects of the configuration of their ~TiddlyWiki with others, for example when seeking help in one of the forums. No private or personal information is included, and nothing is shared without being explicitly copied and pasted elsewhere
|
WikiInformation/Hint: This page summarises high level information about the configuration of this ~TiddlyWiki. It is designed to enable users to quickly share relevant aspects of the configuration of their ~TiddlyWiki with others, for example when seeking help in one of the forums. No private or personal information is included, and nothing is shared without being explicitly copied and pasted elsewhere
|
||||||
WikiInformation/Drag/Caption: Drag this link to copy this tool to another wiki
|
WikiInformation/Drag/Caption: Drag this link to copy this tool to another wiki
|
||||||
|
WikiInformation/Generate/Caption: Click to generate wiki information report
|
||||||
@@ -22,12 +22,11 @@ exports.tag = function(source,operator,options) {
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Old semantics:
|
// Old semantics:
|
||||||
var tiddlers;
|
|
||||||
if(operator.prefix === "!") {
|
if(operator.prefix === "!") {
|
||||||
// Returns a copy of the input if operator.operand is missing
|
// Returns a copy of the input if operator.operand is missing
|
||||||
tiddlers = options.wiki.getTiddlersWithTag(operator.operand);
|
const excludeTagSet = new Set(options.wiki.getTiddlersWithTag(operator.operand));
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
if(tiddlers.indexOf(title) === -1) {
|
if(!excludeTagSet.has(title)) {
|
||||||
results.push(title);
|
results.push(title);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -39,9 +38,9 @@ exports.tag = function(source,operator,options) {
|
|||||||
return indexedResults;
|
return indexedResults;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tiddlers = options.wiki.getTiddlersWithTag(operator.operand);
|
const includeTagSet = new Set(options.wiki.getTiddlersWithTag(operator.operand));
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
if(tiddlers.indexOf(title) !== -1) {
|
if(includeTagSet.has(title)) {
|
||||||
results.push(title);
|
results.push(title);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -88,10 +88,11 @@ BackSubIndexer.prototype.update = function(updateDescriptor) {
|
|||||||
var newTargets = [],
|
var newTargets = [],
|
||||||
oldTargets = [],
|
oldTargets = [],
|
||||||
self = this;
|
self = this;
|
||||||
if(updateDescriptor.old.exists) {
|
// System tiddlers are never indexed as sources, matching the _init() scan
|
||||||
|
if(updateDescriptor.old.exists && !this.wiki.isSystemTiddler(updateDescriptor.old.tiddler.fields.title)) {
|
||||||
oldTargets = this._getTarget(updateDescriptor.old.tiddler);
|
oldTargets = this._getTarget(updateDescriptor.old.tiddler);
|
||||||
}
|
}
|
||||||
if(updateDescriptor.new.exists) {
|
if(updateDescriptor.new.exists && !this.wiki.isSystemTiddler(updateDescriptor.new.tiddler.fields.title)) {
|
||||||
newTargets = this._getTarget(updateDescriptor.new.tiddler);
|
newTargets = this._getTarget(updateDescriptor.new.tiddler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -528,67 +528,79 @@ exports.parseAttribute = function(source,pos) {
|
|||||||
pos = token.end;
|
pos = token.end;
|
||||||
// Skip whitespace
|
// Skip whitespace
|
||||||
pos = $tw.utils.skipWhiteSpace(source,pos);
|
pos = $tw.utils.skipWhiteSpace(source,pos);
|
||||||
// Look for a string literal
|
do {
|
||||||
var stringLiteral = $tw.utils.parseStringLiteral(source,pos);
|
// Look for a string literal
|
||||||
if(stringLiteral) {
|
var stringLiteral = $tw.utils.parseStringLiteral(source,pos);
|
||||||
pos = stringLiteral.end;
|
if(stringLiteral) {
|
||||||
node.type = "string";
|
pos = stringLiteral.end;
|
||||||
node.value = stringLiteral.value;
|
node.type = "string";
|
||||||
} else {
|
node.value = stringLiteral.value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Look for a filtered value
|
// Look for a filtered value
|
||||||
var filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);
|
var filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);
|
||||||
if(filteredValue) {
|
if(filteredValue) {
|
||||||
pos = filteredValue.end;
|
pos = filteredValue.end;
|
||||||
node.type = "filtered";
|
node.type = "filtered";
|
||||||
node.filter = filteredValue.match[1];
|
node.filter = filteredValue.match[1];
|
||||||
} else {
|
break;
|
||||||
// Look for an indirect value
|
|
||||||
var indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);
|
|
||||||
if(indirectValue) {
|
|
||||||
pos = indirectValue.end;
|
|
||||||
node.type = "indirect";
|
|
||||||
node.textReference = indirectValue.match[1];
|
|
||||||
} else {
|
|
||||||
// Look for a macro invocation value
|
|
||||||
var macroInvocation = $tw.utils.parseMacroInvocationAsTransclusion(source,pos);
|
|
||||||
if(macroInvocation) {
|
|
||||||
pos = macroInvocation.end;
|
|
||||||
node.type = "macro";
|
|
||||||
node.value = macroInvocation;
|
|
||||||
} else {
|
|
||||||
// Look for an MVV reference value
|
|
||||||
var mvvReference = $tw.utils.parseMVVReferenceAsTransclusion(source,pos);
|
|
||||||
if(mvvReference) {
|
|
||||||
pos = mvvReference.end;
|
|
||||||
node.type = "macro";
|
|
||||||
node.value = mvvReference;
|
|
||||||
node.isMVV = true;
|
|
||||||
} else {
|
|
||||||
var substitutedValue = $tw.utils.parseTokenRegExp(source,pos,reSubstitutedValue);
|
|
||||||
if(substitutedValue) {
|
|
||||||
pos = substitutedValue.end;
|
|
||||||
node.type = "substituted";
|
|
||||||
node.rawValue = substitutedValue.match[1] || substitutedValue.match[2];
|
|
||||||
} else {
|
|
||||||
// Look for a unquoted value
|
|
||||||
var unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);
|
|
||||||
if(unquotedValue) {
|
|
||||||
pos = unquotedValue.end;
|
|
||||||
node.type = "string";
|
|
||||||
node.value = unquotedValue.match[1];
|
|
||||||
} else if(source.charAt(pos) === "<" && source.charAt(pos + 1) === "<" && source.indexOf(">>",pos) !== -1) {
|
|
||||||
// Value looks like a macro invocation (starts with << with a closing >> ahead) but does not parse as one. Return null so the enclosing tag fails to parse rather than silently binding the attribute to "true" and treating the remainder as further attributes (restores v5.3.8 behaviour)
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
node.type = "string";
|
|
||||||
node.value = "true";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
// Look for an indirect value
|
||||||
|
var indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);
|
||||||
|
if(indirectValue) {
|
||||||
|
pos = indirectValue.end;
|
||||||
|
node.type = "indirect";
|
||||||
|
node.textReference = indirectValue.match[1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for a macro invocation value
|
||||||
|
var macroInvocation = $tw.utils.parseMacroInvocationAsTransclusion(source,pos);
|
||||||
|
if(macroInvocation) {
|
||||||
|
pos = macroInvocation.end;
|
||||||
|
node.type = "macro";
|
||||||
|
node.value = macroInvocation;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for an MVV reference value
|
||||||
|
var mvvReference = $tw.utils.parseMVVReferenceAsTransclusion(source,pos);
|
||||||
|
if(mvvReference) {
|
||||||
|
pos = mvvReference.end;
|
||||||
|
node.type = "macro";
|
||||||
|
node.value = mvvReference;
|
||||||
|
node.isMVV = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for a substituted value
|
||||||
|
var substitutedValue = $tw.utils.parseTokenRegExp(source,pos,reSubstitutedValue);
|
||||||
|
if(substitutedValue) {
|
||||||
|
pos = substitutedValue.end;
|
||||||
|
node.type = "substituted";
|
||||||
|
node.rawValue = substitutedValue.match[1] || substitutedValue.match[2];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look for a unquoted value
|
||||||
|
var unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);
|
||||||
|
if(unquotedValue) {
|
||||||
|
pos = unquotedValue.end;
|
||||||
|
node.type = "string";
|
||||||
|
node.value = unquotedValue.match[1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(source.charAt(pos) === "<" && source.charAt(pos + 1) === "<" && source.indexOf(">>",pos) !== -1) {
|
||||||
|
// Value looks like a macro invocation (starts with << with a closing >> ahead) but does not parse as one. Return null so the enclosing tag fails to parse rather than silently binding the attribute to "true" and treating the remainder as further attributes (restores v5.3.8 behaviour)
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
node.type = "string";
|
||||||
|
node.value = "true";
|
||||||
|
} while(false);
|
||||||
} else {
|
} else {
|
||||||
// If there is no equals sign or colon, then this is an attribute with no value, defaulting to "true"
|
// If there is no equals sign or colon, then this is an attribute with no value, defaulting to "true"
|
||||||
node.type = "string";
|
node.type = "string";
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ var getCellInfo = function(text, start, length, SEPARATOR) {
|
|||||||
var isCellQuoted = text.charAt(start) === QUOTE;
|
var isCellQuoted = text.charAt(start) === QUOTE;
|
||||||
var cellStart = isCellQuoted ? start + 1 : start;
|
var cellStart = isCellQuoted ? start + 1 : start;
|
||||||
|
|
||||||
if(text.charAt(i) === SEPARATOR) {
|
// A quote licenses a separator inside the cell, so only an unquoted cell reads an immediate separator as empty
|
||||||
|
if(!isCellQuoted && text.charAt(cellStart) === SEPARATOR) {
|
||||||
return [cellStart, cellStart, false];
|
return [cellStart, cellStart, false];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -115,7 +115,9 @@ var TW_Element = function(tag, namespace) {
|
|||||||
this.children = [];
|
this.children = [];
|
||||||
this._style = {}; // Internal style object
|
this._style = {}; // Internal style object
|
||||||
this.style = new TW_Style(this); // Proxy for style management
|
this.style = new TW_Style(this); // Proxy for style management
|
||||||
this.namespaceURI = namespace || "http://www.w3.org/1999/xhtml";
|
// createElementNS with empty-string or null normalises to null (no namespace) per spec.
|
||||||
|
// https://dom.spec.whatwg.org/#dom-document-createelementns
|
||||||
|
this.namespaceURI = namespace !== undefined ? (namespace || null) : "http://www.w3.org/1999/xhtml";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -206,7 +208,16 @@ TW_Element.prototype.addEventListener = function(type,listener,useCapture) {
|
|||||||
|
|
||||||
Object.defineProperty(TW_Element.prototype, "tagName", {
|
Object.defineProperty(TW_Element.prototype, "tagName", {
|
||||||
get: function() {
|
get: function() {
|
||||||
return this.tag || "";
|
if(!this.tag) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
// HTML elements report uppercase tagName per DOM spec. Other namespaces
|
||||||
|
// preserve case. Fakedom only models HTML documents.
|
||||||
|
// https://dom.spec.whatwg.org/#dom-element-tagname
|
||||||
|
if(this.namespaceURI === "http://www.w3.org/1999/xhtml") {
|
||||||
|
return this.tag.toUpperCase();
|
||||||
|
}
|
||||||
|
return this.tag;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Inherit from the base widget class
|
|||||||
DiffTextWidget.prototype = new Widget();
|
DiffTextWidget.prototype = new Widget();
|
||||||
|
|
||||||
DiffTextWidget.prototype.invisibleCharacters = {
|
DiffTextWidget.prototype.invisibleCharacters = {
|
||||||
"\n": "↩︎\n",
|
"\n": "↲\n",
|
||||||
"\r": "⇠",
|
"\r": "⇠",
|
||||||
"\t": "⇥\t"
|
"\t": "⇥\t"
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,13 +4,15 @@ description: create a new journal tiddler
|
|||||||
|
|
||||||
\whitespace trim
|
\whitespace trim
|
||||||
\function get-tags() [<textFieldTags>] [<tagsFieldTags>] +[join[ ]]
|
\function get-tags() [<textFieldTags>] [<tagsFieldTags>] +[join[ ]]
|
||||||
<$let journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>
|
<$let journalTitle=<<now format={{$:/config/NewJournal/Title}}>>
|
||||||
<$wikify name="journalTitle" text="<$transclude $variable='now' format=<<journalTitleTemplate>>/>">
|
textFieldTags={{$:/config/NewJournal/Tags}}
|
||||||
|
tagsFieldTags={{$:/config/NewJournal/Tags!!tags}}
|
||||||
|
journalText={{$:/config/NewJournal/Text}}
|
||||||
|
>
|
||||||
<$reveal type="nomatch" state=<<journalTitle>> text="">
|
<$reveal type="nomatch" state=<<journalTitle>> text="">
|
||||||
<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>
|
<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
<$reveal type="match" state=<<journalTitle>> text="">
|
<$reveal type="match" state=<<journalTitle>> text="">
|
||||||
<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>
|
<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
</$wikify>
|
|
||||||
</$let>
|
</$let>
|
||||||
|
|||||||
@@ -6,30 +6,23 @@ tags: $:/tags/EditTemplate
|
|||||||
\procedure lingo-base() $:/language/EditTemplate/
|
\procedure lingo-base() $:/language/EditTemplate/
|
||||||
|
|
||||||
\procedure tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:"tags")
|
\procedure tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:"tags")
|
||||||
<$wikify name="foregroundColor"
|
<$let foregroundColor=<<contrastcolour target=<<colour>> fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>> >>
|
||||||
text="""<$macrocall $name="contrastcolour"
|
backgroundColor=<<colour>>
|
||||||
target=<<colour>>
|
>
|
||||||
fallbackTarget=<<fallbackTarget>>
|
<span class="tc-tag-label tc-tag-list-item tc-small-gap-right"
|
||||||
colourA=<<colourA>>
|
data-tag-title=<<currentTiddler>>
|
||||||
colourB=<<colourB>>/>
|
style=`color:$(foregroundColor)$; fill:$(foregroundColor)$; background-color:$(backgroundColor)$;`
|
||||||
"""
|
>
|
||||||
>
|
<$transclude tiddler=<<icon>>/>
|
||||||
<$let backgroundColor=<<colour>> >
|
<$view field="title" format="text"/>
|
||||||
<span class="tc-tag-label tc-tag-list-item tc-small-gap-right"
|
<$button class="tc-btn-invisible tc-remove-tag-button"
|
||||||
data-tag-title=<<currentTiddler>>
|
style.fill=<<foregroundColor>>
|
||||||
style=`color:$(foregroundColor)$; fill:$(foregroundColor)$; background-color:$(backgroundColor)$;`
|
|
||||||
>
|
>
|
||||||
<$transclude tiddler=<<icon>>/>
|
<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter="-[{!!title}]"/>
|
||||||
<$view field="title" format="text"/>
|
{{$:/core/images/close-button}}
|
||||||
<$button class="tc-btn-invisible tc-remove-tag-button"
|
</$button>
|
||||||
style.fill=<<foregroundColor>>
|
</span>
|
||||||
>
|
</$let>
|
||||||
<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter="-[{!!title}]"/>
|
|
||||||
{{$:/core/images/close-button}}
|
|
||||||
</$button>
|
|
||||||
</span>
|
|
||||||
</$let>
|
|
||||||
</$wikify>
|
|
||||||
\end
|
\end
|
||||||
|
|
||||||
\procedure tag-body(colour,palette,icon,tagField:"tags")
|
\procedure tag-body(colour,palette,icon,tagField:"tags")
|
||||||
|
|||||||
@@ -16,15 +16,13 @@ title: $:/core/ui/TagPickerTagTemplate
|
|||||||
<$set name="backgroundColor"
|
<$set name="backgroundColor"
|
||||||
value={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}
|
value={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}
|
||||||
>
|
>
|
||||||
<$wikify name="foregroundColor"
|
<$let foregroundColor=<<contrastcolour target=<<backgroundColor>> fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>> >> >
|
||||||
text="""<$macrocall $name="contrastcolour" target=<<backgroundColor>> fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>"""
|
|
||||||
>
|
|
||||||
<span class="tc-tag-label tc-btn-invisible"
|
<span class="tc-tag-label tc-btn-invisible"
|
||||||
style=<<tag-pill-styles>>
|
style=<<tag-pill-styles>>
|
||||||
data-tag-title=<<currentTiddler>>
|
data-tag-title=<<currentTiddler>>
|
||||||
>
|
>
|
||||||
{{||$:/core/ui/TiddlerIcon}}<$view field="title" format="text"/>
|
{{||$:/core/ui/TiddlerIcon}}<$view field="title" format="text"/>
|
||||||
</span>
|
</span>
|
||||||
</$wikify>
|
</$let>
|
||||||
</$set>
|
</$set>
|
||||||
</$button>
|
</$button>
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ description: {{$:/language/Buttons/NewJournalHere/Hint}}
|
|||||||
\whitespace trim
|
\whitespace trim
|
||||||
\procedure journalButton()
|
\procedure journalButton()
|
||||||
<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>
|
<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>
|
||||||
<$wikify name="journalTitle" text="""<$transclude $variable="now" format=<<journalTitleTemplate>>/>""">
|
|
||||||
<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=`[[$(currentTiddlerTag)$]] $(journalTags)$`/>
|
<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=`[[$(currentTiddlerTag)$]] $(journalTags)$`/>
|
||||||
<%if [<tv-config-toolbar-icons>match[yes]] %>
|
<%if [<tv-config-toolbar-icons>match[yes]] %>
|
||||||
{{$:/core/images/new-journal-button}}
|
{{$:/core/images/new-journal-button}}
|
||||||
@@ -16,9 +15,11 @@ description: {{$:/language/Buttons/NewJournalHere/Hint}}
|
|||||||
<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>
|
<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>
|
||||||
</span>
|
</span>
|
||||||
<%endif%>
|
<%endif%>
|
||||||
</$wikify>
|
|
||||||
</$button>
|
</$button>
|
||||||
\end
|
\end
|
||||||
<$let journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} currentTiddlerTag=<<currentTiddler>>>
|
<$let journalTitle=<<now format={{$:/config/NewJournal/Title}}>>
|
||||||
|
journalTags={{$:/config/NewJournal/Tags}}
|
||||||
|
currentTiddlerTag=<<currentTiddler>>
|
||||||
|
>
|
||||||
<<journalButton>>
|
<<journalButton>>
|
||||||
</$let>
|
</$let>
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ This page summarises high level information about the configuration of this ~Tid
|
|||||||
Drag this link to copy this tool to another wiki
|
Drag this link to copy this tool to another wiki
|
||||||
\end intrinsic-lingo-Drag/Caption
|
\end intrinsic-lingo-Drag/Caption
|
||||||
|
|
||||||
|
\procedure intrinsic-lingo-Generate/Caption()
|
||||||
|
Click to generate wiki information report
|
||||||
|
\end intrinsic-lingo-Generate/Caption
|
||||||
|
|
||||||
\procedure lingo(title,mode:"inline")
|
\procedure lingo(title,mode:"inline")
|
||||||
<%if [<title>addprefix<lingo-base>is[shadow]] %>
|
<%if [<title>addprefix<lingo-base>is[shadow]] %>
|
||||||
<$transclude $tiddler={{{ [<title>addprefix<lingo-base>] }}} $mode=<<mode>>/>
|
<$transclude $tiddler={{{ [<title>addprefix<lingo-base>] }}} $mode=<<mode>>/>
|
||||||
@@ -105,7 +109,7 @@ Drag this link to copy this tool to another wiki
|
|||||||
|
|
||||||
<$button>
|
<$button>
|
||||||
<<display-wiki-info-modal>>
|
<<display-wiki-info-modal>>
|
||||||
Click to generate wiki information report
|
<<lingo title:"Generate/Caption">>
|
||||||
</$button>
|
</$button>
|
||||||
|
|
||||||
<$link to="$:/core/ui/ControlPanel/WikiInformation">
|
<$link to="$:/core/ui/ControlPanel/WikiInformation">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
title: $:/config/OfficialPluginLibrary
|
title: $:/config/OfficialPluginLibrary
|
||||||
tags: $:/tags/PluginLibrary
|
tags: $:/tags/PluginLibrary
|
||||||
url: https://tiddlywiki.com/library/v5.4.1/index.html
|
url: https://tiddlywiki.com/library/v5.5.0/index.html
|
||||||
caption: {{$:/language/OfficialPluginLibrary}}
|
caption: {{$:/language/OfficialPluginLibrary}}
|
||||||
|
|
||||||
{{$:/language/OfficialPluginLibrary/Hint}}
|
{{$:/language/OfficialPluginLibrary/Hint}}
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ type: text/vnd.tiddlywiki
|
|||||||
# Ensure the new release banner image is up to date
|
# Ensure the new release banner image is up to date
|
||||||
# Update ''master'' with changes from ''tiddlywiki-com''
|
# Update ''master'' with changes from ''tiddlywiki-com''
|
||||||
# Verify the version numbers in [[$:/config/OfficialPluginLibrary]] in `core/wiki/config/OfficialPluginLibrary.tid`
|
# Verify the version numbers in [[$:/config/OfficialPluginLibrary]] in `core/wiki/config/OfficialPluginLibrary.tid`
|
||||||
# Move the latest release note from the prerelease edition into the tw5.com edition
|
# Adjust the release date and the ''released'' field of the release tiddler (eg, [[Release 5.1.3]])
|
||||||
# Adjust the release date and the ''released'' field of the latest release tiddler (eg, [[Release 5.1.3]])
|
# Update the ''release-introduction'' definition with the new release text, and if necessary the ''description'' field of the release tiddler
|
||||||
# Also adjust the github.com comparison link to point to the tag for the new release
|
|
||||||
# Adjust the tiddler [[TiddlyWiki Archive]] to include the new version number
|
# Adjust the tiddler [[TiddlyWiki Archive]] to include the new version number
|
||||||
# Ensure [[TiddlyWiki Releases]] has the new version as the default tab
|
# Ensure [[TiddlyWiki Releases]] has the new version as the default tab
|
||||||
# Adjust the modified time of HelloThere
|
# Adjust the modified time of HelloThere
|
||||||
@@ -23,7 +22,6 @@ type: text/vnd.tiddlywiki
|
|||||||
# Run `./bin/readme-bld.sh` to build the readme files
|
# Run `./bin/readme-bld.sh` to build the readme files
|
||||||
# Commit the new readme files to ''master''
|
# Commit the new readme files to ''master''
|
||||||
# Restore `package.json` to the previous version number
|
# Restore `package.json` to the previous version number
|
||||||
# Adjust the link for "GitHub for detailed change history of this release" in the release note
|
|
||||||
# Add the credits for the new release banner to the release note, including a link to the GitHub instance of the image from the commit history
|
# Add the credits for the new release banner to the release note, including a link to the GitHub instance of the image from the commit history
|
||||||
|
|
||||||
!! Make New Release
|
!! Make New Release
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
title: $:/config/LocalPluginLibrary
|
title: $:/config/LocalPluginLibrary
|
||||||
tags: $:/tags/PluginLibrary
|
tags: $:/tags/PluginLibrary
|
||||||
url: http://127.0.0.1:8080/prerelease/library/v5.4.1/index.html
|
url: http://127.0.0.1:8080/prerelease/library/v5.5.0/index.html
|
||||||
caption: {{$:/language/OfficialPluginLibrary}} (Prerelease Local)
|
caption: {{$:/language/OfficialPluginLibrary}} (Prerelease Local)
|
||||||
|
|
||||||
A locally installed version of the official ~TiddlyWiki plugin library at tiddlywiki.com for testing and debugging. //Requires a local web server to share the library//
|
A locally installed version of the official ~TiddlyWiki plugin library at tiddlywiki.com for testing and debugging. //Requires a local web server to share the library//
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
title: $:/config/OfficialPluginLibrary
|
title: $:/config/OfficialPluginLibrary
|
||||||
tags: $:/tags/PluginLibrary
|
tags: $:/tags/PluginLibrary
|
||||||
url: https://tiddlywiki.com/prerelease/library/v5.4.1/index.html
|
url: https://tiddlywiki.com/prerelease/library/v5.5.0/index.html
|
||||||
caption: {{$:/language/OfficialPluginLibrary}} (Prerelease)
|
caption: {{$:/language/OfficialPluginLibrary}} (Prerelease)
|
||||||
|
|
||||||
The prerelease version of the official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team.
|
The prerelease version of the official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team.
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
created: 20260714055110474
|
||||||
|
modified: 20260714055129225
|
||||||
|
tags:
|
||||||
|
title: TiddlyWiki Pre-release Size Comparison
|
||||||
|
|
||||||
|
|
||||||
|
\function bytes.to.mib(size) [abs[]divide[1048576]fixed[2]addsuffix[ MiB]]
|
||||||
|
\function bytes.to.kib(size) [abs[]divide[1024]fixed[2]addsuffix[ KiB]]
|
||||||
|
\function format.file.size(size) [<size>abs[]compare:number:gteq[1048576]bytes.to.mib<size>] :else[<size>abs[]compare:number:gteq[1024]bytes.to.kib<size>] :else[<size>addsuffix[ bytes]]
|
||||||
|
|
||||||
|
|
||||||
|
\procedure get-wiki-filesize(filepath)
|
||||||
|
\procedure completion-get-json()
|
||||||
|
<!-- Success -->
|
||||||
|
<$list filter="[<status>compare:number:gteq[200]compare:number:lteq[299]]" variable="ignore">
|
||||||
|
<$action-log msg="completed" size={{{ [<data>jsonget[size]] }}}/>
|
||||||
|
<$action-setfield $tiddler=`$:/temp/file-size-comparison/$(filepath)$` text={{{ [<data>jsonget[size]] }}} />
|
||||||
|
</$list>
|
||||||
|
\end completion-get-json
|
||||||
|
|
||||||
|
<$action-sendmessage
|
||||||
|
$message="tm-http-request"
|
||||||
|
url=`https://api.github.com/repos/TiddlyWiki/tiddlywiki.com-gh-pages/contents/$(filepath)$?ref=master`
|
||||||
|
method="GET"
|
||||||
|
oncompletion=<<completion-get-json>>
|
||||||
|
var-filepath=<<filepath>>
|
||||||
|
/>
|
||||||
|
\end get-wiki-filesize
|
||||||
|
|
||||||
|
\procedure get-wiki-filesizes()
|
||||||
|
<$list filter="empty.html prerelease/empty.html" variable="filepath">
|
||||||
|
<$action-log />
|
||||||
|
<<$transclude $variable="get-wiki-filesize" filepath=<<filepath>> >>
|
||||||
|
|
||||||
|
</$list>
|
||||||
|
\end get-wiki-filesizes
|
||||||
|
|
||||||
|
|
||||||
|
<%if [[$:/temp/file-size-comparison/empty.html]is[tiddler]] [[$:/temp/file-size-comparison/prerelease/empty.html]is[tiddler]] :and[count[]match[2]]%>
|
||||||
|
<$let delta={{{ [{$:/temp/file-size-comparison/empty.html}subtract{$:/temp/file-size-comparison/prerelease/empty.html}] }}}
|
||||||
|
message={{{ [<delta>sign[]match[-1]then[Size increased]] :else[<delta>sign[]match[1]then[Size decreased]] :else[[Size has not changed]] }}}
|
||||||
|
>
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="158" height="20" role="img" style.zoom="1.5" aria-label="<$text text=<<message>>/>: <$text text={{{ [format.file.size<delta>] }}} /> bytes">
|
||||||
|
<title><$text text=<<message>>/>: <$text text={{{ [format.file.size<delta>] }}} /></title>
|
||||||
|
<filter id="blur">
|
||||||
|
<feGaussianBlur stdDeviation="16"/>
|
||||||
|
</filter>
|
||||||
|
<linearGradient id="s" x2="0" y2="100%">
|
||||||
|
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
|
||||||
|
<stop offset="1" stop-opacity=".1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="r">
|
||||||
|
<rect width="158" height="20" rx="3"/>
|
||||||
|
</clipPath>
|
||||||
|
<g clip-path="url(#r)">
|
||||||
|
<rect width="93" height="20" fill="#555"/>
|
||||||
|
<rect x="93" width="65" height="20" fill="#67ac09"/>
|
||||||
|
<rect width="158" height="20" fill="url(#s)"/>
|
||||||
|
</g>
|
||||||
|
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110">
|
||||||
|
<g transform="scale(.1)">
|
||||||
|
<g aria-hidden="true" fill="#010101">
|
||||||
|
<text x="475" y="150" fill-opacity=".8" filter="url(#blur)" textLength="830"><$text text=<<message>>/></text>
|
||||||
|
<text x="475" y="150" fill-opacity=".3" textLength="830"><$text text=<<message>>/></text>
|
||||||
|
</g>
|
||||||
|
<text x="475" y="140" textLength="830"><$text text=<<message>>/></text>
|
||||||
|
</g>
|
||||||
|
<g transform="scale(.1)">
|
||||||
|
<g aria-hidden="true" fill="#010101">
|
||||||
|
<text x="1245" y="150" fill-opacity=".8" filter="url(#blur)" textLength="550"><$text text={{{ [format.file.size<delta>] }}} /></text>
|
||||||
|
<text x="1245" y="150" fill-opacity=".3" textLength="550"><$text text={{{ [format.file.size<delta>] }}} /></text>
|
||||||
|
</g>
|
||||||
|
<text x="1245" y="140" textLength="550"><$text text={{{ [format.file.size<delta>] }}} /></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
; Pre-release empty.html
|
||||||
|
: <$text text={{{ [{$:/temp/file-size-comparison/prerelease/empty.html}] }}} /> bytes
|
||||||
|
; <$text text={{{ [tag[ReleaseNotes]sort[released]last[]] }}} /> empty.html
|
||||||
|
: <$text text={{{ [{$:/temp/file-size-comparison/empty.html}] }}} /> bytes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
</$let>
|
||||||
|
<%else %>
|
||||||
|
<$button actions=<<get-wiki-filesizes>> class="tc-btn-big-green">
|
||||||
|
Compare size of empty.html
|
||||||
|
</$button>
|
||||||
|
<%endif%>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -13,6 +13,8 @@ The pre-release is also available as an [[empty wiki|https://tiddlywiki.com/prer
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{{ TiddlyWiki Pre-release Size Comparison }}
|
||||||
|
|
||||||
<$list filter="[tag[ReleaseNotes]!has[released]!sort[created]]">
|
<$list filter="[tag[ReleaseNotes]!has[released]!sort[created]]">
|
||||||
<div class="tc-titlebar">
|
<div class="tc-titlebar">
|
||||||
<h2 class="tc-title"><$text text=<<currentTiddler>>/></h2>
|
<h2 class="tc-title"><$text text=<<currentTiddler>>/></h2>
|
||||||
|
|||||||
@@ -0,0 +1,162 @@
|
|||||||
|
/*\
|
||||||
|
title: test-back-indexer.js
|
||||||
|
type: application/javascript
|
||||||
|
tags: [[$:/tags/test-spec]]
|
||||||
|
|
||||||
|
Regression tests for #9916: the back-indexer must never record system
|
||||||
|
tiddlers as backlink or backtransclude sources, neither when the index is
|
||||||
|
first built nor when it is incrementally updated.
|
||||||
|
|
||||||
|
\*/
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
describe("Back-indexer system source tests (#9916)", function() {
|
||||||
|
function setupWiki() {
|
||||||
|
// Create a wiki with indexers and one primed backlink pair
|
||||||
|
var wiki = new $tw.Wiki();
|
||||||
|
wiki.addIndexersToWiki();
|
||||||
|
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "TestIncoming",
|
||||||
|
text: ""});
|
||||||
|
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "TestOutgoing",
|
||||||
|
text: "A link to [[TestIncoming]]"});
|
||||||
|
return wiki;
|
||||||
|
}
|
||||||
|
|
||||||
|
it("should never report a system tiddler as a backlink source", function() {
|
||||||
|
// Browser console: $tw.wiki.filterTiddlers("[[HelloThere]backlinks[]]") to prime the index,
|
||||||
|
// then $tw.wiki.addTiddler(new $tw.Tiddler({title: "$:/temp/demo", text: "[[HelloThere]]"}))
|
||||||
|
// and run the filter again; $:/temp/demo must not appear.
|
||||||
|
var wiki = setupWiki();
|
||||||
|
// The first lookup builds the lazy index; its initial scan skips system tiddlers
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
// The incremental update() must skip them too
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "$:/temp/system-source",
|
||||||
|
text: "A link to [[TestIncoming]]"});
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should keep backlinks stable while a linking system tiddler is modified and deleted", function() {
|
||||||
|
// Browser console: $tw.wiki.filterTiddlers("[[HelloThere]backlinks[]]") to prime the index,
|
||||||
|
// then $tw.wiki.addTiddler(new $tw.Tiddler({title: "$:/temp/demo", text: "[[HelloThere]]"})),
|
||||||
|
// change its text, $tw.wiki.deleteTiddler("$:/temp/demo"); the filter result never changes.
|
||||||
|
var wiki = setupWiki();
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "$:/temp/system-source",
|
||||||
|
text: "A link to [[TestIncoming]]"});
|
||||||
|
// Modify: both the old and the new side of the index update are system tiddlers
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "$:/temp/system-source",
|
||||||
|
text: "Links to [[TestIncoming]] and [[TestOutgoing]]"});
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
wiki.deleteTiddler("$:/temp/system-source");
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should drop the backlink when its source is renamed to a system title", function() {
|
||||||
|
// Browser console: $tw.wiki.addTiddler(new $tw.Tiddler({title: "Demo", text: "[[HelloThere]]"})),
|
||||||
|
// confirm Demo is in $tw.wiki.filterTiddlers("[[HelloThere]backlinks[]]"), then
|
||||||
|
// $tw.wiki.renameTiddler("Demo","$:/Demo"); neither Demo nor $:/Demo remains a source.
|
||||||
|
var wiki = setupWiki();
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
wiki.renameTiddler("TestOutgoing","$:/TestOutgoing");
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should gain the backlink when a linking system tiddler is renamed to a normal title", function() {
|
||||||
|
// Browser console: $tw.wiki.addTiddler(new $tw.Tiddler({title: "$:/temp/demo", text: "[[HelloThere]]"})),
|
||||||
|
// then $tw.wiki.renameTiddler("$:/temp/demo","DemoVisible");
|
||||||
|
// DemoVisible now appears in $tw.wiki.filterTiddlers("[[HelloThere]backlinks[]]").
|
||||||
|
var wiki = setupWiki();
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "$:/temp/system-source",
|
||||||
|
text: "A link to [[TestIncoming]]"});
|
||||||
|
wiki.renameTiddler("$:/temp/system-source","VisibleSource");
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing,VisibleSource");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should still report normal sources for a system tiddler target", function() {
|
||||||
|
// Only sources are filtered, targets are not. Browser console:
|
||||||
|
// $tw.wiki.addTiddler(new $tw.Tiddler({title: "Demo", text: "[[$:/config/NewJournal/Tags]]"}));
|
||||||
|
// $tw.wiki.filterTiddlers("[[$:/config/NewJournal/Tags]backlinks[]]") contains Demo.
|
||||||
|
var wiki = setupWiki();
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "TestSystemLinker",
|
||||||
|
text: "A link to [[$:/config/Target]]"});
|
||||||
|
expect(wiki.filterTiddlers("[[$:/config/Target]backlinks[]]").join(",")).toBe("TestSystemLinker");
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("Adversarial probes", function() {
|
||||||
|
it("should never index a shadow tiddler as a source, even when revealed by deleting its override", function() {
|
||||||
|
// Goes red when a refactor of BackSubIndexer.update() checks the tiddler instead of
|
||||||
|
// the exists flag:
|
||||||
|
// if(updateDescriptor["new"].tiddler) { ... } // broken: goes red here
|
||||||
|
// if(updateDescriptor["new"].exists) { ... } // correct: stays green
|
||||||
|
// After deleteTiddler() on an override, boot.js fills new.tiddler via getTiddler(),
|
||||||
|
// which falls back to the revealed shadow, while new.exists stays false because
|
||||||
|
// only the real store counts. The broken variant indexes the shadow's links and
|
||||||
|
// the final expect fails with "TestOutgoing,ShadowSource".
|
||||||
|
// The first expect also goes red if _init() ever starts scanning shadows; the
|
||||||
|
// middle expect pins that a real override IS indexed, so this probe cannot be
|
||||||
|
// satisfied by indexing nothing at all.
|
||||||
|
// Browser console: override a plugin shadow with text [[HelloThere]], check it appears in
|
||||||
|
// $tw.wiki.filterTiddlers("[[HelloThere]backlinks[]]"), then $tw.wiki.deleteTiddler(title);
|
||||||
|
// the title disappears from the filter result even though the shadow still renders.
|
||||||
|
var wiki = setupWiki();
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "$:/plugins/test/shadow-plugin",
|
||||||
|
type: "application/json",
|
||||||
|
"plugin-type": "plugin",
|
||||||
|
text: JSON.stringify({tiddlers: {
|
||||||
|
"ShadowSource": {title: "ShadowSource", text: "A shadow link to [[TestIncoming]]"}
|
||||||
|
}})});
|
||||||
|
wiki.readPluginInfo();
|
||||||
|
wiki.registerPluginTiddlers("plugin");
|
||||||
|
wiki.unpackPluginTiddlers();
|
||||||
|
// The initial scan sees only real tiddlers, not the shadow
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "ShadowSource",
|
||||||
|
text: "An overriding link to [[TestIncoming]]"});
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing,ShadowSource");
|
||||||
|
// Deleting the override reveals the shadow; it must not enter the index
|
||||||
|
wiki.deleteTiddler("ShadowSource");
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle hostile titles like __proto__ as source and target", function() {
|
||||||
|
// Goes red when any title-keyed hashmap on the backlinks path is created like this:
|
||||||
|
// this.index = {}; // broken: goes red here
|
||||||
|
// instead of:
|
||||||
|
// this.index = Object.create(null); // correct: stays green
|
||||||
|
// this.index = new Map(); // a Map/Set refactor also stays green
|
||||||
|
// The same applies to the boot tiddler store and to the per-target source maps
|
||||||
|
// (self.index[target] = ...). On a plain {} the assignment index["__proto__"] = x
|
||||||
|
// stores no key; it silently replaces the object's prototype. Depending on which
|
||||||
|
// map regresses, the __proto__ tiddler never registers as a source (second expect),
|
||||||
|
// or its target entry lands in the shared prototype, where it pollutes every other
|
||||||
|
// lookup and lookup("__proto__") returns garbage (third expect).
|
||||||
|
// Browser console: $tw.wiki.addTiddler(new $tw.Tiddler({title: "__proto__",
|
||||||
|
// text: "[[HelloThere]]"})); __proto__ appears in
|
||||||
|
// $tw.wiki.filterTiddlers("[[HelloThere]backlinks[]]") and
|
||||||
|
// $tw.wiki.filterTiddlers("[[__proto__]backlinks[]]") lists tiddlers linking to it.
|
||||||
|
var wiki = setupWiki();
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing");
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "__proto__",
|
||||||
|
text: "A link to [[TestIncoming]]"});
|
||||||
|
expect(wiki.filterTiddlers("TestIncoming +[backlinks[]]").join(",")).toBe("TestOutgoing,__proto__");
|
||||||
|
wiki.addTiddler({
|
||||||
|
title: "ProtoLinker",
|
||||||
|
text: "A link to [[__proto__]]"});
|
||||||
|
expect(wiki.filterTiddlers("[[__proto__]backlinks[]]").join(",")).toBe("ProtoLinker");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/*\
|
||||||
|
title: test-csv.js
|
||||||
|
type: application/javascript
|
||||||
|
tags: [[$:/tags/test-spec]]
|
||||||
|
|
||||||
|
Tests the CSV parser.
|
||||||
|
|
||||||
|
\*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
describe("CSV tests", function() {
|
||||||
|
|
||||||
|
it("parses a simple table", function() {
|
||||||
|
expect($tw.utils.parseCsvString("a,b,c\n1,2,3")).toEqual([["a","b","c"],["1","2","3"]]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("parses a table whose first cell reads empty", function() {
|
||||||
|
expect($tw.utils.parseCsvString(",b,c\n1,2,3")).toEqual([["","b","c"],["1","2","3"]]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("parses an empty cell in the middle of a row", function() {
|
||||||
|
expect($tw.utils.parseCsvString("a,,c")).toEqual([["a","","c"]]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("parses quoted cells", function() {
|
||||||
|
expect($tw.utils.parseCsvString('a,"b,still b",c')).toEqual([["a","b,still b","c"]]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("parses a quoted cell holding an escaped quote", function() {
|
||||||
|
expect($tw.utils.parseCsvString('a,"b ""quoted""",c')).toEqual([["a",'b "quoted"',"c"]]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("honours a custom separator", function() {
|
||||||
|
expect($tw.utils.parseCsvString("a;b;c",{separator: ";"})).toEqual([["a","b","c"]]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("parses a table with a header row into hashmaps", function() {
|
||||||
|
expect($tw.utils.parseCsvStringWithHeader("a,b\n1,2")).toEqual([{a: "1", b: "2"}]);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -19,6 +19,56 @@ describe("fakedom tests", function() {
|
|||||||
expect($tw.fakeDocument.createTextNode("text").TEXT_NODE).toBe(3);
|
expect($tw.fakeDocument.createTextNode("text").TEXT_NODE).toBe(3);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Per DOM spec, tagName returns the HTML-uppercased qualified name for HTML
|
||||||
|
// elements. Other namespaces preserve case.
|
||||||
|
// https://dom.spec.whatwg.org/#dom-element-tagname
|
||||||
|
var HTML_NS = "http://www.w3.org/1999/xhtml";
|
||||||
|
var SVG_NS = "http://www.w3.org/2000/svg";
|
||||||
|
|
||||||
|
it("tagName uppercases for HTML namespace", function() {
|
||||||
|
// Default namespace is HTML
|
||||||
|
expect($tw.fakeDocument.createElement("div").tagName).toBe("DIV");
|
||||||
|
// The exact predicate the select widget relies on (#9839)
|
||||||
|
expect($tw.fakeDocument.createElement("optgroup").tagName === "OPTGROUP").toBe(true);
|
||||||
|
// Already-uppercase input stays uppercase
|
||||||
|
expect($tw.fakeDocument.createElement("OPTGROUP").tagName).toBe("OPTGROUP");
|
||||||
|
// Mixed-case input is normalised
|
||||||
|
expect($tw.fakeDocument.createElement("Div").tagName).toBe("DIV");
|
||||||
|
// Hyphenated custom-element names uppercase whole tag, hyphens survive
|
||||||
|
expect($tw.fakeDocument.createElement("my-button").tagName).toBe("MY-BUTTON");
|
||||||
|
// Empty tag returns empty string
|
||||||
|
expect($tw.fakeDocument.createElement("").tagName).toBe("");
|
||||||
|
// Explicit HTML namespace via createElementNS uppercases the same way
|
||||||
|
expect($tw.fakeDocument.createElementNS(HTML_NS,"Div").tagName).toBe("DIV");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("tagName preserves case for non-HTML namespaces", function() {
|
||||||
|
// SVG: lowercase preserved
|
||||||
|
expect($tw.fakeDocument.createElementNS(SVG_NS,"circle").tagName).toBe("circle");
|
||||||
|
// SVG: camelCase preserved (linearGradient is the canonical example)
|
||||||
|
expect($tw.fakeDocument.createElementNS(SVG_NS,"linearGradient").tagName).toBe("linearGradient");
|
||||||
|
// SVG: already-uppercase input is also preserved (NOT lowercased)
|
||||||
|
expect($tw.fakeDocument.createElementNS(SVG_NS,"DIV").tagName).toBe("DIV");
|
||||||
|
// Empty namespace string is "no namespace", not HTML. Case preserved.
|
||||||
|
expect($tw.fakeDocument.createElementNS("","div").tagName).toBe("div");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("tagName reflects current state without mutating it", function() {
|
||||||
|
// Reading tagName must not overwrite the internal `tag` field
|
||||||
|
var el = $tw.fakeDocument.createElement("div");
|
||||||
|
expect(el.tagName).toBe("DIV");
|
||||||
|
expect(el.tag).toBe("div");
|
||||||
|
// Idempotent: two reads return identical values
|
||||||
|
var first = el.tagName, second = el.tagName;
|
||||||
|
expect(first).toBe(second);
|
||||||
|
// Dynamic namespace change is reflected. The getter must read current
|
||||||
|
// state, not a value cached at construction time.
|
||||||
|
var dynamic = $tw.fakeDocument.createElement("foo");
|
||||||
|
expect(dynamic.tagName).toBe("FOO");
|
||||||
|
dynamic.namespaceURI = SVG_NS;
|
||||||
|
expect(dynamic.tagName).toBe("foo");
|
||||||
|
});
|
||||||
|
|
||||||
// Real CSSStyleDeclaration returns undefined for Symbol property keys.
|
// Real CSSStyleDeclaration returns undefined for Symbol property keys.
|
||||||
// Without a guard, the TW_Style Proxy throws on Symbol access. This bites
|
// Without a guard, the TW_Style Proxy throws on Symbol access. This bites
|
||||||
// in practice when Jasmine pretty-prints fakedom elements on failure.
|
// in practice when Jasmine pretty-prints fakedom elements on failure.
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 50 KiB |
@@ -4,7 +4,7 @@ created: 20131219100608529
|
|||||||
delivery: DIY
|
delivery: DIY
|
||||||
description: Flexible hosting on your own machine or in the cloud
|
description: Flexible hosting on your own machine or in the cloud
|
||||||
method: sync
|
method: sync
|
||||||
modified: 20221115230831173
|
modified: 20260712162730421
|
||||||
tags: Saving [[TiddlyWiki on Node.js]] Windows Mac Linux
|
tags: Saving [[TiddlyWiki on Node.js]] Windows Mac Linux
|
||||||
title: Installing TiddlyWiki on Node.js
|
title: Installing TiddlyWiki on Node.js
|
||||||
type: text/vnd.tiddlywiki
|
type: text/vnd.tiddlywiki
|
||||||
@@ -39,4 +39,39 @@ The `-g` flag causes TiddlyWiki to be installed globally. Without it, TiddlyWiki
|
|||||||
|
|
||||||
<<.warning "If you are using Debian or Debian-based Linux and you are receiving a `node: command not found` error though node.js package is installed, you may need to create a symbolic link between `nodejs` and `node`. Consult your distro's manual and `whereis` to correctly create a link. See github [[issue 1434|http://github.com/TiddlyWiki/TiddlyWiki5/issues/1434]]. <br><br>Example Debian v8.0: `sudo ln -s /usr/bin/nodejs /usr/bin/node`">>
|
<<.warning "If you are using Debian or Debian-based Linux and you are receiving a `node: command not found` error though node.js package is installed, you may need to create a symbolic link between `nodejs` and `node`. Consult your distro's manual and `whereis` to correctly create a link. See github [[issue 1434|http://github.com/TiddlyWiki/TiddlyWiki5/issues/1434]]. <br><br>Example Debian v8.0: `sudo ln -s /usr/bin/nodejs /usr/bin/node`">>
|
||||||
<br>
|
<br>
|
||||||
<<.tip "You can also install prior versions like this: <br><code> npm install -g tiddlywiki@5.1.13</code>">>
|
<<.tip "You can also install prior versions like this: <br><code> npm install -g tiddlywiki@5.1.13</code><br>Note: this will overwrite the installed version rather than installing it alongside.">>
|
||||||
|
|
||||||
|
!! Installing multiple Node.js verions alongside
|
||||||
|
|
||||||
|
There are multiple options:
|
||||||
|
|
||||||
|
!!! Local install
|
||||||
|
|
||||||
|
```
|
||||||
|
mkdir -p /home/user/opt/tiddlywiki-5.1.13 && cd "$_" # works in Bash
|
||||||
|
npm install tiddlywiki@5.1.13
|
||||||
|
```
|
||||||
|
|
||||||
|
This installs the given version in the current directory, at the expense of taking some extra disk space. The binary is in `node_modules/.bin/tiddlywiki` (relative to the current directory). For convenience, it is possible to create a symlink (in Linux) containing explicit version number in the name, like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
ln -s /home/user/opt/tiddlywiki-5.1.13/node_modules/.bin/tiddlywiki /home/user/bin/tiddlywiki-5.1.13
|
||||||
|
```
|
||||||
|
|
||||||
|
Having `~/bin` in `PATH` environment variable (usually at the beginning of it), makes it possible to start this version of TiddlyWiki as simple as `tiddlywiki-5.1.13`.
|
||||||
|
|
||||||
|
!!! Use `npx`
|
||||||
|
|
||||||
|
To run another version without overwriting the currently installed version, use npx:
|
||||||
|
|
||||||
|
```
|
||||||
|
npx tiddlywiki@5.3.8 --version
|
||||||
|
```
|
||||||
|
|
||||||
|
<<.warning "This comes with a security risk, since it downloads and executes a package from the internet. See https://talk.tiddlywiki.org/t/tiddlywiki-docs-gettingstarted-node-js/15423/4">>
|
||||||
|
|
||||||
|
!!! Run directly from the source code repository
|
||||||
|
|
||||||
|
# clone https://github.com/TiddlyWiki/TiddlyWiki5/ locally
|
||||||
|
# checkout any version (using `git checkout` or `git switch` for modern versions of Git)
|
||||||
|
# set up a link or a shell script for it
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
title: $:/changenotes/5.4.0/#8972/impacts/parenthesised-field-names
|
||||||
|
changenote: $:/changenotes/5.4.0/#8972
|
||||||
|
created: 20260609193636000
|
||||||
|
modified: 20260609193636000
|
||||||
|
tags: $:/tags/ImpactNote
|
||||||
|
impact-type: compatibility-break
|
||||||
|
description: A field name containing round brackets can no longer be used as a filter operator suffix, because `(` now starts a multi value variable operand.
|
||||||
|
|
||||||
|
Two filter operators take a field name in the suffix position: `regexp` and `search`. Up to 5.3.8 such a field name could contain round brackets, for example:
|
||||||
|
|
||||||
|
```
|
||||||
|
[regexp:_cd-work(s)[(?i)suite]]
|
||||||
|
[search:_cd-work(s)[suite]]
|
||||||
|
```
|
||||||
|
|
||||||
|
In 5.4.0 the new `(varname)` operand syntax for [[Multi-Valued Variables]] makes `(` start an operand. The parser now splits such a field name at the `(`, so the filter no longer matches.
|
||||||
|
|
||||||
|
This will not be fixed. The two readings of `field(x)`, a field named `field(x)` versus the field `field` with the operand `(x)`, are genuinely ambiguous, so `(` and `)` are reserved in filter operator names and suffixes from 5.4.0 onwards.
|
||||||
|
|
||||||
|
Workaround: do not use `(` or `)` in field names that are referenced as a filter operator suffix. Rename the field, for example `_cd-works`.
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
title: $:/changenotes/5.4.0/#9715
|
||||||
|
change-type: performance
|
||||||
|
change-category: filters
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
github-contributors: linonetwo
|
||||||
|
release: 5.4.0
|
||||||
|
description: Optimized tag[] and !tag[] filter operators to use Set for O(1) lookup, matching search:tags[] performance.
|
||||||
|
github-links: [[https://github.com/Jermolene/TiddlyWiki5/pull/9715]]
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
change-category: widget
|
||||||
|
change-type: enhancement
|
||||||
|
created: 20260711020921000
|
||||||
|
description: The diff-text widget shows removed or added newlines with a visible ↲ glyph
|
||||||
|
github-contributors: pmario
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9736
|
||||||
|
release: 5.5.0
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
title: $:/changenotes/5.5.0/#9736
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
* The diff-text widget marks newline characters in a diff with the visible `↲` glyph (U+21B2) instead of an invisible character, so line break changes are recognisable in the rendered diff (fixes [[Issue #9461|https://github.com/TiddlyWiki/TiddlyWiki5/issues/9461]])
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
change-category: translation
|
||||||
|
change-type: enhancement
|
||||||
|
created: 20260711020729000
|
||||||
|
description: The "Click to generate wiki info" button in the control panel is now translatable
|
||||||
|
github-contributors: pmario
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9737
|
||||||
|
release: 5.5.0
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
title: $:/changenotes/5.5.0/#9737
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
* The "Click to generate wiki info" button on the control panel's wiki information tab uses a language string instead of hard coded English text, so translators can localise it (fixes [[Issue #9654|https://github.com/TiddlyWiki/TiddlyWiki5/issues/9654]])
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
change-category: nodejs
|
||||||
|
change-type: bugfix
|
||||||
|
created: 20260711020057000
|
||||||
|
description: The Node.js server no longer emits the DEP0169 url.parse() deprecation warning
|
||||||
|
github-contributors: pmario
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9742
|
||||||
|
release: 5.5.0
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
title: $:/changenotes/5.5.0/#9742
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
* The server module parses request URLs with the WHATWG `URL` API instead of the deprecated `url.parse()`, so recent Node.js versions no longer print the DEP0169 deprecation warning on startup (fixes [[Issue #9628|https://github.com/TiddlyWiki/TiddlyWiki5/issues/9628]])
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
title: $:/changenotes/5.5.0/#9816
|
||||||
|
description: Replaces some wikify widget with call dynamic syntax
|
||||||
|
release: 5.5.0
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
change-type: enhancement
|
||||||
|
change-category: internal
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9816
|
||||||
|
github-contributors: Leilei332
|
||||||
|
|
||||||
|
Replaces unnecessary wikify widget usage with call dynamic attribute syntax.
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
change-category: internal
|
||||||
|
change-type: bugfix
|
||||||
|
created: 20260711014241000
|
||||||
|
description: fakedom tagName is uppercase for HTML elements, matching the DOM spec
|
||||||
|
github-contributors: pmario
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9843
|
||||||
|
release: 5.5.0
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
title: $:/changenotes/5.5.0/#9843
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
* `$tw.fakeDocument` elements now report `tagName` in uppercase for HTML elements, matching the DOM specification and real browsers; code that compares fakedom `tagName` against lowercase strings must be updated
|
||||||
|
* Creating an element with an empty or null namespace now produces a plain element without a namespace
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
change-category: filters
|
||||||
|
change-type: bugfix
|
||||||
|
created: 20260711011920000
|
||||||
|
description: backlinks[] and backtranscludes[] no longer report edited system tiddlers as sources
|
||||||
|
github-contributors: pmario
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/issues/9917
|
||||||
|
release: 5.5.0
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
title: $:/changenotes/5.5.0/#9917
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
* Editing a system tiddler that links or transcludes another tiddler no longer adds it as a [[backlinks|backlinks Operator]] or [[backtranscludes|backtranscludes Operator]] source; the incremental back-index update now skips system tiddlers like the initial scan always did
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
title: $:/changenotes/5.5.0/#9919
|
||||||
|
created: 20260712000000000
|
||||||
|
modified: 20260712000000000
|
||||||
|
description: Fix the CSV parser returning every cell empty
|
||||||
|
release: 5.5.0
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
change-type: bugfix
|
||||||
|
change-category: internal
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9919
|
||||||
|
github-contributors: joshuafontany
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
`getCellInfo` read its loop variable before the loop declared it, so hoisting made it undefined and the parser tested the first character of the whole text rather than the first character of the cell. Any CSV opening with a separator therefore returned every cell empty, and the table rendered blank.
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
title: $:/changenotes/5.5.0/#9933
|
||||||
|
description: Update Chinese translations
|
||||||
|
release: 5.5.0
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
change-type: enhancement
|
||||||
|
change-category: translation
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9933
|
||||||
|
github-contributors: BramChen
|
||||||
|
|
||||||
|
* Add `WikiInformation/Generate/Caption` in `ControlPanel.multids`
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
caption: 5.5.0
|
||||||
|
created: 20260710103826404
|
||||||
|
modified: 20260710103826404
|
||||||
|
tags: ReleaseNotes
|
||||||
|
title: Release 5.5.0
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
description: Under development
|
||||||
|
|
||||||
|
\procedure release-introduction()
|
||||||
|
Release v5.5.0 is under development.
|
||||||
|
\end release-introduction
|
||||||
|
|
||||||
|
<<releasenote 5.5.0>>
|
||||||
@@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki
|
|||||||
|
|
||||||
!! Basic syntax
|
!! Basic syntax
|
||||||
|
|
||||||
HTML description lists (<abbr title="also known as">AKA</abbr> definition lists) are created with this syntax:
|
HTML description lists (<abbr title="also known as">AKA</abbr> definition lists) are created with this syntax:
|
||||||
|
|
||||||
<<wikitext-example src:"; Term being described
|
<<wikitext-example src:"; Term being described
|
||||||
: Description / Definition of that term
|
: Description / Definition of that term
|
||||||
@@ -17,7 +17,7 @@ HTML description lists (<abbr title="also known as">AKA</abbr> definition lists)
|
|||||||
|
|
||||||
!! Multiple terms and descriptions
|
!! Multiple terms and descriptions
|
||||||
|
|
||||||
You can create multiple descriptions for a term, or multiple terms for a single description:
|
You can create multiple descriptions for a term, or multiple terms with a single description:
|
||||||
|
|
||||||
<<wikitext-example src:"; Mouse
|
<<wikitext-example src:"; Mouse
|
||||||
: A rodent with a small body and a long tail
|
: A rodent with a small body and a long tail
|
||||||
@@ -41,4 +41,4 @@ Description lists may also be nested to create lists within lists:
|
|||||||
::: A coffee made with espresso and steamed milk
|
::: A coffee made with espresso and steamed milk
|
||||||
; Tea
|
; Tea
|
||||||
: A beverage typically made from tea leaves
|
: A beverage typically made from tea leaves
|
||||||
">>
|
">>
|
||||||
@@ -256,4 +256,5 @@ ViewTemplateTags/Caption: 查看模板标签区
|
|||||||
ViewTemplateTags/Hint: 默认的查看模板使用此规则级联,动态选择模板以显示条目的标签区域。
|
ViewTemplateTags/Hint: 默认的查看模板使用此规则级联,动态选择模板以显示条目的标签区域。
|
||||||
WikiInformation/Caption: 维基信息
|
WikiInformation/Caption: 维基信息
|
||||||
WikiInformation/Hint: 此页面总结了有关此 ~TiddlyWiki 配置的高阶信息。旨在让用户能够快速与他人共享其 ~TiddlyWiki 配置的相关信息,例如,在其中一个论坛中寻求帮助时。不包含隐私或个人信息,没有明确复制和粘贴在其他地方的情况
|
WikiInformation/Hint: 此页面总结了有关此 ~TiddlyWiki 配置的高阶信息。旨在让用户能够快速与他人共享其 ~TiddlyWiki 配置的相关信息,例如,在其中一个论坛中寻求帮助时。不包含隐私或个人信息,没有明确复制和粘贴在其他地方的情况
|
||||||
WikiInformation/Drag/Caption: 拖动此链接可将此工具复制到另一个维基
|
WikiInformation/Drag/Caption: 拖动此链接可将此工具复制到另一个维基
|
||||||
|
WikiInformation/Generate/Caption: 生成维基信息报告
|
||||||
@@ -256,4 +256,5 @@ ViewTemplateTags/Caption: 檢視範本標籤
|
|||||||
ViewTemplateTags/Hint: 預設的檢視範本使用此規則級聯,動態選擇範本以顯示條目的標籤。
|
ViewTemplateTags/Hint: 預設的檢視範本使用此規則級聯,動態選擇範本以顯示條目的標籤。
|
||||||
WikiInformation/Caption: 維基資訊
|
WikiInformation/Caption: 維基資訊
|
||||||
WikiInformation/Hint: 此頁面總結了有關此 ~TiddlyWiki 配置的高階資訊。旨在讓使用者能夠快速與他人共享其 ~TiddlyWiki 配置的相關資訊,例如,在其中一個論壇中尋求幫助時。不包含隱私或個人資訊,沒有明確複製和粘貼在其他地方的情況
|
WikiInformation/Hint: 此頁面總結了有關此 ~TiddlyWiki 配置的高階資訊。旨在讓使用者能夠快速與他人共享其 ~TiddlyWiki 配置的相關資訊,例如,在其中一個論壇中尋求幫助時。不包含隱私或個人資訊,沒有明確複製和粘貼在其他地方的情況
|
||||||
WikiInformation/Drag/Caption: 拖動此連結可將此工具複製到另一個維基
|
WikiInformation/Drag/Caption: 拖動此連結可將此工具複製到另一個維基
|
||||||
|
WikiInformation/Generate/Caption: 產生維基資訊報告
|
||||||
@@ -650,4 +650,5 @@ Rishu kumar, @rishu-7549, 2025/10/25
|
|||||||
|
|
||||||
Himmel, @NotHimmel, 2026/03/19
|
Himmel, @NotHimmel, 2026/03/19
|
||||||
|
|
||||||
@sean-clayton, 2026/05/16
|
|
||||||
|
@vuktw, 2026/07/12
|
||||||
|
|||||||
Generated
+15
-5
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "tiddlywiki",
|
"name": "tiddlywiki",
|
||||||
"version": "5.4.1",
|
"version": "5.5.0-prerelease",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"globals": "16.4.0"
|
"globals": "16.4.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.2"
|
"node": ">=20.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@eslint-community/eslint-utils": {
|
"node_modules/@eslint-community/eslint-utils": {
|
||||||
@@ -717,10 +717,20 @@
|
|||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/js-yaml": {
|
"node_modules/js-yaml": {
|
||||||
"version": "4.1.1",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
|
||||||
"integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
|
"integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/puzrin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/nodeca"
|
||||||
|
}
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"argparse": "^2.0.1"
|
"argparse": "^2.0.1"
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "tiddlywiki",
|
"name": "tiddlywiki",
|
||||||
"preferGlobal": true,
|
"preferGlobal": true,
|
||||||
"version": "5.4.1",
|
"version": "5.5.0-prerelease",
|
||||||
"author": "Jeremy Ruston <jeremy@jermolene.com>",
|
"author": "Jeremy Ruston <jeremy@jermolene.com>",
|
||||||
"description": "a non-linear personal web notebook",
|
"description": "a non-linear personal web notebook",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
|
|||||||
Reference in New Issue
Block a user