| var List = require('../common/List'); |
| var SyntaxError = require('../common/SyntaxError'); |
| var TokenStream = require('../common/TokenStream'); |
| var Lexer = require('../lexer/Lexer'); |
| var definitionSyntax = require('../definition-syntax'); |
| var tokenize = require('../tokenizer'); |
| var createParser = require('../parser/create'); |
| var createGenerator = require('../generator/create'); |
| var createConvertor = require('../convertor/create'); |
| var createWalker = require('../walker/create'); |
| var clone = require('../utils/clone'); |
| var names = require('../utils/names'); |
| var mix = require('./config/mix'); |
| |
| function createSyntax(config) { |
| var parse = createParser(config); |
| var walk = createWalker(config); |
| var generate = createGenerator(config); |
| var convert = createConvertor(walk); |
| |
| var syntax = { |
| List: List, |
| SyntaxError: SyntaxError, |
| TokenStream: TokenStream, |
| Lexer: Lexer, |
| |
| vendorPrefix: names.vendorPrefix, |
| keyword: names.keyword, |
| property: names.property, |
| isCustomProperty: names.isCustomProperty, |
| |
| definitionSyntax: definitionSyntax, |
| lexer: null, |
| createLexer: function(config) { |
| return new Lexer(config, syntax, syntax.lexer.structure); |
| }, |
| |
| tokenize: tokenize, |
| parse: parse, |
| walk: walk, |
| generate: generate, |
| |
| find: walk.find, |
| findLast: walk.findLast, |
| findAll: walk.findAll, |
| |
| clone: clone, |
| fromPlainObject: convert.fromPlainObject, |
| toPlainObject: convert.toPlainObject, |
| |
| createSyntax: function(config) { |
| return createSyntax(mix({}, config)); |
| }, |
| fork: function(extension) { |
| var 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; |
| }; |
| |
| exports.create = function(config) { |
| return createSyntax(mix({}, config)); |
| }; |