coveo-search-ui
Version:
Coveo JavaScript Search Framework
78 lines (73 loc) • 2.5 kB
text/typescript
import { Grammar } from '../Grammar';
import { ExpressionDef } from '../Expression/Expression';
import * as _ from 'underscore';
export interface SubGrammar {
grammars?: { [id: string]: ExpressionDef };
expressions?: string[];
basicExpressions?: string[];
include?: SubGrammar[];
}
function loadSubGrammar(
expressions: string[],
basicExpressions: string[],
grammars: { [id: string]: ExpressionDef },
subGrammar: SubGrammar
) {
_.each(subGrammar.expressions, expression => {
if (!_.contains(expressions, expression)) {
expressions.push(expression);
}
});
_.each(subGrammar.basicExpressions, expression => {
if (!_.contains(basicExpressions, expression)) {
basicExpressions.push(expression);
}
});
_.each(subGrammar.grammars, (expressionDef: ExpressionDef, id: string) => {
if (!(id in grammars)) {
grammars[id] = expressionDef;
} else {
if (_.isArray(grammars[id]) && _.isArray(expressionDef)) {
_.each(<string[]>expressionDef, (value: string) => {
(<string[]>grammars[id]).push(value);
});
} else {
_.each(<string[]>expressionDef, (value: string) => {
(<string[]>grammars[id]).push(value);
});
throw new Error('Can not merge ' + id + '(' + JSON.stringify(expressionDef) + ' => ' + JSON.stringify(grammars[id]) + ')');
}
}
});
}
export function Expressions(...subGrammars: SubGrammar[]): { start: string; expressions: { [id: string]: ExpressionDef } } {
var expressions: string[] = [];
var BasicExpression: string[] = [];
var grammars: { [id: string]: ExpressionDef } = {
Start: ['Expressions', 'Empty'],
Expressions: '[OptionalSpaces][Expression][ExpressionsList*][OptionalSpaces]',
ExpressionsList: '[Spaces][Expression]',
Expression: expressions,
BasicExpression: BasicExpression,
OptionalSpaces: / */,
Spaces: / +/,
Empty: /(?!.)/
};
for (var i = 0; i < subGrammars.length; i++) {
loadSubGrammar(expressions, BasicExpression, grammars, subGrammars[i]);
_.each(subGrammars[i].include, subGrammar => {
if (!_.contains(subGrammars, subGrammar)) {
subGrammars.push(subGrammar);
}
});
}
expressions.push('BasicExpression');
return {
start: 'Start',
expressions: grammars
};
}
export function ExpressionsGrammar(...subGrammars: SubGrammar[]) {
var grammar = Expressions.apply(this, subGrammars);
return new Grammar(grammar.start, grammar.expressions);
}