UNPKG

markdown-stream-utils

Version:

Utility functions for processing markdown files using object mode streams.

144 lines (97 loc) 4.69 kB
# markdown-stream-utils Utility functions for processing markdown files using object mode streams. Used by [markdown-styles](https://github.com/mixu/markdown-styles) and by [ghost-render](https://github.com/mixu/ghost-render). ## Changelog `v1.6.0`: Updated all dependencies to latest versions. `v1.2.0`: Updated highlight.js and other dependencies, thanks @omnibs! `v1.1.0`: made `highlight` apply the syntax highlighting for the specific language if available in highlight.js. Added `md.marked` and added `opts` to `md.convertMd()`. # API ## Getting started All of the `markdown-stream-utils` functions expect to receive objects representing each markdown file. The files should have three properties: - `path`: a path to the original filename - `stat`: fs.stats object - `contents`: the contents of the file as a string Here's a full example of using `markdown-stream-utils`, with some helpers from `[pipe-iterators](https://github.com/mixu/pipe-iterators)`: ```js var pi = require('pipe-iterators'), md = require('markdown-stream-utils'); pi.fromArray([ __dirname + '/foo.md', __dirname + '/bar.md' ]) .pipe(pi.thru.obj(function(file, enc, onDone) { var stat = fs.statSync(file); if (stat.isFile()) { this.push({ path: file, stat: stat, contents: fs.readFileSync(file).toString() }); } onDone(); })) .pipe(md.parseHeader()) .pipe(md.parseMd()) .pipe(md.highlightJS()) .pipe(md.convertMd()) .pipe(pi.toArray(function(results) { console.log(results); })); ``` ## parseHeader() ```js .pipe(md.parseHeader()) ``` Parses header sections in markdown files. For example, given a object with the following `content` field: ``` title: Hello world author: foo --- # Heading ... ``` it will augment the existing object with two new fields: `title` and `author` with the specified values. The header section may be written in either JSON or YAML. There must be at least three `-` characters that separate the header from the rest of the content (on a single line). Headers may also have a beginning delimiter, e.g.: ``` --- title: Hello world --- # Heading ``` The header section will be removed from `contents`, so that only the markdown content after the `---` will be kept in the `contents` key. You can customize the `contents` field as well as the destination of the metadata. To set the contents field name, pass in an options hash with `contentsKey`. To set the metadata storage key, pass the key name in `metadataKey`; if this is false (default), the metadata is merged; if it is set then the metadata is stored under a subkey. ## parseMd() ```js pipe(md.parseMd()) ``` Given an object with a `contents` field, executes `marked.lexer()` on the contents field. The new value is the lexer tree from `marked`. ## highlight() ```js pipe(md.highlight()) ``` Iterates over the lexer tree from `parseMd`, and executes the highlight.js highlighter on each code block. You can add support for additional languages by passing a custom callback with the signature `function(code, lang) {}`, which should return either a HTML string containing the highlighted version of the code, or `false` if you want to run highlight.js on the code block. Note that you will need a highlight.js CSS style sheet in your final output so that the styling is visible. ## annotateMdHeadings() ```js pipe(md.annotateMdHeadings()) ``` Iterates over the lexer tree from `parseMd`. Annotates every heading with an id, so that when converted to HTML the headings can be targeted via links. An array all the headings is produced under `headings`. The value is an array of lexer tokens with an `id` property. For example: ``` # Test foo ``` results in the input object being augmented with: ``` { headings: [ { id: 'test', text: 'foo', type: 'heading', depth: 1 } ] } ``` By default, the markdown tokens are read from the `contents` key on the input object, and written to the `headings` key. You can customize the keys used by passing in an options hash. The `contentsKey` property controls the key from which the lexer tree is read, and the `headingsKey` controls the key to which the headings are written. ## convertMd(opts) ```js pipe(md.convertMd()) ``` Constructs a new parser using `marked` default options, overriding with the values from `opts` where specified (e.g. `opts.renderer` can be used to override the renderer). Given an object with a `contents` field, executes `Parser.parse()` on the contents field. The new value is the HTMLs from `marked`. ## marked ```js console.log(md.marked); ``` A reference to the `marked` library, in case you need to construct a marked.Renderer for convertMd.