mirror of https://github.com/jlelse/GoBlog
Don't render absolute links on HTML post pages, but in feeds and activitystreams
This commit is contained in:
parent
afcbf69e7d
commit
315fb575cb
|
@ -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 {
|
||||
|
|
2
feeds.go
2
feeds.go
|
@ -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,
|
||||
|
|
32
markdown.go
32
markdown.go
|
@ -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))
|
||||
|
|
5
posts.go
5
posts.go
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue