less 0.8.13 → 1.0.4

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 (156) hide show
  1. data/README.md +10 -1
  2. data/Rakefile +21 -3
  3. data/VERSION +1 -1
  4. data/bin/lessc +0 -8
  5. data/less.gemspec +138 -15
  6. data/lib/less.rb +67 -11
  7. data/lib/less/command.rb +24 -25
  8. data/lib/less/engine.rb +36 -140
  9. data/lib/less/engine/builder.rb +8 -0
  10. data/lib/less/engine/less.tt +374 -0
  11. data/lib/less/engine/nodes.rb +8 -0
  12. data/lib/less/engine/nodes/element.rb +150 -0
  13. data/lib/less/engine/nodes/entity.rb +73 -0
  14. data/lib/less/engine/nodes/function.rb +82 -0
  15. data/lib/less/engine/nodes/literal.rb +135 -0
  16. data/lib/less/engine/nodes/property.rb +112 -0
  17. data/lib/less/engine/nodes/selector.rb +39 -0
  18. data/lib/less/engine/parser.rb +3860 -0
  19. data/lib/vendor/treetop/.gitignore +7 -0
  20. data/lib/vendor/treetop/LICENSE +19 -0
  21. data/lib/vendor/treetop/README +164 -0
  22. data/lib/vendor/treetop/Rakefile +19 -0
  23. data/lib/vendor/treetop/benchmark/seqpar.gnuplot +15 -0
  24. data/lib/vendor/treetop/benchmark/seqpar.treetop +16 -0
  25. data/lib/vendor/treetop/benchmark/seqpar_benchmark.rb +107 -0
  26. data/lib/vendor/treetop/bin/tt +28 -0
  27. data/lib/vendor/treetop/lib/treetop.rb +8 -0
  28. data/lib/vendor/treetop/lib/treetop/bootstrap_gen_1_metagrammar.rb +45 -0
  29. data/lib/vendor/treetop/lib/treetop/compiler.rb +6 -0
  30. data/lib/vendor/treetop/lib/treetop/compiler/grammar_compiler.rb +42 -0
  31. data/lib/vendor/treetop/lib/treetop/compiler/lexical_address_space.rb +17 -0
  32. data/lib/vendor/treetop/lib/treetop/compiler/metagrammar.rb +3097 -0
  33. data/lib/vendor/treetop/lib/treetop/compiler/metagrammar.treetop +408 -0
  34. data/lib/vendor/treetop/lib/treetop/compiler/node_classes.rb +19 -0
  35. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/anything_symbol.rb +18 -0
  36. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/atomic_expression.rb +14 -0
  37. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/character_class.rb +23 -0
  38. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/choice.rb +31 -0
  39. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/declaration_sequence.rb +24 -0
  40. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/grammar.rb +28 -0
  41. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/inline_module.rb +27 -0
  42. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/nonterminal.rb +13 -0
  43. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/optional.rb +19 -0
  44. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/parenthesized_expression.rb +9 -0
  45. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/parsing_expression.rb +146 -0
  46. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/parsing_rule.rb +55 -0
  47. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/predicate.rb +45 -0
  48. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/repetition.rb +55 -0
  49. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/sequence.rb +68 -0
  50. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/terminal.rb +20 -0
  51. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/transient_prefix.rb +9 -0
  52. data/lib/vendor/treetop/lib/treetop/compiler/node_classes/treetop_file.rb +9 -0
  53. data/lib/vendor/treetop/lib/treetop/compiler/ruby_builder.rb +113 -0
  54. data/lib/vendor/treetop/lib/treetop/ruby_extensions.rb +2 -0
  55. data/lib/vendor/treetop/lib/treetop/ruby_extensions/string.rb +42 -0
  56. data/lib/vendor/treetop/lib/treetop/runtime.rb +5 -0
  57. data/lib/vendor/treetop/lib/treetop/runtime/compiled_parser.rb +109 -0
  58. data/lib/vendor/treetop/lib/treetop/runtime/interval_skip_list.rb +4 -0
  59. data/lib/vendor/treetop/lib/treetop/runtime/interval_skip_list/head_node.rb +15 -0
  60. data/lib/vendor/treetop/lib/treetop/runtime/interval_skip_list/interval_skip_list.rb +200 -0
  61. data/lib/vendor/treetop/lib/treetop/runtime/interval_skip_list/node.rb +164 -0
  62. data/lib/vendor/treetop/lib/treetop/runtime/syntax_node.rb +90 -0
  63. data/lib/vendor/treetop/lib/treetop/runtime/terminal_parse_failure.rb +16 -0
  64. data/lib/vendor/treetop/lib/treetop/runtime/terminal_syntax_node.rb +17 -0
  65. data/lib/vendor/treetop/lib/treetop/version.rb +9 -0
  66. data/lib/vendor/treetop/spec/compiler/and_predicate_spec.rb +36 -0
  67. data/lib/vendor/treetop/spec/compiler/anything_symbol_spec.rb +44 -0
  68. data/lib/vendor/treetop/spec/compiler/character_class_spec.rb +247 -0
  69. data/lib/vendor/treetop/spec/compiler/choice_spec.rb +80 -0
  70. data/lib/vendor/treetop/spec/compiler/circular_compilation_spec.rb +28 -0
  71. data/lib/vendor/treetop/spec/compiler/failure_propagation_functional_spec.rb +21 -0
  72. data/lib/vendor/treetop/spec/compiler/grammar_compiler_spec.rb +84 -0
  73. data/lib/vendor/treetop/spec/compiler/grammar_spec.rb +41 -0
  74. data/lib/vendor/treetop/spec/compiler/nonterminal_symbol_spec.rb +40 -0
  75. data/lib/vendor/treetop/spec/compiler/not_predicate_spec.rb +38 -0
  76. data/lib/vendor/treetop/spec/compiler/one_or_more_spec.rb +35 -0
  77. data/lib/vendor/treetop/spec/compiler/optional_spec.rb +37 -0
  78. data/lib/vendor/treetop/spec/compiler/parenthesized_expression_spec.rb +19 -0
  79. data/lib/vendor/treetop/spec/compiler/parsing_rule_spec.rb +32 -0
  80. data/lib/vendor/treetop/spec/compiler/sequence_spec.rb +115 -0
  81. data/lib/vendor/treetop/spec/compiler/terminal_spec.rb +81 -0
  82. data/lib/vendor/treetop/spec/compiler/terminal_symbol_spec.rb +37 -0
  83. data/lib/vendor/treetop/spec/compiler/test_grammar.treetop +7 -0
  84. data/lib/vendor/treetop/spec/compiler/test_grammar.tt +7 -0
  85. data/lib/vendor/treetop/spec/compiler/test_grammar_do.treetop +7 -0
  86. data/lib/vendor/treetop/spec/compiler/zero_or_more_spec.rb +56 -0
  87. data/lib/vendor/treetop/spec/composition/a.treetop +11 -0
  88. data/lib/vendor/treetop/spec/composition/b.treetop +11 -0
  89. data/lib/vendor/treetop/spec/composition/c.treetop +10 -0
  90. data/lib/vendor/treetop/spec/composition/d.treetop +10 -0
  91. data/lib/vendor/treetop/spec/composition/f.treetop +17 -0
  92. data/lib/vendor/treetop/spec/composition/grammar_composition_spec.rb +40 -0
  93. data/lib/vendor/treetop/spec/composition/subfolder/e_includes_c.treetop +15 -0
  94. data/lib/vendor/treetop/spec/ruby_extensions/string_spec.rb +32 -0
  95. data/lib/vendor/treetop/spec/runtime/compiled_parser_spec.rb +101 -0
  96. data/lib/vendor/treetop/spec/runtime/interval_skip_list/delete_spec.rb +147 -0
  97. data/lib/vendor/treetop/spec/runtime/interval_skip_list/expire_range_spec.rb +349 -0
  98. data/lib/vendor/treetop/spec/runtime/interval_skip_list/insert_and_delete_node.rb +385 -0
  99. data/lib/vendor/treetop/spec/runtime/interval_skip_list/insert_spec.rb +660 -0
  100. data/lib/vendor/treetop/spec/runtime/interval_skip_list/interval_skip_list_spec.graffle +6175 -0
  101. data/lib/vendor/treetop/spec/runtime/interval_skip_list/interval_skip_list_spec.rb +58 -0
  102. data/lib/vendor/treetop/spec/runtime/interval_skip_list/palindromic_fixture.rb +23 -0
  103. data/lib/vendor/treetop/spec/runtime/interval_skip_list/palindromic_fixture_spec.rb +164 -0
  104. data/lib/vendor/treetop/spec/runtime/interval_skip_list/spec_helper.rb +84 -0
  105. data/lib/vendor/treetop/spec/runtime/syntax_node_spec.rb +68 -0
  106. data/lib/vendor/treetop/spec/spec_helper.rb +106 -0
  107. data/lib/vendor/treetop/spec/spec_suite.rb +4 -0
  108. data/lib/vendor/treetop/treetop.gemspec +17 -0
  109. data/spec/command_spec.rb +2 -6
  110. data/spec/css/accessors-1.0.css +18 -0
  111. data/spec/css/big-1.0.css +3768 -0
  112. data/spec/css/comments-1.0.css +9 -0
  113. data/spec/css/css-1.0.css +40 -0
  114. data/spec/css/functions-1.0.css +6 -0
  115. data/spec/css/import-1.0.css +11 -0
  116. data/spec/css/mixins-1.0.css +28 -0
  117. data/spec/css/operations-1.0.css +28 -0
  118. data/spec/css/rulesets-1.0.css +17 -0
  119. data/spec/css/scope-1.0.css +14 -0
  120. data/spec/css/strings-1.0.css +12 -0
  121. data/spec/css/variables-1.0.css +6 -0
  122. data/spec/css/whitespace-1.0.css +9 -0
  123. data/spec/engine_spec.rb +66 -18
  124. data/spec/less/accessors-1.0.less +20 -0
  125. data/spec/less/big-1.0.less +4810 -0
  126. data/spec/less/colors-1.0.less +0 -0
  127. data/spec/less/comments-1.0.less +46 -0
  128. data/spec/less/css-1.0.less +84 -0
  129. data/spec/less/exceptions/mixed-units-error.less +3 -0
  130. data/spec/less/exceptions/name-error-1.0.less +3 -0
  131. data/spec/less/exceptions/syntax-error-1.0.less +3 -0
  132. data/spec/less/functions-1.0.less +6 -0
  133. data/spec/less/import-1.0.less +7 -0
  134. data/spec/less/import/import-test-a.less +2 -0
  135. data/spec/less/import/import-test-b.less +8 -0
  136. data/spec/less/import/import-test-c.less +5 -0
  137. data/spec/less/mixins-1.0.less +43 -0
  138. data/spec/less/operations-1.0.less +39 -0
  139. data/spec/less/rulesets-1.0.less +30 -0
  140. data/spec/less/scope-1.0.less +33 -0
  141. data/spec/less/strings-1.0.less +14 -0
  142. data/spec/less/variables-1.0.less +18 -0
  143. data/spec/less/whitespace-1.0.less +21 -0
  144. data/spec/spec.css +79 -24
  145. data/spec/spec.less +2 -3
  146. data/spec/spec_helper.rb +4 -1
  147. metadata +136 -13
  148. data/lib/less/tree.rb +0 -82
  149. data/spec/css/less-0.8.10.css +0 -30
  150. data/spec/css/less-0.8.11.css +0 -31
  151. data/spec/css/less-0.8.12.css +0 -28
  152. data/spec/css/less-0.8.5.css +0 -24
  153. data/spec/css/less-0.8.6.css +0 -24
  154. data/spec/css/less-0.8.7.css +0 -24
  155. data/spec/css/less-0.8.8.css +0 -25
  156. data/spec/tree_spec.rb +0 -5
@@ -0,0 +1,8 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'engine/nodes/entity'
4
+ require 'engine/nodes/element'
5
+ require 'engine/nodes/property'
6
+ require 'engine/nodes/literal'
7
+ require 'engine/nodes/function'
8
+ require 'engine/nodes/selector'
@@ -0,0 +1,150 @@
1
+ module Less
2
+ module Node
3
+ #
4
+ # Element
5
+ #
6
+ # div {...}
7
+ #
8
+ # TODO: Look into making @rules its own hash-like class
9
+ # TODO: Look into whether selector should be child by default
10
+ #
11
+ class Element < ::String
12
+ include Enumerable
13
+ include Entity
14
+
15
+ attr_accessor :rules, :selector, :partial, :file
16
+
17
+ def initialize name = "", selector = ''
18
+ super name
19
+
20
+ @partial = false
21
+ @rules = [] # Holds all the nodes under this element's hierarchy
22
+ @selector = Selector[selector.strip].new # descendant | child | adjacent
23
+ end
24
+
25
+ def class?; self =~ /^\./ end
26
+ def id?; self =~ /^#/ end
27
+ def universal?; self == '*' end
28
+
29
+ def tag?
30
+ not id? || class? || universal?
31
+ end
32
+
33
+ # Top-most node?
34
+ def root?
35
+ self == '' && parent.nil?
36
+ end
37
+
38
+ def empty?
39
+ @rules.empty?
40
+ end
41
+
42
+ def leaf?
43
+ elements.empty?
44
+ end
45
+
46
+ #
47
+ # Accessors for the different nodes in @rules
48
+ #
49
+ def identifiers; @rules.select {|r| r.kind_of? Property } end
50
+ def properties; @rules.select {|r| r.instance_of? Property } end
51
+ def variables; @rules.select {|r| r.instance_of? Variable } end
52
+ def elements; @rules.select {|r| r.instance_of? Element } end
53
+
54
+ # Select a child element
55
+ # TODO: Implement full selector syntax & merge with descend()
56
+ def [] key
57
+ @rules.find {|i| i.to_s == key }
58
+ end
59
+
60
+ # Same as above, except with a specific selector
61
+ # TODO: clean this up or implement it differently
62
+ def descend selector, element
63
+ if selector.is_a? Child
64
+ s = self[element].selector
65
+ self[element] if s.is_a? Child or s.is_a? Descendant
66
+ elsif selector.is_a? Descendant
67
+ self[element]
68
+ else
69
+ self[element] if self[element].selector.class == selector.class
70
+ end
71
+ end
72
+
73
+ #
74
+ # Add an arbitrary node to this element
75
+ #
76
+ def << obj
77
+ if obj.kind_of? Node::Entity
78
+ obj.parent = self
79
+ @rules << obj
80
+ else
81
+ raise ArgumentError, "argument can't be a #{obj.class}"
82
+ end
83
+ end
84
+
85
+ def last; elements.last end
86
+ def first; elements.first end
87
+ def to_s; super end
88
+
89
+ #
90
+ # Entry point for the css conversion
91
+ #
92
+ def to_css path = []
93
+ path << @selector.to_css << self unless root?
94
+
95
+ content = properties.map do |i|
96
+ ' ' * 2 + i.to_css
97
+ end.compact.reject(&:empty?) * "\n"
98
+
99
+ content = content.include?("\n") ?
100
+ "\n#{content}\n" : " #{content.strip} "
101
+ ruleset = !content.strip.empty??
102
+ "#{path.reject(&:empty?).join.strip} {#{content}}\n" : ""
103
+
104
+ css = ruleset + elements.map do |i|
105
+ i.to_css(path)
106
+ end.reject(&:empty?).join
107
+ path.pop; path.pop
108
+ css
109
+ end
110
+
111
+ #
112
+ # Find the nearest variable in the hierarchy or raise a NameError
113
+ #
114
+ def nearest ident
115
+ ary = ident =~ /^[.#]/ ? :elements : :variables
116
+ path.map do |node|
117
+ node.send(ary).find {|i| i.to_s == ident }
118
+ end.compact.first.tap do |result|
119
+ raise VariableNameError, ident unless result
120
+ end
121
+ end
122
+
123
+ #
124
+ # Traverse the whole tree, returning each leaf (recursive)
125
+ #
126
+ def each path = [], &blk
127
+ elements.each do |element|
128
+ path << element
129
+ yield element, path if element.leaf?
130
+ element.each path, &blk
131
+ path.pop
132
+ end
133
+ self
134
+ end
135
+ alias :traverse :each
136
+
137
+ def inspect depth = 0
138
+ indent = lambda {|i| '. ' * i }
139
+ put = lambda {|ary| ary.map {|i| indent[ depth + 1 ] + i.inspect } * "\n"}
140
+
141
+ (root?? "\n" : "") + [
142
+ indent[ depth ] + (self == '' ? '*' : self.to_s),
143
+ put[ properties ],
144
+ put[ variables ],
145
+ elements.map {|i| i.inspect( depth + 1 ) } * "\n"
146
+ ].reject(&:empty?).join("\n") + "\n" + indent[ depth ]
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,73 @@
1
+ module Less
2
+ #
3
+ # Node::Entity
4
+ #
5
+ # Everything in the tree is an Entity
6
+ #
7
+ # Mixin/Class hierarchy
8
+ #
9
+ # - Entity
10
+ # - Element
11
+ # - Entity
12
+ # - Function
13
+ # - Keyword
14
+ # - Literal
15
+ # - Color
16
+ # - Number
17
+ # - String
18
+ # - FontFamily
19
+ # - Property
20
+ # - Variable
21
+ #
22
+ # TODO: Use delegate class -> @rules
23
+ #
24
+ module Node
25
+ module Entity
26
+ attr_accessor :parent
27
+
28
+ def initialize value, parent = nil
29
+ super value
30
+ @parent = parent
31
+ end
32
+
33
+ #
34
+ # Returns the path from any given node, to the root
35
+ #
36
+ # ex: ['color', 'p', '#header', 'body', '*']
37
+ #
38
+ def path node = self
39
+ path = []
40
+ while node do
41
+ path << node
42
+ node = node.parent
43
+ end
44
+ path
45
+ end
46
+
47
+ def root
48
+ path.last
49
+ end
50
+
51
+ def inspect; to_s end
52
+ def to_css; to_s end
53
+ def to_s; super end
54
+ end
55
+
56
+ #
57
+ # An anonymous node, for all the 'other' stuff
58
+ # which doesn't need any specific functionality.
59
+ #
60
+ class Anonymous < ::String
61
+ include Entity
62
+ end
63
+
64
+ #
65
+ # + * - /
66
+ #
67
+ class Operator < ::String
68
+ def to_ruby
69
+ self
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,82 @@
1
+ module Less
2
+ #
3
+ # Functions useable from within the style-sheet go here
4
+ #
5
+ module Functions
6
+ def rgb *rgb
7
+ rgba rgb, 1.0
8
+ end
9
+
10
+ def hsl *args
11
+ hsla args, 1.0
12
+ end
13
+
14
+ #
15
+ # RGBA to Node::Color
16
+ #
17
+ def rgba *rgba
18
+ r, g, b, a = rgba.flatten
19
+ hex = [r, g, b].inject("") do |str, c|
20
+ c = c.to_i.to_s(16)
21
+ c = '0' + c if c.length < 2
22
+ str + c
23
+ end
24
+ Node::Color.new hex, a
25
+ end
26
+
27
+ #
28
+ # HSLA to RGBA
29
+ #
30
+ def hsla h, s, l, a = 1.0
31
+ m2 = ( l <= 0.5 ) ? l * ( s + 1 ) : l + s - l * s
32
+ m1 = l * 2 - m2;
33
+
34
+ hue = lambda do |h|
35
+ h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h)
36
+ if h * 6 < 1 then m1 + (m2 - m1) * h * 6
37
+ elsif h * 2 < 1 then m2
38
+ elsif h * 3 < 2 then m1 + (m2 - m1) * (2/3 - h) * 6
39
+ else m1
40
+ end
41
+ end
42
+
43
+ rgba hue[ h + 1/3 ], hue[ h ], hue[ h - 1/3 ], a
44
+ end
45
+ end
46
+
47
+ module Node
48
+ #
49
+ # A CSS function, like rgb() or url()
50
+ #
51
+ # it calls functions from the Functions module
52
+ #
53
+ class Function < ::String
54
+ include Functions
55
+ include Entity
56
+
57
+ def initialize name, *args
58
+ @args = args.flatten
59
+ super name
60
+ end
61
+
62
+ def to_css
63
+ self.evaluate.to_css
64
+ end
65
+
66
+ #
67
+ # Call the function
68
+ #
69
+ def evaluate
70
+ send self.to_sym, *@args
71
+ end
72
+
73
+ #
74
+ # If the function isn't found, we just print it out,
75
+ # this is the case for url(), for example,
76
+ #
77
+ def method_missing meth, *args
78
+ Node::Anonymous.new("#{meth}(#{args.map(&:to_css) * ', '})")
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,135 @@
1
+ module Less
2
+ module Node
3
+ module Literal
4
+ include Entity
5
+
6
+ def unit
7
+ nil
8
+ end
9
+ end
10
+
11
+ #
12
+ # rgb(255, 0, 0) #f0f0f0
13
+ #
14
+ class Color < DelegateClass(Fixnum)
15
+ include Literal
16
+ attr_reader :color
17
+
18
+ def initialize color = nil, opacity = 1.0
19
+ @color = if color.is_a? Array
20
+ rgba color
21
+ elsif color.is_a? ::String
22
+ color.delete! unit
23
+ (color * ( color.length < 6 ? 6 / color.length : 1 )).to_i 16
24
+ else
25
+ color
26
+ end
27
+ super @color.to_i
28
+ end
29
+
30
+ def unit
31
+ '#'
32
+ end
33
+
34
+ def to_css
35
+ unit + (self <= 0 ? '0' * 6 : self.to_i.to_s(16))
36
+ end
37
+
38
+ def to_ruby
39
+ color
40
+ end
41
+
42
+ def to_s
43
+ "#{unit}#{super}"
44
+ end
45
+
46
+ def inspect; to_s end
47
+ end
48
+
49
+ #
50
+ # 6 10px 125%
51
+ #
52
+ class Number < DelegateClass(Float)
53
+ include Literal
54
+
55
+ attr_accessor :unit
56
+
57
+ def initialize value, unit = nil
58
+ super value.to_f
59
+ @unit = (unit.nil? || unit.empty?) ? nil : unit
60
+ end
61
+
62
+ def to_s
63
+ "#{super}#@unit"
64
+ end
65
+
66
+ def to_ruby
67
+ self.to_f
68
+ end
69
+
70
+ def inspect
71
+ to_s
72
+ end
73
+
74
+ def to_css
75
+ "#{(self % 1).zero?? "#{self.to_i}#@unit" : self}"
76
+ end
77
+ end
78
+
79
+ #
80
+ # "hello world"
81
+ #
82
+ class String < ::String
83
+ include Literal
84
+
85
+ attr_reader :quotes, :content
86
+
87
+ # Strip quotes if necessary, and save them in @quotes
88
+ def initialize str
89
+ @quotes, @content = unless str.nil? or str.empty?
90
+ str.match(/('|")(.*?)(\1)/).captures rescue [nil, str]
91
+ else
92
+ [nil, ""]
93
+ end
94
+ super @content
95
+ end
96
+
97
+ def to_css
98
+ "#@quotes#{@content}#@quotes"
99
+ end
100
+ end
101
+
102
+ class Font
103
+ include Literal
104
+ end
105
+
106
+ class FontFamily < Array
107
+ include Literal
108
+
109
+ def initialize family = []
110
+ super family
111
+ end
112
+
113
+ def to_css
114
+ self.map(&:to_css) * ', '
115
+ end
116
+ end
117
+
118
+ #
119
+ # Any un-quoted word
120
+ #
121
+ # ex: red, small, border-collapse
122
+ #
123
+ class Keyword < ::String
124
+ include Entity
125
+
126
+ def to_css
127
+ self
128
+ end
129
+
130
+ def inspect
131
+ "#{self}"
132
+ end
133
+ end
134
+ end
135
+ end