From 00ab52f9d6f91e9f272939a0953a1b05cd51ceb2 Mon Sep 17 00:00:00 2001 From: "Ben Ward (TGAC)" Date: Tue, 17 Nov 2015 13:17:00 +0000 Subject: [PATCH 01/24] Changed load_collection to return slides as objects consisting of attributes and body, without editing the body, since body editing will be the job of the preprocessors. --- lib/slidewinder.js | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/lib/slidewinder.js b/lib/slidewinder.js index fa03b10..c34a166 100644 --- a/lib/slidewinder.js +++ b/lib/slidewinder.js @@ -1,11 +1,11 @@ -var fs = require('fs') - , path = require('path') - , fm = require('front-matter') - , handlebars = require('handlebars') - , _ = require('lodash') - , mkdirp = require('mkdirp') - , logger = require('./log.js') - , yaml = require('js-yaml'); +var fs = require('fs'), + path = require('path'), + fm = require('front-matter'), + handlebars = require('handlebars'), + _ = require('lodash'), + mkdirp = require('mkdirp'), + logger = require('./log.js'), + yaml = require('js-yaml'); var log_colours = { silly: 'magenta', @@ -20,6 +20,10 @@ var log_colours = { error: 'red' }; + + + + var slidewinder = function(data) { // load the slides @@ -50,31 +54,22 @@ var slidewinder = function(data) { // load a slide collection var load_collection = function(data) { - var collection = {}; var dirpath = data.collection; - // load each slide, parse the frontmatter, and collect - fs.readdirSync(data.collection).forEach(function(file) { + fs.readdirSync(dirpath).forEach(function(file) { var filepath = path.resolve(dirpath, file); var data = fs.readFileSync(filepath, 'utf8'); var slide = fm(data); - slide.attributes.author = - // TODO: check front matter is present and parsed ok - slide.body = yaml.dump(slide.attributes) + '\n' + slide.body; - // TODO: check required metadata is present var name = slide.attributes.name; if (collection[name]) { - log.error('Multiple slides have the nane', name); + log.error('Multiple slides have the name', name); } else { collection[name] = slide; } }); - log.info('loaded', Object.keys(collection).length, 'slides from', dirpath); - return collection; - } // pick out slides from a collection From 305615ac0db1861b2780de88a3c3091c7c123444 Mon Sep 17 00:00:00 2001 From: "Ben Ward (TGAC)" Date: Tue, 17 Nov 2015 13:41:36 +0000 Subject: [PATCH 02/24] Added SlideFramework object. --- bin/slidewinder.js | 2 ++ lib/slidewinder.js | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/bin/slidewinder.js b/bin/slidewinder.js index db34a14..95849e9 100755 --- a/bin/slidewinder.js +++ b/bin/slidewinder.js @@ -14,6 +14,8 @@ program 'Path to save output (will create directory)') .option('-t, --title ', 'Title of the deck') .option('-a, --author <name>', 'Deck author') +.option('-f, --framework <framework>', + 'HTML and JS Framework or plugin to use for slideshow generation.') .parse(process.argv); if (!process.argv.slice(2).length) { diff --git a/lib/slidewinder.js b/lib/slidewinder.js index c34a166..f63778d 100644 --- a/lib/slidewinder.js +++ b/lib/slidewinder.js @@ -21,6 +21,11 @@ var log_colours = { }; +// Function for setting the framework/plugin used to create the slideshow. +var SlideFramework = function(framework) { + var framework_path = path.join(__dirname, "frameworks", framework); + this.helpers = require(framework_path); +} From cf45972c2426e997a8a1347d739e6323ed1773c2 Mon Sep 17 00:00:00 2001 From: "Ben Ward (TGAC)" <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 14:41:29 +0000 Subject: [PATCH 03/24] Minor edits to files. --- lib/slidewinder.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/slidewinder.js b/lib/slidewinder.js index f63778d..5ee01a2 100644 --- a/lib/slidewinder.js +++ b/lib/slidewinder.js @@ -1,3 +1,5 @@ +/// Slidewinder-Lib. + var fs = require('fs'), path = require('path'), fm = require('front-matter'), @@ -22,14 +24,34 @@ var log_colours = { // Function for setting the framework/plugin used to create the slideshow. + var SlideFramework = function(framework) { var framework_path = path.join(__dirname, "frameworks", framework); this.helpers = require(framework_path); } +// A Framework can... + +// Register helpers for use in the handlebars HTML template. +SlideFramework.registerHelpers = function() { + var that = this; + + // register each helper + Object.keys(that.helpers).forEach(function(key) { + handlebars.registerHelper(key, that.helpers[key];); + }); +} + +// Main function and execution of slidewinder. var slidewinder = function(data) { + console.log(data); + process.exit(); + + + + // load the slides var collection = load_collection(data); From c3221da9140f162c67e87d851ab7180ad41c47be Mon Sep 17 00:00:00 2001 From: "Ben Ward (TGAC)" <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 17:28:02 +0000 Subject: [PATCH 04/24] Made progress on getting plugins to load properly... --- bin/slidewinder.js | 18 ++++-- .../frameworks/remark/templates}/remark.html | 0 lib/slidewinder.js | 63 ++++++++++--------- 3 files changed, 49 insertions(+), 32 deletions(-) rename {templates => extensions/frameworks/remark/templates}/remark.html (100%) diff --git a/bin/slidewinder.js b/bin/slidewinder.js index 95849e9..d62a938 100755 --- a/bin/slidewinder.js +++ b/bin/slidewinder.js @@ -1,13 +1,23 @@ #!/usr/bin/env node -var program = require('commander') - , slidewinder = require('../lib/slidewinder.js'); +var program = require('commander'), + path = require('path'), + slidewinder = require('../lib/slidewinder.js'); var pjson = require('../package.json'); +// Functions for co-ercing command line arguments into suitable formats. +function list(val) { + return val.split(','); +} + +function fwpath(framework) { + return path.resolve(__dirname, "../extensions/frameworks", framework); +} + program .version(pjson.version) .option('-s, --slides <slide list>', - 'Comma-separated list of slides to use (no spaces)') + 'Comma-separated list of slides to use (no spaces)', list) .option('-c, --collection <path>', 'Path to slide collection') .option('-o, --output <path>', @@ -15,7 +25,7 @@ program .option('-t, --title <title>', 'Title of the deck') .option('-a, --author <name>', 'Deck author') .option('-f, --framework <framework>', - 'HTML and JS Framework or plugin to use for slideshow generation.') + 'HTML and JS Framework or plugin to use for slideshow generation.', fwpath) .parse(process.argv); if (!process.argv.slice(2).length) { diff --git a/templates/remark.html b/extensions/frameworks/remark/templates/remark.html similarity index 100% rename from templates/remark.html rename to extensions/frameworks/remark/templates/remark.html diff --git a/lib/slidewinder.js b/lib/slidewinder.js index 5ee01a2..df57074 100644 --- a/lib/slidewinder.js +++ b/lib/slidewinder.js @@ -22,40 +22,54 @@ var log_colours = { error: 'red' }; +// Function for loading the framework/plugin used to create the slideshow. +var SlideFramework = function(framework_path) { + log.info('Looking for presentation framework in: ', framework_path); + var fw = this; + // Load the templates designed for the plugin. + fw.templates = {}; + fs.readdir(path.join(framework_path, 'templates'), function(err, files){ + if(err){ + console.log(err); + } + files.forEach(function(f){ + console.log(f); + fw.templates[f] = fs.readFileSync(f, 'utf8'); + }); + }); -// Function for setting the framework/plugin used to create the slideshow. -var SlideFramework = function(framework) { - var framework_path = path.join(__dirname, "frameworks", framework); - this.helpers = require(framework_path); + + //this.helpers = require(framework_path); } // A Framework can... - // Register helpers for use in the handlebars HTML template. SlideFramework.registerHelpers = function() { var that = this; - // register each helper Object.keys(that.helpers).forEach(function(key) { - handlebars.registerHelper(key, that.helpers[key];); + handlebars.registerHelper(key, that.helpers[key]); }); } // Main function and execution of slidewinder. -var slidewinder = function(data) { - console.log(data); - process.exit(); +var slidewinder = function(sessiondata) { + // Load the slides, and select the ones desired. + var allslides = load_collection(sessiondata.collection); + sessiondata.slideset = pick_slides(allslides, sessiondata.slides); - // load the slides - var collection = load_collection(data); - data.slideset = pick_slides(collection, data.slides); + // Load the Plugin for the framework that will be used. + var plugin = SlideFramework(sessiondata.framework); + console.log(plugin); + process.exit(); + // load the template var rel_path = '../templates/remark.html'; @@ -79,10 +93,9 @@ var slidewinder = function(data) { } -// load a slide collection -var load_collection = function(data) { +// load a Markdown format slide collection +var load_collection = function(dirpath) { var collection = {}; - var dirpath = data.collection; // load each slide, parse the frontmatter, and collect fs.readdirSync(dirpath).forEach(function(file) { var filepath = path.resolve(dirpath, file); @@ -95,29 +108,23 @@ var load_collection = function(data) { collection[name] = slide; } }); - log.info('loaded', Object.keys(collection).length, 'slides from', dirpath); + log.info('Loaded', Object.keys(collection).length, 'markdown slide files from', dirpath); return collection; } // pick out slides from a collection -var pick_slides = function(collection, slidestr) { - - var slides = slidestr.split(','); +var pick_slides = function(collection, selections) { var picked = []; - - slides.forEach(function(slidename) { - var slide = collection[slidename]; + selections.forEach(function(selection) { + var slide = collection[selection]; if (slide) { picked.push(slide); } else { - log.error('No slide found with name', slidename); + log.error('No slide found with name', name); } }); - - log.info('picked', picked.length, 'slides from collection'); - + log.info('Picked', picked.length, 'slides from collection'); return picked; - } // save a rendered slide deck From 77cf16b8f0443b15731489aa7e02262a525eae4b Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 22:38:28 +0000 Subject: [PATCH 05/24] Translated current code to CoffeeScript --- bin/slidewinder.coffee | 36 +++++++++++++++++++ bin/slidewinder.js | 5 +++ lib/slidewinder.js | 6 ++-- lib/slidewinder_lib.coffee | 73 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 bin/slidewinder.coffee create mode 100644 lib/slidewinder_lib.coffee diff --git a/bin/slidewinder.coffee b/bin/slidewinder.coffee new file mode 100644 index 0000000..0e14ae6 --- /dev/null +++ b/bin/slidewinder.coffee @@ -0,0 +1,36 @@ +#!/usr/bin/env node + +program = require 'commander' +path = require 'path' +slidewinder = require '../lib/slidewinder.js' + +pjson = require '../package.json' + +# Functions for co-ercing command line arguments into suitable formats. +list = (val) -> + val.split ',' + + +fwpath = (framework) -> + path.resolve __dirname, "../extensions/frameworks", framework + + +program +.version(pjson.version) +.option('-s, --slides <slide list>', + 'Comma-separated list of slides to use (no spaces)', list) +.option('-c, --collection <path>', + 'Path to slide collection') +.option('-o, --output <path>', + 'Path to save output (will create directory)') +.option('-t, --title <title>', 'Title of the deck') +.option('-a, --author <name>', 'Deck author') +.option('-f, --framework <framework>', + 'HTML and JS Framework or plugin to use for slideshow generation.', fwpath) +.parse process.argv + +unless process.argv.slice(2).length then program.help() + +program.framework ?= 'remark' + +slidewinder program diff --git a/bin/slidewinder.js b/bin/slidewinder.js index d62a938..edbcb22 100755 --- a/bin/slidewinder.js +++ b/bin/slidewinder.js @@ -1,4 +1,5 @@ #!/usr/bin/env node + var program = require('commander'), path = require('path'), slidewinder = require('../lib/slidewinder.js'); @@ -32,4 +33,8 @@ if (!process.argv.slice(2).length) { program.help(); } +if (!program.framework) { + program.framework = 'remark'; +} + slidewinder(program); diff --git a/lib/slidewinder.js b/lib/slidewinder.js index df57074..fd0d25c 100644 --- a/lib/slidewinder.js +++ b/lib/slidewinder.js @@ -28,6 +28,7 @@ var SlideFramework = function(framework_path) { var fw = this; // Load the templates designed for the plugin. fw.templates = {}; + console.log(framework_path); fs.readdir(path.join(framework_path, 'templates'), function(err, files){ if(err){ console.log(err); @@ -62,12 +63,9 @@ var slidewinder = function(sessiondata) { var allslides = load_collection(sessiondata.collection); sessiondata.slideset = pick_slides(allslides, sessiondata.slides); - - - // Load the Plugin for the framework that will be used. var plugin = SlideFramework(sessiondata.framework); - console.log(plugin); + //console.log(plugin); process.exit(); diff --git a/lib/slidewinder_lib.coffee b/lib/slidewinder_lib.coffee new file mode 100644 index 0000000..8f485aa --- /dev/null +++ b/lib/slidewinder_lib.coffee @@ -0,0 +1,73 @@ +# Slidewinder-Lib. + +fs = require 'fs' +path = require 'path' +fm = require 'front-matter' +handlebars = require 'handlebars' +_ = require 'lodash' +mkdirp = require 'mkdirp' +logger = require './log.js' +yaml = require 'js-yaml' + + +log_colours = + silly: 'magenta' + input: 'grey' + verbose: 'cyan' + prompt: 'grey' + debug: 'blue' + info: 'green' + data: 'grey' + help: 'cyan' + warn: 'yellow' + error: 'red' + + +# Load a Markdown format slide collection +load_collection = (dirpath) -> + collection = {} + # Load each slide, parse the frontmatter, and collect. + fs.readdirSync(dirpath).forEach (file) -> + filepath = path.resolve dirpath, file + data = fs.readFileSync filepath, 'utf8' + slide = fm data + name = slide.attributes.name + if collection[name] + log.error 'Multiple slides have the name', name + else + collection[name] = slide + log.info 'Loaded', Object.keys(collection).length, 'markdown slide files from', dirpath + collection + + +pick_slides = (collection, selections) -> + picked = [] + selections.forEach (selection) -> + slide = collection[selection] + if slide + picked.push slide + else + log.error 'No slide found with name', name + log.info 'Picked', picked.length, 'slides from collection' + picked + + +PresentationFramework = (framework_path) -> + log.info 'Looking for presentation framework in: ', framework_path + fw = @ + fw.templates = {} + console.log framework_path + fs.readdir path.join(framework_path, 'templates'), (err, files) -> + f err then console.log err + files.forEach (f) -> + console.log f + fw.templates[f] = fs.readFileSync f, 'utf8' + fw.helpers = require framework_path + + +# A Framework can... +# Register helpers for use in the handlebars HTML template. +PresentationFramework.registerHelpers = () -> + var fw = @ + Object.keys(fw.helpers).forEach (key) -> + handlebars.registerHelper key, fw.helpers[key] From d013ec4d39961d34c0f178f460e202e8e20c44f3 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 22:42:50 +0000 Subject: [PATCH 06/24] Moved coffeescript files to src directory --- {bin => src/bin}/slidewinder.coffee | 0 {lib => src/lib}/slidewinder_lib.coffee | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {bin => src/bin}/slidewinder.coffee (100%) rename {lib => src/lib}/slidewinder_lib.coffee (100%) diff --git a/bin/slidewinder.coffee b/src/bin/slidewinder.coffee similarity index 100% rename from bin/slidewinder.coffee rename to src/bin/slidewinder.coffee diff --git a/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee similarity index 100% rename from lib/slidewinder_lib.coffee rename to src/lib/slidewinder_lib.coffee From 6c6bb8a5eb54ff734e67f442aec1f3e0d71c2735 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 23:10:45 +0000 Subject: [PATCH 07/24] Added log part of lib as coffeescript --- src/lib/log.coffee | 45 ++++++++++++++++++++++++++++++++++ src/lib/slidewinder_lib.coffee | 26 ++++++++++++++++++-- 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/lib/log.coffee diff --git a/src/lib/log.coffee b/src/lib/log.coffee new file mode 100644 index 0000000..a7c907d --- /dev/null +++ b/src/lib/log.coffee @@ -0,0 +1,45 @@ +winston = require 'winston' + +levels = + silly: 0 + input: 1 + verbose: 2 + prompt: 3 + debug: 4 + data: 5 + info: 6 + help: 7 + warn: 8 + error: 9 + + +colours = + silly: 'magenta' + input: 'grey' + verbose: 'cyan' + prompt: 'grey' + debug: 'blue' + info: 'green' + data: 'grey' + help: 'cyan' + warn: 'yellow' + error: 'red' + + +# Create a pretty logger +logger = () -> + log = new (winston.Logger)({ + transports: [new winston.transports.Console({ + level: 'info' + levels: levels + colorize: true + })] + level: 'info' + levels: levels + colorize: true + }) + + winston.addColors colours + log + +module.exports = logger diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index 8f485aa..a23d9b8 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -58,7 +58,7 @@ PresentationFramework = (framework_path) -> fw.templates = {} console.log framework_path fs.readdir path.join(framework_path, 'templates'), (err, files) -> - f err then console.log err + if err then console.log err files.forEach (f) -> console.log f fw.templates[f] = fs.readFileSync f, 'utf8' @@ -68,6 +68,28 @@ PresentationFramework = (framework_path) -> # A Framework can... # Register helpers for use in the handlebars HTML template. PresentationFramework.registerHelpers = () -> - var fw = @ + fw = @ Object.keys(fw.helpers).forEach (key) -> handlebars.registerHelper key, fw.helpers[key] + + +# Function executes the main slidewinder flow. +slidewinder = (sessiondata) -> + # Load the slides, and select the ones desired. + allslides = load_collection sessiondata.collection + sessiondata.slideset = pick_slides allslides, sessiondata.slides + + # Load the Plugin for the framework that will be used. + plugin = SlideFramework(sessiondata.framework); + console.log plugin + process.exit() + + renderer = handlebars.compile(template); + + + + // render and save + var deck = renderer(data); + save_deck(deck, data); + +} From dbfc006c489669d3b4ddbb83f735aa402e3eb8d7 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 23:27:36 +0000 Subject: [PATCH 08/24] Added cakefile and corrected some errors --- Cakefile | 26 ++++++ bin/slidewinder.js | 40 --------- lib/log.js | 49 ----------- lib/slidewinder.js | 148 --------------------------------- src/lib/slidewinder_lib.coffee | 15 ++-- 5 files changed, 31 insertions(+), 247 deletions(-) create mode 100644 Cakefile delete mode 100755 bin/slidewinder.js delete mode 100644 lib/log.js delete mode 100644 lib/slidewinder.js diff --git a/Cakefile b/Cakefile new file mode 100644 index 0000000..c83babb --- /dev/null +++ b/Cakefile @@ -0,0 +1,26 @@ +fs = require 'fs' + +{print} = require 'sys' +{spawn} = require 'child_process' + +buildlib = (callback) -> + coffee = spawn 'coffee', ['-c', '-o', 'lib/', 'src/lib/'] + coffee.stderr.on 'data', (data) -> + process.stderr.write data.toString() + coffee.stdout.on 'data', (data) -> + console.log data.toString() + coffee.on 'exit', (code) -> + callback?() if code is 0 + +buildbin = (callback) -> + coffee = spawn 'coffee', ['-c', '-o', 'bin/', 'src/bin/'] + coffee.stderr.on 'data', (data) -> + process.stderr.write data.toString() + coffee.stdout.on 'data', (data) -> + console.log data.toString() + coffee.on 'exit', (code) -> + callback?() if code is 0 + +task 'build', 'Build lib JS files from src directory', -> + buildlib() + buildbin() diff --git a/bin/slidewinder.js b/bin/slidewinder.js deleted file mode 100755 index edbcb22..0000000 --- a/bin/slidewinder.js +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env node - -var program = require('commander'), - path = require('path'), - slidewinder = require('../lib/slidewinder.js'); - -var pjson = require('../package.json'); - -// Functions for co-ercing command line arguments into suitable formats. -function list(val) { - return val.split(','); -} - -function fwpath(framework) { - return path.resolve(__dirname, "../extensions/frameworks", framework); -} - -program -.version(pjson.version) -.option('-s, --slides <slide list>', - 'Comma-separated list of slides to use (no spaces)', list) -.option('-c, --collection <path>', - 'Path to slide collection') -.option('-o, --output <path>', - 'Path to save output (will create directory)') -.option('-t, --title <title>', 'Title of the deck') -.option('-a, --author <name>', 'Deck author') -.option('-f, --framework <framework>', - 'HTML and JS Framework or plugin to use for slideshow generation.', fwpath) -.parse(process.argv); - -if (!process.argv.slice(2).length) { - program.help(); -} - -if (!program.framework) { - program.framework = 'remark'; -} - -slidewinder(program); diff --git a/lib/log.js b/lib/log.js deleted file mode 100644 index d00f5b4..0000000 --- a/lib/log.js +++ /dev/null @@ -1,49 +0,0 @@ -var winston = require('winston'); - -var levels = { - silly: 0, - input: 1, - verbose: 2, - prompt: 3, - debug: 4, - data: 5, - info: 6, - help: 7, - warn: 8, - error: 9 -}; - -var colours = { - silly: 'magenta', - input: 'grey', - verbose: 'cyan', - prompt: 'grey', - debug: 'blue', - info: 'green', - data: 'grey', - help: 'cyan', - warn: 'yellow', - error: 'red' -}; - -// create a pretty logger -var logger = function() { - - var log = new (winston.Logger)({ - transports: [new winston.transports.Console({ - level: 'info', - levels: levels, - colorize: true - })], - level: 'info', - levels: levels, - colorize: true - }); - - winston.addColors(colours); - - return log; - -} - -module.exports = logger; diff --git a/lib/slidewinder.js b/lib/slidewinder.js deleted file mode 100644 index fd0d25c..0000000 --- a/lib/slidewinder.js +++ /dev/null @@ -1,148 +0,0 @@ -/// Slidewinder-Lib. - -var fs = require('fs'), - path = require('path'), - fm = require('front-matter'), - handlebars = require('handlebars'), - _ = require('lodash'), - mkdirp = require('mkdirp'), - logger = require('./log.js'), - yaml = require('js-yaml'); - -var log_colours = { - silly: 'magenta', - input: 'grey', - verbose: 'cyan', - prompt: 'grey', - debug: 'blue', - info: 'green', - data: 'grey', - help: 'cyan', - warn: 'yellow', - error: 'red' -}; - -// Function for loading the framework/plugin used to create the slideshow. -var SlideFramework = function(framework_path) { - log.info('Looking for presentation framework in: ', framework_path); - var fw = this; - // Load the templates designed for the plugin. - fw.templates = {}; - console.log(framework_path); - fs.readdir(path.join(framework_path, 'templates'), function(err, files){ - if(err){ - console.log(err); - } - files.forEach(function(f){ - console.log(f); - fw.templates[f] = fs.readFileSync(f, 'utf8'); - }); - }); - - - - //this.helpers = require(framework_path); -} - -// A Framework can... -// Register helpers for use in the handlebars HTML template. -SlideFramework.registerHelpers = function() { - var that = this; - // register each helper - Object.keys(that.helpers).forEach(function(key) { - handlebars.registerHelper(key, that.helpers[key]); - }); -} - - - -// Main function and execution of slidewinder. -var slidewinder = function(sessiondata) { - - // Load the slides, and select the ones desired. - var allslides = load_collection(sessiondata.collection); - sessiondata.slideset = pick_slides(allslides, sessiondata.slides); - - // Load the Plugin for the framework that will be used. - var plugin = SlideFramework(sessiondata.framework); - //console.log(plugin); - process.exit(); - - - // load the template - var rel_path = '../templates/remark.html'; - var template_path = path.resolve(__dirname, rel_path); - var template = fs.readFileSync(template_path, 'utf8'); - var renderer = handlebars.compile(template); - - // register the winder - handlebars.registerHelper('slidewinder', function(all) { - - var bodies = all.data.root.slideset.map(function(x) { - return x.body; - }); - return bodies.join('\n---\n'); - - }); - - // render and save - var deck = renderer(data); - save_deck(deck, data); - -} - -// load a Markdown format slide collection -var load_collection = function(dirpath) { - var collection = {}; - // load each slide, parse the frontmatter, and collect - fs.readdirSync(dirpath).forEach(function(file) { - var filepath = path.resolve(dirpath, file); - var data = fs.readFileSync(filepath, 'utf8'); - var slide = fm(data); - var name = slide.attributes.name; - if (collection[name]) { - log.error('Multiple slides have the name', name); - } else { - collection[name] = slide; - } - }); - log.info('Loaded', Object.keys(collection).length, 'markdown slide files from', dirpath); - return collection; -} - -// pick out slides from a collection -var pick_slides = function(collection, selections) { - var picked = []; - selections.forEach(function(selection) { - var slide = collection[selection]; - if (slide) { - picked.push(slide); - } else { - log.error('No slide found with name', name); - } - }); - log.info('Picked', picked.length, 'slides from collection'); - return picked; -} - -// save a rendered slide deck -var save_deck = function(deck, data) { - - mkdirp(data.output); - - // write deck - var deckpath = path.resolve(data.output, 'index.html'); - fs.writeFileSync(deckpath, deck); - - // write slidewinder data - var datapath = path.resolve(data.output, 'deck.json'); - fs.writeFileSync(datapath, JSON.stringify(data, null, 2)); - - var msg = 'deck (index.html) and data (deck.json) saved to'; - log.info(msg, data.output); - -} - -var log = logger(); - -module.exports = slidewinder; diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index a23d9b8..342d794 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -80,16 +80,11 @@ slidewinder = (sessiondata) -> sessiondata.slideset = pick_slides allslides, sessiondata.slides # Load the Plugin for the framework that will be used. - plugin = SlideFramework(sessiondata.framework); + plugin = SlideFramework(sessiondata.framework) console.log plugin process.exit() - renderer = handlebars.compile(template); - - - - // render and save - var deck = renderer(data); - save_deck(deck, data); - -} + renderer = handlebars.compile(template) + # Render and save + deck = renderer(data) + save_deck(deck, data) From 2730dcdc6741414b4412fd7f822ad1b43607b02c Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 23:31:52 +0000 Subject: [PATCH 09/24] Corrected some errors --- src/bin/slidewinder.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/slidewinder.coffee b/src/bin/slidewinder.coffee index 0e14ae6..a4a952d 100644 --- a/src/bin/slidewinder.coffee +++ b/src/bin/slidewinder.coffee @@ -2,7 +2,7 @@ program = require 'commander' path = require 'path' -slidewinder = require '../lib/slidewinder.js' +slidewinder = require '../lib/slidewinder_lib.js' pjson = require '../package.json' From 9cc04819aab45be994631490abcafd7784fdca70 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 23:34:59 +0000 Subject: [PATCH 10/24] Added module exports to lib coffeefile. --- src/lib/slidewinder_lib.coffee | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index 342d794..bf24a4d 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -88,3 +88,8 @@ slidewinder = (sessiondata) -> # Render and save deck = renderer(data) save_deck(deck, data) + + +log = logger() + +module.exports = slidewinder From dc584ad3b0ec1e3421a51a3f36c87064885a648d Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 23:41:51 +0000 Subject: [PATCH 11/24] Corrected whitespace error in log.coffee --- src/lib/log.coffee | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib/log.coffee b/src/lib/log.coffee index a7c907d..4414b65 100644 --- a/src/lib/log.coffee +++ b/src/lib/log.coffee @@ -38,8 +38,7 @@ logger = () -> levels: levels colorize: true }) - - winston.addColors colours - log + winston.addColors colours + log module.exports = logger From 034b97c48ff16438e35e634cfef2106934f6ffda Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 23:42:47 +0000 Subject: [PATCH 12/24] Corrected whitespace error in slidewinder lib coffee file --- src/lib/slidewinder_lib.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index bf24a4d..6be4581 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -80,7 +80,7 @@ slidewinder = (sessiondata) -> sessiondata.slideset = pick_slides allslides, sessiondata.slides # Load the Plugin for the framework that will be used. - plugin = SlideFramework(sessiondata.framework) + plugin = PresentationFramework(sessiondata.framework) console.log plugin process.exit() From e72ffa2f5d41debc338da74fd2b378d68ab3f5cf Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Tue, 17 Nov 2015 23:46:16 +0000 Subject: [PATCH 13/24] Pass a correct default framework path to the rest of the app. --- src/bin/slidewinder.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/slidewinder.coffee b/src/bin/slidewinder.coffee index a4a952d..6fd2149 100644 --- a/src/bin/slidewinder.coffee +++ b/src/bin/slidewinder.coffee @@ -31,6 +31,6 @@ program unless process.argv.slice(2).length then program.help() -program.framework ?= 'remark' +program.framework ?= fwpath 'remark' slidewinder program From 04e1e274834a0a8b3cfb584f10e4f56b566efcd1 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Wed, 18 Nov 2015 01:07:26 +0000 Subject: [PATCH 14/24] Edits to json, completed test setup of remark plugin. --- bin/cmdline.js | 3 +++ extensions/frameworks/remark/helpers.js | 6 +++++ .../{templates/remark.html => template.html} | 0 package.json | 2 +- src/bin/slidewinder.coffee | 1 - src/lib/slidewinder_lib.coffee | 26 +++++++++---------- 6 files changed, 23 insertions(+), 15 deletions(-) create mode 100755 bin/cmdline.js create mode 100644 extensions/frameworks/remark/helpers.js rename extensions/frameworks/remark/{templates/remark.html => template.html} (100%) diff --git a/bin/cmdline.js b/bin/cmdline.js new file mode 100755 index 0000000..49cedba --- /dev/null +++ b/bin/cmdline.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('./slidewinder.js')(); diff --git a/extensions/frameworks/remark/helpers.js b/extensions/frameworks/remark/helpers.js new file mode 100644 index 0000000..b08a10d --- /dev/null +++ b/extensions/frameworks/remark/helpers.js @@ -0,0 +1,6 @@ + +module.exports = { + lool: function(){ + console.log("HIIIIIIII!"); + } +} diff --git a/extensions/frameworks/remark/templates/remark.html b/extensions/frameworks/remark/template.html similarity index 100% rename from extensions/frameworks/remark/templates/remark.html rename to extensions/frameworks/remark/template.html diff --git a/package.json b/package.json index 9ad4aaf..a4e6429 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "winston": "^1.1.0" }, "bin": { - "slidewinder": "bin/slidewinder.js" + "slidewinder": "bin/cmdline.js" }, "devDependencies": {}, "keywords": [ diff --git a/src/bin/slidewinder.coffee b/src/bin/slidewinder.coffee index 6fd2149..93db47e 100644 --- a/src/bin/slidewinder.coffee +++ b/src/bin/slidewinder.coffee @@ -1,4 +1,3 @@ -#!/usr/bin/env node program = require 'commander' path = require 'path' diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index 6be4581..ba95ad5 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -52,17 +52,15 @@ pick_slides = (collection, selections) -> picked -PresentationFramework = (framework_path) -> - log.info 'Looking for presentation framework in: ', framework_path +PresentationFramework = (framework) -> + log.info 'Looking for presentation framework module: ', framework fw = @ - fw.templates = {} - console.log framework_path - fs.readdir path.join(framework_path, 'templates'), (err, files) -> - if err then console.log err - files.forEach (f) -> - console.log f - fw.templates[f] = fs.readFileSync f, 'utf8' - fw.helpers = require framework_path + template = fs.readFileSync path.join(framework, 'template.html'), 'utf8' + #fw.renderer = handlebars.compile template + fw.helpers = require path.join framework, 'helpers.js' + fw.render_deck = (data) -> + fw.renderer(data) + fw # A Framework can... @@ -81,12 +79,14 @@ slidewinder = (sessiondata) -> # Load the Plugin for the framework that will be used. plugin = PresentationFramework(sessiondata.framework) + console.log plugin - process.exit() - renderer = handlebars.compile(template) # Render and save - deck = renderer(data) + # deck = renderer(sessiondata) + process.exit() + deck = plugin.render_deck sessiondata + save_deck(deck, data) From 0ed3653a0ab586abfc795cc050393618686a6fd7 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Wed, 18 Nov 2015 01:08:18 +0000 Subject: [PATCH 15/24] Forgot the compiled js files. --- bin/slidewinder.js | 33 +++++++++++++ lib/log.js | 53 +++++++++++++++++++++ lib/slidewinder_lib.js | 104 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 bin/slidewinder.js create mode 100644 lib/log.js create mode 100644 lib/slidewinder_lib.js diff --git a/bin/slidewinder.js b/bin/slidewinder.js new file mode 100644 index 0000000..5cf6468 --- /dev/null +++ b/bin/slidewinder.js @@ -0,0 +1,33 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var fwpath, list, path, pjson, program, slidewinder; + + program = require('commander'); + + path = require('path'); + + slidewinder = require('../lib/slidewinder_lib.js'); + + pjson = require('../package.json'); + + list = function(val) { + return val.split(','); + }; + + fwpath = function(framework) { + return path.resolve(__dirname, "../extensions/frameworks", framework); + }; + + program.version(pjson.version).option('-s, --slides <slide list>', 'Comma-separated list of slides to use (no spaces)', list).option('-c, --collection <path>', 'Path to slide collection').option('-o, --output <path>', 'Path to save output (will create directory)').option('-t, --title <title>', 'Title of the deck').option('-a, --author <name>', 'Deck author').option('-f, --framework <framework>', 'HTML and JS Framework or plugin to use for slideshow generation.', fwpath).parse(process.argv); + + if (!process.argv.slice(2).length) { + program.help(); + } + + if (program.framework == null) { + program.framework = fwpath('remark'); + } + + slidewinder(program); + +}).call(this); diff --git a/lib/log.js b/lib/log.js new file mode 100644 index 0000000..34fcf58 --- /dev/null +++ b/lib/log.js @@ -0,0 +1,53 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var colours, levels, logger, winston; + + winston = require('winston'); + + levels = { + silly: 0, + input: 1, + verbose: 2, + prompt: 3, + debug: 4, + data: 5, + info: 6, + help: 7, + warn: 8, + error: 9 + }; + + colours = { + silly: 'magenta', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + debug: 'blue', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + error: 'red' + }; + + logger = function() { + var log; + log = new winston.Logger({ + transports: [ + new winston.transports.Console({ + level: 'info', + levels: levels, + colorize: true + }) + ], + level: 'info', + levels: levels, + colorize: true + }); + winston.addColors(colours); + return log; + }; + + module.exports = logger; + +}).call(this); diff --git a/lib/slidewinder_lib.js b/lib/slidewinder_lib.js new file mode 100644 index 0000000..d6be2ec --- /dev/null +++ b/lib/slidewinder_lib.js @@ -0,0 +1,104 @@ +// Generated by CoffeeScript 1.10.0 +(function() { + var PresentationFramework, _, fm, fs, handlebars, load_collection, log, log_colours, logger, mkdirp, path, pick_slides, slidewinder, yaml; + + fs = require('fs'); + + path = require('path'); + + fm = require('front-matter'); + + handlebars = require('handlebars'); + + _ = require('lodash'); + + mkdirp = require('mkdirp'); + + logger = require('./log.js'); + + yaml = require('js-yaml'); + + log_colours = { + silly: 'magenta', + input: 'grey', + verbose: 'cyan', + prompt: 'grey', + debug: 'blue', + info: 'green', + data: 'grey', + help: 'cyan', + warn: 'yellow', + error: 'red' + }; + + load_collection = function(dirpath) { + var collection; + collection = {}; + fs.readdirSync(dirpath).forEach(function(file) { + var data, filepath, name, slide; + filepath = path.resolve(dirpath, file); + data = fs.readFileSync(filepath, 'utf8'); + slide = fm(data); + name = slide.attributes.name; + if (collection[name]) { + return log.error('Multiple slides have the name', name); + } else { + return collection[name] = slide; + } + }); + log.info('Loaded', Object.keys(collection).length, 'markdown slide files from', dirpath); + return collection; + }; + + pick_slides = function(collection, selections) { + var picked; + picked = []; + selections.forEach(function(selection) { + var slide; + slide = collection[selection]; + if (slide) { + return picked.push(slide); + } else { + return log.error('No slide found with name', name); + } + }); + log.info('Picked', picked.length, 'slides from collection'); + return picked; + }; + + PresentationFramework = function(framework) { + var fw, template; + log.info('Looking for presentation framework module: ', framework); + fw = this; + template = fs.readFileSync(path.join(framework, 'template.html'), 'utf8'); + fw.helpers = require(path.join(framework, 'helpers.js')); + fw.render_deck = function(data) { + return fw.renderer(data); + }; + return fw; + }; + + PresentationFramework.registerHelpers = function() { + var fw; + fw = this; + return Object.keys(fw.helpers).forEach(function(key) { + return handlebars.registerHelper(key, fw.helpers[key]); + }); + }; + + slidewinder = function(sessiondata) { + var allslides, deck, plugin; + allslides = load_collection(sessiondata.collection); + sessiondata.slideset = pick_slides(allslides, sessiondata.slides); + plugin = PresentationFramework(sessiondata.framework); + console.log(plugin); + process.exit(); + deck = plugin.render_deck(sessiondata); + return save_deck(deck, data); + }; + + log = logger(); + + module.exports = slidewinder; + +}).call(this); From edb2c25d6e3a9c3efc0545d0ab693e338481e122 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Wed, 18 Nov 2015 01:17:07 +0000 Subject: [PATCH 16/24] Added appropriate helper to remark basic plugin. --- extensions/frameworks/remark/helpers.js | 9 ++++++--- src/lib/slidewinder_lib.coffee | 4 ---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/extensions/frameworks/remark/helpers.js b/extensions/frameworks/remark/helpers.js index b08a10d..51f3345 100644 --- a/extensions/frameworks/remark/helpers.js +++ b/extensions/frameworks/remark/helpers.js @@ -1,6 +1,9 @@ module.exports = { - lool: function(){ - console.log("HIIIIIIII!"); - } + slidewinder: function(all){ + var bodies = all.data.root.slideset.map(function(x) { + return x.body; + }); + return bodies.join('\n---\n'); + }); } diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index ba95ad5..b5284fb 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -80,11 +80,7 @@ slidewinder = (sessiondata) -> # Load the Plugin for the framework that will be used. plugin = PresentationFramework(sessiondata.framework) - console.log plugin - # Render and save - # deck = renderer(sessiondata) - process.exit() deck = plugin.render_deck sessiondata save_deck(deck, data) From c8c7e2d74e63800d6d708ca001cea2cdbe2f0526 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Wed, 18 Nov 2015 01:22:02 +0000 Subject: [PATCH 17/24] Compiled javascript to a state where slidewinder should not work with basic remark plugin, with the new extensible system. --- lib/slidewinder_lib.js | 15 ++++++++++++--- src/lib/slidewinder_lib.coffee | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/slidewinder_lib.js b/lib/slidewinder_lib.js index d6be2ec..5715bbe 100644 --- a/lib/slidewinder_lib.js +++ b/lib/slidewinder_lib.js @@ -1,6 +1,6 @@ // Generated by CoffeeScript 1.10.0 (function() { - var PresentationFramework, _, fm, fs, handlebars, load_collection, log, log_colours, logger, mkdirp, path, pick_slides, slidewinder, yaml; + var PresentationFramework, _, fm, fs, handlebars, load_collection, log, log_colours, logger, mkdirp, path, pick_slides, save_deck, slidewinder, yaml; fs = require('fs'); @@ -86,13 +86,22 @@ }); }; + save_deck = function(deck, data) { + var datapath, deckpath, msg; + mkdirp(data.output); + deckpath = path.resolve(data.output, 'index.html'); + fs.writeFileSync(deckpath, deck); + datapath = path.resolve(data.output, 'deck.json'); + fs.writeFileSync(datapath, JSON.stringify(data, null, 2)); + msg = 'Deck (index.html) and Data (deck.json) saved to '; + return log.info(msg, data.output); + }; + slidewinder = function(sessiondata) { var allslides, deck, plugin; allslides = load_collection(sessiondata.collection); sessiondata.slideset = pick_slides(allslides, sessiondata.slides); plugin = PresentationFramework(sessiondata.framework); - console.log(plugin); - process.exit(); deck = plugin.render_deck(sessiondata); return save_deck(deck, data); }; diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index b5284fb..1ee15b6 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -71,6 +71,21 @@ PresentationFramework.registerHelpers = () -> handlebars.registerHelper key, fw.helpers[key] +# Save a rendered slide deck +save_deck = (deck, data) -> + mkdirp data.output + + # Write deck + deckpath = path.resolve data.output, 'index.html' + fs.writeFileSync deckpath, deck + + # Write slidewinder data + datapath = path.resolve data.output, 'deck.json' + fs.writeFileSync datapath, JSON.stringify(data, null, 2) + msg = 'Deck (index.html) and Data (deck.json) saved to ' + log.info msg, data.output + + # Function executes the main slidewinder flow. slidewinder = (sessiondata) -> # Load the slides, and select the ones desired. From cb44853bc251c0d761ee7b369150b3c77b43f40e Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Wed, 18 Nov 2015 01:23:28 +0000 Subject: [PATCH 18/24] Corrected small error in plugin. --- extensions/frameworks/remark/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/frameworks/remark/helpers.js b/extensions/frameworks/remark/helpers.js index 51f3345..e855556 100644 --- a/extensions/frameworks/remark/helpers.js +++ b/extensions/frameworks/remark/helpers.js @@ -5,5 +5,5 @@ module.exports = { return x.body; }); return bodies.join('\n---\n'); - }); + }; } From f7c09ff2fa3c42e9d1d7d9c56d8fc39964d78948 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Wed, 18 Nov 2015 01:24:04 +0000 Subject: [PATCH 19/24] Corrected small error in plugin. --- extensions/frameworks/remark/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/frameworks/remark/helpers.js b/extensions/frameworks/remark/helpers.js index e855556..6a39002 100644 --- a/extensions/frameworks/remark/helpers.js +++ b/extensions/frameworks/remark/helpers.js @@ -5,5 +5,5 @@ module.exports = { return x.body; }); return bodies.join('\n---\n'); - }; + } } From 9cd6f65b14083ff88b473dd7468508d225a3a924 Mon Sep 17 00:00:00 2001 From: "Ben Ward (TGAC)" <axolotlfan9250@gmail.com> Date: Wed, 18 Nov 2015 09:55:03 +0000 Subject: [PATCH 20/24] Completed PresentationFramework class. --- Cakefile | 2 -- lib/slidewinder_lib.js | 42 ++++++++++++++++++---------------- src/lib/slidewinder_lib.coffee | 30 ++++++++++-------------- 3 files changed, 34 insertions(+), 40 deletions(-) diff --git a/Cakefile b/Cakefile index c83babb..46c5f2e 100644 --- a/Cakefile +++ b/Cakefile @@ -1,6 +1,4 @@ fs = require 'fs' - -{print} = require 'sys' {spawn} = require 'child_process' buildlib = (callback) -> diff --git a/lib/slidewinder_lib.js b/lib/slidewinder_lib.js index 5715bbe..57245ee 100644 --- a/lib/slidewinder_lib.js +++ b/lib/slidewinder_lib.js @@ -66,25 +66,26 @@ return picked; }; - PresentationFramework = function(framework) { - var fw, template; - log.info('Looking for presentation framework module: ', framework); - fw = this; - template = fs.readFileSync(path.join(framework, 'template.html'), 'utf8'); - fw.helpers = require(path.join(framework, 'helpers.js')); - fw.render_deck = function(data) { - return fw.renderer(data); - }; - return fw; - }; - - PresentationFramework.registerHelpers = function() { - var fw; - fw = this; - return Object.keys(fw.helpers).forEach(function(key) { - return handlebars.registerHelper(key, fw.helpers[key]); - }); - }; + PresentationFramework = (function() { + function PresentationFramework(framework) { + log.info('Looking for presentation framework module: ', framework); + this.template = fs.readFileSync(path.join(framework, 'template.html'), 'utf8'); + this.renderer = handlebars.compile(this.template); + this.helpers = require(path.join(framework, 'helpers.js')); + this.render_deck = (function(_this) { + return function(data) { + return Object.keys(_this.helpers).forEach(function(key) { + handlebars.registerHelper(key, _this.helpers[key]); + return _this.renderer(data); + }); + }; + })(this); + this; + } + + return PresentationFramework; + + })(); save_deck = function(deck, data) { var datapath, deckpath, msg; @@ -101,7 +102,8 @@ var allslides, deck, plugin; allslides = load_collection(sessiondata.collection); sessiondata.slideset = pick_slides(allslides, sessiondata.slides); - plugin = PresentationFramework(sessiondata.framework); + plugin = new PresentationFramework(sessiondata.framework); + console.log(plugin); deck = plugin.render_deck(sessiondata); return save_deck(deck, data); }; diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index 1ee15b6..c579979 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -52,23 +52,17 @@ pick_slides = (collection, selections) -> picked -PresentationFramework = (framework) -> - log.info 'Looking for presentation framework module: ', framework - fw = @ - template = fs.readFileSync path.join(framework, 'template.html'), 'utf8' - #fw.renderer = handlebars.compile template - fw.helpers = require path.join framework, 'helpers.js' - fw.render_deck = (data) -> - fw.renderer(data) - fw - - -# A Framework can... -# Register helpers for use in the handlebars HTML template. -PresentationFramework.registerHelpers = () -> - fw = @ - Object.keys(fw.helpers).forEach (key) -> - handlebars.registerHelper key, fw.helpers[key] +class PresentationFramework + constructor: (framework) -> + log.info 'Looking for presentation framework module: ', framework + @template = fs.readFileSync path.join(framework, 'template.html'), 'utf8' + @renderer = handlebars.compile @template + @helpers = require path.join framework, 'helpers.js' + @render_deck = (data) => + Object.keys(@helpers).forEach (key) => + handlebars.registerHelper key, @helpers[key] + @renderer(data) + @ # Save a rendered slide deck @@ -93,7 +87,7 @@ slidewinder = (sessiondata) -> sessiondata.slideset = pick_slides allslides, sessiondata.slides # Load the Plugin for the framework that will be used. - plugin = PresentationFramework(sessiondata.framework) + plugin = new PresentationFramework(sessiondata.framework) # Render and save deck = plugin.render_deck sessiondata From 7c65f8491f02e3bf16f71fc1ac4562a2692b3cd9 Mon Sep 17 00:00:00 2001 From: "Ben Ward (TGAC)" <axolotlfan9250@gmail.com> Date: Wed, 18 Nov 2015 09:59:20 +0000 Subject: [PATCH 21/24] Fixed error in cmdline.js --- bin/cmdline.js | 2 +- lib/slidewinder_lib.js | 3 +-- src/lib/slidewinder_lib.coffee | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/bin/cmdline.js b/bin/cmdline.js index 49cedba..28b5663 100755 --- a/bin/cmdline.js +++ b/bin/cmdline.js @@ -1,3 +1,3 @@ #!/usr/bin/env node -require('./slidewinder.js')(); +require('./slidewinder.js'); diff --git a/lib/slidewinder_lib.js b/lib/slidewinder_lib.js index 57245ee..8df16ff 100644 --- a/lib/slidewinder_lib.js +++ b/lib/slidewinder_lib.js @@ -103,9 +103,8 @@ allslides = load_collection(sessiondata.collection); sessiondata.slideset = pick_slides(allslides, sessiondata.slides); plugin = new PresentationFramework(sessiondata.framework); - console.log(plugin); deck = plugin.render_deck(sessiondata); - return save_deck(deck, data); + return save_deck(deck, sessiondata); }; log = logger(); diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index c579979..5c17feb 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -92,7 +92,7 @@ slidewinder = (sessiondata) -> # Render and save deck = plugin.render_deck sessiondata - save_deck(deck, data) + save_deck(deck, sessiondata) log = logger() From 6801ff7619dc919114bed33eb1e7ac2c3a4cc96d Mon Sep 17 00:00:00 2001 From: "Ben Ward (TGAC)" <axolotlfan9250@gmail.com> Date: Wed, 18 Nov 2015 10:20:50 +0000 Subject: [PATCH 22/24] Corrected error in render_deckmethod which resulted in undefined html. --- lib/slidewinder_lib.js | 8 +++++--- src/lib/slidewinder_lib.coffee | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/slidewinder_lib.js b/lib/slidewinder_lib.js index 8df16ff..02c728c 100644 --- a/lib/slidewinder_lib.js +++ b/lib/slidewinder_lib.js @@ -74,10 +74,12 @@ this.helpers = require(path.join(framework, 'helpers.js')); this.render_deck = (function(_this) { return function(data) { - return Object.keys(_this.helpers).forEach(function(key) { - handlebars.registerHelper(key, _this.helpers[key]); - return _this.renderer(data); + var deck; + Object.keys(_this.helpers).forEach(function(key) { + return handlebars.registerHelper(key, _this.helpers[key]); }); + deck = _this.renderer(data); + return deck; }; })(this); this; diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index 5c17feb..9fb377b 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -61,7 +61,8 @@ class PresentationFramework @render_deck = (data) => Object.keys(@helpers).forEach (key) => handlebars.registerHelper key, @helpers[key] - @renderer(data) + deck = @renderer(data) + deck @ @@ -91,7 +92,6 @@ slidewinder = (sessiondata) -> # Render and save deck = plugin.render_deck sessiondata - save_deck(deck, sessiondata) From d700ba93c154c71a42a90bc387c325c5483081ef Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Sun, 22 Nov 2015 16:46:15 +0000 Subject: [PATCH 23/24] Updated code to style suggestions. --- src/bin/slidewinder.coffee | 11 +-- src/lib/slidewinder_lib.coffee | 132 ++++++++++++++++----------------- 2 files changed, 66 insertions(+), 77 deletions(-) diff --git a/src/bin/slidewinder.coffee b/src/bin/slidewinder.coffee index 93db47e..f9669cf 100644 --- a/src/bin/slidewinder.coffee +++ b/src/bin/slidewinder.coffee @@ -1,18 +1,14 @@ - -program = require 'commander' path = require 'path' +program = require 'commander' slidewinder = require '../lib/slidewinder_lib.js' - pjson = require '../package.json' # Functions for co-ercing command line arguments into suitable formats. list = (val) -> val.split ',' - fwpath = (framework) -> - path.resolve __dirname, "../extensions/frameworks", framework - + path.resolve(__dirname, "../extensions/frameworks", framework) program .version(pjson.version) @@ -25,7 +21,8 @@ program .option('-t, --title <title>', 'Title of the deck') .option('-a, --author <name>', 'Deck author') .option('-f, --framework <framework>', - 'HTML and JS Framework or plugin to use for slideshow generation.', fwpath) + 'HTML and JS Framework or plugin to use for slideshow generation.', + fwpath) .parse process.argv unless process.argv.slice(2).length then program.help() diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index 9fb377b..cefb217 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -1,99 +1,91 @@ # Slidewinder-Lib. - fs = require 'fs' path = require 'path' fm = require 'front-matter' handlebars = require 'handlebars' _ = require 'lodash' mkdirp = require 'mkdirp' -logger = require './log.js' yaml = require 'js-yaml' - +logger = require './log.js' log_colours = - silly: 'magenta' - input: 'grey' - verbose: 'cyan' - prompt: 'grey' - debug: 'blue' - info: 'green' - data: 'grey' - help: 'cyan' - warn: 'yellow' - error: 'red' - + silly: 'magenta' + input: 'grey' + verbose: 'cyan' + prompt: 'grey' + debug: 'blue' + info: 'green' + data: 'grey' + help: 'cyan' + warn: 'yellow' + error: 'red' # Load a Markdown format slide collection -load_collection = (dirpath) -> - collection = {} - # Load each slide, parse the frontmatter, and collect. - fs.readdirSync(dirpath).forEach (file) -> - filepath = path.resolve dirpath, file - data = fs.readFileSync filepath, 'utf8' - slide = fm data - name = slide.attributes.name - if collection[name] - log.error 'Multiple slides have the name', name - else - collection[name] = slide - log.info 'Loaded', Object.keys(collection).length, 'markdown slide files from', dirpath - collection - - -pick_slides = (collection, selections) -> - picked = [] - selections.forEach (selection) -> - slide = collection[selection] - if slide - picked.push slide - else - log.error 'No slide found with name', name - log.info 'Picked', picked.length, 'slides from collection' - picked - +loadCollection = (dirpath) -> + collection = {} + # Load each slide, parse the frontmatter, and collect. + fs.readdirSync(dirpath).forEach (file) -> + filepath = path.resolve(dirpath, file) + data = fs.readFileSync(filepath, 'utf8') + slide = fm data + name = slide.attributes.name + if collection[name] + log.error('Multiple slides have the name', name) + else + collection[name] = slide + slidenum = Object.keys(collection).length + log.info('Loaded', slidenum, 'markdown slide files from', dirpath) + collection + +pickSlides = (collection, selections) -> + picked = [] + selections.forEach (selection) -> + slide = collection[selection] + if slide + picked.push slide + else + log.error('No slide found with name', name) + log.info('Picked', picked.length, 'slides from collection') + picked class PresentationFramework - constructor: (framework) -> - log.info 'Looking for presentation framework module: ', framework - @template = fs.readFileSync path.join(framework, 'template.html'), 'utf8' - @renderer = handlebars.compile @template - @helpers = require path.join framework, 'helpers.js' - @render_deck = (data) => - Object.keys(@helpers).forEach (key) => - handlebars.registerHelper key, @helpers[key] - deck = @renderer(data) - deck - @ - + constructor: (framework) -> + log.info('Looking for presentation framework module: ', framework) + frameworkPath = path.join(framework, 'template.html') + @template = fs.readFileSync(frameworkPath, 'utf8') + @renderer = handlebars.compile @template + @helpers = require path.join(framework, 'helpers.js') + + @renderDeck = (data) => + Object.keys(@helpers).forEach (key) => + handlebars.registerHelper(key, @helpers[key]) + deck = @renderer(data) + deck + this # Save a rendered slide deck -save_deck = (deck, data) -> +saveDeck = (deck, data) -> mkdirp data.output - # Write deck - deckpath = path.resolve data.output, 'index.html' - fs.writeFileSync deckpath, deck - + deckPath = path.resolve(data.output, 'index.html') + fs.writeFileSync(deckPath, deck) # Write slidewinder data - datapath = path.resolve data.output, 'deck.json' - fs.writeFileSync datapath, JSON.stringify(data, null, 2) + dataPath = path.resolve(data.output, 'deck.json') + dataOutput = JSON.stringify(data, null, 2) + fs.writeFileSync(dataPath, dataOutput) msg = 'Deck (index.html) and Data (deck.json) saved to ' - log.info msg, data.output - + log.info(msg, data.output) # Function executes the main slidewinder flow. slidewinder = (sessiondata) -> # Load the slides, and select the ones desired. - allslides = load_collection sessiondata.collection - sessiondata.slideset = pick_slides allslides, sessiondata.slides - + allslides = loadCollection sessiondata.collection + sessiondata.slideset = pickSlides(allslides, sessiondata.slides) # Load the Plugin for the framework that will be used. - plugin = new PresentationFramework(sessiondata.framework) - + plugin = new PresentationFramework sessiondata.framework # Render and save - deck = plugin.render_deck sessiondata - save_deck(deck, sessiondata) - + deck = plugin.renderDeck sessiondata + saveDeck(deck, sessiondata) log = logger() From c04d6c0d8d8a9da954f6272adae6101dc1828aa5 Mon Sep 17 00:00:00 2001 From: Ward9250 <axolotlfan9250@gmail.com> Date: Mon, 23 Nov 2015 00:34:38 +0000 Subject: [PATCH 24/24] Got metadata in slides working. --- bin/slidewinder.js | 4 +- extensions/frameworks/remark/helpers.js | 14 ++++-- lib/slidewinder_lib.js | 59 +++++++++++++++---------- src/lib/slidewinder_lib.coffee | 32 +++++++++----- 4 files changed, 69 insertions(+), 40 deletions(-) diff --git a/bin/slidewinder.js b/bin/slidewinder.js index 5cf6468..8947765 100644 --- a/bin/slidewinder.js +++ b/bin/slidewinder.js @@ -2,10 +2,10 @@ (function() { var fwpath, list, path, pjson, program, slidewinder; - program = require('commander'); - path = require('path'); + program = require('commander'); + slidewinder = require('../lib/slidewinder_lib.js'); pjson = require('../package.json'); diff --git a/extensions/frameworks/remark/helpers.js b/extensions/frameworks/remark/helpers.js index 6a39002..801b8dd 100644 --- a/extensions/frameworks/remark/helpers.js +++ b/extensions/frameworks/remark/helpers.js @@ -1,9 +1,17 @@ +yaml = require('js-yaml'); + module.exports = { - slidewinder: function(all){ - var bodies = all.data.root.slideset.map(function(x) { - return x.body; + slidewinder: function(context){ + slideData = context.data.root; + var bodies = slideData.slides.map(function(x) { + Object.keys(slideData.deck).forEach(function(key){ + x.attributes[key] = slideData.deck[key]; + }); + completeBody = yaml.dump(x.attributes) + '\n' + x.body + return completeBody; }); + bodies.join('\n---\n'); return bodies.join('\n---\n'); } } diff --git a/lib/slidewinder_lib.js b/lib/slidewinder_lib.js index 02c728c..f11f469 100644 --- a/lib/slidewinder_lib.js +++ b/lib/slidewinder_lib.js @@ -1,6 +1,6 @@ // Generated by CoffeeScript 1.10.0 (function() { - var PresentationFramework, _, fm, fs, handlebars, load_collection, log, log_colours, logger, mkdirp, path, pick_slides, save_deck, slidewinder, yaml; + var PresentationFramework, _, fm, fs, handlebars, loadCollection, log, log_colours, logger, mkdirp, path, pickSlides, saveDeck, slidewinder, yaml; fs = require('fs'); @@ -14,10 +14,10 @@ mkdirp = require('mkdirp'); - logger = require('./log.js'); - yaml = require('js-yaml'); + logger = require('./log.js'); + log_colours = { silly: 'magenta', input: 'grey', @@ -31,8 +31,8 @@ error: 'red' }; - load_collection = function(dirpath) { - var collection; + loadCollection = function(dirpath) { + var collection, slidenum; collection = {}; fs.readdirSync(dirpath).forEach(function(file) { var data, filepath, name, slide; @@ -46,11 +46,12 @@ return collection[name] = slide; } }); - log.info('Loaded', Object.keys(collection).length, 'markdown slide files from', dirpath); + slidenum = Object.keys(collection).length; + log.info('Loaded', slidenum, 'markdown slide files from', dirpath); return collection; }; - pick_slides = function(collection, selections) { + pickSlides = function(collection, selections) { var picked; picked = []; selections.forEach(function(selection) { @@ -68,17 +69,19 @@ PresentationFramework = (function() { function PresentationFramework(framework) { + var frameworkPath; log.info('Looking for presentation framework module: ', framework); - this.template = fs.readFileSync(path.join(framework, 'template.html'), 'utf8'); + frameworkPath = path.join(framework, 'template.html'); + this.template = fs.readFileSync(frameworkPath, 'utf8'); this.renderer = handlebars.compile(this.template); this.helpers = require(path.join(framework, 'helpers.js')); - this.render_deck = (function(_this) { - return function(data) { + this.renderDeck = (function(_this) { + return function(renderContext) { var deck; Object.keys(_this.helpers).forEach(function(key) { return handlebars.registerHelper(key, _this.helpers[key]); }); - deck = _this.renderer(data); + deck = _this.renderer(renderContext); return deck; }; })(this); @@ -89,24 +92,32 @@ })(); - save_deck = function(deck, data) { - var datapath, deckpath, msg; + saveDeck = function(deck, data) { + var dataOutput, dataPath, deckPath, msg; mkdirp(data.output); - deckpath = path.resolve(data.output, 'index.html'); - fs.writeFileSync(deckpath, deck); - datapath = path.resolve(data.output, 'deck.json'); - fs.writeFileSync(datapath, JSON.stringify(data, null, 2)); + deckPath = path.resolve(data.output, 'index.html'); + fs.writeFileSync(deckPath, deck); + dataPath = path.resolve(data.output, 'deck.json'); + dataOutput = JSON.stringify(data, null, 2); + fs.writeFileSync(dataPath, dataOutput); msg = 'Deck (index.html) and Data (deck.json) saved to '; return log.info(msg, data.output); }; - slidewinder = function(sessiondata) { - var allslides, deck, plugin; - allslides = load_collection(sessiondata.collection); - sessiondata.slideset = pick_slides(allslides, sessiondata.slides); - plugin = new PresentationFramework(sessiondata.framework); - deck = plugin.render_deck(sessiondata); - return save_deck(deck, sessiondata); + slidewinder = function(sessionData) { + var allSlides, deck, plugin, renderContext; + allSlides = loadCollection(sessionData.collection); + sessionData.slideset = pickSlides(allSlides, sessionData.slides); + plugin = new PresentationFramework(sessionData.framework); + renderContext = { + deck: { + title: sessionData.title, + author: sessionData.author + }, + slides: sessionData.slideset + }; + deck = plugin.renderDeck(renderContext); + return saveDeck(deck, sessionData); }; log = logger(); diff --git a/src/lib/slidewinder_lib.coffee b/src/lib/slidewinder_lib.coffee index cefb217..558ff32 100644 --- a/src/lib/slidewinder_lib.coffee +++ b/src/lib/slidewinder_lib.coffee @@ -33,7 +33,7 @@ loadCollection = (dirpath) -> log.error('Multiple slides have the name', name) else collection[name] = slide - slidenum = Object.keys(collection).length + slidenum = Object.keys(collection).length log.info('Loaded', slidenum, 'markdown slide files from', dirpath) collection @@ -56,11 +56,11 @@ class PresentationFramework @renderer = handlebars.compile @template @helpers = require path.join(framework, 'helpers.js') - @renderDeck = (data) => + @renderDeck = (renderContext) => Object.keys(@helpers).forEach (key) => handlebars.registerHelper(key, @helpers[key]) - deck = @renderer(data) - deck + deck = @renderer(renderContext) + deck this # Save a rendered slide deck @@ -77,15 +77,25 @@ saveDeck = (deck, data) -> log.info(msg, data.output) # Function executes the main slidewinder flow. -slidewinder = (sessiondata) -> +slidewinder = (sessionData) -> # Load the slides, and select the ones desired. - allslides = loadCollection sessiondata.collection - sessiondata.slideset = pickSlides(allslides, sessiondata.slides) + allSlides = loadCollection sessionData.collection + sessionData.slideset = pickSlides(allSlides, sessionData.slides) # Load the Plugin for the framework that will be used. - plugin = new PresentationFramework sessiondata.framework - # Render and save - deck = plugin.renderDeck sessiondata - saveDeck(deck, sessiondata) + plugin = new PresentationFramework sessionData.framework + + # Render and save... + + # Explicitly lay out the context for the render process, rather than + # Feed the entire sessionData object in - feels safer. + renderContext = + deck: + title: sessionData.title + author: sessionData.author + slides: sessionData.slideset + + deck = plugin.renderDeck renderContext + saveDeck(deck, sessionData) log = logger()