npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

nodoc

v0.3.6

Published

A simple and 'low-level' source code comments parser and gitHub flavored markdown API documentation generator.

Downloads

31

Readme

nodoc

A simple and 'low-level' source code comments parser and documentation generator.

Oops, this doc is generated by nodoc itself !

NPM version Deps Up to Date

Supported Languages

  • CoffeeScript

Other languagage, especially javascript, will be supported soon.

Language Name Aliases

Use lower case, used both for language option and extname recognization.

{
    "coffee": "coffee",
    "coffeescript": "coffee",
    "js": "javascript",
    "javascript": "javascript"
}

Usage

  1. Convert comment block to an object as following:

Parsed Comment Object

```javascript
{
    name: 'parseFile',
    description: 'Parse source code from file. Use Promise instead of callback',
    tags: [ [Object], [Object], [Object], [Object] ], // tag objects array
    lineNum: 78
}
```
#### Tag Object
```javascript
{
    tagName: 'param',
    type: 'string', // only @param, @property, @option, @return
    name: 'srcPath', // only @param, @property, @option
    description: 'Path of source code file'
}
```
Tags are only key-value pairs, except `@param`, `@return`, `@property`, `@option`. They may have extra type and (maybe) name.

```javascript
var doc = require('nodoc');

// From file
doc.parser.parseFile('./src/parser/index.coffee').then(function(res){});
res = doc.parser.parseFileSync('./src/parser/index.coffee')
//From source code
doc.parser.parse('A piece of source code', 'coffee').then(function(res){});
```
  1. Generate gitHub flavored markdown API doc from comments.

    var doc = require('nodoc'),
        fs = require('fs');
    
    doc.generate('./src/parser/index.coffee', {
        moduleName: 'parser',
        moduleDesc: 'This is a parser!'
    }).then(function(markdown){
        fs.writeFileSync('./api.md', markdown);
    });

    In this case, predefined tags will make effects.

    Predefined tags

    • @private: Hidden in the generated document.
    • @nodoc: Same behavior as @private, but they are differ in semantics.
    • @alias: Shown as an addition of function name.
    • @prefix: Add a custom prefix to function name.
    • @noPrefix: Only preserve the real name, regard util.promisify as promisify.

Comment format

Of course, you need to write your comments in a standard way to make a parser work. Such as:

###*
 * Generate formatted markdown API document from source code
 * @param  {string} srcPath    Path of source code file
 * @param  {Object={}} opts    Options, optional
 * @return {Promise}           Resolve formatted markdown
 * @example
 * ` ``javascript
 * nodoc.generate('./src/index.coffee').then(function(md){
 *     console.log(md);
 * });
 * ` ``
###

As you can see, you can use markdown in your comment!

Reference: jsdoc

API

  • generate (srcPath, opts) (alias: render)

    Generate formatted markdown API document from source code

    • param: srcPath { string }

      Path of the source code file

    • param: opts { Object= }

      Options

      {
          moduleName: '', // module name of the file, or it will be auto set to file name, of parent directory name for `index` file.
          moduleDesc: '', // module decription
          template: '',   // custom template
          tplData: {},    // addition template data
          cwd: process.cwd()   // current working directory
          language: ''         // specify the language, or it will be auto recognized by extname
          rule: {}             // specific parser rule, items vary from parsers
      }
    • return: { Promise }

      Resolve markdown

    • example:

      nodoc.generate('./src/index.coffee').then(function(md){
          console.log(md);
      });
  • parser

    Parser module, see below for details.

Parser Module

  • parser.setParser (name, parser)

    Create a new parser or override an old ones

    • param: name { string|Array }

      parser's name/language (and aliases)

    • param: parser { Object }

      parser object, see below

  • parser.parse (source, language, opts)

    Parse source code directly.

    • param: source { string }

      source code

    • param: language { string }

      specify source language

    • param: opts { Object= }

      option, optional

    • return: { Array }

      parsed comments object array

    • example:

      nodoc.parser.parse("This is source code with comments", "coffee").then(function(comments){
          console.log(comments);
      })
  • parser.parseFile (filePath, opts = {})

    Parse source code from file. Use Promise instead of callback

    • param: filePath { string }

      souce file path

    • param: opts { Object={} }

      options

    • return: { Promise }

      resolve parsed comment object array

    • example:

      nodoc.parser.parseFile("index.coffee", {cwd: './src'}).then(function(comments){
          console.log(comments);
      });
  • parser.parseFileSync ()

    Synchronous version of parseFile

    • return: { Array }

      parsed comment object array

  • parser.setRule (language, rule)

    Set parser's rule

    • param: language { string }

      parser's name/language

    • param: rule { Object }

      parser's rule object

    • example:

      nodoc.parser.setRule('coffee', {
          commentReg: /#?([\s\S]+?)#\s+([\w\.]+)/g
      });

Write your own template

Nodoc uses underscore template to render the markdown template. You need to realize that template is not HTML's privilege. If you don't want to use the default template, you can use your own.

doc.generate('./src/parser/index.coffee', {
    template: 'Here is your own template'
    tplData: {}  // You can use this object to add custom data to your template
}).then(function(markdown){});

However, if you even want to use a alternative template engine, please use parser module directly.

Write your own language parser

If the languages you use is not supported by nodoc, you can write your own parser and register it by parser.setParser. If you want your parser to be a part of nodoc, please make a pull request, it is warmly welcomed.

A parser should provide follow APIs:

Parser API

  • parse (source, localRule)

    Parse comment from source code

    • param: source { string }

      source code

    • param: localRule { Object= }

      optional, custom rule object, use once

    • return: { Array }

      parsed comments object array

  • setRule (ruleObj)

    Set the rule of the parser

    • param: ruleObj { Object }

      rule object

  • getRule ()

    Hmm..., I'd like to use this to generate document.

    • return: { Object }

      rule object

Rule

A parser uses and is supposed to expose the rules it uses to parse the code.

Rules for coffee parser

{ commentReg: /###\*([\s\S]+?)###\s+([\w\.@'"]+)/g,
  splitReg: /^\s+\* ?@/m,
  tagNameReg: /^([\w\.]+)\s*/,
  typeReg: /^\{(.+|}?)\}\s*/,
  nameReg: /^([\w\.]+)\s*/,
  nameTags: [ 'param', 'property', 'option' ],
  descriptionReg: /^([\s\S]*)/,
  removePrefix: /self\.|this\.|@|'|"/g }

License

MIT