import { renderNest } from '../../render'; import { ContextTag, NoMeta, UnknownToken } from '../../model'; import { MetaLinks, MetaLink, MetaAbbrevs, MetaFootnotes } from '../../block/model'; import { InlineTag, InlineLink, InlineImage, InlineStrong, InlineEm, InlineDel, InlineCode, InlineMath, InlineAbbrev, InlineFootnote, InlineBr, InlineText } from '../../inline/model'; import { InlineRenderRuleStr, escapeCode, escapeAttr, escapeHtml, sanitizeUrl, simpleId } from '../str'; export const LinkHtml: InlineRenderRuleStr, MetaLinks> = [ ContextTag.Inline, InlineTag.Link, ($, { l, t, _ }) => { const href = putLinkAttr(l, l, 'l', $.m, 'href'); const nest = renderNest($, _); return href == null ? nest : '' + nest + ''; } ]; export const ImageHtml: InlineRenderRuleStr = [ ContextTag.Inline, InlineTag.Image, ($, { l, t, _ }) => { const src = putLinkAttr(l, l, 'l', $.m, 'src'); return src ? '' : escapeHtml(_); } ]; export const ImageXHtml: InlineRenderRuleStr = [ ContextTag.Inline, InlineTag.Image, ($, { l, t, _ }) => '' ]; function putLinkAttr(l: string, v: string | void, n: keyof MetaLink, m: MetaLinks, a: string): string | void { if (m.l) { const $ = m.l[l]; if ($ && $[n]) { v = $[n] as string; } } if (n == 'l' && v) { v = sanitizeUrl(v); if (v == null) return; } return v ? ` ${a}="${escapeAttr(v as string)}"` : ''; } export const StrongHtml: InlineRenderRuleStr, NoMeta> = [ ContextTag.Inline, InlineTag.Strong, ($, { _ }) => '' + renderNest($, _) + '' ]; export const EmHtml: InlineRenderRuleStr, NoMeta> = [ ContextTag.Inline, InlineTag.Em, ($, { _ }) => '' + renderNest($, _) + '' ]; export const DelHtml: InlineRenderRuleStr, NoMeta> = [ ContextTag.Inline, InlineTag.Del, ($, { _ }) => '' + renderNest($, _) + '' ]; export const CodeSpanHtml: InlineRenderRuleStr = [ ContextTag.Inline, InlineTag.Code, ({ }, { _ }) => '' + escapeCode(_) + '' ]; export const MathSpanHtml: InlineRenderRuleStr = [ ContextTag.Inline, InlineTag.Math, ({ }, { _ }) => '' + escapeCode(_) + '' ]; export const AbbrevHtml: InlineRenderRuleStr = [ ContextTag.Inline, InlineTag.Abbrev, ({ m: { a } }, { t, _ }) => '' + escapeHtml(_) + '' ]; export const FootnoteHtml: InlineRenderRuleStr = [ ContextTag.Inline, InlineTag.Footnote, ({ m: { f } }, { l }) => { const id = simpleId(l); return '' + escapeHtml(l) + ''; } ]; export const TextHtml: InlineRenderRuleStr = [ ContextTag.Inline, InlineTag.Text, ({ }, { _ }) => escapeHtml(_) ]; export const BrHtml: InlineRenderRuleStr = [ ContextTag.Inline, InlineTag.Br, () => '
' ]; export const BrXHtml: InlineRenderRuleStr = [ ContextTag.Inline, InlineTag.Br, () => '
' ]; export const InlineHtml = [LinkHtml, ImageHtml, StrongHtml, EmHtml, CodeSpanHtml, BrHtml, TextHtml]; export const InlineXHtml = [LinkHtml, ImageXHtml, StrongHtml, EmHtml, CodeSpanHtml, BrXHtml, TextHtml]; export const InlineGfmHtml = [LinkHtml, ImageHtml, StrongHtml, EmHtml, CodeSpanHtml, BrHtml, DelHtml, TextHtml]; export const InlineGfmXHtml = [LinkHtml, ImageXHtml, StrongHtml, EmHtml, CodeSpanHtml, BrXHtml, DelHtml, TextHtml];