119 lines
2.9 KiB
JavaScript
119 lines
2.9 KiB
JavaScript
import { SYMBOLS, parse, isScope, isMacro, getTail, getText, getUnmatched, isCollection } from './core.js'
|
|
|
|
const schemaTCE = `
|
|
macros
|
|
primitive match number string
|
|
section
|
|
pos number tail
|
|
content string unmatched
|
|
position number
|
|
options
|
|
parameter1 number
|
|
parameter2 string
|
|
literal unmatched string
|
|
unmatched primitive
|
|
|
|
root
|
|
title string
|
|
options options collection
|
|
subsection section
|
|
list
|
|
- string array
|
|
collection
|
|
section collection
|
|
collection2
|
|
unmatched collection
|
|
`
|
|
|
|
const schema = {
|
|
macros: {
|
|
string({ tail }) {
|
|
return tail.toString()
|
|
},
|
|
number({ tail }) {
|
|
const num = +tail
|
|
if (isNaN(num) || tail === '') return
|
|
return num
|
|
},
|
|
primitive({ macros }) {
|
|
const num = macros.number(args)
|
|
return num !== undefined ? num : macros.string(args)
|
|
},
|
|
scope({ addScope, head, tail, line }, definition) {
|
|
return addScope({ definition, head, tail, line })
|
|
},
|
|
section: isScope({
|
|
[SYMBOLS.TAIL]: getTail('pos', isMacro('number')),
|
|
[SYMBOLS.UNMATCHED]: getText('content', isMacro('string')),
|
|
position: isMacro('number')
|
|
}),
|
|
options: isScope({
|
|
parameter1: isMacro('number'),
|
|
parameter2: isMacro('string'),
|
|
unmatched: isMacro('string'),
|
|
[SYMBOLS.UNMATCHED]: getUnmatched(isMacro('any')),
|
|
}),
|
|
any(args) {
|
|
const macro = args.macros[args.head]
|
|
if (macro) return macro(args)
|
|
const numResult = args.macros.number(args)
|
|
if (numResult !== undefined) return numResult
|
|
args.tail = args.line
|
|
return args.macros.string(args)
|
|
},
|
|
},
|
|
root: {
|
|
title: isMacro('string'),
|
|
options: isMacro('options'),
|
|
subsection: isMacro('section'),
|
|
list: isScope({
|
|
'-': isMacro('string')
|
|
}),
|
|
collection: isScope({
|
|
section: isCollection(isMacro('section'))
|
|
}),
|
|
collection2: isScope({
|
|
[SYMBOLS.UNMATCHED]: getUnmatched(isMacro('any'))
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
const lines = [
|
|
`title Example`,
|
|
`options`,
|
|
` parameter1 30`,
|
|
` parameter2 Enim eu id anim minim reprehenderit nostrud eu amet deserunt ea ut do cupidatat ea.`,
|
|
`options`,
|
|
` parameter1 0`,
|
|
` parameter2 Esse incididunt et est adipisicing eiusmod aliqua enim ea aliqua id enim.`,
|
|
`subsection`,
|
|
` position 1`,
|
|
` Ea dolore in aliquip fugiat anim adipisicing amet aute tempor et deserunt est duis sint.`,
|
|
`subsection 2`,
|
|
` position 2`,
|
|
` Aute deserunt incididunt ad in sint adipisicing est officia velit pariatur ipsum deserunt quis nulla.`,
|
|
` Ea dolore in aliquip fugiat anim adipisicing amet aute tempor et deserunt est duis sint.`,
|
|
`list`,
|
|
` - item 1`,
|
|
` - item 2`,
|
|
`collection`,
|
|
` section`,
|
|
` lorem ipsum 1`,
|
|
` section`,
|
|
` lorem ipsum 2`,
|
|
`collection2`,
|
|
` section`,
|
|
` position 3`,
|
|
` Laborum aute anim occaecat occaecat pariatur tempor proident magna sit magna non non.`,
|
|
` list`,
|
|
` 1`,
|
|
` 2`
|
|
]
|
|
|
|
async function main() {
|
|
console.dir(await parse(lines, schema), { depth: null })
|
|
}
|
|
|
|
main()
|