Monorepo for Tangled tangled.org

appview/pages: clone rctx before transforming markdown #1185

merged opened by oppi.li targeting master from op/swmxvwqvnmpq

avoid global mutation and weird cross-request interactions.

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

Labels

None yet.

assignee

None yet.

Participants 2
AT URI
at://did:plc:qfpnj4og54vl56wngdriaxug/sh.tangled.repo.pull/3mhhuzqxur622
+41 -30
Diff #0
+12 -9
appview/pages/funcmap.go
··· 262 262 return v.Slice(0, min(n, v.Len())).Interface() 263 263 }, 264 264 "markdown": func(text string) template.HTML { 265 - p.rctx.RendererType = markup.RendererTypeDefault 266 - htmlString := p.rctx.RenderMarkdown(text) 267 - sanitized := p.rctx.SanitizeDefault(htmlString) 265 + rctx := p.rctx.Clone() 266 + rctx.RendererType = markup.RendererTypeDefault 267 + htmlString := rctx.RenderMarkdown(text) 268 + sanitized := rctx.SanitizeDefault(htmlString) 268 269 return template.HTML(sanitized) 269 270 }, 270 271 "description": func(text string) template.HTML { 271 - p.rctx.RendererType = markup.RendererTypeDefault 272 - htmlString := p.rctx.RenderMarkdownWith(text, goldmark.New( 272 + rctx := p.rctx.Clone() 273 + rctx.RendererType = markup.RendererTypeDefault 274 + htmlString := rctx.RenderMarkdownWith(text, goldmark.New( 273 275 goldmark.WithExtensions( 274 276 emoji.Emoji, 275 277 ), 276 278 )) 277 - sanitized := p.rctx.SanitizeDescription(htmlString) 279 + sanitized := rctx.SanitizeDescription(htmlString) 278 280 return template.HTML(sanitized) 279 281 }, 280 282 "readme": func(text string) template.HTML { 281 - p.rctx.RendererType = markup.RendererTypeRepoMarkdown 282 - htmlString := p.rctx.RenderMarkdown(text) 283 - sanitized := p.rctx.SanitizeDefault(htmlString) 283 + rctx := p.rctx.Clone() 284 + rctx.RendererType = markup.RendererTypeRepoMarkdown 285 + htmlString := rctx.RenderMarkdown(text) 286 + sanitized := rctx.SanitizeDefault(htmlString) 284 287 return template.HTML(sanitized) 285 288 }, 286 289 "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) ··· 378 379 return fmt.Errorf("failed to read %s: %w", filename, err) 379 380 } 380 381 381 - p.rctx.RendererType = markup.RendererTypeDefault 382 - htmlString := p.rctx.RenderMarkdown(string(markdownBytes)) 383 - sanitized := p.rctx.SanitizeDefault(htmlString) 382 + rctx := p.rctx.Clone() 383 + rctx.RendererType = markup.RendererTypeDefault 384 + htmlString := rctx.RenderMarkdown(string(markdownBytes)) 385 + sanitized := rctx.SanitizeDefault(htmlString) 384 386 params.Content = template.HTML(sanitized) 385 387 386 388 return p.execute("legal/privacy", w, params) ··· 793 795 return p.executeRepo("repo/knotUnreachable", w, params) 794 796 } 795 797 796 - p.rctx.RepoInfo = params.RepoInfo 797 - p.rctx.RepoInfo.Ref = params.Ref 798 - p.rctx.RendererType = markup.RendererTypeRepoMarkdown 798 + rctx := p.rctx.Clone() 799 + rctx.RepoInfo = params.RepoInfo 800 + rctx.RepoInfo.Ref = params.Ref 801 + rctx.RendererType = markup.RendererTypeRepoMarkdown 799 802 800 803 if params.ReadmeFileName != "" { 801 804 ext := filepath.Ext(params.ReadmeFileName) 802 805 switch ext { 803 806 case ".md", ".markdown", ".mdown", ".mkdn", ".mkd": 804 807 params.Raw = false 805 - htmlString := p.rctx.RenderMarkdown(params.Readme) 806 - sanitized := p.rctx.SanitizeDefault(htmlString) 808 + htmlString := rctx.RenderMarkdown(params.Readme) 809 + sanitized := rctx.SanitizeDefault(htmlString) 807 810 params.HTMLReadme = template.HTML(sanitized) 808 811 default: 809 812 params.Raw = true ··· 886 889 func (p *Pages) RepoTree(w io.Writer, params RepoTreeParams) error { 887 890 params.Active = "overview" 888 891 889 - p.rctx.RepoInfo = params.RepoInfo 890 - p.rctx.RepoInfo.Ref = params.Ref 891 - 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 892 896 893 897 if params.ReadmeFileName != "" { 894 898 ext := filepath.Ext(params.ReadmeFileName) 895 899 switch ext { 896 900 case ".md", ".markdown", ".mdown", ".mkdn", ".mkd": 897 901 params.Raw = false 898 - htmlString := p.rctx.RenderMarkdown(params.Readme) 899 - sanitized := p.rctx.SanitizeDefault(htmlString) 902 + htmlString := rctx.RenderMarkdown(params.Readme) 903 + sanitized := rctx.SanitizeDefault(htmlString) 900 904 params.HTMLReadme = template.HTML(sanitized) 901 905 default: 902 906 params.Raw = true ··· 968 972 } 969 973 970 974 func (p *Pages) RepoBlob(w io.Writer, params RepoBlobParams) error { 971 - switch params.BlobView.ContentType { 972 - case models.BlobContentTypeMarkup: 973 - p.rctx.RepoInfo = params.RepoInfo 974 - } 975 - 976 975 params.Active = "overview" 977 976 return p.executeRepo("repo/blob", w, params) 978 977 }

History

1 round 1 comment
sign up or login to add to the discussion
oppi.li submitted #0
1 commit
expand
appview/pages: clone rctx before transforming markdown
1/3 failed, 2/3 success
expand
expand 1 comment
pull request successfully merged