diff options
author | Samy Pesse <samypesse@gmail.com> | 2016-02-11 21:44:38 +0100 |
---|---|---|
committer | Samy Pesse <samypesse@gmail.com> | 2016-02-11 21:44:38 +0100 |
commit | 669f3b39849890c48171d807225cd6eaa3c9086b (patch) | |
tree | bc07fefc4e13ac8f737174166ac1d19512379298 /lib/page/index.js | |
parent | e7eed2abbe91fa44bd071819123bd9ea04d1702a (diff) | |
download | gitbook-669f3b39849890c48171d807225cd6eaa3c9086b.zip gitbook-669f3b39849890c48171d807225cd6eaa3c9086b.tar.gz gitbook-669f3b39849890c48171d807225cd6eaa3c9086b.tar.bz2 |
Add base for normalizing html
Diffstat (limited to 'lib/page/index.js')
-rw-r--r-- | lib/page/index.js | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/lib/page/index.js b/lib/page/index.js new file mode 100644 index 0000000..8f8819c --- /dev/null +++ b/lib/page/index.js @@ -0,0 +1,121 @@ +var _ = require('lodash'); +var path = require('path'); +var parsers = require('gitbook-parsers'); + +var error = require('../utils/error'); +var Promise = require('../utils/promise'); +var HTMLPipeline = require('./html'); + +/* +A page represent a parsable file in the book (Markdown, Asciidoc, etc) +*/ + +function Page(book, filename) { + if (!(this instanceof Page)) return new Page(book, filename); + var extension; + _.bindAll(this); + + this.book = book; + this.log = this.book.log; + + // Current content + this.content = ''; + + // Relative path to the page + this.path = filename; + + // Absolute path to the page + this.rawPath = this.book.resolve(filename); + + // Last modification date + this.mtime = 0; + + // Can we parse it? + extension = path.extname(this.path); + this.parser = parsers.get(extension); + if (!this.parser) throw error.ParsingError(new Error('Can\'t parse file "'+this.path+'"')); + + this.type = this.parser.name; +} + +// Return the filename of the page with another extension +// "README.md" -> "README.html" +Page.prototype.withExtension = function(ext) { + return path.join( + path.dirname(this.path), + path.basename(this.path, path.extname(this.path)) + ext + ); +}; + +// Update content of the page +Page.prototype.update = function(content) { + this.content = content; +}; + +// Read the page as a string +Page.prototype.read = function() { + var that = this; + + return this.book.statFile(this.path) + .then(function(stat) { + that.mtime = stat.mtime; + return that.book.readFile(that.path); + }) + .then(this.update); +}; + +// Parse the page and return its content +Page.prototype.parse = function(opts) { + var that = this; + + opts = _.defaults(opts || {}, { + + }); + + + this.log.debug.ln('start parsing file', this.path); + + return this.read() + + // Pre-process page with parser + .then(function() { + return that.parser.page.prepare(that.content) + .then(that.update); + }) + + // Render template + .then(function() { + return that.book.template.renderString(that.content, { + file: { + path: that.path, + mtime: that.mtime + } + }, { + file: that.path + }) + .then(that.update); + }) + + // Render markup using the parser + .then(function() { + return that.parser.page(that.content) + .then(that.update); + }) + + // Normalize HTML output + .then(function() { + return Promise.map(that.content.sections, function(section) { + var pipeline = new HTMLPipeline(section.content, opts); + + return pipeline.output() + .then(function(content) { + return { + content: content + }; + }); + }); + }); +}; + + +module.exports = Page; |