mirror of
https://gitea.com/gitea/tea.git
synced 2026-01-12 01:52:07 +01:00
Fix resolving of URLs in markdown (#401)
Path-only URLs need an absolute reference to be resolved against for printing in markdown Previously we resolved against the URL to the resource we were operating on (eg comment or issue URL). The markdown renderer in the web UI resolves all such URLs relative to the repo base URL. This PR adopts this behaviour in tea, by trimming the URL to a repo base URL via regex. This makes a custom patch to our markdown renderer `glamour` obsolete, which turned out to be an incorrect patch, meaning we can make use of upstream glamour again. Co-authored-by: Norwin <git@nroo.de> Reviewed-on: https://gitea.com/gitea/tea/pulls/401 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Reviewed-by: 6543 <6543@obermui.de> Co-authored-by: Norwin <noerw@noreply.gitea.io> Co-committed-by: Norwin <noerw@noreply.gitea.io>
This commit is contained in:
4
vendor/github.com/charmbracelet/glamour/ansi/elements.go
generated
vendored
4
vendor/github.com/charmbracelet/glamour/ansi/elements.go
generated
vendored
@@ -129,9 +129,6 @@ func (tr *ANSIRenderer) NewElement(node ast.Node, source []byte) Element {
|
||||
}
|
||||
if node.Parent().(*ast.List).IsOrdered() {
|
||||
e = l
|
||||
if node.Parent().(*ast.List).Start != 1 {
|
||||
e += uint(node.Parent().(*ast.List).Start) - 1
|
||||
}
|
||||
}
|
||||
|
||||
post := "\n"
|
||||
@@ -156,7 +153,6 @@ func (tr *ANSIRenderer) NewElement(node ast.Node, source []byte) Element {
|
||||
return Element{
|
||||
Exiting: post,
|
||||
Renderer: &ItemElement{
|
||||
IsOrdered: node.Parent().(*ast.List).IsOrdered(),
|
||||
Enumeration: e,
|
||||
},
|
||||
}
|
||||
|
||||
2
vendor/github.com/charmbracelet/glamour/ansi/image.go
generated
vendored
2
vendor/github.com/charmbracelet/glamour/ansi/image.go
generated
vendored
@@ -25,7 +25,7 @@ func (e *ImageElement) Render(w io.Writer, ctx RenderContext) error {
|
||||
}
|
||||
if len(e.URL) > 0 {
|
||||
el := &BaseElement{
|
||||
Token: resolveURL(e.BaseURL, e.URL),
|
||||
Token: resolveRelativeURL(e.BaseURL, e.URL),
|
||||
Prefix: " ",
|
||||
Style: ctx.options.Styles.Image,
|
||||
}
|
||||
|
||||
2
vendor/github.com/charmbracelet/glamour/ansi/link.go
generated
vendored
2
vendor/github.com/charmbracelet/glamour/ansi/link.go
generated
vendored
@@ -64,7 +64,7 @@ func (e *LinkElement) Render(w io.Writer, ctx RenderContext) error {
|
||||
}
|
||||
|
||||
el := &BaseElement{
|
||||
Token: resolveURL(e.BaseURL, e.URL),
|
||||
Token: resolveRelativeURL(e.BaseURL, e.URL),
|
||||
Prefix: pre,
|
||||
Style: style,
|
||||
}
|
||||
|
||||
3
vendor/github.com/charmbracelet/glamour/ansi/listitem.go
generated
vendored
3
vendor/github.com/charmbracelet/glamour/ansi/listitem.go
generated
vendored
@@ -7,13 +7,12 @@ import (
|
||||
|
||||
// An ItemElement is used to render items inside a list.
|
||||
type ItemElement struct {
|
||||
IsOrdered bool
|
||||
Enumeration uint
|
||||
}
|
||||
|
||||
func (e *ItemElement) Render(w io.Writer, ctx RenderContext) error {
|
||||
var el *BaseElement
|
||||
if e.IsOrdered {
|
||||
if e.Enumeration > 0 {
|
||||
el = &BaseElement{
|
||||
Style: ctx.options.Styles.Enumeration,
|
||||
Prefix: strconv.FormatInt(int64(e.Enumeration), 10),
|
||||
|
||||
2
vendor/github.com/charmbracelet/glamour/ansi/paragraph.go
generated
vendored
2
vendor/github.com/charmbracelet/glamour/ansi/paragraph.go
generated
vendored
@@ -38,7 +38,7 @@ func (e *ParagraphElement) Finish(w io.Writer, ctx RenderContext) error {
|
||||
mw := NewMarginWriter(ctx, w, rules)
|
||||
if len(strings.TrimSpace(bs.Current().Block.String())) > 0 {
|
||||
flow := wordwrap.NewWriter(int(bs.Width(ctx)))
|
||||
flow.KeepNewlines = ctx.options.PreserveNewLines
|
||||
flow.KeepNewlines = false
|
||||
_, _ = flow.Write(bs.Current().Block.Bytes())
|
||||
flow.Close()
|
||||
|
||||
|
||||
13
vendor/github.com/charmbracelet/glamour/ansi/renderer.go
generated
vendored
13
vendor/github.com/charmbracelet/glamour/ansi/renderer.go
generated
vendored
@@ -3,6 +3,7 @@ package ansi
|
||||
import (
|
||||
"io"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/muesli/termenv"
|
||||
east "github.com/yuin/goldmark-emoji/ast"
|
||||
@@ -14,11 +15,10 @@ import (
|
||||
|
||||
// Options is used to configure an ANSIRenderer.
|
||||
type Options struct {
|
||||
BaseURL string
|
||||
WordWrap int
|
||||
PreserveNewLines bool
|
||||
ColorProfile termenv.Profile
|
||||
Styles StyleConfig
|
||||
BaseURL string
|
||||
WordWrap int
|
||||
ColorProfile termenv.Profile
|
||||
Styles StyleConfig
|
||||
}
|
||||
|
||||
// ANSIRenderer renders markdown content as ANSI escaped sequences.
|
||||
@@ -149,7 +149,7 @@ func isChild(node ast.Node) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func resolveURL(baseURL string, rel string) string {
|
||||
func resolveRelativeURL(baseURL string, rel string) string {
|
||||
u, err := url.Parse(rel)
|
||||
if err != nil {
|
||||
return rel
|
||||
@@ -157,6 +157,7 @@ func resolveURL(baseURL string, rel string) string {
|
||||
if u.IsAbs() {
|
||||
return rel
|
||||
}
|
||||
u.Path = strings.TrimPrefix(u.Path, "/")
|
||||
|
||||
base, err := url.Parse(baseURL)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user