From 465c1e58e78af1a1f6961a1b07eb3235c31d571c Mon Sep 17 00:00:00 2001 From: Franklin Koch Date: Mon, 28 Mar 2022 09:51:31 -0600 Subject: [PATCH 1/3] Add legend to figure --- src/directives/images.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) 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] } } From 06c40d634d5f0948187bb42bcf0406b1996607bd Mon Sep 17 00:00:00 2001 From: Franklin Koch Date: Mon, 28 Mar 2022 09:52:05 -0600 Subject: [PATCH 2/3] Add parsed role/directive tokens --- src/directives/main.ts | 2 +- src/directives/plugin.ts | 24 +++++++++++++++++++----- src/roles/plugin.ts | 19 +++++++++++++++---- 3 files changed, 35 insertions(+), 10 deletions(-) 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..404426f 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,26 @@ 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.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) + 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..44d1b79 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})\\}(`+)(?!`)(.+?)(? Date: Mon, 28 Mar 2022 11:34:03 -0600 Subject: [PATCH 3/3] Hide parsed role/directive tokens --- src/directives/plugin.ts | 2 ++ src/roles/plugin.ts | 2 ++ tests/fixtures/directives.admonitions.md | 1 + tests/fixtures/roles.references.eq.md | 1 + tests/fixtures/roles.references.numref.md | 2 ++ 5 files changed, 8 insertions(+) diff --git a/src/directives/plugin.ts b/src/directives/plugin.ts index 404426f..fb4bd19 100644 --- a/src/directives/plugin.ts +++ b/src/directives/plugin.ts @@ -59,6 +59,7 @@ function runDirectives(directives: { ) 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, @@ -67,6 +68,7 @@ function runDirectives(directives: { 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 = { diff --git a/src/roles/plugin.ts b/src/roles/plugin.ts index 44d1b79..4f7693f 100644 --- a/src/roles/plugin.ts +++ b/src/roles/plugin.ts @@ -78,6 +78,7 @@ function runRoles(roles: { const role = new roles[child.meta.name](state) const roleOpen = new state.Token("parsed_role_open", "", 1) roleOpen.content = child.content + roleOpen.hidden = true roleOpen.meta = { name: child.meta.name } roleOpen.block = false const newTokens = [roleOpen] @@ -89,6 +90,7 @@ function runRoles(roles: { ) const roleClose = new state.Token("parsed_role_close", "", -1) roleClose.block = false + roleClose.hidden = true newTokens.push(roleClose) childTokens.push(...newTokens) } catch (err) { diff --git a/tests/fixtures/directives.admonitions.md b/tests/fixtures/directives.admonitions.md index cf77b69..31a863e 100644 --- a/tests/fixtures/directives.admonitions.md +++ b/tests/fixtures/directives.admonitions.md @@ -57,6 +57,7 @@ nested-admonition