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

docengine

v3.2.0

Published

Markdown based code-example documentation engine for Javascript

Downloads

6

Readme

Docengine

docengine.js is a simple Markdown based Javascript documentation engine. It renders <pre class="docengine"> blocks as Markdown. It also runs code blocks within these as JavaScript.

Installation

Download the library via npm:

npm install docengine

To set it up, include this in your HTML:

<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/default.min.css">

<script src="http://cdnjs.cloudflare.com/ajax/libs/marked/0.3.6/marked.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js"></script>
<script src="node_modules/docengine/docengine.min.js"></script>
<script src="node_modules/docengine/uglify.min.js"></script>                <!-- required only for console mode -->

Markdown

Elements with a docengine class are converted to Markdown.

<pre class="docengine">
This is in **bold** and *italic*. Here is a [link](https://example.org/)
</pre>

Code blocks are displayed as-is.

<pre class="docengine">
Code block is highlighted as JavaScript because of the fenced block language "js".

```js
x = 100 + 200;    // This is syntax-highlighted as JS
```

Code block is highlighted as Python because of the fenced block language "python".

```python
x = 100 // 20     # This is syntax-highlighted as Python
```
</pre>

A // docengine lang:js comment on the first line sets the language to JavaScript. This helps with syntax-highlighting.

<pre class="docengine">
Code block is highlighted as JavaScript because of // docengine lang:js

    // docengine lang:js
    x = 100 + 200;    // This is syntax-highlighted as JS
</pre>

If all code blocks have the same language, use data-lang="js".

<pre class="docengine" data-lang="js">
All code blocks in this section are highlighted as JavaScript because of the `data-lang="js"`.

    x = 100 + 200;    // This is syntax-highlighted as JS

Another code block:

    y = "abc";        // This is syntax-highlighted as JS
</pre>

You can override the data-lang attribute in individual code blocks with a // docengine lang: commend or a fenced code block.

<pre class="docengine" data-lang="js">
This code block is rendered as Python. The `docengine lang:` comment overides the `data-lang` attribute.

    // docengine lang:python
    x = 100 // 20       # This is syntax-highlighted as Python

Fenced code block languages also override `data-lang`.

```python
x = 100 // 20       # This is syntax-highlighted as Python
```
</pre>

Console mode

A // docengine console comment on the first line evaluates prints the output of each JavaScript code blocks below each line. (Non-JS code blocks don't have output.)

<pre class="docengine">
In console mode, each line's result is printed below the line.

    // docengine console lang:js
    var x = 200;      // Assigns value. No result, so doesn't print anything
    x + 10;           // Prints 210
    y = {x:1, y:2}    // Prints {"x": 1, "y": 2}
    abc()             // Prints an error
</pre>

You can specify console mode for all code blocks via data-console.

<pre class="docengine" data-console>
All code blocks in this section are evaluated in DOM mode because of the `data-console` attribute.

```js
x = 100 + 200;      // Prints 300
```

Another code block that is evaluated:

    // docengine lang:js
    x = 200 + 300;    // Prints 500

Non-JS code blocks are not evaluated:

    x = 400 + 500;    // No language: Does not print anything

Here is another non-JS code block:

```python
x = 100 // 20     # Python code: coes not print anything
```
</pre>

Use // docengine none to cancel console mode for a block.

<pre class="docengine" data-console>
This code block will not be evaluated because of `// docengine none`.

    // docengine none
    x = 100 + 200;    // Does not print anything
</pre>

Use // indent:4 or data-indent="4" to indent JSON responses by 4 spaces.

<pre class="docengine" data-console data-indent="4" data-lang="js">
This output will be indented by 4 spaces:

    x = [1, 2]

This output will be indented by 8 spaces:

    // docengine indent:8
    x = [1, 2]
</pre>

DOM mode

A // docengine dom comment on the first line adds a DOM element named node just below each code block. You can add style or HTML elements to it.

<pre class="docengine">
Below this code block, a DIV element is shown with a red background and the text "This is in red".

    // docengine dom lang:js
    node.style.background = 'red'
    node.innerHTML = 'This is in red'
</pre>

By default, DIV elements are added. You can change that via // docengine dom:tag.class.

<pre class="docengine">
This code block adds an BLOCKQUOTE element with class border instead of a DIV.

    // docengine dom:blockquote.border lang:js
    node.innerHTML = 'This is a blockquote with class="border"'
</pre>

You can specify DOM mode for all code blocks via data-dom.

<pre class="docengine" data-dom data-lang="js">
All code blocks have a DIV element after them.

    node.innerHTML = 'First code block'
    node.style.background = 'lime'

Here's another code block:

    node.innerHTML = 'Second code block'
    node.style.background = 'yellow'
</pre>

You can specify a tag and class for all code blocks.

<pre class="docengine" data-dom="blockquote.border" data-lang="js">
This code block is rendered in an SVG tag with class "wide".

    node.innerHTML = 'This is a blockquote with class="border"'
</pre>

Use // docengine none to cancel DOM mode for a block.

<pre class="docengine" data-dom="blockquote.border" data-lang="js">
This code block is rendered in an SVG tag with class "wide".

    // docengine none lang:python
    node = 100 // 20    # This Python code is not evaluated
</pre>

Metadata

You can include YAML front matter at the beginning between triple-dashed lines. You must install:

npm install yaml-front-matter

This include this in your HTML:

<script src="node_modules/yaml-front-matter/dist/js-yaml-front-client.min.js"></script>

Now, YAML metadata is processed independent of the Markdown. For example:

<pre class="docengine">
---
title: Document title
date: 20 Oct 2016
---
The metadata in this block is ignored. The content (this paragraph) is rendered.
</pre>

The metadata can be pre-processed by a function specified in data-meta.

<pre class="docengine" data-meta="console.log">
---
title: Document title
date: 20 Oct 2016
---
The `data-meta="console.log"` ensures that `console.log(metadata, node)` is
called before rendering. (Check the console.)
</pre>

If the data-meta function returns a string, that string is rendered instead.

<pre class="docengine" data-console>
```js
function show_title(metadata) { return metadata.title }
```
</pre>
<pre class="docengine" data-meta="show_title">
---
title: This is the title. Only this line will be visible.
---
It doesn't matter what's here. You'll only see the title.
</pre>

If the data-meta function returns a promise, the node will be rendered with the promise's value if it's a string.

<pre class="docengine" data-console>
```js
function show_title_later(metadata) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      // Resolve with a string to change the output.
      // Resolve with anything other than a string to retain the output
      resolve(metadata.title)
    }, 1000)
  })
}
```
</pre>
<pre class="docengine" data-meta="show_title_later">
---
title: This is the title. Only this line will be visible -- but after 1 second
---
It doesn't matter what's here. You'll only see the title -- but after 1 second
</pre>

Callback

Once the output node is rendered, a callback function can be called.

<pre class="docengine" data-callback="console.log">
This calls `console.log(output_node)` once done
</pre>

The callback is called with the DOM element that docengine generates.

API

The script exposes a single function: docengine(el) renders el's contents as Markdown. For example:

<div id="example">
  # Heading
</div>
<script>
  docengine(document.querySelector('#example'))
</script>

... will replace #example with <div class="docengine"><h1>Heading</h1></div>. The new DOM element is returned by docengine.

You can pass a second object parameter that has the data- attributes. For example, docengine(el, {console: true, callback: method}) is the same as:

<pre class="docengine" data-console data-callback="method">

Highlighting

By default, if highlight.js is included, docengine enables syntax highlighting. To use a different style, link to one of the style themes in highlight.js.

Contributing

Release

Ensure that the common sections between this README.md and index.html have identical content.

Change the "version" string in package.json to "x.x.x", commit and tag:

git commit -m"summary of latest commit"
git tag -a vx.x.x -m"summary of all features in release"

Or, you can use npm version patch which automatically does the above. Then:

git push --follow-tags
npm publish               # as sanand0

Automated unit tests are pending.