summaryrefslogtreecommitdiff
path: root/app/util.go
blob: 7c4d1044e14fb5f316953b2ea2d157fffb2d73af (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package app

import (
	"encoding/json"
	"strings"

	"git.macaw.me/skunky/devianter"
)

type text struct {
	TXT  string
	from int
	to   int
}

func ParseDescription(dscr devianter.Text) string {
	var parseddescription strings.Builder
	TagBuilder := func(tag string, content string) string {
		if tag != "" {
			var htm strings.Builder
			htm.WriteString("<")
			htm.WriteString(tag)
			htm.WriteString(">")

			htm.WriteString(content)

			htm.WriteString("</")
			htm.WriteString(tag)
			htm.WriteString(">")
			return htm.String()
		}
		return content
	}

	if description, dl := dscr.Html.Markup, len(dscr.Html.Markup); dl != 0 &&
		description[0] == '{' &&
		description[dl-1] == '}' {
		var descr struct {
			Blocks []struct {
				Key, Text, Type   string
				InlineStyleRanges []struct {
					Offset, Length int
					Style          string
				}
			}
		}
		e := json.Unmarshal([]byte(description), &descr)
		err(e)

		for _, x := range descr.Blocks {
			ranges := make(map[int]text)
			for i, rngs := range x.InlineStyleRanges {
				var tag string

				switch rngs.Style {
				case "BOLD":
					tag = "b"
				case "UNDERLINE":
					tag = "u"
				case "ITALIC":
					tag = "i"
				}

				fromto := rngs.Offset + rngs.Length
				ranges[i] = text{
					TXT:  TagBuilder(tag, x.Text[rngs.Offset:fromto]),
					from: rngs.Offset,
					to:   fromto,
				}
			}

			for _, r := range ranges {
				var tag string
				switch x.Type {
				case "header-two":
					tag = "h2"
				case "unstyled":
					tag = "p"
				}
				parseddescription.WriteString(r.TXT)
				parseddescription.WriteString(TagBuilder(tag, x.Text[r.to:]))
			}
		}
	} else if dl != 0 {
		parseddescription.WriteString(description)
	}

	return parseddescription.String()
}