diff --git a/internal/microblog/microblog.gmi b/internal/microblog/microblog.gmi index 33b47e2..691f0d3 100644 --- a/internal/microblog/microblog.gmi +++ b/internal/microblog/microblog.gmi @@ -6,8 +6,9 @@ clearnet version: => https://travisshears.com/micro-blog -Here post from nostr, mastodon, and bluesky are rendered. +So for it renders posts from: +* nostr, id: nprofile1qyxhwumn8ghj7mn0wvhxcmmvqqs9udcv9uhqggjz87js9rtaph4lajlxnxsvwvm7zwdjt6etzyk52rgeg4wrz -My nostr id is: nprofile1qyxhwumn8ghj7mn0wvhxcmmvqqs9udcv9uhqggjz87js9rtaph4lajlxnxsvwvm7zwdjt6etzyk52rgeg4wrz I run my own relay wss://nostr.travisshears.com but you can also find me on the most popular relays. -=> https://bsky.app/profile/travisshears.bsky.social @travisshears on Bluesky -=> https://dice.camp/@travisshears @travisshears on Mastodon via dice.camp +I plan to add more platforms in the future: +* mastodon, id: dice.camp/@travisshears +* bluesky, id: @travisshears.bsky.social diff --git a/internal/microblog/microblog.go b/internal/microblog/microblog.go index b8e442e..b306515 100644 --- a/internal/microblog/microblog.go +++ b/internal/microblog/microblog.go @@ -61,34 +61,59 @@ func NewMicroBlog(pbClient *pocketbase.PocketBaseClient) *MicroBlog { return mb } -func escapeHashTags(content string) string { - // TODO: maybe prettier way to do this with a code - return strings.ReplaceAll(content, "#", "\\#") -} +// // Add some sample posts +// mb.addSamplePosts() -func removeHTMLTags(content string) string { - // Strip simple HTML tags. Paragraphs become newlines. - // Replace opening

tags with nothing, closing

with newline. - rePStart := regexp.MustCompile(`(?i)]*>`) - rePEnd := regexp.MustCompile(`(?i)

`) - content = rePStart.ReplaceAllString(content, "") - content = rePEnd.ReplaceAllString(content, "\n") +// return mb +// } - // Convert
to newline - reBr := regexp.MustCompile(`(?i)`) - content = reBr.ReplaceAllString(content, "\n") +// addSamplePosts adds some initial content +// func (mb *MicroBlog) addSamplePosts() { +// samplePosts := []Post{ +// { +// ID: "1", +// Title: "Welcome to the Gemini Microblog", +// Content: "This is the first post on our Gemini-powered microblog! It's simple, fast, and distraction-free.", +// Author: "Admin", +// Timestamp: time.Now().Add(-2 * time.Hour), +// }, +// { +// ID: "2", +// Title: "The Beauty of Simplicity", +// Content: "Gemini protocol encourages us to focus on content over presentation. This microblog embodies that philosophy.", +// Author: "Admin", +// Timestamp: time.Now().Add(-1 * time.Hour), +// }, +// } - // Remove any remaining tags - reTags := regexp.MustCompile(`(?i)<[^>]+>`) - content = reTags.ReplaceAllString(content, "") +// mb.posts = append(mb.posts, samplePosts...) +// } - // Normalize whitespace: trim and collapse excessive blank lines - content = strings.TrimSpace(content) - reMultiNewlines := regexp.MustCompile(`\n{3,}`) - return reMultiNewlines.ReplaceAllString(content, "\n\n") +// AddPost adds a new post to the blog +// func (mb *MicroBlog) AddPost(title, content, author string) string { +// id := fmt.Sprintf("%d", time.Now().Unix()) +// post := Post{ +// ID: id, +// Title: title, +// Content: content, +// Author: author, +// Timestamp: time.Now(), +// } -} +// mb.posts = append(mb.posts, post) +// return id +// } +// GetPost retrieves a post by ID +// +// func (mb *MicroBlog) GetPost(id string) (*Post, bool) { +// for _, post := range mb.posts { +// if post.ID == id { +// return &post, true +// } +// } +// return nil, false +// } func transformNostrPost(p pbPost) post { var nostrPost nostrPost if err := json.Unmarshal(p.FullPost, &nostrPost); err != nil { @@ -96,63 +121,8 @@ func transformNostrPost(p pbPost) post { return post{} } content := nostrPost.Content - content = escapeHashTags(content) - return post{ - ID: p.ID, - RemoteID: p.RemoteID, - Content: content, - Timestamp: time.Now(), - Source: source(p.Source), - } -} - -func transformBlueSkyPost(p pbPost) post { - var fullPost struct { - Record struct { - Text string `json:"text"` - } `json:"record"` - } - if err := json.Unmarshal(p.FullPost, &fullPost); err != nil { - slog.Error("Problem unmarshalling bluesky post", "error", err) - return post{} - } - content := fullPost.Record.Text - content = escapeHashTags(content) - return post{ - ID: p.ID, - RemoteID: p.RemoteID, - Content: content, - Timestamp: time.Now(), - Source: source(p.Source), - } -} - -func transformMastodonPost(p pbPost) post { - var fullPost struct { - Content string `json:"content"` - Reblog *struct { - Content string `json:"content"` - Account *struct { - Acct string `json:"acct"` - } `json:"account"` - } `json:"reblog"` - } - var content string - if err := json.Unmarshal(p.FullPost, &fullPost); err != nil { - slog.Error("Problem unmarshalling mastodon post", "error", err) - return post{} - } - if fullPost.Reblog != nil { - content = fmt.Sprintf( - "reblogged post from %s:\n%s\n", - fullPost.Reblog.Account.Acct, - fullPost.Reblog.Content, - ) - } else { - content = fullPost.Content - } - content = escapeHashTags(content) - content = removeHTMLTags(content) + content = strings.ReplaceAll(content, "#", "\\#") + // content = strings.ReplaceAll(content, "\t", "\\t") return post{ ID: p.ID, RemoteID: p.RemoteID, @@ -177,22 +147,26 @@ func (mb *MicroBlog) GetRecentPosts(limit int, page int) ([]post, error) { var filteredPosts []post for _, p := range rawPosts { - switch p.Source { - case SourceNostr: + if p.Source == SourceNostr { filteredPosts = append(filteredPosts, transformNostrPost(p)) - case SourceMastodon: - filteredPosts = append(filteredPosts, transformMastodonPost(p)) - case SourceBlueSky: - filteredPosts = append(filteredPosts, transformBlueSkyPost(p)) + + // var nostrPost nostrPost + // if err := json.Unmarshal(p.FullPost, &nostrPost); err != nil { + // slog.Error("Problem unmarshalling nostr post", "error", err) + // continue + // } + // filteredPosts = append(filteredPosts, post{ + // ID: p.ID, + // RemoteID: p.RemoteID, + // Content: nostrPost.Content, + // Timestamp: time.Now(), + // }) + continue } } return filteredPosts, nil } -func formatContent(content string) string { - return replaceLinks(content) -} - func replaceLinks(content string) string { // Regex: ^(https?://\S+) // ^ : start of line @@ -230,11 +204,16 @@ func (mb *MicroBlog) HandleBlogRequest(w gemini.ResponseWriter, req *gemini.Requ } func drawPost(builder *strings.Builder, p post) { - builder.WriteString(fmt.Sprintf("=> / 🖋️ %s post: %s \n", p.Source, p.ID)) - builder.WriteString(formatContent(p.Content)) - builder.WriteString(fmt.Sprintf("\nposted: %s\n", p.Timestamp.Format("2006-01-02 15:04"))) - builder.WriteString("\n\n") + builder.WriteString("+------------------------------------------+\n") + content := replaceLinks(p.Content) + builder.WriteString(content) + builder.WriteString("\n") + builder.WriteString(fmt.Sprintf("source: %s, id: %s...\n", p.Source, p.RemoteID[:10])) + builder.WriteString("+------------------------------------------+\n\n\n") + // builder.WriteString(fmt.Sprintf("=> /blog/post/%s %s\n", p.ID, p.Title)) + // builder.WriteString(fmt.Sprintf(" By %s on %s\n\n", + // p.Timestamp.Format("2006-01-02 15:04"))) } //go:embed microblog.gmi @@ -245,6 +224,9 @@ func (mb *MicroBlog) serveIndex(w gemini.ResponseWriter, req *gemini.Request, pa w.WriteStatusMsg(gemini.StatusSuccess, "text/gemini") var content strings.Builder + // content.WriteString("# Gemini Microblog\n\n") + // content.WriteString("Here are my microblog posts from various plantforms\n") + // Read and include the contents of ../../pages/microblog.gmi if pageNum == 1 { content.Write([]byte(pageContnet)) content.WriteString("\n") diff --git a/internal/pocketbase/pb.go b/internal/pocketbase/pb.go index 2967112..e7bfdf8 100644 --- a/internal/pocketbase/pb.go +++ b/internal/pocketbase/pb.go @@ -176,7 +176,7 @@ func (c *PocketBaseClient) GetList( "perPage": {strconv.Itoa(pageSize)}, "sort": {sort}, "skipTotal": {"true"}, - "filter": {"source = \"nostr\" || source = \"mastodon\" || source = \"blue_sky\""}, + "filter": {"source = \"nostr\""}, // TODO: add additional fields like image and tag? } apiURL := fmt.Sprintf("%s/api/collections/%s/records", c.host, collection) diff --git a/tasks.txt b/tasks.txt index a392848..f23eabc 100644 --- a/tasks.txt +++ b/tasks.txt @@ -1,11 +1,8 @@ +task: rework the micro-blog to be more like station +task: add mastodon and bluysky to microblog -----------DONE LINE----------- -DONE task: rework the micro-blog to be more like station -DONE task: add mastodon and bluysky to microblog DONE task: implement dir codeview pages DONE task: implement codbase root codeview pages DONE task: add hexidecimal numbering to gemlog DONE task: add request counter DONE task: embed static pages - - -project tracking method inspired by: https://cblgh.org/posts/2025-10-10-the-done-line/