summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hugolib/site_test.go2
-rw-r--r--publisher/htmlElementsCollector.go20
-rw-r--r--publisher/htmlElementsCollector_test.go6
3 files changed, 27 insertions, 1 deletions
diff --git a/hugolib/site_test.go b/hugolib/site_test.go
index 3116113c0..54c2fbe59 100644
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -1123,7 +1123,7 @@ ABC.
els := stats.HTMLElements
b.Assert(els.Classes, qt.HasLen, 3606) // (4 * 900) + 4 +2
- b.Assert(els.Tags, qt.HasLen, 8)
+ b.Assert(els.Tags, qt.HasLen, 9)
b.Assert(els.IDs, qt.HasLen, 1)
}
diff --git a/publisher/htmlElementsCollector.go b/publisher/htmlElementsCollector.go
index e033f52d7..7bb2ebf15 100644
--- a/publisher/htmlElementsCollector.go
+++ b/publisher/htmlElementsCollector.go
@@ -116,7 +116,13 @@ func (w *cssClassCollectorWriter) Write(p []byte) (n int, err error) {
w.buff.Reset()
+ if strings.HasPrefix(s, "</") {
+ continue
+ }
+
+ s, tagName := w.insertStandinHTMLElement(s)
el := parseHTMLElement(s)
+ el.Tag = tagName
w.collector.mu.Lock()
w.collector.elementSet[s] = true
@@ -132,6 +138,20 @@ func (w *cssClassCollectorWriter) Write(p []byte) (n int, err error) {
return
}
+// The net/html parser does not handle single table elemnts as input, e.g. tbody.
+// We only care about the element/class/ids, so just store away the original tag name
+// and pretend it's a <div>.
+func (c *cssClassCollectorWriter) insertStandinHTMLElement(el string) (string, string) {
+ tag := el[1:]
+ spacei := strings.Index(tag, " ")
+ if spacei != -1 {
+ tag = tag[:spacei]
+ }
+ newv := strings.Replace(el, tag, "div", 1)
+ return newv, strings.ToLower(tag)
+
+}
+
func (c *cssClassCollectorWriter) endCollecting(drop bool) {
c.isCollecting = false
c.inQuote = false
diff --git a/publisher/htmlElementsCollector_test.go b/publisher/htmlElementsCollector_test.go
index 72abd94f0..e255a7354 100644
--- a/publisher/htmlElementsCollector_test.go
+++ b/publisher/htmlElementsCollector_test.go
@@ -51,6 +51,12 @@ func TestClassCollector(t *testing.T) {
{"duplicates", `<div class="b a b"></div>`, f("div", "a b", "")},
{"single quote", `<body class='b a'></body>`, f("body", "a b", "")},
{"no quote", `<body class=b id=myelement></body>`, f("body", "b", "myelement")},
+ {"thead", `
+ https://github.com/gohugoio/hugo/issues/7318
+<table class="cl1">
+ <thead class="cl2"><tr class="cl3"><td class="cl4"></td></tr></thead>
+ <tbody class="cl5"><tr class="cl6"><td class="cl7"></td></tr></tbody>
+</table>`, f("table tbody td thead tr", "cl1 cl2 cl3 cl4 cl5 cl6 cl7", "")},
// https://github.com/gohugoio/hugo/issues/7161
{"minified a href", `<a class="b a" href=/></a>`, f("a", "a b", "")},