Improve tool detail formatting
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user