habaki 0.5.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/Gemfile +3 -0
- data/ext/katana/extconf.rb +20 -0
- data/ext/katana/rb_katana.c +280 -0
- data/ext/katana/rb_katana.h +102 -0
- data/ext/katana/rb_katana_array.c +144 -0
- data/ext/katana/rb_katana_declaration.c +389 -0
- data/ext/katana/rb_katana_rule.c +461 -0
- data/ext/katana/rb_katana_selector.c +559 -0
- data/ext/katana/src/foundation.c +237 -0
- data/ext/katana/src/foundation.h +120 -0
- data/ext/katana/src/katana.h +590 -0
- data/ext/katana/src/katana.lex.c +4104 -0
- data/ext/katana/src/katana.lex.h +592 -0
- data/ext/katana/src/katana.tab.c +4422 -0
- data/ext/katana/src/katana.tab.h +262 -0
- data/ext/katana/src/parser.c +1563 -0
- data/ext/katana/src/parser.h +237 -0
- data/ext/katana/src/selector.c +659 -0
- data/ext/katana/src/selector.h +54 -0
- data/ext/katana/src/tokenizer.c +300 -0
- data/ext/katana/src/tokenizer.h +41 -0
- data/lib/habaki/charset_rule.rb +25 -0
- data/lib/habaki/declaration.rb +53 -0
- data/lib/habaki/declarations.rb +346 -0
- data/lib/habaki/error.rb +43 -0
- data/lib/habaki/font_face_rule.rb +24 -0
- data/lib/habaki/formal_syntax.rb +464 -0
- data/lib/habaki/formatter.rb +99 -0
- data/lib/habaki/import_rule.rb +34 -0
- data/lib/habaki/media_rule.rb +173 -0
- data/lib/habaki/namespace_rule.rb +31 -0
- data/lib/habaki/node.rb +52 -0
- data/lib/habaki/page_rule.rb +24 -0
- data/lib/habaki/qualified_name.rb +29 -0
- data/lib/habaki/rule.rb +48 -0
- data/lib/habaki/rules.rb +225 -0
- data/lib/habaki/selector.rb +98 -0
- data/lib/habaki/selectors.rb +49 -0
- data/lib/habaki/style_rule.rb +35 -0
- data/lib/habaki/stylesheet.rb +158 -0
- data/lib/habaki/sub_selector.rb +234 -0
- data/lib/habaki/sub_selectors.rb +42 -0
- data/lib/habaki/supports_rule.rb +65 -0
- data/lib/habaki/value.rb +321 -0
- data/lib/habaki/values.rb +86 -0
- data/lib/habaki/visitor/element.rb +50 -0
- data/lib/habaki/visitor/media.rb +22 -0
- data/lib/habaki/visitor/nokogiri_element.rb +56 -0
- data/lib/habaki.rb +39 -0
- metadata +190 -0
@@ -0,0 +1,461 @@
|
|
1
|
+
#include "rb_katana.h"
|
2
|
+
|
3
|
+
// SupportsRule
|
4
|
+
|
5
|
+
/*
|
6
|
+
* @return [Symbol]
|
7
|
+
*/
|
8
|
+
VALUE rb_supports_exp_op(VALUE self)
|
9
|
+
{
|
10
|
+
ID id;
|
11
|
+
KatanaSupportsExp *c_exp;
|
12
|
+
Data_Get_Struct(self, KatanaSupportsExp, c_exp);
|
13
|
+
|
14
|
+
switch (c_exp->op)
|
15
|
+
{
|
16
|
+
case KatanaSupportsOperatorNone:
|
17
|
+
id = rb_intern("none");
|
18
|
+
break;
|
19
|
+
case KatanaSupportsOperatorNot:
|
20
|
+
id = rb_intern("not");
|
21
|
+
break;
|
22
|
+
case KatanaSupportsOperatorAnd:
|
23
|
+
id = rb_intern("and");
|
24
|
+
break;
|
25
|
+
case KatanaSupportsOperatorOr:
|
26
|
+
id = rb_intern("or");
|
27
|
+
break;
|
28
|
+
default:
|
29
|
+
id = rb_intern("unknown");
|
30
|
+
break;
|
31
|
+
}
|
32
|
+
return ID2SYM(id);
|
33
|
+
}
|
34
|
+
|
35
|
+
VALUE rb_supports_exp_exps(VALUE self)
|
36
|
+
{
|
37
|
+
KatanaSupportsExp *c_exp;
|
38
|
+
Data_Get_Struct(self, KatanaSupportsExp, c_exp);
|
39
|
+
|
40
|
+
if (c_exp->exps)
|
41
|
+
{
|
42
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_exp->exps);
|
43
|
+
|
44
|
+
VALUE sing = rb_singleton_class(array);
|
45
|
+
rb_define_method(sing, "each", rb_supports_expression_each, 0);
|
46
|
+
|
47
|
+
return array;
|
48
|
+
}
|
49
|
+
else
|
50
|
+
return Qnil;
|
51
|
+
}
|
52
|
+
|
53
|
+
VALUE rb_supports_exp_declaration(VALUE self)
|
54
|
+
{
|
55
|
+
KatanaSupportsExp *c_exp;
|
56
|
+
Data_Get_Struct(self, KatanaSupportsExp, c_exp);
|
57
|
+
if (c_exp->decl)
|
58
|
+
{
|
59
|
+
VALUE array = Data_Wrap_Struct(rb_Declaration, NULL, NULL, c_exp->decl);
|
60
|
+
}
|
61
|
+
else
|
62
|
+
return Qnil;
|
63
|
+
}
|
64
|
+
|
65
|
+
VALUE rb_supports_rules(VALUE self)
|
66
|
+
{
|
67
|
+
KatanaSupportsRule *c_rule;
|
68
|
+
Data_Get_Struct(self, KatanaSupportsRule, c_rule);
|
69
|
+
|
70
|
+
if (c_rule->rules)
|
71
|
+
{
|
72
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_rule->rules);
|
73
|
+
|
74
|
+
VALUE sing = rb_singleton_class(array);
|
75
|
+
rb_define_method(sing, "each", rb_rule_each, 0);
|
76
|
+
|
77
|
+
return array;
|
78
|
+
}
|
79
|
+
else
|
80
|
+
return Qnil;
|
81
|
+
}
|
82
|
+
|
83
|
+
VALUE rb_supports_exp(VALUE self)
|
84
|
+
{
|
85
|
+
KatanaSupportsRule *c_rule;
|
86
|
+
Data_Get_Struct(self, KatanaSupportsRule, c_rule);
|
87
|
+
|
88
|
+
if (c_rule->exp)
|
89
|
+
{
|
90
|
+
VALUE exp = Data_Wrap_Struct(rb_SupportsExp, NULL, NULL, c_rule->exp);
|
91
|
+
return exp;
|
92
|
+
}
|
93
|
+
else
|
94
|
+
return Qnil;
|
95
|
+
}
|
96
|
+
|
97
|
+
// NamespaceRule
|
98
|
+
|
99
|
+
/*
|
100
|
+
* @return [String, nil]
|
101
|
+
*/
|
102
|
+
VALUE rb_namespace_rule_prefix(VALUE self)
|
103
|
+
{
|
104
|
+
KatanaNamespaceRule *c_rule;
|
105
|
+
Data_Get_Struct(self, KatanaNamespaceRule, c_rule);
|
106
|
+
if (c_rule->prefix)
|
107
|
+
return rb_str_new2(c_rule->prefix);
|
108
|
+
else
|
109
|
+
return Qnil;
|
110
|
+
}
|
111
|
+
|
112
|
+
/*
|
113
|
+
* @return [String, nil]
|
114
|
+
*/
|
115
|
+
VALUE rb_namespace_rule_uri(VALUE self)
|
116
|
+
{
|
117
|
+
KatanaNamespaceRule *c_rule;
|
118
|
+
Data_Get_Struct(self, KatanaNamespaceRule, c_rule);
|
119
|
+
if (c_rule->prefix)
|
120
|
+
return rb_str_new2(c_rule->uri);
|
121
|
+
else
|
122
|
+
return Qnil;
|
123
|
+
}
|
124
|
+
|
125
|
+
// MediaRule
|
126
|
+
|
127
|
+
/*
|
128
|
+
* @return [Katana::Array]
|
129
|
+
*/
|
130
|
+
VALUE rb_media_rule_rules(VALUE self)
|
131
|
+
{
|
132
|
+
KatanaMediaRule *c_media_rule;
|
133
|
+
Data_Get_Struct(self, KatanaMediaRule, c_media_rule);
|
134
|
+
|
135
|
+
if (c_media_rule->rules)
|
136
|
+
{
|
137
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_media_rule->rules);
|
138
|
+
|
139
|
+
VALUE sing = rb_singleton_class(array);
|
140
|
+
rb_define_method(sing, "each", rb_rule_each, 0);
|
141
|
+
|
142
|
+
return array;
|
143
|
+
}
|
144
|
+
else
|
145
|
+
return Qnil;
|
146
|
+
}
|
147
|
+
|
148
|
+
/*
|
149
|
+
* @return [Katana::Array<Katana::MediaQuery>]
|
150
|
+
*/
|
151
|
+
VALUE rb_media_rule_medias(VALUE self)
|
152
|
+
{
|
153
|
+
KatanaMediaRule *c_media_rule;
|
154
|
+
Data_Get_Struct(self, KatanaMediaRule, c_media_rule);
|
155
|
+
|
156
|
+
if (c_media_rule->medias)
|
157
|
+
{
|
158
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_media_rule->medias);
|
159
|
+
VALUE sing = rb_singleton_class(array);
|
160
|
+
rb_define_method(sing, "each", rb_media_query_each, 0);
|
161
|
+
|
162
|
+
return array;
|
163
|
+
}
|
164
|
+
else
|
165
|
+
return Qnil;
|
166
|
+
}
|
167
|
+
|
168
|
+
// MediaQueryExp
|
169
|
+
|
170
|
+
/*
|
171
|
+
* @return [String, nil]
|
172
|
+
*/
|
173
|
+
VALUE rb_media_query_exp_feature(VALUE self)
|
174
|
+
{
|
175
|
+
KatanaMediaQueryExp *c_query;
|
176
|
+
Data_Get_Struct(self, KatanaMediaQueryExp, c_query);
|
177
|
+
if (c_query->feature)
|
178
|
+
return rb_str_new2(c_query->feature);
|
179
|
+
else
|
180
|
+
return Qnil;
|
181
|
+
}
|
182
|
+
|
183
|
+
/*
|
184
|
+
* @return [Katana::Array<Katana::Value>, nil]
|
185
|
+
*/
|
186
|
+
VALUE rb_media_query_exp_values(VALUE self)
|
187
|
+
{
|
188
|
+
KatanaMediaQueryExp *c_query;
|
189
|
+
Data_Get_Struct(self, KatanaMediaQueryExp, c_query);
|
190
|
+
|
191
|
+
if (c_query->values)
|
192
|
+
{
|
193
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_query->values);
|
194
|
+
|
195
|
+
VALUE sing = rb_singleton_class(array);
|
196
|
+
rb_define_method(sing, "each", rb_value_each, 0);
|
197
|
+
|
198
|
+
return array;
|
199
|
+
}
|
200
|
+
else
|
201
|
+
return Qnil;
|
202
|
+
}
|
203
|
+
|
204
|
+
// MediaQuery
|
205
|
+
|
206
|
+
/*
|
207
|
+
* @return [String]
|
208
|
+
*/
|
209
|
+
VALUE rb_media_query_type(VALUE self)
|
210
|
+
{
|
211
|
+
KatanaMediaQuery *c_query;
|
212
|
+
Data_Get_Struct(self, KatanaMediaQuery, c_query);
|
213
|
+
if (c_query->type)
|
214
|
+
return rb_str_new2(c_query->type);
|
215
|
+
else
|
216
|
+
return Qnil;
|
217
|
+
}
|
218
|
+
|
219
|
+
/*
|
220
|
+
* @return [Symbol]
|
221
|
+
*/
|
222
|
+
VALUE rb_media_query_restrictor(VALUE self)
|
223
|
+
{
|
224
|
+
ID id;
|
225
|
+
KatanaMediaQuery *c_query;
|
226
|
+
Data_Get_Struct(self, KatanaMediaQuery, c_query);
|
227
|
+
switch (c_query->restrictor)
|
228
|
+
{
|
229
|
+
case KatanaMediaQueryRestrictorNone:
|
230
|
+
id = rb_intern("none");
|
231
|
+
break;
|
232
|
+
case KatanaMediaQueryRestrictorOnly:
|
233
|
+
id = rb_intern("only");
|
234
|
+
break;
|
235
|
+
case KatanaMediaQueryRestrictorNot:
|
236
|
+
id = rb_intern("not");
|
237
|
+
break;
|
238
|
+
default:
|
239
|
+
id = rb_intern("undefined");
|
240
|
+
break;
|
241
|
+
}
|
242
|
+
return ID2SYM(id);
|
243
|
+
}
|
244
|
+
|
245
|
+
/*
|
246
|
+
* @return [Katana::Array<Katana::MediaQueryExpression>]
|
247
|
+
*/
|
248
|
+
VALUE rb_media_query_expressions(VALUE self)
|
249
|
+
{
|
250
|
+
KatanaMediaQuery *c_query;
|
251
|
+
Data_Get_Struct(self, KatanaMediaQuery, c_query);
|
252
|
+
|
253
|
+
if (c_query->expressions)
|
254
|
+
{
|
255
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_query->expressions);
|
256
|
+
|
257
|
+
VALUE sing = rb_singleton_class(array);
|
258
|
+
rb_define_method(sing, "each", rb_expression_each, 0);
|
259
|
+
|
260
|
+
return array;
|
261
|
+
}
|
262
|
+
else
|
263
|
+
return Qnil;
|
264
|
+
}
|
265
|
+
|
266
|
+
// PageRule
|
267
|
+
|
268
|
+
/*
|
269
|
+
* @return [Katana::Array<Katana::Declaration>]
|
270
|
+
*/
|
271
|
+
VALUE rb_page_rule_declarations(VALUE self)
|
272
|
+
{
|
273
|
+
KatanaPageRule *c_rule;
|
274
|
+
Data_Get_Struct(self, KatanaPageRule, c_rule);
|
275
|
+
|
276
|
+
if (c_rule->declarations)
|
277
|
+
{
|
278
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_rule->declarations);
|
279
|
+
|
280
|
+
VALUE sing = rb_singleton_class(array);
|
281
|
+
rb_define_method(sing, "each", rb_declaration_each, 0);
|
282
|
+
|
283
|
+
return array;
|
284
|
+
}
|
285
|
+
else
|
286
|
+
return Qnil;
|
287
|
+
}
|
288
|
+
|
289
|
+
// FontFaceRule
|
290
|
+
|
291
|
+
/*
|
292
|
+
* @return [Katana::Array<Katana::Declaration>]
|
293
|
+
*/
|
294
|
+
VALUE rb_font_face_rule_declarations(VALUE self)
|
295
|
+
{
|
296
|
+
KatanaFontFaceRule *c_rule;
|
297
|
+
Data_Get_Struct(self, KatanaFontFaceRule, c_rule);
|
298
|
+
|
299
|
+
if (c_rule->declarations)
|
300
|
+
{
|
301
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_rule->declarations);
|
302
|
+
|
303
|
+
VALUE sing = rb_singleton_class(array);
|
304
|
+
rb_define_method(sing, "each", rb_declaration_each, 0);
|
305
|
+
|
306
|
+
return array;
|
307
|
+
}
|
308
|
+
else
|
309
|
+
return Qnil;
|
310
|
+
}
|
311
|
+
|
312
|
+
// ImportRule
|
313
|
+
|
314
|
+
/*
|
315
|
+
* @return [String]
|
316
|
+
*/
|
317
|
+
VALUE rb_import_rule_href(VALUE self)
|
318
|
+
{
|
319
|
+
KatanaImportRule *c_rule;
|
320
|
+
Data_Get_Struct(self, KatanaImportRule, c_rule);
|
321
|
+
if (c_rule->href)
|
322
|
+
return rb_str_new2(c_rule->href);
|
323
|
+
else
|
324
|
+
return Qnil;
|
325
|
+
}
|
326
|
+
|
327
|
+
/*
|
328
|
+
* @return [Katana::Array<Katana::MediaQuery>]
|
329
|
+
*/
|
330
|
+
VALUE rb_import_rule_medias(VALUE self)
|
331
|
+
{
|
332
|
+
KatanaImportRule *c_rule;
|
333
|
+
Data_Get_Struct(self, KatanaImportRule, c_rule);
|
334
|
+
|
335
|
+
if (c_rule->medias)
|
336
|
+
{
|
337
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_rule->medias);
|
338
|
+
|
339
|
+
VALUE sing = rb_singleton_class(array);
|
340
|
+
rb_define_method(sing, "each", rb_media_query_each, 0);
|
341
|
+
|
342
|
+
return array;
|
343
|
+
}
|
344
|
+
else
|
345
|
+
return Qnil;
|
346
|
+
}
|
347
|
+
|
348
|
+
// CharsetRule
|
349
|
+
|
350
|
+
/*
|
351
|
+
* @return [String]
|
352
|
+
*/
|
353
|
+
VALUE rb_charset_rule_encoding(VALUE self)
|
354
|
+
{
|
355
|
+
KatanaCharsetRule *c_rule;
|
356
|
+
Data_Get_Struct(self, KatanaCharsetRule, c_rule);
|
357
|
+
if (c_rule->encoding)
|
358
|
+
return rb_str_new2(c_rule->encoding);
|
359
|
+
else
|
360
|
+
return Qnil;
|
361
|
+
}
|
362
|
+
|
363
|
+
// StyleRule
|
364
|
+
|
365
|
+
/*
|
366
|
+
* @return [Katana::Array<Katana::Selector>]
|
367
|
+
*/
|
368
|
+
VALUE rb_style_rule_selectors(VALUE self)
|
369
|
+
{
|
370
|
+
KatanaStyleRule *c_style_rule;
|
371
|
+
Data_Get_Struct(self, KatanaStyleRule, c_style_rule);
|
372
|
+
|
373
|
+
if (c_style_rule->selectors)
|
374
|
+
{
|
375
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_style_rule->selectors);
|
376
|
+
|
377
|
+
VALUE sing = rb_singleton_class(array);
|
378
|
+
rb_define_method(sing, "each", rb_selector_each, 0);
|
379
|
+
|
380
|
+
return array;
|
381
|
+
}
|
382
|
+
else
|
383
|
+
return Qnil;
|
384
|
+
}
|
385
|
+
|
386
|
+
/*
|
387
|
+
* @return [Katana::Array<Katana::Declaration>]
|
388
|
+
*/
|
389
|
+
VALUE rb_style_rule_declarations(VALUE self)
|
390
|
+
{
|
391
|
+
KatanaStyleRule *c_style_rule;
|
392
|
+
Data_Get_Struct(self, KatanaStyleRule, c_style_rule);
|
393
|
+
|
394
|
+
if (c_style_rule->declarations)
|
395
|
+
{
|
396
|
+
VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_style_rule->declarations);
|
397
|
+
|
398
|
+
VALUE sing = rb_singleton_class(array);
|
399
|
+
rb_define_method(sing, "each", rb_declaration_each, 0);
|
400
|
+
|
401
|
+
return array;
|
402
|
+
}
|
403
|
+
else
|
404
|
+
return Qnil;
|
405
|
+
}
|
406
|
+
|
407
|
+
void init_katana_rule()
|
408
|
+
{
|
409
|
+
// SupportsRule
|
410
|
+
rb_SupportsExp = rb_define_class_under(rb_Katana, "SupportsExpression", rb_cObject);
|
411
|
+
rb_define_method(rb_SupportsExp, "operation", rb_supports_exp_op, 0);
|
412
|
+
rb_define_method(rb_SupportsExp, "expressions", rb_supports_exp_exps, 0);
|
413
|
+
rb_define_method(rb_SupportsExp, "declaration", rb_supports_exp_declaration, 0);
|
414
|
+
|
415
|
+
rb_SupportsRule = rb_define_class_under(rb_Katana, "SupportsRule", rb_cObject);
|
416
|
+
rb_define_method(rb_SupportsRule, "expression", rb_supports_exp, 0);
|
417
|
+
rb_define_method(rb_SupportsRule, "rules", rb_supports_rules, 0);
|
418
|
+
|
419
|
+
// NamespaceRule
|
420
|
+
rb_NamespaceRule = rb_define_class_under(rb_Katana, "NamespaceRule", rb_cObject);
|
421
|
+
rb_define_method(rb_NamespaceRule, "prefix", rb_namespace_rule_prefix, 0);
|
422
|
+
rb_define_method(rb_NamespaceRule, "uri", rb_namespace_rule_uri, 0);
|
423
|
+
|
424
|
+
// MediaRule
|
425
|
+
rb_MediaRule = rb_define_class_under(rb_Katana, "MediaRule", rb_cObject);
|
426
|
+
rb_define_method(rb_MediaRule, "medias", rb_media_rule_medias, 0);
|
427
|
+
rb_define_method(rb_MediaRule, "rules", rb_media_rule_rules, 0);
|
428
|
+
|
429
|
+
// MediaQueryExp
|
430
|
+
rb_MediaQueryExp = rb_define_class_under(rb_Katana, "MediaQueryExpression", rb_cObject);
|
431
|
+
rb_define_method(rb_MediaQueryExp, "feature", rb_media_query_exp_feature, 0);
|
432
|
+
rb_define_method(rb_MediaQueryExp, "values", rb_media_query_exp_values, 0);
|
433
|
+
|
434
|
+
// MediaQuery
|
435
|
+
rb_MediaQuery = rb_define_class_under(rb_Katana, "MediaQuery", rb_cObject);
|
436
|
+
rb_define_method(rb_MediaQuery, "type", rb_media_query_type, 0);
|
437
|
+
rb_define_method(rb_MediaQuery, "restrictor", rb_media_query_restrictor, 0);
|
438
|
+
rb_define_method(rb_MediaQuery, "expressions", rb_media_query_expressions, 0);
|
439
|
+
|
440
|
+
// PageRule
|
441
|
+
rb_PageRule = rb_define_class_under(rb_Katana, "PageRule", rb_cObject);
|
442
|
+
rb_define_method(rb_PageRule, "declarations", rb_page_rule_declarations, 0);
|
443
|
+
|
444
|
+
// FontFaceRule
|
445
|
+
rb_FontFaceRule = rb_define_class_under(rb_Katana, "FontFaceRule", rb_cObject);
|
446
|
+
rb_define_method(rb_FontFaceRule, "declarations", rb_font_face_rule_declarations, 0);
|
447
|
+
|
448
|
+
// ImportRule
|
449
|
+
rb_ImportRule = rb_define_class_under(rb_Katana, "ImportRule", rb_cObject);
|
450
|
+
rb_define_method(rb_ImportRule, "href", rb_import_rule_href, 0);
|
451
|
+
rb_define_method(rb_ImportRule, "medias", rb_import_rule_medias, 0);
|
452
|
+
|
453
|
+
// CharsetRule
|
454
|
+
rb_CharsetRule = rb_define_class_under(rb_Katana, "CharsetRule", rb_cObject);
|
455
|
+
rb_define_method(rb_CharsetRule, "encoding", rb_charset_rule_encoding, 0);
|
456
|
+
|
457
|
+
// StyleRule
|
458
|
+
rb_StyleRule = rb_define_class_under(rb_Katana, "StyleRule", rb_cObject);
|
459
|
+
rb_define_method(rb_StyleRule, "selectors", rb_style_rule_selectors, 0);
|
460
|
+
rb_define_method(rb_StyleRule, "declarations", rb_style_rule_declarations, 0);
|
461
|
+
}
|