in packages/lu/src/parser/lufile/parseFileContents.js [2171:2326]
const parseAndHandleModelInfoSection = function (parsedContent, luResource, log, config) {
// handle model info
let enableMergeIntents = true;
let modelInfos = luResource.Sections.filter(s => s.SectionType === SectionType.MODELINFOSECTION);
if (modelInfos && modelInfos.length > 0) {
if (!config.enableModelDescription) {
throwDiagnosticError({
message: `Do not support Model Description. Please make sure enableModelDescription is set to true.`
});
}
for (const modelInfo of modelInfos) {
let line = modelInfo.ModelInfo
let kvPair = line.split(/@(app|kb|intent|entity|enableSections|enableMergeIntents|patternAnyEntity|parser).(.*)=/g).map(item => item.trim());
// avoid to throw invalid model info when meeting enableSections info which is handled in luParser.js
if (kvPair[1] === 'enableSections') continue
if (kvPair.length === 4) {
if (kvPair[1] === 'enableMergeIntents') {
enableMergeIntents = kvPair[3] === 'false' ? false : true;
continue;
}
let hasError = false;
kvPair.forEach(item => {
if (item.trim() === '') {
if (log) {
process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid model info found. Skipping "' + line + '"\n'));
}
hasError = true;
}
})
if(hasError) {
continue;
}
if (kvPair[1].toLowerCase() === 'parser') {
if (kvPair[2].toLowerCase().startsWith('onambiguouslabels')) {
parsedContent.LUISJsonStructure.onAmbiguousLabels = kvPair[3].toLowerCase() || 'takeLongestLabel';
continue;
}
}
if (kvPair[1].toLowerCase() === 'app') {
if (kvPair[2].toLowerCase().startsWith('settings')) {
let settingsRegExp = /^settings.(?<property>.*?$)/gmi;
let settingsPair = settingsRegExp.exec(kvPair[2]);
if (settingsPair && settingsPair.groups && settingsPair.groups.property) {
if (!parsedContent.LUISJsonStructure.settings) {
parsedContent.LUISJsonStructure.settings = [{name : settingsPair.groups.property, value : kvPair[3].toLowerCase() === "true"}];
} else {
// find the setting
let sFound = parsedContent.LUISJsonStructure.settings.find(setting => setting.name == settingsPair.groups.property);
if (sFound) {
sFound.value = kvPair[3] === "true";
} else {
parsedContent.LUISJsonStructure.settings.push({name : settingsPair.groups.property, value : kvPair[3].toLowerCase() === "true"})
}
}
}
} else {
parsedContent.LUISJsonStructure[kvPair[2]] = kvPair[3];
}
} else if (kvPair[1].toLowerCase() === 'kb') {
parsedContent.qnaJsonStructure[kvPair[2]] = kvPair[3];
} else if (kvPair[1].toLowerCase() === 'intent') {
if (kvPair[2].toLowerCase() === 'inherits') {
let inheritsProperties = kvPair[3].split(/[:;]/g).map(item => item.trim());
if (inheritsProperties.length !== 6) {
process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid intent inherits information found. Skipping "' + line + '"\n'));
} else {
// find the intent
let intent = parsedContent.LUISJsonStructure.intents.find(item => item.name == inheritsProperties[1]);
if (intent === undefined) {
let newIntent = {
"name": inheritsProperties[1],
"inherits": {}
};
newIntent['inherits'][inheritsProperties[2]] = inheritsProperties[3];
newIntent['inherits'][inheritsProperties[4]] = inheritsProperties[5];
parsedContent.LUISJsonStructure.intents.push(newIntent);
} else {
if (intent['inherits'] === undefined) intent['inherits'] = {};
intent['inherits'][inheritsProperties[2]] = inheritsProperties[3];
intent['inherits'][inheritsProperties[4]] = inheritsProperties[5];
}
}
} else {
if (log) {
process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid intent inherits information found. Skipping "' + line + '"\n'));
}
}
} else if (kvPair[1].toLowerCase() === 'entity') {
if (kvPair[2].toLowerCase() === 'inherits') {
let inheritsProperties = kvPair[3].split(/[:;]/g).map(item => item.trim());
if (inheritsProperties.length !== 6) {
process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid entity inherits information found. Skipping "' + line + '"\n'));
} else {
// find the intent
let entity = parsedContent.LUISJsonStructure.entities.find(item => item.name == inheritsProperties[1]);
if (entity === undefined) {
let newEntity = {
"name": inheritsProperties[1],
"inherits": {}
};
newEntity['inherits'][inheritsProperties[2]] = inheritsProperties[3];
newEntity['inherits'][inheritsProperties[4]] = inheritsProperties[5];
parsedContent.LUISJsonStructure.entities.push(newEntity);
} else {
if (entity['inherits'] === undefined) entity['inherits'] = {};
entity['inherits'][inheritsProperties[2]] = inheritsProperties[3];
entity['inherits'][inheritsProperties[4]] = inheritsProperties[5];
}
}
} else {
if (log) {
process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid entity inherits information found. Skipping "' + line + '"\n'));
}
}
} else if (kvPair[1].toLowerCase() === 'patternanyentity') {
if (kvPair[2].toLowerCase() === 'inherits') {
let inheritsProperties = kvPair[3].split(/[:;]/g).map(item => item.trim());
if (inheritsProperties.length !== 6) {
process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid Pattern.Any inherits information found. Skipping "' + line + '"\n'));
} else {
// find the intent
let entity = parsedContent.LUISJsonStructure.patternAnyEntities.find(item => item.name == inheritsProperties[1]);
if (entity === undefined) {
let newEntity = new helperClass.patternAnyEntity(inheritsProperties[1]);
newEntity.inherits = {};
newEntity['inherits'][inheritsProperties[2]] = inheritsProperties[3];
newEntity['inherits'][inheritsProperties[4]] = inheritsProperties[5];
parsedContent.LUISJsonStructure.patternAnyEntities.push(newEntity);
} else {
if (entity['inherits'] === undefined) entity['inherits'] = {};
entity['inherits'][inheritsProperties[2]] = inheritsProperties[3];
entity['inherits'][inheritsProperties[4]] = inheritsProperties[5];
}
}
} else {
if (log) {
process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid entity inherits information found. Skipping "' + line + '"\n'));
}
}
}
} else {
if (log) {
process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid model info found. Skipping "' + line + '"\n'));
}
}
}
}
return enableMergeIntents;
}