Add classes, identifiers and attributes to your markdown with {.class #identifier attr=value attr2="spaced value"}
curly brackets, similar to pandoc's header attributes.
Example input:
# header {.style-me}paragraph {data-toggle=modal}
Output:
headerparagraph
Works with inline elements too:
paragraph *style me*{.red} more text
Output:
paragraph style me more text
And fenced code blocks:
```python {data=asdf}
nums = [x for x in range(10)]
```
Output:
nums = [x for x in range(10)]
You can use ..
as a short-hand for css-module=
:
Use the css-module green on this paragraph. {..green}
Output:
Use the css-module green on this paragraph.
Also works with spans, in combination with the markdown-it-bracketed-spans plugin (to be installed and loaded as such then):
paragraph with [a style me span]{.red}
Output:
paragraph with a style me span
Install
$ npm install --save markdown-it-attrs
Usage
var md = ;var markdownItAttrs = ; md; var src = '# header {.green #id}\nsome text {with=attrs and="attrs with space"}';var res = md; console;
Security
A user may insert rogue attributes like this:
!imgpngonload=
If security is a concern, use an attribute whitelist:
md;
Now only id
, class
and attributes beginning with regex
are allowed:
text {#red .green regex=allowed onclick=alert('hello')}
Output:
text
Ambiguity
When class can be applied to both inline or block element, inline element will take precedence:
- list item **bold**{.red}
Output:
list item bold
If you need the class to apply to the list item instead, use a space:
- list item **bold** {.red}
Output:
list item bold
If you need the class to apply to the <ul>
element, use a new line:
- list item **bold**{.red}
Output:
list item bold
If you have nested lists, curlys after new lines will apply to the nearest <ul>
or <ol>
. You may force it to apply to the outer <ul>
by adding curly below on a paragraph by its own:
- item - nested item {.a}{.b} {.c}
Output:
item nested item
This is not optimal, but what I can do at the momemnt. For further discussion, see https://github.com/arve0/markdown-it-attrs/issues/32.
If you need finer control, decorate might help you.
Custom rendering
If you would like some other output, you can override renderers:
const md = ;const markdownItAttrs = ; md; // custom renderer for fencesmdrendererrules { const token = tokensidx; return '<pre' + slf + '>' + '<code>' + tokencontent + '</code>' + '</pre>';} let src = '' '```js {.abcd}' 'var a = 1;' '```' console;
Output:
var a = 1;
Read more about custom rendering at markdown-it.
Custom blocks
markdown-it-attrs
will add attributes to any token.block == true
with {}-curlies in end of token.info
. For example, see markdown-it/rules_block/fence.js which stores text after the three backticks in fenced code blocks to token.info
.
Remember to render attributes if you use a custom renderer.
Custom delimiters
To use different delimiters than the default, add configuration for leftDelimiter
and rightDelimiter
:
md;
Which will render
# title [.large]
as
title
License
MIT © Arve Seljebu