URI: 
       Fix some missing JS class collector cases - hugo - [fork] hugo port for 9front
  HTML git clone git@git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit c03ea2b66010d2996d652903cb8fa41e983e787f
   DIR parent fe60b7d9e4c12dbc428f992c05969bc14c7fe7a2
  HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
       Date:   Mon, 27 Apr 2020 17:49:51 +0200
       
       Fix some missing JS class collector cases
       
       Fixes #7216
       
       Diffstat:
         M publisher/htmlElementsCollector.go  |      26 +++++++++-----------------
         M publisher/htmlElementsCollector_te… |       9 +++++++++
       
       2 files changed, 18 insertions(+), 17 deletions(-)
       ---
   DIR diff --git a/publisher/htmlElementsCollector.go b/publisher/htmlElementsCollector.go
       @@ -14,9 +14,10 @@
        package publisher
        
        import (
       +        "regexp"
       +
                "github.com/gohugoio/hugo/helpers"
                "golang.org/x/net/html"
       -        yaml "gopkg.in/yaml.v2"
        
                "bytes"
                "sort"
       @@ -196,7 +197,10 @@ func isQuote(b byte) bool {
                return b == '"' || b == '\''
        }
        
       -var htmlJsonFixer = strings.NewReplacer(", ", "\n")
       +var (
       +        htmlJsonFixer = strings.NewReplacer(", ", "\n")
       +        jsonAttrRe    = regexp.MustCompile(`'?(.*?)'?:.*`)
       +)
        
        func parseHTMLElement(elStr string) (el htmlElement) {
                elStr = strings.TrimSpace(elStr)
       @@ -225,27 +229,15 @@ func parseHTMLElement(elStr string) (el htmlElement) {
                                                        val := strings.TrimSpace(a.Val)
                                                        if strings.Contains(key, "class") && strings.HasPrefix(val, "{") {
                                                                // This looks like a Vue or AlpineJS class binding.
       -                                                        // Try to unmarshal it as YAML and pull the keys.
       -                                                        // This may look odd, as the source is (probably) JS (JSON), but the YAML
       -                                                        // parser is much more lenient with simple JS input, it seems.
       -                                                        m := make(map[string]interface{})
                                                                val = htmlJsonFixer.Replace(strings.Trim(val, "{}"))
       -                                                        // Remove leading space to make it look like YAML.
                                                                lines := strings.Split(val, "\n")
                                                                for i, l := range lines {
                                                                        lines[i] = strings.TrimSpace(l)
                                                                }
                                                                val = strings.Join(lines, "\n")
       -                                                        err := yaml.Unmarshal([]byte(val), &m)
       -                                                        if err == nil {
       -                                                                for k := range m {
       -                                                                        el.Classes = append(el.Classes, strings.Fields(k)...)
       -                                                                }
       -                                                        } else {
       -                                                                // Just insert the raw values. This is used for CSS class pruning
       -                                                                // so, it's important not to leave out values that may be a CSS class.
       -                                                                el.Classes = append(el.Classes, strings.Fields(val)...)
       -                                                        }
       +                                                        val = jsonAttrRe.ReplaceAllString(val, "$1")
       +                                                        el.Classes = append(el.Classes, strings.Fields(val)...)
       +
                                                        }
                                                }
                                        }
   DIR diff --git a/publisher/htmlElementsCollector_test.go b/publisher/htmlElementsCollector_test.go
       @@ -70,6 +70,15 @@ func TestClassCollector(t *testing.T) {
                        {"Alpine bind 4", `<div x-bind:class="{ 'text-gray-800':  !checked, 
                                                 'text-white': checked }"></div>`, f("div", "text-gray-800 text-white", "")},
        
       +                {"Alpine bind 5", `<a x-bind:class="{
       +                'text-a': a && b,
       +                'text-b': !a && b || c,
       +                'pl-3': a === 1,
       +                 pl-2: b == 3,
       +                'text-gray-600': (a > 1)
       +      
       +                }" class="block w-36 cursor-pointer pr-3 no-underline capitalize"></a>`, f("a", "block capitalize cursor-pointer no-underline pl-2 pl-3 pr-3 text-a text-b text-gray-600 w-36", "")},
       +
                        {"Vue bind", `<div v-bind:class="{ active: isActive }"></div>`, f("div", "active", "")},
                } {
                        c.Run(test.name, func(c *qt.C) {