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})\\}(`+)(?!`)(.+?)(?
Note

This is a note

+