func testAllMarkdownEnginesForPages(t *testing.T, assertFunc func(t *testing.T, ext string, pages Pages), settings map[string]interface{}, pageSources ...string) { engines := []struct { ext string shouldExecute func() bool }{ {"md", func() bool { return true }}, {"mmark", func() bool { return true }}, {"ad", func() bool { return helpers.HasAsciidoc() }}, // TODO(bep) figure a way to include this without too much work.{"html", func() bool { return true }}, {"rst", func() bool { return helpers.HasRst() }}, } for _, e := range engines { if !e.shouldExecute() { continue } testCommonResetState() if settings != nil { for k, v := range settings { viper.Set(k, v) } } contentDir := "content" if s := viper.GetString("contentDir"); s != "" { contentDir = s } var fileSourcePairs []string for i, source := range pageSources { fileSourcePairs = append(fileSourcePairs, fmt.Sprintf("p%d.%s", i, e.ext), source) } for i := 0; i < len(fileSourcePairs); i += 2 { writeSource(t, filepath.Join(contentDir, fileSourcePairs[i]), fileSourcePairs[i+1]) } s := newSiteDefaultLang() if err := buildSiteSkipRender(s); err != nil { t.Fatalf("Failed to build site: %s", err) } require.Len(t, s.Pages, len(pageSources)) assertFunc(t, e.ext, s.Pages) } }
func testAllMarkdownEnginesForPages(t *testing.T, assertFunc func(t *testing.T, ext string, pages Pages), pageSources ...string) { engines := []struct { ext string shouldExecute func() bool }{ {"md", func() bool { return true }}, {"mmark", func() bool { return true }}, {"ad", func() bool { return helpers.HasAsciidoc() }}, // TODO(bep) figure a way to include this without too much work.{"html", func() bool { return true }}, {"rst", func() bool { return helpers.HasRst() }}, } for _, e := range engines { if !e.shouldExecute() { continue } var fileSourcePair []string for i, source := range pageSources { fileSourcePair = append(fileSourcePair, fmt.Sprintf("p%d.%s", i, e.ext), source) } s := newSiteFromSources(fileSourcePair...) if err := buildSiteSkipRender(s); err != nil { t.Fatalf("Failed to build site: %s", err) } require.Len(t, s.Pages, len(pageSources)) assertFunc(t, e.ext, s.Pages) } }
func testAllMarkdownEnginesForPage(t *testing.T, assertFunc func(t *testing.T, ext string, p *Page), baseFilename, pageContent string) { engines := []struct { ext string shouldExecute func() bool }{ {"ad", func() bool { return helpers.HasAsciidoc() }}, {"md", func() bool { return true }}, {"mmark", func() bool { return true }}, // TODO(bep) figure a way to include this without too much work.{"html", func() bool { return true }}, {"rst", func() bool { return helpers.HasRst() }}, } for _, e := range engines { if !e.shouldExecute() { continue } filename := baseFilename + "." + e.ext s := newSiteFromSources(filename, pageContent) if err := buildSiteSkipRender(s); err != nil { t.Fatalf("Failed to build site: %s", err) } require.Len(t, s.Pages, 1) p := s.Pages[0] assertFunc(t, e.ext, p) } }
func TestShortcodesInSite(t *testing.T) { viper.Reset() defer viper.Reset() baseURL := "http://foo/bar" viper.Set("DefaultExtension", "html") viper.Set("baseurl", baseURL) viper.Set("UglyURLs", false) viper.Set("verbose", true) tests := []struct { contentPath string content string outFile string expected string }{ {"sect/doc1.md", `a{{< b >}}c`, filepath.FromSlash("sect/doc1/index.html"), "<p>abc</p>\n"}, // Issue #1642: Multiple shortcodes wrapped in P // Deliberately forced to pass even if they maybe shouldn't. {"sect/doc2.md", `a {{< b >}} {{< c >}} {{< d >}} e`, filepath.FromSlash("sect/doc2/index.html"), "<p>a</p>\n\n<p>b<br />\nc\nd</p>\n\n<p>e</p>\n"}, {"sect/doc3.md", `a {{< b >}} {{< c >}} {{< d >}} e`, filepath.FromSlash("sect/doc3/index.html"), "<p>a</p>\n\n<p>b<br />\nc</p>\n\nd\n\n<p>e</p>\n"}, {"sect/doc4.md", `a {{< b >}} {{< b >}} {{< b >}} {{< b >}} {{< b >}} `, filepath.FromSlash("sect/doc4/index.html"), "<p>a\nb\nb\nb\nb\nb</p>\n"}, // #2192 #2209: Shortcodes in markdown headers {"sect/doc5.md", `# {{< b >}} ## {{% c %}}`, filepath.FromSlash("sect/doc5/index.html"), "\n\n<h1 id=\"hugoshortcode-1\">b</h1>\n\n<h2 id=\"hugoshortcode-2\">c</h2>\n"}, {"sect/doc6.md", "\n```bash\n{{< b >}}\n{{% c %}}\n```\n", filepath.FromSlash("sect/doc6/index.html"), "<pre><code class=\"language-bash\">b\nc\n</code></pre>\n"}, // #2249 {"sect/doc7.ad", `_Shortcodes:_ *b: {{< b >}} c: {{% c %}}*`, filepath.FromSlash("sect/doc7/index.html"), "<div class=\"paragraph\">\n<p><em>Shortcodes:</em> <strong>b: b c: c</strong></p>\n</div>\n"}, } sources := make([]source.ByteSource, len(tests)) for i, test := range tests { sources[i] = source.ByteSource{Name: filepath.FromSlash(test.contentPath), Content: []byte(test.content)} } s := &Site{ Source: &source.InMemorySource{ByteSource: sources}, targets: targetList{page: &target.PagePub{UglyURLs: false}}, } s.initializeSiteInfo() s.loadTemplates() s.Tmpl.AddTemplate("_default/single.html", "{{.Content}}") s.Tmpl.AddInternalShortcode("b.html", `b`) s.Tmpl.AddInternalShortcode("c.html", `c`) s.Tmpl.AddInternalShortcode("d.html", `d`) s.Tmpl.MarkReady() createAndRenderPages(t, s) for _, test := range tests { if strings.HasSuffix(test.contentPath, ".ad") && !helpers.HasAsciidoc() { fmt.Println("Skip Asciidoc test case as no Asciidoc present.") continue } file, err := hugofs.Destination().Open(test.outFile) if err != nil { t.Fatalf("Did not find %s in target: %s", test.outFile, err) } content := helpers.ReaderToString(file) if content != test.expected { t.Errorf("%s content expected:\n%q\ngot:\n%q", test.outFile, test.expected, content) } } }
func TestShortcodesInSite(t *testing.T) { testCommonResetState() baseURL := "http://foo/bar" viper.Set("DefaultExtension", "html") viper.Set("DefaultContentLanguage", "en") viper.Set("baseurl", baseURL) viper.Set("UglyURLs", false) viper.Set("verbose", true) viper.Set("pygmentsuseclasses", true) viper.Set("pygmentscodefences", true) tests := []struct { contentPath string content string outFile string expected string }{ {"sect/doc1.md", `a{{< b >}}c`, filepath.FromSlash("sect/doc1/index.html"), "<p>abc</p>\n"}, // Issue #1642: Multiple shortcodes wrapped in P // Deliberately forced to pass even if they maybe shouldn't. {"sect/doc2.md", `a {{< b >}} {{< c >}} {{< d >}} e`, filepath.FromSlash("sect/doc2/index.html"), "<p>a</p>\n\n<p>b<br />\nc\nd</p>\n\n<p>e</p>\n"}, {"sect/doc3.md", `a {{< b >}} {{< c >}} {{< d >}} e`, filepath.FromSlash("sect/doc3/index.html"), "<p>a</p>\n\n<p>b<br />\nc</p>\n\nd\n\n<p>e</p>\n"}, {"sect/doc4.md", `a {{< b >}} {{< b >}} {{< b >}} {{< b >}} {{< b >}} `, filepath.FromSlash("sect/doc4/index.html"), "<p>a\nb\nb\nb\nb\nb</p>\n"}, // #2192 #2209: Shortcodes in markdown headers {"sect/doc5.md", `# {{< b >}} ## {{% c %}}`, filepath.FromSlash("sect/doc5/index.html"), "\n\n<h1 id=\"hahahugoshortcode-1hbhb\">b</h1>\n\n<h2 id=\"hahahugoshortcode-2hbhb\">c</h2>\n"}, // #2223 pygments {"sect/doc6.md", "\n```bash\nb: {{< b >}} c: {{% c %}}\n```\n", filepath.FromSlash("sect/doc6/index.html"), "b: b c: c\n</code></pre></div>\n"}, // #2249 {"sect/doc7.ad", `_Shortcodes:_ *b: {{< b >}} c: {{% c %}}*`, filepath.FromSlash("sect/doc7/index.html"), "<div class=\"paragraph\">\n<p><em>Shortcodes:</em> <strong>b: b c: c</strong></p>\n</div>\n"}, {"sect/doc8.rst", `**Shortcodes:** *b: {{< b >}} c: {{% c %}}*`, filepath.FromSlash("sect/doc8/index.html"), "<div class=\"document\">\n\n\n<p><strong>Shortcodes:</strong> <em>b: b c: c</em></p>\n</div>"}, {"sect/doc9.mmark", ` --- menu: main: parent: 'parent' --- **Shortcodes:** *b: {{< b >}} c: {{% c %}}*`, filepath.FromSlash("sect/doc9/index.html"), "<p><strong>Shortcodes:</strong> <em>b: b c: c</em></p>\n"}, // Issue #1229: Menus not available in shortcode. {"sect/doc10.md", `--- menu: main: identifier: 'parent' tags: - Menu --- **Menus:** {{< menu >}}`, filepath.FromSlash("sect/doc10/index.html"), "<p><strong>Menus:</strong> 1</p>\n"}, // Issue #2323: Taxonomies not available in shortcode. {"sect/doc11.md", `--- tags: - Bugs --- **Tags:** {{< tags >}}`, filepath.FromSlash("sect/doc11/index.html"), "<p><strong>Tags:</strong> 2</p>\n"}, } sources := make([]source.ByteSource, len(tests)) for i, test := range tests { sources[i] = source.ByteSource{Name: filepath.FromSlash(test.contentPath), Content: []byte(test.content)} } s := &Site{ Source: &source.InMemorySource{ByteSource: sources}, targets: targetList{page: &target.PagePub{UglyURLs: false}}, Language: helpers.NewDefaultLanguage(), } addTemplates := func(templ tpl.Template) error { templ.AddTemplate("_default/single.html", "{{.Content}}") templ.AddInternalShortcode("b.html", `b`) templ.AddInternalShortcode("c.html", `c`) templ.AddInternalShortcode("d.html", `d`) templ.AddInternalShortcode("menu.html", `{{ len (index .Page.Menus "main").Children }}`) templ.AddInternalShortcode("tags.html", `{{ len .Page.Site.Taxonomies.tags }}`) return nil } sites, err := newHugoSites(s) if err != nil { t.Fatalf("Failed to build site: %s", err) } if err = sites.Build(BuildCfg{withTemplate: addTemplates}); err != nil { t.Fatalf("Failed to build site: %s", err) } for _, test := range tests { if strings.HasSuffix(test.contentPath, ".ad") && !helpers.HasAsciidoc() { fmt.Println("Skip Asciidoc test case as no Asciidoc present.") continue } else if strings.HasSuffix(test.contentPath, ".rst") && !helpers.HasRst() { fmt.Println("Skip Rst test case as no rst2html present.") continue } else if strings.Contains(test.expected, "code") && !helpers.HasPygments() { fmt.Println("Skip Pygments test case as no pygments present.") continue } file, err := hugofs.Destination().Open(test.outFile) if err != nil { t.Fatalf("Did not find %s in target: %s", test.outFile, err) } content := helpers.ReaderToString(file) if !strings.Contains(content, test.expected) { t.Fatalf("%s content expected:\n%q\ngot:\n%q", test.outFile, test.expected, content) } } }