summaryrefslogtreecommitdiff
path: root/internal/processing/status/util.go
diff options
context:
space:
mode:
authorLibravatar Autumn! <86073772+autumnull@users.noreply.github.com>2023-02-03 10:58:58 +0000
committerLibravatar GitHub <noreply@github.com>2023-02-03 11:58:58 +0100
commit49beb17a8fbdbf3517c103a477a5459a3bba404d (patch)
tree364c82d4089c75d3b95a5d78fd31b33d91b30b59 /internal/processing/status/util.go
parent[bugfix] Read Bookwyrm Articles more thoroughly (#1410) (diff)
downloadgotosocial-49beb17a8fbdbf3517c103a477a5459a3bba404d.tar.xz
[chore] Text formatting overhaul (#1406)
* Implement goldmark debug print for hashtags and mentions * Minify HTML in FromPlain * Convert plaintext status parser to goldmark * Move mention/tag/emoji finding logic into formatter * Combine mention and hashtag boundary characters * Normalize unicode when rendering hashtags
Diffstat (limited to 'internal/processing/status/util.go')
-rw-r--r--internal/processing/status/util.go112
1 files changed, 32 insertions, 80 deletions
diff --git a/internal/processing/status/util.go b/internal/processing/status/util.go
index 2847d1c42..1115219cd 100644
--- a/internal/processing/status/util.go
+++ b/internal/processing/status/util.go
@@ -28,8 +28,7 @@ import (
"github.com/superseriousbusiness/gotosocial/internal/db"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
- "github.com/superseriousbusiness/gotosocial/internal/log"
- "github.com/superseriousbusiness/gotosocial/internal/util"
+ "github.com/superseriousbusiness/gotosocial/internal/text"
)
func (p *processor) ProcessVisibility(ctx context.Context, form *apimodel.AdvancedStatusCreateForm, accountDefaultVis gtsmodel.Visibility, status *gtsmodel.Status) error {
@@ -212,80 +211,6 @@ func (p *processor) ProcessLanguage(ctx context.Context, form *apimodel.Advanced
return nil
}
-func (p *processor) ProcessMentions(ctx context.Context, form *apimodel.AdvancedStatusCreateForm, accountID string, status *gtsmodel.Status) error {
- mentionedAccountNames := util.DeriveMentionNamesFromText(form.Status)
- mentions := []*gtsmodel.Mention{}
- mentionIDs := []string{}
-
- for _, mentionedAccountName := range mentionedAccountNames {
- gtsMention, err := p.parseMention(ctx, mentionedAccountName, accountID, status.ID)
- if err != nil {
- log.Errorf("ProcessMentions: error parsing mention %s from status: %s", mentionedAccountName, err)
- continue
- }
-
- if err := p.db.Put(ctx, gtsMention); err != nil {
- log.Errorf("ProcessMentions: error putting mention in db: %s", err)
- }
-
- mentions = append(mentions, gtsMention)
- mentionIDs = append(mentionIDs, gtsMention.ID)
- }
-
- // add full populated gts menchies to the status for passing them around conveniently
- status.Mentions = mentions
- // add just the ids of the mentioned accounts to the status for putting in the db
- status.MentionIDs = mentionIDs
-
- return nil
-}
-
-func (p *processor) ProcessTags(ctx context.Context, form *apimodel.AdvancedStatusCreateForm, accountID string, status *gtsmodel.Status) error {
- tags := []string{}
- gtsTags, err := p.db.TagStringsToTags(ctx, util.DeriveHashtagsFromText(form.Status), accountID)
- if err != nil {
- return fmt.Errorf("error generating hashtags from status: %s", err)
- }
- for _, tag := range gtsTags {
- if err := p.db.Put(ctx, tag); err != nil {
- if !errors.Is(err, db.ErrAlreadyExists) {
- return fmt.Errorf("error putting tags in db: %s", err)
- }
- }
- tags = append(tags, tag.ID)
- }
- // add full populated gts tags to the status for passing them around conveniently
- status.Tags = gtsTags
- // add just the ids of the used tags to the status for putting in the db
- status.TagIDs = tags
- return nil
-}
-
-func (p *processor) ProcessEmojis(ctx context.Context, form *apimodel.AdvancedStatusCreateForm, accountID string, status *gtsmodel.Status) error {
- // for each emoji shortcode in the text, check if it's an enabled
- // emoji on this instance, and if so, add it to the status
- emojiShortcodes := util.DeriveEmojisFromText(form.SpoilerText + "\n\n" + form.Status)
- status.Emojis = make([]*gtsmodel.Emoji, 0, len(emojiShortcodes))
- status.EmojiIDs = make([]string, 0, len(emojiShortcodes))
-
- for _, shortcode := range emojiShortcodes {
- emoji, err := p.db.GetEmojiByShortcodeDomain(ctx, shortcode, "")
- if err != nil {
- if err != db.ErrNoEntries {
- log.Errorf("error getting local emoji with shortcode %s: %s", shortcode, err)
- }
- continue
- }
-
- if *emoji.VisibleInPicker && !*emoji.Disabled {
- status.Emojis = append(status.Emojis, emoji)
- status.EmojiIDs = append(status.EmojiIDs, emoji.ID)
- }
- }
-
- return nil
-}
-
func (p *processor) ProcessContent(ctx context.Context, form *apimodel.AdvancedStatusCreateForm, accountID string, status *gtsmodel.Status) error {
// if there's nothing in the status at all we can just return early
if form.Status == "" {
@@ -311,16 +236,43 @@ func (p *processor) ProcessContent(ctx context.Context, form *apimodel.AdvancedS
}
// parse content out of the status depending on what format has been submitted
- var formatted string
+ var f text.FormatFunc
switch form.Format {
case apimodel.StatusFormatPlain:
- formatted = p.formatter.FromPlain(ctx, form.Status, status.Mentions, status.Tags)
+ f = p.formatter.FromPlain
case apimodel.StatusFormatMarkdown:
- formatted = p.formatter.FromMarkdown(ctx, form.Status, status.Mentions, status.Tags, status.Emojis)
+ f = p.formatter.FromMarkdown
default:
return fmt.Errorf("format %s not recognised as a valid status format", form.Format)
}
+ formatted := f(ctx, p.parseMention, accountID, status.ID, form.Status)
+
+ // add full populated gts {mentions, tags, emojis} to the status for passing them around conveniently
+ // add just their ids to the status for putting in the db
+ status.Mentions = formatted.Mentions
+ status.MentionIDs = make([]string, 0, len(formatted.Mentions))
+ for _, gtsmention := range formatted.Mentions {
+ status.MentionIDs = append(status.MentionIDs, gtsmention.ID)
+ }
+
+ status.Tags = formatted.Tags
+ status.TagIDs = make([]string, 0, len(formatted.Tags))
+ for _, gtstag := range formatted.Tags {
+ status.TagIDs = append(status.TagIDs, gtstag.ID)
+ }
+
+ status.Emojis = formatted.Emojis
+ status.EmojiIDs = make([]string, 0, len(formatted.Emojis))
+ for _, gtsemoji := range formatted.Emojis {
+ status.EmojiIDs = append(status.EmojiIDs, gtsemoji.ID)
+ }
+
+ spoilerformatted := p.formatter.FromPlainEmojiOnly(ctx, p.parseMention, accountID, status.ID, form.SpoilerText)
+ for _, gtsemoji := range spoilerformatted.Emojis {
+ status.Emojis = append(status.Emojis, gtsemoji)
+ status.EmojiIDs = append(status.EmojiIDs, gtsemoji.ID)
+ }
- status.Content = formatted
+ status.Content = formatted.HTML
return nil
}