1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-11-16 23:04:50 +00:00

update to head

This commit is contained in:
buggyj 2014-09-01 13:00:54 +02:00
commit c956d9c1dc
92 changed files with 444 additions and 360 deletions

7
.jshintignore Normal file
View File

@ -0,0 +1,7 @@
plugins/tiddlywiki/browser-sniff/files
plugins/tiddlywiki/codemirror/files/
plugins/tiddlywiki/d3/files/
plugins/tiddlywiki/highlight/files/
plugins/tiddlywiki/jasmine/files/
plugins/tiddlywiki/markdown/files/
plugins/tiddlywiki/markdown/files/

View File

@ -26,7 +26,7 @@ Command.prototype.execute = function() {
// Get the build targets defined in the wiki // Get the build targets defined in the wiki
var buildTargets = $tw.boot.wikiInfo.build; var buildTargets = $tw.boot.wikiInfo.build;
if(!buildTargets) { if(!buildTargets) {
return "No build targets defined" return "No build targets defined";
} }
// Loop through each of the specified targets // Loop through each of the specified targets
var targets; var targets;

View File

@ -78,7 +78,7 @@ SimpleServer.prototype.findMatchingRoute = function(request,state) {
}; };
SimpleServer.prototype.checkCredentials = function(request,incomingUsername,incomingPassword) { SimpleServer.prototype.checkCredentials = function(request,incomingUsername,incomingPassword) {
var header = request.headers["authorization"] || "", var header = request.headers.authorization || "",
token = header.split(/\s+/).pop() || "", token = header.split(/\s+/).pop() || "",
auth = $tw.utils.base64Decode(token), auth = $tw.utils.base64Decode(token),
parts = auth.split(/:/), parts = auth.split(/:/),
@ -89,7 +89,7 @@ SimpleServer.prototype.checkCredentials = function(request,incomingUsername,inco
} else { } else {
return "DENIED"; return "DENIED";
} }
} };
SimpleServer.prototype.listen = function(port,host) { SimpleServer.prototype.listen = function(port,host) {
var self = this; var self = this;
@ -167,8 +167,8 @@ var Command = function(params,commander,callback) {
delete fields.fields; delete fields.fields;
} }
// Remove any revision field // Remove any revision field
if(fields["revision"]) { if(fields.revision) {
delete fields["revision"]; delete fields.revision;
} }
state.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title})); state.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title}));
var changeCount = state.wiki.getChangeCount(title).toString(); var changeCount = state.wiki.getChangeCount(title).toString();
@ -237,7 +237,7 @@ var Command = function(params,commander,callback) {
tiddlerFields[name] = tiddler.getFieldString(name); tiddlerFields[name] = tiddler.getFieldString(name);
} }
}); });
tiddlerFields["revision"] = state.wiki.getChangeCount(title); tiddlerFields.revision = state.wiki.getChangeCount(title);
tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki"; tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki";
tiddlers.push(tiddlerFields); tiddlers.push(tiddlerFields);
}); });
@ -265,7 +265,7 @@ var Command = function(params,commander,callback) {
tiddlerFields.fields[name] = value; tiddlerFields.fields[name] = value;
} }
}); });
tiddlerFields["revision"] = state.wiki.getChangeCount(title); tiddlerFields.revision = state.wiki.getChangeCount(title);
tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki"; tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki";
response.writeHead(200, {"Content-Type": "application/json"}); response.writeHead(200, {"Content-Type": "application/json"});
response.end(JSON.stringify(tiddlerFields),"utf8"); response.end(JSON.stringify(tiddlerFields),"utf8");

View File

@ -109,7 +109,7 @@ exports["text/html"] = function(text,fields) {
if(sysMatch) { if(sysMatch) {
results.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields)); results.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));
} }
return results return results;
} else { } else {
// Check whether we've got an encrypted file // Check whether we've got an encrypted file
var encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text); var encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);

View File

@ -34,7 +34,9 @@ exports.all = function(source,operator,options) {
var results = [], var results = [],
subops = operator.operand.split("+"); subops = operator.operand.split("+");
// Check for common optimisations // Check for common optimisations
if(subops.length === 1 && subops[0] === "tiddlers") { if(subops.length === 1 && subops[0] === "") {
return source;
} else if(subops.length === 1 && subops[0] === "tiddlers") {
return options.wiki.each; return options.wiki.each;
} else if(subops.length === 1 && subops[0] === "shadows") { } else if(subops.length === 1 && subops[0] === "shadows") {
return options.wiki.eachShadow; return options.wiki.eachShadow;

View File

@ -20,7 +20,7 @@ function getIsFilterOperators() {
$tw.modules.applyMethods("isfilteroperator",isFilterOperators); $tw.modules.applyMethods("isfilteroperator",isFilterOperators);
} }
return isFilterOperators; return isFilterOperators;
}; }
/* /*
Export our filter function Export our filter function

View File

@ -45,6 +45,6 @@ var prepare_results = function (source) {
results.push(title); results.push(title);
}); });
return results; return results;
} };
})(); })();

View File

@ -13,7 +13,7 @@ Initialise basic platform $:/info/ tiddlers
"use strict"; "use strict";
exports.getInfoTiddlerFields = function() { exports.getInfoTiddlerFields = function() {
var mapBoolean = function(value) {return value ? "yes" : "no"}, var mapBoolean = function(value) {return value ? "yes" : "no";},
infoTiddlerFields = []; infoTiddlerFields = [];
// Basics // Basics
infoTiddlerFields.push({title: "$:/info/browser", text: mapBoolean(!!$tw.browser)}); infoTiddlerFields.push({title: "$:/info/browser", text: mapBoolean(!!$tw.browser)});

View File

@ -23,8 +23,8 @@ exports.types = {block: true};
exports.init = function(parser) { exports.init = function(parser) {
this.parser = parser; this.parser = parser;
this.matchRegExp = /\<!--/mg; this.matchRegExp = /<!--/mg;
this.endMatchRegExp = /--\>/mg; this.endMatchRegExp = /-->/mg;
}; };
exports.findNextMatch = function(startPos) { exports.findNextMatch = function(startPos) {

View File

@ -23,8 +23,8 @@ exports.types = {inline: true};
exports.init = function(parser) { exports.init = function(parser) {
this.parser = parser; this.parser = parser;
this.matchRegExp = /\<!--/mg; this.matchRegExp = /<!--/mg;
this.endMatchRegExp = /--\>/mg; this.endMatchRegExp = /-->/mg;
}; };
exports.findNextMatch = function(startPos) { exports.findNextMatch = function(startPos) {

View File

@ -56,7 +56,7 @@ exports.parse = function() {
node.attributes.style = {type: "string", value: style}; node.attributes.style = {type: "string", value: style};
} }
if(classes) { if(classes) {
node.attributes["itemClass"] = {type: "string", value: classes.split(".").join(" ")}; node.attributes.itemClass = {type: "string", value: classes.split(".").join(" ")};
} }
return [node]; return [node];
}; };

View File

@ -55,7 +55,7 @@ exports.parse = function() {
node.attributes.style = {type: "string", value: style}; node.attributes.style = {type: "string", value: style};
} }
if(classes) { if(classes) {
node.attributes["itemClass"] = {type: "string", value: classes.split(".").join(" ")}; node.attributes.itemClass = {type: "string", value: classes.split(".").join(" ")};
} }
return [node]; return [node];
}; };

View File

@ -34,7 +34,8 @@ exports.init = function(parser) {
exports.parse = function() { exports.parse = function() {
var reEnd = /(""")|(\r?\n)/mg, var reEnd = /(""")|(\r?\n)/mg,
tree = []; tree = [],
match;
// Move past the match // Move past the match
this.parser.pos = this.matchRegExp.lastIndex; this.parser.pos = this.matchRegExp.lastIndex;
do { do {
@ -42,7 +43,7 @@ exports.parse = function() {
tree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false})); tree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));
// Redo the terminator match // Redo the terminator match
reEnd.lastIndex = this.parser.pos; reEnd.lastIndex = this.parser.pos;
var match = reEnd.exec(this.parser.source); match = reEnd.exec(this.parser.source);
if(match) { if(match) {
this.parser.pos = reEnd.lastIndex; this.parser.pos = reEnd.lastIndex;
// Add a line break if the terminator was a line break // Add a line break if the terminator was a line break

View File

@ -55,7 +55,6 @@ exports.parse = function() {
classes.push.apply(classes, this.parser.parseClasses()); classes.push.apply(classes, this.parser.parseClasses());
this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true}); this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});
var cite = this.parser.parseInlineRun(/(\r?\n)/mg); var cite = this.parser.parseInlineRun(/(\r?\n)/mg);
// before handling the cite, parse the body of the quote // before handling the cite, parse the body of the quote
var tree= this.parser.parseBlocks(reEndString); var tree= this.parser.parseBlocks(reEndString);
// If we got a cite, put it before the text // If we got a cite, put it before the text
@ -66,10 +65,9 @@ exports.parse = function() {
children: cite children: cite
}); });
} }
// Parse any optional cite // Parse any optional cite
this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true}); this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});
var cite = this.parser.parseInlineRun(/(\r?\n)/mg); cite = this.parser.parseInlineRun(/(\r?\n)/mg);
// If we got a cite, push it // If we got a cite, push it
if(cite.length > 0) { if(cite.length > 0) {
tree.push({ tree.push({
@ -78,7 +76,6 @@ exports.parse = function() {
children: cite children: cite
}); });
} }
// Return the blockquote element // Return the blockquote element
return [{ return [{
type: "element", type: "element",

View File

@ -27,7 +27,8 @@ var processRow = function(prevColumns) {
tree = [], tree = [],
col = 0, col = 0,
colSpanCount = 1, colSpanCount = 1,
prevCell; prevCell,
vAlign;
// Match a single cell // Match a single cell
cellRegExp.lastIndex = this.parser.pos; cellRegExp.lastIndex = this.parser.pos;
var cellMatch = cellRegExp.exec(this.parser.source); var cellMatch = cellRegExp.exec(this.parser.source);
@ -38,7 +39,7 @@ var processRow = function(prevColumns) {
if(last) { if(last) {
last.rowSpanCount++; last.rowSpanCount++;
$tw.utils.addAttributeToParseTreeNode(last.element,"rowspan",last.rowSpanCount); $tw.utils.addAttributeToParseTreeNode(last.element,"rowspan",last.rowSpanCount);
var vAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,"valign","center"); vAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,"valign","center");
$tw.utils.addAttributeToParseTreeNode(last.element,"valign",vAlign); $tw.utils.addAttributeToParseTreeNode(last.element,"valign",vAlign);
if(colSpanCount > 1) { if(colSpanCount > 1) {
$tw.utils.addAttributeToParseTreeNode(last.element,"colspan",colSpanCount); $tw.utils.addAttributeToParseTreeNode(last.element,"colspan",colSpanCount);
@ -74,7 +75,7 @@ var processRow = function(prevColumns) {
// For ordinary cells, step beyond the opening `|` // For ordinary cells, step beyond the opening `|`
this.parser.pos++; this.parser.pos++;
// Look for a space at the start of the cell // Look for a space at the start of the cell
var spaceLeft = false, var spaceLeft = false;
vAlign = null; vAlign = null;
if(this.parser.source.substr(this.parser.pos).search(/^\^([^\^]|\^\^)/) === 0) { if(this.parser.source.substr(this.parser.pos).search(/^\^([^\^]|\^\^)/) === 0) {
vAlign = "top"; vAlign = "top";

View File

@ -41,11 +41,12 @@ exports.parse = function() {
isBlock: true isBlock: true
}; };
// Prepare the tiddler widget // Prepare the tiddler widget
var tr, targetTitle, targetField, targetIndex, tiddlerNode;
if(textRef) { if(textRef) {
var tr = $tw.utils.parseTextReference(textRef), tr = $tw.utils.parseTextReference(textRef);
targetTitle = tr.title, targetTitle = tr.title;
targetField = tr.field, targetField = tr.field;
targetIndex = tr.index, targetIndex = tr.index;
tiddlerNode = { tiddlerNode = {
type: "tiddler", type: "tiddler",
attributes: { attributes: {

View File

@ -38,11 +38,12 @@ exports.parse = function() {
attributes: {} attributes: {}
}; };
// Prepare the tiddler widget // Prepare the tiddler widget
var tr, targetTitle, targetField, targetIndex, tiddlerNode;
if(textRef) { if(textRef) {
var tr = $tw.utils.parseTextReference(textRef), tr = $tw.utils.parseTextReference(textRef);
targetTitle = tr.title, targetTitle = tr.title;
targetField = tr.field, targetField = tr.field;
targetIndex = tr.index, targetIndex = tr.index;
tiddlerNode = { tiddlerNode = {
type: "tiddler", type: "tiddler",
attributes: { attributes: {

View File

@ -68,7 +68,7 @@ exports.parse = function() {
var widgetNode = this.parser.wiki.makeWidget(parser), var widgetNode = this.parser.wiki.makeWidget(parser),
container = $tw.fakeDocument.createElement("div"); container = $tw.fakeDocument.createElement("div");
widgetNode.render(container,null); widgetNode.render(container,null);
var text = renderType === "text/html" ? container.innerHTML : container.textContent; text = renderType === "text/html" ? container.innerHTML : container.textContent;
return [{ return [{
type: "element", type: "element",
tag: "pre", tag: "pre",

View File

@ -27,7 +27,7 @@ var textPrimitives = {
upperLetter: "[A-Z\u00c0-\u00d6\u00d8-\u00de\u0150\u0170]", upperLetter: "[A-Z\u00c0-\u00d6\u00d8-\u00de\u0150\u0170]",
lowerLetter: "[a-z0-9\u00df-\u00f6\u00f8-\u00ff\u0151\u0171]", lowerLetter: "[a-z0-9\u00df-\u00f6\u00f8-\u00ff\u0151\u0171]",
anyLetter: "[A-Za-z0-9\u00c0-\u00d6\u00d8-\u00de\u00df-\u00f6\u00f8-\u00ff\u0150\u0170\u0151\u0171]", anyLetter: "[A-Za-z0-9\u00c0-\u00d6\u00d8-\u00de\u00df-\u00f6\u00f8-\u00ff\u0150\u0170\u0151\u0171]",
blockPrefixLetters: "[A-Za-z0-9\-_\u00c0-\u00d6\u00d8-\u00de\u00df-\u00f6\u00f8-\u00ff\u0150\u0170\u0151\u0171]" blockPrefixLetters: "[A-Za-z0-9-_\u00c0-\u00d6\u00d8-\u00de\u00df-\u00f6\u00f8-\u00ff\u0150\u0170\u0151\u0171]"
}; };
textPrimitives.unWikiLink = "~"; textPrimitives.unWikiLink = "~";

View File

@ -100,7 +100,7 @@ Get the next match out of an array of parse rule instances
*/ */
WikiParser.prototype.findNextMatch = function(rules,startPos) { WikiParser.prototype.findNextMatch = function(rules,startPos) {
// Find the best matching rule by finding the closest match position // Find the best matching rule by finding the closest match position
var matchingRule = undefined, var matchingRule,
matchingRulePos = this.sourceLength; matchingRulePos = this.sourceLength;
// Step through each rule // Step through each rule
for(var t=0; t<rules.length; t++) { for(var t=0; t<rules.length; t++) {
@ -308,7 +308,7 @@ WikiParser.prototype.parseClasses = function() {
while(match && match.index === this.pos) { while(match && match.index === this.pos) {
this.pos = match.index + match[0].length; this.pos = match.index + match[0].length;
classNames.push(match[1]); classNames.push(match[1]);
var match = classRegExp.exec(this.source); match = classRegExp.exec(this.source);
} }
return classNames; return classNames;
}; };
@ -345,7 +345,7 @@ WikiParser.prototype.amendRules = function(type,names) {
processRuleArray(this.pragmaRules); processRuleArray(this.pragmaRules);
processRuleArray(this.blockRules); processRuleArray(this.blockRules);
processRuleArray(this.inlineRules); processRuleArray(this.inlineRules);
} };
exports["text/vnd.tiddlywiki"] = WikiParser; exports["text/vnd.tiddlywiki"] = WikiParser;

View File

@ -21,6 +21,7 @@ function SaverHandler(options) {
var self = this; var self = this;
this.wiki = options.wiki; this.wiki = options.wiki;
this.dirtyTracking = options.dirtyTracking; this.dirtyTracking = options.dirtyTracking;
this.pendingAutoSave = false;
// Make a logger // Make a logger
this.logger = new $tw.utils.Logger("saver-handler"); this.logger = new $tw.utils.Logger("saver-handler");
// Initialise our savers // Initialise our savers
@ -43,15 +44,37 @@ function SaverHandler(options) {
}); });
self.numTasksInQueue += filteredChanges.length; self.numTasksInQueue += filteredChanges.length;
self.updateDirtyStatus(); self.updateDirtyStatus();
// Do any autosave if one is pending and there's no more change events
if(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {
// Check if we're dirty
if(self.numTasksInQueue > 0) { if(self.numTasksInQueue > 0) {
self.saveWiki({method: "autosave"}); self.saveWiki({
method: "autosave",
downloadType: "text/plain"
});
}
self.pendingAutoSave = false;
}
});
// Listen for the autosave event
$tw.rootWidget.addEventListener("tw-auto-save-wiki",function(event) {
// Do the autosave unless there are outstanding tiddler change events
if(self.wiki.getSizeOfTiddlerEventQueue() === 0) {
// Check if we're dirty
if(self.numTasksInQueue > 0) {
self.saveWiki({
method: "autosave",
downloadType: "text/plain"
});
}
} else {
// Otherwise put ourselves in the "pending autosave" state and wait for the change event before we do the autosave
self.pendingAutoSave = true;
} }
}); });
// Browser event handlers
if($tw.browser) {
// Set up our beforeunload handler // Set up our beforeunload handler
window.addEventListener("beforeunload",function(event) { window.addEventListener("beforeunload",function(event) {
var confirmationMessage = undefined; var confirmationMessage;
if(self.isDirty()) { if(self.isDirty()) {
confirmationMessage = $tw.language.getString("UnsavedChangesWarning"); confirmationMessage = $tw.language.getString("UnsavedChangesWarning");
event.returnValue = confirmationMessage; // Gecko event.returnValue = confirmationMessage; // Gecko
@ -59,7 +82,6 @@ function SaverHandler(options) {
return confirmationMessage; return confirmationMessage;
}); });
} }
}
// Install the save action handlers // Install the save action handlers
if($tw.browser) { if($tw.browser) {
$tw.rootWidget.addEventListener("tm-save-wiki",function(event) { $tw.rootWidget.addEventListener("tm-save-wiki",function(event) {

View File

@ -32,7 +32,7 @@ AndTidWiki.prototype.save = function(text,method,callback) {
pathname = pathname.substr(0,p); pathname = pathname.substr(0,p);
} }
// Save the file // Save the file
window.twi.saveFile(pathname,text) window.twi.saveFile(pathname,text);
// Call the callback // Call the callback
callback(null); callback(null);
return true; return true;

View File

@ -21,7 +21,7 @@ TiddlyFoxSaver.prototype.save = function(text,method,callback) {
// Get the pathname of this document // Get the pathname of this document
var pathname = document.location.toString().split("#")[0]; var pathname = document.location.toString().split("#")[0];
// Replace file://localhost/ with file:/// // Replace file://localhost/ with file:///
if(pathname.indexOf("file://localhost/") == 0) { if(pathname.indexOf("file://localhost/") === 0) {
pathname = "file://" + pathname.substr(16); pathname = "file://" + pathname.substr(16);
} }
// Windows path file:///x:/blah/blah --> x:\blah\blah // Windows path file:///x:/blah/blah --> x:\blah\blah
@ -32,10 +32,10 @@ TiddlyFoxSaver.prototype.save = function(text,method,callback) {
} else if(pathname.indexOf("file://///") === 0) { } else if(pathname.indexOf("file://///") === 0) {
pathname = "\\\\" + unescape(pathname.substr(10)).replace(/\//g,"\\"); pathname = "\\\\" + unescape(pathname.substr(10)).replace(/\//g,"\\");
// Mac/Unix local path file:///path/path --> /path/path // Mac/Unix local path file:///path/path --> /path/path
} else if(pathname.indexOf("file:///") == 0) { } else if(pathname.indexOf("file:///") === 0) {
pathname = unescape(pathname.substr(7)); pathname = unescape(pathname.substr(7));
// Mac/Unix local path file:/path/path --> /path/path // Mac/Unix local path file:/path/path --> /path/path
} else if(pathname.indexOf("file:/") == 0) { } else if(pathname.indexOf("file:/") === 0) {
pathname = unescape(pathname.substr(5)); pathname = unescape(pathname.substr(5));
// Otherwise Windows networth path file://server/share/path/path --> \\server\share\path\path // Otherwise Windows networth path file://server/share/path/path --> \\server\share\path\path
} else { } else {

View File

@ -38,6 +38,6 @@ function setFavicon() {
var faviconLink = document.getElementById("faviconLink"); var faviconLink = document.getElementById("faviconLink");
faviconLink.setAttribute("href","data:" + tiddler.fields.type + ";base64," + tiddler.fields.text); faviconLink.setAttribute("href","data:" + tiddler.fields.type + ";base64," + tiddler.fields.text);
} }
}; }
})(); })();

View File

@ -19,7 +19,7 @@ exports.after = ["story"];
exports.synchronous = true; exports.synchronous = true;
// Default story and history lists // Default story and history lists
var PAGE_TITLE_TITLE = "$:/core/wiki/title" var PAGE_TITLE_TITLE = "$:/core/wiki/title";
var PAGE_STYLESHEET_TITLE = "$:/core/ui/PageStylesheet"; var PAGE_STYLESHEET_TITLE = "$:/core/ui/PageStylesheet";
var PAGE_TEMPLATE_TITLE = "$:/core/ui/PageTemplate"; var PAGE_TEMPLATE_TITLE = "$:/core/ui/PageTemplate";

View File

@ -48,7 +48,7 @@ exports.startup = function() {
$tw.locationHash = hash; $tw.locationHash = hash;
openStartupTiddlers({defaultToCurrentStory: true}); openStartupTiddlers({defaultToCurrentStory: true});
} }
},false) },false);
// Listen for the tm-browser-refresh message // Listen for the tm-browser-refresh message
$tw.rootWidget.addEventListener("tm-browser-refresh",function(event) { $tw.rootWidget.addEventListener("tm-browser-refresh",function(event) {
window.location.reload(true); window.location.reload(true);
@ -157,7 +157,7 @@ function updateLocationHash(options) {
} }
// Assemble the location hash // Assemble the location hash
if(options.updateAddressBar === "permalink") { if(options.updateAddressBar === "permalink") {
$tw.locationHash = "#" + encodeURIComponent(targetTiddler) $tw.locationHash = "#" + encodeURIComponent(targetTiddler);
} else { } else {
$tw.locationHash = "#" + encodeURIComponent(targetTiddler) + ":" + encodeURIComponent($tw.utils.stringifyList(storyList)); $tw.locationHash = "#" + encodeURIComponent(targetTiddler) + ":" + encodeURIComponent($tw.utils.stringifyList(storyList));
} }

View File

@ -16,7 +16,7 @@ var easing = "cubic-bezier(0.645, 0.045, 0.355, 1)"; // From http://easings.net/
var ClassicStoryView = function(listWidget) { var ClassicStoryView = function(listWidget) {
this.listWidget = listWidget; this.listWidget = listWidget;
} };
ClassicStoryView.prototype.navigateTo = function(historyInfo) { ClassicStoryView.prototype.navigateTo = function(historyInfo) {
var listElementIndex = this.listWidget.findListItem(0,historyInfo.title); var listElementIndex = this.listWidget.findListItem(0,historyInfo.title);

View File

@ -14,7 +14,7 @@ Animates list insertions and removals
var PopStoryView = function(listWidget) { var PopStoryView = function(listWidget) {
this.listWidget = listWidget; this.listWidget = listWidget;
} };
PopStoryView.prototype.navigateTo = function(historyInfo) { PopStoryView.prototype.navigateTo = function(historyInfo) {
var listElementIndex = this.listWidget.findListItem(0,historyInfo.title); var listElementIndex = this.listWidget.findListItem(0,historyInfo.title);

View File

@ -86,7 +86,7 @@ ZoominListView.prototype.navigateTo = function(historyInfo) {
]); ]);
// Transform the previous tiddler out of the way and then hide it // Transform the previous tiddler out of the way and then hide it
if(prevCurrentTiddler && prevCurrentTiddler !== targetElement) { if(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {
var scale = zoomBounds.width / sourceBounds.width; scale = zoomBounds.width / sourceBounds.width;
x = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale; x = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;
y = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale; y = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;
$tw.utils.setStyle(prevCurrentTiddler,[ $tw.utils.setStyle(prevCurrentTiddler,[

View File

@ -20,7 +20,7 @@ wiki: wiki to be synced
function Syncer(options) { function Syncer(options) {
var self = this; var self = this;
this.wiki = options.wiki; this.wiki = options.wiki;
this.syncadaptor = options.syncadaptor this.syncadaptor = options.syncadaptor;
// Make a logger // Make a logger
this.logger = new $tw.utils.Logger("syncer" + ($tw.browser ? "-browser" : "") + ($tw.node ? "-server" : "")); this.logger = new $tw.utils.Logger("syncer" + ($tw.browser ? "-browser" : "") + ($tw.node ? "-server" : ""));
// Compile the dirty tiddler filter // Compile the dirty tiddler filter
@ -40,7 +40,7 @@ function Syncer(options) {
if($tw.browser) { if($tw.browser) {
// Set up our beforeunload handler // Set up our beforeunload handler
window.addEventListener("beforeunload",function(event) { window.addEventListener("beforeunload",function(event) {
var confirmationMessage = undefined; var confirmationMessage;
if(self.isDirty()) { if(self.isDirty()) {
confirmationMessage = $tw.language.getString("UnsavedChangesWarning"); confirmationMessage = $tw.language.getString("UnsavedChangesWarning");
event.returnValue = confirmationMessage; // Gecko event.returnValue = confirmationMessage; // Gecko
@ -94,10 +94,10 @@ Syncer.prototype.readTiddlerInfo = function() {
$tw.utils.each(tiddlers,function(title) { $tw.utils.each(tiddlers,function(title) {
var tiddler = self.wiki.getTiddler(title); var tiddler = self.wiki.getTiddler(title);
self.tiddlerInfo[title] = { self.tiddlerInfo[title] = {
revision: tiddler.fields["revision"], revision: tiddler.fields.revision,
adaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler), adaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),
changeCount: self.wiki.getChangeCount(title) changeCount: self.wiki.getChangeCount(title)
} };
}); });
}; };
@ -329,7 +329,7 @@ Syncer.prototype.enqueueSyncTask = function(task) {
revision: null, revision: null,
adaptorInfo: {}, adaptorInfo: {},
changeCount: -1 changeCount: -1
} };
} }
// Bail if this is a save and the tiddler is already at the changeCount that the server has // Bail if this is a save and the tiddler is already at the changeCount that the server has
if(task.type === "save" && this.wiki.getChangeCount(task.title) <= this.tiddlerInfo[task.title].changeCount) { if(task.type === "save" && this.wiki.getChangeCount(task.title) <= this.tiddlerInfo[task.title].changeCount) {

View File

@ -36,10 +36,10 @@ exports.upgrade = function(wiki,titles,tiddlers) {
$tw.utils.each(titles,function(title) { $tw.utils.each(titles,function(title) {
var incomingTiddler = tiddlers[title]; var incomingTiddler = tiddlers[title];
// Check if we're dealing with a plugin // Check if we're dealing with a plugin
if(incomingTiddler && incomingTiddler["plugin-type"] && incomingTiddler["version"]) { if(incomingTiddler && incomingTiddler["plugin-type"] && incomingTiddler.version) {
// Upgrade the incoming plugin if we've got a newer version in the upgrade library // Upgrade the incoming plugin if we've got a newer version in the upgrade library
var libraryTiddler = getLibraryTiddler(title); var libraryTiddler = getLibraryTiddler(title);
if(libraryTiddler && libraryTiddler["plugin-type"] && libraryTiddler["version"]) { if(libraryTiddler && libraryTiddler["plugin-type"] && libraryTiddler.version) {
if($tw.utils.checkVersions(libraryTiddler.version,incomingTiddler.version)) { if($tw.utils.checkVersions(libraryTiddler.version,incomingTiddler.version)) {
tiddlers[title] = libraryTiddler; tiddlers[title] = libraryTiddler;
messages[title] = $tw.language.getString("Import/Upgrader/Plugins/Upgraded",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}}); messages[title] = $tw.language.getString("Import/Upgrader/Plugins/Upgraded",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});

View File

@ -51,10 +51,10 @@ exports.upgrade = function(wiki,titles,tiddlers) {
tiddlers[mappedTitle] = { tiddlers[mappedTitle] = {
title: mappedTitle, title: mappedTitle,
text: tiddlerData[index] text: tiddlerData[index]
} };
messages[mappedTitle] = $tw.language.getString("Import/Upgrader/ThemeTweaks/Created",{variables: { messages[mappedTitle] = $tw.language.getString("Import/Upgrader/ThemeTweaks/Created",{variables: {
from: title + "##" + index from: title + "##" + index
}}) }});
} }
} }
} }

View File

@ -93,7 +93,7 @@ Modal.prototype.display = function(title,options) {
}); });
// Setup the link if present // Setup the link if present
if(options.downloadLink) { if(options.downloadLink) {
modalLink.href = options.downloadLink modalLink.href = options.downloadLink;
modalLink.appendChild(document.createTextNode("Right-click to save changes")); modalLink.appendChild(document.createTextNode("Right-click to save changes"));
modalBody.appendChild(modalLink); modalBody.appendChild(modalLink);
} }

View File

@ -19,7 +19,7 @@ var bumpSequenceNumber = function(object) {
if(sequenceNumber !== null) { if(sequenceNumber !== null) {
object.sequenceNumber = sequenceNumber++; object.sequenceNumber = sequenceNumber++;
} }
} };
var TW_TextNode = function(text) { var TW_TextNode = function(text) {
bumpSequenceNumber(this); bumpSequenceNumber(this);
@ -79,7 +79,7 @@ TW_Element.prototype.insertBefore = function(node,nextSibling) {
} else { } else {
this.appendChild(node); this.appendChild(node);
} }
} };
TW_Element.prototype.removeChild = function(node) { TW_Element.prototype.removeChild = function(node) {
var p = this.children.indexOf(node); var p = this.children.indexOf(node);
@ -113,10 +113,10 @@ Object.defineProperty(TW_Element.prototype, "className", {
Object.defineProperty(TW_Element.prototype, "value", { Object.defineProperty(TW_Element.prototype, "value", {
get: function() { get: function() {
return this.attributes["value"] || ""; return this.attributes.value || "";
}, },
set: function(value) { set: function(value) {
this.attributes["value"] = value; this.attributes.value = value;
} }
}); });
@ -193,7 +193,7 @@ Object.defineProperty(TW_Element.prototype, "formattedTextContent", {
b.push("\n"); b.push("\n");
} }
if(this.tag === "li") { if(this.tag === "li") {
b.push("* ") b.push("* ");
} }
$tw.utils.each(this.children,function(node) { $tw.utils.each(this.children,function(node) {
b.push(node.formattedTextContent); b.push(node.formattedTextContent);

View File

@ -41,7 +41,7 @@ exports.copyDirectory = function(srcPath,dstPath) {
if(err) { if(err) {
return err; return err;
} }
}; }
} }
}; };
copy(srcPath,dstPath); copy(srcPath,dstPath);
@ -70,7 +70,7 @@ exports.copyFile = function(srcPath,dstPath) {
fs.closeSync(srcFile); fs.closeSync(srcFile);
fs.closeSync(dstFile); fs.closeSync(dstFile);
return null; return null;
} };
/* /*
Remove trailing path separator Remove trailing path separator

View File

@ -41,9 +41,9 @@ exports.addClassToParseTreeNode = function(node,classString) {
exports.addStyleToParseTreeNode = function(node,name,value) { exports.addStyleToParseTreeNode = function(node,name,value) {
node.attributes = node.attributes || {}; node.attributes = node.attributes || {};
node.attributes["style"] = node.attributes["style"] || {type: "string", value: ""}; node.attributes.style = node.attributes.style || {type: "string", value: ""};
if(node.attributes["style"].type === "string") { if(node.attributes.style.type === "string") {
node.attributes["style"].value += name + ":" + value + ";"; node.attributes.style.value += name + ":" + value + ";";
} }
}; };

View File

@ -24,15 +24,16 @@ exports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {
throw "No such tiddler as " + title; throw "No such tiddler as " + title;
} }
// Extract the JSON // Extract the JSON
var jsonPluginTiddler;
try { try {
var jsonPluginTiddler = JSON.parse(pluginTiddler.fields.text); jsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);
} catch(e) { } catch(e) {
throw "Cannot parse plugin tiddler " + title + "\nError: " + e; throw "Cannot parse plugin tiddler " + title + "\nError: " + e;
} }
// Get the list of tiddlers // Get the list of tiddlers
var tiddlers = Object.keys(jsonPluginTiddler.tiddlers); var tiddlers = Object.keys(jsonPluginTiddler.tiddlers);
// Add the additional tiddlers // Add the additional tiddlers
$tw.utils.pushTop(tiddlers,additionalTiddlers) $tw.utils.pushTop(tiddlers,additionalTiddlers);
// Remove any excluded tiddlers // Remove any excluded tiddlers
for(var t=tiddlers.length-1; t>=0; t--) { for(var t=tiddlers.length-1; t>=0; t--) {
if(excludeTiddlers.indexOf(tiddlers[t]) !== -1) { if(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {
@ -71,8 +72,10 @@ exports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {
$tw.wiki.deleteTiddler(title); $tw.wiki.deleteTiddler(title);
} }
}); });
// Trigger an autosave
$tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"});
// Return a heartwarming confirmation // Return a heartwarming confirmation
return "Plugin " + title + " successfully saved"; return "Plugin " + title + " successfully saved";
} };
})(); })();

View File

@ -126,7 +126,7 @@ DropZoneWidget.prototype.importData = function(dataTransfer) {
return; return;
} }
} }
}; }
}; };
DropZoneWidget.prototype.importDataTypes = [ DropZoneWidget.prototype.importDataTypes = [

View File

@ -120,7 +120,7 @@ EditBitmapWidget.prototype.loadCanvas = function() {
self.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT); self.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);
// Set the width and height input boxes // Set the width and height input boxes
self.updateSize(); self.updateSize();
} };
// Get the current bitmap into an image object // Get the current bitmap into an image object
currImage.src = "data:" + tiddler.fields.type + ";base64," + tiddler.fields.text; currImage.src = "data:" + tiddler.fields.type + ";base64," + tiddler.fields.text;
}; };
@ -135,7 +135,7 @@ EditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {
ctx.fillStyle = "#fff"; ctx.fillStyle = "#fff";
ctx.fillRect(0,0,canvas.width,canvas.height); ctx.fillRect(0,0,canvas.width,canvas.height);
} }
} };
/* /*
** Update the input boxes with the actual size of the canvas ** Update the input boxes with the actual size of the canvas

View File

@ -78,7 +78,7 @@ FieldsWidget.prototype.execute = function() {
row = row.replace("$name$",fieldName); row = row.replace("$name$",fieldName);
row = row.replace("$value$",value); row = row.replace("$value$",value);
row = row.replace("$encoded_value$",$tw.utils.htmlEncode(value)); row = row.replace("$encoded_value$",$tw.utils.htmlEncode(value));
text.push(row) text.push(row);
} }
} }
} }

View File

@ -35,7 +35,7 @@ LinkWidget.prototype.render = function(parent,nextSibling) {
this.execute(); this.execute();
// Get the value of the tv-wikilinks configuration macro // Get the value of the tv-wikilinks configuration macro
var wikiLinksMacro = this.getVariable("tv-wikilinks"), var wikiLinksMacro = this.getVariable("tv-wikilinks"),
useWikiLinks = wikiLinksMacro ? !(wikiLinksMacro.trim() === "no") : true; useWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== "no") : true;
// Render the link if required // Render the link if required
if(useWikiLinks) { if(useWikiLinks) {
this.renderLink(parent,nextSibling); this.renderLink(parent,nextSibling);

View File

@ -44,7 +44,7 @@ ListWidget.prototype.render = function(parent,nextSibling) {
// Construct the storyview // Construct the storyview
var StoryView = this.storyViews[this.storyViewName]; var StoryView = this.storyViews[this.storyViewName];
if(StoryView && !this.document.isTiddlyWikiFakeDom) { if(StoryView && !this.document.isTiddlyWikiFakeDom) {
this.storyview = new StoryView(this) this.storyview = new StoryView(this);
} else { } else {
this.storyview = null; this.storyview = null;
} }

View File

@ -243,6 +243,8 @@ NavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {
// Remove the closed tiddler from the story // Remove the closed tiddler from the story
this.removeTitleFromStory(storyList,title); this.removeTitleFromStory(storyList,title);
this.saveStoryList(storyList); this.saveStoryList(storyList);
// Trigger an autosave
$tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"});
return false; return false;
}; };
@ -281,9 +283,10 @@ NavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {
Generate a title for the draft of a given tiddler Generate a title for the draft of a given tiddler
*/ */
NavigatorWidget.prototype.generateDraftTitle = function(title) { NavigatorWidget.prototype.generateDraftTitle = function(title) {
var c = 0; var c = 0,
draftTitle;
do { do {
var draftTitle = "Draft " + (c ? (c + 1) + " " : "") + "of '" + title + "'"; draftTitle = "Draft " + (c ? (c + 1) + " " : "") + "of '" + title + "'";
c++; c++;
} while(this.wiki.tiddlerExists(draftTitle)); } while(this.wiki.tiddlerExists(draftTitle));
return draftTitle; return draftTitle;
@ -331,6 +334,8 @@ NavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {
if(draftTitle !== this.storyTitle) { if(draftTitle !== this.storyTitle) {
this.saveStoryList(storyList); this.saveStoryList(storyList);
} }
// Trigger an autosave
$tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"});
} }
} }
} }
@ -478,6 +483,8 @@ NavigatorWidget.prototype.handlePerformImportEvent = function(event) {
})); }));
// Navigate to the $:/Import tiddler // Navigate to the $:/Import tiddler
this.addToHistory([IMPORT_TITLE]); this.addToHistory([IMPORT_TITLE]);
// Trigger an autosave
$tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"});
}; };
exports.navigator = NavigatorWidget; exports.navigator = NavigatorWidget;

View File

@ -41,7 +41,7 @@ RevealWidget.prototype.render = function(parent,nextSibling) {
$tw.utils.addClass(domNode,"tc-popup"); // Make sure that clicks don't dismiss popups within the revealed content $tw.utils.addClass(domNode,"tc-popup"); // Make sure that clicks don't dismiss popups within the revealed content
} }
if(!this.isOpen) { if(!this.isOpen) {
domNode.setAttribute("hidden","true") domNode.setAttribute("hidden","true");
} }
this.domNodes.push(domNode); this.domNodes.push(domNode);
}; };

View File

@ -44,7 +44,7 @@ TiddlerWidget.prototype.execute = function() {
this.setVariable("missingTiddlerClass",(this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? "tc-tiddler-exists" : "tc-tiddler-missing"); this.setVariable("missingTiddlerClass",(this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? "tc-tiddler-exists" : "tc-tiddler-missing");
this.setVariable("shadowTiddlerClass",this.wiki.isShadowTiddler(this.tiddlerTitle) ? "tc-tiddler-shadow" : ""); this.setVariable("shadowTiddlerClass",this.wiki.isShadowTiddler(this.tiddlerTitle) ? "tc-tiddler-shadow" : "");
this.setVariable("systemTiddlerClass",this.wiki.isSystemTiddler(this.tiddlerTitle) ? "tc-tiddler-system" : ""); this.setVariable("systemTiddlerClass",this.wiki.isSystemTiddler(this.tiddlerTitle) ? "tc-tiddler-system" : "");
this.setVariable("tiddlerTagClasses",this.getTagClasses()) this.setVariable("tiddlerTagClasses",this.getTagClasses());
// Construct the child widgets // Construct the child widgets
this.makeChildWidgets(); this.makeChildWidgets();
}; };

View File

@ -171,7 +171,7 @@ Widget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue)
else for(var i=0; i<actualParams.length; ++i) { else for(var i=0; i<actualParams.length; ++i) {
args.push(actualParams[i].value); args.push(actualParams[i].value);
} }
return macro.run.apply(this,args) return macro.run.apply(this,args);
} else { } else {
return defaultValue; return defaultValue;
} }
@ -263,9 +263,14 @@ Widget.prototype.assignAttributes = function(domNode,options) {
v = undefined; v = undefined;
} }
if(v !== undefined) { if(v !== undefined) {
var b = a.split(":");
// Setting certain attributes can cause a DOM error (eg xmlns on the svg element) // Setting certain attributes can cause a DOM error (eg xmlns on the svg element)
try { try {
if (b.length == 2 && b[0] == "xlink"){
domNode.setAttributeNS("http://www.w3.org/1999/xlink",b[1],v);
} else {
domNode.setAttributeNS(null,a,v); domNode.setAttributeNS(null,a,v);
}
} catch(e) { } catch(e) {
} }
} }
@ -289,7 +294,7 @@ Construct the widget object for a parse tree node
Widget.prototype.makeChildWidget = function(parseTreeNode) { Widget.prototype.makeChildWidget = function(parseTreeNode) {
var WidgetClass = this.widgetClasses[parseTreeNode.type]; var WidgetClass = this.widgetClasses[parseTreeNode.type];
if(!WidgetClass) { if(!WidgetClass) {
WidgetClass = this.widgetClasses["text"]; WidgetClass = this.widgetClasses.text;
parseTreeNode = {type: "text", text: "Undefined widget '" + parseTreeNode.type + "'"}; parseTreeNode = {type: "text", text: "Undefined widget '" + parseTreeNode.type + "'"};
} }
return new WidgetClass(parseTreeNode,{ return new WidgetClass(parseTreeNode,{
@ -357,8 +362,7 @@ Widget.prototype.addEventListener = function(type,handler) {
} else { // The handler is a function } else { // The handler is a function
this.eventListeners[type] = function(event) { this.eventListeners[type] = function(event) {
return handler.call(self,event); return handler.call(self,event);
} };
} }
}; };

View File

@ -152,9 +152,13 @@ exports.enqueueTiddlerEvent = function(title,isDeleted) {
} }
}; };
exports.getSizeOfTiddlerEventQueue = function() {
return $tw.utils.count(this.changedTiddlers);
};
exports.clearTiddlerEventQueue = function() { exports.clearTiddlerEventQueue = function() {
this.changedTiddlers = Object.create(null); this.changedTiddlers = Object.create(null);
this.changeCount = Object.create(null) this.changeCount = Object.create(null);
}; };
exports.getChangeCount = function(title) { exports.getChangeCount = function(title) {
@ -177,7 +181,7 @@ exports.generateNewTitle = function(baseTitle,options) {
title = baseTitle + title = baseTitle +
(options.prefix || " ") + (options.prefix || " ") +
(++c); (++c);
}; }
return title; return title;
}; };
@ -457,7 +461,7 @@ exports.getTagMap = function() {
for(var index=0; index<tagArray.length; index++) { for(var index=0; index<tagArray.length; index++) {
var tag = tagArray[index]; var tag = tagArray[index];
if($tw.utils.hop(tags,tag)) { if($tw.utils.hop(tags,tag)) {
tags[tag].push(title) tags[tag].push(title);
} else { } else {
tags[tag] = [title]; tags[tag] = [title];
} }
@ -596,7 +600,7 @@ exports.getTiddlerData = function(titleOrTiddler,defaultData) {
var tiddler = titleOrTiddler, var tiddler = titleOrTiddler,
data; data;
if(!(tiddler instanceof $tw.Tiddler)) { if(!(tiddler instanceof $tw.Tiddler)) {
tiddler = this.getTiddler(tiddler) tiddler = this.getTiddler(tiddler);
} }
if(tiddler && tiddler.fields.text) { if(tiddler && tiddler.fields.text) {
switch(tiddler.fields.type) { switch(tiddler.fields.type) {
@ -679,7 +683,7 @@ exports.getGlobalCache = function(cacheName,initializer) {
exports.clearGlobalCache = function() { exports.clearGlobalCache = function() {
this.globalCache = Object.create(null); this.globalCache = Object.create(null);
} };
// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it // Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it
exports.getCacheForTiddler = function(title,cacheName,initializer) { exports.getCacheForTiddler = function(title,cacheName,initializer) {
@ -687,18 +691,18 @@ exports.getCacheForTiddler = function(title,cacheName,initializer) {
// Temporarily disable caching so that tweakParseTreeNode() works // Temporarily disable caching so that tweakParseTreeNode() works
return initializer(); return initializer();
this.caches = this.caches || Object.create(null); // this.caches = this.caches || Object.create(null);
var caches = this.caches[title]; // var caches = this.caches[title];
if(caches && caches[cacheName]) { // if(caches && caches[cacheName]) {
return caches[cacheName]; // return caches[cacheName];
} else { // } else {
if(!caches) { // if(!caches) {
caches = Object.create(null); // caches = Object.create(null);
this.caches[title] = caches; // this.caches[title] = caches;
} // }
caches[cacheName] = initializer(); // caches[cacheName] = initializer();
return caches[cacheName]; // return caches[cacheName];
} // }
}; };
// Clear all caches associated with a particular tiddler // Clear all caches associated with a particular tiddler
@ -789,16 +793,16 @@ var tweakParser = function(parser) {
exports.parseText = function(type,text,options) { exports.parseText = function(type,text,options) {
var parser = this.old_parseText(type,text,options); var parser = this.old_parseText(type,text,options);
if(parser) { if(parser) {
tweakParser(parser) tweakParser(parser);
}; }
return parser; return parser;
}; };
exports.parseTiddler = function(title,options) { exports.parseTiddler = function(title,options) {
var parser = this.old_parseTiddler(title,options); var parser = this.old_parseTiddler(title,options);
if(parser) { if(parser) {
tweakParser(parser) tweakParser(parser);
}; }
return parser; return parser;
}; };
@ -957,7 +961,9 @@ Options available:
*/ */
exports.search = function(text,options) { exports.search = function(text,options) {
options = options || {}; options = options || {};
var self = this,t; var self = this,
t,
invert = !!options.invert;
// Convert the search string into a regexp for each term // Convert the search string into a regexp for each term
var terms, searchTermsRegExps, var terms, searchTermsRegExps,
flags = options.caseSensitive ? "" : "i"; flags = options.caseSensitive ? "" : "i";
@ -1007,7 +1013,7 @@ exports.search = function(text,options) {
var results = [], var results = [],
source = options.source || this.each; source = options.source || this.each;
source(function(tiddler,title) { source(function(tiddler,title) {
if(!!searchTiddler(title) === !options.invert) { if(searchTiddler(title) !== options.invert) {
results.push(title); results.push(title);
} }
}); });
@ -1056,7 +1062,7 @@ exports.readFiles = function(files,callback) {
callback(result); callback(result);
} }
}); });
}; }
return files.length; return files.length;
}; };

View File

@ -1,7 +1,7 @@
title: $:/core/ui/ViewTemplate/body title: $:/core/ui/ViewTemplate/body
tags: $:/tags/ViewTemplate tags: $:/tags/ViewTemplate
<div class="body"> <div class="tc-tiddler-body">
<$list filter="[all[current]!has[plugin-type]]"> <$list filter="[all[current]!has[plugin-type]]">

View File

@ -1,3 +1,3 @@
title: $:/config/SaverFilter title: $:/config/SaverFilter
[!is[shadow]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]] -[has[draft.of]] [all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state]] -[prefix[$:/temp]] -[has[draft.of]]

View File

@ -1,3 +1,3 @@
title: $:/config/SyncFilter title: $:/config/SyncFilter
[is[tiddler]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]] [all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]]

View File

@ -2,7 +2,7 @@ title: $:/core/macros/toc
tags: $:/tags/Macro tags: $:/tags/Macro
\define toc(tag,sort:"") \define toc(tag,sort:"")
<ol> <ol class="tc-toc">
<$list filter="[tag[$tag$]$sort$]"> <$list filter="[tag[$tag$]$sort$]">
<li> <li>
<$link> <$link>
@ -42,7 +42,7 @@ tags: $:/tags/Macro
\end \end
\define toc-expandable(tag,sort:"") \define toc-expandable(tag,sort:"")
<ol> <ol class="tc-toc toc-expandable">
<$list filter="[tag[$tag$]$sort$]"> <$list filter="[tag[$tag$]$sort$]">
<<toc-expandable-body tag:"$tag$" sort:"$sort$">> <<toc-expandable-body tag:"$tag$" sort:"$sort$">>
</$list> </$list>
@ -77,7 +77,7 @@ tags: $:/tags/Macro
\end \end
\define toc-selective-expandable(tag,sort:"") \define toc-selective-expandable(tag,sort:"")
<ol> <ol class="tc-toc toc-selective-expandable">
<$list filter="[tag[$tag$]$sort$]"> <$list filter="[tag[$tag$]$sort$]">
<<toc-selective-expandable-body tag:"$tag$" sort:"$sort$">> <<toc-selective-expandable-body tag:"$tag$" sort:"$sort$">>
</$list> </$list>

View File

@ -1,6 +1,6 @@
caption: 5.0.16-beta caption: 5.0.16-beta
created: 20140826131615798 created: 20140830131615798
modified: 20140826131615798 modified: 20140830131615798
tags: releasenote tags: releasenote
title: Release 5.0.16-beta title: Release 5.0.16-beta
type: text/vnd.tiddlywiki type: text/vnd.tiddlywiki
@ -9,16 +9,22 @@ type: text/vnd.tiddlywiki
!! Incompatible Changes !! Incompatible Changes
These changes have the potential to break existing tiddlers. 5.0.16-beta brings more incompatible changes than any previous release. These changes are likely to break almost all plugins written for previous releases of TiddlyWiki 5, and will break many customisations.
* [[Changed|https://github.com/Jermolene/TiddlyWiki5/issues/764]] all CSS class prefixes from `tw-` to `tc-` (eg `tw-tiddler-frame` has become `tc-tiddler-frame`; missing prefixes have also been added, so `btn-invisible` has become `tc-btn-invisible`)
* [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/2f69ea362cd673f59b9fadbe11f1f95549a59813]] all message prefixes from `tw-` to `tm-` (eg `tw-close-tiddler` has become `tm-close-tiddler`)
* [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/89fd5379dd78887fc21746d792072bf5a25f0c56]] all variable prefixes from `tw-` to `tv-` (eg `tw-config-toolbar-icons` has become `tv-config-toolbar-icons`)
* [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/112a9a95d95e9f62f110c97a4faaf537c5c100b1]] prefix/removeprefix filter operators to be case-sensitive * [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/112a9a95d95e9f62f110c97a4faaf537c5c100b1]] prefix/removeprefix filter operators to be case-sensitive
!! Usability Improvements !! Usability Improvements
* [[Amended|https://github.com/Jermolene/TiddlyWiki5/commit/e47852cb141b384ad2a9097eca795545cb5b2494]] behaviour of the [[tw-browser-refresh|WidgetMessage: tw-browser-refresh]] message so that it no longer clears the location hash * [[Amended|https://github.com/Jermolene/TiddlyWiki5/commit/e47852cb141b384ad2a9097eca795545cb5b2494]] behaviour of the [[tw-browser-refresh|WidgetMessage: tw-browser-refresh]] message so that it no longer clears the location hash
* [[Hide|https://github.com/Jermolene/TiddlyWiki5/commit/88c9c0c3ee115917b8c1a9126452bb0574061857]] toolbar buttons from static renderings
!! Hackability Improvements !! Hackability Improvements
* [[Extend|https://github.com/Jermolene/TiddlyWiki5/commit/48312272adb17610db96d50758e6af947cab7b1d]] the [FilterOperator: all]] to be able to select all the source tiddlers
* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/43aeb47fc34f1ba424030c4f78ee907fe7b1d5d8]] problem with single line macro definitions incorrectly including whitespace in the value. (For example, `\define mymacro() yes` would set the macro value to " yes", with a leading space)
* [[Extend|https://github.com/Jermolene/TiddlyWiki5/commit/d2a5a12f2d6b6ccc36dd22a70ac2def08d1d3722]] TableOfContentsMacro to use the caption field if present * [[Extend|https://github.com/Jermolene/TiddlyWiki5/commit/d2a5a12f2d6b6ccc36dd22a70ac2def08d1d3722]] TableOfContentsMacro to use the caption field if present
* [[Configurability|https://github.com/Jermolene/TiddlyWiki5/commit/b437f1b450f5f2a3104a9086f7c674299b53b9bc]] for the default tab shown in the tiddler info panel (see [[Configuring the default TiddlerInfo tab]]) * [[Configurability|https://github.com/Jermolene/TiddlyWiki5/commit/b437f1b450f5f2a3104a9086f7c674299b53b9bc]] for the default tab shown in the tiddler info panel (see [[Configuring the default TiddlerInfo tab]])
* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/dcf4e93a3283e3e93cc14e50366f9b0252870835]] [[suffix|FilterOperator: suffix]] and [[removesuffix|FilterOperator: removesuffix]] filter operators * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/dcf4e93a3283e3e93cc14e50366f9b0252870835]] [[suffix|FilterOperator: suffix]] and [[removesuffix|FilterOperator: removesuffix]] filter operators
@ -32,4 +38,5 @@ These changes have the potential to break existing tiddlers.
[[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki:
* [[@BramChen|https://github.com/BramChen]] * [[@BramChen|https://github.com/BramChen]]
* [[@pmario|https://github.com/pmario]]
* [[@xcazin|https://github.com/xcazin]] * [[@xcazin|https://github.com/xcazin]]

View File

@ -4,6 +4,12 @@ tags: dev howto
title: Working with the TiddlyWiki5 repository title: Working with the TiddlyWiki5 repository
type: text/vnd.tiddlywiki type: text/vnd.tiddlywiki
! Introduction
Mario Pietsch has created a short video tutorial on working with the TiddlyWiki5 ~GitHub repository.
<iframe width="560" height="315" src="http://www.youtube.com/embed/6ElUruH92tc" frameborder="0" allowfullscreen></iframe>
! Setting Up ! Setting Up
If you plan on working with the TiddlyWiki5 source code then follow these steps: If you plan on working with the TiddlyWiki5 source code then follow these steps:

View File

@ -17,4 +17,5 @@ For example:
|`[all[current]]` |Selects the current tiddler | |`[all[current]]` |Selects the current tiddler |
|`[all[missing]]` |Selects all MissingTiddlers | |`[all[missing]]` |Selects all MissingTiddlers |
|`[all[orphans]]` |Selects all OrphanTiddlers | |`[all[orphans]]` |Selects all OrphanTiddlers |
|`[all[]]` |Selects all the source tiddlers available to the filter |

View File

@ -1,7 +1,7 @@
title: Improving TiddlyWiki Documentation title: Improving TiddlyWiki Documentation
tags: howto tags: howto
created: 20140820151051019 created: 20140820151051019
modified: 20140820151051019 modified: 20140830151051019
Anyone can submit improvements to the TiddlyWiki documentation that appears on http://tiddlywiki.com. Anyone can submit improvements to the TiddlyWiki documentation that appears on http://tiddlywiki.com.
@ -9,6 +9,7 @@ Anyone can submit improvements to the TiddlyWiki documentation that appears on h
# On http://tiddlywiki.com, click "edit" on the tiddler you want to improve # On http://tiddlywiki.com, click "edit" on the tiddler you want to improve
# You should see a pink banner with the text: //Can you help us improve this documentation? Find out how to edit this tiddler on ~GitHub// # You should see a pink banner with the text: //Can you help us improve this documentation? Find out how to edit this tiddler on ~GitHub//
# Click on the external link ...''this tiddler on ~GitHub'' # Click on the external link ...''this tiddler on ~GitHub''
## You will be prompted that "you need to fork this repository to propose changes". A "fork" is your own copy of the repository that incorporates the changes you are proposing
# A new browser tab should open ready to edit the tiddler on github.com # A new browser tab should open ready to edit the tiddler on github.com
# Below the edit box for the tiddler text you should see a box labelled ''Propose file change'' # Below the edit box for the tiddler text you should see a box labelled ''Propose file change''
# Enter a brief title to explain the change (eg, "Clarify attribute syntax instability") # Enter a brief title to explain the change (eg, "Clarify attribute syntax instability")
@ -17,3 +18,7 @@ Anyone can submit improvements to the TiddlyWiki documentation that appears on h
# On the following screen, click the green button labelled ''Create pull request'' # On the following screen, click the green button labelled ''Create pull request''
[[Jermolene|https://github.com/Jermolene]] or one of the other core developers will then have the opportunity to merge your pull request so that it is incorporated into the next build of http://tiddlywiki.com. [[Jermolene|https://github.com/Jermolene]] or one of the other core developers will then have the opportunity to merge your pull request so that it is incorporated into the next build of http://tiddlywiki.com.
Mario Pietsch has created this short video tutorial:
<iframe width="560" height="315" src="http://www.youtube.com/embed/L4zTkMYcri8" frameborder="0" allowfullscreen></iframe>

View File

@ -22,4 +22,4 @@ The aim is to curate a series of videos to guide people through getting up and r
This video of the second [[OXTWIG]] meeting starts with a tutorial overview demonstrating how to use ~TiddlyWiki in different scenarios: This video of the second [[OXTWIG]] meeting starts with a tutorial overview demonstrating how to use ~TiddlyWiki in different scenarios:
<iframe width="560" height="315" src="//www.youtube.com/embed/WOK_nVBf_6U" frameborder="0" allowfullscreen></iframe> <iframe width="560" height="315" src="http://www.youtube.com/embed/WOK_nVBf_6U" frameborder="0" allowfullscreen></iframe>

View File

@ -12,6 +12,8 @@ There are several variants of the macro:
* `<<toc-expandable>>` produces an expandable tree of links * `<<toc-expandable>>` produces an expandable tree of links
* `<<toc-selective-expandable>>` produces an expandable tree of links where the expand/contract buttons are only shown for entries that possess child nodes * `<<toc-selective-expandable>>` produces an expandable tree of links where the expand/contract buttons are only shown for entries that possess child nodes
The macros all generate HTML ordered lists. The `<ol>` elements are given the class `tc-toc`, with the expandable variant also having the class `tc-toc-expandable` and the selective expandable variant also having the class `tc-toc-selective-expandable`.
! Parameters ! Parameters
|!Position |!Name |!Description |!Default | |!Position |!Name |!Description |!Default |

View File

@ -33,6 +33,7 @@ Plugins are stored as tiddlers with the following fields:
|plugin-type |Can be ''plugin'' (default) or ''theme'' | |plugin-type |Can be ''plugin'' (default) or ''theme'' |
|text |JSON encoding of the list of tiddlers comprising the plugin | |text |JSON encoding of the list of tiddlers comprising the plugin |
|list |Names of exposed plugin information tiddlers (see below) | |list |Names of exposed plugin information tiddlers (see below) |
|name |Name of the theme (only for themes) |
|dependents |List of dependent plugins (currently only implemented for themes) | |dependents |List of dependent plugins (currently only implemented for themes) |
! Plugin folders ! Plugin folders

View File

@ -0,0 +1,11 @@
created: 20140830112325641
modified: 20140830115149288
tags: message
title: WidgetMessage: tm-auto-save-wiki
type: text/vnd.tiddlywiki
The autosave wiki message causes the current saver module to perform a background save if it is required.
The autosave wiki message should be generated whenever changes are made to the store. For example, the navigator widget generates the autosave wiki message as part of its handling of the [[WidgetMessage: tm-save-tiddler]], [[WidgetMessage: tm-delete-tiddler]] and [[WidgetMessage: tm-perform-import]].
The autosave wiki message is handled by the TiddlyWiki core SyncMechanism which invokes the current [[SaverModule|SaverModules]]. Not all SaverModules can handle autosaving.

View File

@ -13,7 +13,7 @@ Initialise $:/info/browser tiddlers
"use strict"; "use strict";
exports.getInfoTiddlerFields = function() { exports.getInfoTiddlerFields = function() {
var mapBoolean = function(value) {return value ? "yes" : "no"}, var mapBoolean = function(value) {return value ? "yes" : "no";},
infoTiddlerFields = []; infoTiddlerFields = [];
// Basics // Basics
if($tw.browser) { if($tw.browser) {

View File

@ -113,7 +113,7 @@ CecilyStoryView.prototype.lookupTiddlerInMap = function(title,domNode) {
if(tiddler) { if(tiddler) {
var draftOf = tiddler.fields["draft.of"]; var draftOf = tiddler.fields["draft.of"];
if(draftOf && this.map.positions[draftOf]) { if(draftOf && this.map.positions[draftOf]) {
return this.map.positions[draftOf] return this.map.positions[draftOf];
} }
} }
// Try looking the target tiddler up in the map // Try looking the target tiddler up in the map

View File

@ -25,14 +25,14 @@ Config options "$:/config/CodeMirror" e.g. to allow vim key bindings
/*global $tw: false */ /*global $tw: false */
"use strict"; "use strict";
var CODEMIRROR_OPTIONS = "$:/config/CodeMirror" var CODEMIRROR_OPTIONS = "$:/config/CodeMirror";
// Install CodeMirror // Install CodeMirror
if($tw.browser && !window.CodeMirror) { if($tw.browser && !window.CodeMirror) {
window.CodeMirror = require("$:/plugins/tiddlywiki/codemirror/lib/codemirror.js"); window.CodeMirror = require("$:/plugins/tiddlywiki/codemirror/lib/codemirror.js");
// Install required CodeMirror plugins // Install required CodeMirror plugins
var configOptions = $tw.wiki.getTiddlerData(CODEMIRROR_OPTIONS,{}), var configOptions = $tw.wiki.getTiddlerData(CODEMIRROR_OPTIONS,{}),
req = configOptions["require"]; req = configOptions.require;
if(req) { if(req) {
if($tw.utils.isArray(req)) { if($tw.utils.isArray(req)) {
for(var index=0; index<req.length; index++) { for(var index=0; index<req.length; index++) {

View File

@ -57,7 +57,7 @@ BarWidget.prototype.createChart = function(parent,nextSibling) {
n = 4; // number of layers n = 4; // number of layers
m = 58; // number of samples per layer m = 58; // number of samples per layer
stack = d3.layout.stack(); stack = d3.layout.stack();
layers = stack(d3.range(n).map(function() { return bumpLayer(m, .1); })); layers = stack(d3.range(n).map(function() { return bumpLayer(m, 0.1); }));
} }
// Calculate the maximum data values // Calculate the maximum data values
var yGroupMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y; }); }), var yGroupMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y; }); }),
@ -69,7 +69,7 @@ BarWidget.prototype.createChart = function(parent,nextSibling) {
// x-scale // x-scale
var x = d3.scale.ordinal() var x = d3.scale.ordinal()
.domain(d3.range(m)) .domain(d3.range(m))
.rangeRoundBands([0, width], .08); .rangeRoundBands([0, width], 0.08);
// y-scale // y-scale
var y = d3.scale.linear() var y = d3.scale.linear()
.domain([0, yStackMax]) .domain([0, yStackMax])
@ -157,9 +157,9 @@ BarWidget.prototype.createChart = function(parent,nextSibling) {
// Inspired by Lee Byron's test data generator. // Inspired by Lee Byron's test data generator.
function bumpLayer(n, o) { function bumpLayer(n, o) {
function bump(a) { function bump(a) {
var x = 1 / (.1 + Math.random()), var x = 1 / (0.1 + Math.random()),
y = 2 * Math.random() - .5, y = 2 * Math.random() - 0.5,
z = 10 / (.1 + Math.random()); z = 10 / (0.1 + Math.random());
for (var i = 0; i < n; i++) { for (var i = 0; i < n; i++) {
var w = (i / n - y) * z; var w = (i / n - y) * z;
a[i] += x * Math.exp(-w * w); a[i] += x * Math.exp(-w * w);

View File

@ -24,20 +24,19 @@ function FileSystemAdaptor(options) {
this.logger = new $tw.utils.Logger("FileSystem"); this.logger = new $tw.utils.Logger("FileSystem");
this.setwatcher = function(filename, title) { this.setwatcher = function(filename, title) {
return undefined; return undefined;
return this.watchers[filename] = this.watchers[filename] || //return this.watchers[filename] = this.watchers[filename] ||
fs.watch(filename, {persistent: false}, function(e) { // fs.watch(filename, {persistent: false}, function(e) {
self.logger.log("Error:",e,filename); // self.logger.log("Error:",e,filename);
if(e === "change") { // if(e === "change") {
var tiddlers = $tw.loadTiddlersFromFile(filename).tiddlers; // var tiddlers = $tw.loadTiddlersFromFile(filename).tiddlers;
for(var t in tiddlers) { // for(var t in tiddlers) {
if(tiddlers[t].title) { // if(tiddlers[t].title) {
self.wiki.addTiddler(tiddlers[t]); // self.wiki.addTiddler(tiddlers[t]);
} // }
} // }
} // }
}); // });
} };
for(var f in $tw.boot.files) { for(var f in $tw.boot.files) {
var fileInfo = $tw.boot.files[f]; var fileInfo = $tw.boot.files[f];
this.setwatcher(fileInfo.filepath, f); this.setwatcher(fileInfo.filepath, f);
@ -108,7 +107,7 @@ Given a tiddler title and an array of existing filenames, generate a new legal f
*/ */
FileSystemAdaptor.prototype.generateTiddlerFilename = function(title,extension,existingFilenames) { FileSystemAdaptor.prototype.generateTiddlerFilename = function(title,extension,existingFilenames) {
// First remove any of the characters that are illegal in Windows filenames // First remove any of the characters that are illegal in Windows filenames
var baseFilename = title.replace(/\<|\>|\:|\"|\/|\\|\||\?|\*|\^/g,"_"); var baseFilename = title.replace(/<|>|\:|\"|\/|\\|\||\?|\*|\^/g,"_");
// Truncate the filename if it is too long // Truncate the filename if it is too long
if(baseFilename.length > 200) { if(baseFilename.length > 200) {
baseFilename = baseFilename.substr(0,200) + extension; baseFilename = baseFilename.substr(0,200) + extension;

View File

@ -48,7 +48,7 @@ Static method that returns true if this saver is capable of working
*/ */
exports.canSave = function(wiki) { exports.canSave = function(wiki) {
// Check if we're running under node-webkit // Check if we're running under node-webkit
return (typeof process == "object") return (typeof process == "object");
}; };
/* /*

View File

@ -37,7 +37,7 @@ TiddlyWebAdaptor.prototype.getHost = function() {
TiddlyWebAdaptor.prototype.getTiddlerInfo = function(tiddler) { TiddlyWebAdaptor.prototype.getTiddlerInfo = function(tiddler) {
return { return {
bag: tiddler.fields["bag"] bag: tiddler.fields.bag
}; };
}; };

File diff suppressed because one or more lines are too long

View File

@ -129,8 +129,8 @@ table tfoot tr td {
max-width: 100%; max-width: 100%;
} }
.tc-tiddler-frame embed, .tc-tiddler-body > embed,
.tc-tiddler-frame iframe { .tc-tiddler-body > iframe {
width: 100%; width: 100%;
height: 600px; height: 600px;
} }