Cleaned up logic around knowing whether message is translated.
This commit is contained in:
@@ -233,7 +233,7 @@ func (b *Bslack) Send(msg config.Message) (string, error) {
|
|||||||
// add translation attachment
|
// add translation attachment
|
||||||
if msg.IsTranslation {
|
if msg.IsTranslation {
|
||||||
// If source, then we're doing a translation
|
// If source, then we're doing a translation
|
||||||
np.Attachments = append(np.Attachments, b.createTranslationAttach(msg))
|
np.Attachments = append(np.Attachments, b.createTranslationAttach(msg)...)
|
||||||
}
|
}
|
||||||
// add slack attachments (from another slack bridge)
|
// add slack attachments (from another slack bridge)
|
||||||
if msg.Extra != nil {
|
if msg.Extra != nil {
|
||||||
@@ -290,7 +290,13 @@ func (b *Bslack) createAttach(extra map[string][]interface{}) []slack.Attachment
|
|||||||
return attachements
|
return attachements
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Bslack) createTranslationAttach(msg config.Message) slack.Attachment {
|
func (b *Bslack) createTranslationAttach(msg config.Message) []slack.Attachment {
|
||||||
|
var attachments []slack.Attachment
|
||||||
|
|
||||||
|
if msg.IsTranslation == false {
|
||||||
|
return attachments
|
||||||
|
}
|
||||||
|
|
||||||
untranslatedTextPreview := msg.OrigMsg.Text
|
untranslatedTextPreview := msg.OrigMsg.Text
|
||||||
previewCharCount := 100
|
previewCharCount := 100
|
||||||
if len(msg.OrigMsg.Text) > previewCharCount {
|
if len(msg.OrigMsg.Text) > previewCharCount {
|
||||||
@@ -316,7 +322,9 @@ func (b *Bslack) createTranslationAttach(msg config.Message) slack.Attachment {
|
|||||||
FooterIcon: "https://emoji.slack-edge.com/T02G2SXKM/g0v/541e38dfc833f04b.png",
|
FooterIcon: "https://emoji.slack-edge.com/T02G2SXKM/g0v/541e38dfc833f04b.png",
|
||||||
}
|
}
|
||||||
|
|
||||||
return attach
|
attachments = append(attachments, attach)
|
||||||
|
|
||||||
|
return attachments
|
||||||
}
|
}
|
||||||
|
|
||||||
func extractStringField(data map[string]interface{}, field string) string {
|
func extractStringField(data map[string]interface{}, field string) string {
|
||||||
|
|||||||
@@ -277,6 +277,16 @@ func (*renderer) BlockCode(out *bytes.Buffer, text []byte, info string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gw *Gateway) handleTranslation(msg *config.Message, dest *bridge.Bridge, channel config.ChannelInfo) {
|
func (gw *Gateway) handleTranslation(msg *config.Message, dest *bridge.Bridge, channel config.ChannelInfo) {
|
||||||
|
// Skip if channel locale not set
|
||||||
|
if channel.Options.Locale == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't try to translate empty messages
|
||||||
|
if msg.OrigMsg.Text == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
msg.IsTranslation = true
|
msg.IsTranslation = true
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
@@ -357,88 +367,88 @@ func (gw *Gateway) handleTranslation(msg *config.Message, dest *bridge.Bridge, c
|
|||||||
text = resp[0].Text
|
text = resp[0].Text
|
||||||
flog.Debugf("post-translate:"+text)
|
flog.Debugf("post-translate:"+text)
|
||||||
|
|
||||||
if resp[0].Source != channelLang {
|
if resp[0].Source == channelLang {
|
||||||
// If the source language is the same as this channel,
|
msg.IsTranslation = false
|
||||||
// just use the original text and don't add attribution
|
return
|
||||||
|
|
||||||
// Add space buffer after html <span> before stripping, or characters after tags get merged into urls or usernames
|
|
||||||
text = regexp.MustCompile(`<span translate='no'>.+?</span>`).ReplaceAllString(text, " $0 ")
|
|
||||||
|
|
||||||
allowableTags := []string{
|
|
||||||
"p",
|
|
||||||
"i",
|
|
||||||
"b",
|
|
||||||
"em",
|
|
||||||
"strong",
|
|
||||||
"br",
|
|
||||||
"del",
|
|
||||||
"blockquote",
|
|
||||||
"pre",
|
|
||||||
"code",
|
|
||||||
"li",
|
|
||||||
"ul",
|
|
||||||
"ol",
|
|
||||||
}
|
|
||||||
|
|
||||||
stripped, _ := htmltags.Strip(text, allowableTags, false)
|
|
||||||
text = stripped.ToString()
|
|
||||||
flog.Debugf("post-strip:"+text)
|
|
||||||
html2md.AddRule("del", &html2md.Rule{
|
|
||||||
Patterns: []string{"del"},
|
|
||||||
Replacement: func(innerHTML string, attrs []string) string {
|
|
||||||
if len(attrs) > 1 {
|
|
||||||
// Extra spaces so that Slack will process, even though Chinese characters don't get spaces
|
|
||||||
return html2md.WrapInlineTag(attrs[1], " ~", "~ ")
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
},
|
|
||||||
})
|
|
||||||
// Custom override for slackdown
|
|
||||||
html2md.AddRule("b", &html2md.Rule{
|
|
||||||
Patterns: []string{"b", "strong"},
|
|
||||||
Replacement: func(innerHTML string, attrs []string) string {
|
|
||||||
if len(attrs) > 1 {
|
|
||||||
// trailing whitespace due to Mandarin issues
|
|
||||||
return html2md.WrapInlineTag(attrs[1], "*", "* ")
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
},
|
|
||||||
})
|
|
||||||
// Custom override of default code rule:
|
|
||||||
// This converts multiline code tags to codeblocks
|
|
||||||
html2md.AddRule("code", &html2md.Rule{
|
|
||||||
Patterns: []string{"code", "tt", "pre"},
|
|
||||||
Replacement: func(innerHTML string, attrs []string) string {
|
|
||||||
contents := attrs[1]
|
|
||||||
if strings.Contains(contents, "\n") {
|
|
||||||
r := regexp.MustCompile(`/^\t+`)
|
|
||||||
innerHTML = r.ReplaceAllString(contents, " ")
|
|
||||||
return "\n\n```\n" + innerHTML + "```\n"
|
|
||||||
}
|
|
||||||
if len(attrs) > 1 {
|
|
||||||
return "`" + attrs[1] + "`"
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
},
|
|
||||||
})
|
|
||||||
text := html2md.Convert(text)
|
|
||||||
|
|
||||||
// colons: revert temp token
|
|
||||||
// See: previous comment on colons
|
|
||||||
text = regexp.MustCompile(`(ː)([ $])`).ReplaceAllString(text, ":$2")
|
|
||||||
|
|
||||||
flog.Debugf("post-MDconvert:"+text)
|
|
||||||
text = html.UnescapeString(text)
|
|
||||||
flog.Debugf("post-unescaped:"+text)
|
|
||||||
|
|
||||||
if dest.Protocol == "slack" {
|
|
||||||
// Attribution will be in attachment for Slack
|
|
||||||
} else {
|
|
||||||
text = text + gw.Router.General.TranslationAttribution
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.Text = text
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add space buffer after html <span> before stripping, or characters after tags get merged into urls or usernames
|
||||||
|
text = regexp.MustCompile(`<span translate='no'>.+?</span>`).ReplaceAllString(text, " $0 ")
|
||||||
|
|
||||||
|
allowableTags := []string{
|
||||||
|
"p",
|
||||||
|
"i",
|
||||||
|
"b",
|
||||||
|
"em",
|
||||||
|
"strong",
|
||||||
|
"br",
|
||||||
|
"del",
|
||||||
|
"blockquote",
|
||||||
|
"pre",
|
||||||
|
"code",
|
||||||
|
"li",
|
||||||
|
"ul",
|
||||||
|
"ol",
|
||||||
|
}
|
||||||
|
|
||||||
|
stripped, _ := htmltags.Strip(text, allowableTags, false)
|
||||||
|
text = stripped.ToString()
|
||||||
|
flog.Debugf("post-strip:"+text)
|
||||||
|
html2md.AddRule("del", &html2md.Rule{
|
||||||
|
Patterns: []string{"del"},
|
||||||
|
Replacement: func(innerHTML string, attrs []string) string {
|
||||||
|
if len(attrs) > 1 {
|
||||||
|
// Extra spaces so that Slack will process, even though Chinese characters don't get spaces
|
||||||
|
return html2md.WrapInlineTag(attrs[1], " ~", "~ ")
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
},
|
||||||
|
})
|
||||||
|
// Custom override for slackdown
|
||||||
|
html2md.AddRule("b", &html2md.Rule{
|
||||||
|
Patterns: []string{"b", "strong"},
|
||||||
|
Replacement: func(innerHTML string, attrs []string) string {
|
||||||
|
if len(attrs) > 1 {
|
||||||
|
// trailing whitespace due to Mandarin issues
|
||||||
|
return html2md.WrapInlineTag(attrs[1], "*", "* ")
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
},
|
||||||
|
})
|
||||||
|
// Custom override of default code rule:
|
||||||
|
// This converts multiline code tags to codeblocks
|
||||||
|
html2md.AddRule("code", &html2md.Rule{
|
||||||
|
Patterns: []string{"code", "tt", "pre"},
|
||||||
|
Replacement: func(innerHTML string, attrs []string) string {
|
||||||
|
contents := attrs[1]
|
||||||
|
if strings.Contains(contents, "\n") {
|
||||||
|
r := regexp.MustCompile(`/^\t+`)
|
||||||
|
innerHTML = r.ReplaceAllString(contents, " ")
|
||||||
|
return "\n\n```\n" + innerHTML + "```\n"
|
||||||
|
}
|
||||||
|
if len(attrs) > 1 {
|
||||||
|
return "`" + attrs[1] + "`"
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
},
|
||||||
|
})
|
||||||
|
text = html2md.Convert(text)
|
||||||
|
|
||||||
|
// colons: revert temp token
|
||||||
|
// See: previous comment on colons
|
||||||
|
text = regexp.MustCompile(`(ː)([ $])`).ReplaceAllString(text, ":$2")
|
||||||
|
|
||||||
|
flog.Debugf("post-MDconvert:"+text)
|
||||||
|
text = html.UnescapeString(text)
|
||||||
|
flog.Debugf("post-unescaped:"+text)
|
||||||
|
|
||||||
|
if dest.Protocol == "slack" {
|
||||||
|
// Attribution will be in attachment for Slack
|
||||||
|
} else {
|
||||||
|
text = text + gw.Router.General.TranslationAttribution
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.Text = text
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrMsgID {
|
func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrMsgID {
|
||||||
@@ -503,7 +513,7 @@ func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrM
|
|||||||
msg.ID = ""
|
msg.ID = ""
|
||||||
|
|
||||||
// Translation
|
// Translation
|
||||||
if (gw.Router.GTClient != nil) && (channel.Options.Locale != "") && (msg.Text != "") {
|
if (gw.Router.GTClient != nil) {
|
||||||
gw.handleTranslation(&msg, dest, channel)
|
gw.handleTranslation(&msg, dest, channel)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user