Commit 8391cc34a9

8391cc34a95a82cf025b96e4352246a245d06d61

parent: 0f528ee9fa

Unsigned

lost+skunk <skunky@ebloid.ru> · 2024-07-09 14:24 UTC

Улучшение парсинга описания/комментариев в формате JSON

Layout: unified · split

app/util.go +60 −38
@@ -113,6 +113,12 @@ func ParseDescription(dscr devianter.Text) string {
113113 }
114114 return content
115115 }
116 DeleteSpywareFromUrl := func(url string) string {
117 if len(url) > 42 && url[:42] == "https://www.deviantart.com/users/outgoing?" {
118 url = url[42:]
119 }
120 return url
121 }
116122
117123 if description, dl := dscr.Html.Markup, len(dscr.Html.Markup); dl != 0 &&
118124 description[0] == '{' &&
@@ -135,6 +141,7 @@ func ParseDescription(dscr devianter.Text) string {
135141 EntityMap map[string]struct {
136142 Type string
137143 Data struct {
144 Url string
138145 Config struct {
139146 Aligment string
140147 Width int
@@ -147,31 +154,18 @@ func ParseDescription(dscr devianter.Text) string {
147154 err(e)
148155
149156 entities := make(map[int]devianter.Deviation)
157 urls := make(map[int]string)
150158 for n, x := range descr.EntityMap {
151159 num, _ := strconv.Atoi(n)
160 if x.Data.Url != "" {
161 urls[num] = DeleteSpywareFromUrl(x.Data.Url)
162 }
152163 entities[num] = x.Data.Data
153164 }
154165
155166 for _, x := range descr.Blocks {
156167 ranges := make(map[int]text)
157168
158 if len(x.InlineStyleRanges) == 0 {
159 switch x.Type {
160 case "atomic":
161 d := entities[x.EntityRanges[0].Key]
162 parseddescription.WriteString(`<img width="50%" src="`)
163 parseddescription.WriteString(ParseMedia(d.Media))
164 parseddescription.WriteString(`" title="`)
165 parseddescription.WriteString(d.Author.Username)
166 parseddescription.WriteString(" - ")
167 parseddescription.WriteString(d.Title)
168 parseddescription.WriteString(`">`)
169 case "unstyled":
170 parseddescription.WriteString(x.Text)
171 }
172 parseddescription.WriteString("<br>")
173 }
174
175169 for i, rngs := range x.InlineStyleRanges {
176170 var tag string
177171
@@ -192,22 +186,48 @@ func ParseDescription(dscr devianter.Text) string {
192186 }
193187 }
194188
195 for _, r := range ranges {
196 var tag string
197 switch x.Type {
198 case "header-two":
199 tag = "h2"
200 case "unstyled":
201 tag = "p"
189 switch x.Type {
190 case "atomic":
191 d := entities[x.EntityRanges[0].Key]
192 parseddescription.WriteString(`<img width="50%" src="`)
193 parseddescription.WriteString(ParseMedia(d.Media))
194 parseddescription.WriteString(`" title="`)
195 parseddescription.WriteString(d.Author.Username)
196 parseddescription.WriteString(" - ")
197 parseddescription.WriteString(d.Title)
198 parseddescription.WriteString(`">`)
199 case "unstyled":
200 if len(ranges) != 0 {
201 for _, r := range ranges {
202 var tag string
203 switch x.Type {
204 case "header-two":
205 tag = "h2"
206 }
207
208 parseddescription.WriteString(x.Text[:r.from])
209 if len(urls) != 0 && len(x.EntityRanges) != 0 {
210 ra := &x.EntityRanges[0]
211
212 parseddescription.WriteString(`<a target="_blank" href="`)
213 parseddescription.WriteString(urls[ra.Key])
214 parseddescription.WriteString(`">`)
215 parseddescription.WriteString(r.TXT)
216 parseddescription.WriteString(`</a>`)
217 } else {
218 parseddescription.WriteString(r.TXT)
219 }
220 parseddescription.WriteString(TagBuilder(tag, x.Text[r.to:]))
221 }
222 } else {
223 parseddescription.WriteString(x.Text)
202224 }
203 parseddescription.WriteString(r.TXT)
204 parseddescription.WriteString(TagBuilder(tag, x.Text[r.to:]))
205225 }
226 parseddescription.WriteString("<br>")
206227 }
207228 } else if dl != 0 {
208229 for tt := html.NewTokenizer(strings.NewReader(dscr.Html.Markup)); ; {
209 t := tt.Next()
210 switch t {
230 switch tt.Next() {
211231 case html.ErrorToken:
212232 return parseddescription.String()
213233 case html.StartTagToken, html.EndTagToken, html.SelfClosingTagToken:
@@ -216,18 +236,16 @@ func ParseDescription(dscr devianter.Text) string {
216236 case "a":
217237 for _, a := range token.Attr {
218238 if a.Key == "href" {
219 url := strings.ReplaceAll(a.Val, "https://www.deviantart.com/users/outgoing?", "")
220 if strings.Contains(url, "deviantart") {
221 url = strings.ReplaceAll(url, "https://www.deviantart.com/", "")
222 url = strings.ReplaceAll(url, url[0:strings.Index(url, "/")+1], "")
223 }
224 parseddescription.WriteString("<a target=\"_blank\" href=\"" + url + "\">" + tagval(tt) + "</a> ")
239 url := DeleteSpywareFromUrl(a.Val)
240 parseddescription.WriteString(`<a target="_blank" href="`)
241 parseddescription.WriteString(url)
242 parseddescription.WriteString(`">`)
243 parseddescription.WriteString(tagval(tt))
244 parseddescription.WriteString("</a> ")
225245 }
226246 }
227247 case "img":
228 var (
229 uri, title string
230 )
248 var uri, title string
231249 for b, a := range token.Attr {
232250 switch a.Key {
233251 case "src":
@@ -239,7 +257,11 @@ func ParseDescription(dscr devianter.Text) string {
239257 }
240258 if title != "" {
241259 for x := -1; x < b; x++ {
242 parseddescription.WriteString("<img src=\"" + uri + "\" title=\"" + title + "\">")
260 parseddescription.WriteString(`<img src="`)
261 parseddescription.WriteString(uri)
262 parseddescription.WriteString(`" title="`)
263 parseddescription.WriteString(title)
264 parseddescription.WriteString(`">`)
243265 }
244266 }
245267 }
gowna added
html/deviantion.htm +8 −2
@@ -3,6 +3,7 @@
33 <head>
44 <title>SkunkyArt | {{.Templates.Deviation.Post.Deviation.Author.Username}} - {{.Templates.Deviation.Post.Deviation.Title}}</title>
55 <link rel="stylesheet" href="{{.BasePath}}gui/css/skunky.css">
6 <meta name="referrer" content="no-referrer" />
67 </head>
78 <main>
89 <header>
@@ -33,10 +34,15 @@
3334 {{if (ne .Templates.Deviation.Tags "")}}
3435 {{.Templates.Deviation.Tags}}<br>
3536 {{end}}
36 <span>Published: <strong>{{.Templates.Deviation.StringTime}}</strong>; Views: <strong>{{.Templates.Deviation.Post.Deviation.Stats.Views}}</strong>; Favourites: <strong>{{.Templates.Deviation.Post.Deviation.Stats.Favourites}}</strong>; Downloads: <strong>{{.Templates.Deviation.Post.Deviation.Stats.Downloads}}</strong></span>
37 <span>Published: <strong>{{.Templates.Deviation.StringTime}}</strong>; Views: <strong>{{.Templates.Deviation.Post.Deviation.Stats.Views}}</strong>; Favourites: <strong>{{.Templates.Deviation.Post.Deviation.Stats.Favourites}}</strong>; Downloads: <strong>{{.Templates.Deviation.Post.Deviation.Stats.Downloads}}</strong><span>
38 <br><a target="_blank" href="https://www.deviantart.com/{{.Templates.Deviation.Post.Deviation.Author.Username}}/art/art-{{.Templates.Deviation.Post.Deviation.ID}}">Redirect to original</a>
39 </span>
3740 {{if (ne .Templates.Deviation.Post.Description "")}}
3841 <figcaption>
39 {{.Templates.Deviation.Post.Description}}
42 <details>
43 <summary>Description</summary>
44 {{.Templates.Deviation.Post.Description}}
45 </details>
4046 </figcaption>
4147 {{end}}
4248 {{if ne .Templates.Deviation.Related ""}}