diff vendor/github.com/yosssi/gcss/selector.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/github.com/yosssi/gcss/selector.go	Sun Jul 23 13:18:53 2023 +0000
@@ -0,0 +1,110 @@
+package gcss
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+	"strings"
+)
+
+// selector represents a selector of CSS.
+type selector struct {
+	elementBase
+	name string
+}
+
+// WriteTo writes the selector to the writer.
+func (sel *selector) WriteTo(w io.Writer) (int64, error) {
+	return sel.writeTo(w, nil)
+}
+
+// writeTo writes the selector to the writer.
+func (sel *selector) writeTo(w io.Writer, params map[string]string) (int64, error) {
+	bf := new(bytes.Buffer)
+
+	// Write the declarations.
+	if len(sel.decs) > 0 || sel.hasMixinDecs() {
+		bf.WriteString(sel.names())
+		bf.WriteString(openBrace)
+
+		// Writing to the bytes.Buffer never returns an error.
+		sel.writeDecsTo(bf, params)
+
+		bf.WriteString(closeBrace)
+	}
+
+	// Write the child selectors.
+	for _, childSel := range sel.sels {
+		// Writing to the bytes.Buffer never returns an error.
+		childSel.writeTo(bf, params)
+	}
+
+	// Write the mixin's selectors.
+	for _, mi := range sel.mixins {
+		sels, prms := mi.selsParams()
+
+		for _, sl := range sels {
+			sl.parent = sel
+			// Writing to the bytes.Buffer never returns an error.
+			sl.writeTo(bf, prms)
+		}
+	}
+
+	n, err := w.Write(bf.Bytes())
+
+	return int64(n), err
+}
+
+// names returns the selector names.
+func (sel *selector) names() string {
+	bf := new(bytes.Buffer)
+
+	switch parent := sel.parent.(type) {
+	case nil, *atRule:
+		for _, name := range strings.Split(sel.name, comma) {
+			if bf.Len() > 0 {
+				bf.WriteString(comma)
+			}
+
+			bf.WriteString(strings.TrimSpace(name))
+		}
+	case *selector:
+		for _, parentS := range strings.Split(parent.names(), comma) {
+			for _, s := range strings.Split(sel.name, comma) {
+				if bf.Len() > 0 {
+					bf.WriteString(comma)
+				}
+
+				s = strings.TrimSpace(s)
+
+				if strings.Index(s, ampersand) != -1 {
+					bf.WriteString(strings.Replace(s, ampersand, parentS, -1))
+				} else {
+					bf.WriteString(parentS)
+					bf.WriteString(space)
+					bf.WriteString(s)
+				}
+			}
+		}
+	}
+
+	return bf.String()
+}
+
+// newSelector creates and returns a selector.
+func newSelector(ln *line, parent element) (*selector, error) {
+	name := strings.TrimSpace(ln.s)
+
+	if strings.HasSuffix(name, openBrace) {
+		return nil, fmt.Errorf("selector must not end with %q [line: %d]", openBrace, ln.no)
+	}
+
+	if strings.HasSuffix(name, closeBrace) {
+		return nil, fmt.Errorf("selector must not end with %q [line: %d]", closeBrace, ln.no)
+	}
+
+	return &selector{
+		elementBase: newElementBase(ln, parent),
+		name:        name,
+	}, nil
+}