Improve tool detail formatting

This commit is contained in:
Codex
2026-05-24 03:05:25 +00:00
parent 5f1633141f
commit a31157eea7
3 changed files with 422 additions and 59 deletions

View File

@@ -35,6 +35,119 @@ func ExpandableQuoteHTML(text string) string {
return "<blockquote expandable>" + EscapeHTML(text) + "</blockquote>"
}
func ExpandableQuoteRawHTML(htmlText string) string {
htmlText = strings.TrimSpace(htmlText)
if htmlText == "" {
return ""
}
return "<blockquote expandable>" + htmlText + "</blockquote>"
}
func SummaryDetailsRawHTML(summary, detailsHTML string) string {
summary = strings.TrimSpace(summary)
detailsHTML = strings.TrimSpace(detailsHTML)
if detailsHTML == "" {
return EscapeHTML(summary)
}
if summary == "" {
return ExpandableQuoteRawHTML(detailsHTML)
}
return EscapeHTML(summary) + "\n" + ExpandableQuoteRawHTML(detailsHTML)
}
func SummaryDetailsRawHTMLLimited(summary, detailsHTML string, limit int) string {
if limit <= 0 {
limit = TelegramHTMLMessageLimit
}
summary = strings.TrimSpace(summary)
detailsHTML = strings.TrimSpace(detailsHTML)
out := SummaryDetailsRawHTML(summary, detailsHTML)
if len([]rune(out)) <= limit || detailsHTML == "" {
return out
}
plain := stripSimpleHTML(detailsHTML)
suffix := "\n...[truncated]"
runes := []rune(plain)
for len(runes) > 0 {
candidateLen := len(runes) - max(1, (len([]rune(out))-limit)/2)
if candidateLen < 0 {
candidateLen = 0
}
if candidateLen > len(runes) {
candidateLen = len(runes)
}
candidate := CodeBlockHTML("text", strings.TrimSpace(string(runes[:candidateLen]))+suffix)
out = SummaryDetailsRawHTML(summary, candidate)
if len([]rune(out)) <= limit || candidateLen == 0 {
return out
}
runes = runes[:candidateLen]
}
return SummaryDetailsRawHTML(summary, EscapeHTML(suffix))
}
func CodeBlockHTML(language, text string) string {
text = strings.TrimSpace(text)
if text == "" {
return ""
}
language = safeCodeLanguage(language)
return "<pre><code class=\"language-" + language + "\">" + EscapeHTML(text) + "</code></pre>"
}
func FieldHTML(label, value string) string {
value = strings.TrimSpace(value)
if value == "" {
return ""
}
return "<b>" + EscapeHTML(label) + ":</b> " + EscapeHTML(value)
}
func safeCodeLanguage(language string) string {
language = strings.ToLower(strings.TrimSpace(language))
if language == "" {
return "text"
}
var builder strings.Builder
for _, r := range language {
switch {
case r >= 'a' && r <= 'z':
builder.WriteRune(r)
case r >= '0' && r <= '9':
builder.WriteRune(r)
case r == '-', r == '_':
builder.WriteRune(r)
}
}
if builder.Len() == 0 {
return "text"
}
return builder.String()
}
func stripSimpleHTML(htmlText string) string {
replacer := strings.NewReplacer(
"<pre>", "", "</pre>", "",
"<code>", "", "</code>", "",
"<b>", "", "</b>", "",
"<i>", "", "</i>", "",
)
text := replacer.Replace(htmlText)
for {
start := strings.Index(text, "<code ")
if start < 0 {
break
}
end := strings.Index(text[start:], ">")
if end < 0 {
break
}
text = text[:start] + text[start+end+1:]
}
return html.UnescapeString(text)
}
func SummaryDetailsHTMLLimited(summary, details string, limit int) string {
if limit <= 0 {
limit = TelegramHTMLMessageLimit