Skip to content

Commit 93fe571

Browse files
committed
add support for tags
1 parent 1e9f2bb commit 93fe571

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

bsky.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ func (pb *PostBuilder) buildFor(server string, c *http.Client) (*postRequest, er
127127

128128
pb.parseLinks()
129129
pb.parseMentions(server, c)
130+
pb.parseTags()
130131
if len(pb.facets) > 0 {
131132
record.Facets = make([]facet, len(pb.facets))
132133
for i, f := range pb.facets {
@@ -224,6 +225,29 @@ func (pb *PostBuilder) parseMentions(server string, c *http.Client) {
224225
}
225226
}
226227

228+
func (pb *PostBuilder) parseTags() {
229+
tag_regex := `[\s^](?P<tag>#[^\d\s]\S*)\b`
230+
r, err := regexp.Compile(tag_regex)
231+
if err != nil {
232+
log.Printf("Error compiling regex: %v", err)
233+
return
234+
}
235+
matches := r.FindAllSubmatchIndex([]byte(pb.content), -1)
236+
for _, match := range matches {
237+
start := match[2] // start position of the tag group
238+
end := match[3]
239+
tag := pb.content[start+1 : end] // +1 to skip the '#' character
240+
f := &facet{
241+
Features: []feature{
242+
{Type: "app.bsky.richtext.facet#tag", Tag: tag},
243+
},
244+
}
245+
f.Index.ByteStart = start
246+
f.Index.ByteEnd = end
247+
pb.facets = append(pb.facets, f)
248+
}
249+
}
250+
227251
type postRequest struct {
228252
Repo string `json:"repo"`
229253
Collection string `json:"collection"`
@@ -252,8 +276,9 @@ type facet struct {
252276

253277
type feature struct {
254278
Type string `json:"$type"`
255-
Handle string `json:"handle,omitempty"`
256279
Did string `json:"did,omitempty"`
280+
Handle string `json:"handle,omitempty"`
281+
Tag string `json:"tag,omitempty"`
257282
Uri string `json:"uri,omitempty"`
258283
}
259284

bsky_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,22 @@ func TestPostWithMentions(t *testing.T) {
9191
}
9292
}
9393

94+
func TestPostWithTags(t *testing.T) {
95+
server := newMockServer()
96+
defer server.Close()
97+
98+
client, err := NewClient(server.URL, "test.handle", "test.password")
99+
if err != nil {
100+
t.Fatalf("wanted no error, got %v", err)
101+
}
102+
content := "Tag test: #golang #bsky"
103+
pb := NewPostBuilder(content)
104+
_, err = client.Post(pb)
105+
if err != nil {
106+
t.Fatalf("wanted no error, got %v", err)
107+
}
108+
}
109+
94110
func TestPostWithMentionsAndLinks(t *testing.T) {
95111
server := newMockServer()
96112
defer server.Close()

examples/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func ImageAndFacetsExample() {
5656
if err != nil {
5757
log.Fatalf("Error creating client: %v", err)
5858
}
59-
postBuilder := ltbsky.NewPostBuilder("Hello with image and facets! https://go.dev @golang.org")
59+
postBuilder := ltbsky.NewPostBuilder("Hello with image and facets! https://go.dev @golang.org #golang")
6060
postBuilder.AddLang("en")
6161
postBuilder.AddImageFromPath("./test-data/bsky-go-1.png", "Alt text for image")
6262

0 commit comments

Comments
 (0)