diff options
| -rw-r--r-- | config.js | 4 | ||||
| -rw-r--r-- | frontend.js | 80 | ||||
| -rw-r--r-- | main.js | 11 | ||||
| -rw-r--r-- | model_fs.js | 121 | 
4 files changed, 133 insertions, 83 deletions
@@ -2,7 +2,7 @@ exports.modelBackend = 'fs';  exports.Config = {  	dir: 'slideshows' ,  	template: 'template.html', -	description: 'desc', -	events: 'events', +	description: 'desc.js', +	events: 'events.js',  	defaultSlides: 'default'  }; diff --git a/frontend.js b/frontend.js index 5b2d486..0dba5b4 100644 --- a/frontend.js +++ b/frontend.js @@ -1,10 +1,6 @@ -var Connect = require('connect'); -var http = require('http'); -var url = require('url');  var path = require('path');  var fs = require('fs'); -var configuration;  var model;  exports.setModel = function(m) { @@ -12,37 +8,51 @@ exports.setModel = function(m) {  };  exports.start = function(config) { -	configuration = config; -	Connect.createServer( -		Connect.logger(), // Log responses to the terminal using Common Log Format. -		Connect.responseTime(), // Add a special header with timing information. -		Connect.staticCache(), -		Connect.static(path.join(__dirname, configuration.dir)), -		function(req, res) { -			var purl = url.parse(req.url, true); -			var slideset = 'default';  -			if(purl['query'].hasOwnProperty('slides')) { -				slideset = purl['query']['slides']; -			} -			model.getSlides(slideset, function(slides) { -				fs.readFile(path.join(__dirname, configuration.dir, slides['template']) , function(err,data) { -					if(err) { res.end(body); } -					var body = data.toString(); -					var slideStr = ''; -					for(var slide in slides['slides']) { -						if(!slides['slides'].hasOwnProperty(slide)) { continue; } -						if(slides['slides'][slide]['type'] === 'image') { -							slideStr = slideStr +'<li><img src="/'+slides['slides'][slide]['file']+'">'; -						} -						if(slides['slides'][slide]['text'].length > 0) { -							slideStr = slideStr+'<div class="transover"><h2>'+slides['slides'][slide]['head']+' - '+slides['slides'][slide]['text']+'</h2></div></img></li>'; -						} +	config.app.get('/slides/:id', function(req, res) { +		var slideset; +		slideset = req.params.id; +		model.getSlides(slideset, function(err, slides) { +			if(err) { throw err; } +			fs.readFile(path.join(__dirname, config.dir, slides['template']) , function(err,data) { +				if(err) { res.end(body); } +				var body = data.toString(); +				var slideStr = ''; +				for(var slide in slides['slides']) { +					if(!slides['slides'].hasOwnProperty(slide)) { continue; } +					if(slides['slides'][slide]['type'] === 'image') { +						slideStr = slideStr +'<li><img src="/'+slides['slides'][slide]['file']+'">'; +					} +					if(slides['slides'][slide]['text'].length > 0) { +						slideStr = slideStr+'<div class="transover"><h2>'+slides['slides'][slide]['head']+' - '+slides['slides'][slide]['text']+'</h2></div></img></li>';  					} -					body = body.replace("$IMAGES", slideStr); -					res.setHeader('Content-Length', body.length); -					res.end(body); -				}); +				} +				var eventStr = ''; +				for(var date in slides['events']) { +					if(!slides['events'].hasOwnProperty(date)) { continue; } +					eventStr = eventStr + '<h4>'+slides['events'][date]['date']+'</h4><hr><ul>'; +					for(var ev in slides['events'][date]['events']) { +						if(!slides['events'][date]['events'].hasOwnProperty(ev)) { continue; } +						eventStr = eventStr + '<li>'+slides['events'][date]['events'][ev]['time']+' - '+slides['events'][date]['events'][ev]['text']+'</li>'; +					} +					eventStr = eventStr + '</ul>'; +				} +				body = body.replace("$IMAGES", slideStr); +				body = body.replace("$EVENTS", eventStr); +				res.setHeader('Content-Length', body.length); +				res.end(body);  			}); -		} -	).listen(8080); +		}); +	}); +	config.app.get('*', function(req, res){ +		model.getAllSlides(function(slidesets) { +			var body = '<h3>Slideshows:</h3>'; +			for(var slideset in slidesets) { +				if(!slidesets.hasOwnProperty(slideset)) { continue; } +				body = body + '<a href="/slides/' + slidesets[slideset] + '">'+slidesets[slideset]+'</a><br/>'; +			} +			res.setHeader('Content-Length', body.length); +			res.end(body); +		}); +	}); +	config.app.listen(8080);  }; @@ -1,5 +1,7 @@  #! /usr/bin/env node +var path = require('path'); +  process.on('uncaughtException', function(err) {  	console.error('uncaughtException: ' + (err.stack || err.message || err.toString()));  }); @@ -7,6 +9,15 @@ process.on('uncaughtException', function(err) {  process.chdir(__dirname);  var config = require('./config'); +var express = require('express'); +var app = express.createServer(); + +app.use(express.logger()); +app.use(express.staticCache()); +app.use(express.static(path.join(__dirname, config.Config.dir))); + +config.Config.app = app; +  var model = require('./model_' + config.modelBackend);  model.start(config.Config); diff --git a/model_fs.js b/model_fs.js index 6f68e02..c8d04e2 100644 --- a/model_fs.js +++ b/model_fs.js @@ -1,83 +1,112 @@  var walk = require('walk');  var fs = require('fs');  var path = require('path'); +var walker; +var watcher;  var configuration;  var files = [];  exports.start = function(config) {  	configuration = config; -	var walker = walk.walk(configuration.dir, { followLinks: false }); -walker.on("directories", function (root, dirAr, next) { +	watcher = require('watch-tree').watchTree(configuration.dir, {'sample-rate': 5}); +	watcher.on('fileDeleted', exports.rebuildFiles); +	watcher.on('fileCreated', exports.rebuildFiles); +	watcher.on('fileModified', exports.rebuildFiles); +	exports.rebuildFiles(); + +}; + +exports.rebuildFiles = function() { + +	walker = walk.walk(configuration.dir, { followLinks: false }); + +	walker.on("directories", function (root, dirAr, next) {  	var lastDir = path.join(__dirname, root).split('/');  	if((lastDir.length - __dirname.split('/').length) < 2) {  		dirAr.forEach(function(dir) {  			files[dir.name] = { name: dir.name, template:  				path.join(configuration.defaultSlides, -				configuration.template) , slides: [] }; +				configuration.template) , slides: []};  		});  	}  	next(); -}).on("file", function (root, fileStats, next) { - -	if(fileStats.name == configuration.description) {  +	}).on("file", function(root, fileStats, next) { +		if(fileStats.name == configuration.description || fileStats.name == configuration.events) {   		next(); -	} -	else if(fileStats.name == configuration.template) { -		var lastDir = root.split('/'); -		files[lastDir[lastDir.length - 1]]['template'] = path.join(lastDir[lastDir.length - 1], fileStats.name); -		next(); -	} else { -		var lastDir = path.join(root).split('/'); -		if(files.hasOwnProperty(lastDir[lastDir.length - 1])) { -			var ext = path.extname(fileStats.name); -			var type = 'image'; -			switch (ext) { -				case '.mp4': -				case '.avi': -				case '.ogv': -				case '.mkv': -					type = 'video'; -					break; +		} +		else if(fileStats.name == configuration.template) { +			var lastDir = root.split('/'); +			files[lastDir[lastDir.length - 1]]['template'] = path.join(lastDir[lastDir.length - 1], fileStats.name); +			next(); +		} else { +			var lastDir = path.join(root).split('/'); +			if(files.hasOwnProperty(lastDir[lastDir.length - 1])) { +				var ext = path.extname(fileStats); +				var type = 'image'; +				switch (ext) { +					case '.mp4': +					case '.avi': +					case '.ogv': +					case '.mkv': +						type = 'video'; +						break; +				} +				files[lastDir[lastDir.length - 1]]['slides'].push({ type: type, file: path.join(lastDir[lastDir.length - 1], fileStats.name), head: '', text: ''});  			} -			files[lastDir[lastDir.length - 1]]['slides'].push({ type: type, file: path.join(lastDir[lastDir.length - 1], fileStats.name), head: '', text: ''}); +			next();  		} +	}).on("errors", function(root, nodeStatsArray, next) {  		next(); -	} -}).on("errors", function (root, nodeStatsArray, next) { -	next(); -}).on("end", function () { - -	for(var slideset in files) { -		if(!files.hasOwnProperty(slideset)) { continue; } -		var data = fs.readFileSync(__dirname+'/'+configuration.dir+'/'+slideset+'/desc'); -		var descs = data.toString().split('\n'); -		for(var file in files[slideset]['slides']) { -			if(!files[slideset]['slides'].hasOwnProperty(file)) { continue; } -			if(!files[slideset]['slides'][file].hasOwnProperty('file')) { continue; } -			for(var desc in descs) { -				if(!descs.hasOwnProperty(desc)) { continue; } -				var info = descs[desc].split('|'); -				var comp = files[slideset]['slides'][file]['file'].split('/'); -				if(info[0] === comp[comp.length - 1]) { -					files[slideset]['slides'][file]['head'] = info[1]; -					files[slideset]['slides'][file]['text'] = info[2]; +	}).on("end", function() { +		for(var slideset in files) { +			if(!files.hasOwnProperty(slideset)) { continue; } +			try {  +				var data = fs.readFileSync(path.join(__dirname, configuration.dir, slideset, configuration.description)); +			} catch(e) { +				console.log(e.toString()); +			} +			var descs = JSON.parse(data.toString()); +			for(var file in files[slideset]['slides']) { +				if(!files[slideset]['slides'].hasOwnProperty(file)) { continue; } +				if(!files[slideset]['slides'][file].hasOwnProperty('file')) { continue; } +				for(var desc in descs) { +					if(!descs.hasOwnProperty(desc)) { continue; }	 +						var comp = files[slideset]['slides'][file]['file'].split('/'); +					if(descs[desc]['file'] == comp[comp.length - 1]) { +						files[slideset]['slides'][file]['head'] = descs[desc]['head']; +						files[slideset]['slides'][file]['text'] = descs[desc]['text']; +					}  				}  			} +			try {  +				data = fs.readFileSync(path.join(__dirname, configuration.dir, 'default', configuration.events)); +			} catch(e) { +				console.log(e.toString()); +			} +			files[slideset]['events'] = JSON.parse(data.toString());  		} -	} -}); +	});  }; +  exports.getSlides = function(slideset, cb) {  	for (var searchset in files) {  		if(!files.hasOwnProperty(searchset)) { continue; }  		if(files[searchset].name == slideset) { -			cb(files[searchset]); +			cb(null, files[searchset]);  		}  	}  }; +exports.getAllSlides = function(cb) { +	var slidesets = []; +	for(var slideset in files) { +		if(!files.hasOwnProperty(slideset)) { continue; } +		slidesets.push(files[slideset].name); +	} +	cb(slidesets); +};  | 
