78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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));
 | |
| };
 |