/*\ title: js/LocalFileSync.js Loads tiddlers from a given directory, and then keeps the files up to date as tiddlers are modified, created or deleted. \*/ (function(){ /*jslint node: true */ "use strict"; var retrieveFile = require("./FileRetriever.js").retrieveFile, utils = require("./Utils.js"), fs = require("fs"), path = require("path"), url = require("url"), util = require("util"), async = require("async"); function LocalFileSync(dirpath,store,callback) { this.dirpath = dirpath; this.store = store; this.callback = callback; this.tiddlers = {}; // A hashmap of : {changeCount: , files: [name]} var self = this, sanitizeFilepath = function(filepath) { return filepath.replace(/\//mg,"-"); }; // Set up a queue for loading tiddler files, tasks are {filepath:,callback:} this.loadQueue = async.queue(function(task,callback) { task.files = []; retrieveFile(task.filepath,self.dirpath,function(err,data) { if(err) { callback(err); } else { task.files.push(task.filepath); // Use the filepath as the default title for the tiddler var fields = { title: data.path }; var tiddlers = self.store.deserializeTiddlers(data.extname,data.text,fields); // Check for the .meta file if(data.extname !== ".json" && tiddlers.length === 1) { var metafile = task.filepath + ".meta"; retrieveFile(metafile,self.dirpath,function(err,data) { if(err && err.code !== "ENOENT" && err.code !== "404") { callback(err); } else { task.files.push(metafile); var fields = tiddlers[0]; if(!err) { var text = data.text.split("\n\n")[0]; if(text) { fields = self.store.deserializeTiddlers("application/x-tiddler",text,fields)[0]; } } task.callback(task,[fields]); callback(null); } }); } else { task.callback(task,tiddlers); callback(null); } } }); },10); // Call the callback when all the files are loaded this.loadQueue.drain = function() { callback(null); }; // Query the folder content to get all the tiddlers fs.readdir(this.dirpath,function(err,files) { if(err) { callback(err); } else { var loadCallback = function(task,tiddlers) { for(var t=0; t tiddlerInfo.changeCount) { files = self.store.serializeTiddlers([tiddler],"application/x-tiddler"); for(t=0; t