minicss 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.editorconfig +10 -0
- data/.rspec +3 -0
- data/.rubocop.yml +66 -0
- data/ACKNOWLEDGMENTS.md +47 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE +21 -0
- data/README.md +178 -0
- data/Rakefile +12 -0
- data/lib/minicss/ast/at_rule.rb +17 -0
- data/lib/minicss/ast/bad_token.rb +14 -0
- data/lib/minicss/ast/block.rb +29 -0
- data/lib/minicss/ast/decl.rb +17 -0
- data/lib/minicss/ast/decl_list.rb +18 -0
- data/lib/minicss/ast/dimension.rb +14 -0
- data/lib/minicss/ast/function.rb +15 -0
- data/lib/minicss/ast/number.rb +14 -0
- data/lib/minicss/ast/percentage.rb +8 -0
- data/lib/minicss/ast/rule.rb +28 -0
- data/lib/minicss/ast/string_token.rb +14 -0
- data/lib/minicss/ast/syntax_error.rb +13 -0
- data/lib/minicss/ast/unicode_range.rb +13 -0
- data/lib/minicss/ast/url.rb +13 -0
- data/lib/minicss/ast.rb +72 -0
- data/lib/minicss/css/ast/at_rule.rb +19 -0
- data/lib/minicss/css/ast/declaration.rb +21 -0
- data/lib/minicss/css/ast/declaration_list.rb +11 -0
- data/lib/minicss/css/ast/function.rb +20 -0
- data/lib/minicss/css/ast/qualified_rule.rb +19 -0
- data/lib/minicss/css/ast/simple_block.rb +37 -0
- data/lib/minicss/css/ast/stylesheet.rb +17 -0
- data/lib/minicss/css/ast.rb +9 -0
- data/lib/minicss/css/errors.rb +8 -0
- data/lib/minicss/css/parser.rb +360 -0
- data/lib/minicss/css/position.rb +15 -0
- data/lib/minicss/css/refinements.rb +78 -0
- data/lib/minicss/css/token.rb +28 -0
- data/lib/minicss/css/token_stream.rb +56 -0
- data/lib/minicss/css/tokenizer.rb +572 -0
- data/lib/minicss/css.rb +10 -0
- data/lib/minicss/errors.rb +6 -0
- data/lib/minicss/sel.rb +382 -0
- data/lib/minicss/serializer.rb +59 -0
- data/lib/minicss/version.rb +5 -0
- data/lib/minicss.rb +53 -0
- metadata +87 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MiniCSS
|
4
|
+
module CSS
|
5
|
+
module StringRefinements
|
6
|
+
refine String do
|
7
|
+
def eof? = false
|
8
|
+
def digit? = between?("0", "9")
|
9
|
+
def hex? = digit? || between?("a", "f") || between?("A", "F")
|
10
|
+
def uppercase? = between?("A", "Z")
|
11
|
+
def lowercase? = between?("a", "z")
|
12
|
+
def letter? = uppercase? || lowercase?
|
13
|
+
def one_of?(*what) = what.include?(self)
|
14
|
+
|
15
|
+
def non_ascii_ident?
|
16
|
+
self == "\u00B7" \
|
17
|
+
|| between?("\u00C0", "\u00D6") \
|
18
|
+
|| between?("\u00D8", "\u00F6") \
|
19
|
+
|| between?("\u00F8", "\u037D") \
|
20
|
+
|| between?("\u037F", "\u1FFF") \
|
21
|
+
|| self == "\u200C" \
|
22
|
+
|| self == "\u200D" \
|
23
|
+
|| self == "\u203F" \
|
24
|
+
|| self == "\u2040" \
|
25
|
+
|| between?("\u2070", "\u218F") \
|
26
|
+
|| between?("\u2C00", "\u2FEF") \
|
27
|
+
|| between?("\u3001", "\uD7FF") \
|
28
|
+
|| between?("\uF900", "\uFDCF") \
|
29
|
+
|| between?("\uFDF0", "\uFFFD") \
|
30
|
+
|| self >= "\u{10000}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def uni = unpack1("U")
|
34
|
+
def ident_start? = letter? || uni >= 0x80 || self == "_"
|
35
|
+
def ident_point? = ident_start? || digit? || uni == 0x2D
|
36
|
+
|
37
|
+
def non_printable?
|
38
|
+
between?("\u0000", "\u0008") \
|
39
|
+
|| self == "\u000B" \
|
40
|
+
|| between?("\u000B", "\u001F") \
|
41
|
+
|| self == "\u007F"
|
42
|
+
end
|
43
|
+
|
44
|
+
def newline? = (self == "\n")
|
45
|
+
def whitespace? = newline? || self == "\u0009" || self == "\u0020"
|
46
|
+
end
|
47
|
+
|
48
|
+
refine Integer do
|
49
|
+
def surrogate_leading? = between?(0xD800, 0xDBFF)
|
50
|
+
def surrogate_trailing? = between?(0xDC00, 0xDFFF)
|
51
|
+
|
52
|
+
def surrogate? = surrogate_leading? || surrogate_trailing?
|
53
|
+
def overflows_maximum_codepoint? = self > 0x10FFFF
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class EOF
|
58
|
+
def self.instance
|
59
|
+
@instance ||= new
|
60
|
+
end
|
61
|
+
|
62
|
+
def eof? = true
|
63
|
+
def digit? = false
|
64
|
+
def hex? = false
|
65
|
+
def uppercase? = false
|
66
|
+
def lowercase? = false
|
67
|
+
def letter? = false
|
68
|
+
def one_of?(*) = false
|
69
|
+
def non_ascii_ident? = false
|
70
|
+
def uni = 0
|
71
|
+
def ident_start? = false
|
72
|
+
def ident_point? = false
|
73
|
+
def non_printable? = false
|
74
|
+
def newline? = false
|
75
|
+
def whitespace? = false
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MiniCSS
|
4
|
+
module CSS
|
5
|
+
class Token
|
6
|
+
attr_reader :kind, :pos_start, :pos_end, :opts
|
7
|
+
attr_writer :literal
|
8
|
+
|
9
|
+
def initialize(kind, pos_start, pos_end, **opts)
|
10
|
+
@kind = kind
|
11
|
+
@pos_start = pos_start
|
12
|
+
@pos_end = pos_end
|
13
|
+
@literal = opts.delete(:literal)
|
14
|
+
@opts = opts.empty? ? nil : opts
|
15
|
+
end
|
16
|
+
|
17
|
+
def literal
|
18
|
+
return " " if kind == :whitespace
|
19
|
+
|
20
|
+
@literal
|
21
|
+
end
|
22
|
+
|
23
|
+
def eof? = @kind == :eof
|
24
|
+
|
25
|
+
EOF = Token.new(:eof, nil, nil)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MiniCSS
|
4
|
+
module CSS
|
5
|
+
class TokenStream
|
6
|
+
using StringRefinements
|
7
|
+
|
8
|
+
def initialize(tokens)
|
9
|
+
@tokens = tokens
|
10
|
+
@idx = 0
|
11
|
+
@marks = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def peek
|
15
|
+
token = @tokens[@idx]
|
16
|
+
return Token::EOF unless token
|
17
|
+
|
18
|
+
token
|
19
|
+
end
|
20
|
+
|
21
|
+
def peek1
|
22
|
+
token = @tokens[@idx + 1]
|
23
|
+
return Token::EOF unless token
|
24
|
+
|
25
|
+
token
|
26
|
+
end
|
27
|
+
|
28
|
+
def empty? = peek.eof?
|
29
|
+
|
30
|
+
def consume
|
31
|
+
peek.tap { @idx += 1 }
|
32
|
+
end
|
33
|
+
|
34
|
+
def discard
|
35
|
+
@idx += 1 unless empty?
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def mark
|
40
|
+
@marks << @idx
|
41
|
+
end
|
42
|
+
|
43
|
+
def restore
|
44
|
+
@idx = pop
|
45
|
+
end
|
46
|
+
|
47
|
+
def pop
|
48
|
+
@marks.pop
|
49
|
+
end
|
50
|
+
|
51
|
+
def discard_whitespace
|
52
|
+
discard while peek.kind == :whitespace
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|