1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- class NodeKeywords {
- constructor() {
- this.keywords = [];
- this.nodes = {};
- this.keywordsCallback = {};
- }
- getNode( name ) {
- let node = this.nodes[ name ];
- if ( node === undefined && this.keywordsCallback[ name ] !== undefined ) {
- node = this.keywordsCallback[ name ]( name );
- this.nodes[ name ] = node;
- }
- return node;
- }
- addKeyword( name, callback ) {
- this.keywords.push( name );
- this.keywordsCallback[ name ] = callback;
- return this;
- }
- parse( code ) {
- const keywordNames = this.keywords;
- const regExp = new RegExp( `\\b${keywordNames.join( '\\b|\\b' )}\\b`, 'g' );
- const codeKeywords = code.match( regExp );
- const keywordNodes = [];
- if ( codeKeywords !== null ) {
- for ( const keyword of codeKeywords ) {
- const node = this.getNode( keyword );
- if ( node !== undefined && keywordNodes.indexOf( node ) === - 1 ) {
- keywordNodes.push( node );
- }
- }
- }
- return keywordNodes;
- }
- include( builder, code ) {
- const keywordNodes = this.parse( code );
- for ( const keywordNode of keywordNodes ) {
- keywordNode.build( builder );
- }
- }
- }
- export default NodeKeywords;
|