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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +10 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +66 -0
  5. data/ACKNOWLEDGMENTS.md +47 -0
  6. data/CODE_OF_CONDUCT.md +132 -0
  7. data/LICENSE +21 -0
  8. data/README.md +178 -0
  9. data/Rakefile +12 -0
  10. data/lib/minicss/ast/at_rule.rb +17 -0
  11. data/lib/minicss/ast/bad_token.rb +14 -0
  12. data/lib/minicss/ast/block.rb +29 -0
  13. data/lib/minicss/ast/decl.rb +17 -0
  14. data/lib/minicss/ast/decl_list.rb +18 -0
  15. data/lib/minicss/ast/dimension.rb +14 -0
  16. data/lib/minicss/ast/function.rb +15 -0
  17. data/lib/minicss/ast/number.rb +14 -0
  18. data/lib/minicss/ast/percentage.rb +8 -0
  19. data/lib/minicss/ast/rule.rb +28 -0
  20. data/lib/minicss/ast/string_token.rb +14 -0
  21. data/lib/minicss/ast/syntax_error.rb +13 -0
  22. data/lib/minicss/ast/unicode_range.rb +13 -0
  23. data/lib/minicss/ast/url.rb +13 -0
  24. data/lib/minicss/ast.rb +72 -0
  25. data/lib/minicss/css/ast/at_rule.rb +19 -0
  26. data/lib/minicss/css/ast/declaration.rb +21 -0
  27. data/lib/minicss/css/ast/declaration_list.rb +11 -0
  28. data/lib/minicss/css/ast/function.rb +20 -0
  29. data/lib/minicss/css/ast/qualified_rule.rb +19 -0
  30. data/lib/minicss/css/ast/simple_block.rb +37 -0
  31. data/lib/minicss/css/ast/stylesheet.rb +17 -0
  32. data/lib/minicss/css/ast.rb +9 -0
  33. data/lib/minicss/css/errors.rb +8 -0
  34. data/lib/minicss/css/parser.rb +360 -0
  35. data/lib/minicss/css/position.rb +15 -0
  36. data/lib/minicss/css/refinements.rb +78 -0
  37. data/lib/minicss/css/token.rb +28 -0
  38. data/lib/minicss/css/token_stream.rb +56 -0
  39. data/lib/minicss/css/tokenizer.rb +572 -0
  40. data/lib/minicss/css.rb +10 -0
  41. data/lib/minicss/errors.rb +6 -0
  42. data/lib/minicss/sel.rb +382 -0
  43. data/lib/minicss/serializer.rb +59 -0
  44. data/lib/minicss/version.rb +5 -0
  45. data/lib/minicss.rb +53 -0
  46. 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