shithub: hell

ref: 65d329e674a7a01fff1bda9a6eb9ab0927bd531e
dir: /edit.go/

View raw version
package main

import (
	"bytes"
	"errors"
	"strings"

	mastodon "codeberg.org/penny64/hellclient-go-mastodon"
	"golang.org/x/net/html"
)

// Replace username links with their user@domain format
func prepareForEdit(status *mastodon.Status) (string, error) {
	doc, err := html.Parse(strings.NewReader(status.Content))
	if err != nil {
		return "", errors.New("failed to parse post HTML")
	}
	mentions := 0
	for node := range doc.Descendants() {
		if node.Data == "a" && node.Type == html.ElementNode {
			ismention := false
			for attr := range node.Attr {
				if node.Attr[attr].Key == "class" && strings.Contains(node.Attr[attr].Val, "mention") {
					ismention = true
					continue
				}
			}
			if ismention {
				for attr := range node.Attr {
					if node.Attr[attr].Key == "href" {
						node.Attr[attr].Val = "@" + status.Mentions[mentions].Acct
						mentions++
					}
				}
			}
		}
	}

	//Rip off the HTML body the parser made for us
	for node := range doc.Descendants() {
		if node.Data == "body" {
			node.Type = html.DocumentNode
			doc = node
		}
	}

	var rendered bytes.Buffer
	err = html.Render(&rendered, doc)

	if err != nil {
		return "", err
	}

	renderedPlainText := rendered.String()

	return renderedPlainText, nil
}