Attributes
Attributes let you pass data to Markdoc tags, similar to HTML attributes or React props.
You can pass values of type: number, string, boolean, JSON array, or JSON object, either directly or using variables. With a tag, you can use HTML-like syntax.
{% city
index=0
name="San Francisco"
deleted=false
coordinates=[1, 4, 9]
meta={id: "id_123"}
color=$color /%}
To pass attributes to a node, you can't use the HTML-like syntax. Instead, use annotation syntax. Put the attributes after the node, in their own set of {% and %}.
{% table %}
- Function {% width="25%" %}
- Returns {% colspan=2 %}
- Example {% align=$side %}
{% /table %}
(Annotation syntax also works with tags. But it's required with nodes.)
Strings within attributes must be double-quoted. If you want to include a literal double-quote in a string you can escape it with using \".
{% data delimiter="\"" /%}
Attribute shorthand
In either syntax, you can use .my-class-name and #my-id as shorthand for class=my-class-name and id=my-id.
# Examples {% #examples %}
{% table .striped #exampletable %}
- One
- Two
- Three
{% /table %}
Defining attributes
Markdoc lets you configure custom attribute types for each tag. Assigning a type to an attribute limits which values an attribute can pass to a tag and, as a result, which values create errors during validation.
The following example defines an attribute for a Callout tag. By default, the attribute is set to note and validated against the matches array.
{
render: 'Callout',
children: ['paragraph', 'tag', 'list'],
attributes: {
type: {
type: String,
default: 'note',
required: true,
matches: ['caution', 'check', 'note', 'warning'],
errorLevel: 'critical',
},
}
};
| Option | Type | Description |
|---|---|---|
type |
| Specifies the data type of the attribute. |
default | The value must be the same data type defined for the attribute and, if applicable, appear in matches. | Specifies the default behavior of the attribute if no value is provided. |
required | boolean | Specifies whether a value must be passed to the attribute. If no value is provided, the system throws an error. |
matches | A regular expression, array of strings, or function that takes an option and returns strings. | Specifies a string pattern to match against an attribute value. |
errorLevel |
| Specifies how Markdoc reports a validation error. Errors are ordered in ascending severity. |
Create a custom attribute
With Markdoc you can create custom attributes, and use them within tags. In this example, you're creating a DateTime attribute that makes sure a valid string is provided.
// ./attribute-types/DateTime.js
export class DateTime {
validate(value, config) {
if (typeof value !== 'string' || isNaN(Date.parse(value)))
return [
{
id: 'invalid-datetime-type',
level: 'critical',
message: 'Must be a string with a valid date format'
}
];
return [];
}
transform(value, config) {
return Date.parse(value);
}
}
Then, pass the custom attribute to your tag definition in your config object.
import { DateTime } from './attribute-types/DateTime';
/** @type {import('@markdoc/markdoc').Config} */
const config = {
tags: {
'tag-name': {
render: 'YourComponent',
attributes: {
created: {
type: DateTime,
required: true
}
}
}
}
};