Set up every inline scan through one freshScan
This commit is contained in:
@@ -67,6 +67,9 @@ type Scan = {
|
|||||||
spans: NestedSpans
|
spans: NestedSpans
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// What a directive's content slot inherits from the content holding it.
|
||||||
|
type SharedScan = Pick<Scan, 'definitions' | 'ownMarks' | 'path'>
|
||||||
|
|
||||||
type SlotContent = { carry: boolean; nodes: Inline[] }
|
type SlotContent = { carry: boolean; nodes: Inline[] }
|
||||||
|
|
||||||
const carriedInMark = 'no mark spelling wraps an opaque carry or an inline node spelling marks=empty: its marks are its own'
|
const carriedInMark = 'no mark spelling wraps an opaque carry or an inline node spelling marks=empty: its marks are its own'
|
||||||
@@ -79,7 +82,7 @@ const textBreak: TextBreak = { kind: 'textBreak' }
|
|||||||
|
|
||||||
// The outermost content: only here does a text break see both its neighbours.
|
// The outermost content: only here does a text break see both its neighbours.
|
||||||
export function parseInlineContent(source: string, definitions: LinkDefinitions, path: ConvertErrorPath, container: LineContainer, flavour: Flavour): Result<InlineContent> {
|
export function parseInlineContent(source: string, definitions: LinkDefinitions, path: ConvertErrorPath, container: LineContainer, flavour: Flavour): Result<InlineContent> {
|
||||||
const scan: Scan = { container, deactivatedBefore: 0, definitions, highlights: flavour === 'plain', openingSpellableLink: false, ownMarks: new Set(), path, pending: '', pieces: [], source, spans: noSpans }
|
const scan = freshScan(source, { definitions, ownMarks: new Set(), path }, { container, highlights: flavour === 'plain', spans: noSpans })
|
||||||
const scanned = scanInline(scan)
|
const scanned = scanInline(scan)
|
||||||
if (!scanned.ok) return scanned
|
if (!scanned.ok) return scanned
|
||||||
if (scanned.value.image !== undefined) return success({ image: scanned.value.image })
|
if (scanned.value.image !== undefined) return success({ image: scanned.value.image })
|
||||||
@@ -93,6 +96,10 @@ export function parseInlineContent(source: string, definitions: LinkDefinitions,
|
|||||||
return success({ carry: scanned.value.carry, nodes: nodes.value })
|
return success({ carry: scanned.value.carry, nodes: nodes.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function freshScan(source: string, shared: SharedScan, own: Pick<Scan, 'container' | 'highlights' | 'spans'>): Scan {
|
||||||
|
return { ...shared, ...own, deactivatedBefore: 0, openingSpellableLink: false, pending: '', pieces: [], source }
|
||||||
|
}
|
||||||
|
|
||||||
function scanInline(scan: Scan): Result<Scanned> {
|
function scanInline(scan: Scan): Result<Scanned> {
|
||||||
const { source } = scan
|
const { source } = scan
|
||||||
let index = 0
|
let index = 0
|
||||||
@@ -274,7 +281,8 @@ function refuseLinkDirective(scan: Scan, mark: AdfMark, nodes: readonly Inline[]
|
|||||||
|
|
||||||
function slotContent(scan: Scan, span: DirectiveSpan): Result<SlotContent | undefined> {
|
function slotContent(scan: Scan, span: DirectiveSpan): Result<SlotContent | undefined> {
|
||||||
if (span.content === undefined) return success(undefined)
|
if (span.content === undefined) return success(undefined)
|
||||||
const parsed = scanInline({ ...scan, container: undefined, deactivatedBefore: 0, highlights: false, openingSpellableLink: false, pending: '', pieces: [], source: span.content, spans: span.spans })
|
const { definitions, ownMarks, path } = scan
|
||||||
|
const parsed = scanInline(freshScan(span.content, { definitions, ownMarks, path }, { container: undefined, highlights: false, spans: span.spans }))
|
||||||
if (!parsed.ok) return parsed
|
if (!parsed.ok) return parsed
|
||||||
if (parsed.value.image !== undefined) return failure('unmappable-image', imageAlone, scan.path)
|
if (parsed.value.image !== undefined) return failure('unmappable-image', imageAlone, scan.path)
|
||||||
return success(parsed.value)
|
return success(parsed.value)
|
||||||
|
|||||||
Reference in New Issue
Block a user