1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-11-23 10:07:19 +00:00

Support for lazy loaded tiddlers

This commit is contained in:
Jeremy Ruston 2012-11-18 13:14:28 +00:00
parent 17334f64cc
commit 5c87b437ee
5 changed files with 86 additions and 16 deletions

View File

@ -585,7 +585,7 @@ $tw.Wiki.prototype.getTiddler = function(title) {
} else if($tw.utils.hop(this.bundledTiddlers,title)) {
return this.bundledTiddlers[title];
} else {
return null;
return undefined;
}
};

View File

@ -28,7 +28,11 @@ exports.executeMacro = function() {
value;
// Get the value to display
if(tiddler) {
value = tiddler.fields[field];
if(field === "text") {
value = this.wiki.getTiddlerText(this.tiddlerTitle);
} else {
value = tiddler.fields[field];
}
} else { // Use a special value if the tiddler is missing
switch(field) {
case "text":

View File

@ -30,7 +30,7 @@ exports.isTemporary = function() {
exports.getFieldString = function(field) {
var value = this.fields[field];
// Check for a missing field
if(value === undefined) {
if(value === undefined || value === null) {
return "";
}
// Parse the field with the associated module (if any)

View File

@ -730,6 +730,17 @@ exports.initServerConnections = function() {
});
};
/*
Invoke all the active server connections
*/
exports.invokeServerConnections = function(method /* ,args */) {
var args = Array.prototype.slice.call(arguments,1);
for(var title in this.serverConnections) {
var connection = this.serverConnections[title];
connection.syncer[method].apply(connection.syncer,[connection.connection].concat(args));
}
};
/*
Handle a syncer message
*/
@ -739,4 +750,24 @@ exports.handleSyncerEvent = function(event) {
}
};
/*
Trigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.
*/
exports.getTiddlerText = function(title) {
var tiddler = this.getTiddler(title);
// Return undefined if the tiddler isn't found
if(!tiddler) {
return undefined;
}
if(tiddler.fields.text) {
// Just return the text if we've got it
return tiddler.fields.text;
} else {
// Ask all the server connections to load the tiddler if they can
this.invokeServerConnections("lazyLoad",title,tiddler);
// Indicate that the text is being loaded
return null;
}
};
})();

View File

@ -197,6 +197,26 @@ TiddlyWebSyncer.prototype.logout = function(options) {
});
};
/*
Convert a TiddlyWeb JSON tiddler into a TiddlyWiki5 tiddler
*/
TiddlyWebSyncer.prototype.convertTiddler = function(tiddlerFields) {
var result = {};
for(var f in tiddlerFields) {
switch(f) {
case "fields":
for(var ff in tiddlerFields[f]) {
result[ff] = tiddlerFields[f][ff];
}
break;
default:
result[f] = tiddlerFields[f];
break;
}
}
return result;
};
/*
Synchronise from the server by reading the tiddler list from the recipe and queuing up GETs for any tiddlers that we don't already have
*/
@ -211,34 +231,42 @@ console.log("error in syncFromServer",err);
}
var json = JSON.parse(data);
for(var t=0; t<json.length; t++) {
var jsonTiddler = json[t],
fields = {};
for(var f in jsonTiddler) {
switch(f) {
case "fields":
break;
default:
fields[f] = jsonTiddler[f];
break;
}
}
self.wiki.addTiddler(new $tw.Tiddler(fields));
self.wiki.addTiddler(new $tw.Tiddler(self.convertTiddler(json[t])));
}
}
});
};
/*
Some quick and dirty HTTP functions; to be refactored later. Options are:
Lazily load a skinny tiddler if we can
*/
TiddlyWebSyncer.prototype.lazyLoad = function(connection,title,tiddler) {
var self = this;
this.httpRequest({
url: this.connection.host + "recipes/" + this.connection.recipe + "/tiddlers/" + title,
callback: function(err,data) {
if(err) {
console.log("error in lazyLoad",err);
return;
}
self.wiki.addTiddler(new $tw.Tiddler(self.convertTiddler(JSON.parse(data))));
}
});
};
/*
A quick and dirty HTTP function; to be refactored later. Options are:
url: URL to retrieve
type: GET, PUT, POST etc
callback: function invoked with (err,data)
*/
TiddlyWebSyncer.prototype.httpRequest = function(options) {
var type = options.type || "GET",
headers = options.headers || {accept: "application/json"},
client = new XMLHttpRequest(),
data = "",
f,results;
// Massage the data hashmap into a string
if(options.data) {
if(typeof options.data === "string") { // Already a string
data = options.data;
@ -252,6 +280,7 @@ TiddlyWebSyncer.prototype.httpRequest = function(options) {
data = results.join("&")
}
}
// Set up the state change handler
client.onreadystatechange = function() {
if(this.readyState === 4) {
if(this.status === 200) {
@ -263,7 +292,13 @@ TiddlyWebSyncer.prototype.httpRequest = function(options) {
options.callback(new Error("XMLHttpRequest error: " + this.status));
}
};
// Make the request
client.open(type,options.url,true);
if(headers) {
for(var h in headers) {
client.setRequestHeader(h,headers[h]);
}
}
if(data) {
client.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8");
}