feat(chat): markdown formattato nella chat + testo pulito per la voce (v0.5.2)
- src/markdown.{h,cpp}: convertitore minimale, due funzioni:
* toRichText() -> HTML per QML Text.RichText: grassetti (**x**/__x__),
corsivi (*x*/_x_ con confini di parola per non toccare snake_case),
titoli (#), liste (-/1.), citazioni (>), codice (`x` e blocchi ```,
in monospace), link [t](u) -> solo testo, barrato ~~x~~; escape di
< & > contro injection nel rich text
* toSpeech() -> testo piatto per il TTS: via recinti di codice, marcatori
di titoli/liste/citazioni, enfasi, backtick; link/immagini -> testo;
tabelle | a | b | -> "a, b"; righe vuote compattate
- ChatModel: nuovo ruolo contentRich (calcolato in C++, testabile);
incluso nei dataChanged dello streaming
- ChatPage: le bolle dell'assistente usano contentRich con
textFormat: Text.RichText; i messaggi utente restano testo semplice
- ApiClient::speak(): il testo passa da Markdown::toSpeech (niente più
simboli di formattazione letti ad alta voce)
- core-test: 19 casi nuovi per il convertitore (tutti locali, senza device)
Verificato: build zero warning + unit test completi.
This commit is contained in:
@@ -107,7 +107,11 @@ Page {
|
||||
width: Math.min(implicitWidth, bubble.maxW - 2 * Theme.paddingMedium)
|
||||
wrapMode: Text.Wrap
|
||||
color: Theme.primaryColor
|
||||
text: model.content + (model.streaming ? " ▍" : "")
|
||||
// Le risposte di Hermes sono markdown: si mostrano
|
||||
// formattate (grassetti, corsivi, titoli, liste, codice).
|
||||
textFormat: model.role === "user" ? Text.PlainText : Text.RichText
|
||||
text: (model.role === "user" ? model.content : model.contentRich)
|
||||
+ (model.streaming ? " ▍" : "")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user