micromark-extension-taggable
v1.1.0
Published
Parse and Render custom #tags and @mentions
Downloads
19
Maintainers
Readme
micromark-extension-taggable
[micromark][] extensions to support custom #tags and @mentions.
Contents
What is this?
This package contains extensions that add support for custom mentions and tags into [micromark][micromark].
It can be configured to parse tags of the following sort:
#tag @user $page #page/subpageFor example, with the default configuration,
Micromark is #awesome right @conner ?is parsed to
<p>
Micromark is
<a href="/tags/awesome" class="micromark-taggable tag">#awesome</a> right
<a href="/users/conner" class="micromark-taggable user"> @conner</a> ?
</p>Output: Micromark is #awesome right @conner ?
When to use this
This project is useful when you want to support custom tags in markdown.
You can use these extensions when you are working with [micromark][micromark].
When you need a syntax tree, you can combine this package with
mdast-util-taggable.
All these packages are used remark-taggable. It is recommended to this package when working with remark.
Install
In Node.js (version 16+), install with [npm][]:
npm install micromark-extension-taggableIn Deno with [esm.sh][esmsh]:
import {
gfmTaskListItem,
gfmTaskListItemHtml,
} from "https://esm.sh/micromark-extension-taggable";In browsers with [esm.sh][esmsh]:
<script type="module">
import {
gfmTaskListItem,
gfmTaskListItemHtml,
} from "https://esm.sh/micromark-extension-taggable?bundle";
</script>Use
import { micromark } from "micromark";
import { syntax, html } from "micromark-extension-taggable";
const output = micromark("#tag", {
extensions: [syntax()],
htmlExtensions: [html()],
});
console.log(output);Yields:
<p><a href="/tags/tag" class="micromark-taggable tag">#tag</a></p>Configuration Options
The following options can be specified:
syntax(options)
options.classes:string[]= Array of class names to be given to HTML representation of every type of taggableoptions.rules:rule[]= Describes the rules for the taggables/markers.rule.marker:string= The marker that marks the start of a tag.rule.typestring= The type of taggable.rule.toUrl:(string) => string= Function that maps the taggable name/value to a URL.rule.classes:string[]= Array of class names to be given to HTML representation of this type of taggable
options.allowEmail:boolean= If set to true, the parser will also consider@and.to be valid characters for the title/value.
The defaults are:
{
classes: ["micromark-taggable"],
rules: [
{
classes: ["tag"],
marker: "#",
toUrl: (argument) => `/tags/${argument}`,
type: "tag",
},
{
classes: ["mention"],
marker: "@",
toUrl: (argument) => `/users/${argument}`,
type: "mention",
},
]
}Returns
syntax(): Array of extension formicromarkthat can be passed inextensions.- Because it is an array, it is recommended to use
spreadsyntax when passing toextensions:extensions: [...syntax()];
- Because it is an array, it is recommended to use
html(): HtmlExtension formicromarkthat can be passed inhtmlExtensions
Returns
Extension for micromark that can be passed in htmlExtensions to support GFM
task list items when serializing to HTML
([HtmlExtension][micromark-html-extension]).
Authoring
The following restrictions apply to this markdown extension:
Spaces cannot be used in the taggable value. We recommend using dashes
-or underscores_:❌ This is a #multi word tag. ✔️ This is a #multi-word-tag.Output: >
❌ This is a <a href="/tags/multi">#multi</a> word tag.>✔️ This is a <a href="/tags/#multi-word-tag">#multi-word-tag</a>.By default, the parser only considers the following characters:
Characters in the Unicode General Category L.
The following characters:
/ | :
If the option
Option.rules.rule.allowEmailis set to true:. @
In this case, do note that periods will not terminate the taggable.
Anything outside of these characters will not be included in the taggable. For name, we recommend setting up a key for your users that use either:
- First Name: Only viable for small sets. Example:
John. - An Alias: Viable for a large set of users. Can be alphanumeric, following above constraints. Example:
USR23B3 - Using the user's email ID: Viable for any set of users. Example:
[email protected]. The optionOption.rules.rule.allowEmailneeds to be set totrue. As an example:{ rules: [ ..., { marker: "@", type: "mention", toUrl: (val) => `/users/${val.replace("@", "-at-").replace(".", "_")}`, } ], allowEmail: true }
Syntax
Checks form with the following BNF:
<taggable> ::= <marker><value>
<marker> ::= # | @
<value> ::= <text>Where both <marker> and <text> can be specified via options.
License
[MIT][license] © [Rahul Das][author]
Changes
v1.0.0:- Moved the library over to TypeScript.
- ⚠️ Breaking Change: The library now supplies an
Extensioninstead of anArray<Extension>. There is now no need for using the spread operator when passing thesyntaxextension
Please refer to the changelog for more information regarding changes
