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 } } } } };