From 1c874d8e0a83185e278d07d68675b7d13ba10b0d Mon Sep 17 00:00:00 2001 From: Alessio Date: Fri, 3 May 2024 16:14:58 -0700 Subject: [PATCH] Fix entities preceded by punctuation marks rendering weird --- internal/webserver/renderer_helpers.go | 6 +++-- internal/webserver/renderer_helpers_test.go | 23 +++++++++++++++++++ .../text_with_entities.tpl | 5 ++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 internal/webserver/renderer_helpers_test.go diff --git a/internal/webserver/renderer_helpers.go b/internal/webserver/renderer_helpers.go index 02c9f2f..49a4ae4 100644 --- a/internal/webserver/renderer_helpers.go +++ b/internal/webserver/renderer_helpers.go @@ -161,8 +161,10 @@ func get_entities(text string) []Entity { ret := []Entity{} start := 0 for _, idxs := range regexp.MustCompile(`(\W|^)[@#]\w+`).FindAllStringIndex(text, -1) { - // Handle leading whitespace. Only match start-of-string or leading whitespace to avoid matching, e.g., emails - if text[idxs[0]] == ' ' || text[idxs[0]] == '\n' { + // The character immediately preceding the entity must not be a word character (alphanumeric + // or "_"). This is to avoid matching emails. Accordingly, if the first character in the + // match isn't a '@' or '#' (i.e., there's a preceding character), skip past it. + if text[idxs[0]] != '@' && text[idxs[0]] != '#' { idxs[0] += 1 } if start != idxs[0] { diff --git a/internal/webserver/renderer_helpers_test.go b/internal/webserver/renderer_helpers_test.go new file mode 100644 index 0000000..5af9e1f --- /dev/null +++ b/internal/webserver/renderer_helpers_test.go @@ -0,0 +1,23 @@ +package webserver + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestEntitiesWithParentheses(t *testing.T) { + assert := assert.New(t) + + entities := get_entities("Companies are looking for ways to reduce costs (@BowTiedBull has said this), through process automation.)") + assert.Len(entities, 3) + assert.Equal(entities[0].EntityType, ENTITY_TYPE_TEXT) + assert.Equal(entities[0].Contents, "Companies are looking for ways to reduce costs (") + assert.Equal(entities[1].EntityType, ENTITY_TYPE_MENTION) + assert.Equal(entities[1].Contents, "BowTiedBull") + assert.Equal(entities[2].EntityType, ENTITY_TYPE_TEXT) + assert.Equal(entities[2].Contents, " has said this), through process automation.)") +} + + + diff --git a/internal/webserver/tpl/tweet_page_includes/text_with_entities.tpl b/internal/webserver/tpl/tweet_page_includes/text_with_entities.tpl index ea2d59f..18e720e 100644 --- a/internal/webserver/tpl/tweet_page_includes/text_with_entities.tpl +++ b/internal/webserver/tpl/tweet_page_includes/text_with_entities.tpl @@ -10,6 +10,11 @@ #{{.Contents}} {{else}} + + {{.Contents}} {{end}} {{end}}