mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-07-11 06:12:45 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1ec36293df |
@@ -0,0 +1,69 @@
|
||||
# Repository Contribution Guidelines & Automation
|
||||
|
||||
This document establishes the single source of truth for repository contribution guidelines, optimized for AI context consumption, alongside a TiddlyWiki-based automation strategy to prevent source-of-truth drift.
|
||||
|
||||
---
|
||||
|
||||
## 📄 The High-Density Ruleset
|
||||
*Copy the content below into a single master tiddler titled `ProjectContributionRules` with the type `text/x-markdown`.*
|
||||
|
||||
```markdown
|
||||
# CONTRIBUTING
|
||||
|
||||
## AI & Comment Rules
|
||||
* Banned: Conversational filler, verbose explanations of standard APIs, or teaching basic programming logic.
|
||||
* Required: Prune all AI-generated comment blocks down to a single sentence maximum.
|
||||
* Focus: Comments must only state the "why" behind non-obvious engineering decisions, never the "how".
|
||||
* PR Descriptions: Write concise, bulleted summaries of what changed. Do not use AI-generated marketing/polite filler text.
|
||||
|
||||
### Code Comment Examples
|
||||
* BAD: // Use behavior:"instant" so that this animation's per-frame position updates are applied immediately and are NOT re-animated by a CSS `scroll-behavior: smooth` on the scrolling element (which would make the page lag behind and stutter).
|
||||
* GOOD: // Use 'instant' to prevent conflicts with CSS scroll-behavior: smooth.
|
||||
|
||||
## Workflow Rules
|
||||
* Branching: Base all feature branches on `main`. Use `feat/` or `fix/` prefixes.
|
||||
* Scope: Keep pull requests limited to a single logical change. Massive, multi-feature PRs will be rejected.
|
||||
* Testing: Run local tests and formatting checks before pushing.
|
||||
* Merging: All commits are squashed on merge.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ TiddlyWiki Build Integration
|
||||
To ensure this file is distributed automatically to all required locations without duplication, use TiddlyWiki's native command-line rendering tool.
|
||||
|
||||
### 1. Update `tiddlywiki.info`
|
||||
Add a dedicated `repo-configs` target to your project's `tiddlywiki.info` JSON file. This instructs TiddlyWiki to compile the master tiddler out to both human-facing and AI-facing configuration endpoints:
|
||||
|
||||
```json
|
||||
{
|
||||
"description": "Project build targets",
|
||||
"plugins": [
|
||||
"tiddlywiki/markdown"
|
||||
],
|
||||
"build": {
|
||||
"repo-configs": [
|
||||
"--rendertiddler", "ProjectContributionRules", "./CONTRIBUTING.md", "text/plain",
|
||||
"--rendertiddler", "ProjectContributionRules", "./.claudecode", "text/plain"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Update `package.json`
|
||||
Integrate the rendering command into your existing Node.js project lifecycle scripts so it triggers automatically during development builds or pre-commit checks:
|
||||
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"build:configs": "tiddlywiki --build repo-configs"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Why This Works
|
||||
* **Zero Duplication:** Edits are made exclusively within `ProjectContributionRules` inside the wiki workspace.
|
||||
* **Human Visibility:** Browsing GitHub automatically surfaces `CONTRIBUTING.md` to human contributors.
|
||||
* **Claude Code Ready:** When **Claude Code** sweeps the project root, it instantly reads the identical, strict engineering boundaries outputted to `.claudecode`.
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
# Default to the current version number for building the plugin library
|
||||
|
||||
if [ -z "$TW5_BUILD_VERSION" ]; then
|
||||
TW5_BUILD_VERSION=v5.5.0.
|
||||
TW5_BUILD_VERSION=v5.4.1.
|
||||
fi
|
||||
|
||||
echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,8 +0,0 @@
|
||||
title: TiddlyWiki Team
|
||||
tags: Community/Team
|
||||
modified: 20260708095630754
|
||||
created: 20260708095630754
|
||||
leader: @BurningTreeC
|
||||
team:
|
||||
|
||||
The TiddlyDesktop development repository is at https://github.com/TiddlyWiki/TiddlyDesktop
|
||||
@@ -31,16 +31,13 @@ exports.parse = function() {
|
||||
reEnd.lastIndex = this.parser.pos;
|
||||
var match = reEnd.exec(this.parser.source),
|
||||
text,
|
||||
start = this.parser.pos,
|
||||
textEnd;
|
||||
start = this.parser.pos;
|
||||
// Process the text
|
||||
if(match) {
|
||||
text = this.parser.source.substring(this.parser.pos,match.index);
|
||||
textEnd = match.index;
|
||||
this.parser.pos = match.index + match[0].length;
|
||||
} else {
|
||||
text = this.parser.source.substr(this.parser.pos);
|
||||
textEnd = this.parser.sourceLength;
|
||||
this.parser.pos = this.parser.sourceLength;
|
||||
}
|
||||
return [{
|
||||
@@ -50,7 +47,7 @@ exports.parse = function() {
|
||||
type: "text",
|
||||
text: text,
|
||||
start: start,
|
||||
end: textEnd
|
||||
end: this.parser.pos
|
||||
}]
|
||||
}];
|
||||
};
|
||||
|
||||
@@ -32,8 +32,7 @@ exports.parse = function() {
|
||||
this.parser.pos = this.matchRegExp.lastIndex;
|
||||
// Create the link unless it is suppressed
|
||||
if(this.match[0].substr(0,1) === "~") {
|
||||
// Start after the suppressing "~" so the span matches the plain text
|
||||
return [{type: "text", text: this.match[0].substr(1), start: start + 1, end: this.parser.pos}];
|
||||
return [{type: "text", text: this.match[0].substr(1), start: start, end: this.parser.pos}];
|
||||
} else {
|
||||
return [{
|
||||
type: "element",
|
||||
|
||||
@@ -34,7 +34,7 @@ exports.parse = function() {
|
||||
// Parse the filter terminated by a line break
|
||||
var reMatch = /(.*)(?:$|\r?\n)/mg;
|
||||
reMatch.lastIndex = this.parser.pos;
|
||||
var filterStart = this.parser.pos;
|
||||
var filterStart = this.parser.source;
|
||||
var match = reMatch.exec(this.parser.source);
|
||||
this.parser.pos = reMatch.lastIndex;
|
||||
// Parse tree nodes to return
|
||||
|
||||
@@ -27,11 +27,9 @@ Parse the most recent match
|
||||
*/
|
||||
exports.parse = function() {
|
||||
// Get the details of the match
|
||||
var linkText = this.match[0],
|
||||
// Start after the suppressing "~" so the span matches the plain text
|
||||
start = this.parser.pos + 1;
|
||||
var linkText = this.match[0];
|
||||
// Move past the wikilink
|
||||
this.parser.pos = this.matchRegExp.lastIndex;
|
||||
// Return the link without unwikilink character as plain text
|
||||
return [{type: "text", text: linkText.substr(1), start: start, end: this.parser.pos}];
|
||||
return [{type: "text", text: linkText.substr(1)}];
|
||||
};
|
||||
|
||||
@@ -243,28 +243,8 @@ exports.slowInSlowOut = function(t) {
|
||||
};
|
||||
|
||||
exports.copyObjectPropertiesSafe = function(object) {
|
||||
const seen = new Set();
|
||||
|
||||
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;
|
||||
}
|
||||
const seen = new Set(),
|
||||
isDOMElement = (value) => value instanceof Node || value instanceof Window;
|
||||
|
||||
function safeCopy(obj) {
|
||||
// skip circular references
|
||||
@@ -275,6 +255,10 @@ exports.copyObjectPropertiesSafe = function(object) {
|
||||
if(typeof obj !== "object" || obj === null) {
|
||||
return obj;
|
||||
}
|
||||
// skip DOM elements
|
||||
if(isDOMElement(obj)) {
|
||||
return undefined;
|
||||
}
|
||||
// copy arrays, preserving positions
|
||||
if(Array.isArray(obj)) {
|
||||
return obj.map((item) => {
|
||||
@@ -282,11 +266,7 @@ exports.copyObjectPropertiesSafe = function(object) {
|
||||
return value === undefined ? null : value;
|
||||
});
|
||||
}
|
||||
// skip DOM elements
|
||||
if(isDOMElement(obj)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
|
||||
seen.add(obj);
|
||||
const copy = {};
|
||||
let key,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
title: $:/config/OfficialPluginLibrary
|
||||
tags: $:/tags/PluginLibrary
|
||||
url: https://tiddlywiki.com/library/v5.5.0/index.html
|
||||
url: https://tiddlywiki.com/library/v5.4.1/index.html
|
||||
caption: {{$:/language/OfficialPluginLibrary}}
|
||||
|
||||
{{$:/language/OfficialPluginLibrary/Hint}}
|
||||
|
||||
@@ -8,8 +8,9 @@ type: text/vnd.tiddlywiki
|
||||
# Ensure the new release banner image is up to date
|
||||
# Update ''master'' with changes from ''tiddlywiki-com''
|
||||
# Verify the version numbers in [[$:/config/OfficialPluginLibrary]] in `core/wiki/config/OfficialPluginLibrary.tid`
|
||||
# Adjust the release date and the ''released'' field of the 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
|
||||
# Move the latest release note from the prerelease edition into the tw5.com edition
|
||||
# Adjust the release date and the ''released'' field of the latest release tiddler (eg, [[Release 5.1.3]])
|
||||
# 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
|
||||
# Ensure [[TiddlyWiki Releases]] has the new version as the default tab
|
||||
# Adjust the modified time of HelloThere
|
||||
@@ -22,6 +23,7 @@ type: text/vnd.tiddlywiki
|
||||
# Run `./bin/readme-bld.sh` to build the readme files
|
||||
# Commit the new readme files to ''master''
|
||||
# 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
|
||||
|
||||
!! Make New Release
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"description": "Developer documentation from https://tiddlywiki.com/dev/",
|
||||
"plugins": [
|
||||
"tiddlywiki/highlight",
|
||||
"tiddlywiki/nodewebkitsaver",
|
||||
"tiddlywiki/github-fork-ribbon",
|
||||
"tiddlywiki/menubar",
|
||||
"tiddlywiki/internals",
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"description": "A step by step introduction to TiddlyWiki",
|
||||
"plugins": [
|
||||
"tiddlywiki/cecily",
|
||||
"tiddlywiki/codemirror",
|
||||
"tiddlywiki/highlight",
|
||||
"tiddlywiki/katex"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
title: $:/config/LocalPluginLibrary
|
||||
tags: $:/tags/PluginLibrary
|
||||
url: http://127.0.0.1:8080/prerelease/library/v5.5.0/index.html
|
||||
url: http://127.0.0.1:8080/prerelease/library/v5.4.1/index.html
|
||||
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//
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
title: $:/config/OfficialPluginLibrary
|
||||
tags: $:/tags/PluginLibrary
|
||||
url: https://tiddlywiki.com/prerelease/library/v5.5.0/index.html
|
||||
url: https://tiddlywiki.com/prerelease/library/v5.4.1/index.html
|
||||
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.
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
Fast test runner that boots the test edition and runs selected test specs.
|
||||
Skips the expensive --rendertiddler step from --build index.
|
||||
|
||||
Usage:
|
||||
node test-parser-quick.js [test-files...]
|
||||
|
||||
Examples:
|
||||
node test-parser-quick.js # Run ALL specs
|
||||
node test-parser-quick.js test-wikitext-parser # Run one spec file
|
||||
node test-parser-quick.js test-wikitext-parser test-filters # Run multiple spec files
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
var $tw = require("../../boot/boot.js").TiddlyWiki();
|
||||
|
||||
$tw.boot.argv = ["editions/test"];
|
||||
|
||||
// Disable startup modules that aren't needed for tests
|
||||
$tw.boot.disabledStartupModules = [
|
||||
"favicon", "password", "browser-messaging", "info",
|
||||
"render", "rootwidget", "story", "windows"
|
||||
];
|
||||
|
||||
$tw.boot.boot(function() {
|
||||
var args = process.argv.slice(2);
|
||||
var allTests = $tw.wiki.filterTiddlers("[all[tiddlers+shadows]type[application/javascript]tag[$:/tags/test-spec]]");
|
||||
|
||||
// Filter test tiddlers if arguments provided
|
||||
var testsToRun;
|
||||
if(args.length > 0) {
|
||||
testsToRun = allTests.filter(function(title) {
|
||||
return args.some(function(arg) {
|
||||
return title.toLowerCase().indexOf(arg.toLowerCase()) !== -1;
|
||||
});
|
||||
});
|
||||
if(testsToRun.length === 0) {
|
||||
console.error("No test files matched: " + args.join(", "));
|
||||
console.error("Available test files:");
|
||||
allTests.forEach(function(t) { console.error(" " + t); });
|
||||
process.exit(1);
|
||||
}
|
||||
} else {
|
||||
testsToRun = allTests;
|
||||
}
|
||||
|
||||
// Override the test filter to only include our selected tests
|
||||
var titlesSet = Object.create(null);
|
||||
testsToRun.forEach(function(t) { titlesSet[t] = true; });
|
||||
|
||||
var origFilterTiddlers = $tw.wiki.filterTiddlers.bind($tw.wiki);
|
||||
$tw.wiki.filterTiddlers = function(filterString) {
|
||||
var result = origFilterTiddlers.apply(null, arguments);
|
||||
if(filterString.indexOf("$:/tags/test-spec") !== -1) {
|
||||
return result.filter(function(t) { return titlesSet[t]; });
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
console.log("Running " + testsToRun.length + " of " + allTests.length + " test files");
|
||||
|
||||
// Use the jasmine plugin's own runTests function
|
||||
var jasmine = $tw.modules.execute("$:/plugins/tiddlywiki/jasmine/jasmine-plugin.js");
|
||||
jasmine.runTests(function(err) {
|
||||
if(err) {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -1,60 +0,0 @@
|
||||
/*\
|
||||
title: test-parsetree-positions.js
|
||||
type: application/javascript
|
||||
tags: [[$:/tags/test-spec]]
|
||||
|
||||
Regression tests for #9882: wikitext parser rules must emit accurate
|
||||
`start`/`end` source positions on their parse tree nodes. Tooling that maps
|
||||
rendered output back to the source text relies on these offsets.
|
||||
|
||||
\*/
|
||||
|
||||
"use strict";
|
||||
|
||||
describe("Parse tree source position tests (#9882)", function() {
|
||||
|
||||
// Create a wiki
|
||||
var wiki = $tw.test.wiki();
|
||||
|
||||
// Define a parsing shortcut
|
||||
var parse = function(text) {
|
||||
return wiki.parseText("text/vnd.tiddlywiki",text).tree;
|
||||
};
|
||||
|
||||
it("should give inline code runs a text node that spans only the code, not the backticks", function() {
|
||||
// codeinline.js: `code` gives a text node "code" spanning offsets 1 to 5. The closing backtick at 5 is excluded.
|
||||
// Bug: `end` was set to `this.parser.pos`, which sits past the closing backtick, so end was 6 and the span swallowed the backtick.
|
||||
expect(parse("`code`")).toEqual(
|
||||
[ { type: "element", tag: "p", rule: "parseblock", start: 0, end: 6, children: [ { type: "element", tag: "code", rule: "codeinline", start: 0, end: 6, children: [ { type: "text", text: "code", start: 1, end: 5 } ] } ] } ]
|
||||
);
|
||||
// ``a`b`` gives text "a`b" spanning 2 to 5. `end` must be the offset of the closing marker whatever its length.
|
||||
// Bug: `end` was `this.parser.pos` (7), two characters past the code, so it also swallowed the closing ``.
|
||||
expect(parse("``a`b``")).toEqual(
|
||||
[ { type: "element", tag: "p", rule: "parseblock", start: 0, end: 7, children: [ { type: "element", tag: "code", rule: "codeinline", start: 0, end: 7, children: [ { type: "text", text: "a`b", start: 2, end: 5 } ] } ] } ]
|
||||
);
|
||||
});
|
||||
|
||||
it("should start the text node of a suppressed external link after the ~", function() {
|
||||
// extlink.js: ~https://example.com/ emits the plain text "https://example.com/", which spans offsets 1 to 21.
|
||||
// Bug: `start` was the offset of the ~ (0), so the span was one character too wide and began on the ~ that the text omits.
|
||||
expect(parse("~https://example.com/")).toEqual(
|
||||
[ { type: "element", tag: "p", rule: "parseblock", start: 0, end: 21, children: [ { type: "text", text: "https://example.com/", start: 1, end: 21, rule: "extlink" } ] } ]
|
||||
);
|
||||
});
|
||||
|
||||
it("should give a suppressed wikilink's text node source positions", function() {
|
||||
// wikilinkprefix.js: ~SuppressedLink emits the plain text "SuppressedLink", spanning offsets 1 to 15.
|
||||
// Bug: the text node carried no `start`/`end` at all. The parser framework then defaulted `start` to the ~ offset (0).
|
||||
expect(parse("~SuppressedLink")).toEqual(
|
||||
[ { type: "element", tag: "p", rule: "parseblock", start: 0, end: 15, children: [ { type: "text", text: "SuppressedLink", start: 1, end: 15, rule: "wikilinkprefix" } ] } ]
|
||||
);
|
||||
});
|
||||
|
||||
it("should record the filter's start offset for an \\import pragma", function() {
|
||||
// import.js: \import [tag[x]] records the filter value "[tag[x]]" starting at offset 8, right after "\import ".
|
||||
// Bug: `filterStart` was assigned `this.parser.source` (the whole source string) instead of `this.parser.pos`, so `start` was a string, not an offset.
|
||||
expect(parse("\\import [tag[x]]\n")).toEqual(
|
||||
[ { type: "importvariables", rule: "import", start: 0, end: 16, attributes: { filter: { type: "string", value: "[tag[x]]", start: 8, end: 16 } }, children: [] } ]
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -1,240 +0,0 @@
|
||||
/*\
|
||||
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,8 +1,7 @@
|
||||
created: 20231005205623086
|
||||
modified: 20260710090951727
|
||||
modified: 20250807100434131
|
||||
tags: About
|
||||
title: TiddlyWiki Archive
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
\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
|
||||
@@ -10,7 +9,7 @@ type: text/vnd.tiddlywiki
|
||||
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.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.1
|
||||
5.4.0
|
||||
\end
|
||||
|
||||
Older versions of TiddlyWiki are available in the [[archive|https://github.com/TiddlyWiki/tiddlywiki.com-gh-pages/tree/master/archive]]:
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
title: Community Survey 2025
|
||||
created: 20250708130030654
|
||||
modified: 20250826162904085
|
||||
title: Community Survey 2025
|
||||
|
||||
<div style.float="right" style.padding-left="1em">
|
||||
<$image source="Community Survey 2025 Image" alt="Shaping the future of TiddlyWiki with the Community Survey 2025" width="280"/>
|
||||
<$image source="Community Survey 2025" alt="Shaping the future of TiddlyWiki with the Community Survey 2025" width="280"/>
|
||||
</div>
|
||||
|
||||
The core developers work hard year by year to continuously improve ~TiddlyWiki. Part of the satisfaction is that we are not just building software for ourselves, we’re serving the needs of a wider community of users.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
created: 20130822170200000
|
||||
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?]]
|
||||
modified: 20260710091122803
|
||||
modified: 20260420192600833
|
||||
tags: Welcome
|
||||
title: HelloThere
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 54 KiB |
@@ -1,13 +0,0 @@
|
||||
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.
|
||||
@@ -1,9 +0,0 @@
|
||||
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,14 +1,11 @@
|
||||
change-category: plugin
|
||||
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-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
|
||||
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
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9836
|
||||
github-contributors: s793016
|
||||
|
||||
Fixes correctness and reliability issues in the freelinks plugin.
|
||||
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
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.
|
||||
@@ -1,9 +0,0 @@
|
||||
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
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
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
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
title: $:/changenotes/5.4.1/#9882
|
||||
created: 20260701142414000
|
||||
modified: 20260701142414000
|
||||
description: Fix invalid source positions in parse tree nodes
|
||||
release: 5.4.1
|
||||
tags: $:/tags/ChangeNote
|
||||
change-type: bugfix
|
||||
change-category: internal
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9882
|
||||
github-contributors: pmario
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
Several wikitext parser rules emitted parse tree nodes with missing or incorrect `start` and `end` source positions. Accurate positions are needed by tooling that maps rendered output back to the source text.
|
||||
|
||||
* ''Inline code'' (`` `code` ``): the text node `end` no longer runs past the closing backtick, so the span covers only the code text.
|
||||
|
||||
* ''Suppressed external links'' (`~https://example.com`): the text node now starts after the suppressing `~`, matching the plain text that is emitted.
|
||||
|
||||
* ''Suppressed wikilinks'' (`~SuppressedLink`): the text node now carries `start` and `end` positions. Previously it had none.
|
||||
|
||||
* ''Import filter'' (`\import`): the filter start position was set to the whole source string instead of the current parse position. It now uses the correct offset.
|
||||
@@ -1,13 +0,0 @@
|
||||
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,19 +1,13 @@
|
||||
caption: 5.4.1
|
||||
created: 20260508181012812
|
||||
description: Release v5.4.1 addresses regressions and bugs introduced in the v5.4.0 release.
|
||||
modified: 20260710091945414
|
||||
released: 20260710090509444
|
||||
modified: 20260508181012812
|
||||
tags: ReleaseNotes
|
||||
title: Release 5.4.1
|
||||
type: text/vnd.tiddlywiki
|
||||
description: Under development
|
||||
|
||||
\procedure release-introduction()
|
||||
Release v5.4.1 addresses regressions and bugs introduced in the v5.4.0 release.
|
||||
Release v5.4.1 is under development.
|
||||
\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>>
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
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,6 +10,7 @@ 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/OverriddenShadow/Hint: Nadpisany przez zwykłego tiddlera
|
||||
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/Detail/View: Widok
|
||||
Advanced/CascadeInfo/Detail/ActiveCascadeFilter: Aktywny filtr kaskady
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)
|
||||
|
||||
Copyright (c) 2004-2007, Jeremy Ruston
|
||||
Copyright (c) 2007-2025, UnaMesa Association
|
||||
Copyright (c) 2007-2026, UnaMesa Association
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "tiddlywiki",
|
||||
"version": "5.5.0-prerelease",
|
||||
"version": "5.4.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "tiddlywiki",
|
||||
"version": "5.4.1",
|
||||
"version": "5.4.0",
|
||||
"license": "BSD",
|
||||
"bin": {
|
||||
"tiddlywiki": "tiddlywiki.js"
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "tiddlywiki",
|
||||
"preferGlobal": true,
|
||||
"version": "5.5.0-prerelease",
|
||||
"version": "5.4.1-prerelease",
|
||||
"author": "Jeremy Ruston <jeremy@jermolene.com>",
|
||||
"description": "a non-linear personal web notebook",
|
||||
"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>
|
||||
<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.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">
|
||||
</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">
|
||||
<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>
|
||||
</g>
|
||||
|
||||
Reference in New Issue
Block a user