mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2025-08-07 22:33:50 +00:00
Beginnings of support for syncing
This commit is contained in:
parent
030f16981a
commit
d7d6e59865
27
core/boot.js
27
core/boot.js
@ -116,19 +116,20 @@ $tw.config.fileExtensionInfo = {
|
|||||||
|
|
||||||
// Content type mappings
|
// Content type mappings
|
||||||
$tw.config.contentTypeInfo = {
|
$tw.config.contentTypeInfo = {
|
||||||
"application/x-tiddler": {encoding: "utf8"},
|
"text/x-tiddlywiki": {encoding: "utf8", extension: ".tid"},
|
||||||
"application/x-tiddler-html-div": {encoding: "utf8"},
|
"application/x-tiddler": {encoding: "utf8", extension: ".tid"},
|
||||||
"application/x-tiddlywiki-recipe": {encoding: "utf8"},
|
"application/x-tiddler-html-div": {encoding: "utf8", extension: ".tiddler"},
|
||||||
"text/plain": {encoding: "utf8"},
|
"application/x-tiddlywiki-recipe": {encoding: "utf8", extension: ".recipe"},
|
||||||
"text/css": {encoding: "utf8"},
|
"text/plain": {encoding: "utf8", extension: ".txt"},
|
||||||
"text/html": {encoding: "utf8"},
|
"text/css": {encoding: "utf8", extension: ".css"},
|
||||||
"application/javascript": {encoding: "utf8"},
|
"text/html": {encoding: "utf8", extension: ".html"},
|
||||||
"application/json": {encoding: "utf8"},
|
"application/javascript": {encoding: "utf8", extension: ".js"},
|
||||||
"application/pdf": {encoding: "base64"},
|
"application/json": {encoding: "utf8", extension: ".json"},
|
||||||
"image/jpeg": {encoding: "base64"},
|
"application/pdf": {encoding: "base64", extension: ".pdf"},
|
||||||
"image/png": {encoding: "base64"},
|
"image/jpeg": {encoding: "base64", extension: ".jpg"},
|
||||||
"image/gif": {encoding: "base64"},
|
"image/png": {encoding: "base64", extension: ".png"},
|
||||||
"image/svg+xml": {encoding: "utf8"}
|
"image/gif": {encoding: "base64", extension: ".gif"},
|
||||||
|
"image/svg+xml": {encoding: "utf8", extension: ".svg"}
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////// Utility functions
|
/////////////////////////// Utility functions
|
||||||
|
@ -36,6 +36,12 @@ exports["text/html"] = function(tiddlers) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
exports["application/x-tiddler"] = function(tiddlers) {
|
||||||
|
return mapEachTiddler(this,tiddlers,function(tiddler) {
|
||||||
|
return tiddler.getFieldStringBlock({exclude: ["text"]}) + "\n\n" + tiddler.fields.text;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
exports["application/x-tiddler-css"] = function(tiddlers) {
|
exports["application/x-tiddler-css"] = function(tiddlers) {
|
||||||
return mapEachTiddler(this,tiddlers,function(tiddler) {
|
return mapEachTiddler(this,tiddlers,function(tiddler) {
|
||||||
var attributes = {type: "text/css"}; // The script type is set to text/javascript for compatibility with old browsers
|
var attributes = {type: "text/css"}; // The script type is set to text/javascript for compatibility with old browsers
|
||||||
|
@ -40,6 +40,8 @@ exports.startup = function(loggedIn) {
|
|||||||
if(hadChanges) {
|
if(hadChanges) {
|
||||||
$tw.plugins.dropbox.saveTiddlerIndex("/" + $tw.plugins.dropbox.wikiName + "/index.html",function(error) {
|
$tw.plugins.dropbox.saveTiddlerIndex("/" + $tw.plugins.dropbox.wikiName + "/index.html",function(error) {
|
||||||
console.log("Saved tiddler index");
|
console.log("Saved tiddler index");
|
||||||
|
// Sync any subsequent tiddler changes
|
||||||
|
$tw.plugins.dropbox.setupSyncer($tw.wiki);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -3,7 +3,9 @@ title: $:/plugins/dropbox/dropbox.js
|
|||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: startup
|
module-type: startup
|
||||||
|
|
||||||
Startup the Dropbox integration plugin
|
Main Dropbox integration plugin
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
(function(){
|
(function(){
|
||||||
@ -20,7 +22,8 @@ var queryLoginMarker = "login=true";
|
|||||||
|
|
||||||
$tw.plugins.dropbox = {
|
$tw.plugins.dropbox = {
|
||||||
client: null, // Dropbox.js client object
|
client: null, // Dropbox.js client object
|
||||||
fileInfo: {}, // Hashmap of each file as retrieved from Dropbox: {versionTag:,title:}
|
fileInfo: {}, // Hashmap of each filename as retrieved from Dropbox: {versionTag:,title:}
|
||||||
|
titleInfo: {}, // Hashmap of each tiddler title retrieved from Dropbox to filename
|
||||||
titleIsLoggedIn: "$:/plugins/dropbox/IsLoggedIn",
|
titleIsLoggedIn: "$:/plugins/dropbox/IsLoggedIn",
|
||||||
titleUserName: "$:/plugins/dropbox/UserName",
|
titleUserName: "$:/plugins/dropbox/UserName",
|
||||||
titlePublicAppUrl: "$:/plugins/dropbox/PublicAppUrl",
|
titlePublicAppUrl: "$:/plugins/dropbox/PublicAppUrl",
|
||||||
@ -225,6 +228,7 @@ console.log("loading tiddler from",path);
|
|||||||
$tw.wiki.addTiddlers(tiddlers);
|
$tw.wiki.addTiddlers(tiddlers);
|
||||||
// Save the revision of the files so we can detect changes later
|
// Save the revision of the files so we can detect changes later
|
||||||
$tw.plugins.dropbox.fileInfo[mainStat.name] = {versionTag: mainStat.versionTag,title: tiddlers[0].title};
|
$tw.plugins.dropbox.fileInfo[mainStat.name] = {versionTag: mainStat.versionTag,title: tiddlers[0].title};
|
||||||
|
$tw.plugins.dropbox.titleInfo[tiddlers[0].title] = mainStat.name;
|
||||||
$tw.plugins.dropbox.fileInfo[stat.name] = {versionTag: stat.versionTag,title: tiddlers[0].title};
|
$tw.plugins.dropbox.fileInfo[stat.name] = {versionTag: stat.versionTag,title: tiddlers[0].title};
|
||||||
callback();
|
callback();
|
||||||
});
|
});
|
||||||
@ -233,6 +237,9 @@ console.log("loading tiddler from",path);
|
|||||||
$tw.wiki.addTiddlers(tiddlers);
|
$tw.wiki.addTiddlers(tiddlers);
|
||||||
// Save the revision of this file so we can detect changes
|
// Save the revision of this file so we can detect changes
|
||||||
$tw.plugins.dropbox.fileInfo[stat.name] = {versionTag: stat.versionTag,title: tiddlers[0].title};
|
$tw.plugins.dropbox.fileInfo[stat.name] = {versionTag: stat.versionTag,title: tiddlers[0].title};
|
||||||
|
for(t=0; t<tiddlers.length; t++) {
|
||||||
|
$tw.plugins.dropbox.titleInfo[tiddlers[t].title] = stat.name;
|
||||||
|
}
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -350,6 +357,75 @@ $tw.plugins.dropbox.saveTiddlerIndex = function(path,callback) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Setup synchronisation back to Dropbox
|
||||||
|
$tw.plugins.dropbox.setupSyncer = function(wiki) {
|
||||||
|
wiki.addEventListener("",function(changes) {
|
||||||
|
$tw.plugins.dropbox.syncChanges(changes,wiki);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$tw.plugins.dropbox.syncChanges = function(changes,wiki) {
|
||||||
|
// Create a queue of tasks to save or delete tiddlers
|
||||||
|
var q = async.queue($tw.plugins.dropbox.syncTask,2);
|
||||||
|
// Called when we've processed all the files
|
||||||
|
q.drain = function () {
|
||||||
|
};
|
||||||
|
// Process each of the changes
|
||||||
|
for(var title in changes) {
|
||||||
|
var tiddler = wiki.getTiddler(title),
|
||||||
|
filename = $tw.plugins.dropbox.titleInfo[title],
|
||||||
|
contentType = tiddler ? tiddler.fields.type : null;
|
||||||
|
contentType = contentType || "text/x-tiddlywiki";
|
||||||
|
var contentTypeInfo = $tw.config.contentTypeInfo[contentType],
|
||||||
|
isNew = false;
|
||||||
|
// Figure out the pathname of the tiddler
|
||||||
|
if(!filename) {
|
||||||
|
var extension = contentTypeInfo ? contentTypeInfo.extension : "";
|
||||||
|
filename = encodeURIComponent(title) + extension;
|
||||||
|
$tw.plugins.dropbox.titleInfo[title] = filename;
|
||||||
|
isNew = true;
|
||||||
|
}
|
||||||
|
// Push the appropriate task
|
||||||
|
if(tiddler) {
|
||||||
|
if(contentType === "text/x-tiddlywiki") {
|
||||||
|
// .tid file
|
||||||
|
q.push({
|
||||||
|
type: "save",
|
||||||
|
title: title,
|
||||||
|
path: $tw.plugins.dropbox.titleInfo[title],
|
||||||
|
content: wiki.serializeTiddlers([tiddler],"application/x-tiddler"),
|
||||||
|
isNew: isNew
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// main file plus meta file
|
||||||
|
q.push({
|
||||||
|
type: "save",
|
||||||
|
title: title,
|
||||||
|
path: $tw.plugins.dropbox.titleInfo[title],
|
||||||
|
content: tiddler.fields.text,
|
||||||
|
metadata: tiddler.getFieldStringBlock({exclude: ["text"]}),
|
||||||
|
isNew: isNew
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
q.push({
|
||||||
|
type: "delete",
|
||||||
|
title: title,
|
||||||
|
path: $tw.plugins.dropbox.titleInfo[title]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Perform a single sync task
|
||||||
|
$tw.plugins.dropbox.syncTask = function(task,callback) {
|
||||||
|
if(task.type === "delete") {
|
||||||
|
console.log("Deleting",task.path);
|
||||||
|
} else if(task.type === "save") {
|
||||||
|
console.log("Saving",task.path,task);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
exports.startup = function() {
|
exports.startup = function() {
|
||||||
if(!$tw.browser) {
|
if(!$tw.browser) {
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user