docpage
Version:
Quickly create a documentation site from a single markdown file
106 lines (84 loc) • 2.91 kB
JavaScript
var assert = require('assert')
var http = require('http')
var path = require('path')
var fs = require('fs')
var request = require('nets')
var tmpdir = require('os-tmpdir')
var xtend = require('xtend')
var parseMarkdown = require('./lib/parse-markdown')
var createHTML = require('./lib/create-html')
var createWatcher = require('./lib/watch')
module.exports = function docpage (opts) {
opts = opts || {}
var host = opts.host || 'https://api.docpage.org'
return {
build: build,
publish: publish,
start: start
}
function build (filepath, options, callback) {
assert.equal(typeof filepath, 'string', 'filepath string is required')
assert.equal(typeof options, 'object', 'options object is required')
assert.equal(typeof callback, 'function', 'callback function is required')
parse(filepath, options, callback)
if (options.watch) {
var watch = createWatcher(filepath)
console.log('watching for file changes:', filepath)
watch.on('change', function (path) {
console.log('file change:', filepath)
parse(path, options, callback)
})
}
function parse (filepath, options, callback) {
parseMarkdown(filepath, options, function (err, md) {
if (err) return callback(err)
md = xtend(md, options)
var file = createHTML(md)
if (!options.output) return callback(null, file)
fs.writeFile(options.output, file, function (err) {
if (err) return callback(err)
callback(null, file)
})
})
}
}
function publish (filepath, options, callback) {
assert.equal(typeof options.token, 'string', 'options.token is required')
assert.equal(typeof options.slug, 'string', 'options.slug string is required')
options.output = options.output || path.join(tmpdir(), 'index.html')
build(filepath, options, function (err, file) {
if (err) return callback(err)
var formData = {
index: fs.createReadStream(options.output)
}
var opts = {
url: host + '/sites',
method: 'POST',
formData: formData,
json: true,
headers: {
slug: options.slug,
authorization: 'Bearer ' + options.token
}
}
request(opts, callback)
})
}
function start (filepath, options, callback) {
options.output = options.output || path.join(tmpdir(), 'index.html')
var server = http.createServer(function (req, res) {
res.setHeader('Content-Type', 'text/html')
fs.createReadStream(options.output).pipe(res)
})
server.listen(options.port || 5588, function () {
console.log('server listening on http://127.0.0.1:5588')
process.on('SIGINT', function () {
server.close()
process.exit()
})
})
build(filepath, options, function (err, file) {
if (err) return callback(err)
})
}
}