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.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/ext/katana/extconf.rb +20 -0
  4. data/ext/katana/rb_katana.c +280 -0
  5. data/ext/katana/rb_katana.h +102 -0
  6. data/ext/katana/rb_katana_array.c +144 -0
  7. data/ext/katana/rb_katana_declaration.c +389 -0
  8. data/ext/katana/rb_katana_rule.c +461 -0
  9. data/ext/katana/rb_katana_selector.c +559 -0
  10. data/ext/katana/src/foundation.c +237 -0
  11. data/ext/katana/src/foundation.h +120 -0
  12. data/ext/katana/src/katana.h +590 -0
  13. data/ext/katana/src/katana.lex.c +4104 -0
  14. data/ext/katana/src/katana.lex.h +592 -0
  15. data/ext/katana/src/katana.tab.c +4422 -0
  16. data/ext/katana/src/katana.tab.h +262 -0
  17. data/ext/katana/src/parser.c +1563 -0
  18. data/ext/katana/src/parser.h +237 -0
  19. data/ext/katana/src/selector.c +659 -0
  20. data/ext/katana/src/selector.h +54 -0
  21. data/ext/katana/src/tokenizer.c +300 -0
  22. data/ext/katana/src/tokenizer.h +41 -0
  23. data/lib/habaki/charset_rule.rb +25 -0
  24. data/lib/habaki/declaration.rb +53 -0
  25. data/lib/habaki/declarations.rb +346 -0
  26. data/lib/habaki/error.rb +43 -0
  27. data/lib/habaki/font_face_rule.rb +24 -0
  28. data/lib/habaki/formal_syntax.rb +464 -0
  29. data/lib/habaki/formatter.rb +99 -0
  30. data/lib/habaki/import_rule.rb +34 -0
  31. data/lib/habaki/media_rule.rb +173 -0
  32. data/lib/habaki/namespace_rule.rb +31 -0
  33. data/lib/habaki/node.rb +52 -0
  34. data/lib/habaki/page_rule.rb +24 -0
  35. data/lib/habaki/qualified_name.rb +29 -0
  36. data/lib/habaki/rule.rb +48 -0
  37. data/lib/habaki/rules.rb +225 -0
  38. data/lib/habaki/selector.rb +98 -0
  39. data/lib/habaki/selectors.rb +49 -0
  40. data/lib/habaki/style_rule.rb +35 -0
  41. data/lib/habaki/stylesheet.rb +158 -0
  42. data/lib/habaki/sub_selector.rb +234 -0
  43. data/lib/habaki/sub_selectors.rb +42 -0
  44. data/lib/habaki/supports_rule.rb +65 -0
  45. data/lib/habaki/value.rb +321 -0
  46. data/lib/habaki/values.rb +86 -0
  47. data/lib/habaki/visitor/element.rb +50 -0
  48. data/lib/habaki/visitor/media.rb +22 -0
  49. data/lib/habaki/visitor/nokogiri_element.rb +56 -0
  50. data/lib/habaki.rb +39 -0
  51. metadata +190 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '0353296529b5859a3a87d39342fefb8b8a90989bda2f99a11f83044afe272454'
4
+ data.tar.gz: ccc7c4db5c2fcc817cf0915bf0824766c86712a1ec70fb104e2ab82c3a006341
5
+ SHA512:
6
+ metadata.gz: e2d38a0e7dc9ac35da58f6fcf287fb44a4589449401d38620f754e20a4987aa78263cd3c17feeab76c53453e21a8cedc665fd8316bba5de107ec64764d18bfb4
7
+ data.tar.gz: 19031074df7e070da55f4cc73576a337c849657e55a91c4df682f9086e8139f85c56c9967702330f4c7a99c89d85f5c836920c1f30ce67ecb6df8e41b77db789
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,20 @@
1
+ require 'mkmf'
2
+
3
+ CONFIG['warnflags'].gsub!(/-W.* /, '')
4
+
5
+ # flex -o src/katana.lex.c src/katana.l
6
+ # bison -dl src/katana.y -o src/katana.tab.c
7
+
8
+ $srcs = %w{src/katana-parser/katana.tab.c src/katana-parser/foundation.c src/katana-parser/katana.lex.c
9
+ src/katana-parser/parser.c src/katana-parser/selector.c src/katana-parser/tokenizer.c
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
+ }
12
+
13
+ $INCFLAGS << " -I$(srcdir)/src"
14
+
15
+ # add folder, where compiler can search source files
16
+ $VPATH << "$(srcdir)/src"
17
+
18
+ extension_name = 'katana'
19
+ dir_config(extension_name)
20
+ create_makefile("#{extension_name}/#{extension_name}")
@@ -0,0 +1,280 @@
1
+ #include "rb_katana.h"
2
+
3
+ VALUE rb_Katana, rb_Output, rb_KError, rb_KPosition, rb_KArray, rb_Stylesheet,
4
+ rb_MediaRule, rb_MediaQuery, rb_MediaQueryExp,
5
+ rb_SupportsRule, rb_SupportsExp,
6
+ rb_PageRule, rb_FontFaceRule, rb_StyleRule, rb_ImportRule, rb_NamespaceRule, rb_CharsetRule,
7
+ rb_Selector, rb_SelectorData, rb_Declaration, rb_Value, rb_QualifiedName, rb_ValueFunction;
8
+
9
+ static void output_free(KatanaOutput *output)
10
+ {
11
+ katana_destroy_output(output);
12
+ }
13
+
14
+ /*
15
+ * @return [Katana::Stylesheet, nil]
16
+ */
17
+ VALUE rb_output_stylesheet(VALUE self)
18
+ {
19
+ KatanaOutput *c_output;
20
+ Data_Get_Struct(self, KatanaOutput, c_output);
21
+
22
+ if (c_output->stylesheet)
23
+ return Data_Wrap_Struct(rb_Stylesheet, NULL, NULL, c_output->stylesheet);
24
+ else
25
+ return Qnil;
26
+ }
27
+
28
+ /*
29
+ * @return [Katana::Array<Katana::Declaration>, nil]
30
+ */
31
+ VALUE rb_output_declarations(VALUE self)
32
+ {
33
+ KatanaOutput *c_output;
34
+ Data_Get_Struct(self, KatanaOutput, c_output);
35
+
36
+ if (c_output->declarations)
37
+ {
38
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_output->declarations);
39
+
40
+ VALUE sing = rb_singleton_class(array);
41
+ rb_define_method(sing, "each", rb_declaration_each, 0);
42
+
43
+ return array;
44
+ }
45
+ else
46
+ return Qnil;
47
+ }
48
+
49
+ /*
50
+ * @return [Katana::Array<Katana::Selector>, nil]
51
+ */
52
+ VALUE rb_output_selectors(VALUE self)
53
+ {
54
+ KatanaOutput *c_output;
55
+ Data_Get_Struct(self, KatanaOutput, c_output);
56
+
57
+ if (c_output->selectors)
58
+ {
59
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_output->selectors);
60
+
61
+ VALUE sing = rb_singleton_class(array);
62
+ rb_define_method(sing, "each", rb_selector_each, 0);
63
+
64
+ return array;
65
+ }
66
+ else
67
+ return Qnil;
68
+ }
69
+
70
+ // Position
71
+
72
+ /*
73
+ * @return [Integer]
74
+ */
75
+ VALUE rb_position_line(VALUE self)
76
+ {
77
+ KatanaSourcePosition *c_pos;
78
+ Data_Get_Struct(self, KatanaSourcePosition, c_pos);
79
+ return INT2NUM(c_pos->line);
80
+ }
81
+
82
+ /*
83
+ * @return [Integer]
84
+ */
85
+ VALUE rb_position_column(VALUE self)
86
+ {
87
+ KatanaSourcePosition *c_pos;
88
+ Data_Get_Struct(self, KatanaSourcePosition, c_pos);
89
+ return INT2NUM(c_pos->column);
90
+ }
91
+
92
+ /*
93
+ * @return [Katana::Array<Katana::Error>]
94
+ */
95
+ VALUE rb_output_errors(VALUE self)
96
+ {
97
+ KatanaOutput *c_output;
98
+ Data_Get_Struct(self, KatanaOutput, c_output);
99
+
100
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, &c_output->errors);
101
+
102
+ VALUE sing = rb_singleton_class(array);
103
+ rb_define_method(sing, "each", rb_error_each, 0);
104
+
105
+ return array;
106
+ }
107
+
108
+ // Array
109
+ /*
110
+ * @return [Integer]
111
+ */
112
+ VALUE rb_array_length(VALUE array)
113
+ {
114
+ KatanaArray *c_array;
115
+ Data_Get_Struct(array, KatanaArray, c_array);
116
+ return INT2NUM(c_array->length);
117
+ }
118
+
119
+ // Error
120
+
121
+ /*
122
+ * @return [Integer]
123
+ */
124
+ VALUE rb_error_first_line(VALUE self)
125
+ {
126
+ KatanaError *c_err;
127
+ Data_Get_Struct(self, KatanaError, c_err);
128
+ return INT2NUM(c_err->first_line);
129
+ }
130
+
131
+ /*
132
+ * @return [Integer]
133
+ */
134
+ VALUE rb_error_first_column(VALUE self)
135
+ {
136
+ KatanaError *c_err;
137
+ Data_Get_Struct(self, KatanaError, c_err);
138
+ return INT2NUM(c_err->first_column);
139
+ }
140
+
141
+ /*
142
+ * @return [Integer]
143
+ */
144
+ VALUE rb_error_last_line(VALUE self)
145
+ {
146
+ KatanaError *c_err;
147
+ Data_Get_Struct(self, KatanaError, c_err);
148
+ return INT2NUM(c_err->last_line);
149
+ }
150
+
151
+ /*
152
+ * @return [Integer]
153
+ */
154
+ VALUE rb_error_last_column(VALUE self)
155
+ {
156
+ KatanaError *c_err;
157
+ Data_Get_Struct(self, KatanaError, c_err);
158
+ return INT2NUM(c_err->last_column);
159
+ }
160
+
161
+ /*
162
+ * @return [String]
163
+ */
164
+ VALUE rb_error_message(VALUE self)
165
+ {
166
+ KatanaError *c_err;
167
+ Data_Get_Struct(self, KatanaError, c_err);
168
+ return rb_str_new2(c_err->message);
169
+ }
170
+
171
+ /*
172
+ * @return [Katana::Array]
173
+ */
174
+ VALUE rb_stylesheet_rules(VALUE self)
175
+ {
176
+ KatanaStylesheet *c_stylesheet;
177
+ Data_Get_Struct(self, KatanaStylesheet, c_stylesheet);
178
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, &c_stylesheet->rules);
179
+
180
+ VALUE sing = rb_singleton_class(array);
181
+ rb_define_method(sing, "each", rb_rule_each, 0);
182
+
183
+ return array;
184
+ }
185
+
186
+ /*
187
+ * @return [Katana::Array]
188
+ */
189
+ VALUE rb_stylesheet_imports(VALUE self)
190
+ {
191
+ KatanaStylesheet *c_stylesheet;
192
+ Data_Get_Struct(self, KatanaStylesheet, c_stylesheet);
193
+
194
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, &c_stylesheet->imports);
195
+
196
+ VALUE sing = rb_singleton_class(array);
197
+ rb_define_method(sing, "each", rb_rule_each, 0);
198
+
199
+ return array;
200
+ }
201
+
202
+ /*
203
+ * parse CSS from string
204
+ * @param [String] data
205
+ * @return [Katana::Output]
206
+ */
207
+ VALUE rb_parse(VALUE self, VALUE data)
208
+ {
209
+ KatanaOutput *output = katana_parse(RSTRING_PTR(data), RSTRING_LEN(data), KatanaParserModeStylesheet);
210
+
211
+ return Data_Wrap_Struct(rb_Output, NULL, output_free, output);
212
+ }
213
+
214
+ /*
215
+ * parse CSS inline from string
216
+ * @param [String] data
217
+ * @return [Katana::Output]
218
+ */
219
+ VALUE rb_parse_inline(VALUE self, VALUE data)
220
+ {
221
+ KatanaOutput *output = katana_parse(RSTRING_PTR(data), RSTRING_LEN(data), KatanaParserModeDeclarationList);
222
+
223
+ return Data_Wrap_Struct(rb_Output, NULL, output_free, output);
224
+ }
225
+
226
+ /*
227
+ * parse CSS selector from string
228
+ * @param [String] data
229
+ * @return [Katana::Output]
230
+ */
231
+ VALUE rb_parse_selectors(VALUE self, VALUE data)
232
+ {
233
+ KatanaOutput *output = katana_parse(RSTRING_PTR(data), RSTRING_LEN(data), KatanaParserModeSelector);
234
+
235
+ return Data_Wrap_Struct(rb_Output, NULL, output_free, output);
236
+ }
237
+
238
+ void Init_katana()
239
+ {
240
+ /* Low-level parser */
241
+ rb_Katana = rb_define_module("Katana");
242
+
243
+ rb_Output = rb_define_class_under(rb_Katana, "Output", rb_cObject);
244
+ rb_define_method(rb_Output, "stylesheet", rb_output_stylesheet, 0);
245
+ rb_define_method(rb_Output, "declarations", rb_output_declarations, 0);
246
+ rb_define_method(rb_Output, "selectors", rb_output_selectors, 0);
247
+ rb_define_method(rb_Output, "errors", rb_output_errors, 0);
248
+
249
+ // Array
250
+ rb_KArray = rb_define_class_under(rb_Katana, "Array", rb_cObject);
251
+ rb_include_module(rb_KArray, rb_mEnumerable);
252
+ rb_define_method(rb_KArray, "length", rb_array_length, 0);
253
+
254
+ // Source position
255
+ rb_KPosition = rb_define_class_under(rb_Katana, "SourcePosition", rb_cObject);
256
+ rb_define_method(rb_KPosition, "line", rb_position_line, 0);
257
+ rb_define_method(rb_KPosition, "column", rb_position_column, 0);
258
+
259
+ // Error
260
+ rb_KError = rb_define_class_under(rb_Katana, "Error", rb_cObject);
261
+ rb_define_method(rb_KError, "first_line", rb_error_first_line, 0);
262
+ rb_define_method(rb_KError, "first_column", rb_error_first_column, 0);
263
+ rb_define_method(rb_KError, "last_line", rb_error_last_line, 0);
264
+ rb_define_method(rb_KError, "last_column", rb_error_last_column, 0);
265
+ rb_define_method(rb_KError, "message", rb_error_message, 0);
266
+
267
+ // Stylesheet
268
+ rb_Stylesheet = rb_define_class_under(rb_Katana, "Stylesheet", rb_cObject);
269
+ rb_define_method(rb_Stylesheet, "rules", rb_stylesheet_rules, 0);
270
+ rb_define_method(rb_Stylesheet, "imports", rb_stylesheet_imports, 0);
271
+
272
+ init_katana_rule();
273
+ init_katana_selector();
274
+ init_katana_declaration();
275
+
276
+ // Module method
277
+ rb_define_singleton_method(rb_Katana, "parse", rb_parse, 1);
278
+ rb_define_singleton_method(rb_Katana, "parse_inline", rb_parse_inline, 1);
279
+ rb_define_singleton_method(rb_Katana, "parse_selectors", rb_parse_selectors, 1);
280
+ }
@@ -0,0 +1,102 @@
1
+ #ifndef RB_KATANA_H
2
+ #define RB_KATANA_H
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+ #include <stdarg.h>
6
+ #include <fcntl.h> /*open,close*/
7
+ #include <sys/types.h>
8
+ #include <unistd.h> /*open,read,close*/
9
+ #include <string.h> /*strerror*/
10
+ #include <errno.h>
11
+ #include <assert.h>
12
+
13
+ #include <ruby.h>
14
+ #include <ruby/io.h>
15
+
16
+ #include "src/katana.h"
17
+ #include "src/selector.h"
18
+
19
+ /* Array */
20
+
21
+ VALUE rb_array_length(VALUE array);
22
+ VALUE rb_rule_each(VALUE array);
23
+ VALUE rb_media_query_each(VALUE array);
24
+ VALUE rb_selector_each(VALUE array);
25
+ VALUE rb_declaration_each(VALUE array);
26
+ VALUE rb_value_each(VALUE array);
27
+ VALUE rb_expression_each(VALUE array);
28
+ VALUE rb_supports_expression_each(VALUE array);
29
+ VALUE rb_error_each(VALUE array);
30
+
31
+ /* Selector */
32
+
33
+ VALUE rb_selector_specificity(VALUE self);
34
+ VALUE rb_selector_match(VALUE self);
35
+ VALUE rb_selector_relation(VALUE self);
36
+ VALUE rb_selector_pseudo(VALUE self);
37
+ VALUE rb_selector_tag(VALUE self);
38
+ VALUE rb_selector_data(VALUE self);
39
+ VALUE rb_selector_tag_history(VALUE self);
40
+ VALUE rb_selector_data_value(VALUE self);
41
+ VALUE rb_selector_data_attr(VALUE self);
42
+ VALUE rb_selector_data_argument(VALUE self);
43
+ VALUE rb_selector_data_selectors(VALUE self);
44
+
45
+ /* Declaration */
46
+
47
+ VALUE rb_declaration_prop(VALUE self);
48
+ VALUE rb_declaration_important(VALUE self);
49
+ VALUE rb_declaration_values(VALUE self);
50
+
51
+ VALUE rb_value_unit(VALUE self);
52
+ VALUE rb_value_value(VALUE self);
53
+ VALUE rb_value_function_name(VALUE self);
54
+ VALUE rb_value_function_args(VALUE self);
55
+
56
+ VALUE rb_name_local(VALUE self);
57
+ VALUE rb_name_prefix(VALUE self);
58
+ VALUE rb_name_uri(VALUE self);
59
+
60
+ /* Rule */
61
+
62
+ VALUE rb_supports_exp_op(VALUE self);
63
+ VALUE rb_supports_exp_exps(VALUE self);
64
+ VALUE rb_supports_exp_declaration(VALUE self);
65
+ VALUE rb_supports_rules(VALUE self);
66
+ VALUE rb_supports_exp(VALUE self);
67
+
68
+ VALUE rb_namespace_rule_prefix(VALUE self);
69
+ VALUE rb_namespace_rule_uri(VALUE self);
70
+
71
+ VALUE rb_media_rule_rules(VALUE self);
72
+ VALUE rb_media_rule_medias(VALUE self);
73
+ VALUE rb_media_query_exp_feature(VALUE self);
74
+ VALUE rb_media_query_exp_values(VALUE self);
75
+ VALUE rb_media_query_type(VALUE self);
76
+ VALUE rb_media_query_restrictor(VALUE self);
77
+ VALUE rb_media_query_expressions(VALUE self);
78
+
79
+ VALUE rb_page_rule_declarations(VALUE self);
80
+
81
+ VALUE rb_font_face_rule_declarations(VALUE self);
82
+
83
+ VALUE rb_import_rule_href(VALUE self);
84
+ VALUE rb_import_rule_medias(VALUE self);
85
+
86
+ VALUE rb_charset_rule_encoding(VALUE self);
87
+
88
+ VALUE rb_style_rule_selectors(VALUE self);
89
+ VALUE rb_style_rule_declarations(VALUE self);
90
+
91
+ void init_katana_rule();
92
+ void init_katana_selector();
93
+ void init_katana_declaration();
94
+
95
+ extern VALUE rb_Katana, rb_Output, rb_KError, rb_KPosition, rb_KArray, rb_Stylesheet,
96
+ rb_MediaRule, rb_MediaQuery, rb_MediaQueryExp,
97
+ rb_SupportsRule, rb_SupportsExp,
98
+ rb_PageRule, rb_FontFaceRule, rb_StyleRule, rb_ImportRule, rb_NamespaceRule, rb_CharsetRule,
99
+ rb_Selector, rb_SelectorData, rb_Declaration, rb_Value, rb_QualifiedName, rb_ValueFunction;
100
+
101
+ #endif
102
+
@@ -0,0 +1,144 @@
1
+ /*
2
+ * Typed each method for Katana::Array
3
+ */
4
+ #include "rb_katana.h"
5
+
6
+ VALUE rb_rule_each(VALUE array)
7
+ {
8
+ int i;
9
+ KatanaArray *c_array;
10
+ Data_Get_Struct(array, KatanaArray, c_array);
11
+ for (i = 0; i < c_array->length; i++)
12
+ {
13
+ KatanaRule *rule = (KatanaRule *)c_array->data[i];
14
+ switch (rule->type)
15
+ {
16
+ case KatanaRuleUnkown:
17
+ break;
18
+ case KatanaRuleStyle:
19
+ rb_yield(Data_Wrap_Struct(rb_StyleRule, NULL, NULL, rule));
20
+ break;
21
+ case KatanaRuleImport:
22
+ rb_yield(Data_Wrap_Struct(rb_ImportRule, NULL, NULL, rule));
23
+ break;
24
+ case KatanaRuleMedia:
25
+ rb_yield(Data_Wrap_Struct(rb_MediaRule, NULL, NULL, rule));
26
+ break;
27
+ case KatanaRulePage:
28
+ rb_yield(Data_Wrap_Struct(rb_PageRule, NULL, NULL, rule));
29
+ break;
30
+ case KatanaRuleFontFace:
31
+ rb_yield(Data_Wrap_Struct(rb_FontFaceRule, NULL, NULL, rule));
32
+ break;
33
+ case KatanaRuleSupports:
34
+ rb_yield(Data_Wrap_Struct(rb_SupportsRule, NULL, NULL, rule));
35
+ break;
36
+ case KatanaRuleNamespace:
37
+ rb_yield(Data_Wrap_Struct(rb_NamespaceRule, NULL, NULL, rule));
38
+ break;
39
+ case KatanaRuleCharset:
40
+ rb_yield(Data_Wrap_Struct(rb_CharsetRule, NULL, NULL, rule));
41
+ break;
42
+ case KatanaRuleKeyframes:
43
+ // TODO
44
+ break;
45
+ case KatanaRuleHost:
46
+ // TODO
47
+ break;
48
+ default:
49
+ break;
50
+ }
51
+ }
52
+ return Qnil;
53
+ }
54
+
55
+ VALUE rb_media_query_each(VALUE array)
56
+ {
57
+ int i;
58
+ KatanaArray *c_array;
59
+ Data_Get_Struct(array, KatanaArray, c_array);
60
+ for (i = 0; i < c_array->length; i++)
61
+ {
62
+ KatanaMediaQuery *query = (KatanaMediaQuery *)c_array->data[i];
63
+ rb_yield(Data_Wrap_Struct(rb_MediaQuery, NULL, NULL, query));
64
+ }
65
+ return Qnil;
66
+ }
67
+
68
+ VALUE rb_selector_each(VALUE array)
69
+ {
70
+ int i;
71
+ KatanaArray *c_array;
72
+ Data_Get_Struct(array, KatanaArray, c_array);
73
+ for (i = 0; i < c_array->length; i++)
74
+ {
75
+ KatanaSelector *selector = (KatanaSelector *)c_array->data[i];
76
+ rb_yield(Data_Wrap_Struct(rb_Selector, NULL, NULL, selector));
77
+ }
78
+ return Qnil;
79
+ }
80
+
81
+ VALUE rb_declaration_each(VALUE array)
82
+ {
83
+ int i;
84
+ KatanaArray *c_array;
85
+ Data_Get_Struct(array, KatanaArray, c_array);
86
+ for (i = 0; i < c_array->length; i++)
87
+ {
88
+ KatanaDeclaration *decl = (KatanaDeclaration *)c_array->data[i];
89
+ rb_yield(Data_Wrap_Struct(rb_Declaration, NULL, NULL, decl));
90
+ }
91
+ return Qnil;
92
+ }
93
+
94
+ VALUE rb_value_each(VALUE array)
95
+ {
96
+ int i;
97
+ KatanaArray *c_array;
98
+ Data_Get_Struct(array, KatanaArray, c_array);
99
+ for (i = 0; i < c_array->length; i++)
100
+ {
101
+ KatanaValue *value = (KatanaValue *)c_array->data[i];
102
+ rb_yield(Data_Wrap_Struct(rb_Value, NULL, NULL, value));
103
+ }
104
+ return Qnil;
105
+ }
106
+
107
+ VALUE rb_expression_each(VALUE array)
108
+ {
109
+ int i;
110
+ KatanaArray *c_array;
111
+ Data_Get_Struct(array, KatanaArray, c_array);
112
+ for (i = 0; i < c_array->length; i++)
113
+ {
114
+ KatanaMediaQueryExp *value = (KatanaMediaQueryExp *)c_array->data[i];
115
+ rb_yield(Data_Wrap_Struct(rb_MediaQueryExp, NULL, NULL, value));
116
+ }
117
+ return Qnil;
118
+ }
119
+
120
+ VALUE rb_supports_expression_each(VALUE array)
121
+ {
122
+ int i;
123
+ KatanaArray *c_array;
124
+ Data_Get_Struct(array, KatanaArray, c_array);
125
+ for (i = 0; i < c_array->length; i++)
126
+ {
127
+ KatanaSupportsExp *value = (KatanaSupportsExp *)c_array->data[i];
128
+ rb_yield(Data_Wrap_Struct(rb_SupportsExp, NULL, NULL, value));
129
+ }
130
+ return Qnil;
131
+ }
132
+
133
+ VALUE rb_error_each(VALUE array)
134
+ {
135
+ int i;
136
+ KatanaArray *c_array;
137
+ Data_Get_Struct(array, KatanaArray, c_array);
138
+ for (i = 0; i < c_array->length; i++)
139
+ {
140
+ KatanaError *value = (KatanaError *)c_array->data[i];
141
+ rb_yield(Data_Wrap_Struct(rb_KError, NULL, NULL, value));
142
+ }
143
+ return Qnil;
144
+ }