diff --git a/src/directives/images.ts b/src/directives/images.ts
index 8762a15..a67ba05 100644
--- a/src/directives/images.ts
+++ b/src/directives/images.ts
@@ -121,7 +121,11 @@ export class Figure extends Image {
const imageToken = this.create_image(data)
imageToken.map = [data.map[0], data.map[0]]
let captionTokens: Token[] = []
+ let legendTokens: Token[] = []
if (data.body) {
+ const [caption, ...legendParts] = data.body.split("\n\n")
+ const legend = legendParts.join("\n\n")
+ const captionMap = data.bodyMap[0]
const openCaption = this.createToken("figure_caption_open", "figcaption", 1, {
block: true
})
@@ -130,14 +134,25 @@ export class Figure extends Image {
}
// TODO in docutils caption can only be single paragraph (or ignored if comment)
// then additional content is figure legend
- const captionBody = this.nestedParse(data.body, data.bodyMap[0])
+ const captionBody = this.nestedParse(caption, captionMap)
const closeCaption = this.createToken("figure_caption_close", "figcaption", -1, {
block: true
})
captionTokens = [openCaption, ...captionBody, closeCaption]
+ if (legend) {
+ const legendMap = captionMap + caption.split("\n").length + 1
+ const openLegend = this.createToken("figure_legend_open", "", 1, {
+ block: true
+ })
+ const legendBody = this.nestedParse(legend, legendMap)
+ const closeLegend = this.createToken("figure_legend_close", "", -1, {
+ block: true
+ })
+ legendTokens = [openLegend, ...legendBody, closeLegend]
+ }
}
const closeToken = this.createToken("figure_close", "figure", -1, { block: true })
- return [openToken, imageToken, ...captionTokens, closeToken]
+ return [openToken, imageToken, ...captionTokens, ...legendTokens, closeToken]
}
}
diff --git a/src/directives/main.ts b/src/directives/main.ts
index 05bf374..b8665a8 100644
--- a/src/directives/main.ts
+++ b/src/directives/main.ts
@@ -213,7 +213,7 @@ export default function directiveToData(
}
}
-function parseDirectiveOptions(
+export function parseDirectiveOptions(
content: string[],
fullSpec: IDirectiveSpec
): [string[], { [key: string]: any }, number] {
diff --git a/src/directives/plugin.ts b/src/directives/plugin.ts
index 2772b0f..fb4bd19 100644
--- a/src/directives/plugin.ts
+++ b/src/directives/plugin.ts
@@ -1,6 +1,6 @@
import type MarkdownIt from "markdown-it/lib"
import type StateCore from "markdown-it/lib/rules_core/state_core"
-import directiveToData, { Directive } from "./main"
+import directiveToData, { Directive, parseDirectiveOptions } from "./main"
import { IOptions } from "./types"
export default function directivePlugin(md: MarkdownIt, options: IOptions): void {
@@ -53,12 +53,28 @@ function runDirectives(directives: {
try {
const directive = new directives[token.info](state)
const data = directiveToData(token, directive)
- const newTokens = directive.run(data)
- // Ensure `meta` exists and add the directive options
- newTokens[0].meta = {
+ const [content, opts] = parseDirectiveOptions(
+ token.content.trim() ? token.content.split(/\r?\n/) : [],
+ directive
+ )
+ const directiveOpen = new state.Token("parsed_directive_open", "", 1)
+ directiveOpen.info = token.info
+ directiveOpen.hidden = true
+ directiveOpen.content = content.join("\n").trim()
+ directiveOpen.meta = {
+ arg: token.meta.arg,
+ opts
+ }
+ const newTokens = [directiveOpen]
+ newTokens.push(...directive.run(data))
+ const directiveClose = new state.Token("parsed_directive_close", "", -1)
+ directiveClose.hidden = true
+ newTokens.push(directiveClose)
+ // Ensure `meta` exists and add the directive options to parsed child
+ newTokens[1].meta = {
directive: true,
...data.options,
- ...newTokens[0].meta
+ ...newTokens[1].meta
}
finalTokens.push(...newTokens)
} catch (err) {
diff --git a/src/roles/plugin.ts b/src/roles/plugin.ts
index 8e13551..4f7693f 100644
--- a/src/roles/plugin.ts
+++ b/src/roles/plugin.ts
@@ -52,6 +52,7 @@ function roleRule(state: StateInline, silent: boolean): boolean {
}
// MyST role syntax format e.g. {role}`text`
+// TODO: support role with no value e.g. {role}``
let _x: RegExp
try {
_x = new RegExp("^\\{([a-zA-Z_\\-+:]{1,36})\\}(`+)(?!`)(.+?)(?
This is a note
+