@@ -4,7 +4,7 @@ const input = document.getElementById("user-input");
44
55let threadId = null ;
66
7- // Openingsbericht bij het laden van de pagina
7+ // Welkomstbericht bij laden
88window . onload = ( ) => {
99 const welkomstHTML = `
1010 Welkom bij <strong>Indicatiehulp.ai</strong>!<br>
@@ -76,14 +76,41 @@ function streamMessage(cssClass, text) {
7676 msg . classList . add ( "message" , cssClass ) ;
7777 chat . appendChild ( msg ) ;
7878
79- // **...** omzetten naar <strong>...</strong>
80- let formattedText = text . replace ( / \* \* ( .* ?) \* \* / g, "<strong>$1</strong>" ) ;
79+ // Opschoning & HTML formatting
80+ let formattedText = text
81+ . replace ( / \[ \d + : \d + † s o u r c e \] / g, "" ) // bronverwijzingen weghalen
82+ . replace ( / \* \* ( .* ?) \* \* / g, "<strong>$1</strong>" ) // **vet**
83+ . replace (
84+ / ( h t t p s ? : \/ \/ [ ^ \s < > ] + ) / g,
85+ '<a href="$1" target="_blank" rel="noopener noreferrer">$1</a>'
86+ ) ; // Links klikbaar maken
87+
88+ const lines = formattedText . split ( "\n" ) . filter ( line => line . trim ( ) !== "" ) ;
89+ const isNumberedList = lines . length > 1 && lines . every ( line => / ^ \d + \. \s + / . test ( line ) ) ;
90+ const isBulletedList = lines . length > 1 && lines . every ( line => / ^ [ - * • ] \s + / . test ( line ) ) ;
91+
92+ if ( isNumberedList || isBulletedList ) {
93+ const listElement = document . createElement ( isNumberedList ? "ol" : "ul" ) ;
94+ msg . appendChild ( listElement ) ;
95+ let i = 0 ;
96+ const interval = setInterval ( ( ) => {
97+ if ( i < lines . length ) {
98+ const li = document . createElement ( "li" ) ;
99+ li . innerHTML = lines [ i ] . replace ( / ^ ( \d + \. \s + | [ - * • ] \s + ) / , "" ) . trim ( ) ;
100+ listElement . appendChild ( li ) ;
101+ chat . scrollTop = chat . scrollHeight ;
102+ i ++ ;
103+ } else {
104+ clearInterval ( interval ) ;
105+ }
106+ } , 200 ) ;
107+ return ;
108+ }
81109
82- // Inline bullets detecteren en splitsen
83- if ( / (?: ^ | \s ) [ \- • * ] \s / . test ( formattedText ) ) {
84- // Probeer bulletlijst uit inline te extraheren
85- const parts = formattedText . split ( / (? = [ \- • * ] \s ) / g) ;
86- if ( parts . length >= 2 ) {
110+ // Inline bulletlijst detectie: "- <strong>item</strong>"
111+ if ( / \- \s + < s t r o n g > .* ?< \/ s t r o n g > / . test ( formattedText ) ) {
112+ const parts = formattedText . split ( / - \s + (? = < s t r o n g > ) / g) ;
113+ if ( parts . length > 2 ) {
87114 const intro = parts [ 0 ] . trim ( ) ;
88115 if ( intro ) {
89116 const p = document . createElement ( "p" ) ;
@@ -92,50 +119,26 @@ function streamMessage(cssClass, text) {
92119 }
93120
94121 const ul = document . createElement ( "ul" ) ;
95- parts . slice ( 1 ) . forEach ( part => {
96- const clean = part . replace ( / ^ [ - • * ] \s * / , "" ) . trim ( ) ;
97- if ( clean ) {
98- const li = document . createElement ( "li" ) ;
99- li . innerHTML = clean ;
100- ul . appendChild ( li ) ;
101- }
122+ parts . slice ( 1 ) . forEach ( item => {
123+ const li = document . createElement ( "li" ) ;
124+ li . innerHTML = item . trim ( ) ;
125+ ul . appendChild ( li ) ;
102126 } ) ;
103127 msg . appendChild ( ul ) ;
104128 chat . scrollTop = chat . scrollHeight ;
105129 return ;
106130 }
107131 }
108132
109- // Inline genummerde lijst detecteren
110- const listPattern = / (?: ^ | \s ) ( \d + \. \s .* ?) (? = \s \d + \. \s | $ ) / gs;
111- const matches = [ ...formattedText . matchAll ( listPattern ) ] ;
112-
113- if ( matches . length >= 2 ) {
114- const introText = formattedText . split ( matches [ 0 ] [ 0 ] ) [ 0 ] . trim ( ) ;
115- if ( introText ) {
116- const p = document . createElement ( "p" ) ;
117- p . innerHTML = introText ;
118- msg . appendChild ( p ) ;
133+ // Default: typ-animatie met inline HTML
134+ let index = 0 ;
135+ const interval = setInterval ( ( ) => {
136+ if ( index < formattedText . length ) {
137+ msg . innerHTML += formattedText . charAt ( index ++ ) ;
138+ chat . scrollTop = chat . scrollHeight ;
139+ } else {
140+ clearInterval ( interval ) ;
119141 }
120-
121- const ol = document . createElement ( "ol" ) ;
122- matches . forEach ( match => {
123- const itemText = match [ 1 ] . replace ( / ^ \d + \. \s * / , "" ) . trim ( ) ;
124- const li = document . createElement ( "li" ) ;
125- li . innerHTML = itemText ;
126- ol . appendChild ( li ) ;
127- } ) ;
128- msg . appendChild ( ol ) ;
129- } else {
130- // Geen lijst – gewoon streamen
131- let index = 0 ;
132- const interval = setInterval ( ( ) => {
133- if ( index < formattedText . length ) {
134- msg . innerHTML += formattedText . charAt ( index ++ ) ;
135- chat . scrollTop = chat . scrollHeight ;
136- } else {
137- clearInterval ( interval ) ;
138- }
139- } , 15 ) ;
140- }
142+ } , 15 ) ;
141143}
144+
0 commit comments