<feed xmlns='http://www.w3.org/2005/Atom'>
<title>devianter.git/comments_test.go, branch v0.3.3</title>
<subtitle>deviantart guest api library for go.
</subtitle>
<id>http://git.krz.sh/krz/devianter.git/atom?h=v0.3.3</id>
<link rel='self' href='http://git.krz.sh/krz/devianter.git/atom?h=v0.3.3'/>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/devianter.git/'/>
<updated>2026-07-15T23:01:39+00:00</updated>
<entry>
<title>fix: extract text from tiptap bodies, and read the right description field (#4)</title>
<updated>2026-07-15T23:01:39+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T23:01:39+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/devianter.git/commit/?id=9c6ad663cf5901669aaed59cb16482e0f716a313'/>
<id>urn:sha1:9c6ad663cf5901669aaed59cb16482e0f716a313</id>
<content type='text'>
Checking the library against the live API disproved what its comments
claimed. Comment and Description were handing back raw JSON blobs, and
the parser this package has always carried could not have prevented it.

DeviantArt no longer stores rich text as Draft.js. It uses tiptap:

  Draft.js, what we parse:  {"blocks":[{"text":"..."}]}
  tiptap, what DA sends:    {"version":1,"document":{"type":"doc",...}}

Across 34 live comments: 33 tiptap, 0 Draft.js, and 33 whose .Comment was
the raw JSON. flattenMarkup now walks the tiptap tree — text nodes joined
per block, hardBreak as a newline, entities decoded — and keeps the
Draft.js path for old bodies that still carry it. Nodes with no text of
their own (images, galleries, emotes) drop out, as they always did.

The description had a second, larger bug behind that one. It lives in
Extended.DescriptionText, not TextContent, which GetDeviation read: of 24
deviations sampled, 23 populated the former and 1 the latter. So
Post.Description was empty for nearly every deviation, and the txt[1]
guard removed in 3dad0ea was never what stood in the way. Prefer
Extended.DescriptionText and fall back, since either may be the one set.

Verified against the live API rather than by reading: comments still raw
JSON went 33/34 to 0/34, and descriptions that were "" now return prose.

Also corrects the doc comments that asserted the Draft.js story on
pkg.go.dev, and notes that flattening drops images, links, and emotes.</content>
</entry>
<entry>
<title>docs: document the exported API, and fix five bugs found writing it (#2)</title>
<updated>2026-07-15T22:26:22+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T22:26:22+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/devianter.git/commit/?id=b80180e77eebad8476aa66c8a5433764da672c62'/>
<id>urn:sha1:b80180e77eebad8476aa66c8a5433764da672c62</id>
<content type='text'>
* docs: translate Russian comments and document exported API

The package carried 35 Russian comments and no doc comments on its
exported identifiers, so pkg.go.dev rendered a bare list of signatures.

Translate the Russian to English and give every exported identifier a
doc comment in godoc form. Add doc.go with a package overview covering
the guest-session requirement, the Error-as-struct convention, and
CloudFront blocking.

The comments record what the signatures cannot: that UpdateCSRF must run
first and that its token expires, that Error is a struct and so is never
nil, that Thread is one comment rather than a thread, and that
GetComments' page parameter costs one request per page.

Comments only; the struct field realignment is gofmt's, from doc comments
splitting alignment groups.

Refs #1

* add CODEOWNERS

* fix: stop the library killing its caller, and flatten text correctly

Writing doc comments for the exported API surfaced behavior too alarming
to document and leave alone. A library should never terminate the process
that imports it.

Crashes:

- GetComments panicked on a comment with an empty body: the shape check
  read m[0] and m[len(m)-1] with no length check.
- Group.Favourites and Group.Gallery indexed their variadic folderid
  without checking len, so omitting it — which the signature invites —
  panicked. Omitting it now means 0.
- AEmedia and PerformSearch called log.Fatalln on a bad argument rune,
  terminating the caller. Both now return an error, which their
  signatures already allowed for.

Draft.js flattening, in the same code both callers share:

- The block loop assigned rather than accumulated, so every block but the
  last was dropped and a multi-paragraph body came back as its closing
  line alone. Blocks are block-level elements, so join them with newlines.
- GetDeviation guarded on txt[1] == '{', the second character of a body
  that opens with {"blocks". It never fired, so descriptions were handed
  back as raw Draft.js JSON. It now shares flattenComment with
  GetComments rather than keeping its own copy.

Both flattening fixes change output for existing callers.

Refs #1</content>
</entry>
</feed>
