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.

81 lines
1.1 KiB

2 years ago
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;