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.
80 lines
1.1 KiB
80 lines
1.1 KiB
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;
|
|
|