widget ka-agent v4.1 : parseur ka-card tolerant (JSON multi-lignes/tableau) — sync ka-ui a508e7c
1 changed file +12 −4
modified
frontend/public/ka-agent.js
+12 −4
@@ -159,12 +159,20 @@ | |||||
| 159 | }; | 159 | }; | ||
| 160 | function httpUrl(u) { return typeof u === "string" && /^https:\/\//.test(u) ? u : ""; } | 160 | function httpUrl(u) { return typeof u === "string" && /^https:\/\//.test(u) ? u : ""; } | ||
| 161 | function cards(lines) { | 161 | function cards(lines) { | ||
| 162 | − var html = ""; | 162 | + var objs = []; | ||
| 163 | − lines.forEach(function (ln) { | 163 | + lines.forEach(function (ln) { // format demandé : un JSON par ligne | ||
| 164 | ln = ln.trim(); | 164 | ln = ln.trim(); | ||
| 165 | if (!ln) return; | 165 | if (!ln) return; | ||
| 166 | − var o = null; | 166 | + try { objs.push(JSON.parse(ln)); } catch (e) {} // ligne incomplète (streaming) → ignorée | ||
| 167 | − try { o = JSON.parse(ln); } catch (e) { return; } // ligne incomplète (streaming) → ignorée | 167 | + }); | ||
| 168 | + if (!objs.length) { // filet : le modèle aère parfois son JSON | ||||
| 169 | + try { | ||||
| 170 | + var w = JSON.parse(lines.join("\n")); | ||||
| 171 | + objs = Array.isArray(w) ? w : [w]; | ||||
| 172 | + } catch (e) {} | ||||
| 173 | + } | ||||
| 174 | + var html = ""; | ||||
| 175 | + objs.forEach(function (o) { | ||||
| 168 | if (!o || !o.titre || !httpUrl(o.lien)) return; | 176 | if (!o || !o.titre || !httpUrl(o.lien)) return; | ||
| 169 | var pal = ECO[o.site] || ["Groupe KA", "var(--accent,#d9f26b)", "var(--on-accent,#141814)"]; | 177 | var pal = ECO[o.site] || ["Groupe KA", "var(--accent,#d9f26b)", "var(--on-accent,#141814)"]; | ||
| 170 | var img = httpUrl(o.image); | 178 | var img = httpUrl(o.image); | ||
| 171 | 179 | ||||