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.
77 lines
2.2 KiB
77 lines
2.2 KiB
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)); |
|
};
|
|
|