mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-24 02:27:19 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
61fca88df5
7
.jshintignore
Normal file
7
.jshintignore
Normal 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/
|
@ -26,7 +26,7 @@ Command.prototype.execute = function() {
|
||||
// Get the build targets defined in the wiki
|
||||
var buildTargets = $tw.boot.wikiInfo.build;
|
||||
if(!buildTargets) {
|
||||
return "No build targets defined"
|
||||
return "No build targets defined";
|
||||
}
|
||||
// Loop through each of the specified targets
|
||||
var targets;
|
||||
|
@ -78,7 +78,7 @@ SimpleServer.prototype.findMatchingRoute = function(request,state) {
|
||||
};
|
||||
|
||||
SimpleServer.prototype.checkCredentials = function(request,incomingUsername,incomingPassword) {
|
||||
var header = request.headers["authorization"] || "",
|
||||
var header = request.headers.authorization || "",
|
||||
token = header.split(/\s+/).pop() || "",
|
||||
auth = $tw.utils.base64Decode(token),
|
||||
parts = auth.split(/:/),
|
||||
@ -89,7 +89,7 @@ SimpleServer.prototype.checkCredentials = function(request,incomingUsername,inco
|
||||
} else {
|
||||
return "DENIED";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
SimpleServer.prototype.listen = function(port,host) {
|
||||
var self = this;
|
||||
@ -167,8 +167,8 @@ var Command = function(params,commander,callback) {
|
||||
delete fields.fields;
|
||||
}
|
||||
// Remove any revision field
|
||||
if(fields["revision"]) {
|
||||
delete fields["revision"];
|
||||
if(fields.revision) {
|
||||
delete fields.revision;
|
||||
}
|
||||
state.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title}));
|
||||
var changeCount = state.wiki.getChangeCount(title).toString();
|
||||
@ -237,7 +237,7 @@ var Command = function(params,commander,callback) {
|
||||
tiddlerFields[name] = tiddler.getFieldString(name);
|
||||
}
|
||||
});
|
||||
tiddlerFields["revision"] = state.wiki.getChangeCount(title);
|
||||
tiddlerFields.revision = state.wiki.getChangeCount(title);
|
||||
tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki";
|
||||
tiddlers.push(tiddlerFields);
|
||||
});
|
||||
@ -265,7 +265,7 @@ var Command = function(params,commander,callback) {
|
||||
tiddlerFields.fields[name] = value;
|
||||
}
|
||||
});
|
||||
tiddlerFields["revision"] = state.wiki.getChangeCount(title);
|
||||
tiddlerFields.revision = state.wiki.getChangeCount(title);
|
||||
tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki";
|
||||
response.writeHead(200, {"Content-Type": "application/json"});
|
||||
response.end(JSON.stringify(tiddlerFields),"utf8");
|
||||
|
@ -109,7 +109,7 @@ exports["text/html"] = function(text,fields) {
|
||||
if(sysMatch) {
|
||||
results.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));
|
||||
}
|
||||
return results
|
||||
return results;
|
||||
} else {
|
||||
// Check whether we've got an encrypted file
|
||||
var encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);
|
||||
|
@ -34,7 +34,9 @@ exports.all = function(source,operator,options) {
|
||||
var results = [],
|
||||
subops = operator.operand.split("+");
|
||||
// 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;
|
||||
} else if(subops.length === 1 && subops[0] === "shadows") {
|
||||
return options.wiki.eachShadow;
|
||||
|
@ -20,7 +20,7 @@ function getIsFilterOperators() {
|
||||
$tw.modules.applyMethods("isfilteroperator",isFilterOperators);
|
||||
}
|
||||
return isFilterOperators;
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
Export our filter function
|
||||
|
@ -18,12 +18,12 @@ Export our filter function
|
||||
exports.plugintiddlers = function(source,operator,options) {
|
||||
var results = [];
|
||||
source(function(tiddler,title) {
|
||||
var pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerData(title,{tiddlers:[]});
|
||||
if(pluginInfo) {
|
||||
$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {
|
||||
results.push(title);
|
||||
});
|
||||
}
|
||||
var pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerData(title,{tiddlers:[]});
|
||||
if(pluginInfo) {
|
||||
$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {
|
||||
results.push(title);
|
||||
});
|
||||
}
|
||||
});
|
||||
results.sort();
|
||||
return results;
|
||||
|
@ -19,9 +19,9 @@ exports.shadowsource = function(source,operator,options) {
|
||||
var results = [];
|
||||
source(function(tiddler,title) {
|
||||
var source = options.wiki.getShadowSource(title);
|
||||
if(source) {
|
||||
if(source) {
|
||||
$tw.utils.pushTop(results,source);
|
||||
}
|
||||
}
|
||||
});
|
||||
results.sort();
|
||||
return results;
|
||||
|
@ -45,6 +45,6 @@ var prepare_results = function (source) {
|
||||
results.push(title);
|
||||
});
|
||||
return results;
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
||||
|
@ -13,7 +13,7 @@ Initialise basic platform $:/info/ tiddlers
|
||||
"use strict";
|
||||
|
||||
exports.getInfoTiddlerFields = function() {
|
||||
var mapBoolean = function(value) {return value ? "yes" : "no"},
|
||||
var mapBoolean = function(value) {return value ? "yes" : "no";},
|
||||
infoTiddlerFields = [];
|
||||
// Basics
|
||||
infoTiddlerFields.push({title: "$:/info/browser", text: mapBoolean(!!$tw.browser)});
|
||||
|
@ -23,8 +23,8 @@ exports.types = {block: true};
|
||||
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
this.matchRegExp = /\<!--/mg;
|
||||
this.endMatchRegExp = /--\>/mg;
|
||||
this.matchRegExp = /<!--/mg;
|
||||
this.endMatchRegExp = /-->/mg;
|
||||
};
|
||||
|
||||
exports.findNextMatch = function(startPos) {
|
||||
|
@ -23,8 +23,8 @@ exports.types = {inline: true};
|
||||
|
||||
exports.init = function(parser) {
|
||||
this.parser = parser;
|
||||
this.matchRegExp = /\<!--/mg;
|
||||
this.endMatchRegExp = /--\>/mg;
|
||||
this.matchRegExp = /<!--/mg;
|
||||
this.endMatchRegExp = /-->/mg;
|
||||
};
|
||||
|
||||
exports.findNextMatch = function(startPos) {
|
||||
|
@ -56,7 +56,7 @@ exports.parse = function() {
|
||||
node.attributes.style = {type: "string", value: style};
|
||||
}
|
||||
if(classes) {
|
||||
node.attributes["itemClass"] = {type: "string", value: classes.split(".").join(" ")};
|
||||
node.attributes.itemClass = {type: "string", value: classes.split(".").join(" ")};
|
||||
}
|
||||
return [node];
|
||||
};
|
||||
|
@ -55,7 +55,7 @@ exports.parse = function() {
|
||||
node.attributes.style = {type: "string", value: style};
|
||||
}
|
||||
if(classes) {
|
||||
node.attributes["itemClass"] = {type: "string", value: classes.split(".").join(" ")};
|
||||
node.attributes.itemClass = {type: "string", value: classes.split(".").join(" ")};
|
||||
}
|
||||
return [node];
|
||||
};
|
||||
|
@ -34,7 +34,8 @@ exports.init = function(parser) {
|
||||
|
||||
exports.parse = function() {
|
||||
var reEnd = /(""")|(\r?\n)/mg,
|
||||
tree = [];
|
||||
tree = [],
|
||||
match;
|
||||
// Move past the match
|
||||
this.parser.pos = this.matchRegExp.lastIndex;
|
||||
do {
|
||||
@ -42,7 +43,7 @@ exports.parse = function() {
|
||||
tree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));
|
||||
// Redo the terminator match
|
||||
reEnd.lastIndex = this.parser.pos;
|
||||
var match = reEnd.exec(this.parser.source);
|
||||
match = reEnd.exec(this.parser.source);
|
||||
if(match) {
|
||||
this.parser.pos = reEnd.lastIndex;
|
||||
// Add a line break if the terminator was a line break
|
||||
|
@ -55,7 +55,6 @@ exports.parse = function() {
|
||||
classes.push.apply(classes, this.parser.parseClasses());
|
||||
this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});
|
||||
var cite = this.parser.parseInlineRun(/(\r?\n)/mg);
|
||||
|
||||
// before handling the cite, parse the body of the quote
|
||||
var tree= this.parser.parseBlocks(reEndString);
|
||||
// If we got a cite, put it before the text
|
||||
@ -66,10 +65,9 @@ exports.parse = function() {
|
||||
children: cite
|
||||
});
|
||||
}
|
||||
|
||||
// Parse any optional cite
|
||||
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(cite.length > 0) {
|
||||
tree.push({
|
||||
@ -78,7 +76,6 @@ exports.parse = function() {
|
||||
children: cite
|
||||
});
|
||||
}
|
||||
|
||||
// Return the blockquote element
|
||||
return [{
|
||||
type: "element",
|
||||
|
@ -27,7 +27,8 @@ var processRow = function(prevColumns) {
|
||||
tree = [],
|
||||
col = 0,
|
||||
colSpanCount = 1,
|
||||
prevCell;
|
||||
prevCell,
|
||||
vAlign;
|
||||
// Match a single cell
|
||||
cellRegExp.lastIndex = this.parser.pos;
|
||||
var cellMatch = cellRegExp.exec(this.parser.source);
|
||||
@ -38,7 +39,7 @@ var processRow = function(prevColumns) {
|
||||
if(last) {
|
||||
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);
|
||||
if(colSpanCount > 1) {
|
||||
$tw.utils.addAttributeToParseTreeNode(last.element,"colspan",colSpanCount);
|
||||
@ -74,8 +75,8 @@ var processRow = function(prevColumns) {
|
||||
// For ordinary cells, step beyond the opening `|`
|
||||
this.parser.pos++;
|
||||
// Look for a space at the start of the cell
|
||||
var spaceLeft = false,
|
||||
vAlign = null;
|
||||
var spaceLeft = false;
|
||||
vAlign = null;
|
||||
if(this.parser.source.substr(this.parser.pos).search(/^\^([^\^]|\^\^)/) === 0) {
|
||||
vAlign = "top";
|
||||
} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {
|
||||
|
@ -41,19 +41,20 @@ exports.parse = function() {
|
||||
isBlock: true
|
||||
};
|
||||
// Prepare the tiddler widget
|
||||
var tr, targetTitle, targetField, targetIndex, tiddlerNode;
|
||||
if(textRef) {
|
||||
var tr = $tw.utils.parseTextReference(textRef),
|
||||
targetTitle = tr.title,
|
||||
targetField = tr.field,
|
||||
targetIndex = tr.index,
|
||||
tiddlerNode = {
|
||||
type: "tiddler",
|
||||
attributes: {
|
||||
tiddler: {type: "string", value: targetTitle}
|
||||
},
|
||||
isBlock: true,
|
||||
children: [transcludeNode]
|
||||
};
|
||||
tr = $tw.utils.parseTextReference(textRef);
|
||||
targetTitle = tr.title;
|
||||
targetField = tr.field;
|
||||
targetIndex = tr.index;
|
||||
tiddlerNode = {
|
||||
type: "tiddler",
|
||||
attributes: {
|
||||
tiddler: {type: "string", value: targetTitle}
|
||||
},
|
||||
isBlock: true,
|
||||
children: [transcludeNode]
|
||||
};
|
||||
}
|
||||
if(template) {
|
||||
transcludeNode.attributes.tiddler = {type: "string", value: template};
|
||||
|
@ -38,18 +38,19 @@ exports.parse = function() {
|
||||
attributes: {}
|
||||
};
|
||||
// Prepare the tiddler widget
|
||||
var tr, targetTitle, targetField, targetIndex, tiddlerNode;
|
||||
if(textRef) {
|
||||
var tr = $tw.utils.parseTextReference(textRef),
|
||||
targetTitle = tr.title,
|
||||
targetField = tr.field,
|
||||
targetIndex = tr.index,
|
||||
tiddlerNode = {
|
||||
type: "tiddler",
|
||||
attributes: {
|
||||
tiddler: {type: "string", value: targetTitle}
|
||||
},
|
||||
children: [transcludeNode]
|
||||
};
|
||||
tr = $tw.utils.parseTextReference(textRef);
|
||||
targetTitle = tr.title;
|
||||
targetField = tr.field;
|
||||
targetIndex = tr.index;
|
||||
tiddlerNode = {
|
||||
type: "tiddler",
|
||||
attributes: {
|
||||
tiddler: {type: "string", value: targetTitle}
|
||||
},
|
||||
children: [transcludeNode]
|
||||
};
|
||||
}
|
||||
if(template) {
|
||||
transcludeNode.attributes.tiddler = {type: "string", value: template};
|
||||
|
@ -68,7 +68,7 @@ exports.parse = function() {
|
||||
var widgetNode = this.parser.wiki.makeWidget(parser),
|
||||
container = $tw.fakeDocument.createElement("div");
|
||||
widgetNode.render(container,null);
|
||||
var text = renderType === "text/html" ? container.innerHTML : container.textContent;
|
||||
text = renderType === "text/html" ? container.innerHTML : container.textContent;
|
||||
return [{
|
||||
type: "element",
|
||||
tag: "pre",
|
||||
|
@ -27,7 +27,7 @@ var textPrimitives = {
|
||||
upperLetter: "[A-Z\u00c0-\u00d6\u00d8-\u00de\u0150\u0170]",
|
||||
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]",
|
||||
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 = "~";
|
||||
|
@ -100,7 +100,7 @@ Get the next match out of an array of parse rule instances
|
||||
*/
|
||||
WikiParser.prototype.findNextMatch = function(rules,startPos) {
|
||||
// Find the best matching rule by finding the closest match position
|
||||
var matchingRule = undefined,
|
||||
var matchingRule,
|
||||
matchingRulePos = this.sourceLength;
|
||||
// Step through each rule
|
||||
for(var t=0; t<rules.length; t++) {
|
||||
@ -308,7 +308,7 @@ WikiParser.prototype.parseClasses = function() {
|
||||
while(match && match.index === this.pos) {
|
||||
this.pos = match.index + match[0].length;
|
||||
classNames.push(match[1]);
|
||||
var match = classRegExp.exec(this.source);
|
||||
match = classRegExp.exec(this.source);
|
||||
}
|
||||
return classNames;
|
||||
};
|
||||
@ -345,7 +345,7 @@ WikiParser.prototype.amendRules = function(type,names) {
|
||||
processRuleArray(this.pragmaRules);
|
||||
processRuleArray(this.blockRules);
|
||||
processRuleArray(this.inlineRules);
|
||||
}
|
||||
};
|
||||
|
||||
exports["text/vnd.tiddlywiki"] = WikiParser;
|
||||
|
||||
|
@ -18,64 +18,86 @@ wiki: wiki to be synced
|
||||
dirtyTracking: true if dirty tracking should be performed
|
||||
*/
|
||||
function SaverHandler(options) {
|
||||
var self = this;
|
||||
this.wiki = options.wiki;
|
||||
this.dirtyTracking = options.dirtyTracking;
|
||||
// Make a logger
|
||||
this.logger = new $tw.utils.Logger("saver-handler");
|
||||
// Initialise our savers
|
||||
if($tw.browser) {
|
||||
this.initSavers();
|
||||
}
|
||||
// Only do dirty tracking if required
|
||||
if($tw.browser && this.dirtyTracking) {
|
||||
// Compile the dirty tiddler filter
|
||||
this.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));
|
||||
// Count of tiddlers that have been changed but not yet saved
|
||||
this.numTasksInQueue = 0;
|
||||
// Listen out for changes to tiddlers
|
||||
this.wiki.addEventListener("change",function(changes) {
|
||||
var filteredChanges = self.filterFn.call(self.wiki,function(callback) {
|
||||
$tw.utils.each(changes,function(change,title) {
|
||||
var tiddler = self.wiki.getTiddler(title);
|
||||
callback(tiddler,title);
|
||||
});
|
||||
});
|
||||
self.numTasksInQueue += filteredChanges.length;
|
||||
self.updateDirtyStatus();
|
||||
if(self.numTasksInQueue > 0) {
|
||||
self.saveWiki({method: "autosave"});
|
||||
}
|
||||
});
|
||||
// Browser event handlers
|
||||
if($tw.browser) {
|
||||
// Set up our beforeunload handler
|
||||
window.addEventListener("beforeunload",function(event) {
|
||||
var confirmationMessage = undefined;
|
||||
if(self.isDirty()) {
|
||||
confirmationMessage = $tw.language.getString("UnsavedChangesWarning");
|
||||
event.returnValue = confirmationMessage; // Gecko
|
||||
}
|
||||
return confirmationMessage;
|
||||
});
|
||||
}
|
||||
}
|
||||
// Install the save action handlers
|
||||
if($tw.browser) {
|
||||
$tw.rootWidget.addEventListener("tm-save-wiki",function(event) {
|
||||
self.saveWiki({
|
||||
template: event.param,
|
||||
downloadType: "text/plain"
|
||||
});
|
||||
});
|
||||
$tw.rootWidget.addEventListener("tm-download-file",function(event) {
|
||||
self.saveWiki({
|
||||
method: "download",
|
||||
template: event.param,
|
||||
downloadType: "text/plain"
|
||||
});
|
||||
});
|
||||
}
|
||||
var self = this;
|
||||
this.wiki = options.wiki;
|
||||
this.dirtyTracking = options.dirtyTracking;
|
||||
this.pendingAutoSave = false;
|
||||
// Make a logger
|
||||
this.logger = new $tw.utils.Logger("saver-handler");
|
||||
// Initialise our savers
|
||||
if($tw.browser) {
|
||||
this.initSavers();
|
||||
}
|
||||
// Only do dirty tracking if required
|
||||
if($tw.browser && this.dirtyTracking) {
|
||||
// Compile the dirty tiddler filter
|
||||
this.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));
|
||||
// Count of tiddlers that have been changed but not yet saved
|
||||
this.numTasksInQueue = 0;
|
||||
// Listen out for changes to tiddlers
|
||||
this.wiki.addEventListener("change",function(changes) {
|
||||
var filteredChanges = self.filterFn.call(self.wiki,function(callback) {
|
||||
$tw.utils.each(changes,function(change,title) {
|
||||
var tiddler = self.wiki.getTiddler(title);
|
||||
callback(tiddler,title);
|
||||
});
|
||||
});
|
||||
self.numTasksInQueue += filteredChanges.length;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
});
|
||||
// Set up our beforeunload handler
|
||||
window.addEventListener("beforeunload",function(event) {
|
||||
var confirmationMessage;
|
||||
if(self.isDirty()) {
|
||||
confirmationMessage = $tw.language.getString("UnsavedChangesWarning");
|
||||
event.returnValue = confirmationMessage; // Gecko
|
||||
}
|
||||
return confirmationMessage;
|
||||
});
|
||||
}
|
||||
// Install the save action handlers
|
||||
if($tw.browser) {
|
||||
$tw.rootWidget.addEventListener("tm-save-wiki",function(event) {
|
||||
self.saveWiki({
|
||||
template: event.param,
|
||||
downloadType: "text/plain"
|
||||
});
|
||||
});
|
||||
$tw.rootWidget.addEventListener("tm-download-file",function(event) {
|
||||
self.saveWiki({
|
||||
method: "download",
|
||||
template: event.param,
|
||||
downloadType: "text/plain"
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
SaverHandler.prototype.titleSyncFilter = "$:/config/SaverFilter";
|
||||
@ -86,86 +108,86 @@ SaverHandler.prototype.titleSavedNotification = "$:/language/Notifications/Save/
|
||||
Select the appropriate saver modules and set them up
|
||||
*/
|
||||
SaverHandler.prototype.initSavers = function(moduleType) {
|
||||
moduleType = moduleType || "saver";
|
||||
// Instantiate the available savers
|
||||
this.savers = [];
|
||||
var self = this;
|
||||
$tw.modules.forEachModuleOfType(moduleType,function(title,module) {
|
||||
if(module.canSave(self)) {
|
||||
self.savers.push(module.create(self.wiki));
|
||||
}
|
||||
});
|
||||
// Sort the savers into priority order
|
||||
this.savers.sort(function(a,b) {
|
||||
if(a.info.priority < b.info.priority) {
|
||||
return -1;
|
||||
} else {
|
||||
if(a.info.priority > b.info.priority) {
|
||||
return +1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
});
|
||||
moduleType = moduleType || "saver";
|
||||
// Instantiate the available savers
|
||||
this.savers = [];
|
||||
var self = this;
|
||||
$tw.modules.forEachModuleOfType(moduleType,function(title,module) {
|
||||
if(module.canSave(self)) {
|
||||
self.savers.push(module.create(self.wiki));
|
||||
}
|
||||
});
|
||||
// Sort the savers into priority order
|
||||
this.savers.sort(function(a,b) {
|
||||
if(a.info.priority < b.info.priority) {
|
||||
return -1;
|
||||
} else {
|
||||
if(a.info.priority > b.info.priority) {
|
||||
return +1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/*
|
||||
Save the wiki contents. Options are:
|
||||
method: "save", "autosave" or "download"
|
||||
template: the tiddler containing the template to save
|
||||
downloadType: the content type for the saved file
|
||||
method: "save", "autosave" or "download"
|
||||
template: the tiddler containing the template to save
|
||||
downloadType: the content type for the saved file
|
||||
*/
|
||||
SaverHandler.prototype.saveWiki = function(options) {
|
||||
options = options || {};
|
||||
var self = this,
|
||||
method = options.method || "save",
|
||||
template = options.template || "$:/core/save/all",
|
||||
downloadType = options.downloadType || "text/plain",
|
||||
text = this.wiki.renderTiddler(downloadType,template),
|
||||
callback = function(err) {
|
||||
if(err) {
|
||||
alert("Error while saving:\n\n" + err);
|
||||
} else {
|
||||
// Clear the task queue if we're saving (rather than downloading)
|
||||
if(method !== "download") {
|
||||
self.numTasksInQueue = 0;
|
||||
self.updateDirtyStatus();
|
||||
}
|
||||
$tw.notifier.display(self.titleSavedNotification);
|
||||
if(options.callback) {
|
||||
options.callback();
|
||||
}
|
||||
}
|
||||
};
|
||||
// Ignore autosave if disabled
|
||||
if(method === "autosave" && this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes") {
|
||||
return false;
|
||||
}
|
||||
// Call the highest priority saver that supports this method
|
||||
for(var t=this.savers.length-1; t>=0; t--) {
|
||||
var saver = this.savers[t];
|
||||
if(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback)) {
|
||||
this.logger.log("Saving wiki with method",method,"through saver",saver.info.name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
options = options || {};
|
||||
var self = this,
|
||||
method = options.method || "save",
|
||||
template = options.template || "$:/core/save/all",
|
||||
downloadType = options.downloadType || "text/plain",
|
||||
text = this.wiki.renderTiddler(downloadType,template),
|
||||
callback = function(err) {
|
||||
if(err) {
|
||||
alert("Error while saving:\n\n" + err);
|
||||
} else {
|
||||
// Clear the task queue if we're saving (rather than downloading)
|
||||
if(method !== "download") {
|
||||
self.numTasksInQueue = 0;
|
||||
self.updateDirtyStatus();
|
||||
}
|
||||
$tw.notifier.display(self.titleSavedNotification);
|
||||
if(options.callback) {
|
||||
options.callback();
|
||||
}
|
||||
}
|
||||
};
|
||||
// Ignore autosave if disabled
|
||||
if(method === "autosave" && this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes") {
|
||||
return false;
|
||||
}
|
||||
// Call the highest priority saver that supports this method
|
||||
for(var t=this.savers.length-1; t>=0; t--) {
|
||||
var saver = this.savers[t];
|
||||
if(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback)) {
|
||||
this.logger.log("Saving wiki with method",method,"through saver",saver.info.name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
/*
|
||||
Checks whether the wiki is dirty (ie the window shouldn't be closed)
|
||||
*/
|
||||
SaverHandler.prototype.isDirty = function() {
|
||||
return this.numTasksInQueue > 0;
|
||||
return this.numTasksInQueue > 0;
|
||||
};
|
||||
|
||||
/*
|
||||
Update the document body with the class "tc-dirty" if the wiki has unsaved/unsynced changes
|
||||
*/
|
||||
SaverHandler.prototype.updateDirtyStatus = function() {
|
||||
if($tw.browser) {
|
||||
$tw.utils.toggleClass(document.body,"tc-dirty",this.isDirty());
|
||||
}
|
||||
if($tw.browser) {
|
||||
$tw.utils.toggleClass(document.body,"tc-dirty",this.isDirty());
|
||||
}
|
||||
};
|
||||
|
||||
exports.SaverHandler = SaverHandler;
|
||||
|
@ -32,7 +32,7 @@ AndTidWiki.prototype.save = function(text,method,callback) {
|
||||
pathname = pathname.substr(0,p);
|
||||
}
|
||||
// Save the file
|
||||
window.twi.saveFile(pathname,text)
|
||||
window.twi.saveFile(pathname,text);
|
||||
// Call the callback
|
||||
callback(null);
|
||||
return true;
|
||||
|
@ -21,7 +21,7 @@ TiddlyFoxSaver.prototype.save = function(text,method,callback) {
|
||||
// Get the pathname of this document
|
||||
var pathname = document.location.toString().split("#")[0];
|
||||
// Replace file://localhost/ with file:///
|
||||
if(pathname.indexOf("file://localhost/") == 0) {
|
||||
if(pathname.indexOf("file://localhost/") === 0) {
|
||||
pathname = "file://" + pathname.substr(16);
|
||||
}
|
||||
// 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) {
|
||||
pathname = "\\\\" + unescape(pathname.substr(10)).replace(/\//g,"\\");
|
||||
// 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));
|
||||
// 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));
|
||||
// Otherwise Windows networth path file://server/share/path/path --> \\server\share\path\path
|
||||
} else {
|
||||
|
@ -38,25 +38,25 @@ TWEditSaver.prototype.save = function(text,method,callback) {
|
||||
}
|
||||
// Error handler
|
||||
var errorHandler = function(event) {
|
||||
// Error
|
||||
callback("Error saving to TWEdit: " + event.target.error.code);
|
||||
};
|
||||
// Error
|
||||
callback("Error saving to TWEdit: " + event.target.error.code);
|
||||
};
|
||||
// Get the file system
|
||||
window.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {
|
||||
// Now we've got the filesystem, get the fileEntry
|
||||
fileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {
|
||||
// Now we've got the fileEntry, create the writer
|
||||
fileEntry.createWriter(function(writer) {
|
||||
writer.onerror = errorHandler;
|
||||
writer.onwrite = function() {
|
||||
callback(null);
|
||||
};
|
||||
writer.position = 0;
|
||||
writer.write(text);
|
||||
},errorHandler);
|
||||
}, errorHandler);
|
||||
}, errorHandler);
|
||||
return true;
|
||||
window.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {
|
||||
// Now we've got the filesystem, get the fileEntry
|
||||
fileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {
|
||||
// Now we've got the fileEntry, create the writer
|
||||
fileEntry.createWriter(function(writer) {
|
||||
writer.onerror = errorHandler;
|
||||
writer.onwrite = function() {
|
||||
callback(null);
|
||||
};
|
||||
writer.position = 0;
|
||||
writer.write(text);
|
||||
},errorHandler);
|
||||
}, errorHandler);
|
||||
}, errorHandler);
|
||||
return true;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -38,6 +38,6 @@ function setFavicon() {
|
||||
var faviconLink = document.getElementById("faviconLink");
|
||||
faviconLink.setAttribute("href","data:" + tiddler.fields.type + ";base64," + tiddler.fields.text);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
})();
|
||||
|
@ -19,7 +19,7 @@ exports.after = ["story"];
|
||||
exports.synchronous = true;
|
||||
|
||||
// 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_TEMPLATE_TITLE = "$:/core/ui/PageTemplate";
|
||||
|
||||
|
@ -48,7 +48,7 @@ exports.startup = function() {
|
||||
$tw.locationHash = hash;
|
||||
openStartupTiddlers({defaultToCurrentStory: true});
|
||||
}
|
||||
},false)
|
||||
},false);
|
||||
// Listen for the tm-browser-refresh message
|
||||
$tw.rootWidget.addEventListener("tm-browser-refresh",function(event) {
|
||||
window.location.reload(true);
|
||||
@ -157,7 +157,7 @@ function updateLocationHash(options) {
|
||||
}
|
||||
// Assemble the location hash
|
||||
if(options.updateAddressBar === "permalink") {
|
||||
$tw.locationHash = "#" + encodeURIComponent(targetTiddler)
|
||||
$tw.locationHash = "#" + encodeURIComponent(targetTiddler);
|
||||
} else {
|
||||
$tw.locationHash = "#" + encodeURIComponent(targetTiddler) + ":" + encodeURIComponent($tw.utils.stringifyList(storyList));
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ var easing = "cubic-bezier(0.645, 0.045, 0.355, 1)"; // From http://easings.net/
|
||||
|
||||
var ClassicStoryView = function(listWidget) {
|
||||
this.listWidget = listWidget;
|
||||
}
|
||||
};
|
||||
|
||||
ClassicStoryView.prototype.navigateTo = function(historyInfo) {
|
||||
var listElementIndex = this.listWidget.findListItem(0,historyInfo.title);
|
||||
|
@ -14,7 +14,7 @@ Animates list insertions and removals
|
||||
|
||||
var PopStoryView = function(listWidget) {
|
||||
this.listWidget = listWidget;
|
||||
}
|
||||
};
|
||||
|
||||
PopStoryView.prototype.navigateTo = function(historyInfo) {
|
||||
var listElementIndex = this.listWidget.findListItem(0,historyInfo.title);
|
||||
|
@ -86,7 +86,7 @@ ZoominListView.prototype.navigateTo = function(historyInfo) {
|
||||
]);
|
||||
// Transform the previous tiddler out of the way and then hide it
|
||||
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;
|
||||
y = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;
|
||||
$tw.utils.setStyle(prevCurrentTiddler,[
|
||||
|
@ -20,7 +20,7 @@ wiki: wiki to be synced
|
||||
function Syncer(options) {
|
||||
var self = this;
|
||||
this.wiki = options.wiki;
|
||||
this.syncadaptor = options.syncadaptor
|
||||
this.syncadaptor = options.syncadaptor;
|
||||
// Make a logger
|
||||
this.logger = new $tw.utils.Logger("syncer" + ($tw.browser ? "-browser" : "") + ($tw.node ? "-server" : ""));
|
||||
// Compile the dirty tiddler filter
|
||||
@ -40,7 +40,7 @@ function Syncer(options) {
|
||||
if($tw.browser) {
|
||||
// Set up our beforeunload handler
|
||||
window.addEventListener("beforeunload",function(event) {
|
||||
var confirmationMessage = undefined;
|
||||
var confirmationMessage;
|
||||
if(self.isDirty()) {
|
||||
confirmationMessage = $tw.language.getString("UnsavedChangesWarning");
|
||||
event.returnValue = confirmationMessage; // Gecko
|
||||
@ -94,10 +94,10 @@ Syncer.prototype.readTiddlerInfo = function() {
|
||||
$tw.utils.each(tiddlers,function(title) {
|
||||
var tiddler = self.wiki.getTiddler(title);
|
||||
self.tiddlerInfo[title] = {
|
||||
revision: tiddler.fields["revision"],
|
||||
revision: tiddler.fields.revision,
|
||||
adaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),
|
||||
changeCount: self.wiki.getChangeCount(title)
|
||||
}
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
@ -329,7 +329,7 @@ Syncer.prototype.enqueueSyncTask = function(task) {
|
||||
revision: null,
|
||||
adaptorInfo: {},
|
||||
changeCount: -1
|
||||
}
|
||||
};
|
||||
}
|
||||
// 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) {
|
||||
|
@ -36,10 +36,10 @@ exports.upgrade = function(wiki,titles,tiddlers) {
|
||||
$tw.utils.each(titles,function(title) {
|
||||
var incomingTiddler = tiddlers[title];
|
||||
// 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
|
||||
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)) {
|
||||
tiddlers[title] = libraryTiddler;
|
||||
messages[title] = $tw.language.getString("Import/Upgrader/Plugins/Upgraded",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});
|
||||
|
@ -51,10 +51,10 @@ exports.upgrade = function(wiki,titles,tiddlers) {
|
||||
tiddlers[mappedTitle] = {
|
||||
title: mappedTitle,
|
||||
text: tiddlerData[index]
|
||||
}
|
||||
};
|
||||
messages[mappedTitle] = $tw.language.getString("Import/Upgrader/ThemeTweaks/Created",{variables: {
|
||||
from: title + "##" + index
|
||||
}})
|
||||
}});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ Modal.prototype.display = function(title,options) {
|
||||
});
|
||||
// Setup the link if present
|
||||
if(options.downloadLink) {
|
||||
modalLink.href = options.downloadLink
|
||||
modalLink.href = options.downloadLink;
|
||||
modalLink.appendChild(document.createTextNode("Right-click to save changes"));
|
||||
modalBody.appendChild(modalLink);
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ var bumpSequenceNumber = function(object) {
|
||||
if(sequenceNumber !== null) {
|
||||
object.sequenceNumber = sequenceNumber++;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var TW_TextNode = function(text) {
|
||||
bumpSequenceNumber(this);
|
||||
@ -79,7 +79,7 @@ TW_Element.prototype.insertBefore = function(node,nextSibling) {
|
||||
} else {
|
||||
this.appendChild(node);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TW_Element.prototype.removeChild = function(node) {
|
||||
var p = this.children.indexOf(node);
|
||||
@ -93,9 +93,9 @@ TW_Element.prototype.hasChildNodes = function() {
|
||||
};
|
||||
|
||||
Object.defineProperty(TW_Element.prototype, "firstChild", {
|
||||
get: function() {
|
||||
return this.children[0];
|
||||
}
|
||||
get: function() {
|
||||
return this.children[0];
|
||||
}
|
||||
});
|
||||
|
||||
TW_Element.prototype.addEventListener = function(type,listener,useCapture) {
|
||||
@ -106,22 +106,22 @@ Object.defineProperty(TW_Element.prototype, "className", {
|
||||
get: function() {
|
||||
return this.attributes["class"] || "";
|
||||
},
|
||||
set: function(value) {
|
||||
this.attributes["class"] = value;
|
||||
}
|
||||
set: function(value) {
|
||||
this.attributes["class"] = value;
|
||||
}
|
||||
});
|
||||
|
||||
Object.defineProperty(TW_Element.prototype, "value", {
|
||||
get: function() {
|
||||
return this.attributes["value"] || "";
|
||||
return this.attributes.value || "";
|
||||
},
|
||||
set: function(value) {
|
||||
this.attributes["value"] = value;
|
||||
}
|
||||
set: function(value) {
|
||||
this.attributes.value = value;
|
||||
}
|
||||
});
|
||||
|
||||
Object.defineProperty(TW_Element.prototype, "outerHTML", {
|
||||
get: function() {
|
||||
get: function() {
|
||||
var output = [],attr,a,v;
|
||||
output.push("<",this.tag);
|
||||
if(this.attributes) {
|
||||
@ -143,7 +143,7 @@ Object.defineProperty(TW_Element.prototype, "outerHTML", {
|
||||
output.push("</",this.tag,">");
|
||||
}
|
||||
return output.join("");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Object.defineProperty(TW_Element.prototype, "innerHTML", {
|
||||
@ -162,10 +162,10 @@ Object.defineProperty(TW_Element.prototype, "innerHTML", {
|
||||
return b.join("");
|
||||
}
|
||||
},
|
||||
set: function(value) {
|
||||
this.isRaw = true;
|
||||
this.rawHTML = value;
|
||||
}
|
||||
set: function(value) {
|
||||
this.isRaw = true;
|
||||
this.rawHTML = value;
|
||||
}
|
||||
});
|
||||
|
||||
Object.defineProperty(TW_Element.prototype, "textContent", {
|
||||
@ -193,7 +193,7 @@ Object.defineProperty(TW_Element.prototype, "formattedTextContent", {
|
||||
b.push("\n");
|
||||
}
|
||||
if(this.tag === "li") {
|
||||
b.push("* ")
|
||||
b.push("* ");
|
||||
}
|
||||
$tw.utils.each(this.children,function(node) {
|
||||
b.push(node.formattedTextContent);
|
||||
|
@ -41,7 +41,7 @@ exports.copyDirectory = function(srcPath,dstPath) {
|
||||
if(err) {
|
||||
return err;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
copy(srcPath,dstPath);
|
||||
@ -70,7 +70,7 @@ exports.copyFile = function(srcPath,dstPath) {
|
||||
fs.closeSync(srcFile);
|
||||
fs.closeSync(dstFile);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Remove trailing path separator
|
||||
|
@ -41,9 +41,9 @@ exports.addClassToParseTreeNode = function(node,classString) {
|
||||
|
||||
exports.addStyleToParseTreeNode = function(node,name,value) {
|
||||
node.attributes = node.attributes || {};
|
||||
node.attributes["style"] = node.attributes["style"] || {type: "string", value: ""};
|
||||
if(node.attributes["style"].type === "string") {
|
||||
node.attributes["style"].value += name + ":" + value + ";";
|
||||
node.attributes.style = node.attributes.style || {type: "string", value: ""};
|
||||
if(node.attributes.style.type === "string") {
|
||||
node.attributes.style.value += name + ":" + value + ";";
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -24,15 +24,16 @@ exports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {
|
||||
throw "No such tiddler as " + title;
|
||||
}
|
||||
// Extract the JSON
|
||||
var jsonPluginTiddler;
|
||||
try {
|
||||
var jsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);
|
||||
jsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);
|
||||
} catch(e) {
|
||||
throw "Cannot parse plugin tiddler " + title + "\nError: " + e;
|
||||
}
|
||||
// Get the list of tiddlers
|
||||
var tiddlers = Object.keys(jsonPluginTiddler.tiddlers);
|
||||
// Add the additional tiddlers
|
||||
$tw.utils.pushTop(tiddlers,additionalTiddlers)
|
||||
$tw.utils.pushTop(tiddlers,additionalTiddlers);
|
||||
// Remove any excluded tiddlers
|
||||
for(var t=tiddlers.length-1; t>=0; t--) {
|
||||
if(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {
|
||||
@ -71,8 +72,10 @@ exports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {
|
||||
$tw.wiki.deleteTiddler(title);
|
||||
}
|
||||
});
|
||||
// Trigger an autosave
|
||||
$tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"});
|
||||
// Return a heartwarming confirmation
|
||||
return "Plugin " + title + " successfully saved";
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
||||
|
@ -126,7 +126,7 @@ DropZoneWidget.prototype.importData = function(dataTransfer) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
DropZoneWidget.prototype.importDataTypes = [
|
||||
|
@ -120,7 +120,7 @@ EditBitmapWidget.prototype.loadCanvas = function() {
|
||||
self.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);
|
||||
// Set the width and height input boxes
|
||||
self.updateSize();
|
||||
}
|
||||
};
|
||||
// Get the current bitmap into an image object
|
||||
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.fillRect(0,0,canvas.width,canvas.height);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
** Update the input boxes with the actual size of the canvas
|
||||
|
@ -78,7 +78,7 @@ FieldsWidget.prototype.execute = function() {
|
||||
row = row.replace("$name$",fieldName);
|
||||
row = row.replace("$value$",value);
|
||||
row = row.replace("$encoded_value$",$tw.utils.htmlEncode(value));
|
||||
text.push(row)
|
||||
text.push(row);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ LinkWidget.prototype.render = function(parent,nextSibling) {
|
||||
this.execute();
|
||||
// Get the value of the tv-wikilinks configuration macro
|
||||
var wikiLinksMacro = this.getVariable("tv-wikilinks"),
|
||||
useWikiLinks = wikiLinksMacro ? !(wikiLinksMacro.trim() === "no") : true;
|
||||
useWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== "no") : true;
|
||||
// Render the link if required
|
||||
if(useWikiLinks) {
|
||||
this.renderLink(parent,nextSibling);
|
||||
|
@ -44,7 +44,7 @@ ListWidget.prototype.render = function(parent,nextSibling) {
|
||||
// Construct the storyview
|
||||
var StoryView = this.storyViews[this.storyViewName];
|
||||
if(StoryView && !this.document.isTiddlyWikiFakeDom) {
|
||||
this.storyview = new StoryView(this)
|
||||
this.storyview = new StoryView(this);
|
||||
} else {
|
||||
this.storyview = null;
|
||||
}
|
||||
|
@ -243,6 +243,8 @@ NavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {
|
||||
// Remove the closed tiddler from the story
|
||||
this.removeTitleFromStory(storyList,title);
|
||||
this.saveStoryList(storyList);
|
||||
// Trigger an autosave
|
||||
$tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"});
|
||||
return false;
|
||||
};
|
||||
|
||||
@ -281,9 +283,10 @@ NavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {
|
||||
Generate a title for the draft of a given tiddler
|
||||
*/
|
||||
NavigatorWidget.prototype.generateDraftTitle = function(title) {
|
||||
var c = 0;
|
||||
var c = 0,
|
||||
draftTitle;
|
||||
do {
|
||||
var draftTitle = "Draft " + (c ? (c + 1) + " " : "") + "of '" + title + "'";
|
||||
draftTitle = "Draft " + (c ? (c + 1) + " " : "") + "of '" + title + "'";
|
||||
c++;
|
||||
} while(this.wiki.tiddlerExists(draftTitle));
|
||||
return draftTitle;
|
||||
@ -331,6 +334,8 @@ NavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {
|
||||
if(draftTitle !== this.storyTitle) {
|
||||
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
|
||||
this.addToHistory([IMPORT_TITLE]);
|
||||
// Trigger an autosave
|
||||
$tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"});
|
||||
};
|
||||
|
||||
exports.navigator = NavigatorWidget;
|
||||
|
@ -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
|
||||
}
|
||||
if(!this.isOpen) {
|
||||
domNode.setAttribute("hidden","true")
|
||||
domNode.setAttribute("hidden","true");
|
||||
}
|
||||
this.domNodes.push(domNode);
|
||||
};
|
||||
|
@ -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("shadowTiddlerClass",this.wiki.isShadowTiddler(this.tiddlerTitle) ? "tc-tiddler-shadow" : "");
|
||||
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
|
||||
this.makeChildWidgets();
|
||||
};
|
||||
|
@ -171,7 +171,7 @@ Widget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue)
|
||||
else for(var i=0; i<actualParams.length; ++i) {
|
||||
args.push(actualParams[i].value);
|
||||
}
|
||||
return macro.run.apply(this,args)
|
||||
return macro.run.apply(this,args);
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
@ -263,9 +263,14 @@ Widget.prototype.assignAttributes = function(domNode,options) {
|
||||
v = undefined;
|
||||
}
|
||||
if(v !== undefined) {
|
||||
var b = a.split(":");
|
||||
// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)
|
||||
try {
|
||||
domNode.setAttributeNS(null,a,v);
|
||||
if (b.length == 2 && b[0] == "xlink"){
|
||||
domNode.setAttributeNS("http://www.w3.org/1999/xlink",b[1],v);
|
||||
} else {
|
||||
domNode.setAttributeNS(null,a,v);
|
||||
}
|
||||
} catch(e) {
|
||||
}
|
||||
}
|
||||
@ -289,7 +294,7 @@ Construct the widget object for a parse tree node
|
||||
Widget.prototype.makeChildWidget = function(parseTreeNode) {
|
||||
var WidgetClass = this.widgetClasses[parseTreeNode.type];
|
||||
if(!WidgetClass) {
|
||||
WidgetClass = this.widgetClasses["text"];
|
||||
WidgetClass = this.widgetClasses.text;
|
||||
parseTreeNode = {type: "text", text: "Undefined widget '" + parseTreeNode.type + "'"};
|
||||
}
|
||||
return new WidgetClass(parseTreeNode,{
|
||||
@ -357,8 +362,7 @@ Widget.prototype.addEventListener = function(type,handler) {
|
||||
} else { // The handler is a function
|
||||
this.eventListeners[type] = function(event) {
|
||||
return handler.call(self,event);
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -152,9 +152,13 @@ exports.enqueueTiddlerEvent = function(title,isDeleted) {
|
||||
}
|
||||
};
|
||||
|
||||
exports.getSizeOfTiddlerEventQueue = function() {
|
||||
return $tw.utils.count(this.changedTiddlers);
|
||||
};
|
||||
|
||||
exports.clearTiddlerEventQueue = function() {
|
||||
this.changedTiddlers = Object.create(null);
|
||||
this.changeCount = Object.create(null)
|
||||
this.changeCount = Object.create(null);
|
||||
};
|
||||
|
||||
exports.getChangeCount = function(title) {
|
||||
@ -172,12 +176,12 @@ Generate an unused title from the specified base
|
||||
exports.generateNewTitle = function(baseTitle,options) {
|
||||
options = options || {};
|
||||
var c = 0,
|
||||
title = baseTitle;
|
||||
title = baseTitle;
|
||||
while(this.tiddlerExists(title) || this.isShadowTiddler(title)) {
|
||||
title = baseTitle +
|
||||
(options.prefix || " ") +
|
||||
(++c);
|
||||
};
|
||||
}
|
||||
return title;
|
||||
};
|
||||
|
||||
@ -457,7 +461,7 @@ exports.getTagMap = function() {
|
||||
for(var index=0; index<tagArray.length; index++) {
|
||||
var tag = tagArray[index];
|
||||
if($tw.utils.hop(tags,tag)) {
|
||||
tags[tag].push(title)
|
||||
tags[tag].push(title);
|
||||
} else {
|
||||
tags[tag] = [title];
|
||||
}
|
||||
@ -596,7 +600,7 @@ exports.getTiddlerData = function(titleOrTiddler,defaultData) {
|
||||
var tiddler = titleOrTiddler,
|
||||
data;
|
||||
if(!(tiddler instanceof $tw.Tiddler)) {
|
||||
tiddler = this.getTiddler(tiddler)
|
||||
tiddler = this.getTiddler(tiddler);
|
||||
}
|
||||
if(tiddler && tiddler.fields.text) {
|
||||
switch(tiddler.fields.type) {
|
||||
@ -679,7 +683,7 @@ exports.getGlobalCache = function(cacheName,initializer) {
|
||||
|
||||
exports.clearGlobalCache = function() {
|
||||
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
|
||||
exports.getCacheForTiddler = function(title,cacheName,initializer) {
|
||||
@ -687,18 +691,18 @@ exports.getCacheForTiddler = function(title,cacheName,initializer) {
|
||||
// Temporarily disable caching so that tweakParseTreeNode() works
|
||||
return initializer();
|
||||
|
||||
this.caches = this.caches || Object.create(null);
|
||||
var caches = this.caches[title];
|
||||
if(caches && caches[cacheName]) {
|
||||
return caches[cacheName];
|
||||
} else {
|
||||
if(!caches) {
|
||||
caches = Object.create(null);
|
||||
this.caches[title] = caches;
|
||||
}
|
||||
caches[cacheName] = initializer();
|
||||
return caches[cacheName];
|
||||
}
|
||||
// this.caches = this.caches || Object.create(null);
|
||||
// var caches = this.caches[title];
|
||||
// if(caches && caches[cacheName]) {
|
||||
// return caches[cacheName];
|
||||
// } else {
|
||||
// if(!caches) {
|
||||
// caches = Object.create(null);
|
||||
// this.caches[title] = caches;
|
||||
// }
|
||||
// caches[cacheName] = initializer();
|
||||
// return caches[cacheName];
|
||||
// }
|
||||
};
|
||||
|
||||
// Clear all caches associated with a particular tiddler
|
||||
@ -789,16 +793,16 @@ var tweakParser = function(parser) {
|
||||
exports.parseText = function(type,text,options) {
|
||||
var parser = this.old_parseText(type,text,options);
|
||||
if(parser) {
|
||||
tweakParser(parser)
|
||||
};
|
||||
tweakParser(parser);
|
||||
}
|
||||
return parser;
|
||||
};
|
||||
|
||||
exports.parseTiddler = function(title,options) {
|
||||
var parser = this.old_parseTiddler(title,options);
|
||||
if(parser) {
|
||||
tweakParser(parser)
|
||||
};
|
||||
tweakParser(parser);
|
||||
}
|
||||
return parser;
|
||||
};
|
||||
|
||||
@ -957,7 +961,9 @@ Options available:
|
||||
*/
|
||||
exports.search = function(text,options) {
|
||||
options = options || {};
|
||||
var self = this,t;
|
||||
var self = this,
|
||||
t,
|
||||
invert = !!options.invert;
|
||||
// Convert the search string into a regexp for each term
|
||||
var terms, searchTermsRegExps,
|
||||
flags = options.caseSensitive ? "" : "i";
|
||||
@ -1007,7 +1013,7 @@ exports.search = function(text,options) {
|
||||
var results = [],
|
||||
source = options.source || this.each;
|
||||
source(function(tiddler,title) {
|
||||
if(!!searchTiddler(title) === !options.invert) {
|
||||
if(searchTiddler(title) !== options.invert) {
|
||||
results.push(title);
|
||||
}
|
||||
});
|
||||
@ -1056,7 +1062,7 @@ exports.readFiles = function(files,callback) {
|
||||
callback(result);
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
return files.length;
|
||||
};
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
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]]
|
@ -1,3 +1,3 @@
|
||||
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]]
|
@ -1,6 +1,6 @@
|
||||
caption: 5.0.16-beta
|
||||
created: 20140826131615798
|
||||
modified: 20140826131615798
|
||||
created: 20140830131615798
|
||||
modified: 20140830131615798
|
||||
tags: releasenote
|
||||
title: Release 5.0.16-beta
|
||||
type: text/vnd.tiddlywiki
|
||||
@ -9,16 +9,22 @@ type: text/vnd.tiddlywiki
|
||||
|
||||
!! 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
|
||||
|
||||
!! 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
|
||||
* [[Hide|https://github.com/Jermolene/TiddlyWiki5/commit/88c9c0c3ee115917b8c1a9126452bb0574061857]] toolbar buttons from static renderings
|
||||
|
||||
!! 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
|
||||
* [[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
|
||||
@ -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:
|
||||
|
||||
* [[@BramChen|https://github.com/BramChen]]
|
||||
* [[@pmario|https://github.com/pmario]]
|
||||
* [[@xcazin|https://github.com/xcazin]]
|
||||
|
@ -17,4 +17,5 @@ For example:
|
||||
|`[all[current]]` |Selects the current tiddler |
|
||||
|`[all[missing]]` |Selects all MissingTiddlers |
|
||||
|`[all[orphans]]` |Selects all OrphanTiddlers |
|
||||
|`[all[]]` |Selects all the source tiddlers available to the filter |
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
title: Improving TiddlyWiki Documentation
|
||||
tags: howto
|
||||
created: 20140820151051019
|
||||
modified: 20140820151051019
|
||||
modified: 20140830151051019
|
||||
|
||||
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
|
||||
# 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''
|
||||
## 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
|
||||
# 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")
|
||||
@ -17,3 +18,5 @@ Anyone can submit improvements to the TiddlyWiki documentation that appears on h
|
||||
# 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.
|
||||
|
||||
There will be a short video soon!
|
||||
|
@ -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: tw-save-tiddler]], [[WidgetMessage: tw-delete-tiddler]] and [[WidgetMessage: tw-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.
|
@ -13,7 +13,7 @@ Initialise $:/info/browser tiddlers
|
||||
"use strict";
|
||||
|
||||
exports.getInfoTiddlerFields = function() {
|
||||
var mapBoolean = function(value) {return value ? "yes" : "no"},
|
||||
var mapBoolean = function(value) {return value ? "yes" : "no";},
|
||||
infoTiddlerFields = [];
|
||||
// Basics
|
||||
if($tw.browser) {
|
||||
|
@ -113,7 +113,7 @@ CecilyStoryView.prototype.lookupTiddlerInMap = function(title,domNode) {
|
||||
if(tiddler) {
|
||||
var draftOf = tiddler.fields["draft.of"];
|
||||
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
|
||||
|
@ -25,14 +25,14 @@ Config options "$:/config/CodeMirror" e.g. to allow vim key bindings
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
var CODEMIRROR_OPTIONS = "$:/config/CodeMirror"
|
||||
var CODEMIRROR_OPTIONS = "$:/config/CodeMirror";
|
||||
|
||||
// Install CodeMirror
|
||||
if($tw.browser && !window.CodeMirror) {
|
||||
window.CodeMirror = require("$:/plugins/tiddlywiki/codemirror/lib/codemirror.js");
|
||||
// Install required CodeMirror plugins
|
||||
var configOptions = $tw.wiki.getTiddlerData(CODEMIRROR_OPTIONS,{}),
|
||||
req = configOptions["require"];
|
||||
req = configOptions.require;
|
||||
if(req) {
|
||||
if($tw.utils.isArray(req)) {
|
||||
for(var index=0; index<req.length; index++) {
|
||||
|
68
plugins/tiddlywiki/d3/barwidget.js
vendored
68
plugins/tiddlywiki/d3/barwidget.js
vendored
@ -57,7 +57,7 @@ BarWidget.prototype.createChart = function(parent,nextSibling) {
|
||||
n = 4; // number of layers
|
||||
m = 58; // number of samples per layer
|
||||
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
|
||||
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
|
||||
var x = d3.scale.ordinal()
|
||||
.domain(d3.range(m))
|
||||
.rangeRoundBands([0, width], .08);
|
||||
.rangeRoundBands([0, width], 0.08);
|
||||
// y-scale
|
||||
var y = d3.scale.linear()
|
||||
.domain([0, yStackMax])
|
||||
@ -96,13 +96,13 @@ BarWidget.prototype.createChart = function(parent,nextSibling) {
|
||||
// Create the layers
|
||||
var layer = mainGroup.selectAll(".layer")
|
||||
.data(layers)
|
||||
.enter().append("g")
|
||||
.enter().append("g")
|
||||
.attr("class", "layer")
|
||||
.style("fill", function(d, i) { return color(i); });
|
||||
// Create the rectangles in each layer
|
||||
var rect = layer.selectAll("rect")
|
||||
.data(function(d) { return d; })
|
||||
.enter().append("rect")
|
||||
.enter().append("rect")
|
||||
.attr("x", function(d) { return x(d.x); })
|
||||
.attr("y", height)
|
||||
.attr("width", x.rangeBand())
|
||||
@ -131,44 +131,44 @@ BarWidget.prototype.createChart = function(parent,nextSibling) {
|
||||
};
|
||||
|
||||
function transitionGrouped() {
|
||||
y.domain([0, yGroupMax]);
|
||||
rect.transition()
|
||||
.duration(500)
|
||||
.delay(function(d, i) { return i * 10; })
|
||||
.attr("x", function(d, i, j) { return x(d.x) + x.rangeBand() / n * j; })
|
||||
.attr("width", x.rangeBand() / n)
|
||||
.transition()
|
||||
.attr("y", function(d) { return y(d.y); })
|
||||
.attr("height", function(d) { return height - y(d.y); });
|
||||
y.domain([0, yGroupMax]);
|
||||
rect.transition()
|
||||
.duration(500)
|
||||
.delay(function(d, i) { return i * 10; })
|
||||
.attr("x", function(d, i, j) { return x(d.x) + x.rangeBand() / n * j; })
|
||||
.attr("width", x.rangeBand() / n)
|
||||
.transition()
|
||||
.attr("y", function(d) { return y(d.y); })
|
||||
.attr("height", function(d) { return height - y(d.y); });
|
||||
}
|
||||
|
||||
function transitionStacked() {
|
||||
y.domain([0, yStackMax]);
|
||||
rect.transition()
|
||||
.duration(500)
|
||||
.delay(function(d, i) { return i * 10; })
|
||||
.attr("y", function(d) { return y(d.y0 + d.y); })
|
||||
.attr("height", function(d) { return y(d.y0) - y(d.y0 + d.y); })
|
||||
.transition()
|
||||
.attr("x", function(d) { return x(d.x); })
|
||||
.attr("width", x.rangeBand());
|
||||
y.domain([0, yStackMax]);
|
||||
rect.transition()
|
||||
.duration(500)
|
||||
.delay(function(d, i) { return i * 10; })
|
||||
.attr("y", function(d) { return y(d.y0 + d.y); })
|
||||
.attr("height", function(d) { return y(d.y0) - y(d.y0 + d.y); })
|
||||
.transition()
|
||||
.attr("x", function(d) { return x(d.x); })
|
||||
.attr("width", x.rangeBand());
|
||||
}
|
||||
|
||||
// Inspired by Lee Byron's test data generator.
|
||||
function bumpLayer(n, o) {
|
||||
function bump(a) {
|
||||
var x = 1 / (.1 + Math.random()),
|
||||
y = 2 * Math.random() - .5,
|
||||
z = 10 / (.1 + Math.random());
|
||||
for (var i = 0; i < n; i++) {
|
||||
var w = (i / n - y) * z;
|
||||
a[i] += x * Math.exp(-w * w);
|
||||
function bump(a) {
|
||||
var x = 1 / (0.1 + Math.random()),
|
||||
y = 2 * Math.random() - 0.5,
|
||||
z = 10 / (0.1 + Math.random());
|
||||
for (var i = 0; i < n; i++) {
|
||||
var w = (i / n - y) * z;
|
||||
a[i] += x * Math.exp(-w * w);
|
||||
}
|
||||
}
|
||||
}
|
||||
var a = [], i;
|
||||
for (i = 0; i < n; ++i) a[i] = o + o * Math.random();
|
||||
for (i = 0; i < 5; ++i) bump(a);
|
||||
return a.map(function(d, i) { return {x: i, y: Math.max(0, d)}; });
|
||||
var a = [], i;
|
||||
for (i = 0; i < n; ++i) a[i] = o + o * Math.random();
|
||||
for (i = 0; i < 5; ++i) bump(a);
|
||||
return a.map(function(d, i) { return {x: i, y: Math.max(0, d)}; });
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -24,20 +24,19 @@ function FileSystemAdaptor(options) {
|
||||
this.logger = new $tw.utils.Logger("FileSystem");
|
||||
this.setwatcher = function(filename, title) {
|
||||
return undefined;
|
||||
return this.watchers[filename] = this.watchers[filename] ||
|
||||
fs.watch(filename, {persistent: false}, function(e) {
|
||||
self.logger.log("Error:",e,filename);
|
||||
if(e === "change") {
|
||||
var tiddlers = $tw.loadTiddlersFromFile(filename).tiddlers;
|
||||
for(var t in tiddlers) {
|
||||
if(tiddlers[t].title) {
|
||||
self.wiki.addTiddler(tiddlers[t]);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//return this.watchers[filename] = this.watchers[filename] ||
|
||||
// fs.watch(filename, {persistent: false}, function(e) {
|
||||
// self.logger.log("Error:",e,filename);
|
||||
// if(e === "change") {
|
||||
// var tiddlers = $tw.loadTiddlersFromFile(filename).tiddlers;
|
||||
// for(var t in tiddlers) {
|
||||
// if(tiddlers[t].title) {
|
||||
// self.wiki.addTiddler(tiddlers[t]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
};
|
||||
for(var f in $tw.boot.files) {
|
||||
var fileInfo = $tw.boot.files[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) {
|
||||
// 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
|
||||
if(baseFilename.length > 200) {
|
||||
baseFilename = baseFilename.substr(0,200) + extension;
|
||||
|
@ -51,7 +51,7 @@ exports.startup = function() {
|
||||
// The HTMLReporter links itself into the jasmine object automatically, but we have to manually add the node reporter
|
||||
jasmine.jasmine.TerminalVerboseReporter = reporterExports.jasmineNode.TerminalVerboseReporter;
|
||||
jasmine.jasmine.TerminalReporter = reporterExports.jasmineNode.TerminalReporter;
|
||||
jasmineEnv.addReporter(new jasmine.jasmine.TerminalVerboseReporter({
|
||||
jasmineEnv.addReporter(new jasmine.jasmine.TerminalVerboseReporter({
|
||||
print: require("util").print,
|
||||
color: true,
|
||||
includeStackTrace: true
|
||||
|
@ -48,7 +48,7 @@ Static method that returns true if this saver is capable of working
|
||||
*/
|
||||
exports.canSave = function(wiki) {
|
||||
// Check if we're running under node-webkit
|
||||
return (typeof process == "object")
|
||||
return (typeof process == "object");
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -37,7 +37,7 @@ TiddlyWebAdaptor.prototype.getHost = function() {
|
||||
|
||||
TiddlyWebAdaptor.prototype.getTiddlerInfo = function(tiddler) {
|
||||
return {
|
||||
bag: tiddler.fields["bag"]
|
||||
bag: tiddler.fields.bag
|
||||
};
|
||||
};
|
||||
|
||||
@ -248,7 +248,7 @@ TiddlyWebAdaptor.prototype.convertTiddlerToTiddlyWebFormat = function(tiddler) {
|
||||
// Default the content type and convert the type "text/x-tiddlywiki" into null
|
||||
if(result.type === "text/x-tiddlywiki") {
|
||||
result.type = null;
|
||||
};
|
||||
}
|
||||
result.type = result.type || "text/vnd.tiddlywiki";
|
||||
return JSON.stringify(result,null,$tw.config.preferences.jsonSpaces);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user