pico

created pr with 15.1 on 2024-08-01T14:25:45Z · by c8ef7d19
added 15.2 on 2024-08-01T15:29:59Z · by c8ef7d19
1: 866976a = 1: 866976a feat(prose): live journal
-: ------- > 2: b82b2f7 chore: diff in post
cmds
checkout latest patchset:
ssh pr.pico.sh print 15 | git am -3
checkout any patchset in a patch request:
ssh pr.pico.sh print 15.[rev] | git am -3
add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 15
+1 -0 filehandlers/post_handler.go #
......@@ -139,6 +139,7 @@ func (h *ScpUploadHandler) Write(s ssh.Session, entry *utils.FileEntry) (string,
139139
140140 if post != nil {
141141 metadata.Cur = post
142+ metadata.Data = post.Data
142143 metadata.Post.PublishAt = post.PublishAt
143144 }
144145
+11 -0 prose/api.go #
......@@ -83,6 +83,7 @@ type PostPageData struct {
8383 Footer template.HTML
8484 Favicon template.URL
8585 Unlisted bool
86+ Diff template.HTML
8687 }
8788
8889 type TransparencyPageData struct {
......@@ -399,6 +400,7 @@ func postHandler(w http.ResponseWriter, r *http.Request) {
399400 favicon = readmeParsed.Favicon
400401 }
401402
403+ diff := ""
402404 post, err := dbpool.FindPostWithSlug(slug, user.ID, cfg.Space)
403405 if err == nil {
404406 parsedText, err := shared.ParseText(post.Text)
......@@ -414,6 +416,14 @@ func postHandler(w http.ResponseWriter, r *http.Request) {
414416 ogImageCard = parsedText.ImageCard
415417 }
416418
419+ // if parsedText.Live {
420+ if post.Data.Diff != "" {
421+ str := "```diff\n" + post.Data.Diff + "\n```"
422+ diffParsed, _ := shared.ParseText(str)
423+ diff = diffParsed.Html
424+ }
425+ // }
426+
417427 // track visit
418428 view, err := shared.AnalyticsVisitFromRequest(r, user.ID, cfg.Secret)
419429 if err == nil {
......@@ -451,6 +461,7 @@ func postHandler(w http.ResponseWriter, r *http.Request) {
451461 Favicon: template.URL(favicon),
452462 Footer: footerHTML,
453463 Unlisted: unlisted,
464+ Diff: template.HTML(diff),
454465 }
455466 } else {
456467 // TODO: HACK to support imgs slugs inside prose
+8 -1 prose/html/post.page.tmpl #
......@@ -62,9 +62,16 @@
6262 </div>
6363 </header>
6464 <main>
65+ {{if .Diff}}
66+ <details>
67+ <summary>diff</summary>
68+ <div class="md">{{.Diff}}</div>
69+ </details>
70+ {{end}}
71+
6572 <article class="md">
6673 {{.Contents}}
67- <div id="post-footer">{{.Footer}}</div>
74+ <div id="post-footer" class="box">{{.Footer}}</div>
6875 </article>
6976 </main>
7077 {{template "footer" .}}
+28 -3 prose/scp_hooks.go #
......@@ -1,6 +1,7 @@
11 package prose
22
33 import (
4+ "bytes"
45 "fmt"
56 "strings"
67
......@@ -47,6 +48,26 @@ func (p *MarkdownHooks) FileValidate(s ssh.Session, data *filehandlers.PostMetaD
4748 return true, nil
4849 }
4950
51+func diffText(diffs []diffmatchpatch.Diff) string {
52+ var buff bytes.Buffer
53+ for _, diff := range diffs {
54+ text := diff.Text
55+
56+ switch diff.Type {
57+ case diffmatchpatch.DiffInsert:
58+ _, _ = buff.WriteString("+")
59+ _, _ = buff.WriteString(text)
60+ case diffmatchpatch.DiffDelete:
61+ _, _ = buff.WriteString("-")
62+ _, _ = buff.WriteString(text)
63+ case diffmatchpatch.DiffEqual:
64+ _, _ = buff.WriteString(text)
65+ }
66+ }
67+
68+ return buff.String()
69+}
70+
5071 func (p *MarkdownHooks) FileMeta(s ssh.Session, data *filehandlers.PostMetaData) error {
5172 parsedText, err := shared.ParseText(data.Text)
5273 if err != nil {
......@@ -63,9 +84,13 @@ func (p *MarkdownHooks) FileMeta(s ssh.Session, data *filehandlers.PostMetaData)
6384 data.Tags = parsedText.Tags
6485 data.Description = parsedText.Description
6586
66- dmp := diffmatchpatch.New()
67- diffs := dmp.DiffMain(data.Cur.Text, data.Text, false)
68- data.Data.Diff = dmp.DiffPrettyText(diffs)
87+ if data.Cur.Text == data.Text {
88+ } else {
89+ dmp := diffmatchpatch.New()
90+ diffs := dmp.DiffMain(data.Cur.Text, data.Text, false)
91+ fmt.Println(diffs)
92+ data.Data.Diff = diffText(diffs)
93+ }
6994
7095 if parsedText.PublishAt != nil && !parsedText.PublishAt.IsZero() {
7196 data.PublishAt = parsedText.MetaData.PublishAt
+7 -0 shared/mdparser.go #
......@@ -40,6 +40,7 @@ type MetaData struct {
4040 ImageCard string
4141 Favicon string
4242 Hidden bool
43+ Live bool
4344 }
4445
4546 type ParsedText struct {
......@@ -303,6 +304,12 @@ func ParseText(text string) (*ParsedText, error) {
303304 }
304305 parsed.MetaData.Favicon = favicon
305306
307+ live, err := toBool(metaData["live"])
308+ if err != nil {
309+ return &parsed, fmt.Errorf("front-matter field (%s): %w", "live", err)
310+ }
311+ parsed.MetaData.Live = live
312+
306313 var publishAt *time.Time = nil
307314 date, err := toString(metaData["date"])
308315 if err != nil {
Back to top