Don't render absolute links on HTML post pages, but in feeds and activitystreams

This commit is contained in:
Jan-Lukas Else 2020-12-23 14:36:27 +01:00
parent afcbf69e7d
commit 315fb575cb
6 changed files with 41 additions and 17 deletions

View File

@ -90,7 +90,7 @@ func (p *post) toASNote() *asNote {
as.Type = "Note" as.Type = "Note"
} }
// Content // Content
as.Content = string(p.html()) as.Content = string(p.absoluteHTML())
// Attachments // Attachments
if images := p.Parameters[appConfig.Micropub.PhotoParam]; len(images) > 0 { if images := p.Parameters[appConfig.Micropub.PhotoParam]; len(images) > 0 {
for _, image := range images { for _, image := range images {

View File

@ -58,7 +58,7 @@ func generateFeed(blog string, f feedType, w http.ResponseWriter, r *http.Reques
Link: &feeds.Link{Href: p.fullURL()}, Link: &feeds.Link{Href: p.fullURL()},
Description: p.summary(), Description: p.summary(),
Id: p.Path, Id: p.Path,
Content: string(p.html()), Content: string(p.absoluteHTML()),
Created: created, Created: created,
Updated: updated, Updated: updated,
Enclosure: enc, Enclosure: enc,

View File

@ -18,10 +18,10 @@ import (
var emojilib definition.Emojis var emojilib definition.Emojis
var markdown goldmark.Markdown var defaultMarkdown, absoluteMarkdown goldmark.Markdown
func initMarkdown() { func initMarkdown() {
markdown = goldmark.New( defaultGoldmarkOptions := []goldmark.Option{
goldmark.WithRendererOptions( goldmark.WithRendererOptions(
html.WithUnsafe(), html.WithUnsafe(),
), ),
@ -38,15 +38,19 @@ func initMarkdown() {
emoji.New( emoji.New(
emoji.WithEmojis(emojiGoLib()), emoji.WithEmojis(emojiGoLib()),
), ),
// Custom
&customExtension{},
), ),
) }
defaultMarkdown = goldmark.New(append(defaultGoldmarkOptions, goldmark.WithExtensions(&customExtension{absoluteLinks: false}))...)
absoluteMarkdown = goldmark.New(append(defaultGoldmarkOptions, goldmark.WithExtensions(&customExtension{absoluteLinks: true}))...)
} }
func renderMarkdown(source string) ([]byte, error) { func renderMarkdown(source string, absoluteLinks bool) (rendered []byte, err error) {
var buffer bytes.Buffer var buffer bytes.Buffer
err := markdown.Convert([]byte(source), &buffer) if absoluteLinks {
err = absoluteMarkdown.Convert([]byte(source), &buffer)
} else {
err = defaultMarkdown.Convert([]byte(source), &buffer)
}
return buffer.Bytes(), err return buffer.Bytes(), err
} }
@ -65,15 +69,21 @@ func emojiGoLib() definition.Emojis {
} }
// Links // Links
type customExtension struct{} type customExtension struct {
absoluteLinks bool
}
func (l *customExtension) Extend(m goldmark.Markdown) { func (l *customExtension) Extend(m goldmark.Markdown) {
m.Renderer().AddOptions(renderer.WithNodeRenderers( m.Renderer().AddOptions(renderer.WithNodeRenderers(
util.Prioritized(&customRenderer{}, 500), util.Prioritized(&customRenderer{
absoluteLinks: l.absoluteLinks,
}, 500),
)) ))
} }
type customRenderer struct{} type customRenderer struct {
absoluteLinks bool
}
func (c *customRenderer) RegisterFuncs(r renderer.NodeRendererFuncRegisterer) { func (c *customRenderer) RegisterFuncs(r renderer.NodeRendererFuncRegisterer) {
r.Register(ast.KindLink, c.renderLink) r.Register(ast.KindLink, c.renderLink)
@ -86,7 +96,7 @@ func (c *customRenderer) renderLink(w util.BufWriter, _ []byte, node ast.Node, e
_, _ = w.WriteString("<a href=\"") _, _ = w.WriteString("<a href=\"")
// Make URL absolute if it's relative // Make URL absolute if it's relative
newDestination := util.URLEscape(n.Destination, true) newDestination := util.URLEscape(n.Destination, true)
if bytes.HasPrefix(newDestination, []byte("/")) { if c.absoluteLinks && bytes.HasPrefix(newDestination, []byte("/")) {
_, _ = w.Write(util.EscapeHTML([]byte(appConfig.Server.PublicAddress))) _, _ = w.Write(util.EscapeHTML([]byte(appConfig.Server.PublicAddress)))
} }
_, _ = w.Write(util.EscapeHTML(newDestination)) _, _ = w.Write(util.EscapeHTML(newDestination))

View File

@ -26,8 +26,9 @@ type post struct {
Blog string `json:"blog"` Blog string `json:"blog"`
Section string `json:"section"` Section string `json:"section"`
// Not persisted // Not persisted
Slug string `json:"slug"` Slug string `json:"slug"`
rendered template.HTML rendered template.HTML
absoluteRendered template.HTML
} }
func servePost(w http.ResponseWriter, r *http.Request) { func servePost(w http.ResponseWriter, r *http.Request) {

View File

@ -35,7 +35,7 @@ func (p *post) html() template.HTML {
if p.rendered != "" { if p.rendered != "" {
return p.rendered return p.rendered
} }
htmlContent, err := renderMarkdown(p.Content) htmlContent, err := renderMarkdown(p.Content, false)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
return "" return ""
@ -44,6 +44,19 @@ func (p *post) html() template.HTML {
return p.rendered return p.rendered
} }
func (p *post) absoluteHTML() template.HTML {
if p.absoluteRendered != "" {
return p.absoluteRendered
}
htmlContent, err := renderMarkdown(p.Content, true)
if err != nil {
log.Fatal(err)
return ""
}
p.absoluteRendered = template.HTML(htmlContent)
return p.absoluteRendered
}
const summaryDivider = "<!--more-->" const summaryDivider = "<!--more-->"
func (p *post) summary() (summary string) { func (p *post) summary() (summary string) {

View File

@ -48,7 +48,7 @@ func initRendering() error {
return appConfig.User return appConfig.User
}, },
"md": func(content string) template.HTML { "md": func(content string) template.HTML {
htmlContent, err := renderMarkdown(content) htmlContent, err := renderMarkdown(content, false)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
return "" return ""