James Brumond 448d93f1f5
All checks were successful
Build and test / build-and-test (18.x) (push) Successful in 19s
Build and test / build-and-test (20.x) (push) Successful in 22s
cleanup
2023-08-19 16:05:21 -07:00
2023-08-19 16:05:21 -07:00
2023-08-19 16:03:08 -07:00
2023-05-06 14:03:40 -07:00
2023-08-19 16:03:21 -07:00
2023-08-19 16:03:21 -07:00
2023-05-06 14:08:59 -07:00

Markdown to HTML Converter

This project pulls together a number of other projects, along with some custom extensions, to provide rendering to HTML for a custom, extended version of Markdown.

These are the primary projects used to render various types of content:

Install from npm

# Update project npm config to refer to correct registry for the @doc-utils scope
echo '@doc-utils:registry=https://gitea.jbrumond.me/api/packages/doc-utils/npm/' >> ./.npmrc

# Install package for programatic use
npm install --save @doc-utils/markdown2html

# Install globally for CLI usage
npm install --global @doc-utils/markdown2html

Building from source

npm run tsc

Programatic Use

import { MarkdownOptions, render_markdown_to_html } from '@doc-utils/markdown2html';

async function main() {
  const options: MarkdownOptions = {
    base_url: 'https://example.com',
  };

  const html = await render_markdown_to_html('# This is some markdown', options);
}

Handling front matter

import { process_frontmatter } from '@doc-utils/markdown2html';

const raw_content = `---
title: Example Markdown with front matter
foo:
- bar
- baz
---

# This is some markdown
`;

const { frontmatter, document } = process_frontmatter(raw_content);

console.log(frontmatter.title);  // "Example Markdown with front matter"
console.log(frontmatter.foo);    // [ "bar", "baz" ]
console.log(document);           // "\n# This is some markdown\n"

Command Line Use

echo '# This is some markdown' | ./bin/markdown2html --base-url 'https://example.com' > output.html

Handling front matter

filecontents="---
title: Example Markdown with front matter
foo:
- bar
- baz
---

# This is some markdown
"

echo "$filecontents" | ./bin/strip-frontmatter frontmatter.json > markdown.md

Options

  • options.base_url / --base-url - Sets the Marked baseUrl option
  • options.breaks / --breaks - Sets the Marked breaks option
  • options.inline / --inline - Sets the Marked inline option
  • options.katex_macros / --katex-macro - Defines any global Katex macros to be used.
  • options.extensions - Any additional Marked extension factories to use

Katex Macro Examples

const options: MarkdownOptions = {
  katex_macros: {
    '\\foobar': '\\text{foo} + \\text{bar}',
    '\\bazqux': '\\text{baz} + \\text{qux}',
  }
};
./bin/markdown2html \
  --katex-macro '\foobar' '\text{foo} + \text{bar}' \
  --katex-macro '\bazqux' '\text{baz} + \text{qux}'

Extensions

// extension.ts
import type { marked } from 'marked';
import type { MarkdownOptions } from '@doc-utils/markdown2html';

export interface MyCustomToken extends marked.Tokens.Generic {
  // ...
}

export function my_extension(renderer: marked.Renderer, options: MarkdownOptions) : marked.TokenizerExtension & marked.RendererExtension {
  return {
    name: 'my_extension',
    level: 'inline',
    start: (src) => src.match(/...../)?.index,
    tokenizer(src, tokens) : MyCustomToken {
      const rule = /...../;
      const match = rule.exec(src);

      if (match) {
        return {
          // ...
        };
      }
    },
    renderer(token: MyCustomToken) {
      return '<!-- rendered html -->';
    }
  };
};



// ----------

// main.ts
import { my_extension } from './extension';
import { MarkdownOptions, render_markdown_to_html } from '@doc-utils/markdown2html';

async function main() {
  const options: MarkdownOptions = {
    // ...
    extensions: [
      my_extension
    ]
  };

  const html = await render_markdown_to_html('# This is some markdown', options);
}
Description
No description provided
Readme 4.3 MiB
Languages
TypeScript 99.4%
Shell 0.3%
JavaScript 0.3%