You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.4 KiB
53 lines
1.4 KiB
import { tokenize } from '../tokenizer/index.js'; |
|
import { createParser } from '../parser/create.js'; |
|
import { createGenerator } from '../generator/create.js'; |
|
import { createConvertor } from '../convertor/create.js'; |
|
import { createWalker } from '../walker/create.js'; |
|
import { Lexer } from '../lexer/Lexer.js'; |
|
import mix from './config/mix.js'; |
|
|
|
function createSyntax(config) { |
|
const parse = createParser(config); |
|
const walk = createWalker(config); |
|
const generate = createGenerator(config); |
|
const { fromPlainObject, toPlainObject } = createConvertor(walk); |
|
|
|
const syntax = { |
|
lexer: null, |
|
createLexer: config => new Lexer(config, syntax, syntax.lexer.structure), |
|
|
|
tokenize, |
|
parse, |
|
generate, |
|
|
|
walk, |
|
find: walk.find, |
|
findLast: walk.findLast, |
|
findAll: walk.findAll, |
|
|
|
fromPlainObject, |
|
toPlainObject, |
|
|
|
fork(extension) { |
|
const base = mix({}, config); // copy of config |
|
|
|
return createSyntax( |
|
typeof extension === 'function' |
|
? extension(base, Object.assign) |
|
: mix(base, extension) |
|
); |
|
} |
|
}; |
|
|
|
syntax.lexer = new Lexer({ |
|
generic: true, |
|
types: config.types, |
|
atrules: config.atrules, |
|
properties: config.properties, |
|
node: config.node |
|
}, syntax); |
|
|
|
return syntax; |
|
}; |
|
|
|
export default config => createSyntax(mix({}, config));
|
|
|