emojionly.go (2274B)
1 // GoToSocial 2 // Copyright (C) GoToSocial Authors admin@gotosocial.org 3 // SPDX-License-Identifier: AGPL-3.0-or-later 4 // 5 // This program is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Affero General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Affero General Public License for more details. 14 // 15 // You should have received a copy of the GNU Affero General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 package text 19 20 import ( 21 "bytes" 22 "context" 23 24 "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" 25 "github.com/superseriousbusiness/gotosocial/internal/log" 26 "github.com/yuin/goldmark" 27 "github.com/yuin/goldmark/parser" 28 "github.com/yuin/goldmark/renderer/html" 29 "github.com/yuin/goldmark/util" 30 ) 31 32 func (f *formatter) FromPlainEmojiOnly(ctx context.Context, pmf gtsmodel.ParseMentionFunc, authorID string, statusID string, plain string) *FormatResult { 33 result := &FormatResult{ 34 Mentions: []*gtsmodel.Mention{}, 35 Tags: []*gtsmodel.Tag{}, 36 Emojis: []*gtsmodel.Emoji{}, 37 } 38 // parse markdown text into html, using custom renderer to add hashtag/mention links 39 md := goldmark.New( 40 goldmark.WithRendererOptions( 41 html.WithXHTML(), 42 html.WithHardWraps(), 43 ), 44 goldmark.WithParser( 45 parser.NewParser( 46 parser.WithBlockParsers( 47 util.Prioritized(newPlaintextParser(), 500), 48 ), 49 ), 50 ), 51 goldmark.WithExtensions( 52 &customRenderer{f, ctx, pmf, authorID, statusID, true, result}, 53 ), 54 ) 55 56 var htmlContentBytes bytes.Buffer 57 err := md.Convert([]byte(plain), &htmlContentBytes) 58 if err != nil { 59 log.Errorf(ctx, "error formatting plaintext to HTML: %s", err) 60 } 61 result.HTML = htmlContentBytes.String() 62 63 // clean anything dangerous out of the HTML 64 result.HTML = SanitizeHTML(result.HTML) 65 66 // shrink ray 67 result.HTML, err = m.String("text/html", result.HTML) 68 if err != nil { 69 log.Errorf(ctx, "error minifying HTML: %s", err) 70 } 71 72 return result 73 }