From a8633b828f3e4e2d232e2194d9f2b85cdcd9e8db Mon Sep 17 00:00:00 2001 From: lost+skunk Date: Thu, 27 Jun 2024 14:51:46 +0300 Subject: крымские наработки MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/util.go | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 app/util.go (limited to 'app/util.go') 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("") + 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() +} -- cgit v1.2.3