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"
}
// Content
as.Content = string(p.html())
as.Content = string(p.absoluteHTML())
// Attachments
if images := p.Parameters[appConfig.Micropub.PhotoParam]; len(images) > 0 {
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()},
Description: p.summary(),
Id: p.Path,
Content: string(p.html()),
Content: string(p.absoluteHTML()),
Created: created,
Updated: updated,
Enclosure: enc,

View File

@ -18,10 +18,10 @@ import (
var emojilib definition.Emojis
var markdown goldmark.Markdown
var defaultMarkdown, absoluteMarkdown goldmark.Markdown
func initMarkdown() {
markdown = goldmark.New(
defaultGoldmarkOptions := []goldmark.Option{
goldmark.WithRendererOptions(
html.WithUnsafe(),
),
@ -38,15 +38,19 @@ func initMarkdown() {
emoji.New(
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
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
}
@ -65,15 +69,21 @@ func emojiGoLib() definition.Emojis {
}
// Links
type customExtension struct{}
type customExtension struct {
absoluteLinks bool
}
func (l *customExtension) Extend(m goldmark.Markdown) {
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) {
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=\"")
// Make URL absolute if it's relative
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(newDestination))

View File

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

View File

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

View File

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