summaryrefslogtreecommitdiff
path: root/app/util.go
diff options
context:
space:
mode:
authorlost+skunk <[email protected]>2024-06-27 14:51:46 +0300
committerlost+skunk <[email protected]>2024-06-27 14:51:46 +0300
commita8633b828f3e4e2d232e2194d9f2b85cdcd9e8db (patch)
treefb429d34eccf9248604230e18d3822ea7432471c /app/util.go
parentaec0bfc4384ba8451974a250c70e4fcb52717a1d (diff)
downloadskunky-art-a8633b828f3e4e2d232e2194d9f2b85cdcd9e8db.tar.gz
skunky-art-a8633b828f3e4e2d232e2194d9f2b85cdcd9e8db.tar.bz2
skunky-art-a8633b828f3e4e2d232e2194d9f2b85cdcd9e8db.zip
крымские наработки
Diffstat (limited to 'app/util.go')
-rw-r--r--app/util.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/app/util.go b/app/util.go
new file mode 100644
index 0000000..7c4d104
--- /dev/null
+++ b/app/util.go
@@ -0,0 +1,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()
+}