GoAT Site is library that implements Standard.site in Go.
atprotocol standard-site atproto library
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(lexicon): structs to represents them

+697
+18
.gitignore
··· 1 + # Binaries for programs and plugins 2 + *.exe 3 + *.exe~ 4 + *.dll 5 + *.so 6 + *.dylib 7 + 8 + # Test binary, built with `go test -c` 9 + *.test 10 + 11 + # Output of the go coverage tool, specifically when used with LiteIDE 12 + *.out 13 + 14 + # Dependency directories (remove the comment below to include it) 15 + # vendor/ 16 + 17 + # Go workspace file 18 + go.work
+373
LICENSE
··· 1 + Mozilla Public License Version 2.0 2 + ================================== 3 + 4 + 1. Definitions 5 + -------------- 6 + 7 + 1.1. "Contributor" 8 + means each individual or legal entity that creates, contributes to 9 + the creation of, or owns Covered Software. 10 + 11 + 1.2. "Contributor Version" 12 + means the combination of the Contributions of others (if any) used 13 + by a Contributor and that particular Contributor's Contribution. 14 + 15 + 1.3. "Contribution" 16 + means Covered Software of a particular Contributor. 17 + 18 + 1.4. "Covered Software" 19 + means Source Code Form to which the initial Contributor has attached 20 + the notice in Exhibit A, the Executable Form of such Source Code 21 + Form, and Modifications of such Source Code Form, in each case 22 + including portions thereof. 23 + 24 + 1.5. "Incompatible With Secondary Licenses" 25 + means 26 + 27 + (a) that the initial Contributor has attached the notice described 28 + in Exhibit B to the Covered Software; or 29 + 30 + (b) that the Covered Software was made available under the terms of 31 + version 1.1 or earlier of the License, but not also under the 32 + terms of a Secondary License. 33 + 34 + 1.6. "Executable Form" 35 + means any form of the work other than Source Code Form. 36 + 37 + 1.7. "Larger Work" 38 + means a work that combines Covered Software with other material, in 39 + a separate file or files, that is not Covered Software. 40 + 41 + 1.8. "License" 42 + means this document. 43 + 44 + 1.9. "Licensable" 45 + means having the right to grant, to the maximum extent possible, 46 + whether at the time of the initial grant or subsequently, any and 47 + all of the rights conveyed by this License. 48 + 49 + 1.10. "Modifications" 50 + means any of the following: 51 + 52 + (a) any file in Source Code Form that results from an addition to, 53 + deletion from, or modification of the contents of Covered 54 + Software; or 55 + 56 + (b) any new file in Source Code Form that contains any Covered 57 + Software. 58 + 59 + 1.11. "Patent Claims" of a Contributor 60 + means any patent claim(s), including without limitation, method, 61 + process, and apparatus claims, in any patent Licensable by such 62 + Contributor that would be infringed, but for the grant of the 63 + License, by the making, using, selling, offering for sale, having 64 + made, import, or transfer of either its Contributions or its 65 + Contributor Version. 66 + 67 + 1.12. "Secondary License" 68 + means either the GNU General Public License, Version 2.0, the GNU 69 + Lesser General Public License, Version 2.1, the GNU Affero General 70 + Public License, Version 3.0, or any later versions of those 71 + licenses. 72 + 73 + 1.13. "Source Code Form" 74 + means the form of the work preferred for making modifications. 75 + 76 + 1.14. "You" (or "Your") 77 + means an individual or a legal entity exercising rights under this 78 + License. For legal entities, "You" includes any entity that 79 + controls, is controlled by, or is under common control with You. For 80 + purposes of this definition, "control" means (a) the power, direct 81 + or indirect, to cause the direction or management of such entity, 82 + whether by contract or otherwise, or (b) ownership of more than 83 + fifty percent (50%) of the outstanding shares or beneficial 84 + ownership of such entity. 85 + 86 + 2. License Grants and Conditions 87 + -------------------------------- 88 + 89 + 2.1. Grants 90 + 91 + Each Contributor hereby grants You a world-wide, royalty-free, 92 + non-exclusive license: 93 + 94 + (a) under intellectual property rights (other than patent or trademark) 95 + Licensable by such Contributor to use, reproduce, make available, 96 + modify, display, perform, distribute, and otherwise exploit its 97 + Contributions, either on an unmodified basis, with Modifications, or 98 + as part of a Larger Work; and 99 + 100 + (b) under Patent Claims of such Contributor to make, use, sell, offer 101 + for sale, have made, import, and otherwise transfer either its 102 + Contributions or its Contributor Version. 103 + 104 + 2.2. Effective Date 105 + 106 + The licenses granted in Section 2.1 with respect to any Contribution 107 + become effective for each Contribution on the date the Contributor first 108 + distributes such Contribution. 109 + 110 + 2.3. Limitations on Grant Scope 111 + 112 + The licenses granted in this Section 2 are the only rights granted under 113 + this License. No additional rights or licenses will be implied from the 114 + distribution or licensing of Covered Software under this License. 115 + Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 + Contributor: 117 + 118 + (a) for any code that a Contributor has removed from Covered Software; 119 + or 120 + 121 + (b) for infringements caused by: (i) Your and any other third party's 122 + modifications of Covered Software, or (ii) the combination of its 123 + Contributions with other software (except as part of its Contributor 124 + Version); or 125 + 126 + (c) under Patent Claims infringed by Covered Software in the absence of 127 + its Contributions. 128 + 129 + This License does not grant any rights in the trademarks, service marks, 130 + or logos of any Contributor (except as may be necessary to comply with 131 + the notice requirements in Section 3.4). 132 + 133 + 2.4. Subsequent Licenses 134 + 135 + No Contributor makes additional grants as a result of Your choice to 136 + distribute the Covered Software under a subsequent version of this 137 + License (see Section 10.2) or under the terms of a Secondary License (if 138 + permitted under the terms of Section 3.3). 139 + 140 + 2.5. Representation 141 + 142 + Each Contributor represents that the Contributor believes its 143 + Contributions are its original creation(s) or it has sufficient rights 144 + to grant the rights to its Contributions conveyed by this License. 145 + 146 + 2.6. Fair Use 147 + 148 + This License is not intended to limit any rights You have under 149 + applicable copyright doctrines of fair use, fair dealing, or other 150 + equivalents. 151 + 152 + 2.7. Conditions 153 + 154 + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 + in Section 2.1. 156 + 157 + 3. Responsibilities 158 + ------------------- 159 + 160 + 3.1. Distribution of Source Form 161 + 162 + All distribution of Covered Software in Source Code Form, including any 163 + Modifications that You create or to which You contribute, must be under 164 + the terms of this License. You must inform recipients that the Source 165 + Code Form of the Covered Software is governed by the terms of this 166 + License, and how they can obtain a copy of this License. You may not 167 + attempt to alter or restrict the recipients' rights in the Source Code 168 + Form. 169 + 170 + 3.2. Distribution of Executable Form 171 + 172 + If You distribute Covered Software in Executable Form then: 173 + 174 + (a) such Covered Software must also be made available in Source Code 175 + Form, as described in Section 3.1, and You must inform recipients of 176 + the Executable Form how they can obtain a copy of such Source Code 177 + Form by reasonable means in a timely manner, at a charge no more 178 + than the cost of distribution to the recipient; and 179 + 180 + (b) You may distribute such Executable Form under the terms of this 181 + License, or sublicense it under different terms, provided that the 182 + license for the Executable Form does not attempt to limit or alter 183 + the recipients' rights in the Source Code Form under this License. 184 + 185 + 3.3. Distribution of a Larger Work 186 + 187 + You may create and distribute a Larger Work under terms of Your choice, 188 + provided that You also comply with the requirements of this License for 189 + the Covered Software. If the Larger Work is a combination of Covered 190 + Software with a work governed by one or more Secondary Licenses, and the 191 + Covered Software is not Incompatible With Secondary Licenses, this 192 + License permits You to additionally distribute such Covered Software 193 + under the terms of such Secondary License(s), so that the recipient of 194 + the Larger Work may, at their option, further distribute the Covered 195 + Software under the terms of either this License or such Secondary 196 + License(s). 197 + 198 + 3.4. Notices 199 + 200 + You may not remove or alter the substance of any license notices 201 + (including copyright notices, patent notices, disclaimers of warranty, 202 + or limitations of liability) contained within the Source Code Form of 203 + the Covered Software, except that You may alter any license notices to 204 + the extent required to remedy known factual inaccuracies. 205 + 206 + 3.5. Application of Additional Terms 207 + 208 + You may choose to offer, and to charge a fee for, warranty, support, 209 + indemnity or liability obligations to one or more recipients of Covered 210 + Software. However, You may do so only on Your own behalf, and not on 211 + behalf of any Contributor. You must make it absolutely clear that any 212 + such warranty, support, indemnity, or liability obligation is offered by 213 + You alone, and You hereby agree to indemnify every Contributor for any 214 + liability incurred by such Contributor as a result of warranty, support, 215 + indemnity or liability terms You offer. You may include additional 216 + disclaimers of warranty and limitations of liability specific to any 217 + jurisdiction. 218 + 219 + 4. Inability to Comply Due to Statute or Regulation 220 + --------------------------------------------------- 221 + 222 + If it is impossible for You to comply with any of the terms of this 223 + License with respect to some or all of the Covered Software due to 224 + statute, judicial order, or regulation then You must: (a) comply with 225 + the terms of this License to the maximum extent possible; and (b) 226 + describe the limitations and the code they affect. Such description must 227 + be placed in a text file included with all distributions of the Covered 228 + Software under this License. Except to the extent prohibited by statute 229 + or regulation, such description must be sufficiently detailed for a 230 + recipient of ordinary skill to be able to understand it. 231 + 232 + 5. Termination 233 + -------------- 234 + 235 + 5.1. The rights granted under this License will terminate automatically 236 + if You fail to comply with any of its terms. However, if You become 237 + compliant, then the rights granted under this License from a particular 238 + Contributor are reinstated (a) provisionally, unless and until such 239 + Contributor explicitly and finally terminates Your grants, and (b) on an 240 + ongoing basis, if such Contributor fails to notify You of the 241 + non-compliance by some reasonable means prior to 60 days after You have 242 + come back into compliance. Moreover, Your grants from a particular 243 + Contributor are reinstated on an ongoing basis if such Contributor 244 + notifies You of the non-compliance by some reasonable means, this is the 245 + first time You have received notice of non-compliance with this License 246 + from such Contributor, and You become compliant prior to 30 days after 247 + Your receipt of the notice. 248 + 249 + 5.2. If You initiate litigation against any entity by asserting a patent 250 + infringement claim (excluding declaratory judgment actions, 251 + counter-claims, and cross-claims) alleging that a Contributor Version 252 + directly or indirectly infringes any patent, then the rights granted to 253 + You by any and all Contributors for the Covered Software under Section 254 + 2.1 of this License shall terminate. 255 + 256 + 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 + end user license agreements (excluding distributors and resellers) which 258 + have been validly granted by You or Your distributors under this License 259 + prior to termination shall survive termination. 260 + 261 + ************************************************************************ 262 + * * 263 + * 6. Disclaimer of Warranty * 264 + * ------------------------- * 265 + * * 266 + * Covered Software is provided under this License on an "as is" * 267 + * basis, without warranty of any kind, either expressed, implied, or * 268 + * statutory, including, without limitation, warranties that the * 269 + * Covered Software is free of defects, merchantable, fit for a * 270 + * particular purpose or non-infringing. The entire risk as to the * 271 + * quality and performance of the Covered Software is with You. * 272 + * Should any Covered Software prove defective in any respect, You * 273 + * (not any Contributor) assume the cost of any necessary servicing, * 274 + * repair, or correction. This disclaimer of warranty constitutes an * 275 + * essential part of this License. No use of any Covered Software is * 276 + * authorized under this License except under this disclaimer. * 277 + * * 278 + ************************************************************************ 279 + 280 + ************************************************************************ 281 + * * 282 + * 7. Limitation of Liability * 283 + * -------------------------- * 284 + * * 285 + * Under no circumstances and under no legal theory, whether tort * 286 + * (including negligence), contract, or otherwise, shall any * 287 + * Contributor, or anyone who distributes Covered Software as * 288 + * permitted above, be liable to You for any direct, indirect, * 289 + * special, incidental, or consequential damages of any character * 290 + * including, without limitation, damages for lost profits, loss of * 291 + * goodwill, work stoppage, computer failure or malfunction, or any * 292 + * and all other commercial damages or losses, even if such party * 293 + * shall have been informed of the possibility of such damages. This * 294 + * limitation of liability shall not apply to liability for death or * 295 + * personal injury resulting from such party's negligence to the * 296 + * extent applicable law prohibits such limitation. Some * 297 + * jurisdictions do not allow the exclusion or limitation of * 298 + * incidental or consequential damages, so this exclusion and * 299 + * limitation may not apply to You. * 300 + * * 301 + ************************************************************************ 302 + 303 + 8. Litigation 304 + ------------- 305 + 306 + Any litigation relating to this License may be brought only in the 307 + courts of a jurisdiction where the defendant maintains its principal 308 + place of business and such litigation shall be governed by laws of that 309 + jurisdiction, without reference to its conflict-of-law provisions. 310 + Nothing in this Section shall prevent a party's ability to bring 311 + cross-claims or counter-claims. 312 + 313 + 9. Miscellaneous 314 + ---------------- 315 + 316 + This License represents the complete agreement concerning the subject 317 + matter hereof. If any provision of this License is held to be 318 + unenforceable, such provision shall be reformed only to the extent 319 + necessary to make it enforceable. Any law or regulation which provides 320 + that the language of a contract shall be construed against the drafter 321 + shall not be used to construe this License against a Contributor. 322 + 323 + 10. Versions of the License 324 + --------------------------- 325 + 326 + 10.1. New Versions 327 + 328 + Mozilla Foundation is the license steward. Except as provided in Section 329 + 10.3, no one other than the license steward has the right to modify or 330 + publish new versions of this License. Each version will be given a 331 + distinguishing version number. 332 + 333 + 10.2. Effect of New Versions 334 + 335 + You may distribute the Covered Software under the terms of the version 336 + of the License under which You originally received the Covered Software, 337 + or under the terms of any subsequent version published by the license 338 + steward. 339 + 340 + 10.3. Modified Versions 341 + 342 + If you create software not governed by this License, and you want to 343 + create a new license for such software, you may create and use a 344 + modified version of this License if you rename the license and remove 345 + any references to the name of the license steward (except to note that 346 + such modified license differs from this License). 347 + 348 + 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 + Licenses 350 + 351 + If You choose to distribute Source Code Form that is Incompatible With 352 + Secondary Licenses under the terms of this version of the License, the 353 + notice described in Exhibit B of this License must be attached. 354 + 355 + Exhibit A - Source Code Form License Notice 356 + ------------------------------------------- 357 + 358 + This Source Code Form is subject to the terms of the Mozilla Public 359 + License, v. 2.0. If a copy of the MPL was not distributed with this 360 + file, You can obtain one at https://mozilla.org/MPL/2.0/. 361 + 362 + If it is not possible or desirable to put the notice in a particular 363 + file, then You may include the notice in a location (such as a LICENSE 364 + file in a relevant directory) where a recipient would be likely to look 365 + for such a notice. 366 + 367 + You may add additional accurate notices of copyright ownership. 368 + 369 + Exhibit B - "Incompatible With Secondary Licenses" Notice 370 + --------------------------------------------------------- 371 + 372 + This Source Code Form is "Incompatible With Secondary Licenses", as 373 + defined by the Mozilla Public License, v. 2.0.
+14
README.md
··· 1 + # GoAT Site 2 + 3 + GoAT Site implements [standard.site](https://standard.site/) in Go. 4 + 5 + Use official [`bluesky-social/indigo`](https://github.com/bluesky-social/indigo/). 6 + 7 + ## Usage 8 + 9 + Get the module with: 10 + ```bash 11 + go get -u tangled.org/anhgelus.world/goat-site 12 + ``` 13 + 14 +
+49
document.go
··· 1 + package site 2 + 3 + import "time" 4 + 5 + const LexiconDocument = LexiconBase + ".document" 6 + 7 + // Document may be standalone or associated with a [Publication]. 8 + // This lexicon can be used to store a document's content and its associated metadata. 9 + type Document struct { 10 + // Site points to a [Publication] record `at://` or a [Publication.URL] `https://` for loose documents. 11 + // Avoid trailing slashes. 12 + Site string `json:"site"` 13 + // Title of the [Document]. 14 + // Max length: 5000. 15 + // Max graphemes: 500. 16 + Title string `json:"title"` 17 + // PublishedAt is the [time.Time] of the [Document]'s publish time. 18 + PublishedAt time.Time `json:"-"` 19 + // Path is combined with [Document.Site] or [Publication.URL] to construct a canonical URL to the document. 20 + // A slash should be included at the beginning of this value. 21 + Path *string `json:"path,omitempty"` 22 + // A brief Description or excerpt from the [Document]. 23 + // Max length: 30000. 24 + // Max graphemes: 3000. 25 + Description *string `json:"description,omitempty"` 26 + // CoverImage to used for thumbnail or cover. 27 + // Less than 1MB is size. 28 + CoverImage any `json:"-"` 29 + // Content is an open union used to define the [Document]'s content. 30 + // Each entry must specify a `$type`. 31 + Content []any `json:"-"` 32 + // TextContent is a plaintext representation of the [Document.Content]. 33 + // Should not contain markdown or other formatting. 34 + TextContent string `json:"textContent,omitempty"` 35 + // BlueskyPostRef is a strong reference to a Bluesky post. 36 + // Useful to keep track of comments off-platform. 37 + BlueskyPostRef any `json:"bskyPostRef,omitempty"` 38 + // Tags is an array of strings used to tag or categorize the [Document]. 39 + // Avoid prepending tags with hashtags. 40 + // Max length: 1280. 41 + // Max graphemes: 128. 42 + Tags []string `json:"tags,omitempty"` 43 + // UpdatedAt is the [time.Time] of the [Document]'s last edit. 44 + UpdatedAt *time.Time `json:"-"` 45 + } 46 + 47 + func (d *Document) Type() string { 48 + return LexiconDocument 49 + }
+22
go.mod
··· 1 + module tangled.org/anhgelus.world/goat-site 2 + 3 + go 1.25.0 4 + 5 + require ( 6 + github.com/bluesky-social/indigo v0.0.0-20260318212431-cbaa83aee9dd // indirect 7 + github.com/ipfs/go-cid v0.4.1 // indirect 8 + github.com/klauspost/cpuid/v2 v2.2.7 // indirect 9 + github.com/minio/sha256-simd v1.0.1 // indirect 10 + github.com/mr-tron/base58 v1.2.0 // indirect 11 + github.com/multiformats/go-base32 v0.1.0 // indirect 12 + github.com/multiformats/go-base36 v0.2.0 // indirect 13 + github.com/multiformats/go-multibase v0.2.0 // indirect 14 + github.com/multiformats/go-multihash v0.2.3 // indirect 15 + github.com/multiformats/go-varint v0.0.7 // indirect 16 + github.com/spaolacci/murmur3 v1.1.0 // indirect 17 + github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e // indirect 18 + golang.org/x/crypto v0.21.0 // indirect 19 + golang.org/x/sys v0.22.0 // indirect 20 + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect 21 + lukechampine.com/blake3 v1.2.1 // indirect 22 + )
+33
go.sum
··· 1 + github.com/bluesky-social/indigo v0.0.0-20260318212431-cbaa83aee9dd h1:FZSMlxClfm7jCA6A/vwTNw5EPxSngPPpK09MxuEx9l0= 2 + github.com/bluesky-social/indigo v0.0.0-20260318212431-cbaa83aee9dd/go.mod h1:VG/LeqLGNI3Ew7lsYixajnZGFfWPv144qbUddh+Oyag= 3 + github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= 4 + github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= 5 + github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= 6 + github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 7 + github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= 8 + github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= 9 + github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= 10 + github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 11 + github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= 12 + github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= 13 + github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= 14 + github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= 15 + github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= 16 + github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= 17 + github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= 18 + github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= 19 + github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= 20 + github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= 21 + github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= 22 + github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 23 + github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e h1:28X54ciEwwUxyHn9yrZfl5ojgF4CBNLWX7LR0rvBkf4= 24 + github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= 25 + golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= 26 + golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= 27 + golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 28 + golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= 29 + golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 30 + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= 31 + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= 32 + lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= 33 + lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
+68
lexicons.go
··· 1 + package site 2 + 3 + import ( 4 + "encoding/json" 5 + "errors" 6 + ) 7 + 8 + type Lexicon interface { 9 + Type() string 10 + } 11 + 12 + const LexiconBase = "site.standard" 13 + 14 + // LexiconJSON is used to convert [Lexicon] into JSON. 15 + type LexiconJSON struct { 16 + Lexicon 17 + } 18 + 19 + func (l LexiconJSON) MarshalJSON() ([]byte, error) { 20 + v := struct { 21 + any 22 + Type string `json:"$type"` 23 + }{nil, l.Type()} 24 + switch l.Type() { 25 + case LexiconPublication: 26 + v.any = l.Lexicon.(*Publication) 27 + case LexiconDocument: 28 + v.any = l.Lexicon.(*Document) 29 + case LexiconSubscription: 30 + v.any = l.Lexicon.(*Subscription) 31 + case LexiconTheme: 32 + v.any = l.Lexicon.(*Theme) 33 + case LexiconThemeColorRGB: 34 + v.any = l.Lexicon.(*RGB) 35 + case LexiconThemeColorRGBA: 36 + v.any = l.Lexicon.(*RGBA) 37 + default: 38 + return nil, errors.New("unsupported lexicon type") 39 + } 40 + return json.Marshal(v) 41 + } 42 + 43 + func (l LexiconJSON) UnmarshalJSON(b []byte) error { 44 + var v struct { 45 + Type string `json:"$type"` 46 + } 47 + err := json.Unmarshal(b, &v) 48 + if err != nil { 49 + return err 50 + } 51 + switch v.Type { 52 + case LexiconPublication: 53 + l.Lexicon = l.Lexicon.(*Publication) 54 + case LexiconDocument: 55 + l.Lexicon = l.Lexicon.(*Document) 56 + case LexiconSubscription: 57 + l.Lexicon = l.Lexicon.(*Subscription) 58 + case LexiconTheme: 59 + l.Lexicon = l.Lexicon.(*Theme) 60 + case LexiconThemeColorRGB: 61 + l.Lexicon = l.Lexicon.(*RGB) 62 + case LexiconThemeColorRGBA: 63 + l.Lexicon = l.Lexicon.(*RGBA) 64 + default: 65 + return errors.New("unsupported lexicon type") 66 + } 67 + return json.Unmarshal(b, l.Lexicon) 68 + }
+41
publication.go
··· 1 + package site 2 + 3 + const LexiconPublication = LexiconBase + ".publication" 4 + 5 + // Publication represents a collection of documents published to the web. 6 + // It includes important information about a publication including its location on the web, theming information, user 7 + // preferences, and more. 8 + // 9 + // The publication lexicon is not a requirement, but is recommended when publishing collections of related documents. 10 + type Publication struct { 11 + // Base URL of the [Publication]. 12 + // This value will be combined with the [Document.Path] to construct a full URL for the document. 13 + // Avoid trailing slashes. 14 + URL string `json:"string"` 15 + // Name of the [Publication]. 16 + // Max length: 5000. 17 + // Max graphemes: 500. 18 + Name string `json:"name"` 19 + // Icon to identify the [Publication]. 20 + // Must be a square image and should be at least 256x256. 21 + Icon any `json:"-"` 22 + // Description of the [Publication]. 23 + // Max length: 30000. 24 + // Max graphemes: 3000. 25 + Description *string `json:"description,omitempty"` 26 + // Simplified theme for tools and apps to utilize when displaying content. 27 + // Ref to `site.standard.theme.basic`. 28 + BasicTheme any `json:"basicTheme,omitempty"` 29 + // Platform-specific [Preferences] for the [Publication], including discovery and visibility settings. 30 + Preferences *Preferences `json:"preferences,omitempty"` 31 + } 32 + 33 + // Preferences of the [Publication]. 34 + type Preferences struct { 35 + // ShowInDiscover decides whether the [Publication] should appear in discovery feeds. 36 + ShowInDiscover bool `json:"showInDiscover"` 37 + } 38 + 39 + func (p *Publication) Type() string { 40 + return LexiconPublication 41 + }
+15
subscription.go
··· 1 + package site 2 + 3 + const LexiconSubscription = LexiconBase + ".graph.subscription" 4 + 5 + // Subscription enable users to follow publications and receive updates about new content. 6 + // They represent the social connection between readers and the publications they're interested in. 7 + type Subscription struct { 8 + // Publication is an AT-URI reference to the publication record being subscribed to. 9 + // E.g., `at://did:plc:abc123/site.standard.publication/xyz789`. 10 + Publication string `json:"publication"` 11 + } 12 + 13 + func (s *Subscription) Type() string { 14 + return LexiconSubscription 15 + }
+64
theme.go
··· 1 + package site 2 + 3 + import ( 4 + "image/color" 5 + "math" 6 + ) 7 + 8 + const ( 9 + LexiconTheme = LexiconBase + ".theme" 10 + LexiconThemeColor = LexiconTheme + ".color" 11 + LexiconThemeColorRGB = LexiconThemeColor + "#rgb" 12 + LexiconThemeColorRGBA = LexiconThemeColor + "#rgba" 13 + ) 14 + 15 + // Theme ensures [Publication]s maintain their visual identity across different reading applications and platforms by 16 + // defining core colors for content display. 17 + type Theme struct { 18 + // Background is the color used for content background. 19 + Background any `json:"background"` 20 + // Foreground is the color used for content text. 21 + Foreground any `json:"foreground"` 22 + // Accent is the color used for links and button backgrounds. 23 + Accent any `json:"accent"` 24 + // AccentForeground is the color used for button text. 25 + AccentForeground any `json:"accentForeground"` 26 + } 27 + 28 + func (t *Theme) Type() string { 29 + return LexiconTheme 30 + } 31 + 32 + // RGB represents a RGB color. 33 + type RGB struct { 34 + Red uint8 `json:"r"` 35 + Green uint8 `json:"g"` 36 + Blue uint8 `json:"b"` 37 + } 38 + 39 + func (r *RGB) Type() string { 40 + return LexiconThemeColorRGB 41 + } 42 + 43 + func (r *RGB) RGBA() *RGBA { 44 + return &RGBA{*r, 100} 45 + } 46 + 47 + // RGBA represents a [color.RGBA]. 48 + type RGBA struct { 49 + RGB 50 + // Alpha is the alpha channel where 0 is transparent and 100 is opaque. 51 + Alpha uint8 `json:"a"` 52 + } 53 + 54 + func (r *RGBA) Type() string { 55 + return LexiconThemeColorRGBA 56 + } 57 + 58 + func NewRGBA(r *color.RGBA) *RGBA { 59 + red, g, b, a := r.RGBA() 60 + return &RGBA{ 61 + RGB: RGB{uint8(red), uint8(g), uint8(b)}, 62 + Alpha: uint8(math.Floor(float64(a)/float64(255)) * 100), 63 + } 64 + }