From 9891c0fb0eb274b8a95b62c40070a87a6e04088c Mon Sep 17 00:00:00 2001 From: Bjørn Erik Pedersen Date: Wed, 2 Aug 2017 21:37:03 +0200 Subject: Remove sourceRelativeLinks Fixes #3766 --- helpers/content.go | 53 +++++++----------- helpers/content_renderer.go | 30 ---------- helpers/content_test.go | 1 - hugolib/page.go | 13 +---- hugolib/site.go | 120 --------------------------------------- hugolib/site_test.go | 134 +------------------------------------------- 6 files changed, 22 insertions(+), 329 deletions(-) diff --git a/helpers/content.go b/helpers/content.go index d84fe27a8..4c053a84d 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -62,35 +62,31 @@ func NewContentSpec(cfg config.Provider) *ContentSpec { // Blackfriday holds configuration values for Blackfriday rendering. type Blackfriday struct { - Smartypants bool - SmartypantsQuotesNBSP bool - AngledQuotes bool - Fractions bool - HrefTargetBlank bool - SmartDashes bool - LatexDashes bool - TaskLists bool - PlainIDAnchors bool - SourceRelativeLinksEval bool - SourceRelativeLinksProjectFolder string - Extensions []string - ExtensionsMask []string + Smartypants bool + SmartypantsQuotesNBSP bool + AngledQuotes bool + Fractions bool + HrefTargetBlank bool + SmartDashes bool + LatexDashes bool + TaskLists bool + PlainIDAnchors bool + Extensions []string + ExtensionsMask []string } // NewBlackfriday creates a new Blackfriday filled with site config or some sane defaults. func (c ContentSpec) NewBlackfriday() *Blackfriday { defaultParam := map[string]interface{}{ - "smartypants": true, - "angledQuotes": false, - "smartypantsQuotesNBSP": false, - "fractions": true, - "hrefTargetBlank": false, - "smartDashes": true, - "latexDashes": true, - "plainIDAnchors": true, - "taskLists": true, - "sourceRelativeLinks": false, - "sourceRelativeLinksProjectFolder": "/docs/content", + "smartypants": true, + "angledQuotes": false, + "smartypantsQuotesNBSP": false, + "fractions": true, + "hrefTargetBlank": false, + "smartDashes": true, + "latexDashes": true, + "plainIDAnchors": true, + "taskLists": true, } ToLowerMap(defaultParam) @@ -112,13 +108,6 @@ func (c ContentSpec) NewBlackfriday() *Blackfriday { jww.FATAL.Printf("Failed to get site rendering config\n%s", err.Error()) } - if combinedConfig.SourceRelativeLinksEval { - // Remove in Hugo 0.21 - Deprecated("blackfriday", "sourceRelativeLinksEval", - `There is no replacement for this feature, as no developer has stepped up to the plate and volunteered to maintain this feature`, false) - - } - return combinedConfig } @@ -412,8 +401,6 @@ type RenderingContext struct { DocumentName string Config *Blackfriday RenderTOC bool - FileResolver FileResolverFunc - LinkResolver LinkResolverFunc Cfg config.Provider } diff --git a/helpers/content_renderer.go b/helpers/content_renderer.go index 376351f7a..10d99ec8e 100644 --- a/helpers/content_renderer.go +++ b/helpers/content_renderer.go @@ -20,7 +20,6 @@ import ( "github.com/gohugoio/hugo/config" "github.com/miekg/mmark" "github.com/russross/blackfriday" - jww "github.com/spf13/jwalterweatherman" ) type LinkResolverFunc func(ref string) (string, error) @@ -43,35 +42,6 @@ func (r *HugoHTMLRenderer) BlockCode(out *bytes.Buffer, text []byte, lang string } } -func (r *HugoHTMLRenderer) Link(out *bytes.Buffer, link []byte, title []byte, content []byte) { - if r.LinkResolver == nil || bytes.HasPrefix(link, []byte("HAHAHUGOSHORTCODE")) { - // Use the blackfriday built in Link handler - r.Renderer.Link(out, link, title, content) - } else { - // set by SourceRelativeLinksEval - newLink, err := r.LinkResolver(string(link)) - if err != nil { - newLink = string(link) - jww.ERROR.Printf("LinkResolver: %s", err) - } - r.Renderer.Link(out, []byte(newLink), title, content) - } -} -func (r *HugoHTMLRenderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { - if r.FileResolver == nil || bytes.HasPrefix(link, []byte("HAHAHUGOSHORTCODE")) { - // Use the blackfriday built in Image handler - r.Renderer.Image(out, link, title, alt) - } else { - // set by SourceRelativeLinksEval - newLink, err := r.FileResolver(string(link)) - if err != nil { - newLink = string(link) - jww.ERROR.Printf("FileResolver: %s", err) - } - r.Renderer.Image(out, []byte(newLink), title, alt) - } -} - // ListItem adds task list support to the Blackfriday renderer. func (r *HugoHTMLRenderer) ListItem(out *bytes.Buffer, text []byte, flags int) { if !r.Config.TaskLists { diff --git a/helpers/content_test.go b/helpers/content_test.go index e1fe5cebd..b0afb9cbd 100644 --- a/helpers/content_test.go +++ b/helpers/content_test.go @@ -188,7 +188,6 @@ func TestGetHTMLRendererAllFlags(t *testing.T) { ctx.Config.SmartDashes = true ctx.Config.Smartypants = true ctx.Config.SmartypantsQuotesNBSP = true - ctx.Config.SourceRelativeLinksEval = true renderer := c.getHTMLRenderer(defaultFlags, ctx) actualFlags := renderer.GetFlags() var expectedFlags int diff --git a/hugolib/page.go b/hugolib/page.go index 9937be325..0120d6ef0 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -622,22 +622,11 @@ func (p *Page) setAutoSummary() error { } func (p *Page) renderContent(content []byte) []byte { - var fn helpers.LinkResolverFunc - var fileFn helpers.FileResolverFunc - if p.getRenderingConfig().SourceRelativeLinksEval { - fn = func(ref string) (string, error) { - return p.Site.SourceRelativeLink(ref, p) - } - fileFn = func(ref string) (string, error) { - return p.Site.SourceRelativeLinkFile(ref, p) - } - } - return p.s.ContentSpec.RenderBytes(&helpers.RenderingContext{ Content: content, RenderTOC: true, PageFmt: p.determineMarkupType(), Cfg: p.Language(), DocumentID: p.UniqueID(), DocumentName: p.Path(), - Config: p.getRenderingConfig(), LinkResolver: fn, FileResolver: fileFn}) + Config: p.getRenderingConfig()}) } func (p *Page) getRenderingConfig() *helpers.Blackfriday { diff --git a/hugolib/site.go b/hugolib/site.go index 8bf37e17d..13ca7f144 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -493,126 +493,6 @@ func (s *SiteInfo) RelRef(ref string, page *Page, options ...string) (string, er return s.refLink(ref, page, true, outputFormat) } -// SourceRelativeLink attempts to convert any source page relative links (like [../another.md]) into absolute links -func (s *SiteInfo) SourceRelativeLink(ref string, currentPage *Page) (string, error) { - var refURL *url.URL - var err error - - refURL, err = url.Parse(strings.TrimPrefix(ref, currentPage.getRenderingConfig().SourceRelativeLinksProjectFolder)) - if err != nil { - return "", err - } - - if refURL.Scheme != "" { - // Not a relative source level path - return ref, nil - } - - var target *Page - var link string - - if refURL.Path != "" { - refPath := filepath.Clean(filepath.FromSlash(refURL.Path)) - - if strings.IndexRune(refPath, os.PathSeparator) == 0 { // filepath.IsAbs fails to me. - refPath = refPath[1:] - } else { - if currentPage != nil { - refPath = filepath.Join(currentPage.Source.Dir(), refURL.Path) - } - } - - for _, page := range s.AllRegularPages { - if page.Source.Path() == refPath { - target = page - break - } - } - // need to exhaust the test, then try with the others :/ - // if the refPath doesn't end in a filename with extension `.md`, then try with `.md` , and then `/index.md` - mdPath := strings.TrimSuffix(refPath, string(os.PathSeparator)) + ".md" - for _, page := range s.AllRegularPages { - if page.Source.Path() == mdPath { - target = page - break - } - } - indexPath := filepath.Join(refPath, "index.md") - for _, page := range s.AllRegularPages { - if page.Source.Path() == indexPath { - target = page - break - } - } - - if target == nil { - return "", fmt.Errorf("No page found for \"%s\" on page \"%s\".\n", ref, currentPage.Source.Path()) - } - - link = target.RelPermalink() - - } - - if refURL.Fragment != "" { - link = link + "#" + refURL.Fragment - - if refURL.Path != "" && target != nil && !target.getRenderingConfig().PlainIDAnchors { - link = link + ":" + target.UniqueID() - } else if currentPage != nil && !currentPage.getRenderingConfig().PlainIDAnchors { - link = link + ":" + currentPage.UniqueID() - } - } - - return link, nil -} - -// SourceRelativeLinkFile attempts to convert any non-md source relative links (like [../another.gif]) into absolute links -func (s *SiteInfo) SourceRelativeLinkFile(ref string, currentPage *Page) (string, error) { - var refURL *url.URL - var err error - - refURL, err = url.Parse(strings.TrimPrefix(ref, currentPage.getRenderingConfig().SourceRelativeLinksProjectFolder)) - if err != nil { - return "", err - } - - if refURL.Scheme != "" { - // Not a relative source level path - return ref, nil - } - - var target *source.File - var link string - - if refURL.Path != "" { - refPath := filepath.Clean(filepath.FromSlash(refURL.Path)) - - if strings.IndexRune(refPath, os.PathSeparator) == 0 { // filepath.IsAbs fails to me. - refPath = refPath[1:] - } else { - if currentPage != nil { - refPath = filepath.Join(currentPage.Source.Dir(), refURL.Path) - } - } - - for _, file := range *s.Files { - if file.Path() == refPath { - target = file - break - } - } - - if target == nil { - return "", fmt.Errorf("No file found for \"%s\" on page \"%s\".\n", ref, currentPage.Source.Path()) - } - - link = target.Path() - return "/" + filepath.ToSlash(link), nil - } - - return "", fmt.Errorf("failed to find a file to match \"%s\" on page \"%s\"", ref, currentPage.Source.Path()) -} - func (s *SiteInfo) addToPaginationPageCount(cnt uint64) { atomic.AddUint64(&s.paginationPageCount, cnt) } diff --git a/hugolib/site_test.go b/hugolib/site_test.go index bffdec1a9..d7ca66827 100644 --- a/hugolib/site_test.go +++ b/hugolib/site_test.go @@ -938,8 +938,7 @@ func setupLinkingMockSite(t *testing.T) *Site { cfg.Set("pluralizeListTitles", false) cfg.Set("canonifyURLs", false) cfg.Set("blackfriday", - map[string]interface{}{ - "sourceRelativeLinksProjectFolder": "/docs"}) + map[string]interface{}{}) writeSourcesToSource(t, "content", fs, sources...) return buildSingleSite(t, deps.DepsCfg{Fs: fs, Cfg: cfg}, BuildCfg{}) @@ -973,134 +972,3 @@ func TestRefLinking(t *testing.T) { // TODO: and then the failure cases. } - -func TestSourceRelativeLinksing(t *testing.T) { - t.Parallel() - site := setupLinkingMockSite(t) - - type resultMap map[string]string - - okresults := map[string]resultMap{ - "index.md": map[string]string{ - "/docs/rootfile.md": "/rootfile/", - "rootfile.md": "/rootfile/", - // See #3396 -- this may potentially be ambiguous (i.e. name conflict with home page). - // But the user have chosen so. This index.md patterns is more relevant in /sub-folders. - "index.md": "/", - "level2/2-root.md": "/level2/2-root/", - "/docs/level2/2-root.md": "/level2/2-root/", - "level2/level3/3-root.md": "/level2/level3/3-root/", - "/docs/level2/level3/3-root.md": "/level2/level3/3-root/", - "/docs/level2/2-root/": "/level2/2-root/", - "/docs/level2/2-root": "/level2/2-root/", - "/level2/2-root/": "/level2/2-root/", - "/level2/2-root": "/level2/2-root/", - }, "rootfile.md": map[string]string{ - "/docs/rootfile.md": "/rootfile/", - "rootfile.md": "/rootfile/", - "level2/2-root.md": "/level2/2-root/", - "/docs/level2/2-root.md": "/level2/2-root/", - "level2/level3/3-root.md": "/level2/level3/3-root/", - "/docs/level2/level3/3-root.md": "/level2/level3/3-root/", - }, "level2/2-root.md": map[string]string{ - "../rootfile.md": "/rootfile/", - "/docs/rootfile.md": "/rootfile/", - "2-root.md": "/level2/2-root/", - "../level2/2-root.md": "/level2/2-root/", - "./2-root.md": "/level2/2-root/", - "/docs/level2/2-root.md": "/level2/2-root/", - "level3/3-root.md": "/level2/level3/3-root/", - "../level2/level3/3-root.md": "/level2/level3/3-root/", - "/docs/level2/level3/3-root.md": "/level2/level3/3-root/", - }, "level2/index.md": map[string]string{ - "../rootfile.md": "/rootfile/", - "/docs/rootfile.md": "/rootfile/", - "2-root.md": "/level2/2-root/", - "../level2/2-root.md": "/level2/2-root/", - "./2-root.md": "/level2/2-root/", - "/docs/level2/2-root.md": "/level2/2-root/", - "level3/3-root.md": "/level2/level3/3-root/", - "../level2/level3/3-root.md": "/level2/level3/3-root/", - "/docs/level2/level3/3-root.md": "/level2/level3/3-root/", - }, "level2/level3/3-root.md": map[string]string{ - "../../rootfile.md": "/rootfile/", - "/docs/rootfile.md": "/rootfile/", - "../2-root.md": "/level2/2-root/", - "/docs/level2/2-root.md": "/level2/2-root/", - "3-root.md": "/level2/level3/3-root/", - "./3-root.md": "/level2/level3/3-root/", - "/docs/level2/level3/3-root.md": "/level2/level3/3-root/", - }, "level2/level3/index.md": map[string]string{ - "../../rootfile.md": "/rootfile/", - "/docs/rootfile.md": "/rootfile/", - "../2-root.md": "/level2/2-root/", - "/docs/level2/2-root.md": "/level2/2-root/", - "3-root.md": "/level2/level3/3-root/", - "./3-root.md": "/level2/level3/3-root/", - "/docs/level2/level3/3-root.md": "/level2/level3/3-root/", - }, - } - - for currentFile, results := range okresults { - currentPage := findPage(site, currentFile) - if currentPage == nil { - t.Fatalf("failed to find current page in site") - } - for link, url := range results { - if out, err := site.Info.SourceRelativeLink(link, currentPage); err != nil || out != url { - t.Errorf("Expected %s to resolve to (%s), got (%s) - error: %s", link, url, out, err) - } else { - //t.Logf("tested ok %s maps to %s", link, out) - } - } - } - // TODO: and then the failure cases. - // "https://docker.com": "", - // site_test.go:1094: Expected https://docker.com to resolve to (), got () - error: Not a plain filepath link (https://docker.com) - -} - -func TestSourceRelativeLinkFileing(t *testing.T) { - t.Parallel() - site := setupLinkingMockSite(t) - - type resultMap map[string]string - - okresults := map[string]resultMap{ - "index.md": map[string]string{ - "/root-image.png": "/root-image.png", - "root-image.png": "/root-image.png", - }, "rootfile.md": map[string]string{ - "/root-image.png": "/root-image.png", - }, "level2/2-root.md": map[string]string{ - "/root-image.png": "/root-image.png", - "common.png": "/level2/common.png", - }, "level2/index.md": map[string]string{ - "/root-image.png": "/root-image.png", - "common.png": "/level2/common.png", - "./common.png": "/level2/common.png", - }, "level2/level3/3-root.md": map[string]string{ - "/root-image.png": "/root-image.png", - "common.png": "/level2/level3/common.png", - "../common.png": "/level2/common.png", - }, "level2/level3/index.md": map[string]string{ - "/root-image.png": "/root-image.png", - "common.png": "/level2/level3/common.png", - "../common.png": "/level2/common.png", - }, - } - - for currentFile, results := range okresults { - currentPage := findPage(site, currentFile) - if currentPage == nil { - t.Fatalf("failed to find current page in site") - } - for link, url := range results { - if out, err := site.Info.SourceRelativeLinkFile(link, currentPage); err != nil || out != url { - t.Errorf("Expected %s to resolve to (%s), got (%s) - error: %s", link, url, out, err) - } else { - //t.Logf("tested ok %s maps to %s", link, out) - } - } - } -} -- cgit v1.2.3