Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

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

appview/pages: clone rctx before transforming markdown

avoid global mutation and weird cross-request interactions.

Signed-off-by: oppiliappan <me@oppi.li>

authored by

oppiliappan and committed by tangled.org 76c5d8a9 73c7f95d

+41 -30
+12 -9
appview/pages/funcmap.go
··· 265 265 return v.Slice(0, min(n, v.Len())).Interface() 266 266 }, 267 267 "markdown": func(text string) template.HTML { 268 - p.rctx.RendererType = markup.RendererTypeDefault 269 - htmlString := p.rctx.RenderMarkdown(text) 270 - sanitized := p.rctx.SanitizeDefault(htmlString) 268 + rctx := p.rctx.Clone() 269 + rctx.RendererType = markup.RendererTypeDefault 270 + htmlString := rctx.RenderMarkdown(text) 271 + sanitized := rctx.SanitizeDefault(htmlString) 271 272 return template.HTML(sanitized) 272 273 }, 273 274 "description": func(text string) template.HTML { 274 - p.rctx.RendererType = markup.RendererTypeDefault 275 - htmlString := p.rctx.RenderMarkdownWith(text, goldmark.New( 275 + rctx := p.rctx.Clone() 276 + rctx.RendererType = markup.RendererTypeDefault 277 + htmlString := rctx.RenderMarkdownWith(text, goldmark.New( 276 278 goldmark.WithExtensions( 277 279 emoji.Emoji, 278 280 ), 279 281 )) 280 - sanitized := p.rctx.SanitizeDescription(htmlString) 282 + sanitized := rctx.SanitizeDescription(htmlString) 281 283 return template.HTML(sanitized) 282 284 }, 283 285 "readme": func(text string) template.HTML { 284 - p.rctx.RendererType = markup.RendererTypeRepoMarkdown 285 - htmlString := p.rctx.RenderMarkdown(text) 286 - sanitized := p.rctx.SanitizeDefault(htmlString) 286 + rctx := p.rctx.Clone() 287 + rctx.RendererType = markup.RendererTypeRepoMarkdown 288 + htmlString := rctx.RenderMarkdown(text) 289 + sanitized := rctx.SanitizeDefault(htmlString) 287 290 return template.HTML(sanitized) 288 291 }, 289 292 "code": func(content, path string) string {
+9
appview/pages/markup/markdown.go
··· 86 86 return md 87 87 } 88 88 89 + // clone creates a shallow copy of the RenderContext 90 + func (rctx *RenderContext) Clone() *RenderContext { 91 + if rctx == nil { 92 + return nil 93 + } 94 + clone := *rctx 95 + return &clone 96 + } 97 + 89 98 // NewMarkdownWith is an alias for NewMarkdown with extra extensions. 90 99 func NewMarkdownWith(hostname string, extra ...goldmark.Extender) goldmark.Markdown { 91 100 return NewMarkdown(hostname, extra...)
+20 -21
appview/pages/pages.go
··· 350 350 return fmt.Errorf("failed to read %s: %w", filename, err) 351 351 } 352 352 353 - p.rctx.RendererType = markup.RendererTypeDefault 354 - htmlString := p.rctx.RenderMarkdown(string(markdownBytes)) 355 - sanitized := p.rctx.SanitizeDefault(htmlString) 353 + rctx := p.rctx.Clone() 354 + rctx.RendererType = markup.RendererTypeDefault 355 + htmlString := rctx.RenderMarkdown(string(markdownBytes)) 356 + sanitized := rctx.SanitizeDefault(htmlString) 356 357 params.Content = template.HTML(sanitized) 357 358 358 359 return p.execute("legal/terms", w, params) ··· 379 378 return fmt.Errorf("failed to read %s: %w", filename, err) 380 379 } 381 380 382 - p.rctx.RendererType = markup.RendererTypeDefault 383 - htmlString := p.rctx.RenderMarkdown(string(markdownBytes)) 384 - sanitized := p.rctx.SanitizeDefault(htmlString) 381 + rctx := p.rctx.Clone() 382 + rctx.RendererType = markup.RendererTypeDefault 383 + htmlString := rctx.RenderMarkdown(string(markdownBytes)) 384 + sanitized := rctx.SanitizeDefault(htmlString) 385 385 params.Content = template.HTML(sanitized) 386 386 387 387 return p.execute("legal/privacy", w, params) ··· 798 796 return p.executeRepo("repo/knotUnreachable", w, params) 799 797 } 800 798 801 - p.rctx.RepoInfo = params.RepoInfo 802 - p.rctx.RepoInfo.Ref = params.Ref 803 - p.rctx.RendererType = markup.RendererTypeRepoMarkdown 799 + rctx := p.rctx.Clone() 800 + rctx.RepoInfo = params.RepoInfo 801 + rctx.RepoInfo.Ref = params.Ref 802 + rctx.RendererType = markup.RendererTypeRepoMarkdown 804 803 805 804 if params.ReadmeFileName != "" { 806 805 ext := filepath.Ext(params.ReadmeFileName) 807 806 switch ext { 808 807 case ".md", ".markdown", ".mdown", ".mkdn", ".mkd": 809 808 params.Raw = false 810 - htmlString := p.rctx.RenderMarkdown(params.Readme) 811 - sanitized := p.rctx.SanitizeDefault(htmlString) 809 + htmlString := rctx.RenderMarkdown(params.Readme) 810 + sanitized := rctx.SanitizeDefault(htmlString) 812 811 params.HTMLReadme = template.HTML(sanitized) 813 812 default: 814 813 params.Raw = true ··· 892 889 func (p *Pages) RepoTree(w io.Writer, params RepoTreeParams) error { 893 890 params.Active = "overview" 894 891 895 - p.rctx.RepoInfo = params.RepoInfo 896 - p.rctx.RepoInfo.Ref = params.Ref 897 - p.rctx.RendererType = markup.RendererTypeRepoMarkdown 892 + rctx := p.rctx.Clone() 893 + rctx.RepoInfo = params.RepoInfo 894 + rctx.RepoInfo.Ref = params.Ref 895 + rctx.RendererType = markup.RendererTypeRepoMarkdown 898 896 899 897 if params.ReadmeFileName != "" { 900 898 ext := filepath.Ext(params.ReadmeFileName) 901 899 switch ext { 902 900 case ".md", ".markdown", ".mdown", ".mkdn", ".mkd": 903 901 params.Raw = false 904 - htmlString := p.rctx.RenderMarkdown(params.Readme) 905 - sanitized := p.rctx.SanitizeDefault(htmlString) 902 + htmlString := rctx.RenderMarkdown(params.Readme) 903 + sanitized := rctx.SanitizeDefault(htmlString) 906 904 params.HTMLReadme = template.HTML(sanitized) 907 905 default: 908 906 params.Raw = true ··· 975 971 } 976 972 977 973 func (p *Pages) RepoBlob(w io.Writer, params RepoBlobParams) error { 978 - switch params.BlobView.ContentType { 979 - case models.BlobContentTypeMarkup: 980 - p.rctx.RepoInfo = params.RepoInfo 981 - } 982 - 983 974 params.Active = "overview" 984 975 return p.executeRepo("repo/blob", w, params) 985 976 }