mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-07-13 23:32:44 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4c29dae4af | |||
| f5317dc225 | |||
| c952450c2e | |||
| 1eb7ec4402 | |||
| 869557f7d1 | |||
| c9f1154643 | |||
| 748f04c9e3 | |||
| d391595836 | |||
| 967140a148 | |||
| 95e68b0437 | |||
| 8ddede1611 | |||
| ceb200b08c | |||
| 00e5f48a59 | |||
| ea0e9105bc | |||
| 51459815ba | |||
| 8c62935a01 | |||
| 839fa2417d | |||
| 1b8610e4d8 |
+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]"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -243,8 +243,28 @@ exports.slowInSlowOut = function(t) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
exports.copyObjectPropertiesSafe = function(object) {
|
exports.copyObjectPropertiesSafe = function(object) {
|
||||||
const seen = new Set(),
|
const seen = new Set();
|
||||||
isDOMElement = (value) => value instanceof Node || value instanceof Window;
|
|
||||||
|
function isDOMElement(value) {
|
||||||
|
if(!value || typeof value !== "object") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cross-realm DOM nodes
|
||||||
|
if(typeof value.nodeType === "number" &&
|
||||||
|
typeof value.nodeName === "string") {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cross-realm Window objects
|
||||||
|
if(value.window === value &&
|
||||||
|
value.document &&
|
||||||
|
value.location) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
function safeCopy(obj) {
|
function safeCopy(obj) {
|
||||||
// skip circular references
|
// skip circular references
|
||||||
@@ -255,10 +275,6 @@ exports.copyObjectPropertiesSafe = function(object) {
|
|||||||
if(typeof obj !== "object" || obj === null) {
|
if(typeof obj !== "object" || obj === null) {
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
// skip DOM elements
|
|
||||||
if(isDOMElement(obj)) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
// copy arrays, preserving positions
|
// copy arrays, preserving positions
|
||||||
if(Array.isArray(obj)) {
|
if(Array.isArray(obj)) {
|
||||||
return obj.map((item) => {
|
return obj.map((item) => {
|
||||||
@@ -266,6 +282,10 @@ exports.copyObjectPropertiesSafe = function(object) {
|
|||||||
return value === undefined ? null : value;
|
return value === undefined ? null : value;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// skip DOM elements
|
||||||
|
if(isDOMElement(obj)) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
seen.add(obj);
|
seen.add(obj);
|
||||||
const copy = {};
|
const copy = {};
|
||||||
|
|||||||
@@ -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>>
|
|
||||||
colourA=<<colourA>>
|
|
||||||
colourB=<<colourB>>/>
|
|
||||||
"""
|
|
||||||
>
|
>
|
||||||
<$let backgroundColor=<<colour>> >
|
<span class="tc-tag-label tc-tag-list-item tc-small-gap-right"
|
||||||
<span class="tc-tag-label tc-tag-list-item tc-small-gap-right"
|
data-tag-title=<<currentTiddler>>
|
||||||
data-tag-title=<<currentTiddler>>
|
style=`color:$(foregroundColor)$; fill:$(foregroundColor)$; background-color:$(backgroundColor)$;`
|
||||||
style=`color:$(foregroundColor)$; fill:$(foregroundColor)$; background-color:$(backgroundColor)$;`
|
>
|
||||||
|
<$transclude tiddler=<<icon>>/>
|
||||||
|
<$view field="title" format="text"/>
|
||||||
|
<$button class="tc-btn-invisible tc-remove-tag-button"
|
||||||
|
style.fill=<<foregroundColor>>
|
||||||
>
|
>
|
||||||
<$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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"description": "Developer documentation from https://tiddlywiki.com/dev/",
|
"description": "Developer documentation from https://tiddlywiki.com/dev/",
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"tiddlywiki/highlight",
|
"tiddlywiki/highlight",
|
||||||
"tiddlywiki/nodewebkitsaver",
|
|
||||||
"tiddlywiki/github-fork-ribbon",
|
"tiddlywiki/github-fork-ribbon",
|
||||||
"tiddlywiki/menubar",
|
"tiddlywiki/menubar",
|
||||||
"tiddlywiki/internals",
|
"tiddlywiki/internals",
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"description": "A step by step introduction to TiddlyWiki",
|
"description": "A step by step introduction to TiddlyWiki",
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"tiddlywiki/cecily",
|
|
||||||
"tiddlywiki/codemirror",
|
"tiddlywiki/codemirror",
|
||||||
"tiddlywiki/highlight",
|
"tiddlywiki/highlight",
|
||||||
"tiddlywiki/katex"
|
"tiddlywiki/katex"
|
||||||
|
|||||||
@@ -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,240 @@
|
|||||||
|
/*\
|
||||||
|
title: test-utils-copyObjectPropertiesSafe.js
|
||||||
|
type: application/javascript
|
||||||
|
tags: [[$:/tags/test-spec]]
|
||||||
|
|
||||||
|
Tests $tw.utils.copyObjectPropertiesSafe, the root cause of #9869.
|
||||||
|
|
||||||
|
$eventcatcher serialises DOM events via JSON.stringify(copyObjectPropertiesSafe(event)).
|
||||||
|
|
||||||
|
The original bug was caused by instanceof Node/Window being realm-specific.
|
||||||
|
When an event originated from a different browser window, DOM objects from that
|
||||||
|
window were not detected and JSON.stringify() could throw "Illegal invocation".
|
||||||
|
|
||||||
|
The implementation must:
|
||||||
|
- skip DOM nodes and Window objects from other realms
|
||||||
|
- preserve normal event data
|
||||||
|
- preserve CustomEvent.detail payloads
|
||||||
|
- continue copying enumerable properties from non-DOM objects
|
||||||
|
- preserve arrays and break circular references
|
||||||
|
|
||||||
|
The tests use substitutes for foreign DOM objects because headless Node does not
|
||||||
|
provide a second browser realm. These objects model the important characteristics:
|
||||||
|
DOM nodes have nodeType/nodeName, and Window objects have window/self/document.
|
||||||
|
\*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
describe("copyObjectPropertiesSafe (#9869)", function() {
|
||||||
|
|
||||||
|
var cops = $tw.utils.copyObjectPropertiesSafe;
|
||||||
|
|
||||||
|
// Simulates a DOM node from another realm.
|
||||||
|
// The important characteristics are:
|
||||||
|
// - nodeType/nodeName identify it as a DOM node
|
||||||
|
// - circular parentNode references resemble real DOM trees
|
||||||
|
function fakeElement(tagName,extra) {
|
||||||
|
var node = $tw.utils.extend({
|
||||||
|
nodeType: 1,
|
||||||
|
nodeName: tagName,
|
||||||
|
tagName: tagName
|
||||||
|
},extra || {});
|
||||||
|
|
||||||
|
node.parentNode = node;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simulates a Window object from another realm.
|
||||||
|
function fakeWindow() {
|
||||||
|
var win = {
|
||||||
|
document: {},
|
||||||
|
location: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
win.window = win;
|
||||||
|
win.self = win;
|
||||||
|
|
||||||
|
return win;
|
||||||
|
}
|
||||||
|
|
||||||
|
// An event carrying foreign DOM nodes and a Window.
|
||||||
|
function fakeEvent(type,target,extra) {
|
||||||
|
return $tw.utils.extend({
|
||||||
|
type: type,
|
||||||
|
target: target,
|
||||||
|
currentTarget: target,
|
||||||
|
view: fakeWindow(),
|
||||||
|
detail: 0,
|
||||||
|
isTrusted: true
|
||||||
|
},extra || {});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
it("does not throw serialising any event type from a secondary window", function() {
|
||||||
|
var events = [
|
||||||
|
fakeEvent("focusin",fakeElement("INPUT")),
|
||||||
|
fakeEvent("change",fakeElement("SELECT")),
|
||||||
|
fakeEvent("click",fakeElement("BUTTON"),{
|
||||||
|
button: 0,
|
||||||
|
clientX: 5,
|
||||||
|
clientY: 9,
|
||||||
|
relatedTarget: null
|
||||||
|
}),
|
||||||
|
fakeEvent("mouseover",fakeElement("DIV"),{
|
||||||
|
relatedTarget: fakeElement("SPAN")
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
events.forEach(function(event) {
|
||||||
|
expect(function() {
|
||||||
|
JSON.stringify(cops(event));
|
||||||
|
}).not.toThrow();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it("drops DOM nodes and Window but keeps serialisable event data", function() {
|
||||||
|
var event = fakeEvent("click",fakeElement("BUTTON"),{
|
||||||
|
button: 0,
|
||||||
|
clientX: 5,
|
||||||
|
clientY: 9
|
||||||
|
});
|
||||||
|
|
||||||
|
var result = JSON.parse(JSON.stringify(cops(event)));
|
||||||
|
|
||||||
|
expect(result.target).toBeUndefined();
|
||||||
|
expect(result.currentTarget).toBeUndefined();
|
||||||
|
expect(result.view).toBeUndefined();
|
||||||
|
|
||||||
|
expect(result.type).toBe("click");
|
||||||
|
expect(result.detail).toBe(0);
|
||||||
|
expect(result.isTrusted).toBe(true);
|
||||||
|
expect(result.button).toBe(0);
|
||||||
|
expect(result.clientX).toBe(5);
|
||||||
|
expect(result.clientY).toBe(9);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it("preserves nested objects, arrays and circular reference handling", function() {
|
||||||
|
var event = fakeEvent("custom",fakeElement("DIV"),{
|
||||||
|
detail: {
|
||||||
|
nested: {
|
||||||
|
a: 1,
|
||||||
|
b: [2,3]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
path: [
|
||||||
|
fakeElement("DIV"),
|
||||||
|
fakeWindow(),
|
||||||
|
42
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
event.self = event;
|
||||||
|
|
||||||
|
var result = JSON.parse(JSON.stringify(cops(event)));
|
||||||
|
|
||||||
|
expect(result.detail).toEqual({
|
||||||
|
nested: {
|
||||||
|
a: 1,
|
||||||
|
b: [2,3]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result.path).toEqual([
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
42
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(result.self).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it("preserves CustomEvent.detail objects including custom object instances", function() {
|
||||||
|
function DetailObject() {
|
||||||
|
this.name = "example";
|
||||||
|
this.values = [1,2,3];
|
||||||
|
}
|
||||||
|
|
||||||
|
var event = fakeEvent("custom",fakeElement("DIV"),{
|
||||||
|
detail: new DetailObject()
|
||||||
|
});
|
||||||
|
|
||||||
|
var result = JSON.parse(JSON.stringify(cops(event)));
|
||||||
|
|
||||||
|
expect(result.detail).toEqual({
|
||||||
|
name: "example",
|
||||||
|
values: [1,2,3]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it("preserves CustomEvent.detail objects while dropping DOM objects inside them", function() {
|
||||||
|
var event = fakeEvent("custom",fakeElement("DIV"),{
|
||||||
|
detail: {
|
||||||
|
value: 123,
|
||||||
|
nested: {
|
||||||
|
target: fakeElement("SPAN"),
|
||||||
|
kept: "yes"
|
||||||
|
},
|
||||||
|
items: [
|
||||||
|
fakeElement("BUTTON"),
|
||||||
|
42
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var result = JSON.parse(JSON.stringify(cops(event)));
|
||||||
|
|
||||||
|
expect(result.detail.value).toBe(123);
|
||||||
|
|
||||||
|
expect(result.detail.nested.target).toBeUndefined();
|
||||||
|
expect(result.detail.nested.kept).toBe("yes");
|
||||||
|
|
||||||
|
expect(result.detail.items).toEqual([
|
||||||
|
null,
|
||||||
|
42
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it("accepts primitive, array and object arguments", function() {
|
||||||
|
var nullProto = Object.create(null);
|
||||||
|
nullProto.kept = true;
|
||||||
|
|
||||||
|
expect(cops(42)).toBe(42);
|
||||||
|
expect(cops(null)).toBe(null);
|
||||||
|
|
||||||
|
expect(cops([
|
||||||
|
1,
|
||||||
|
"two",
|
||||||
|
{three: 3}
|
||||||
|
])).toEqual([
|
||||||
|
1,
|
||||||
|
"two",
|
||||||
|
{three: 3}
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(cops({
|
||||||
|
a: 1,
|
||||||
|
b: {
|
||||||
|
c: 2
|
||||||
|
}
|
||||||
|
})).toEqual({
|
||||||
|
a: 1,
|
||||||
|
b: {
|
||||||
|
c: 2
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(JSON.parse(JSON.stringify(cops({
|
||||||
|
nullProto: nullProto
|
||||||
|
})))).toEqual({
|
||||||
|
nullProto: {
|
||||||
|
kept: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
created: 20231005205623086
|
created: 20231005205623086
|
||||||
modified: 20250807100434131
|
modified: 20260710090951727
|
||||||
tags: About
|
tags: About
|
||||||
title: TiddlyWiki Archive
|
title: TiddlyWiki Archive
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
\procedure versions()
|
\procedure versions()
|
||||||
5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9
|
5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9
|
||||||
@@ -9,7 +10,7 @@ title: TiddlyWiki Archive
|
|||||||
5.1.20 5.1.21 5.1.22 5.1.23
|
5.1.20 5.1.21 5.1.22 5.1.23
|
||||||
5.2.0 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7
|
5.2.0 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7
|
||||||
5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.3.8
|
5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.3.8
|
||||||
5.4.0
|
5.4.0 5.4.1
|
||||||
\end
|
\end
|
||||||
|
|
||||||
Older versions of TiddlyWiki are available in the [[archive|https://github.com/TiddlyWiki/tiddlywiki.com-gh-pages/tree/master/archive]]:
|
Older versions of TiddlyWiki are available in the [[archive|https://github.com/TiddlyWiki/tiddlywiki.com-gh-pages/tree/master/archive]]:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
created: 20130822170200000
|
created: 20130822170200000
|
||||||
icon: $:/core/icon
|
icon: $:/core/icon
|
||||||
list: [[A Gentle Guide to TiddlyWiki]] [[Discover TiddlyWiki]] [[Some of the things you can do with TiddlyWiki]] [[Ten reasons to switch to TiddlyWiki]] Examples [[What happened to the original TiddlyWiki?]]
|
list: [[A Gentle Guide to TiddlyWiki]] [[Discover TiddlyWiki]] [[Some of the things you can do with TiddlyWiki]] [[Ten reasons to switch to TiddlyWiki]] Examples [[What happened to the original TiddlyWiki?]]
|
||||||
modified: 20260420192600833
|
modified: 20260710091122803
|
||||||
tags: Welcome
|
tags: Welcome
|
||||||
title: HelloThere
|
title: HelloThere
|
||||||
type: text/vnd.tiddlywiki
|
type: text/vnd.tiddlywiki
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 50 KiB |
@@ -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,13 @@
|
|||||||
|
change-category: internal
|
||||||
|
change-type: bugfix
|
||||||
|
created: 20260710092852681
|
||||||
|
description: Fixes an issue with the minheight of textareas.
|
||||||
|
github-contributors: pmario
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9828
|
||||||
|
modified: 20260710093223971
|
||||||
|
release: 5.4.1
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
title: $:/changenotes/5.4.1/#9828
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
Fixes an issue with the minheight of textareas.
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
title: $:/changenotes/5.4.0/#9829
|
||||||
|
description: Update Polish translation
|
||||||
|
release: 5.4.1
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
change-type: enhancement
|
||||||
|
change-category: translation
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9829
|
||||||
|
github-contributors: EvidentlyCube
|
||||||
|
|
||||||
@@ -1,11 +1,14 @@
|
|||||||
title: $:/changenotes/5.4.1/#9836
|
|
||||||
description: Fix mid-text link cutoff, fix disabling freelinks toggle blanks view, and add configurable MaxLinks cap
|
|
||||||
tags: $:/tags/ChangeNote
|
|
||||||
release: 5.4.1
|
|
||||||
change-type: bugfix
|
|
||||||
change-category: plugin
|
change-category: plugin
|
||||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9836
|
change-type: bugfix
|
||||||
|
created: 20260710092644515
|
||||||
|
description: Freelinks: Fix mid-text link cutoff, fix disabling freelinks toggle blanks view, and add configurable ~MaxLinks cap
|
||||||
github-contributors: s793016
|
github-contributors: s793016
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9836
|
||||||
|
modified: 20260710092700225
|
||||||
|
release: 5.4.1
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
title: $:/changenotes/5.4.1/#9836
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
Fixes correctness and reliability issues in the freelinks plugin.
|
Fixes correctness and reliability issues in the freelinks plugin.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
change-category: widget
|
||||||
|
change-type: bugfix
|
||||||
|
created: 20260710093059614
|
||||||
|
description: Fixes a regression in the SelectWidget when selecting multiple values.
|
||||||
|
github-contributors: pmario
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9841
|
||||||
|
modified: 20260710093210171
|
||||||
|
release: 5.4.1
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
title: $:/changenotes/5.4.1/#9841
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
Fixes a regression in the SelectWidget when selecting multiple values.
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
title: $:/changenotes/5.4.0/#9870
|
||||||
|
description: Update Japanese translation
|
||||||
|
release: 5.4.1
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
change-type: enhancement
|
||||||
|
change-category: translation
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9870
|
||||||
|
github-contributors: IchijikuIchigo
|
||||||
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
change-category: plugin
|
||||||
|
change-type: bugfix
|
||||||
|
created: 20260710093318232
|
||||||
|
description: Katex: restores a missing font
|
||||||
|
github-contributors: Leilei332
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9873
|
||||||
|
modified: 20260710093432151
|
||||||
|
release: 5.4.1
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
title: $:/changenotes/5.4.1/#9873
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
Restores the missing KaTeX_Caligraphic-Regular.woff2
|
||||||
|
font in the Katex plugin
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
title: $:/changenotes/5.4.1/#9905
|
||||||
|
created: 20260709142414000
|
||||||
|
modified: 20260709142414000
|
||||||
|
description: Fix errors in eventcatcher while serializing event properties
|
||||||
|
release: 5.4.1
|
||||||
|
tags: $:/tags/ChangeNote
|
||||||
|
change-type: bugfix
|
||||||
|
change-category: internal
|
||||||
|
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9905
|
||||||
|
github-contributors: saqimtiaz
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
Fixes an issue in utils.copyObjectPropertiesSafe which did not correctly handle DOM objects from other windows resulting in an error.
|
||||||
@@ -1,13 +1,19 @@
|
|||||||
caption: 5.4.1
|
caption: 5.4.1
|
||||||
created: 20260508181012812
|
created: 20260508181012812
|
||||||
modified: 20260508181012812
|
description: Release v5.4.1 addresses regressions and bugs introduced in the v5.4.0 release.
|
||||||
|
modified: 20260710091945414
|
||||||
|
released: 20260710090509444
|
||||||
tags: ReleaseNotes
|
tags: ReleaseNotes
|
||||||
title: Release 5.4.1
|
title: Release 5.4.1
|
||||||
type: text/vnd.tiddlywiki
|
type: text/vnd.tiddlywiki
|
||||||
description: Under development
|
|
||||||
|
|
||||||
\procedure release-introduction()
|
\procedure release-introduction()
|
||||||
Release v5.4.1 is under development.
|
Release v5.4.1 addresses regressions and bugs introduced in the v5.4.0 release.
|
||||||
\end release-introduction
|
\end release-introduction
|
||||||
|
|
||||||
|
\define banner-credit-user-name() Peter
|
||||||
|
\define banner-credit-user-link() https://talk.tiddlywiki.org/u/peter
|
||||||
|
\define banner-credit-discussion-link() https://talk.tiddlywiki.org/t/vote-for-the-banner-tiddlywiki-v5-4-0/15016
|
||||||
|
\define banner-credit-permalink() https://raw.githubusercontent.com/TiddlyWiki/TiddlyWiki5/92caa7312ebc51c59cd345cc81b4a326661a0650/editions/tw5.com/tiddlers/images/New%20Release%20Banner.webp
|
||||||
|
|
||||||
<<releasenote 5.4.1>>
|
<<releasenote 5.4.1>>
|
||||||
|
|||||||
@@ -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 @@
|
|||||||
|
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>>
|
||||||
@@ -10,7 +10,6 @@ Advanced/ShadowInfo/Shadow/Hint: Tiddler <$link to=<<infoTiddler>>><$text text=<
|
|||||||
Advanced/ShadowInfo/Shadow/Source: Zdefiniiowany we wtyczce <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>
|
Advanced/ShadowInfo/Shadow/Source: Zdefiniiowany we wtyczce <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>
|
||||||
Advanced/ShadowInfo/OverriddenShadow/Hint: Nadpisany przez zwykłego tiddlera
|
Advanced/ShadowInfo/OverriddenShadow/Hint: Nadpisany przez zwykłego tiddlera
|
||||||
Advanced/CascadeInfo/Heading: Szczegóły Kaskady
|
Advanced/CascadeInfo/Heading: Szczegóły Kaskady
|
||||||
Advanced/CascadeInfo/Hint: These are the view template segments that are resolved for each of the system view template cascades
|
|
||||||
Advanced/CascadeInfo/Hint: Lista elementów widoku, których kaskady określają szablony użyte do wyświetlenia tiddlera
|
Advanced/CascadeInfo/Hint: Lista elementów widoku, których kaskady określają szablony użyte do wyświetlenia tiddlera
|
||||||
Advanced/CascadeInfo/Detail/View: Widok
|
Advanced/CascadeInfo/Detail/View: Widok
|
||||||
Advanced/CascadeInfo/Detail/ActiveCascadeFilter: Aktywny filtr kaskady
|
Advanced/CascadeInfo/Detail/ActiveCascadeFilter: Aktywny filtr kaskady
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)
|
TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)
|
||||||
|
|
||||||
Copyright (c) 2004-2007, Jeremy Ruston
|
Copyright (c) 2004-2007, Jeremy Ruston
|
||||||
Copyright (c) 2007-2026, UnaMesa Association
|
Copyright (c) 2007-2025, UnaMesa Association
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
Generated
+16
-6
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "tiddlywiki",
|
"name": "tiddlywiki",
|
||||||
"version": "5.4.0",
|
"version": "5.5.0-prerelease",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "tiddlywiki",
|
"name": "tiddlywiki",
|
||||||
"version": "5.4.0",
|
"version": "5.4.1",
|
||||||
"license": "BSD",
|
"license": "BSD",
|
||||||
"bin": {
|
"bin": {
|
||||||
"tiddlywiki": "tiddlywiki.js"
|
"tiddlywiki": "tiddlywiki.js"
|
||||||
@@ -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-prerelease",
|
"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": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<h1 class="">Welcome</h1><p>Welcome to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.</p><p>TiddlyWiki is a complete interactive wiki in JavaScript. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/WikiText.html">WikiText</a>.</p><h2 class="">Demo</h2><p>Learn more and see it in action at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/</a></p><h2 class="">Developer Documentation</h2><p>Developer documentation is in progress at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev/</a></p><h2 class="">Pull Request Previews</h2><p>Pull request previews courtesy of <a class="tc-tiddlylink-external" href="https://netlify.com" rel="noopener noreferrer" target="_blank">Netlify</a></p><p><a href="https://www.netlify.com" rel="noopener noreferrer" target="_blank"><img alt="Deploys by Netlify" src="https://www.netlify.com/v3/img/components/netlify-light.svg"></a></p><h1 class="">Join the Community</h1><p>
|
<h1 class="">Welcome</h1><p>Welcome to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.</p><p>TiddlyWiki is a complete interactive wiki in JavaScript. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/WikiText.html">WikiText</a>.</p><h2 class="">Demo</h2><p>Learn more and see it in action at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/</a></p><h2 class="">Developer Documentation</h2><p>Developer documentation is in progress at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev/</a></p><h2 class="">Pull Request Previews</h2><p>Pull request previews courtesy of <a class="tc-tiddlylink-external" href="https://netlify.com" rel="noopener noreferrer" target="_blank">Netlify</a></p><p><a href="https://www.netlify.com" rel="noopener noreferrer" target="_blank"><img alt="Deploys by Netlify" src="https://www.netlify.com/v3/img/components/netlify-light.svg"></a></p><h1 class="">Join the Community</h1><p>
|
||||||
<h2 class="">User forums</h2><h3 class="">Talk TiddlyWiki</h3><p>As the official TiddlyWiki forum, Talk TiddlyWiki is a place to talk about TiddlyWiki: requests for help, <a class="tc-tiddlylink-external" href="https://talk.tiddlywiki.org/c/announcements/20" rel="noopener noreferrer" target="_blank">announcements</a> of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><p><a class="tc-tiddlylink-external" href="https://talk.tiddlywiki.org/" rel="noopener noreferrer" target="_blank">https://talk.tiddlywiki.org/</a></p><h3 class="">Google Groups</h3><p>For the convenience of existing users, we also continue to operate the original TiddlyWiki group (hosted on Google Groups since 2005): <a class="tc-tiddlylink-external" href="https://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">https://groups.google.com/group/TiddlyWiki</a></p><h2 class="">Developer forums</h2><ul><li><a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev" rel="noopener noreferrer" target="_blank">tiddlywiki.com/dev</a> is the official developer documentation</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/TiddlyWiki/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a></li><li><a class="tc-tiddlylink-external" href="https://github.com/TiddlyWiki/TiddlyWiki5/discussions" rel="noopener noreferrer" target="_blank">GitHub Discussions</a> are for Q&A and open-ended discussion</li><li><a class="tc-tiddlylink-external" href="https://github.com/TiddlyWiki/TiddlyWiki5/issues" rel="noopener noreferrer" target="_blank">GitHub Issues</a> are for raising bug reports and proposing specific, actionable new ideas</li><li>See <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Contributing.html">Contributing</a> for guidelines on how to contribute to the project.</li></ul><h2 class="">Other forums</h2><ul><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> Subreddit: <a class="tc-tiddlylink-external" href="https://www.reddit.com/r/TiddlyWiki5/" rel="noopener noreferrer" target="_blank">/r/TiddlyWiki5</a></li><li>Chat on Discord at <a class="tc-tiddlylink-external" href="https://discord.gg/HFFZVQ8" rel="noopener noreferrer" target="_blank">https://discord.gg/HFFZVQ8</a></li></ul>
|
<h2 class="">User forums</h2><h3 class="">Talk TiddlyWiki</h3><p>As the official TiddlyWiki forum, Talk TiddlyWiki is a place to talk about TiddlyWiki: requests for help, <a class="tc-tiddlylink-external" href="https://talk.tiddlywiki.org/c/announcements/20" rel="noopener noreferrer" target="_blank">announcements</a> of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><p><a class="tc-tiddlylink-external" href="https://talk.tiddlywiki.org/" rel="noopener noreferrer" target="_blank">https://talk.tiddlywiki.org/</a></p><h3 class="">Google Groups</h3><p>For the convenience of existing users, we also continue to operate the original TiddlyWiki group (hosted on Google Groups since 2005): <a class="tc-tiddlylink-external" href="https://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">https://groups.google.com/group/TiddlyWiki</a></p><h2 class="">Developer forums</h2><ul><li><a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev" rel="noopener noreferrer" target="_blank">tiddlywiki.com/dev</a> is the official developer documentation</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/TiddlyWiki/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a></li><li><a class="tc-tiddlylink-external" href="https://github.com/TiddlyWiki/TiddlyWiki5/discussions" rel="noopener noreferrer" target="_blank">GitHub Discussions</a> are for Q&A and open-ended discussion</li><li><a class="tc-tiddlylink-external" href="https://github.com/TiddlyWiki/TiddlyWiki5/issues" rel="noopener noreferrer" target="_blank">GitHub Issues</a> are for raising bug reports and proposing specific, actionable new ideas</li><li>See <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Contributing.html">Contributing</a> for guidelines on how to contribute to the project.</li></ul><h2 class="">Other forums</h2><ul><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> Subreddit: <a class="tc-tiddlylink-external" href="https://www.reddit.com/r/TiddlyWiki5/" rel="noopener noreferrer" target="_blank">/r/TiddlyWiki5</a></li><li>Chat on Discord at <a class="tc-tiddlylink-external" href="https://discord.gg/HFFZVQ8" rel="noopener noreferrer" target="_blank">https://discord.gg/HFFZVQ8</a></li></ul>
|
||||||
</p><hr><h1 class="">Installing TiddlyWiki on Node.js</h1><p>TiddlyWiki is a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/SingleFileApplication.html">SingleFileApplication</a>, which is easy to use. For advanced users and developers there is a possibility to use a Node.js client / server configuration. This configuration is also used to build the TiddlyWiki <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/SinglePageApplication.html">SinglePageApplication</a></p><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>Linux: <blockquote><div><em>Debian/Ubuntu</em>:<br><code>apt install nodejs</code><br>May need to be followed up by:<br><code>apt install npm</code></div><div><em>Arch Linux</em><br><code>yay -S tiddlywiki</code> <br>(installs node and tiddlywiki)</div></blockquote></li><li>Mac<blockquote><div><code>brew install node</code></div></blockquote></li><li>Android<blockquote><div><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a></div></blockquote></li><li>Other <blockquote><div>See <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></div></blockquote></li></ul></li><li>Open a command line terminal and type:<blockquote><div><code>npm install -g tiddlywiki</code></div><div>If it fails with an error you may need to re-run the command as an administrator:</div><div><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</div></blockquote></li><li>Ensure TiddlyWiki is installed by typing:<blockquote><div><code>tiddlywiki --version</code></div></blockquote><ul><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.4.0". You may also see other debugging information reported.)</li></ul></li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <span class="doc-icon"><svg class="tc-image-save-button-dynamic tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt">
|
</p><hr><h1 class="">Installing TiddlyWiki on Node.js</h1><p>TiddlyWiki is a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/SingleFileApplication.html">SingleFileApplication</a>, which is easy to use. For advanced users and developers there is a possibility to use a Node.js client / server configuration. This configuration is also used to build the TiddlyWiki <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/SinglePageApplication.html">SinglePageApplication</a></p><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>Linux: <blockquote><div><em>Debian/Ubuntu</em>:<br><code>apt install nodejs</code><br>May need to be followed up by:<br><code>apt install npm</code></div><div><em>Arch Linux</em><br><code>yay -S tiddlywiki</code> <br>(installs node and tiddlywiki)</div></blockquote></li><li>Mac<blockquote><div><code>brew install node</code></div></blockquote></li><li>Android<blockquote><div><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a></div></blockquote></li><li>Other <blockquote><div>See <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></div></blockquote></li></ul></li><li>Open a command line terminal and type:<blockquote><div><code>npm install -g tiddlywiki</code></div><div>If it fails with an error you may need to re-run the command as an administrator:</div><div><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</div></blockquote></li><li>Ensure TiddlyWiki is installed by typing:<blockquote><div><code>tiddlywiki --version</code></div></blockquote><ul><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.4.1". You may also see other debugging information reported.)</li></ul></li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <span class="doc-icon"><svg class="tc-image-save-button-dynamic tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt">
|
||||||
<g class="tc-image-save-button-dynamic-clean">
|
<g class="tc-image-save-button-dynamic-clean">
|
||||||
<path d="M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z" fill-rule="evenodd"></path>
|
<path d="M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z" fill-rule="evenodd"></path>
|
||||||
</g>
|
</g>
|
||||||
|
|||||||
Reference in New Issue
Block a user