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"
|
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 {
|
||||||
|
|
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()},
|
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,
|
||||||
|
|
32
markdown.go
32
markdown.go
|
@ -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))
|
||||||
|
|
5
posts.go
5
posts.go
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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 ""
|
||||||
|
|
Loading…
Reference in New Issue