From c0fd802cc2258acb77ae9beba3507c93857ce278 Mon Sep 17 00:00:00 2001 From: "dcposch@dcpos.ch" Date: Thu, 4 Feb 2016 04:11:17 -0800 Subject: [PATCH] doc: link to man pages This changes the doc generator to automatically link references such as `open(2)` to a man page on man7.org or freebsd.org PR-URL: https://github.com/nodejs/node/pull/5073 Reviewed-By: Ben Noorhduis Reviewed-By: James M Snell Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Roman Reiss --- doc/api/documentation.markdown | 16 ++++++++++++++++ tools/doc/html.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/doc/api/documentation.markdown b/doc/api/documentation.markdown index dc09e4689491d2..0eb9eb9dbd9800 100644 --- a/doc/api/documentation.markdown +++ b/doc/api/documentation.markdown @@ -66,3 +66,19 @@ Every HTML file in the markdown has a corresponding JSON file with the same data. This feature was added in Node.js v0.6.12. It is experimental. + +## Syscalls and man pages + +System calls like open(2) and read(2) define the interface between user programs +and the underlying operating system. Node functions which simply wrap a syscall, +like `fs.open()`, will document that. The docs link to the corresponding man +pages (short for manual pages) which describe how the syscalls work. + +**Caveat:** some syscalls, like lchown(2), are BSD-specific. That means, for +example, that `fs.lchown()` only works on Mac OS X and other BSD-derived systems, +and is not available on Linux. + +Most Unix syscalls have Windows equivalents, but behavior may differ on Windows +relative to Linux and OS X. For an example of the subtle ways in which it's +sometimes impossible to replace Unix syscall semantics on Windows, see [Node +issue 4760](https://github.com/nodejs/node/issues/4760). diff --git a/tools/doc/html.js b/tools/doc/html.js index a14d9a2bd2e3ee..2565c97128b380 100644 --- a/tools/doc/html.js +++ b/tools/doc/html.js @@ -77,6 +77,7 @@ function render(lexed, filename, template, cb) { filename = path.basename(filename, '.markdown'); + parseText(lexed); lexed = parseLists(lexed); // generate the table of contents. @@ -105,6 +106,15 @@ function render(lexed, filename, template, cb) { }); } +// handle general body-text replacements +// for example, link man page references to the actual page +function parseText(lexed) { + lexed.forEach(function(tok) { + if (tok.text) { + tok.text = linkManPages(tok.text); + } + }); +} // just update the list item text in-place. // lists that come right after a heading are what we're after. @@ -167,11 +177,33 @@ function parseLists(input) { } +// Syscalls which appear in the docs, but which only exist in BSD / OSX +var BSD_ONLY_SYSCALLS = new Set(['lchmod']); + +// Handle references to man pages, eg "open(2)" or "lchmod(2)" +// Returns modified text, with such refs replace with HTML links, for example +// 'open(2)' +function linkManPages(text) { + return text.replace(/ ([a-z]+)\((\d)\)/gm, function(match, name, number) { + // name consists of lowercase letters, number is a single digit + var displayAs = name + '(' + number + ')'; + if (BSD_ONLY_SYSCALLS.has(name)) { + return ' ' + displayAs + ''; + } else { + return ' ' + displayAs + ''; + } + }); +} + function parseListItem(text) { var parts = text.split('`'); var i; var typeMatches; + // Handle types, for example the source Markdown might say + // "This argument should be a {Number} or {String}" for (i = 0; i < parts.length; i += 2) { typeMatches = parts[i].match(/\{([^\}]+)\}/g); if (typeMatches) {