fix(钉钉通知): 修复 Markdown 消息换行被折叠导致排版错乱的问题
Motivation: 钉钉 Markdown 渲染时会将单个换行符折叠为空格,导致推送的通知内容被压缩成一行,严重影响消息可读性。 Changes: * 发送前将消息正文中的单个换行统一转换为段落分隔(\n\n),确保模板换行在钉钉中正确渲染 * 归一化 \r\n 与 \r 换行,并合并已有连续换行,避免产生多余空行 * 新增换行转换逻辑的单元测试
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -69,7 +70,7 @@ func (s *DingTalkSender) Send(title, content string, config json.RawMessage) err
|
|||||||
MsgType: "markdown",
|
MsgType: "markdown",
|
||||||
Markdown: &dingtalkMD{
|
Markdown: &dingtalkMD{
|
||||||
Title: title,
|
Title: title,
|
||||||
Text: content,
|
Text: dingtalkMarkdownText(content),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +87,18 @@ func (s *DingTalkSender) Send(title, content string, config json.RawMessage) err
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dingtalkMarkdownText turns template newlines into DingTalk markdown paragraph
|
||||||
|
// breaks. A single \n is collapsed to a space by DingTalk markdown, so each
|
||||||
|
// logical line must be separated by \n\n.
|
||||||
|
func dingtalkMarkdownText(content string) string {
|
||||||
|
content = strings.ReplaceAll(content, "\r\n", "\n")
|
||||||
|
content = strings.ReplaceAll(content, "\r", "\n")
|
||||||
|
for strings.Contains(content, "\n\n") {
|
||||||
|
content = strings.ReplaceAll(content, "\n\n", "\n")
|
||||||
|
}
|
||||||
|
return strings.ReplaceAll(content, "\n", "\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
func dingtalkSign(timestamp int64, secret string) string {
|
func dingtalkSign(timestamp int64, secret string) string {
|
||||||
mac := hmac.New(sha256.New, []byte(secret))
|
mac := hmac.New(sha256.New, []byte(secret))
|
||||||
fmt.Fprintf(mac, "%d\n%s", timestamp, secret)
|
fmt.Fprintf(mac, "%d\n%s", timestamp, secret)
|
||||||
|
|||||||
@@ -2,6 +2,15 @@ package adapter
|
|||||||
|
|
||||||
import "testing"
|
import "testing"
|
||||||
|
|
||||||
|
func TestDingTalkMarkdownTextDoublesNewlines(t *testing.T) {
|
||||||
|
in := "空单开仓\n交易品种: ETHUSDT\n开仓价格: 2542.33\n\n推送时间: 2026.08.27 16:30:12"
|
||||||
|
got := dingtalkMarkdownText(in)
|
||||||
|
want := "空单开仓\n\n交易品种: ETHUSDT\n\n开仓价格: 2542.33\n\n推送时间: 2026.08.27 16:30:12"
|
||||||
|
if got != want {
|
||||||
|
t.Fatalf("got %q\nwant %q", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestDingtalkConfigWebhookURL(t *testing.T) {
|
func TestDingtalkConfigWebhookURL(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
|||||||
Reference in New Issue
Block a user