55 lines
1.5 KiB
JavaScript
55 lines
1.5 KiB
JavaScript
|
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,
|
||
|
units: config.units,
|
||
|
types: config.types,
|
||
|
atrules: config.atrules,
|
||
|
properties: config.properties,
|
||
|
node: config.node
|
||
|
}, syntax);
|
||
|
|
||
|
return syntax;
|
||
|
};
|
||
|
|
||
|
export default config => createSyntax(mix({}, config));
|