199 lines
4.4 KiB
Go
199 lines
4.4 KiB
Go
|
|
package pana
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"iter"
|
||
|
|
|
||
|
|
ld "sourcery.dny.nu/longdistance"
|
||
|
|
as "sourcery.dny.nu/pana/vocab/w3/activitystreams"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Link is the ActivityStreams Link type.
|
||
|
|
//
|
||
|
|
// Though Link can have an ID, this never happens in practice because the target
|
||
|
|
// of a link is stored in [as.Href] instead.
|
||
|
|
type Link ld.Node
|
||
|
|
|
||
|
|
// NewLink initialises a new Link.
|
||
|
|
func NewLink() *Link {
|
||
|
|
return &Link{
|
||
|
|
Properties: make(ld.Properties),
|
||
|
|
Type: []string{as.TypeLink},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Build finalises the Link.
|
||
|
|
func (l *Link) Build() Link {
|
||
|
|
return *l
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.GetType].
|
||
|
|
//
|
||
|
|
// This will most commonly be one of:
|
||
|
|
// - [as.TypeLink]
|
||
|
|
// - [as.TypeDocument]
|
||
|
|
// - [as.TypeImage]
|
||
|
|
// - [as.TypeAudio]
|
||
|
|
// - [as.TypeVideo]
|
||
|
|
// - [as.TypeMention]
|
||
|
|
// - [as.TypeHashtag]
|
||
|
|
//
|
||
|
|
// You'll probably want to use [LinkTag] for Mention and Hashtag.
|
||
|
|
func (l *Link) GetType() string {
|
||
|
|
if l.Type == nil {
|
||
|
|
return ""
|
||
|
|
}
|
||
|
|
return l.Type[0]
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Object.SetType].
|
||
|
|
func (l *Link) SetType(t string) *Link {
|
||
|
|
l.Type = []string{t}
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetHref returns the value from [as.Href].
|
||
|
|
func (l *Link) GetHref() string {
|
||
|
|
if nodes := (*ld.Node)(l).GetNodes(as.Href); len(nodes) == 1 {
|
||
|
|
return nodes[0].ID
|
||
|
|
}
|
||
|
|
return ""
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetHref sets a URL in [as.Href].
|
||
|
|
func (l *Link) SetHref(url string) *Link {
|
||
|
|
(*ld.Node)(l).SetNodes(as.Href, ld.Node{ID: url})
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetName returns the value from [as.Name].
|
||
|
|
func (l *Link) GetName() iter.Seq[*Localised] {
|
||
|
|
return func(yield func(*Localised) bool) {
|
||
|
|
for _, n := range (*ld.Node)(l).GetNodes(as.Name) {
|
||
|
|
if !yield((*Localised)(&n)) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetName sets a value in [as.Name].
|
||
|
|
func (l *Link) AddName(ls ...Localised) *Link {
|
||
|
|
(*ld.Node)(l).AddNodes(as.Name, toLDNodes(ls...)...)
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetHreflang returns the value from [as.Hreflang].
|
||
|
|
func (l *Link) GetHreflang() json.RawMessage {
|
||
|
|
if nodes := (*ld.Node)(l).GetNodes(as.Hreflang); len(nodes) == 1 {
|
||
|
|
return nodes[0].Value
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetHreflang sets a value in [as.Hreflang].
|
||
|
|
func (l *Link) SetHreflang(hreflang json.RawMessage) *Link {
|
||
|
|
(*ld.Node)(l).SetNodes(as.Hreflang, ld.Node{Value: hreflang})
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetMediaType returns the value from [as.MediaType].
|
||
|
|
func (l *Link) GetMediaType() json.RawMessage {
|
||
|
|
if nodes := (*ld.Node)(l).GetNodes(as.MediaType); len(nodes) == 1 {
|
||
|
|
return nodes[0].Value
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetMediaType sets a value in [as.MediaType].
|
||
|
|
func (l *Link) SetMediaType(mediaType json.RawMessage) *Link {
|
||
|
|
(*ld.Node)(l).SetNodes(as.MediaType, ld.Node{Value: mediaType})
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetRel returns the value from [as.Rel].
|
||
|
|
func (l *Link) GetRel() json.RawMessage {
|
||
|
|
if nodes := (*ld.Node)(l).GetNodes(as.Rel); len(nodes) == 1 {
|
||
|
|
return nodes[0].Value
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetRel sets a value in [as.Rel].
|
||
|
|
func (l *Link) SetRel(rel json.RawMessage) *Link {
|
||
|
|
(*ld.Node)(l).SetNodes(as.Rel, ld.Node{Value: rel})
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetHeight returns the value from [as.Height].
|
||
|
|
func (l *Link) GetHeight() json.RawMessage {
|
||
|
|
if nodes := (*ld.Node)(l).GetNodes(as.Height); len(nodes) == 1 {
|
||
|
|
return nodes[0].Value
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetHeight sets a value in [as.Height].
|
||
|
|
func (l *Link) SetHeight(height json.RawMessage) *Link {
|
||
|
|
(*ld.Node)(l).SetNodes(as.Height, ld.Node{Value: height})
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetWidth returns the value from [as.Width].
|
||
|
|
func (l *Link) GetWidth() json.RawMessage {
|
||
|
|
if nodes := (*ld.Node)(l).GetNodes(as.Width); len(nodes) == 1 {
|
||
|
|
return nodes[0].Value
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetWidth sets a value in [as.Width].
|
||
|
|
func (l *Link) SetWidth(width json.RawMessage) *Link {
|
||
|
|
(*ld.Node)(l).SetNodes(as.Width, ld.Node{Value: width})
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// LinkTag is a more constrained version of [Link] that is used in [as.Tag].
|
||
|
|
//
|
||
|
|
// It's usually used to represent hashtags and mentions.
|
||
|
|
type LinkTag Link
|
||
|
|
|
||
|
|
func NewLinkTag() *LinkTag {
|
||
|
|
return &LinkTag{
|
||
|
|
Properties: make(ld.Properties, 2),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Link.GetType].
|
||
|
|
func (l *LinkTag) GetType() string {
|
||
|
|
return (*Link)(l).GetType()
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Link.SetType].
|
||
|
|
func (l *LinkTag) SetType(t string) *LinkTag {
|
||
|
|
(*Link)(l).SetType(t)
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Link.GetHref]
|
||
|
|
func (l *LinkTag) GetHref() string {
|
||
|
|
return (*Link)(l).GetHref()
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Link.SetHref].
|
||
|
|
func (l *LinkTag) SetHref(url string) *LinkTag {
|
||
|
|
(*Link)(l).SetHref(url)
|
||
|
|
return l
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Link.GetName].
|
||
|
|
func (l *LinkTag) GetName() iter.Seq[*Localised] {
|
||
|
|
return (*Link)(l).GetName()
|
||
|
|
}
|
||
|
|
|
||
|
|
// See [Link.AddName].
|
||
|
|
func (l *LinkTag) AddName(ls ...Localised) *LinkTag {
|
||
|
|
(*Link)(l).AddName(ls...)
|
||
|
|
return l
|
||
|
|
}
|