Haha-Yes/node_modules/ref/docs/compile.js
2018-09-09 21:20:36 +02:00

153 lines
3.7 KiB
JavaScript

/**
* Module dependencies.
*/
var fs = require('fs')
var dox = require('dox')
var jade = require('jade')
var marked = require('marked')
var hljs = require('highlight.js')
var assert = require('assert')
fs.readFile(__dirname + '/../lib/ref.js', 'utf8', function (err, data) {
if (err) throw err
// don't depend on dox for parsing the Markdown (raw: true)
var docs = dox.parseComments(data, { raw: true })
var base = 0
var sections = []
docs.forEach(function (doc, i) {
doc.tags.forEach(function (t) {
if (t.type === 'section') {
sections.push(docs.slice(base, i))
base = i
}
if (t.type === 'name') {
doc.name = t.string
}
if (t.type === 'type') {
doc.type = t.types[0]
}
})
if (!doc.name) {
doc.name = doc.ctx && doc.ctx.name
}
if (!doc.type) {
doc.type = doc.ctx && doc.ctx.type || 'property'
}
})
sections.push(docs.slice(base))
assert.equal(sections.length, 3)
// get the 3 sections
var exports = sections[0]
var types = sections[1]
var extensions = sections[2]
// move NULL_POINTER from "types" to "exports"
var null_pointer = types.pop()
assert.equal(null_pointer.name, 'NULL_POINTER')
exports.push(null_pointer)
// extract the "return" and "param" types
exports.forEach(function (doc) {
doc.tags.forEach(function (t) {
if (t.description) {
// parse the Markdown descriptions
t.description = markdown(t.description).trim()
// remove the surrounding <p> tags
t.description = t.description.substring(3, t.description.length - 4)
}
})
doc.returnType = doc.tags.filter(function (t) {
return t.type == 'return'
})[0]
doc.paramTypes = doc.tags.filter(function (t) {
return t.type == 'param'
})
})
// sort
exports = exports.sort(sort)
extensions = extensions.sort(sort)
// parse and highlight the Markdown descriptions
;[exports, types, extensions].forEach(function (docs) {
docs.forEach(function (doc) {
var desc = doc.description
desc.full = markdown(desc.full)
desc.summary = markdown(desc.summary)
desc.body = markdown(desc.body)
})
})
// get a reference to the ref export doc object for every Buffer extension doc
extensions.forEach(function (doc) {
doc.ref = exports.filter(function (ref) {
return ref.name === doc.name
})[0]
})
fs.readFile(__dirname + '/index.jade', 'utf8', function (err, template) {
if (err) throw err
template = jade.compile(template)
var html = template({
exports: sections[0]
, types: sections[1]
, extensions: sections[2]
, package: require('../package.json')
, markdown: markdown
, highlight: highlight
})
fs.writeFile(__dirname + '/index.html', html, function (err) {
if (err) throw err
})
})
})
/**
* Sorts an array of dox objects by doc.name. If the first letter is an '_' then
* it is considered "private" and gets sorted at the bottom.
*/
function sort (a, b) {
var aname = a.name
var bname = b.name
var aprivate = a.isPrivate
var bprivate = b.isPrivate
if (aprivate && !bprivate) {
return 1
}
if (bprivate && !aprivate) {
return -1
}
return aname > bname ? 1 : -1
}
/**
* Parses Markdown into highlighted HTML.
*/
function markdown (code) {
if (!code) return code
return marked(code, {
gfm: true
, highlight: highlight
})
}
/**
* Add syntax highlighting HTML to the given `code` block.
* `lang` defaults to "javascript" if no valid name is given.
*/
function highlight (code, lang) {
if (!hljs.LANGUAGES.hasOwnProperty(lang)) {
lang = 'javascript'
}
return hljs.highlight(lang, code).value
}