diff --git a/Makefile b/Makefile index 5bfb80119c3951..89f679b9ca39ab 100644 --- a/Makefile +++ b/Makefile @@ -184,6 +184,23 @@ test-timers: test-timers-clean: $(MAKE) --directory=tools clean +guidedoc_sources = $(wildcard doc/guides/*.md) +guidedocs = $(addprefix out/,$(guidedoc_sources:.md=.html)) + +guidedoc_dirs = out/doc out/doc/guides/ out/doc/guides/assets + +# TODO(qard): Lifted api assets for now, may want to separate those. +guideassets = $(subst api_assets,guides/assets,$(addprefix out/,$(wildcard doc/api_assets/*))) + +$(guidedoc_dirs): + mkdir -p $@ + +out/doc/guides/assets/%: doc/api_assets/% out/doc/guides/assets/ + cp $< $@ + +out/doc/guides/%.html: doc/guides/%.md $(NODE_EXE) + $(NODE) tools/doc/generate.js --format=html-guides --template=doc/guide-template.html $< > $@ + apidoc_sources = $(wildcard doc/api/*.markdown) apidocs = $(addprefix out/,$(apidoc_sources:.markdown=.html)) \ $(addprefix out/,$(apidoc_sources:.markdown=.json)) @@ -192,7 +209,9 @@ apidoc_dirs = out/doc out/doc/api/ out/doc/api/assets apiassets = $(subst api_assets,api/assets,$(addprefix out/,$(wildcard doc/api_assets/*))) -doc: $(apidoc_dirs) $(apiassets) $(apidocs) tools/doc/ $(NODE_EXE) +guidedocs: $(guidedoc_dirs) $(guideassets) $(guidedocs) tools/doc/ $(NODE_EXE) + +doc: $(apidoc_dirs) $(apiassets) $(apidocs) $(guidedoc_dirs) $(guideassets) $(guidedocs) tools/doc/ $(NODE_EXE) $(apidoc_dirs): mkdir -p $@ diff --git a/doc/guides/test.md b/doc/guides/test.md new file mode 100644 index 00000000000000..67ce15643d0345 --- /dev/null +++ b/doc/guides/test.md @@ -0,0 +1,3 @@ +# Table of Contents + +# Hello, world diff --git a/tools/doc/generate.js b/tools/doc/generate.js index 7e47f4b0c2abb5..931845e367bc04 100644 --- a/tools/doc/generate.js +++ b/tools/doc/generate.js @@ -54,6 +54,14 @@ function next(er, input) { }); break; + // TODO: Merge guide and api html generators + case 'html-guides': + require('./guides.js')(input, inputFile, template, function(er, html) { + if (er) throw er; + console.log(html); + }); + break; + default: throw new Error('Invalid format: ' + format); } diff --git a/tools/doc/guides.js b/tools/doc/guides.js new file mode 100644 index 00000000000000..6f83e8fa5d7905 --- /dev/null +++ b/tools/doc/guides.js @@ -0,0 +1,48 @@ +var fs = require('fs'); +var path = require('path'); + +var VFile = require('vfile'); +var remark = require('remark'); +var remarkHtml = require('remark-html'); +var slug = require('remark-slug'); +var toc = require('remark-toc'); +// TODO(qard): includes get hijacked by preprocess in generate script +// var include = require('remark-include'); + +module.exports = toHTML; + +function makeVFile (input, filepath) { + var dir = path.dirname(filepath); + var ext = path.extname(filepath); + var name = path.basename(filepath, ext).slice(1); + return new VFile({ + directory: dir, + filename: name, + extension: ext, + contents: input + }); +} + +function render (template, content, cb) { + fs.readFile(template, function (err, res) { + if (err) return cb(err); + var body = res.toString(); + body = body.replace(/__CONTENT__/g, content); + cb(null, body); + }); +} + +function toHTML(input, filepath, template, cb) { + var processor = remark(); + processor.use(toc); + processor.use(slug); + processor.use(remarkHtml); + // TODO(qard): includes get hijacked by preprocess in generate script + // processor.use(include, { + // cwd: 'doc/guides' + // }); + + var file = makeVFile(input, filepath); + var content = processor.process(file); + render(template, content, cb); +} diff --git a/tools/doc/package.json b/tools/doc/package.json index d87c9345b33f2e..33a84fbb52d576 100644 --- a/tools/doc/package.json +++ b/tools/doc/package.json @@ -7,7 +7,13 @@ "node": ">=0.6.10" }, "dependencies": { - "marked": "~0.1.9" + "marked": "~0.1.9", + "remark": "^3.2.2", + "remark-html": "^2.0.2", + "remark-include": "^1.0.1", + "remark-slug": "^4.0.0", + "remark-toc": "^2.0.1", + "vfile": "^1.3.1" }, "devDependencies": {}, "optionalDependencies": {},