/
compose-doc.ts
60 lines (58 loc) · 1.66 KB
/
compose-doc.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import type { Directives } from '../doc/directives.js'
import { Document } from '../doc/Document.js'
import type {
DocumentOptions,
ParseOptions,
SchemaOptions
} from '../options.js'
import type * as CST from '../parse/cst.js'
import {
ComposeContext,
composeEmptyNode,
composeNode
} from './compose-node.js'
import type { ComposeErrorHandler } from './composer.js'
import { resolveEnd } from './resolve-end.js'
import { resolveProps } from './resolve-props.js'
export function composeDoc(
options: ParseOptions & DocumentOptions & SchemaOptions,
directives: Directives,
{ offset, start, value, end }: CST.Document,
onError: ComposeErrorHandler
) {
const opts = Object.assign({ directives }, options)
const doc = new Document(undefined, opts) as Document.Parsed
const ctx: ComposeContext = {
directives: doc.directives,
options: doc.options,
schema: doc.schema
}
const props = resolveProps(start, {
ctx,
indicator: 'doc-start',
offset,
onError,
startOnNewline: true
})
if (props.found) {
doc.directives.marker = true
if (
value &&
(value.type === 'block-map' || value.type === 'block-seq') &&
!props.hasNewline
)
onError(
props.end,
'MISSING_CHAR',
'Block collection cannot start on same line with directives-end marker'
)
}
doc.contents = value
? composeNode(ctx, value, props, onError)
: composeEmptyNode(ctx, props.end, start, null, props, onError)
const contentEnd = doc.contents.range[2]
const re = resolveEnd(end, contentEnd, false, onError)
if (re.comment) doc.comment = re.comment
doc.range = [offset, contentEnd, re.offset]
return doc
}