create.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. var List = require('../common/List');
  2. var SyntaxError = require('../common/SyntaxError');
  3. var TokenStream = require('../common/TokenStream');
  4. var Lexer = require('../lexer/Lexer');
  5. var definitionSyntax = require('../definition-syntax');
  6. var tokenize = require('../tokenizer');
  7. var createParser = require('../parser/create');
  8. var createGenerator = require('../generator/create');
  9. var createConvertor = require('../convertor/create');
  10. var createWalker = require('../walker/create');
  11. var clone = require('../utils/clone');
  12. var names = require('../utils/names');
  13. var mix = require('./config/mix');
  14. function createSyntax(config) {
  15. var parse = createParser(config);
  16. var walk = createWalker(config);
  17. var generate = createGenerator(config);
  18. var convert = createConvertor(walk);
  19. var syntax = {
  20. List: List,
  21. SyntaxError: SyntaxError,
  22. TokenStream: TokenStream,
  23. Lexer: Lexer,
  24. vendorPrefix: names.vendorPrefix,
  25. keyword: names.keyword,
  26. property: names.property,
  27. isCustomProperty: names.isCustomProperty,
  28. definitionSyntax: definitionSyntax,
  29. lexer: null,
  30. createLexer: function(config) {
  31. return new Lexer(config, syntax, syntax.lexer.structure);
  32. },
  33. tokenize: tokenize,
  34. parse: parse,
  35. walk: walk,
  36. generate: generate,
  37. find: walk.find,
  38. findLast: walk.findLast,
  39. findAll: walk.findAll,
  40. clone: clone,
  41. fromPlainObject: convert.fromPlainObject,
  42. toPlainObject: convert.toPlainObject,
  43. createSyntax: function(config) {
  44. return createSyntax(mix({}, config));
  45. },
  46. fork: function(extension) {
  47. var base = mix({}, config); // copy of config
  48. return createSyntax(
  49. typeof extension === 'function'
  50. ? extension(base, Object.assign)
  51. : mix(base, extension)
  52. );
  53. }
  54. };
  55. syntax.lexer = new Lexer({
  56. generic: true,
  57. types: config.types,
  58. atrules: config.atrules,
  59. properties: config.properties,
  60. node: config.node
  61. }, syntax);
  62. return syntax;
  63. };
  64. exports.create = function(config) {
  65. return createSyntax(mix({}, config));
  66. };