mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-12-24 00:50:28 +00:00
Support for lazy loaded tiddlers
This commit is contained in:
parent
17334f64cc
commit
5c87b437ee
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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":
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
||||
|
@ -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");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user