NodeKeywords.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. class NodeKeywords {
  2. constructor() {
  3. this.keywords = [];
  4. this.nodes = {};
  5. this.keywordsCallback = {};
  6. }
  7. getNode( name ) {
  8. let node = this.nodes[ name ];
  9. if ( node === undefined && this.keywordsCallback[ name ] !== undefined ) {
  10. node = this.keywordsCallback[ name ]( name );
  11. this.nodes[ name ] = node;
  12. }
  13. return node;
  14. }
  15. addKeyword( name, callback ) {
  16. this.keywords.push( name );
  17. this.keywordsCallback[ name ] = callback;
  18. return this;
  19. }
  20. parse( code ) {
  21. const keywordNames = this.keywords;
  22. const regExp = new RegExp( `\\b${keywordNames.join( '\\b|\\b' )}\\b`, 'g' );
  23. const codeKeywords = code.match( regExp );
  24. const keywordNodes = [];
  25. if ( codeKeywords !== null ) {
  26. for ( const keyword of codeKeywords ) {
  27. const node = this.getNode( keyword );
  28. if ( node !== undefined && keywordNodes.indexOf( node ) === - 1 ) {
  29. keywordNodes.push( node );
  30. }
  31. }
  32. }
  33. return keywordNodes;
  34. }
  35. include( builder, code ) {
  36. const keywordNodes = this.parse( code );
  37. for ( const keywordNode of keywordNodes ) {
  38. keywordNode.build( builder );
  39. }
  40. }
  41. }
  42. export default NodeKeywords;