Mercurial > yakumo_izuru > aya
comparison vendor/github.com/yosssi/gcss/line.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 |
comparison
equal
deleted
inserted
replaced
| 65:6d985efa0f7a | 66:787b5ee0289d |
|---|---|
| 1 package gcss | |
| 2 | |
| 3 import ( | |
| 4 "fmt" | |
| 5 "strings" | |
| 6 ) | |
| 7 | |
| 8 const unicodeSpace = 32 | |
| 9 | |
| 10 const indentTop = 0 | |
| 11 | |
| 12 // line represents a line of codes. | |
| 13 type line struct { | |
| 14 no int | |
| 15 s string | |
| 16 indent int | |
| 17 } | |
| 18 | |
| 19 // isEmpty returns true if the line's s is zero value. | |
| 20 func (ln *line) isEmpty() bool { | |
| 21 return strings.TrimSpace(ln.s) == "" | |
| 22 } | |
| 23 | |
| 24 // isTopIndent returns true if the line's indent is the top level. | |
| 25 func (ln *line) isTopIndent() bool { | |
| 26 return ln.indent == indentTop | |
| 27 } | |
| 28 | |
| 29 // childOf returns true if the line is a child of the parent. | |
| 30 func (ln *line) childOf(parent element) (bool, error) { | |
| 31 var ok bool | |
| 32 var err error | |
| 33 | |
| 34 switch pIndent := parent.Base().ln.indent; { | |
| 35 case ln.indent == pIndent+1: | |
| 36 ok = true | |
| 37 case ln.indent > pIndent+1: | |
| 38 err = fmt.Errorf("indent is invalid [line: %d]", ln.no) | |
| 39 } | |
| 40 | |
| 41 return ok, err | |
| 42 } | |
| 43 | |
| 44 // isDeclaration returns true if the line is a declaration. | |
| 45 func (ln *line) isDeclaration() bool { | |
| 46 _, _, err := declarationPV(ln) | |
| 47 return err == nil | |
| 48 } | |
| 49 | |
| 50 // isAtRule returns true if the line is an at-rule. | |
| 51 func (ln *line) isAtRule() bool { | |
| 52 return strings.HasPrefix(strings.TrimSpace(ln.s), atMark) | |
| 53 } | |
| 54 | |
| 55 // isVariable returns true if the line is a variable. | |
| 56 func (ln *line) isVariable() bool { | |
| 57 if !ln.isTopIndent() { | |
| 58 return false | |
| 59 } | |
| 60 | |
| 61 _, _, err := variableNV(ln) | |
| 62 | |
| 63 return err == nil | |
| 64 } | |
| 65 | |
| 66 // isMixinDeclaration returns true if the line is a mixin declaration. | |
| 67 func (ln *line) isMixinDeclaration() bool { | |
| 68 if !ln.isTopIndent() { | |
| 69 return false | |
| 70 } | |
| 71 | |
| 72 _, _, err := mixinNP(ln, true) | |
| 73 | |
| 74 return err == nil | |
| 75 } | |
| 76 | |
| 77 // isMixinInvocation returns true if the line is a mixin invocation. | |
| 78 func (ln *line) isMixinInvocation() bool { | |
| 79 if ln.isTopIndent() { | |
| 80 return false | |
| 81 } | |
| 82 | |
| 83 _, _, err := mixinNP(ln, false) | |
| 84 | |
| 85 return err == nil | |
| 86 } | |
| 87 | |
| 88 // isComment returns true if the line is a comment. | |
| 89 func (ln *line) isComment() bool { | |
| 90 return strings.HasPrefix(strings.TrimSpace(ln.s), doubleSlash) | |
| 91 } | |
| 92 | |
| 93 // newLine creates and returns a line. | |
| 94 func newLine(no int, s string) *line { | |
| 95 return &line{ | |
| 96 no: no, | |
| 97 s: s, | |
| 98 indent: indent(s), | |
| 99 } | |
| 100 } | |
| 101 | |
| 102 // indent returns the string's indent. | |
| 103 func indent(s string) int { | |
| 104 var i int | |
| 105 | |
| 106 for _, b := range s { | |
| 107 if b != unicodeSpace { | |
| 108 break | |
| 109 } | |
| 110 i++ | |
| 111 } | |
| 112 | |
| 113 return i / 2 | |
| 114 } |
