mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-01-25 12:23:42 +00:00
Compare commits
26 Commits
master
...
intrinsic-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c05400021c | ||
|
|
5111be1953 | ||
|
|
9dadd3fafb | ||
|
|
12ced06d1d | ||
|
|
a4e8308e75 | ||
|
|
9a2534fc5e | ||
|
|
2ae1e5aa09 | ||
|
|
378b9b3627 | ||
|
|
e01c428a17 | ||
|
|
752c5cfbda | ||
|
|
094428b1ab | ||
|
|
41cd335cf4 | ||
|
|
26b2768294 | ||
|
|
4e3d07b16a | ||
|
|
01beac1d7c | ||
|
|
0c80e1b35c | ||
|
|
55c634692b | ||
|
|
7e2a8238b5 | ||
|
|
ee90ad2fa6 | ||
|
|
afabe5b714 | ||
|
|
3a60e0eb17 | ||
|
|
6b0a13b8cc | ||
|
|
c142bfc50d | ||
|
|
e8de413fba | ||
|
|
4cbf1b4d91 | ||
|
|
778e544f1c |
@@ -105,6 +105,7 @@ node $TW5_BUILD_TIDDLYWIKI \
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# /index.html Main site
|
# /index.html Main site
|
||||||
|
# /external-(version).html External core version of main site
|
||||||
# /favicon.ico Favicon for main site
|
# /favicon.ico Favicon for main site
|
||||||
# /static.html Static rendering of default tiddlers
|
# /static.html Static rendering of default tiddlers
|
||||||
# /alltiddlers.html Static rendering of all tiddlers
|
# /alltiddlers.html Static rendering of all tiddlers
|
||||||
@@ -117,7 +118,7 @@ node $TW5_BUILD_TIDDLYWIKI \
|
|||||||
--version \
|
--version \
|
||||||
--load $TW5_BUILD_OUTPUT/build.tid \
|
--load $TW5_BUILD_OUTPUT/build.tid \
|
||||||
--output $TW5_BUILD_OUTPUT \
|
--output $TW5_BUILD_OUTPUT \
|
||||||
--build favicon static index \
|
--build favicon static index external-js \
|
||||||
|| exit 1
|
|| exit 1
|
||||||
|
|
||||||
# /empty.html Empty
|
# /empty.html Empty
|
||||||
|
|||||||
295
boot/boot.js
295
boot/boot.js
@@ -1068,6 +1068,10 @@ $tw.Tiddler.prototype.hasField = function(field) {
|
|||||||
return $tw.utils.hop(this.fields,field);
|
return $tw.utils.hop(this.fields,field);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$tw.Tiddler.prototype.isPlugin = function() {
|
||||||
|
return this.fields.type === "application/json" && this.hasField("plugin-type") && !this.hasField("draft.of");
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compare two tiddlers for equality
|
Compare two tiddlers for equality
|
||||||
tiddler: the tiddler to compare
|
tiddler: the tiddler to compare
|
||||||
@@ -1162,21 +1166,21 @@ enableIndexers - Array of indexer names to enable, or null to use all available
|
|||||||
$tw.Wiki = function(options) {
|
$tw.Wiki = function(options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
var self = this,
|
var self = this,
|
||||||
tiddlers = Object.create(null), // Hashmap of tiddlers
|
tiddlerStore = Object.create(null), // Hashmap of tiddlers
|
||||||
tiddlerTitles = null, // Array of tiddler titles
|
tiddlerTitles = null, // Array of tiddler titles, calculated and cached when needed
|
||||||
getTiddlerTitles = function() {
|
getTiddlerTitles = function() {
|
||||||
if(!tiddlerTitles) {
|
if(!tiddlerTitles) {
|
||||||
tiddlerTitles = Object.keys(tiddlers).sort(function(a,b) {return a.localeCompare(b);});
|
tiddlerTitles = Object.keys(tiddlerStore).sort(function(a,b) {return a.localeCompare(b);});
|
||||||
}
|
}
|
||||||
return tiddlerTitles;
|
return tiddlerTitles;
|
||||||
},
|
},
|
||||||
pluginTiddlers = [], // Array of tiddlers containing registered plugins, ordered by priority
|
pluginTiddlersInfo = [], // Array of tiddler fields for all plugins and sub-plugins, ordered by priority
|
||||||
pluginInfo = Object.create(null), // Hashmap of parsed plugin content
|
pluginContents = Object.create(null), // Hashmap by title of {contents:<parsed plugin contents>,fields:<fields>,subPluginTitles:<list>}
|
||||||
shadowTiddlers = Object.create(null), // Hashmap by title of {source:, tiddler:}
|
shadowTiddlerInfo = Object.create(null), // Hashmap by title of {source:, tiddler:}
|
||||||
shadowTiddlerTitles = null,
|
shadowTiddlerTitles = null, // Array of tiddler titles, calculated and cached when needed
|
||||||
getShadowTiddlerTitles = function() {
|
getShadowTiddlerTitles = function() {
|
||||||
if(!shadowTiddlerTitles) {
|
if(!shadowTiddlerTitles) {
|
||||||
shadowTiddlerTitles = Object.keys(shadowTiddlers).sort(function(a,b) {return a.localeCompare(b);});
|
shadowTiddlerTitles = Object.keys(shadowTiddlerInfo).sort(function(a,b) {return a.localeCompare(b);});
|
||||||
}
|
}
|
||||||
return shadowTiddlerTitles;
|
return shadowTiddlerTitles;
|
||||||
},
|
},
|
||||||
@@ -1218,7 +1222,7 @@ $tw.Wiki = function(options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Save the new tiddler
|
// Save the new tiddler
|
||||||
tiddlers[title] = tiddler;
|
tiddlerStore[title] = tiddler;
|
||||||
// Check we've got the title
|
// Check we've got the title
|
||||||
tiddlerTitles = $tw.utils.insertSortedArray(tiddlerTitles || [],title);
|
tiddlerTitles = $tw.utils.insertSortedArray(tiddlerTitles || [],title);
|
||||||
// Record the new tiddler state
|
// Record the new tiddler state
|
||||||
@@ -1243,7 +1247,7 @@ $tw.Wiki = function(options) {
|
|||||||
this.deleteTiddler = function(title) {
|
this.deleteTiddler = function(title) {
|
||||||
// Uncomment the following line for detailed logs of all tiddler deletions
|
// Uncomment the following line for detailed logs of all tiddler deletions
|
||||||
// console.log("Deleting",title)
|
// console.log("Deleting",title)
|
||||||
if($tw.utils.hop(tiddlers,title)) {
|
if($tw.utils.hop(tiddlerStore,title)) {
|
||||||
// Record the old tiddler state
|
// Record the old tiddler state
|
||||||
var updateDescriptor = {
|
var updateDescriptor = {
|
||||||
old: {
|
old: {
|
||||||
@@ -1253,7 +1257,7 @@ $tw.Wiki = function(options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Delete the tiddler
|
// Delete the tiddler
|
||||||
delete tiddlers[title];
|
delete tiddlerStore[title];
|
||||||
// Delete it from the list of titles
|
// Delete it from the list of titles
|
||||||
if(tiddlerTitles) {
|
if(tiddlerTitles) {
|
||||||
var index = tiddlerTitles.indexOf(title);
|
var index = tiddlerTitles.indexOf(title);
|
||||||
@@ -1281,11 +1285,11 @@ $tw.Wiki = function(options) {
|
|||||||
// Get a tiddler from the store
|
// Get a tiddler from the store
|
||||||
this.getTiddler = function(title) {
|
this.getTiddler = function(title) {
|
||||||
if(title) {
|
if(title) {
|
||||||
var t = tiddlers[title];
|
var t = tiddlerStore[title];
|
||||||
if(t !== undefined) {
|
if(t !== undefined) {
|
||||||
return t;
|
return t;
|
||||||
} else {
|
} else {
|
||||||
var s = shadowTiddlers[title];
|
var s = shadowTiddlerInfo[title];
|
||||||
if(s !== undefined) {
|
if(s !== undefined) {
|
||||||
return s.tiddler;
|
return s.tiddler;
|
||||||
}
|
}
|
||||||
@@ -1305,7 +1309,7 @@ $tw.Wiki = function(options) {
|
|||||||
index,titlesLength,title;
|
index,titlesLength,title;
|
||||||
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
||||||
title = titles[index];
|
title = titles[index];
|
||||||
callback(tiddlers[title],title);
|
callback(tiddlerStore[title],title);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1320,10 +1324,10 @@ $tw.Wiki = function(options) {
|
|||||||
index,titlesLength,title;
|
index,titlesLength,title;
|
||||||
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
||||||
title = titles[index];
|
title = titles[index];
|
||||||
if(tiddlers[title]) {
|
if(tiddlerStore[title]) {
|
||||||
callback(tiddlers[title],title);
|
callback(tiddlerStore[title],title);
|
||||||
} else {
|
} else {
|
||||||
var shadowInfo = shadowTiddlers[title];
|
var shadowInfo = shadowTiddlerInfo[title];
|
||||||
callback(shadowInfo.tiddler,title);
|
callback(shadowInfo.tiddler,title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1335,13 +1339,13 @@ $tw.Wiki = function(options) {
|
|||||||
titles = getTiddlerTitles();
|
titles = getTiddlerTitles();
|
||||||
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
||||||
title = titles[index];
|
title = titles[index];
|
||||||
callback(tiddlers[title],title);
|
callback(tiddlerStore[title],title);
|
||||||
}
|
}
|
||||||
titles = getShadowTiddlerTitles();
|
titles = getShadowTiddlerTitles();
|
||||||
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
||||||
title = titles[index];
|
title = titles[index];
|
||||||
if(!tiddlers[title]) {
|
if(!tiddlerStore[title]) {
|
||||||
var shadowInfo = shadowTiddlers[title];
|
var shadowInfo = shadowTiddlerInfo[title];
|
||||||
callback(shadowInfo.tiddler,title);
|
callback(shadowInfo.tiddler,title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1353,35 +1357,35 @@ $tw.Wiki = function(options) {
|
|||||||
titles = getShadowTiddlerTitles();
|
titles = getShadowTiddlerTitles();
|
||||||
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
||||||
title = titles[index];
|
title = titles[index];
|
||||||
if(tiddlers[title]) {
|
if(tiddlerStore[title]) {
|
||||||
callback(tiddlers[title],title);
|
callback(tiddlerStore[title],title);
|
||||||
} else {
|
} else {
|
||||||
var shadowInfo = shadowTiddlers[title];
|
var shadowInfo = shadowTiddlerInfo[title];
|
||||||
callback(shadowInfo.tiddler,title);
|
callback(shadowInfo.tiddler,title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
titles = getTiddlerTitles();
|
titles = getTiddlerTitles();
|
||||||
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
||||||
title = titles[index];
|
title = titles[index];
|
||||||
if(!shadowTiddlers[title]) {
|
if(!shadowTiddlerInfo[title]) {
|
||||||
callback(tiddlers[title],title);
|
callback(tiddlerStore[title],title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Test for the existence of a tiddler (excludes shadow tiddlers)
|
// Test for the existence of a tiddler (excludes shadow tiddlers)
|
||||||
this.tiddlerExists = function(title) {
|
this.tiddlerExists = function(title) {
|
||||||
return !!$tw.utils.hop(tiddlers,title);
|
return !!$tw.utils.hop(tiddlerStore,title);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Determines if a tiddler is a shadow tiddler, regardless of whether it has been overridden by a real tiddler
|
// Determines if a tiddler is a shadow tiddler, regardless of whether it has been overridden by a real tiddler
|
||||||
this.isShadowTiddler = function(title) {
|
this.isShadowTiddler = function(title) {
|
||||||
return $tw.utils.hop(shadowTiddlers,title);
|
return $tw.utils.hop(shadowTiddlerInfo,title);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getShadowSource = function(title) {
|
this.getShadowSource = function(title) {
|
||||||
if($tw.utils.hop(shadowTiddlers,title)) {
|
if($tw.utils.hop(shadowTiddlerInfo,title)) {
|
||||||
return shadowTiddlers[title].source;
|
return shadowTiddlerInfo[title].source;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
@@ -1389,8 +1393,8 @@ $tw.Wiki = function(options) {
|
|||||||
// Get an array of all the currently recognised plugin types
|
// Get an array of all the currently recognised plugin types
|
||||||
this.getPluginTypes = function() {
|
this.getPluginTypes = function() {
|
||||||
var types = [];
|
var types = [];
|
||||||
$tw.utils.each(pluginTiddlers,function(pluginTiddler) {
|
$tw.utils.each(pluginTiddlersInfo,function(pluginTiddlerFields) {
|
||||||
var pluginType = pluginTiddler.fields["plugin-type"];
|
var pluginType = pluginTiddlerFields["plugin-type"];
|
||||||
if(pluginType && types.indexOf(pluginType) === -1) {
|
if(pluginType && types.indexOf(pluginType) === -1) {
|
||||||
types.push(pluginType);
|
types.push(pluginType);
|
||||||
}
|
}
|
||||||
@@ -1398,22 +1402,45 @@ $tw.Wiki = function(options) {
|
|||||||
return types;
|
return types;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Read plugin info for all plugins, or just an array of titles. Returns the number of plugins updated or deleted
|
// Read plugin contents for all plugins, or just an array of titles. Returns the list of updated plugin titles, the list of deleted plugin titles and
|
||||||
|
// a hashmap of the deleted plugin contents. Clears the pluginContents cache for any plugins that have been deleted
|
||||||
this.readPluginInfo = function(titles) {
|
this.readPluginInfo = function(titles) {
|
||||||
var results = {
|
var self = this,
|
||||||
|
results = {
|
||||||
modifiedPlugins: [],
|
modifiedPlugins: [],
|
||||||
deletedPlugins: []
|
deletedPlugins: [],
|
||||||
|
deletedPluginContents: {}
|
||||||
};
|
};
|
||||||
$tw.utils.each(titles || getTiddlerTitles(),function(title) {
|
$tw.utils.each(titles || getTiddlerTitles(),function(title) {
|
||||||
var tiddler = tiddlers[title];
|
var tiddler = self.getTiddler(title);
|
||||||
|
if(!tiddler) {
|
||||||
|
for(var t=0; t<pluginContents.length; t++) {
|
||||||
|
if(pluginContents[t].subPluginTitles.indexOf(title) !== -1) {
|
||||||
|
tiddler = new $tw.Tiddler(pluginContents[t].fields);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if(tiddler) {
|
if(tiddler) {
|
||||||
if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type") && tiddler.fields.text) {
|
if(tiddler.isPlugin() && tiddler.fields.text) {
|
||||||
pluginInfo[tiddler.fields.title] = $tw.utils.parseJSONSafe(tiddler.fields.text);
|
var contents = $tw.utils.parseJSONSafe(tiddler.fields.text).tiddlers;
|
||||||
results.modifiedPlugins.push(tiddler.fields.title);
|
var subPluginTitles = [];
|
||||||
|
// Read any sub-plugins
|
||||||
|
$tw.utils.each(contents,function(subPluginFields,subPluginTitle) {
|
||||||
|
if(subPluginFields["plugin-type"] && subPluginFields["type"] === "application/json") {
|
||||||
|
var contents = $tw.utils.parseJSONSafe(subPluginFields.text).tiddlers
|
||||||
|
pluginContents[subPluginTitle] = {contents: contents,fields: subPluginFields};
|
||||||
|
results.modifiedPlugins.push(subPluginTitle);
|
||||||
|
subPluginTitles.push(subPluginTitle)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
pluginContents[title] = {contents: contents,fields: tiddler.fields,subPluginTitles: subPluginTitles};
|
||||||
|
results.modifiedPlugins.push(title);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(pluginInfo[title]) {
|
if(pluginContents[title]) {
|
||||||
delete pluginInfo[title];
|
results.deletedPluginContents[title] = {tiddlers: pluginContents[title].contents};
|
||||||
|
delete pluginContents[title];
|
||||||
results.deletedPlugins.push(title);
|
results.deletedPlugins.push(title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1421,34 +1448,42 @@ $tw.Wiki = function(options) {
|
|||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.isSubPlugin = function(title) {
|
||||||
|
for(var t=0; t<pluginContents.length; t++) {
|
||||||
|
if(pluginContents[t].subPluginTitles.indexOf(title) !== -1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
// Get plugin info for a plugin
|
// Get plugin info for a plugin
|
||||||
this.getPluginInfo = function(title) {
|
this.getPluginInfo = function(title) {
|
||||||
return pluginInfo[title];
|
var pluginContent = pluginContents[title];
|
||||||
|
if(pluginContent) {
|
||||||
|
return {tiddlers: pluginContent.contents, subPluginTitles: pluginContent.subPluginTitles, fields: pluginContent.fields};
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Register the plugin tiddlers of a particular type, or null/undefined for any type, optionally restricting registration to an array of tiddler titles. Return the array of titles affected
|
// Register the plugin tiddlers of a particular type, or null/undefined for any type, optionally restricting registration to an array of tiddler titles. Return the array of titles affected
|
||||||
this.registerPluginTiddlers = function(pluginType,titles) {
|
this.registerPluginTiddlers = function(pluginType,titles) {
|
||||||
var self = this,
|
var self = this,
|
||||||
registeredTitles = [],
|
registeredTitles = [];
|
||||||
checkTiddler = function(tiddler,title) {
|
$tw.utils.each(pluginContents,function(pluginContent,pluginTitle) {
|
||||||
if(tiddler && tiddler.fields.type === "application/json" && tiddler.fields["plugin-type"] && (!pluginType || tiddler.fields["plugin-type"] === pluginType)) {
|
var pluginFields = pluginContent.fields;
|
||||||
var disablingTiddler = self.getTiddler("$:/config/Plugins/Disabled/" + title);
|
if(!titles || titles.indexOf(pluginTitle) !== -1) {
|
||||||
if(title === "$:/core" || !disablingTiddler || (disablingTiddler.fields.text || "").trim() !== "yes") {
|
if(!pluginType || pluginFields["plugin-type"] === pluginType) {
|
||||||
self.unregisterPluginTiddlers(null,[title]); // Unregister the plugin if it's already registered
|
var disablingTiddler = self.getTiddler("$:/config/Plugins/Disabled/" + pluginTitle);
|
||||||
pluginTiddlers.push(tiddler);
|
if(pluginTitle === "$:/core" || !disablingTiddler || (disablingTiddler.fields.text || "").trim() !== "yes") {
|
||||||
registeredTitles.push(tiddler.fields.title);
|
self.unregisterPluginTiddlers(null,[pluginTitle]); // Unregister the plugin if it's already registered
|
||||||
|
pluginTiddlersInfo.push(pluginFields);
|
||||||
|
registeredTitles.push(pluginTitle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
if(titles) {
|
});
|
||||||
$tw.utils.each(titles,function(title) {
|
|
||||||
checkTiddler(self.getTiddler(title),title);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.each(function(tiddler,title) {
|
|
||||||
checkTiddler(tiddler,title);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return registeredTitles;
|
return registeredTitles;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1457,11 +1492,11 @@ $tw.Wiki = function(options) {
|
|||||||
var self = this,
|
var self = this,
|
||||||
unregisteredTitles = [];
|
unregisteredTitles = [];
|
||||||
// Remove any previous registered plugins of this type
|
// Remove any previous registered plugins of this type
|
||||||
for(var t=pluginTiddlers.length-1; t>=0; t--) {
|
for(var t=pluginTiddlersInfo.length-1; t>=0; t--) {
|
||||||
var tiddler = pluginTiddlers[t];
|
var pluginFields = pluginTiddlersInfo[t];
|
||||||
if(tiddler.fields["plugin-type"] && (!pluginType || tiddler.fields["plugin-type"] === pluginType) && (!titles || titles.indexOf(tiddler.fields.title) !== -1)) {
|
if(pluginFields["plugin-type"] && (!pluginType || pluginFields["plugin-type"] === pluginType) && (!titles || titles.indexOf(pluginFields.title) !== -1)) {
|
||||||
unregisteredTitles.push(tiddler.fields.title);
|
unregisteredTitles.push(pluginFields.title);
|
||||||
pluginTiddlers.splice(t,1);
|
pluginTiddlersInfo.splice(t,1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return unregisteredTitles;
|
return unregisteredTitles;
|
||||||
@@ -1471,36 +1506,33 @@ $tw.Wiki = function(options) {
|
|||||||
this.unpackPluginTiddlers = function() {
|
this.unpackPluginTiddlers = function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
// Sort the plugin titles by the `plugin-priority` field, if this field is missing, default to 1
|
// Sort the plugin titles by the `plugin-priority` field, if this field is missing, default to 1
|
||||||
pluginTiddlers.sort(function(a, b) {
|
pluginTiddlersInfo.sort(function(a, b) {
|
||||||
var priorityA = "plugin-priority" in a.fields ? a.fields["plugin-priority"] : 1;
|
var priorityA = "plugin-priority" in a ? a["plugin-priority"] : 1,
|
||||||
var priorityB = "plugin-priority" in b.fields ? b.fields["plugin-priority"] : 1;
|
priorityB = "plugin-priority" in b ? b["plugin-priority"] : 1;
|
||||||
if (priorityA !== priorityB) {
|
if (priorityA !== priorityB) {
|
||||||
return priorityA - priorityB;
|
return priorityA - priorityB;
|
||||||
} else if (a.fields.title < b.fields.title) {
|
} else if (a.title < b.title) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (a.fields.title === b.fields.title) {
|
} else if (a.title === b.title) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return +1;
|
return +1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Now go through the plugins in ascending order and assign the shadows
|
// Now go through the plugins in ascending order and assign the shadows
|
||||||
shadowTiddlers = Object.create(null);
|
shadowTiddlerInfo = Object.create(null);
|
||||||
$tw.utils.each(pluginTiddlers,function(tiddler) {
|
$tw.utils.each(pluginTiddlersInfo,function(tiddlerFields) {
|
||||||
|
var contents = pluginContents[tiddlerFields.title].contents;
|
||||||
// Extract the constituent tiddlers
|
// Extract the constituent tiddlers
|
||||||
if($tw.utils.hop(pluginInfo,tiddler.fields.title)) {
|
$tw.utils.each(contents,function(constituentTiddler,constituentTitle) {
|
||||||
$tw.utils.each(pluginInfo[tiddler.fields.title].tiddlers,function(constituentTiddler,constituentTitle) {
|
// Save the tiddler object
|
||||||
// Save the tiddler object
|
shadowTiddlerInfo[constituentTitle] = {
|
||||||
if(constituentTitle) {
|
source: tiddlerFields.title,
|
||||||
shadowTiddlers[constituentTitle] = {
|
tiddler: new $tw.Tiddler(constituentTiddler,{title: constituentTitle})
|
||||||
source: tiddler.fields.title,
|
};
|
||||||
tiddler: new $tw.Tiddler(constituentTiddler,{title: constituentTitle})
|
});
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
shadowTiddlerTitles = null;
|
shadowTiddlerTitles = null; // Force regeneration of the shadow tiddler titles list
|
||||||
this.clearCache(null);
|
this.clearCache(null);
|
||||||
this.clearGlobalCache();
|
this.clearGlobalCache();
|
||||||
$tw.utils.each(indexers,function(indexer) {
|
$tw.utils.each(indexers,function(indexer) {
|
||||||
@@ -1944,7 +1976,7 @@ $tw.boot.excludeRegExp = /^\.DS_Store$|^.*\.meta$|^\..*\.swp$|^\._.*$|^\.git$|^\
|
|||||||
/*
|
/*
|
||||||
Load all the tiddlers recursively from a directory, including honouring `tiddlywiki.files` files for drawing in external files. Returns an array of {filepath:,type:,tiddlers: [{..fields...}],hasMetaFile:}. Note that no file information is returned for externally loaded tiddlers, just the `tiddlers` property.
|
Load all the tiddlers recursively from a directory, including honouring `tiddlywiki.files` files for drawing in external files. Returns an array of {filepath:,type:,tiddlers: [{..fields...}],hasMetaFile:}. Note that no file information is returned for externally loaded tiddlers, just the `tiddlers` property.
|
||||||
*/
|
*/
|
||||||
$tw.loadTiddlersFromPath = function(filepath,excludeRegExp) {
|
$tw.loadTiddlersFromPath = function(filepath,excludeRegExp,excludePluginInfo) {
|
||||||
excludeRegExp = excludeRegExp || $tw.boot.excludeRegExp;
|
excludeRegExp = excludeRegExp || $tw.boot.excludeRegExp;
|
||||||
var tiddlers = [];
|
var tiddlers = [];
|
||||||
if(fs.existsSync(filepath)) {
|
if(fs.existsSync(filepath)) {
|
||||||
@@ -1954,11 +1986,17 @@ $tw.loadTiddlersFromPath = function(filepath,excludeRegExp) {
|
|||||||
// Look for a tiddlywiki.files file
|
// Look for a tiddlywiki.files file
|
||||||
if(files.indexOf("tiddlywiki.files") !== -1) {
|
if(files.indexOf("tiddlywiki.files") !== -1) {
|
||||||
Array.prototype.push.apply(tiddlers,$tw.loadTiddlersFromSpecification(filepath,excludeRegExp));
|
Array.prototype.push.apply(tiddlers,$tw.loadTiddlersFromSpecification(filepath,excludeRegExp));
|
||||||
|
} else if(files.indexOf("plugin.info") !== -1 && !excludePluginInfo) {
|
||||||
|
// Load sub-plugin
|
||||||
|
var tiddler = $tw.loadPluginFolder(filepath);
|
||||||
|
if(tiddler) {
|
||||||
|
tiddlers.push({tiddlers: [tiddler]});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// If not, read all the files in the directory
|
// If not, read all the files in the directory
|
||||||
$tw.utils.each(files,function(file) {
|
$tw.utils.each(files,function(file) {
|
||||||
if(!excludeRegExp.test(file) && file !== "plugin.info") {
|
if(!excludeRegExp.test(file) && file !== "plugin.info") {
|
||||||
tiddlers.push.apply(tiddlers,$tw.loadTiddlersFromPath(filepath + path.sep + file,excludeRegExp));
|
tiddlers.push.apply(tiddlers,$tw.loadTiddlersFromPath(path.join(filepath,file),excludeRegExp));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -2105,54 +2143,69 @@ Load the tiddlers from a plugin folder, and package them up into a proper JSON p
|
|||||||
*/
|
*/
|
||||||
$tw.loadPluginFolder = function(filepath,excludeRegExp) {
|
$tw.loadPluginFolder = function(filepath,excludeRegExp) {
|
||||||
excludeRegExp = excludeRegExp || $tw.boot.excludeRegExp;
|
excludeRegExp = excludeRegExp || $tw.boot.excludeRegExp;
|
||||||
var infoPath = filepath + path.sep + "plugin.info";
|
function readPluginFields(filepath) {
|
||||||
if(fs.existsSync(filepath) && fs.statSync(filepath).isDirectory()) {
|
if(!(fs.existsSync(filepath) && fs.statSync(filepath).isDirectory())) {
|
||||||
// Read the plugin information
|
|
||||||
if(!fs.existsSync(infoPath) || !fs.statSync(infoPath).isFile()) {
|
|
||||||
console.log("Warning: missing plugin.info file in " + filepath);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
var pluginInfo = $tw.utils.parseJSONSafe(fs.readFileSync(infoPath,"utf8"),function() {return null;});
|
var infoPath = path.join(filepath,"plugin.info");
|
||||||
if(!pluginInfo) {
|
// Read the plugin information file
|
||||||
console.log("warning: invalid JSON in plugin.info file at " + infoPath);
|
if(!fs.existsSync(infoPath) || !fs.statSync(infoPath).isFile()) {
|
||||||
pluginInfo = {};
|
return null;
|
||||||
}
|
}
|
||||||
// Read the plugin files
|
var pluginFields = $tw.utils.parseJSONSafe(fs.readFileSync(infoPath,"utf8"),{});
|
||||||
var pluginFiles = $tw.loadTiddlersFromPath(filepath,excludeRegExp);
|
if(!(pluginFields.title && pluginFields.name)) {
|
||||||
// Save the plugin tiddlers into the plugin info
|
return null;
|
||||||
pluginInfo.tiddlers = pluginInfo.tiddlers || Object.create(null);
|
}
|
||||||
|
// Give the plugin the same version number as the core if it doesn't have one
|
||||||
|
if(!("version" in pluginFields)) {
|
||||||
|
pluginFields.version = $tw.packageInfo.version;
|
||||||
|
}
|
||||||
|
// Use "plugin" as the plugin-type if we don't have one
|
||||||
|
if(!("plugin-type" in pluginFields)) {
|
||||||
|
pluginFields["plugin-type"] = "plugin";
|
||||||
|
}
|
||||||
|
// Set the dependents and type
|
||||||
|
pluginFields.dependents = pluginFields.dependents || [];
|
||||||
|
pluginFields.type = "application/json";
|
||||||
|
// Deserialise array fields (currently required for the dependents field)
|
||||||
|
for(var field in pluginFields) {
|
||||||
|
if($tw.utils.isArray(pluginFields[field])) {
|
||||||
|
pluginFields[field] = $tw.utils.stringifyList(pluginFields[field]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pluginFields;
|
||||||
|
}
|
||||||
|
function readPluginTiddlers(tiddlersPath) {
|
||||||
|
var pluginFiles = $tw.loadTiddlersFromPath(tiddlersPath,excludeRegExp,true),
|
||||||
|
pluginTiddlers = {};
|
||||||
|
// Save the plugin tiddlers into the plugin payload
|
||||||
for(var f=0; f<pluginFiles.length; f++) {
|
for(var f=0; f<pluginFiles.length; f++) {
|
||||||
var tiddlers = pluginFiles[f].tiddlers;
|
var tiddlers = pluginFiles[f].tiddlers;
|
||||||
|
if(!tiddlers) {
|
||||||
|
console.log(`Gosh ${JSON.stringify(pluginFiles[f])}`)
|
||||||
|
}
|
||||||
for(var t=0; t<tiddlers.length; t++) {
|
for(var t=0; t<tiddlers.length; t++) {
|
||||||
var tiddler= tiddlers[t];
|
var tiddler= tiddlers[t];
|
||||||
if(tiddler.title) {
|
if(tiddler.title) {
|
||||||
pluginInfo.tiddlers[tiddler.title] = tiddler;
|
pluginTiddlers[tiddler.title] = tiddler;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Give the plugin the same version number as the core if it doesn't have one
|
return pluginTiddlers;
|
||||||
if(!("version" in pluginInfo)) {
|
|
||||||
pluginInfo.version = $tw.packageInfo.version;
|
|
||||||
}
|
|
||||||
// Use "plugin" as the plugin-type if we don't have one
|
|
||||||
if(!("plugin-type" in pluginInfo)) {
|
|
||||||
pluginInfo["plugin-type"] = "plugin";
|
|
||||||
}
|
|
||||||
pluginInfo.dependents = pluginInfo.dependents || [];
|
|
||||||
pluginInfo.type = "application/json";
|
|
||||||
// Set plugin text
|
|
||||||
pluginInfo.text = JSON.stringify({tiddlers: pluginInfo.tiddlers});
|
|
||||||
delete pluginInfo.tiddlers;
|
|
||||||
// Deserialise array fields (currently required for the dependents field)
|
|
||||||
for(var field in pluginInfo) {
|
|
||||||
if($tw.utils.isArray(pluginInfo[field])) {
|
|
||||||
pluginInfo[field] = $tw.utils.stringifyList(pluginInfo[field]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pluginInfo;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
// Get the primary plugin fields
|
||||||
|
var pluginFields = readPluginFields(filepath);
|
||||||
|
if(!pluginFields) {
|
||||||
|
console.log("Warning: missing or invalid plugin.info file in " + filepath);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// The payload to be stored in the plugin text field in JSON
|
||||||
|
var pluginPayload = {tiddlers: {}};
|
||||||
|
// Get the constituent tiddlers of the plugin
|
||||||
|
pluginPayload.tiddlers = readPluginTiddlers(filepath);
|
||||||
|
// Set plugin text
|
||||||
|
pluginFields.text = JSON.stringify(pluginPayload);
|
||||||
|
return pluginFields;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -3,5 +3,8 @@ name: en-GB
|
|||||||
description: English (British)
|
description: English (British)
|
||||||
author: JeremyRuston
|
author: JeremyRuston
|
||||||
core-version: >=5.0.0"
|
core-version: >=5.0.0"
|
||||||
|
plugin-type: language
|
||||||
|
type: application/json
|
||||||
|
hidden: yes
|
||||||
|
|
||||||
Stub pseudo-plugin for the default language
|
{tidddlers:{}}
|
||||||
36
core/modules/filters/is/plugin.js
Normal file
36
core/modules/filters/is/plugin.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/filters/is/plugin.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: isfilteroperator
|
||||||
|
|
||||||
|
Filter function for [is[plugin]]
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/*
|
||||||
|
Export our filter function
|
||||||
|
*/
|
||||||
|
exports.plugin = function(source,prefix,options) {
|
||||||
|
var results = [];
|
||||||
|
if(prefix === "!") {
|
||||||
|
source(function(tiddler,title) {
|
||||||
|
if(!tiddler.isPlugin()) {
|
||||||
|
results.push(title);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
source(function(tiddler,title) {
|
||||||
|
if(tiddler.isPlugin()) {
|
||||||
|
results.push(title);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -35,6 +35,7 @@ function PluginSwitcher(options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PluginSwitcher.prototype.switchPlugins = function() {
|
PluginSwitcher.prototype.switchPlugins = function() {
|
||||||
|
var self = this;
|
||||||
// Get the name of the current theme
|
// Get the name of the current theme
|
||||||
var selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);
|
var selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);
|
||||||
// If it doesn't exist, then fallback to one of the default themes
|
// If it doesn't exist, then fallback to one of the default themes
|
||||||
@@ -49,22 +50,51 @@ PluginSwitcher.prototype.switchPlugins = function() {
|
|||||||
var tiddler = self.wiki.getTiddler(title);
|
var tiddler = self.wiki.getTiddler(title);
|
||||||
if(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {
|
if(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {
|
||||||
plugins.push(title);
|
plugins.push(title);
|
||||||
var pluginInfo = $tw.utils.parseJSONSafe(self.wiki.getTiddlerText(title)),
|
var dependents = $tw.utils.parseStringArray(tiddler.fields.dependents || "");
|
||||||
dependents = $tw.utils.parseStringArray(tiddler.fields.dependents || "");
|
|
||||||
$tw.utils.each(dependents,function(title) {
|
$tw.utils.each(dependents,function(title) {
|
||||||
accumulatePlugin(title);
|
accumulatePlugin(title);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
accumulatePlugin(selectedPluginTitle);
|
accumulatePlugin(selectedPluginTitle);
|
||||||
|
var selectedPluginTiddler = this.wiki.getTiddler(selectedPluginTitle);
|
||||||
|
// Accumulate any other plugins of the same type with the same name
|
||||||
|
this.wiki.eachTiddlerPlusShadows(function(tiddler,title) {
|
||||||
|
if(tiddler.isPlugin() && tiddler.fields["plugin-type"] === self.pluginType && tiddler.fields.name === selectedPluginTiddler.fields.name) {
|
||||||
|
accumulatePlugin(title);
|
||||||
|
}
|
||||||
|
});
|
||||||
// Read the plugin info for the incoming plugins
|
// Read the plugin info for the incoming plugins
|
||||||
var changes = $tw.wiki.readPluginInfo(plugins);
|
var changedPluginInfo = this.wiki.readPluginInfo(plugins);
|
||||||
// Unregister any existing theme tiddlers
|
// Collect the shadow tiddlers of any deleted plugins
|
||||||
var unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);
|
var changedShadowTiddlers = {};
|
||||||
// Register any new theme tiddlers
|
$tw.utils.each(changedPluginInfo.deletedPlugins,function(pluginTitle) {
|
||||||
var registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);
|
var contents = changedPluginInfo.deletedPluginContents[pluginTitle];
|
||||||
// Unpack the current theme tiddlers
|
if(contents && contents.tiddlers) {
|
||||||
$tw.wiki.unpackPluginTiddlers();
|
$tw.utils.each(Object.keys(contents.tiddlers),function(title) {
|
||||||
|
changedShadowTiddlers[title] = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Collect the shadow tiddlers of any modified plugins
|
||||||
|
$tw.utils.each(changedPluginInfo.modifiedPlugins,function(pluginTitle) {
|
||||||
|
var pluginInfo = self.wiki.getPluginInfo(pluginTitle);
|
||||||
|
if(pluginInfo && pluginInfo.tiddlers) {
|
||||||
|
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
|
||||||
|
changedShadowTiddlers[title] = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Unregister any existing theme/language tiddlers
|
||||||
|
var unregisteredTiddlers = this.wiki.unregisterPluginTiddlers(this.pluginType);
|
||||||
|
// Register any new theme/language tiddlers
|
||||||
|
var registeredTiddlers = this.wiki.registerPluginTiddlers(this.pluginType,plugins);
|
||||||
|
// Unpack the current theme/language tiddlers
|
||||||
|
this.wiki.unpackPluginTiddlers();
|
||||||
|
// Queue change events for the changed shadow tiddlers
|
||||||
|
$tw.utils.each(changedShadowTiddlers,function(status,title) {
|
||||||
|
self.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title], true);
|
||||||
|
});
|
||||||
// Call the switch handler
|
// Call the switch handler
|
||||||
if(this.onSwitch) {
|
if(this.onSwitch) {
|
||||||
this.onSwitch(plugins);
|
this.onSwitch(plugins);
|
||||||
|
|||||||
@@ -15,67 +15,7 @@ exports.after = ["load-modules"];
|
|||||||
exports.before = ["startup"];
|
exports.before = ["startup"];
|
||||||
exports.synchronous = true;
|
exports.synchronous = true;
|
||||||
|
|
||||||
var TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = "$:/status/RequireReloadDueToPluginChange";
|
|
||||||
|
|
||||||
var PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = "$:/config/RegisterPluginType/";
|
|
||||||
|
|
||||||
exports.startup = function() {
|
exports.startup = function() {
|
||||||
$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "no"});
|
$tw.utils.installPluginChangeHandler($tw.wiki);
|
||||||
$tw.wiki.addEventListener("change",function(changes) {
|
|
||||||
// Work out which of the changed tiddlers are plugins that we need to reregister
|
|
||||||
var changesToProcess = [],
|
|
||||||
requireReloadDueToPluginChange = false;
|
|
||||||
$tw.utils.each(Object.keys(changes),function(title) {
|
|
||||||
var tiddler = $tw.wiki.getTiddler(title),
|
|
||||||
requiresReload = $tw.wiki.doesPluginRequireReload(title);
|
|
||||||
if(requiresReload) {
|
|
||||||
requireReloadDueToPluginChange = true;
|
|
||||||
} else if(tiddler) {
|
|
||||||
var pluginType = tiddler.fields["plugin-type"];
|
|
||||||
if($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields["plugin-type"] || ""),"no") === "yes") {
|
|
||||||
changesToProcess.push(title);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// Issue warning if any of the tiddlers require a reload
|
|
||||||
if(requireReloadDueToPluginChange) {
|
|
||||||
$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "yes"});
|
|
||||||
}
|
|
||||||
// Read or delete the plugin info of the changed tiddlers
|
|
||||||
if(changesToProcess.length > 0) {
|
|
||||||
var changes = $tw.wiki.readPluginInfo(changesToProcess);
|
|
||||||
if(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {
|
|
||||||
var changedShadowTiddlers = {};
|
|
||||||
// Collect the shadow tiddlers of any deleted plugins
|
|
||||||
$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {
|
|
||||||
var pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);
|
|
||||||
if(pluginInfo) {
|
|
||||||
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
|
|
||||||
changedShadowTiddlers[title] = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// Collect the shadow tiddlers of any modified plugins
|
|
||||||
$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {
|
|
||||||
var pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);
|
|
||||||
if(pluginInfo && pluginInfo.tiddlers) {
|
|
||||||
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
|
|
||||||
changedShadowTiddlers[title] = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// (Re-)register any modified plugins
|
|
||||||
$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);
|
|
||||||
// Unregister any deleted plugins
|
|
||||||
$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);
|
|
||||||
// Unpack the shadow tiddlers
|
|
||||||
$tw.wiki.unpackPluginTiddlers();
|
|
||||||
// Queue change events for the changed shadow tiddlers
|
|
||||||
$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {
|
|
||||||
$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title], true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -13,10 +13,6 @@ exports.hasTag = function(tag) {
|
|||||||
return this.fields.tags && this.fields.tags.indexOf(tag) !== -1;
|
return this.fields.tags && this.fields.tags.indexOf(tag) !== -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.isPlugin = function() {
|
|
||||||
return this.fields.type === "application/json" && this.hasField("plugin-type");
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.isDraft = function() {
|
exports.isDraft = function() {
|
||||||
return this.hasField("draft.of");
|
return this.hasField("draft.of");
|
||||||
};
|
};
|
||||||
|
|||||||
95
core/modules/utils/plugins.js
Normal file
95
core/modules/utils/plugins.js
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/utils/plugins.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: utils
|
||||||
|
|
||||||
|
Plugin utilities
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = "$:/status/RequireReloadDueToPluginChange";
|
||||||
|
|
||||||
|
var PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = "$:/config/RegisterPluginType/";
|
||||||
|
|
||||||
|
exports.installPluginChangeHandler = function(wiki) {
|
||||||
|
wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "no"});
|
||||||
|
wiki.addEventListener("change",function(changes) {
|
||||||
|
// Work out which of the changed tiddlers are plugins that we need to (re)register
|
||||||
|
var changesToProcess = [];
|
||||||
|
$tw.utils.each(Object.keys(changes),function(title) {
|
||||||
|
var tiddler = wiki.getTiddler(title);
|
||||||
|
if(tiddler) {
|
||||||
|
// It is a plugin that has been added or modified and is of a type that we need to register
|
||||||
|
if(tiddler.isPlugin() && wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields["plugin-type"] || ""),"no") === "yes") {
|
||||||
|
changesToProcess.push(title);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(wiki.isSubPlugin(title)) {
|
||||||
|
// It is a sub-plugin
|
||||||
|
changesToProcess.push(title);
|
||||||
|
} else {
|
||||||
|
// It is a plugin that has been deleted
|
||||||
|
var pluginInfo = wiki.getPluginInfo(title)
|
||||||
|
if(pluginInfo) {
|
||||||
|
changesToProcess.push(title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if(changesToProcess.length > 0) {
|
||||||
|
// Read the plugin info of the changed tiddlers
|
||||||
|
var changedPluginInfo = wiki.readPluginInfo(changesToProcess);
|
||||||
|
if(changedPluginInfo.modifiedPlugins.length > 0 || changedPluginInfo.deletedPlugins.length > 0) {
|
||||||
|
var changedShadowTiddlers = {},
|
||||||
|
requireReloadDueToPluginChange = false;
|
||||||
|
// Collect the shadow tiddlers of any deleted plugins
|
||||||
|
$tw.utils.each(changedPluginInfo.deletedPlugins,function(pluginTitle) {
|
||||||
|
var contents = changedPluginInfo.deletedPluginContents[pluginTitle];
|
||||||
|
if(contents && contents.tiddlers) {
|
||||||
|
$tw.utils.each(Object.keys(contents.tiddlers),function(title) {
|
||||||
|
changedShadowTiddlers[title] = true;
|
||||||
|
if(contents.tiddlers[title].type === "application/javascript") {
|
||||||
|
requireReloadDueToPluginChange = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Collect the shadow tiddlers of any modified plugins
|
||||||
|
$tw.utils.each(changedPluginInfo.modifiedPlugins,function(pluginTitle) {
|
||||||
|
var pluginInfo = wiki.getPluginInfo(pluginTitle);
|
||||||
|
if(pluginInfo && pluginInfo.tiddlers) {
|
||||||
|
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
|
||||||
|
changedShadowTiddlers[title] = false;
|
||||||
|
if(pluginInfo.tiddlers[title].type === "application/javascript") {
|
||||||
|
requireReloadDueToPluginChange = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// (Re-)register any modified plugins
|
||||||
|
wiki.registerPluginTiddlers(null,changedPluginInfo.modifiedPlugins);
|
||||||
|
// Unregister any deleted plugins
|
||||||
|
wiki.unregisterPluginTiddlers(null,changedPluginInfo.deletedPlugins);
|
||||||
|
// Unpack the shadow tiddlers
|
||||||
|
wiki.unpackPluginTiddlers();
|
||||||
|
// Queue change events for the changed shadow tiddlers
|
||||||
|
$tw.utils.each(changedShadowTiddlers,function(status,title) {
|
||||||
|
wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title], true);
|
||||||
|
});
|
||||||
|
// Issue warning if any of the tiddlers require a reload
|
||||||
|
if(requireReloadDueToPluginChange) {
|
||||||
|
wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "yes"});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -66,11 +66,24 @@ TestCaseWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
});
|
});
|
||||||
var jsonPayload = JSON.stringify(tiddlers);
|
var jsonPayload = JSON.stringify(tiddlers);
|
||||||
this.testcaseWiki.addTiddlers(tiddlers);
|
this.testcaseWiki.addTiddlers(tiddlers);
|
||||||
|
// Suppress next tick dispatch for wiki change events
|
||||||
|
this.testcaseWiki.setDispatchMode(true);
|
||||||
// Unpack plugin tiddlers
|
// Unpack plugin tiddlers
|
||||||
this.testcaseWiki.readPluginInfo();
|
this.testcaseWiki.readPluginInfo();
|
||||||
this.testcaseWiki.registerPluginTiddlers("plugin");
|
this.testcaseWiki.registerPluginTiddlers("plugin");
|
||||||
this.testcaseWiki.unpackPluginTiddlers();
|
this.testcaseWiki.unpackPluginTiddlers();
|
||||||
this.testcaseWiki.addIndexersToWiki();
|
this.testcaseWiki.addIndexersToWiki();
|
||||||
|
// Install the plugin change event handler
|
||||||
|
$tw.utils.installPluginChangeHandler(this.testcaseWiki);
|
||||||
|
// Install the language switcher
|
||||||
|
var languageSwitcher = new $tw.PluginSwitcher({
|
||||||
|
wiki: this.testcaseWiki,
|
||||||
|
pluginType: "language",
|
||||||
|
controllerTitle: "$:/language",
|
||||||
|
defaultPlugins: [
|
||||||
|
"$:/languages/en-GB"
|
||||||
|
]
|
||||||
|
});
|
||||||
// Generate a `transclusion` variable that depends on the values of the payload tiddlers so that the template can easily make unique state tiddlers
|
// Generate a `transclusion` variable that depends on the values of the payload tiddlers so that the template can easily make unique state tiddlers
|
||||||
this.setVariable("transclusion",$tw.utils.hashString(jsonPayload));
|
this.setVariable("transclusion",$tw.utils.hashString(jsonPayload));
|
||||||
// Generate a `payloadTiddlers` variable that contains the payload in JSON format
|
// Generate a `payloadTiddlers` variable that contains the payload in JSON format
|
||||||
@@ -92,13 +105,20 @@ TestCaseWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
testcaseOutputWidget.render(testcaseOutputContainer);
|
testcaseOutputWidget.render(testcaseOutputContainer);
|
||||||
|
// Install the wiki change event handler
|
||||||
|
this.testcaseWiki.addEventListener("change",function(changes) {
|
||||||
|
testcaseOutputWidget.refresh(changes,testcaseOutputContainer);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
// Clear changes queue
|
// Clear changes queue
|
||||||
this.testcaseWiki.clearTiddlerEventQueue();
|
this.testcaseWiki.clearTiddlerEventQueue();
|
||||||
// Run the actions if provided
|
// Run the actions if provided
|
||||||
if(this.testcaseWiki.tiddlerExists(this.testcaseTestActions)) {
|
if(this.testcaseWiki.tiddlerExists(this.testcaseTestActions)) {
|
||||||
testcaseOutputWidget.invokeActionString(this.testcaseWiki.getTiddlerText(this.testcaseTestActions));
|
testcaseOutputWidget.invokeActionString(this.testcaseWiki.getTiddlerText(this.testcaseTestActions));
|
||||||
testcaseOutputWidget.refresh(this.testcaseWiki.changedTiddlers,testcaseOutputContainer);
|
// Make sure all wiki events have been cleared
|
||||||
|
while(this.testcaseWiki.eventsTriggered) {
|
||||||
|
this.testcaseWiki.processOutstandingTiddlerEvents();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Set up the test result variables
|
// Set up the test result variables
|
||||||
var testResult = "",
|
var testResult = "",
|
||||||
@@ -128,6 +148,8 @@ TestCaseWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
parentWidget: this
|
parentWidget: this
|
||||||
});
|
});
|
||||||
rootWidget.render(domNode);
|
rootWidget.render(domNode);
|
||||||
|
// Re-enable next tick dispatch for wiki change events
|
||||||
|
this.testcaseWiki.setDispatchMode(false);
|
||||||
// Trap changes in the wiki and refresh the rendering
|
// Trap changes in the wiki and refresh the rendering
|
||||||
this.testcaseWiki.addEventListener("change",function(changes) {
|
this.testcaseWiki.addEventListener("change",function(changes) {
|
||||||
rootWidget.refresh(changes,domNode);
|
rootWidget.refresh(changes,domNode);
|
||||||
|
|||||||
@@ -132,6 +132,14 @@ exports.dispatchEvent = function(type /*, args */) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
false (default) to dispatch event tick as usual
|
||||||
|
true to suppress dispatching the event tick and allow outstanding events to be processed manually
|
||||||
|
*/
|
||||||
|
exports.setDispatchMode = function(mode) {
|
||||||
|
this.dispatchMode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Causes a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.
|
Causes a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.
|
||||||
This method should be called after the changes it describes have been made to the wiki.tiddlers[] array.
|
This method should be called after the changes it describes have been made to the wiki.tiddlers[] array.
|
||||||
@@ -156,17 +164,18 @@ exports.enqueueTiddlerEvent = function(title,isDeleted,isShadow) {
|
|||||||
}
|
}
|
||||||
// Trigger events
|
// Trigger events
|
||||||
this.eventListeners = this.eventListeners || {};
|
this.eventListeners = this.eventListeners || {};
|
||||||
if(!this.eventsTriggered) {
|
if(!this.eventsTriggered && !this.dispatchMode) {
|
||||||
var self = this;
|
$tw.utils.nextTick(this.processOutstandingTiddlerEvents.bind(this));
|
||||||
$tw.utils.nextTick(function() {
|
}
|
||||||
var changes = self.changedTiddlers;
|
this.eventsTriggered = true;
|
||||||
self.changedTiddlers = Object.create(null);
|
};
|
||||||
self.eventsTriggered = false;
|
|
||||||
if($tw.utils.count(changes) > 0) {
|
exports.processOutstandingTiddlerEvents = function() {
|
||||||
self.dispatchEvent("change",changes);
|
var changes = this.changedTiddlers;
|
||||||
}
|
this.changedTiddlers = Object.create(null);
|
||||||
});
|
this.eventsTriggered = false;
|
||||||
this.eventsTriggered = true;
|
if($tw.utils.count(changes) > 0) {
|
||||||
|
this.dispatchEvent("change",changes);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1740,7 +1749,7 @@ exports.invokeUpgraders = function(titles,tiddlers) {
|
|||||||
// Determine whether a plugin by title is dynamically loadable
|
// Determine whether a plugin by title is dynamically loadable
|
||||||
exports.doesPluginRequireReload = function(title) {
|
exports.doesPluginRequireReload = function(title) {
|
||||||
var tiddler = this.getTiddler(title);
|
var tiddler = this.getTiddler(title);
|
||||||
if(tiddler && tiddler.fields.type === "application/json" && tiddler.fields["plugin-type"]) {
|
if(tiddler && tiddler.isPlugin()) {
|
||||||
if(tiddler.fields["plugin-type"] === "import") {
|
if(tiddler.fields["plugin-type"] === "import") {
|
||||||
// The import plugin never requires reloading
|
// The import plugin never requires reloading
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ caption: {{$:/language/ControlPanel/Plugins/Caption}}
|
|||||||
\whitespace trim
|
\whitespace trim
|
||||||
<$set name="plugin-type" value="""$type$""">
|
<$set name="plugin-type" value="""$type$""">
|
||||||
<$set name="qualified-state" value=<<qualify "$:/state/plugin-info">>>
|
<$set name="qualified-state" value=<<qualify "$:/state/plugin-info">>>
|
||||||
<$list filter="[!has[draft.of]plugin-type[$type$]sort[name]]" emptyMessage=<<lingo "Empty/Hint">> template="$:/core/ui/Components/plugin-info"/>
|
<$list filter="[all[tiddlers+shadows]!has[draft.of]plugin-type[$type$]!field:hidden[yes]sort[name]]" emptyMessage=<<lingo "Empty/Hint">> template="$:/core/ui/Components/plugin-info"/>
|
||||||
</$set>
|
</$set>
|
||||||
</$set>
|
</$set>
|
||||||
\end
|
\end
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
title: $:/core/ui/ControlPanel/Plugins/Installed/Languages
|
title: $:/core/ui/ControlPanel/Plugins/Installed/Languages
|
||||||
tags: $:/tags/ControlPanel/Plugins
|
tags: $:/tags/ControlPanel/Plugins
|
||||||
caption: {{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter="[!has[draft.of]plugin-type[language]]"/>)
|
caption: {{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter="[all[tiddlers+shadows]is[plugin]!field:hidden[yes]plugin-type[language]]"/>)
|
||||||
|
|
||||||
<<plugin-table language>>
|
<<plugin-table language>>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
title: $:/core/ui/ControlPanel/Plugins/Installed/Plugins
|
title: $:/core/ui/ControlPanel/Plugins/Installed/Plugins
|
||||||
tags: $:/tags/ControlPanel/Plugins
|
tags: $:/tags/ControlPanel/Plugins
|
||||||
caption: {{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter="[!has[draft.of]plugin-type[plugin]]"/>)
|
caption: {{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter="[all[tiddlers+shadows]is[plugin]plugin-type[plugin]]"/>)
|
||||||
|
|
||||||
<<plugin-table plugin>>
|
<<plugin-table plugin>>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
title: $:/core/ui/ControlPanel/Plugins/Installed/Themes
|
title: $:/core/ui/ControlPanel/Plugins/Installed/Themes
|
||||||
tags: $:/tags/ControlPanel/Plugins
|
tags: $:/tags/ControlPanel/Plugins
|
||||||
caption: {{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter="[!has[draft.of]plugin-type[theme]]"/>)
|
caption: {{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter="[all[tiddlers+shadows]is[plugin]plugin-type[theme]]"/>)
|
||||||
|
|
||||||
<<plugin-table theme>>
|
<<plugin-table theme>>
|
||||||
|
|||||||
@@ -103,7 +103,8 @@ code-body: yes
|
|||||||
-Description
|
-Description
|
||||||
-Narrative
|
-Narrative
|
||||||
-[[$:/temp/testcase/draft-title]]
|
-[[$:/temp/testcase/draft-title]]
|
||||||
-[has[plugin-type]]
|
-[[$:/status/RequireReloadDueToPluginChange]]
|
||||||
|
-[[$:/core]]
|
||||||
-[prefix<tf.state>]
|
-[prefix<tf.state>]
|
||||||
-[prefix[$:/state/popup/export]]
|
-[prefix[$:/state/popup/export]]
|
||||||
-[prefix[$:/HistoryList]]
|
-[prefix[$:/HistoryList]]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
title: $:/core/ui/testcases/actions/Export
|
title: $:/core/ui/testcases/actions/Export
|
||||||
tags: $:/tags/TestCase/Actions
|
tags: $:/tags/TestCase/Actions
|
||||||
|
|
||||||
<$macrocall $name="exportButton" exportFilter="[all[tiddlers]sort[]] -[prefix[$:/state/]] -Description -Narrative -ExpectedResult -[has[plugin-type]]" lingoBase="$:/language/Buttons/ExportTiddlers/"/>
|
<$macrocall $name="exportButton" exportFilter="[all[tiddlers]sort[]] -[prefix[$:/state/]] -Description -Narrative -ExpectedResult -[[$:/core]]" lingoBase="$:/language/Buttons/ExportTiddlers/"/>
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
title: Plugins/DynamicJSPluginLoad
|
||||||
|
description: Dynamic JS plugin loading
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
{{$:/status/RequireReloadDueToPluginChange}}
|
||||||
|
+
|
||||||
|
title: Actions
|
||||||
|
|
||||||
|
<$action-createtiddler $basetitle="$:/plugins/tiddlywiki/test-js-plugin" $template="$:/plugins/tiddlywiki/test-js-plugin/raw" type="application/json"/>
|
||||||
|
+
|
||||||
|
title: $:/plugins/tiddlywiki/test-js-plugin/raw
|
||||||
|
list: readme
|
||||||
|
name: bundled-subplugin-tests
|
||||||
|
plugin-type: plugin
|
||||||
|
type: text/plain
|
||||||
|
|
||||||
|
{
|
||||||
|
"tiddlers": {
|
||||||
|
"$:/plugins/tiddlywiki/test-js-plugin/readme": {
|
||||||
|
"title": "$:/plugins/tiddlywiki/test-js-plugin/readme",
|
||||||
|
"text": "Readme from $:/plugins/tiddlywiki/test-js-plugin\n\n"
|
||||||
|
},
|
||||||
|
"$:/plugins/tiddlywiki/test-js-plugin/js": {
|
||||||
|
"title": "$:/plugins/tiddlywiki/test-js-plugin/js",
|
||||||
|
"text": "2+2",
|
||||||
|
"type": "application/javascript"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
<p>yes</p>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
title: Plugins/DynamicLoadLanguage
|
||||||
|
description: Dynamically loading of language plugin
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
{{First}}
|
||||||
|
+
|
||||||
|
title: Actions
|
||||||
|
|
||||||
|
<$action-createtiddler $basetitle="$:/languages/fr-FR" $template="$:/languages/fr-FR/raw" type="application/json"/>
|
||||||
|
<$action-setfield $tiddler="$:/languages/fr-FR" plugin-type="language"/>
|
||||||
|
<$action-setfield $tiddler="$:/language" text="$:/languages/fr-FR"/>
|
||||||
|
+
|
||||||
|
title: $:/languages/en-GB
|
||||||
|
list: readme
|
||||||
|
name: en-GB
|
||||||
|
plugin-type: language
|
||||||
|
type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"tiddlers": {
|
||||||
|
"First": {
|
||||||
|
"title": "First",
|
||||||
|
"text": "This is English"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
title: $:/languages/fr-FR/raw
|
||||||
|
list: readme
|
||||||
|
name: fr-FR
|
||||||
|
type: plain/text
|
||||||
|
|
||||||
|
{
|
||||||
|
"tiddlers": {
|
||||||
|
"First": {
|
||||||
|
"title": "First",
|
||||||
|
"text": "This is French"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
<p>This is French</p>
|
||||||
46
editions/test/tiddlers/tests/data/plugins/Language.tid
Normal file
46
editions/test/tiddlers/tests/data/plugins/Language.tid
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
title: Plugins/Language
|
||||||
|
description: Loading of correct language plugin at startup
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
{{First}}
|
||||||
|
+
|
||||||
|
title: $:/language
|
||||||
|
|
||||||
|
$:/languages/fr-FR
|
||||||
|
+
|
||||||
|
title: $:/languages/en-GB
|
||||||
|
list: readme
|
||||||
|
name: en-GB
|
||||||
|
plugin-type: language
|
||||||
|
type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"tiddlers": {
|
||||||
|
"First": {
|
||||||
|
"title": "First",
|
||||||
|
"text": "This is English"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
title: $:/languages/fr-FR
|
||||||
|
list: readme
|
||||||
|
name: fr-FR
|
||||||
|
plugin-type: language
|
||||||
|
type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"tiddlers": {
|
||||||
|
"First": {
|
||||||
|
"title": "First",
|
||||||
|
"text": "This is French"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
<p>This is French</p>
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
title: Plugins/LanguageAddonSubPlugin
|
||||||
|
description: Loading of correct language subplugin at startup
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
{{First}}
|
||||||
|
|
||||||
|
{{Second}}
|
||||||
|
+
|
||||||
|
title: $:/language
|
||||||
|
|
||||||
|
$:/languages/fr-FR-subplugin
|
||||||
|
+
|
||||||
|
title: $:/languages/fr-FR-container
|
||||||
|
list: readme
|
||||||
|
name: fr-FR
|
||||||
|
plugin-type: plugin
|
||||||
|
type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"tiddlers": {
|
||||||
|
"$:/languages/fr-FR-container/readme": {
|
||||||
|
"title": "$:/languages/fr-FR-container/readme",
|
||||||
|
"text": "Readme from ~$:/languages/fr-FR-container\n\n"
|
||||||
|
},
|
||||||
|
"$:/languages/fr-FR-subplugin": {
|
||||||
|
"title": "$:/languages/fr-FR-subplugin",
|
||||||
|
"name": "fr-FR",
|
||||||
|
"description": "fr-FR subplugin",
|
||||||
|
"list": "readme",
|
||||||
|
"stability": "STABILITY_1_EXPERIMENTAL",
|
||||||
|
"version": "5.3.7-prerelease",
|
||||||
|
"plugin-type": "language",
|
||||||
|
"dependents": "",
|
||||||
|
"type": "application/json",
|
||||||
|
"text": "{\"tiddlers\":{\"First\":{\"title\":\"First\",\"text\":\"First from ~$:/languages/fr-FR-subplugin\"}}}"
|
||||||
|
},
|
||||||
|
"$:/languages/fr-FR-subplugin2": {
|
||||||
|
"title": "$:/languages/fr-FR-subplugin2",
|
||||||
|
"name": "fr-FR",
|
||||||
|
"description": "fr-FR subplugin2",
|
||||||
|
"list": "readme",
|
||||||
|
"stability": "STABILITY_1_EXPERIMENTAL",
|
||||||
|
"version": "5.3.7-prerelease",
|
||||||
|
"plugin-type": "language",
|
||||||
|
"dependents": "",
|
||||||
|
"type": "application/json",
|
||||||
|
"text": "{\"tiddlers\":{\"Second\":{\"title\":\"Second\",\"text\":\"Second from ~$:/languages/fr-FR-subplugin2\"}}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
<p>First from $:/languages/fr-FR-subplugin</p><p>Second from $:/languages/fr-FR-subplugin2</p>
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
title: Plugins/LanguageSubPlugin
|
||||||
|
description: Loading of correct language subplugin at startup
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
{{First}}
|
||||||
|
|
||||||
|
{{$:/languages/fr-FR-container/readme}}
|
||||||
|
+
|
||||||
|
title: $:/language
|
||||||
|
|
||||||
|
$:/languages/fr-FR-subplugin
|
||||||
|
+
|
||||||
|
title: $:/languages/fr-FR-container
|
||||||
|
list: readme
|
||||||
|
name: fr-FR
|
||||||
|
plugin-type: plugin
|
||||||
|
type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"tiddlers": {
|
||||||
|
"$:/languages/fr-FR-container/readme": {
|
||||||
|
"title": "$:/languages/fr-FR-container/readme",
|
||||||
|
"text": "Readme from ~$:/languages/fr-FR-container\n\n"
|
||||||
|
},
|
||||||
|
"$:/languages/fr-FR-subplugin": {
|
||||||
|
"title": "$:/languages/fr-FR-subplugin",
|
||||||
|
"name": "fr-FR",
|
||||||
|
"description": "fr-FR subplugin",
|
||||||
|
"list": "readme",
|
||||||
|
"stability": "STABILITY_1_EXPERIMENTAL",
|
||||||
|
"version": "5.3.7-prerelease",
|
||||||
|
"plugin-type": "language",
|
||||||
|
"dependents": "",
|
||||||
|
"type": "application/json",
|
||||||
|
"text": "{\"tiddlers\":{\"First\":{\"title\":\"First\",\"text\":\"First from ~$:/languages/fr-FR-subplugin\"}}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
<p>First from $:/languages/fr-FR-subplugin</p><p>Readme from $:/languages/fr-FR-container</p>
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
title: SubPlugins/DynamicSubPluginLoad
|
||||||
|
description: Dynamic sub-plugin loading
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
{{$:/plugins/tiddlywiki/test-subplugin/readme}}
|
||||||
|
+
|
||||||
|
title: Actions
|
||||||
|
|
||||||
|
<$action-createtiddler $basetitle="$:/plugins/tiddlywiki/bundled-subplugin-tests" $template="$:/plugins/tiddlywiki/bundled-subplugin-tests/raw" type="application/json"/>
|
||||||
|
+
|
||||||
|
title: $:/plugins/tiddlywiki/bundled-subplugin-tests/raw
|
||||||
|
list: readme
|
||||||
|
name: bundled-subplugin-tests
|
||||||
|
plugin-type: plugin
|
||||||
|
type: text/plain
|
||||||
|
|
||||||
|
{
|
||||||
|
"tiddlers": {
|
||||||
|
"$:/plugins/tiddlywiki/bundled-subplugin-tests/readme": {
|
||||||
|
"title": "$:/plugins/tiddlywiki/bundled-subplugin-tests/readme",
|
||||||
|
"text": "Readme from $:/plugins/tiddlywiki/bundled-subplugin-tests\n\n"
|
||||||
|
},
|
||||||
|
"$:/plugins/tiddlywiki/test-subplugin": {
|
||||||
|
"title": "$:/plugins/tiddlywiki/test-subplugin",
|
||||||
|
"name": "test-subplugin",
|
||||||
|
"description": "Test subplugin",
|
||||||
|
"list": "readme",
|
||||||
|
"stability": "STABILITY_1_EXPERIMENTAL",
|
||||||
|
"version": "5.3.7-prerelease",
|
||||||
|
"plugin-type": "plugin",
|
||||||
|
"dependents": "",
|
||||||
|
"type": "application/json",
|
||||||
|
"text": "{\"tiddlers\":{\"$:/plugins/tiddlywiki/test-subplugin/readme\":{\"title\":\"$:/plugins/tiddlywiki/test-subplugin/readme\",\"text\":\"Readme from $:/plugins/tiddlywiki/test-subplugin\"},\"$:/plugins/tiddlywiki/test-subsubplugin\":{\"title\":\"$:/plugins/tiddlywiki/test-subsubplugin\",\"name\":\"test-subsubplugin\",\"description\":\"Test subsubplugin\",\"list\":\"readme readme2\",\"stability\":\"STABILITY_1_EXPERIMENTAL\",\"version\":\"5.3.7-prerelease\",\"plugin-type\":\"plugin\",\"dependents\":\"\",\"type\":\"application/json\",\"text\":\"{\\\"tiddlers\\\":{\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\":{\\\"title\\\":\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\",\\\"text\\\":\\\"Readme from $:/plugins/tiddlywiki/test-subsubplugin\\\"}}}\"}}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
<p>Readme from <a class="tc-tiddlylink tc-tiddlylink-shadow" href="#%24%3A%2Fplugins%2Ftiddlywiki%2Ftest-subplugin">$:/plugins/tiddlywiki/test-subplugin</a></p>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
title: SubPlugins/DynamicSubPluginUnload
|
||||||
|
description: Dynamic sub-plugin unloading
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
<$transclude $tiddler="$:/plugins/tiddlywiki/test-subplugin/readme">
|
||||||
|
NO
|
||||||
|
</$transclude>
|
||||||
|
+
|
||||||
|
title: Actions
|
||||||
|
|
||||||
|
<$action-deletetiddler $tiddler="$:/plugins/tiddlywiki/bundled-subplugin-tests"/>
|
||||||
|
+
|
||||||
|
title: $:/plugins/tiddlywiki/bundled-subplugin-tests
|
||||||
|
list: readme
|
||||||
|
name: bundled-subplugin-tests
|
||||||
|
plugin-type: plugin
|
||||||
|
type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"tiddlers": {
|
||||||
|
"$:/plugins/tiddlywiki/bundled-subplugin-tests/readme": {
|
||||||
|
"title": "$:/plugins/tiddlywiki/bundled-subplugin-tests/readme",
|
||||||
|
"text": "Readme from $:/plugins/tiddlywiki/bundled-subplugin-tests\n\n"
|
||||||
|
},
|
||||||
|
"$:/plugins/tiddlywiki/test-subplugin": {
|
||||||
|
"title": "$:/plugins/tiddlywiki/test-subplugin",
|
||||||
|
"name": "test-subplugin",
|
||||||
|
"description": "Test subplugin",
|
||||||
|
"list": "readme",
|
||||||
|
"stability": "STABILITY_1_EXPERIMENTAL",
|
||||||
|
"version": "5.3.7-prerelease",
|
||||||
|
"plugin-type": "plugin",
|
||||||
|
"dependents": "",
|
||||||
|
"type": "application/json",
|
||||||
|
"text": "{\"tiddlers\":{\"$:/plugins/tiddlywiki/test-subplugin/readme\":{\"title\":\"$:/plugins/tiddlywiki/test-subplugin/readme\",\"text\":\"Readme from $:/plugins/tiddlywiki/test-subplugin\"},\"$:/plugins/tiddlywiki/test-subsubplugin\":{\"title\":\"$:/plugins/tiddlywiki/test-subsubplugin\",\"name\":\"test-subsubplugin\",\"description\":\"Test subsubplugin\",\"list\":\"readme readme2\",\"stability\":\"STABILITY_1_EXPERIMENTAL\",\"version\":\"5.3.7-prerelease\",\"plugin-type\":\"plugin\",\"dependents\":\"\",\"type\":\"application/json\",\"text\":\"{\\\"tiddlers\\\":{\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\":{\\\"title\\\":\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\",\\\"text\\\":\\\"Readme from $:/plugins/tiddlywiki/test-subsubplugin\\\"}}}\"}}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
<p>
|
||||||
|
NO
|
||||||
|
</p>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
title: SubPlugins/SimpleSubPlugin
|
||||||
|
description: Simple sub-plugin
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
{{$:/plugins/tiddlywiki/test-subplugin/readme}}
|
||||||
|
|
||||||
|
+
|
||||||
|
title: $:/plugins/tiddlywiki/bundled-subplugin-tests
|
||||||
|
list: readme
|
||||||
|
name: bundled-subplugin-tests
|
||||||
|
plugin-type: plugin
|
||||||
|
type: application/json
|
||||||
|
|
||||||
|
{"tiddlers":{"$:/plugins/tiddlywiki/bundled-subplugin-tests/readme":{"title":"$:/plugins/tiddlywiki/bundled-subplugin-tests/readme","text":"Readme from $:/plugins/tiddlywiki/bundled-subplugin-tests\n\n"},"$:/plugins/tiddlywiki/test-subplugin":{"title":"$:/plugins/tiddlywiki/test-subplugin","name":"test-subplugin","description":"Test subplugin","list":"readme","stability":"STABILITY_1_EXPERIMENTAL","version":"5.3.7-prerelease","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/plugins/tiddlywiki/test-subplugin/readme\":{\"title\":\"$:/plugins/tiddlywiki/test-subplugin/readme\",\"text\":\"Readme from $:/plugins/tiddlywiki/test-subplugin\"},\"$:/plugins/tiddlywiki/test-subsubplugin\":{\"title\":\"$:/plugins/tiddlywiki/test-subsubplugin\",\"name\":\"test-subsubplugin\",\"description\":\"Test subsubplugin\",\"list\":\"readme readme2\",\"stability\":\"STABILITY_1_EXPERIMENTAL\",\"version\":\"5.3.7-prerelease\",\"plugin-type\":\"plugin\",\"dependents\":\"\",\"type\":\"application/json\",\"text\":\"{\\\"tiddlers\\\":{\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\":{\\\"title\\\":\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\",\\\"text\\\":\\\"Readme from $:/plugins/tiddlywiki/test-subsubplugin\\\"}}}\"}}}"}}}
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
<p>Readme from <a class="tc-tiddlylink tc-tiddlylink-shadow" href="#%24%3A%2Fplugins%2Ftiddlywiki%2Ftest-subplugin">$:/plugins/tiddlywiki/test-subplugin</a></p>
|
||||||
@@ -7,7 +7,9 @@
|
|||||||
"tiddlywiki/menubar",
|
"tiddlywiki/menubar",
|
||||||
"tiddlywiki/confetti",
|
"tiddlywiki/confetti",
|
||||||
"tiddlywiki/dynannotate",
|
"tiddlywiki/dynannotate",
|
||||||
"tiddlywiki/tour"
|
"tiddlywiki/tour",
|
||||||
|
"tiddlywiki/codemirror",
|
||||||
|
"tiddlywiki/bundled-subplugin-tests"
|
||||||
],
|
],
|
||||||
"themes": [
|
"themes": [
|
||||||
"tiddlywiki/vanilla",
|
"tiddlywiki/vanilla",
|
||||||
@@ -21,6 +23,7 @@
|
|||||||
"tiddlywiki/readonly"
|
"tiddlywiki/readonly"
|
||||||
],
|
],
|
||||||
"languages": [
|
"languages": [
|
||||||
|
"fr-FR"
|
||||||
],
|
],
|
||||||
"build": {
|
"build": {
|
||||||
"index": [
|
"index": [
|
||||||
|
|||||||
7
plugins/tiddlywiki/bundled-subplugin-tests/plugin.info
Normal file
7
plugins/tiddlywiki/bundled-subplugin-tests/plugin.info
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"title": "$:/plugins/tiddlywiki/bundled-subplugin-tests",
|
||||||
|
"name": "bundled-subplugin-tests",
|
||||||
|
"description": "Bundled subplugin tests",
|
||||||
|
"list": "readme",
|
||||||
|
"stability": "STABILITY_1_EXPERIMENTAL"
|
||||||
|
}
|
||||||
4
plugins/tiddlywiki/bundled-subplugin-tests/readme.tid
Normal file
4
plugins/tiddlywiki/bundled-subplugin-tests/readme.tid
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
title: $:/plugins/tiddlywiki/bundled-subplugin-tests/readme
|
||||||
|
|
||||||
|
Readme from $:/plugins/tiddlywiki/bundled-subplugin-tests
|
||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"title": "$:/plugins/tiddlywiki/test-subplugin",
|
||||||
|
"name": "test-subplugin",
|
||||||
|
"description": "Test subplugin",
|
||||||
|
"list": "readme",
|
||||||
|
"stability": "STABILITY_1_EXPERIMENTAL"
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
title: $:/plugins/tiddlywiki/test-subplugin/readme
|
||||||
|
|
||||||
|
Readme from $:/plugins/tiddlywiki/test-subplugin
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"title": "$:/plugins/tiddlywiki/test-subsubplugin",
|
||||||
|
"name": "test-subsubplugin",
|
||||||
|
"description": "Test subsubplugin",
|
||||||
|
"list": "readme readme2",
|
||||||
|
"stability": "STABILITY_1_EXPERIMENTAL"
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
title: $:/plugins/tiddlywiki/test-subsubplugin/readme
|
||||||
|
|
||||||
|
Readme from $:/plugins/tiddlywiki/test-subsubplugin
|
||||||
7
plugins/tiddlywiki/codemirror/language/en-GB/plugin.info
Normal file
7
plugins/tiddlywiki/codemirror/language/en-GB/plugin.info
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"title": "$:/language/codemirror/en-GB",
|
||||||
|
"name": "en-GB",
|
||||||
|
"plugin-type": "language",
|
||||||
|
"description": "English (UK) translations for CodeMirror",
|
||||||
|
"list": "readme"
|
||||||
|
}
|
||||||
3
plugins/tiddlywiki/codemirror/language/en-GB/readme.tid
Normal file
3
plugins/tiddlywiki/codemirror/language/en-GB/readme.tid
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
title: $:/language/codemirror/en-GB/readme
|
||||||
|
|
||||||
|
English (UK) translations for CodeMirror
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
title: $:/language/codemirror/
|
||||||
|
|
||||||
|
homeUrl: http://codemirror.net
|
||||||
|
addOnUrl: http://codemirror.net/doc/manual.html#addons
|
||||||
|
configUrl: http://codemirror.net/doc/manual.html#config
|
||||||
|
controlPanel/hint: Tʜᴇꜱᴇ ꜱᴇᴛᴛɪɴɢꜱ ʟᴇᴛ ʏᴏᴜ ᴄᴜꜱᴛᴏᴍɪꜱᴇ ᴛʜᴇ ʙᴇʜᴀᴠɪᴏᴜʀ ᴏꜰ [[CᴏᴅᴇMɪʀʀᴏʀ|$:/plugins/tiddlywiki/codemirror]].
|
||||||
|
controlPanel/keyboard: Kᴇʏʙᴏᴀʀᴅ ꜱʜᴏʀᴛᴄᴜᴛꜱ
|
||||||
|
controlPanel/usage: Uꜱᴀɢᴇ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ
|
||||||
|
cursorBlinkRate/hint: Cᴜʀꜱᴏʀ ʙʟɪɴᴋ ʀᴀᴛᴇ
|
||||||
|
editorFont/hint: Eᴅɪᴛᴏʀ ꜰᴏɴᴛ ꜰᴀᴍɪʟʏ
|
||||||
|
editorFont/info: Sᴇᴛ ᴛʜᴇ ꜰᴏɴᴛ ꜰᴀᴍɪʟʏ ꜰᴏʀ ᴛʜᴇ ~CᴏᴅᴇMɪʀʀᴏʀ ᴛᴇxᴛ-ᴇᴅɪᴛᴏʀ
|
||||||
|
indentUnit/hint: Hᴏᴡ ᴍᴀɴʏ ꜱᴘᴀᴄᴇꜱ ᴀ ʙʟᴏᴄᴋ ꜱʜᴏᴜʟᴅ ʙᴇ ɪɴᴅᴇɴᴛᴇᴅ
|
||||||
|
indentWithTabs/hint: Eɴᴀʙʟᴇ ɪɴᴅᴇɴᴛɪɴɢ ᴡɪᴛʜ ᴛᴀʙꜱ
|
||||||
|
indentWithTabs/info: Wʜᴇᴛʜᴇʀ, ᴡʜᴇɴ ɪɴᴅᴇɴᴛɪɴɢ, ᴛʜᴇ ꜰɪʀꜱᴛ N*`ᴛᴀʙSɪᴢᴇ` ꜱᴘᴀᴄᴇꜱ ꜱʜᴏᴜʟᴅ ʙᴇ ʀᴇᴘʟᴀᴄᴇᴅ ʙʏ N ᴛᴀʙꜱ.
|
||||||
|
keyMap/hint: ~CᴏᴅᴇMɪʀʀᴏʀ ᴋᴇʏᴍᴀᴘ
|
||||||
|
keyMap/info: ~Tʜᴇ Kᴇʏʙᴏᴀʀᴅ KᴇʏMᴀᴘ ᴜꜱᴇᴅ ᴡɪᴛʜɪɴ ᴛʜᴇ ~CᴏᴅᴇMɪʀʀᴏʀ ᴛᴇxᴛ-ᴇᴅɪᴛᴏʀ
|
||||||
|
lineNumbers/hint: Eɴᴀʙʟᴇ ʟɪɴᴇ ɴᴜᴍʙᴇʀꜱ
|
||||||
|
lineNumbers/info: Wʜᴇᴛʜᴇʀ ᴛᴏ ꜱʜᴏᴡ ʟɪɴᴇ ɴᴜᴍʙᴇʀꜱ ᴛᴏ ᴛʜᴇ ʟᴇꜰᴛ ᴏꜰ ᴛʜᴇ ᴇᴅɪᴛᴏʀ.
|
||||||
|
lineWrapping/hint: Eɴᴀʙʟᴇ ʟɪɴᴇ ᴡʀᴀᴘᴘɪɴɢ
|
||||||
|
lineWrapping/info: Wʜᴇᴛʜᴇʀ CᴏᴅᴇMɪʀʀᴏʀ ꜱʜᴏᴜʟᴅ ꜱᴄʀᴏʟʟ ᴏʀ ᴡʀᴀᴘ ꜰᴏʀ ʟᴏɴɢ ʟɪɴᴇꜱ. Dᴇꜰᴀᴜʟᴛꜱ ᴛᴏ `ꜰᴀʟꜱᴇ` (ꜱᴄʀᴏʟʟ).
|
||||||
|
showCursorWhenSelecting/hint: Sʜᴏᴡ ᴄᴜʀꜱᴏʀ, ᴡʜᴇɴ ꜱᴇʟᴇᴄᴛɪɴɢ
|
||||||
|
showCursorWhenSelecting/info: Wʜᴇᴛʜᴇʀ ᴛʜᴇ ᴄᴜʀꜱᴏʀ ꜱʜᴏᴜʟᴅ ʙᴇ ᴅʀᴀᴡɴ ᴡʜᴇɴ ᴀ ꜱᴇʟᴇᴄᴛɪᴏɴ ɪꜱ ᴀᴄᴛɪᴠᴇ.
|
||||||
|
smartIndent/hint: Eɴᴀʙʟᴇ ꜱᴍᴀʀᴛ ɪɴᴅᴇɴᴛ
|
||||||
|
smartIndent/info: Wʜᴇᴛʜᴇʀ ᴛᴏ ᴜꜱᴇ ᴛʜᴇ ᴄᴏɴᴛᴇxᴛ-ꜱᴇɴꜱɪᴛɪᴠᴇ ɪɴᴅᴇɴᴛᴀᴛɪᴏɴ ᴛʜᴀᴛ ᴛʜᴇ ᴍᴏᴅᴇ ᴘʀᴏᴠɪᴅᴇꜱ (ᴏʀ ᴊᴜꜱᴛ ɪɴᴅᴇɴᴛ ᴛʜᴇ ꜱᴀᴍᴇ ᴀꜱ ᴛʜᴇ ʟɪɴᴇ ʙᴇꜰᴏʀᴇ). Dᴇꜰᴀᴜʟᴛꜱ ᴛᴏ `ᴛʀᴜᴇ`.
|
||||||
|
styleActiveLine/hint: Hɪɢʜʟɪɢʜᴛ ᴀᴄᴛɪᴠᴇ ʟɪɴᴇ
|
||||||
|
styleActiveLine/info: Wʜᴇᴛʜᴇʀ ᴏʀ ɴᴏᴛ ᴛᴏ ʜɪɢʜʟɪɢʜᴛ ᴛʜᴇ ᴀᴄᴛɪᴠᴇ ᴛᴇxᴛ-ᴇᴅɪᴛᴏʀ ʟɪɴᴇ
|
||||||
|
tabSize/hint: Wɪᴅᴛʜ ᴏꜰ ᴀ ᴛᴀʙ ᴄʜᴀʀᴀᴄᴛᴇʀ
|
||||||
|
theme/hint: Sᴇʟᴇᴄᴛ ᴀ ᴛʜᴇᴍᴇ
|
||||||
|
theme/info: Cʜᴏᴏꜱᴇ ʙᴇᴛᴡᴇᴇɴ ~CᴏᴅᴇMɪʀʀᴏʀ ᴛʜᴇᴍᴇꜱ
|
||||||
7
plugins/tiddlywiki/codemirror/language/fr-FR/plugin.info
Normal file
7
plugins/tiddlywiki/codemirror/language/fr-FR/plugin.info
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"title": "$:/language/codemirror/fr-FR",
|
||||||
|
"name": "fr-FR",
|
||||||
|
"plugin-type": "language",
|
||||||
|
"description": "French translations for CodeMirror",
|
||||||
|
"list": "readme"
|
||||||
|
}
|
||||||
3
plugins/tiddlywiki/codemirror/language/fr-FR/readme.tid
Normal file
3
plugins/tiddlywiki/codemirror/language/fr-FR/readme.tid
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
title: $:/language/codemirror/fr-FR/readme
|
||||||
|
|
||||||
|
French translations for CodeMirror
|
||||||
@@ -21,17 +21,32 @@ describe("Wiki-based tests", function() {
|
|||||||
var tiddler = $tw.wiki.getTiddler(title);
|
var tiddler = $tw.wiki.getTiddler(title);
|
||||||
it(tiddler.fields.title + ": " + tiddler.fields.description, function() {
|
it(tiddler.fields.title + ": " + tiddler.fields.description, function() {
|
||||||
// Add our tiddlers
|
// Add our tiddlers
|
||||||
var wiki = new $tw.Wiki(),
|
var wiki = new $tw.Wiki();
|
||||||
coreTiddler = $tw.wiki.getTiddler("$:/core");
|
// Suppress next tick dispatch for wiki change events
|
||||||
|
wiki.setDispatchMode(true);
|
||||||
|
// Add the core plugin
|
||||||
|
var coreTiddler = $tw.wiki.getTiddler("$:/core")
|
||||||
if(coreTiddler) {
|
if(coreTiddler) {
|
||||||
wiki.addTiddler(coreTiddler);
|
wiki.addTiddler(coreTiddler);
|
||||||
}
|
}
|
||||||
|
// Add other tiddlers
|
||||||
wiki.addTiddlers(readMultipleTiddlersTiddler(title));
|
wiki.addTiddlers(readMultipleTiddlersTiddler(title));
|
||||||
// Unpack plugin tiddlers
|
// Unpack plugin tiddlers
|
||||||
wiki.readPluginInfo();
|
wiki.readPluginInfo();
|
||||||
wiki.registerPluginTiddlers("plugin");
|
wiki.registerPluginTiddlers("plugin");
|
||||||
wiki.unpackPluginTiddlers();
|
wiki.unpackPluginTiddlers();
|
||||||
wiki.addIndexersToWiki();
|
wiki.addIndexersToWiki();
|
||||||
|
// Install the language switcher
|
||||||
|
var languageSwitcher = new $tw.PluginSwitcher({
|
||||||
|
wiki: wiki,
|
||||||
|
pluginType: "language",
|
||||||
|
controllerTitle: "$:/language",
|
||||||
|
defaultPlugins: [
|
||||||
|
"$:/languages/en-GB"
|
||||||
|
]
|
||||||
|
});
|
||||||
|
// Install the plugin change event handler
|
||||||
|
$tw.utils.installPluginChangeHandler(wiki);
|
||||||
// Clear changes queue
|
// Clear changes queue
|
||||||
wiki.clearTiddlerEventQueue();
|
wiki.clearTiddlerEventQueue();
|
||||||
// Complain if we don't have the ouput and expected results
|
// Complain if we don't have the ouput and expected results
|
||||||
@@ -44,12 +59,17 @@ describe("Wiki-based tests", function() {
|
|||||||
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||||
// Render the widget node to the DOM
|
// Render the widget node to the DOM
|
||||||
var wrapper = renderWidgetNode(widgetNode);
|
var wrapper = renderWidgetNode(widgetNode);
|
||||||
// Clear changes queue
|
// Install the wiki change event handler
|
||||||
wiki.clearTiddlerEventQueue();
|
wiki.addEventListener("change",function(changes) {
|
||||||
|
widgetNode.refresh(changes,wrapper);
|
||||||
|
});
|
||||||
// Run the actions if provided
|
// Run the actions if provided
|
||||||
if(wiki.tiddlerExists("Actions")) {
|
if(wiki.tiddlerExists("Actions")) {
|
||||||
widgetNode.invokeActionString(wiki.getTiddlerText("Actions"));
|
widgetNode.invokeActionString(wiki.getTiddlerText("Actions"));
|
||||||
refreshWidgetNode(widgetNode,wrapper);
|
}
|
||||||
|
// Make sure all wiki events have been cleared
|
||||||
|
while(wiki.eventsTriggered) {
|
||||||
|
wiki.processOutstandingTiddlerEvents();
|
||||||
}
|
}
|
||||||
// Test the rendering
|
// Test the rendering
|
||||||
expect(wrapper.innerHTML).toBe(wiki.getTiddlerText("ExpectedResult"));
|
expect(wrapper.innerHTML).toBe(wiki.getTiddlerText("ExpectedResult"));
|
||||||
@@ -90,9 +110,4 @@ describe("Wiki-based tests", function() {
|
|||||||
return wrapper;
|
return wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshWidgetNode(widgetNode,wrapper) {
|
|
||||||
widgetNode.refresh(widgetNode.wiki.changedTiddlers,wrapper);
|
|
||||||
// console.log(require("util").inspect(wrapper,{depth: 8}));
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user