habaki 0.5.1 → 0.5.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.
- checksums.yaml +4 -4
- data/ext/katana/extconf.rb +1 -1
- data/ext/katana/rb_katana.h +2 -0
- data/ext/katana/rb_katana_declaration.c +8 -14
- data/ext/katana/rb_katana_selector.c +1 -1
- data/lib/habaki/charset_rule.rb +1 -1
- data/lib/habaki/declarations.rb +45 -14
- data/lib/habaki/formal_syntax.rb +3 -3
- data/lib/habaki/rules.rb +1 -1
- data/lib/habaki/sub_selectors.rb +6 -0
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07aac3ef018685ae5ba014eae5369fffc0e74d3a0f4219d7caa005f7d359d14b
|
4
|
+
data.tar.gz: 51b5777e6cc9d2b6ead583aa259965d1c78ccfac535214cb058328263b83d2d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8099f0147a9acf50cea501484328e0b4d737a02daf6c6cce6547b9eb94071fe4e98d4b06c8571c0b635244378531bddf43343ad48d30cbb320876feb77f9552b
|
7
|
+
data.tar.gz: 1fad3480648acc3247ffd822d1136dbfa20120c3f402c346200027c21da0bd4868a0f8a4b0e6a6233ae125dc9ac4e1328078e14c2d43e3ea701ab4bd7a83f824
|
data/ext/katana/extconf.rb
CHANGED
@@ -10,7 +10,7 @@ src/katana-parser/parser.c src/katana-parser/selector.c src/katana-parser/tokeni
|
|
10
10
|
src/rb_katana_array.c src/rb_katana_selector.c src/rb_katana_declaration.c src/rb_katana_rule.c src/rb_katana.c
|
11
11
|
}
|
12
12
|
|
13
|
-
$INCFLAGS << " -I$(srcdir)/src"
|
13
|
+
$INCFLAGS << " -std=c99 -I$(srcdir)/src"
|
14
14
|
|
15
15
|
# add folder, where compiler can search source files
|
16
16
|
$VPATH << "$(srcdir)/src"
|
data/ext/katana/rb_katana.h
CHANGED
@@ -13,7 +13,7 @@ VALUE rb_declaration_prop(VALUE self)
|
|
13
13
|
KatanaDeclaration *c_decl;
|
14
14
|
Data_Get_Struct(self, KatanaDeclaration, c_decl);
|
15
15
|
if (c_decl->property)
|
16
|
-
return
|
16
|
+
return UTF8_STR_NEW(c_decl->property);
|
17
17
|
else
|
18
18
|
Qnil;
|
19
19
|
}
|
@@ -286,10 +286,10 @@ VALUE rb_value_value(VALUE self)
|
|
286
286
|
val = rb_float_new(c_val->fValue);
|
287
287
|
break;
|
288
288
|
case KATANA_VALUE_IDENT:
|
289
|
-
val =
|
289
|
+
val = UTF8_STR_NEW(c_val->string);
|
290
290
|
break;
|
291
291
|
case KATANA_VALUE_STRING:
|
292
|
-
val =
|
292
|
+
val = UTF8_STR_NEW(c_val->string);
|
293
293
|
break;
|
294
294
|
case KATANA_VALUE_PARSER_FUNCTION:
|
295
295
|
{
|
@@ -304,19 +304,19 @@ VALUE rb_value_value(VALUE self)
|
|
304
304
|
// return katana_stringify_value_list(parser, value->list);
|
305
305
|
break;
|
306
306
|
case KATANA_VALUE_PARSER_HEXCOLOR:
|
307
|
-
val =
|
307
|
+
val = UTF8_STR_NEW(c_val->string);
|
308
308
|
break;
|
309
309
|
case KATANA_VALUE_URI:
|
310
|
-
val =
|
310
|
+
val = UTF8_STR_NEW(c_val->string);
|
311
311
|
break;
|
312
312
|
case KATANA_VALUE_UNICODE_RANGE:
|
313
|
-
val =
|
313
|
+
val = UTF8_STR_NEW(c_val->string);
|
314
314
|
break;
|
315
315
|
case KATANA_VALUE_DIMENSION:
|
316
|
-
val =
|
316
|
+
val = UTF8_STR_NEW(c_val->string);
|
317
317
|
break;
|
318
318
|
case KATANA_VALUE_UNKNOWN:
|
319
|
-
val =
|
319
|
+
val = UTF8_STR_NEW(c_val->string);
|
320
320
|
break;
|
321
321
|
default:
|
322
322
|
fprintf(stderr, "KATANA: unsupported value unit %d (%s)\n", c_val->unit, c_val->string);
|
@@ -371,12 +371,6 @@ void init_katana_declaration()
|
|
371
371
|
|
372
372
|
rb_define_method(rb_Declaration, "position", rb_declaration_position, 0);
|
373
373
|
|
374
|
-
// Declaration
|
375
|
-
rb_Declaration = rb_define_class_under(rb_Katana, "Declaration", rb_cObject);
|
376
|
-
rb_define_method(rb_Declaration, "property", rb_declaration_prop, 0);
|
377
|
-
rb_define_method(rb_Declaration, "important", rb_declaration_important, 0);
|
378
|
-
rb_define_method(rb_Declaration, "values", rb_declaration_values, 0);
|
379
|
-
|
380
374
|
// Value
|
381
375
|
rb_Value = rb_define_class_under(rb_Katana, "Value", rb_cObject);
|
382
376
|
rb_define_method(rb_Value, "value", rb_value_value, 0);
|
data/lib/habaki/charset_rule.rb
CHANGED
data/lib/habaki/declarations.rb
CHANGED
@@ -98,8 +98,8 @@ module Habaki
|
|
98
98
|
props[match.reference] << match.value
|
99
99
|
end
|
100
100
|
|
101
|
-
props.each do |
|
102
|
-
new_decl = add_by_property(
|
101
|
+
props.each do |prop, values|
|
102
|
+
new_decl = add_by_property(prop, values)
|
103
103
|
new_decl.position = declaration.position
|
104
104
|
end
|
105
105
|
|
@@ -122,10 +122,10 @@ module Habaki
|
|
122
122
|
border_style_properties = %w[border-width border-style border-color]
|
123
123
|
|
124
124
|
border_style_properties.each do |prop|
|
125
|
-
create_shorthand_properties! prop unless
|
125
|
+
create_shorthand_properties! prop unless has_property?(prop)
|
126
126
|
end
|
127
127
|
|
128
|
-
create_shorthand_properties! 'border' if border_style_properties.map{|prop|
|
128
|
+
create_shorthand_properties! 'border' if border_style_properties.map{|prop| has_property?(prop)}.all?
|
129
129
|
end
|
130
130
|
|
131
131
|
# Looks for long format CSS background properties (e.g. <tt>background-color</tt>) and
|
@@ -159,15 +159,37 @@ module Habaki
|
|
159
159
|
create_shorthand_properties! 'list-style'
|
160
160
|
end
|
161
161
|
|
162
|
+
def self.shorthand_properties(shorthand_property)
|
163
|
+
nodes = []
|
164
|
+
FormalSyntax::Tree.tree.property("--shorthand-"+shorthand_property).traverse do |node|
|
165
|
+
nodes << {type: node.type, value: node.value, next_value: node.parent&.children&.last&.value} if [:ref, :token].include?(node.type)
|
166
|
+
end
|
167
|
+
nodes
|
168
|
+
end
|
169
|
+
|
170
|
+
PRECOMPUTED_SHORTHAND_PROPS = {
|
171
|
+
"background" => shorthand_properties("background"),
|
172
|
+
"font" => shorthand_properties("font"),
|
173
|
+
"list-style" => shorthand_properties("list-style"),
|
174
|
+
"border" => shorthand_properties("border"),
|
175
|
+
"border-top" => shorthand_properties("border-top"),
|
176
|
+
"border-bottom" => shorthand_properties("border-bottom"),
|
177
|
+
"border-left" => shorthand_properties("border-left"),
|
178
|
+
"border-right" => shorthand_properties("border-right"),
|
179
|
+
"border-width" => shorthand_properties("border-width"),
|
180
|
+
"border-style" => shorthand_properties("border-style"),
|
181
|
+
"border-color" => shorthand_properties("border-color"),
|
182
|
+
}
|
183
|
+
|
162
184
|
# Combine several properties into a shorthand one
|
163
185
|
def create_shorthand_properties!(shorthand_property, need_all = false)
|
164
186
|
properties_to_delete = []
|
165
|
-
|
166
187
|
new_values = []
|
167
|
-
|
168
|
-
|
188
|
+
|
189
|
+
PRECOMPUTED_SHORTHAND_PROPS[shorthand_property].each do |node|
|
190
|
+
case node[:type]
|
169
191
|
when :ref
|
170
|
-
decl = find_by_property(node
|
192
|
+
decl = find_by_property(node[:value])
|
171
193
|
if decl
|
172
194
|
properties_to_delete << decl.property
|
173
195
|
new_values += decl.values
|
@@ -176,7 +198,7 @@ module Habaki
|
|
176
198
|
end
|
177
199
|
when :token
|
178
200
|
# only if next node property is present (line-height, background-size)
|
179
|
-
new_values << Operator.new(node
|
201
|
+
new_values << Operator.new(node[:value]) if node[:next_value] && has_property?(node[:next_value])
|
180
202
|
end
|
181
203
|
end
|
182
204
|
|
@@ -251,11 +273,6 @@ module Habaki
|
|
251
273
|
decls
|
252
274
|
end
|
253
275
|
|
254
|
-
def push_declaration(decl)
|
255
|
-
@hash[decl.property] = decl
|
256
|
-
push decl
|
257
|
-
end
|
258
|
-
|
259
276
|
# Parse inline declarations and append to current declarations
|
260
277
|
# @param [String] data
|
261
278
|
# @return [void]
|
@@ -268,6 +285,12 @@ module Habaki
|
|
268
285
|
end
|
269
286
|
end
|
270
287
|
|
288
|
+
# Does declaration with property present ?
|
289
|
+
# @return [Boolean]
|
290
|
+
def has_property?(property)
|
291
|
+
@hash.has_key?(property)
|
292
|
+
end
|
293
|
+
|
271
294
|
# Find declaration with property
|
272
295
|
# @param [String] property
|
273
296
|
# @return [Declaration]
|
@@ -342,5 +365,13 @@ module Habaki
|
|
342
365
|
push_declaration Declaration.read_from_katana(decl)
|
343
366
|
end
|
344
367
|
end
|
368
|
+
|
369
|
+
private
|
370
|
+
|
371
|
+
def push_declaration(decl)
|
372
|
+
@hash[decl.property] = decl
|
373
|
+
push decl
|
374
|
+
end
|
375
|
+
|
345
376
|
end
|
346
377
|
end
|
data/lib/habaki/formal_syntax.rb
CHANGED
@@ -28,7 +28,7 @@ module Habaki
|
|
28
28
|
def traverse(&block)
|
29
29
|
block.call self
|
30
30
|
@children.each do |child|
|
31
|
-
child.traverse
|
31
|
+
child.traverse(&block)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -67,7 +67,7 @@ module Habaki
|
|
67
67
|
when :token
|
68
68
|
str += @value
|
69
69
|
when :ref
|
70
|
-
str += "'#{@value}'"
|
70
|
+
str += "<'#{@value}'>"
|
71
71
|
when :type
|
72
72
|
str += "<#{@value}>"
|
73
73
|
else
|
@@ -111,7 +111,7 @@ module Habaki
|
|
111
111
|
data.each do |k, v|
|
112
112
|
begin
|
113
113
|
@properties[k] = Tree.parse(v)
|
114
|
-
rescue FormalSyntaxError
|
114
|
+
rescue FormalSyntaxError #=> e
|
115
115
|
#STDERR.puts("#{k}: #{e}")
|
116
116
|
end
|
117
117
|
end
|
data/lib/habaki/rules.rb
CHANGED
data/lib/habaki/sub_selectors.rb
CHANGED
@@ -4,6 +4,12 @@ module Habaki
|
|
4
4
|
# @return [Symbol]
|
5
5
|
attr_accessor :relation
|
6
6
|
|
7
|
+
def initialize(*args)
|
8
|
+
super(*args)
|
9
|
+
|
10
|
+
@relation = nil
|
11
|
+
end
|
12
|
+
|
7
13
|
# does every sub selectors match {Visitor::Element} ?
|
8
14
|
# @param [Visitor::Element] element
|
9
15
|
# @param [Specificity, nil] specificity
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: habaki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julien Boulnois
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -28,30 +28,30 @@ dependencies:
|
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: minitest
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|