Experimental browser for the Atmosphere
{ "uri": "at://did:plc:hwevmowznbiukdf6uk5dwrrq/sh.tangled.repo.pull/3lma4ozxp4p22", "cid": "bafyreiclp62cmkiv2dpuuzmjc5j2wposkf5k6hpemqqfgjx4rwvh2ygjma", "value": { "$type": "sh.tangled.repo.pull", "patch": "diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go\nindex 775006a091fcbf05625860ccf149078e67b7c305..8d88604699bf29588e4d0013f82ff54d44e89999 100644\n--- a/appview/pages/funcmap.go\n+++ b/appview/pages/funcmap.go\n@@ -13,6 +13,7 @@ \t\"strings\"\n \t\"time\"\n \n \t\"github.com/dustin/go-humanize\"\n+\t\"tangled.sh/tangled.sh/core/appview/pages/markup\"\n )\n \n func funcMap() template.FuncMap {\n@@ -137,7 +138,7 @@ \t\t\t}\n \t\t\treturn v.Slice(start, end).Interface()\n \t\t},\n \t\t\"markdown\": func(text string) template.HTML {\n-\t\t\treturn template.HTML(renderMarkdown(text))\n+\t\t\treturn template.HTML(markup.RenderMarkdown(text))\n \t\t},\n \t\t\"isNil\": func(t any) bool {\n \t\t\t// returns false for other \"zero\" values\ndiff --git a/appview/pages/markdown.go b/appview/pages/markdown.go\ndeleted file mode 100644\nindex d27d9060336385dbbdb7fca4ac8a5d056f717252..0000000000000000000000000000000000000000\n--- a/appview/pages/markdown.go\n+++ /dev/null\n@@ -1,23 +0,0 @@\n-package pages\n-\n-import (\n-\t\"bytes\"\n-\n-\t\"github.com/yuin/goldmark\"\n-\t\"github.com/yuin/goldmark/extension\"\n-\t\"github.com/yuin/goldmark/parser\"\n-)\n-\n-func renderMarkdown(source string) string {\n-\tmd := goldmark.New(\n-\t\tgoldmark.WithExtensions(extension.GFM),\n-\t\tgoldmark.WithParserOptions(\n-\t\t\tparser.WithAutoHeadingID(),\n-\t\t),\n-\t)\n-\tvar buf bytes.Buffer\n-\tif err := md.Convert([]byte(source), &buf); err != nil {\n-\t\treturn source\n-\t}\n-\treturn buf.String()\n-}\ndiff --git a/appview/pages/markup/markdown.go b/appview/pages/markup/markdown.go\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..a219f3d7d4c010027365d506906222e5dabd43bf\n--- /dev/null\n+++ b/appview/pages/markup/markdown.go\n@@ -0,0 +1,24 @@\n+// Package markup is an umbrella package for all markups and their renderers.\n+package markup\n+\n+import (\n+\t\"bytes\"\n+\n+\t\"github.com/yuin/goldmark\"\n+\t\"github.com/yuin/goldmark/extension\"\n+\t\"github.com/yuin/goldmark/parser\"\n+)\n+\n+func RenderMarkdown(source string) string {\n+\tmd := goldmark.New(\n+\t\tgoldmark.WithExtensions(extension.GFM),\n+\t\tgoldmark.WithParserOptions(\n+\t\t\tparser.WithAutoHeadingID(),\n+\t\t),\n+\t)\n+\tvar buf bytes.Buffer\n+\tif err := md.Convert([]byte(source), &buf); err != nil {\n+\t\treturn source\n+\t}\n+\treturn buf.String()\n+}\ndiff --git a/appview/pages/markup/readme.go b/appview/pages/markup/readme.go\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..5b104c7d2d89f3a8dd23f3d8a208cf133c6a0909\n--- /dev/null\n+++ b/appview/pages/markup/readme.go\n@@ -0,0 +1,26 @@\n+package markup\n+\n+import \"strings\"\n+\n+type Format string\n+\n+const (\n+\tFormatMarkdown Format = \"markdown\"\n+\tFormatText Format = \"text\"\n+)\n+\n+var FileTypes map[Format][]string = map[Format][]string{\n+\tFormatMarkdown: []string{\".md\", \".markdown\", \".mdown\", \".mkdn\", \".mkd\"},\n+}\n+\n+func GetFormat(filename string) Format {\n+\tfor format, extensions := range FileTypes {\n+\t\tfor _, extension := range extensions {\n+\t\t\tif strings.HasSuffix(filename, extension) {\n+\t\t\t\treturn format\n+\t\t\t}\n+\t\t}\n+\t}\n+\t// default format\n+\treturn FormatText\n+}\ndiff --git a/appview/pages/pages.go b/appview/pages/pages.go\nindex a2a19affe23d8ee8f574418e36680c4fdcfcb6be..f6d28db21808aa7409acbbab72751b0d66631c0f 100644\n--- a/appview/pages/pages.go\n+++ b/appview/pages/pages.go\n@@ -24,6 +24,7 @@ \t\"github.com/bluesky-social/indigo/atproto/syntax\"\n \t\"github.com/microcosm-cc/bluemonday\"\n \t\"tangled.sh/tangled.sh/core/appview/auth\"\n \t\"tangled.sh/tangled.sh/core/appview/db\"\n+\t\"tangled.sh/tangled.sh/core/appview/pages/markup\"\n \t\"tangled.sh/tangled.sh/core/appview/state/userutil\"\n \t\"tangled.sh/tangled.sh/core/types\"\n )\n@@ -350,7 +351,7 @@ \t\tvar htmlString string\n \t\text := filepath.Ext(params.ReadmeFileName)\n \t\tswitch ext {\n \t\tcase \".md\", \".markdown\", \".mdown\", \".mkdn\", \".mkd\":\n-\t\t\thtmlString = renderMarkdown(params.Readme)\n+\t\t\thtmlString = markup.RenderMarkdown(params.Readme)\n \t\t\tparams.Raw = false\n \t\t\tparams.HTMLReadme = template.HTML(bluemonday.UGCPolicy().Sanitize(htmlString))\n \t\tdefault:\n@@ -446,10 +447,12 @@ \treturn p.executeRepo(\"repo/tags\", w, params)\n }\n \n type RepoBlobParams struct {\n-\tLoggedInUser *auth.User\n-\tRepoInfo RepoInfo\n-\tActive string\n-\tBreadCrumbs [][]string\n+\tLoggedInUser *auth.User\n+\tRepoInfo RepoInfo\n+\tActive string\n+\tBreadCrumbs [][]string\n+\tShowRendered bool\n+\tRenderedContents template.HTML\n \ttypes.RepoBlobResponse\n }\n \n@@ -458,6 +461,13 @@ \tstyle := styles.Get(\"bw\")\n \tb := style.Builder()\n \tb.Add(chroma.LiteralString, \"noitalic\")\n \tstyle, _ = b.Build()\n+\n+\tif params.ShowRendered {\n+\t\tswitch markup.GetFormat(params.Path) {\n+\t\tcase markup.FormatMarkdown:\n+\t\t\tparams.RenderedContents = template.HTML(markup.RenderMarkdown(params.Contents))\n+\t\t}\n+\t}\n \n \tif params.Lines < 5000 {\n \t\tc := params.Contents\ndiff --git a/appview/pages/templates/repo/blob.html b/appview/pages/templates/repo/blob.html\nindex 6736c7127cfd7b0b3143834f593d255f936e323b..4d456aae7bacb85ca6aa1a8f217ba572f13a1aaa 100644\n--- a/appview/pages/templates/repo/blob.html\n+++ b/appview/pages/templates/repo/blob.html\n@@ -43,6 +43,11 @@ <span class=\"select-none px-1 md:px-2 [&:before]:content-['·']\"></span>\n <span>{{ byteFmt .SizeHint }}</span>\n <span class=\"select-none px-1 md:px-2 [&:before]:content-['·']\"></span>\n <a href=\"/{{ .RepoInfo.FullName }}/blob/{{ .Ref }}/raw/{{ .Path }}\">view raw</a>\n+ <span class=\"select-none px-1 md:px-2 [&:before]:content-['·']\"></span>\n+ <a \n+ href=\"/{{ .RepoInfo.FullName }}/blob/{{ .Ref }}/{{ .Path }}?code={{ .ShowRendered }}\" \n+ hx-boost=\"true\"\n+ >view {{ if .ShowRendered }}code{{ else }}rendered{{ end }}</a>\n </div>\n </div>\n </div>\n@@ -52,7 +57,11 @@ This is a binary file and will not be displayed.\n </p>\n {{ else }}\n <div class=\"overflow-auto relative\">\n- <div class=\"whitespace-pre peer-target:bg-yellow-200 dark:peer-target:bg-yellow-900\">{{ $.Contents | escapeHtml }}</div>\n+ {{ if .ShowRendered }}\n+ <div id=\"blob-contents\" class=\"prose dark:prose-invert p-6\">{{ .RenderedContents }}</div>\n+ {{ else }}\n+ <div id=\"blob-contents\" class=\"whitespace-pre peer-target:bg-yellow-200 dark:peer-target:bg-yellow-900\">{{ $.Contents | escapeHtml }}</div>\n+ {{ end }}\n </div>\n {{ end }}\n {{ end }}\ndiff --git a/appview/state/repo.go b/appview/state/repo.go\nindex 40b10ee89e57077d0acf304502cd8b89e04d6d5f..b756477caaebcbd0aeb247736c03df658db1f5f6 100644\n--- a/appview/state/repo.go\n+++ b/appview/state/repo.go\n@@ -25,6 +25,7 @@ \t\"tangled.sh/tangled.sh/core/api/tangled\"\n \t\"tangled.sh/tangled.sh/core/appview/auth\"\n \t\"tangled.sh/tangled.sh/core/appview/db\"\n \t\"tangled.sh/tangled.sh/core/appview/pages\"\n+\t\"tangled.sh/tangled.sh/core/appview/pages/markup\"\n \t\"tangled.sh/tangled.sh/core/types\"\n \n \tcomatproto \"github.com/bluesky-social/indigo/api/atproto\"\n@@ -453,12 +454,22 @@ \t\t\tbreadcrumbs = append(breadcrumbs, []string{elem, fmt.Sprintf(\"%s/%s\", breadcrumbs[idx][1], elem)})\n \t\t}\n \t}\n \n+\tvar showRendered = false\n+\tif markup.GetFormat(result.Path) == markup.FormatMarkdown {\n+\t\tshowRendered = true\n+\t}\n+\n+\tif r.URL.Query().Get(\"code\") == \"true\" {\n+\t\tshowRendered = false\n+\t}\n+\n \tuser := s.auth.GetUser(r)\n \ts.pages.RepoBlob(w, pages.RepoBlobParams{\n \t\tLoggedInUser: user,\n \t\tRepoInfo: f.RepoInfo(s, user),\n \t\tRepoBlobResponse: result,\n \t\tBreadCrumbs: breadcrumbs,\n+\t\tShowRendered: showRendered,\n \t})\n \treturn\n }\n", "title": "appview: pages/blob: toggle render for markdown files", "pullId": 30, "source": { "branch": "render-markup" }, "targetRepo": "at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.repo/3liuighjy2h22", "targetBranch": "master" } }