11const NEWLINE = require ( 'os' ) . EOL ;
22const helperClasses = require ( './../lufile/classes/hclasses' )
33const EntityTypeEnum = require ( './../utils/enums/luisEntityTypes' ) ;
4+ const EscapeCharsInUtterance = require ( './../utils/enums/escapechars' ) . EscapeCharsInUtterance ;
5+ const helpers = require ( './../utils/helpers' ) ;
46
57/**
68 * Parses a Luis object into Lu Content
@@ -89,7 +91,7 @@ const parseUtterancesToLu = function(utterances, luisJSON){
8991 if ( luisJSON . test === true && utterance . predictedResult !== undefined ) {
9092 fileContent += parsePredictedResultToLu ( utterance , luisJSON )
9193 }
92- if ( utterance . entities . length >= 0 ) {
94+ if ( utterance . entities . length > 0 ) {
9395 // update utterance for each entity
9496 let text = utterance . text ;
9597 // flatten entities
@@ -99,10 +101,25 @@ const parseUtterancesToLu = function(utterances, luisJSON){
99101 // remove all children
100102 sortedEntitiesList . forEach ( entity => delete entity . children ) ;
101103 let tokenizedText = text . split ( '' ) ;
104+ tokenizedText . forEach ( function ( token , index ) {
105+ tokenizedText [ index ] = EscapeCharsInUtterance . includes ( token ) ? `\\${ token } ` : token ;
106+ } ) ;
102107 // handle cases where we have both child as well as cases where more than one entity can have the same start position
103108 // if there are multiple entities in the same start position, then order them by composite, nDepth, regular entity
104109 getEntitiesByPositionList ( sortedEntitiesList , tokenizedText ) ;
105110 updatedText = tokenizedText . join ( '' ) ;
111+ } else {
112+ // will not add escape char for pattern utterances since brackets are strictly used in pattern
113+ // so there are no exceptions that need to be handled in pattern
114+ if ( helpers . isUtterancePattern ( utterance ) ) {
115+ updatedText = utterance . text ;
116+ } else {
117+ let tokenizedText = utterance . text . split ( '' ) ;
118+ tokenizedText . forEach ( function ( token , index ) {
119+ tokenizedText [ index ] = EscapeCharsInUtterance . includes ( token ) ? `\\${ token } ` : token ;
120+ } ) ;
121+ updatedText = tokenizedText . join ( '' ) ;
122+ }
106123 }
107124
108125 // remove duplicated whitespaces between words inside utterance to make sure they are aligned with the luis portal
@@ -138,7 +155,16 @@ const updateTokenizedTextByEntity = function(tokenizedText, entity) {
138155 } else {
139156 tokenizedText [ parseInt ( entity . startPos ) ] = `{@${ entity . entity } =${ tokenizedText [ parseInt ( entity . startPos ) ] } ` ;
140157 }
141- tokenizedText [ parseInt ( entity . endPos ) ] = tokenizedText [ parseInt ( entity . endPos ) ] + '}' ;
158+
159+ // check blackslash before entity definition
160+ // blackslash before { or } will be reconized to escape { or }
161+ // to avoid such escape, add another blackslash before blackslash
162+ if ( parseInt ( entity . startPos ) > 0 && tokenizedText [ parseInt ( entity . startPos ) - 1 ] === '\\' ) {
163+ tokenizedText [ parseInt ( entity . startPos ) - 1 ] += '\\'
164+ }
165+
166+ tokenizedText [ parseInt ( entity . endPos ) ] = tokenizedText [ parseInt ( entity . endPos ) ] === '\\' ?
167+ tokenizedText [ parseInt ( entity . endPos ) ] + '\\}' : tokenizedText [ parseInt ( entity . endPos ) ] + '}' ;
142168}
143169
144170const parsePredictedResultToLu = function ( utterance , luisJSON ) {
0 commit comments