shithub: mycel

Download patch

ref: f548ead614a4ee6fda902670100b49c17070c81b
parent: 069daee6347a509dab3c109291cfd35956229b91
author: Philip Silva <philip.silva@protonmail.com>
date: Sat Jan 29 12:33:01 EST 2022

keep sorting of css srcs

--- a/browser/browser.go
+++ b/browser/browser.go
@@ -1520,7 +1520,7 @@
 	tr.MaxIdleConnsPerHost = 6
 	b = &Browser{
 		client: &http.Client{
-			Jar: jar,
+			Jar:       jar,
 			Transport: tr,
 		},
 		dui:      _dui,
--- a/browser/browser_test.go
+++ b/browser/browser_test.go
@@ -72,7 +72,7 @@
 		}
 		m.Declarations["display"] = style.Declaration{
 			Prop: "display",
-			Val:    d,
+			Val:  d,
 		}
 		h1.Map = m
 		h2.Map = m
--- a/browser/website.go
+++ b/browser/website.go
@@ -163,40 +163,39 @@
 	log.Flush()
 }
 
-func cssSrcs(f opossum.Fetcher, doc *html.Node) (csss []string) {
-	// TODO: keep order of inline and referenced files
-	cssHrefs := style.Hrefs(doc)
-	inlines := make([]string, 0, 3)
+func cssSrcs(f opossum.Fetcher, doc *html.Node) (srcs []string) {
+	srcs = make([]string, 0, 20)
+	srcs = append(srcs, style.AddOnCSS)
 	ntAll := nodes.NewNodeTree(doc, style.Map{}, make(map[*html.Node]style.Map), nil)
-	inls := ntAll.FindAll("style")
-
-	for _, inl := range inls {
-		if t := strings.ToLower(inl.Attr("type")); t == "" || t == "text/css" {
-			inlines = append(inlines, inl.ContentString(true))
+	ntAll.Traverse(func(r int, n *nodes.Node) {
+		switch n.Data() {
+		case "style":
+			if t := strings.ToLower(n.Attr("type")); t == "" || t == "text/css" {
+				srcs = append(srcs, n.ContentString(true))
+			}
+		case "link":
+			isStylesheet := n.Attr("rel") == "stylesheet"
+			isPrint := n.Attr("media") == "print"
+			href := n.Attr("href")
+			if isStylesheet && !isPrint {
+				url, err := f.LinkedUrl(href)
+				if err != nil {
+					log.Errorf("error parsing %v", href)
+					return
+				}
+				buf, contentType, err := f.Get(url)
+				if err != nil {
+					log.Errorf("error downloading %v", url)
+					return
+				}
+				if contentType.IsCSS() {
+					srcs = append(srcs, string(buf))
+				} else {
+					log.Printf("css: unexpected %v", contentType)
+				}
+			}
 		}
-	}
-	csss = make([]string, 0, len(inlines)+len(cssHrefs))
-	csss = append(csss, style.AddOnCSS)
-	csss = append(csss, inlines...)
-	for _, href := range cssHrefs {
-		url, err := f.LinkedUrl(href)
-		if err != nil {
-			log.Printf("error parsing %v", href)
-			continue
-		}
-		log.Printf("Download %v", url)
-		buf, contentType, err := f.Get(url)
-		if err != nil {
-			log.Printf("error downloading %v", url)
-			continue
-		}
-		if contentType.IsCSS() {
-			csss = append(csss, string(buf))
-		} else {
-			log.Printf("css: unexpected %v", contentType)
-		}
-	}
-
+	})
 	return
 }
 
--- a/nodes/nodes.go
+++ b/nodes/nodes.go
@@ -381,34 +381,40 @@
 	return
 }
 
-func (n *Node) PrintTree() {
-	n.printTree(0)
+func (n *Node) Traverse(f func(r int, c *Node)) {
+	n.traverse(0, f)
 }
 
-func (n *Node) printTree(r int) {
-	for i := 0; i < r; i++ {
-		fmt.Printf("  ")
+func (n *Node) traverse(rr int, f func(r int, c *Node)) {
+	f(rr, n)
+	for _, c := range n.Children {
+		c.traverse(rr+1, f)
 	}
-	if n.Type() == html.ElementNode {
-		sty := ""
-		if len(n.Map.Declarations) > 0 {
-			l := make([]string, 0, 2)
-			for k, d := range n.Map.Declarations {
-				s := fmt.Sprintf("%v=%v", k, d.Val)
-				if d.Important {
-					s += "!"
+}
+
+func (n *Node) PrintTree() {
+	n.Traverse(func(r int, n *Node) {
+		for i := 0; i < r; i++ {
+			fmt.Printf("  ")
+		}
+		if n.Type() == html.ElementNode {
+			sty := ""
+			if len(n.Map.Declarations) > 0 {
+				l := make([]string, 0, 2)
+				for k, d := range n.Map.Declarations {
+					s := fmt.Sprintf("%v=%v", k, d.Val)
+					if d.Important {
+						s += "!"
+					}
+					l = append(l, s)
 				}
-				l = append(l, s)
+				sty += ` style="` + strings.Join(l, " ") + `"`
 			}
-			sty += ` style="` + strings.Join(l, " ") + `"`
+			fmt.Printf("<%v%v>\n", n.Data(), sty)
+		} else if n.Type() == html.TextNode {
+			fmt.Printf("\"%v\"\n", strings.TrimSpace(n.Data()))
+		} else {
+			fmt.Printf("%v\n", n.Data())
 		}
-		fmt.Printf("<%v%v>\n", n.Data(), sty)
-	} else if n.Type() == html.TextNode {
-		fmt.Printf("\"%v\"\n", strings.TrimSpace(n.Data()))
-	} else {
-		fmt.Printf("%v\n", n.Data())
-	}
-	for _, c := range n.Children {
-		c.printTree(r + 1)
-	}
+	})
 }
--- a/style/stylesheets.go
+++ b/style/stylesheets.go
@@ -63,43 +63,6 @@
 	initFontserver()
 }
 
-func Hrefs(doc *html.Node) (hrefs []string) {
-	hrefs = make([]string, 0, 3)
-
-	var f func(n *html.Node)
-	f = func(n *html.Node) {
-		if n.Type == html.ElementNode && n.Data == "link" {
-			isStylesheet := false
-			isPrint := false
-			href := ""
-
-			for _, a := range n.Attr {
-				switch strings.ToLower(a.Key) {
-				case "rel":
-					if a.Val == "stylesheet" {
-						isStylesheet = true
-					}
-				case "href":
-					href = a.Val
-				case "media":
-					isPrint = a.Val == "print"
-				}
-			}
-
-			if isStylesheet && !isPrint {
-				hrefs = append(hrefs, href)
-			}
-		}
-		for c := n.FirstChild; c != nil; c = c.NextSibling {
-			f(c)
-		}
-	}
-
-	f(doc)
-
-	return
-}
-
 func MergeNodeMaps(m, addOn map[*html.Node]Map) {
 	for n, mp := range addOn {
 		// "zero" valued Map if it doesn't exist yet