SPB Git

spb/crea-ka

Public

Créa·Ka — annuaire public cross-plateforme des créateurs de contenu québécois (crea-ka.com)

widget ka-agent v4.1 : parseur ka-card tolerant (JSON multi-lignes/tableau) — sync ka-ui a508e7c

Simon-Pierre Boucher committed (Aug 25, 2026) parent 1e61931 Browse files

2 changed files +24 −8

modified frontend/dist/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);
modified frontend/src/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
Menu

Theme