1
1
import { renderToStaticMarkup } from "react-dom/server" ;
2
- import { getCitationFilePath } from "../../api" ;
2
+ import { ChatAppResponse , getCitationFilePath } from "../../api" ;
3
3
4
4
type HtmlParsedAnswer = {
5
5
answerHtml : string ;
6
6
citations : string [ ] ;
7
7
} ;
8
8
9
- export function parseAnswerToHtml ( answer : string , isStreaming : boolean , onCitationClicked : ( citationFilePath : string ) => void ) : HtmlParsedAnswer {
9
+ // Function to validate citation format and check if dataPoint starts with possible citation
10
+ function isCitationValid ( contextDataPoints : any , citationCandidate : string ) : boolean {
11
+ const regex = / ^ [ ^ \s ] + \. [ a - z A - Z 0 - 9 ] + / ;
12
+ if ( ! regex . test ( citationCandidate ) ) {
13
+ return false ;
14
+ }
15
+
16
+ // Check if contextDataPoints is an object with a text property that is an array
17
+ let dataPointsArray : string [ ] ;
18
+ if ( Array . isArray ( contextDataPoints ) ) {
19
+ dataPointsArray = contextDataPoints ;
20
+ } else if ( contextDataPoints && Array . isArray ( contextDataPoints . text ) ) {
21
+ dataPointsArray = contextDataPoints . text ;
22
+ } else {
23
+ return false ;
24
+ }
25
+
26
+ const isValidCitation = dataPointsArray . some ( dataPoint => dataPoint . startsWith ( citationCandidate ) ) ;
27
+
28
+ if ( ! isValidCitation ) {
29
+ return false ;
30
+ }
31
+
32
+ return true ;
33
+ }
34
+
35
+ export function parseAnswerToHtml ( answer : ChatAppResponse , isStreaming : boolean , onCitationClicked : ( citationFilePath : string ) => void ) : HtmlParsedAnswer {
36
+ const contextDataPoints = answer . context . data_points ;
10
37
const citations : string [ ] = [ ] ;
11
38
12
- // trim any whitespace from the end of the answer after removing follow-up questions
13
- let parsedAnswer = answer . trim ( ) ;
39
+ // Trim any whitespace from the end of the answer after removing follow-up questions
40
+ let parsedAnswer = answer . message . content . trim ( ) ;
14
41
15
42
// Omit a citation that is still being typed during streaming
16
43
if ( isStreaming ) {
@@ -34,6 +61,11 @@ export function parseAnswerToHtml(answer: string, isStreaming: boolean, onCitati
34
61
return part ;
35
62
} else {
36
63
let citationIndex : number ;
64
+
65
+ if ( ! isCitationValid ( contextDataPoints , part ) ) {
66
+ return `[${ part } ]` ;
67
+ }
68
+
37
69
if ( citations . indexOf ( part ) !== - 1 ) {
38
70
citationIndex = citations . indexOf ( part ) + 1 ;
39
71
} else {
0 commit comments