Plugin for markdown-it to convert Markdown into GOV.UK Frontend-compliant HTML, inspired by the govuk_markdown Ruby gem. If you are using the marked parser, use govuk-markdown.
Don’t confuse this package with govspeak, which is a Markdown dialect specifically built for the GOV.UK publishing system.
Node.js v22 or later.
npm install markdown-it-govuk --save
import markdownit from 'markdown-it'
import markdownitGovuk from 'markdown-it-govuk'
const md = markdownit.use(markdownitGovuk)The generated HTML will include the classes from GOV.UK Frontend. For example:
md.render('[A link](/foo)')Will output:
<p class="govuk-body"><a class="govuk-link" href="/foo">A link</a></p>Fenced code blocks can he highlighted using the supplied highlight function:
import markdownit from 'markdown-it'
import markdownitGovuk from 'markdown-it-govuk'
import highlight from 'markdown-it-govuk/highlight'
const md = markdownit({
highlight
})
md.use(markdownitGovuk)For example:
md.render('```js\nconsole.log(\'Hello, World!\')\n```')Will output:
<pre class="app-code app-code--block" tabindex="0">
<code class="app-code__language--js">
<span class="app-code__variable">console</span>.<span class="app-code__title">log</span>(<span class="app-code__string">'Hello, World!'</span>)
</code>
</pre>To provide styling for inline and block code, add the following to your Sass file:
@import "markdown-it-govuk/src/index";or using the Sass module system and pkg: importing:
@forward "pkg:markdown-it-govuk";These styles rely on govuk-frontend, so make sure you have this installed as a dependency in your project.
| Name | Type | Description |
|---|---|---|
headingsStartWith |
string |
Heading size to use for the top-level heading (xl or l). Default is l. |
brand |
string |
Use either 'govuk' or 'nhsuk' namespaced class names. Default is 'govuk'. |
calvert |
boolean | Array |
Typographic improvements to enable (alongside those provided by markdown-it’s typographer option). Set this option to true to enable all improvements, or array containing individual improvement sets to include (choose from fractions, guillemets and mathematical). Default is false. |
Headings start with govuk-heading-l for an <h1>, govuk-heading-m for an <h2> and so on. But change it if your pages feel unbalanced – the heading class you use does not always need to correspond to the heading level.
To start pages with govuk-heading-xl for an <h1>, govuk-heading-l for an <h2>, and so on, set the headingsStartWith option to xl:
import markdownit from 'markdown-it'
import markdownitGovuk from 'markdown-it-govuk'
const md = markdownit.use(markdownitGovuk, {
headingsStartWith: 'xl'
})
md.render('# Heading\n## Heading 2')Will output:
<h1 class="govuk-heading-xl">Heading 1</h1>
<h2 class="govuk-heading-l">Heading 2</h2>Alongside typographic replacements provided by markdown-it’s typographer option, you can enable other glyphs present in Margaret Calvert’s GDS Transport font by using the calvert option.
For example:
import markdownit from 'markdown-it'
import markdownitGovuk from 'markdown-it-govuk'
const md = markdownit.use(markdownitGovuk, {
calvert: ['fractions', 'mathematical']
})
md.render('1/2 x 1/2 = 1/4')Will output the following text, with the common fractions and correct multiplication symbol:
<p class="govuk-body">½ × ½ = ¼</p>npm run release
This command will ask you what version you want to use. It will then publish a new version on NPM, create and push a new git tag and then generate release notes ready for posting on GitHub.
Note
Releasing a new version requires permission to publish packages to the @x-govuk organisation.