diff --git a/index.js b/index.js index 8e2615e9b3ec9b9d6fa1bd8e4eb8defa6c58e9dc..e13a009f578cdc66de89fae01c18ca0e8c3b5666 100755 --- a/index.js +++ b/index.js @@ -8,7 +8,7 @@ require('./sitegin/sitegin')({ var fs = require('fs'); function run() { - jobs.runSequence('config','readFiles','print') + jobs.runSequence('config','readFiles','parseHugo','print') .catch(e => console.log(e.stack)); } diff --git a/package.json b/package.json index 34b487f1373703938e99333881392691dfa7cbee..fbfc3ce82757b56223f56a8c365b0a192f1fa9a9 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "browser-sync": "^2.11.1", "chokidar": "^1.4.2", "highlight.js": "^9.2.0", + "jsesc": "^1.0.0", "marked": "^0.3.5", "mkdirp": "^0.5.1", "moment": "^2.11.2", diff --git a/sitegin/Page.js b/sitegin/Page.js deleted file mode 100644 index 42e3f2899cf78586237a1ac5f09764db29927319..0000000000000000000000000000000000000000 --- a/sitegin/Page.js +++ /dev/null @@ -1,52 +0,0 @@ - -exports.Page = function() { - this.file = ""; - this.metadata = {}; - this.content = ""; - this.type = "article"; -} - -exports.PageList = function() { - var list = this; - list.list = []; - - list.length = 0; - - list.addPage = function(article) { - list.length++; - if(! (article instanceof exports.Page)) - throw "article has to be of type Page"; - else if(list.containsFile(article.file)) { - console.log(list.getPageByFile(article.file)); - throw "article is already in this list" - } else - list.list.push(article); - } - - list.forEach = function(f) { - list.list.forEach(f); - } - - list.getPageByFile = function(file) { - var rarticle = undefined; - list.forEach(function(article) { - if(article.file == file) { - rarticle = article; - } - }); - return rarticle; - } - - list.containsFile = function(file) { - var contains = false; - list.forEach(function(article) { - if(article.file == file) { - contains = true; - } - }); - return contains; - } - - return list; -} - diff --git a/sitegin/transformer-git.js b/sitegin/gitInfo.js similarity index 100% rename from sitegin/transformer-git.js rename to sitegin/gitInfo.js diff --git a/sitegin/input-hugo.js b/sitegin/input-hugo.js deleted file mode 100644 index a1725dcd23570e2c08084c28d87634b26a62e0b3..0000000000000000000000000000000000000000 --- a/sitegin/input-hugo.js +++ /dev/null @@ -1,130 +0,0 @@ -var fs = require('fs'); -var toml = require('toml'); -var PageList = require('./Page').PageList; -var Page = require('./Page').Page; -var moment = require('moment'); -var path = require('path'); - -function walk(currentDirPath, callback, end_cb) { - var subcalls = 0; - var ender = function() { - subcalls--; - if(subcalls <= 0) { - if(end_cb !== undefined) - end_cb(); - } - } - var fs = require('fs'), path = require('path'); - fs.readdir(currentDirPath, function(err, files) { - if(err!=null) console.log(err); - files.forEach(function(name) { - var filePath = path.join(currentDirPath, name); - try { - var stat = fs.statSync(filePath); - if (stat.isFile()) { - callback(filePath, stat); - } else if (stat.isDirectory()) { - if(filePath.indexOf(".git") < 0) { - subcalls++; - walk(filePath, callback, ender); - } - } - } catch(e) {} - }); - if(subcalls == 0) ender(); - - }); -}; - -var readPageWorker = function(file, articleName, contentDir) { - if(file === undefined) throw new Error("file is undefined"); - file = file.substring(4); - var fm_end = file.indexOf("+++"); - var obj = new Page; - obj.origFile = contentDir+articleName+'.md'; - obj.file = articleName.replace("articles","clanek"); - obj.content = file.substring(fm_end+4); - try { - obj.metadata = toml.parse(file.substring(0,fm_end-1)+"\n"); - } catch(e) { - console.log(articleName+": Failed to parse metadata"); - throw e; - } - if(obj.metadata.date && obj.metadata.date.creation) obj.metadata.date.creation = moment(obj.metadata.date.creation); - return obj; -} -module.exports = function(_contentDir) { - var exports = this; - exports.walk = walk; - exports.fancyname = "loader hugo"; - var contentDir = _contentDir; - if(contentDir == undefined) contentDir = './content/'; - if(!contentDir.endsWith('/')) contentDir+='/'; - - /* - * articleName: - * string - * callback: - * called when article is read - * returns: - * { - * string articleName,content - * object frontmatter - * function save - * } - */ - exports.readPage = function(articleName, cb) { - fs.readFile(contentDir+articleName+".md", 'utf8', function(err, data) { - if(err != null) throw err; - cb(readPageWorker(data, articleName, contentDir)); - }); - } - - /* - * callback: - * function(articleName) - * called for each article on website - * cb_end: - * function() - * called when all articles are listed - */ - exports.forEachPage = function(callback, cb_end) { - walk(contentDir+"articles",function(filePath, stat) { - console.log(filePath, path.basename(filePath)); - if(path.basename(filePath).substr(0,1) == ".") return; - if(callback !== undefined) callback(filePath.substring(contentDir.length,filePath.length-3)); - }, function() { - if(cb_end !== undefined) cb_end(); - }); - }; - - /* - * cb: - * function(articleList) - * called after all cb_on_each - */ - exports.getPageList = function(cb) { - var currentlyReadingCount = 0; - var allPagesListed = false; - var cb_called = false; - var list = new PageList; - - exports.forEachPage(function(articleName) { - currentlyReadingCount++; - exports.readPage(articleName, function(article){ - list.addPage(article); - currentlyReadingCount--; - if(allPagesListed && currentlyReadingCount == 0 && !cb_called) { - if(cb !== undefined) cb(list); - cb_called = true; - } - }); - },function(){ - if(currentlyReadingCount == 0 && !cb_called) { - if(cb !== undefined) cb(list); - cb_called = true; - } - allPagesListed = true; - }); - }; -} diff --git a/sitegin/transformer-images.js b/sitegin/legacy/images.js similarity index 100% rename from sitegin/transformer-images.js rename to sitegin/legacy/images.js diff --git a/sitegin/transformer-markdown.js b/sitegin/legacy/markdown.js similarity index 100% rename from sitegin/transformer-markdown.js rename to sitegin/legacy/markdown.js diff --git a/sitegin/transformer-nunjucks.js b/sitegin/legacy/nunjucks.js similarity index 100% rename from sitegin/transformer-nunjucks.js rename to sitegin/legacy/nunjucks.js diff --git a/sitegin/transformer-tags.js b/sitegin/legacy/tags.js similarity index 100% rename from sitegin/transformer-tags.js rename to sitegin/legacy/tags.js diff --git a/sitegin/transformer-urlizetags.js b/sitegin/legacy/urls.js similarity index 100% rename from sitegin/transformer-urlizetags.js rename to sitegin/legacy/urls.js diff --git a/sitegin/output-filesystem.js b/sitegin/legacy/writeFiles.js similarity index 100% rename from sitegin/output-filesystem.js rename to sitegin/legacy/writeFiles.js diff --git a/sitegin/output-console.js b/sitegin/output-console.js deleted file mode 100644 index b9074e197f3a216af4ce99d5c0802e9af2b648b3..0000000000000000000000000000000000000000 --- a/sitegin/output-console.js +++ /dev/null @@ -1,9 +0,0 @@ - -module.exports = function() { - var out = this; - out.fancyname = "output console"; - out.forEachPage = function(article, cb) { - cb(); - } -} - diff --git a/sitegin/parseHugo.js b/sitegin/parseHugo.js new file mode 100644 index 0000000000000000000000000000000000000000..e0cd9a94443c7772624c2f62a2ce1045af7c9993 --- /dev/null +++ b/sitegin/parseHugo.js @@ -0,0 +1,40 @@ +var toml = require('toml'); +var moment = require('moment'); +var path = require('path'); +var jsesc = require('jsesc') + +var readPageWorker = function(content, articleName) { + if(content === undefined) throw new Error("content is undefined"); + var head = content.substring(0,4) + if(head !== '+++\n') + throw new Error('Failed to parse file '+articleName+':\n'+ + 'Wrong header (expected "+++\\n" got "'+jsesc(head)+'")') + + content = content.substring(4); + var fm_end = content.indexOf("+++\n"); + if(fm_end < 0) { + console.log(jsesc(content)); + throw new Error('Cannot find terminating +++\n in file '+articleName); + } + var obj = {}; + obj.content = content.substring(fm_end+4); + try { + obj.metadata = toml.parse(content.substring(0,fm_end-1)+"\n"); + } catch(e) { + console.log(articleName+": Failed to parse metadata"); + throw e; + } + if(obj.metadata.date && obj.metadata.date.creation) obj.metadata.date.creation = moment(obj.metadata.date.creation); + return obj; +} + +module.exports = function(obj) { + return new Promise(function(resolve, reject) { + var pages = []; + obj.pages.forEach(function(page) { + pages.push(readPageWorker(page.content, page.filename)); + }) + obj.pages = pages; + resolve(obj); + }); +} diff --git a/sitegin/print.js b/sitegin/print.js index 332c10877c38b739acd977a03f12eff7f4a3a452..c7c44608eb1582638f0b82c6655215cdd9c43e95 100644 --- a/sitegin/print.js +++ b/sitegin/print.js @@ -1,7 +1,11 @@ +var util = require('util') + module.exports = function(a) { var pages = a.pages - a.pages = ['...'] - console.log(a) + var page0 = pages[0] + //page0.content = '...' + a.pages = [page0] + console.log(JSON.stringify(a,null,2)) a.pages = pages return Promise.resolve(a) } diff --git a/sitegin/read-files.js b/sitegin/readFiles.js similarity index 100% rename from sitegin/read-files.js rename to sitegin/readFiles.js diff --git a/sitegin/sequencer.js b/sitegin/sequencer.js deleted file mode 100644 index b5c271da37c4c84bf18a83dd91e3e89ed668893a..0000000000000000000000000000000000000000 --- a/sitegin/sequencer.js +++ /dev/null @@ -1,59 +0,0 @@ -module.exports = function() { - var t = this; - var lastEvent; - this.load = function(input) { - lastEvent = input.fancyname+" done"; - input.getPageList(function(list) { - t.emit(input.fancyname+" done", list); - }); - return this; - } - - this.registerNext = function(obj) { - // pre - t.on(lastEvent, function(list) { - if(obj.pre !== undefined) { - obj.pre(function() { - t.emit(obj.fancyname+' pre done', list); - }, list); - } else { - t.emit(obj.fancyname+' pre done', list); - } - }); - // forEachPage - t.on(obj.fancyname+' pre done', function(list) { - var transforming = list.length; - if(obj.forEachPage !== undefined) { - list.forEach(function(article) { - obj.forEachPage(article, function() { - transforming--; - if(transforming == 0) { - t.emit(obj.fancyname+' forEachPage done', list); - } - }); - }); - } else { - t.emit(obj.fancyname+' forEachPage done', list); - } - }); - // post - t.on(obj.fancyname+' forEachPage done', function(list) { - if(obj.post !== undefined) { - obj.post(function() { - t.emit(obj.fancyname+' post done', list); - }, list) - } else { - t.emit(obj.fancyname+' post done', list); - } - }); - - lastEvent = obj.fancyname+' post done'; - return this; - } - - this.finish = function(f) { - t.on(lastEvent, f); - } -} - -module.exports.prototype.__proto__ = require('events').EventEmitter.prototype; diff --git a/sitegin/sitegin.js b/sitegin/sitegin.js index 9587ec1c046f946799419b43b33cb8230d0039d4..0991f4c0cc07f3611f65148d9e7eb3452dabd1e6 100644 --- a/sitegin/sitegin.js +++ b/sitegin/sitegin.js @@ -4,8 +4,8 @@ module.exports = function(config) { return jobs.registerMultiple( config, ['config', './config'], - ['readFiles', './read-files'], - ['parseHugo', './input-hugo'], + ['readFiles', './readFiles'], + ['parseHugo', './parseHugo'], ['print', './print'], ['transformer-git', './transformer-git'], @@ -15,10 +15,8 @@ module.exports = function(config) { ['transformer-markdown', './transformer-markdown'], ['transformer-nunjucks', './transformer-nunjucks'], - ['transformer-tags', './transformer-tags'], ['transformer-urlizetags', './transformer-urlizetags'], - ['transformer-other', './transformer-other'], - ['transformer-images', './transformer-images'] + ['transformer-other', './transformer-other'] ) .then(function() { return jobs; diff --git a/sitegin/transformer-basichtml.js b/sitegin/transformer-basichtml.js deleted file mode 100644 index 3ca958cfd51512aa7a916cdd2be4231919563a24..0000000000000000000000000000000000000000 --- a/sitegin/transformer-basichtml.js +++ /dev/null @@ -1,12 +0,0 @@ - -module.exports = function() { - var tr = this; - tr.fancyname = "transformer basichtml"; - tr.forEachPage = function(article, cb) { - article.content = "<!DOCTYPE html><html><meta charset=\"UTF-8\" /><head><title>" - +article.metadata.title+ - "</title></head><body>" + article.content + "</body></html>"; - cb(); - } -} - diff --git a/sitegin/transformer-other.js b/sitegin/transformer-other.js deleted file mode 100644 index 1c471a77c5d37827a8e27887c7b3bffd19127bca..0000000000000000000000000000000000000000 --- a/sitegin/transformer-other.js +++ /dev/null @@ -1,19 +0,0 @@ -var path = require('path'); - -module.exports = function(articleList) { - console.log(articleList) - return Promise.resolve(articleList); - - articleList.forEach(function(article) { - var img = article.metadata.image; - article.file = article.file.split(path.sep).join("/"); - if(img) { - if(!img.match(/^\//)) { - article.metadata.image = article.file+"/"+img; - } else { - article.metadata.image = img.replace("/",""); - } - } - }); - return Promise.resolve(articleList); -}