diff options
Diffstat (limited to 'ui/messages')
-rw-r--r-- | ui/messages/parser/htmlparser.go | 44 | ||||
-rw-r--r-- | ui/messages/parser/parser.go | 24 | ||||
-rw-r--r-- | ui/messages/tstring/cell.go | 3 | ||||
-rw-r--r-- | ui/messages/tstring/string.go | 6 |
4 files changed, 52 insertions, 25 deletions
diff --git a/ui/messages/parser/htmlparser.go b/ui/messages/parser/htmlparser.go index ddf6d36..f01d3cb 100644 --- a/ui/messages/parser/htmlparser.go +++ b/ui/messages/parser/htmlparser.go @@ -61,12 +61,18 @@ func AdjustStyleStrikethrough(style tcell.Style) tcell.Style { return style.Strikethrough(true) } -func AdjustStyleColor(color tcell.Color) func(tcell.Style) tcell.Style { +func AdjustStyleTextColor(color tcell.Color) func(tcell.Style) tcell.Style { return func(style tcell.Style) tcell.Style { return style.Foreground(color) } } +func AdjustStyleBackgroundColor(color tcell.Color) func(tcell.Style) tcell.Style { + return func(style tcell.Style) tcell.Style { + return style.Background(color) + } +} + func (parser *htmlParser) getAttribute(node *html.Node, attribute string) string { for _, attr := range node.Attr { if attr.Key == attribute { @@ -137,28 +143,38 @@ func (parser *htmlParser) basicFormatToTString(node *html.Node, stripLinebreak b return str } -func (parser *htmlParser) fontToTString(node *html.Node, stripLinebreak bool) tstring.TString { - str := parser.nodeToTagAwareTString(node.FirstChild, stripLinebreak) - hex := parser.getAttribute(node, "data-mx-color") +func (parser *htmlParser) parseColor(node *html.Node, mainName, altName string) (color tcell.Color, ok bool) { + hex := parser.getAttribute(node, mainName) if len(hex) == 0 { - hex = parser.getAttribute(node, "color") + hex = parser.getAttribute(node, altName) if len(hex) == 0 { - return str + return } } - color, err := colorful.Hex(hex) + cful, err := colorful.Hex(hex) if err != nil { - color2, ok := ColorMap[strings.ToLower(hex)] - if !ok { - return str + color2, found := ColorMap[strings.ToLower(hex)] + if !found { + return } - color, _ = colorful.MakeColor(color2) + cful, _ = colorful.MakeColor(color2) } - r, g, b := color.RGB255() - tcellColor := tcell.NewRGBColor(int32(r), int32(g), int32(b)) - str.AdjustStyleFull(AdjustStyleColor(tcellColor)) + r, g, b := cful.RGB255() + return tcell.NewRGBColor(int32(r), int32(g), int32(b)), true +} + +func (parser *htmlParser) fontToTString(node *html.Node, stripLinebreak bool) tstring.TString { + str := parser.nodeToTagAwareTString(node.FirstChild, stripLinebreak) + fgColor, ok := parser.parseColor(node, "data-mx-color", "color") + if ok { + str.AdjustStyleFull(AdjustStyleTextColor(fgColor)) + } + bgColor, ok := parser.parseColor(node, "data-mx-bg-color", "background-color") + if ok { + str.AdjustStyleFull(AdjustStyleBackgroundColor(bgColor)) + } return str } diff --git a/ui/messages/parser/parser.go b/ui/messages/parser/parser.go index 94ab5b6..b36fde0 100644 --- a/ui/messages/parser/parser.go +++ b/ui/messages/parser/parser.go @@ -102,14 +102,24 @@ func ParseMessage(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix.Eve } if len(evt.Content.GetReplyTo()) > 0 { evt.Content.RemoveReplyFallback() - replyToEvt, _ := matrix.Client().GetEvent(room.ID, evt.Content.GetReplyTo()) - replyToEvt.Content.RemoveReplyFallback() - if len(replyToEvt.Content.FormattedBody) == 0 { - replyToEvt.Content.FormattedBody = html.EscapeString(replyToEvt.Content.Body) + roomID := evt.Content.RelatesTo.InReplyTo.RoomID + if len(roomID) == 0 { + roomID = room.ID + } + replyToEvt, _ := matrix.Client().GetEvent(roomID, evt.Content.GetReplyTo()) + if replyToEvt != nil { + replyToEvt.Content.RemoveReplyFallback() + if len(replyToEvt.Content.FormattedBody) == 0 { + replyToEvt.Content.FormattedBody = html.EscapeString(replyToEvt.Content.Body) + } + evt.Content.FormattedBody = fmt.Sprintf( + "In reply to <a href='https://matrix.to/#/%[1]s'>%[1]s</a><blockquote>%[2]s</blockquote><br/>%[3]s", + replyToEvt.Sender, replyToEvt.Content.FormattedBody, evt.Content.FormattedBody) + } else { + evt.Content.FormattedBody = fmt.Sprintf( + "In reply to unknown event https://matrix.to/#/%[1]s/%[2]s<br/>%[3]s", + roomID, evt.Content.GetReplyTo(), evt.Content.FormattedBody) } - evt.Content.FormattedBody = fmt.Sprintf( - "In reply to <a href='https://matrix.to/#/%[1]s'>%[1]s</a><blockquote>%[2]s</blockquote><br/>%[3]s", - replyToEvt.Sender, replyToEvt.Content.FormattedBody, evt.Content.FormattedBody) } ts := unixToTime(evt.Timestamp) switch evt.Content.MsgType { diff --git a/ui/messages/tstring/cell.go b/ui/messages/tstring/cell.go index aee1716..3ea7b5a 100644 --- a/ui/messages/tstring/cell.go +++ b/ui/messages/tstring/cell.go @@ -18,6 +18,7 @@ package tstring import ( "github.com/mattn/go-runewidth" + "maunium.net/go/mauview" "maunium.net/go/tcell" ) @@ -43,7 +44,7 @@ func (cell Cell) RuneWidth() int { return runewidth.RuneWidth(cell.Char) } -func (cell Cell) Draw(screen tcell.Screen, x, y int) (chWidth int) { +func (cell Cell) Draw(screen mauview.Screen, x, y int) (chWidth int) { chWidth = cell.RuneWidth() for runeWidthOffset := 0; runeWidthOffset < chWidth; runeWidthOffset++ { screen.SetContent(x+runeWidthOffset, y, cell.Char, nil, cell.Style) diff --git a/ui/messages/tstring/string.go b/ui/messages/tstring/string.go index 7feeda0..bd6798d 100644 --- a/ui/messages/tstring/string.go +++ b/ui/messages/tstring/string.go @@ -21,6 +21,7 @@ import ( "unicode" "github.com/mattn/go-runewidth" + "maunium.net/go/mauview" "maunium.net/go/tcell" ) @@ -181,10 +182,9 @@ func (str TString) AdjustStyleFull(fn func(tcell.Style) tcell.Style) { str.AdjustStyle(0, len(str), fn) } -func (str TString) Draw(screen tcell.Screen, x, y int) { - offsetX := 0 +func (str TString) Draw(screen mauview.Screen, x, y int) { for _, cell := range str { - offsetX += cell.Draw(screen, x+offsetX, y) + x += cell.Draw(screen, x, y) } } |