nokogiri 1.2.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of nokogiri might be problematic. Click here for more details.
- data/.autotest +14 -2
- data/CHANGELOG.ja.rdoc +38 -0
- data/CHANGELOG.rdoc +43 -0
- data/Manifest.txt +80 -5
- data/README.ja.rdoc +12 -11
- data/README.rdoc +4 -2
- data/Rakefile +103 -173
- data/bin/nokogiri +47 -0
- data/ext/nokogiri/extconf.rb +19 -13
- data/ext/nokogiri/html_document.c +39 -3
- data/ext/nokogiri/html_document.h +1 -1
- data/ext/nokogiri/html_element_description.c +272 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.h +1 -1
- data/ext/nokogiri/html_sax_parser.h +1 -1
- data/ext/nokogiri/{native.c → nokogiri.c} +11 -3
- data/ext/nokogiri/{native.h → nokogiri.h} +18 -4
- data/ext/nokogiri/xml_attr.c +14 -5
- data/ext/nokogiri/xml_attr.h +1 -1
- data/ext/nokogiri/xml_cdata.c +15 -6
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +13 -4
- data/ext/nokogiri/xml_comment.h +1 -1
- data/ext/nokogiri/xml_document.c +50 -41
- data/ext/nokogiri/xml_document.h +1 -1
- data/ext/nokogiri/xml_document_fragment.c +12 -4
- data/ext/nokogiri/xml_document_fragment.h +1 -1
- data/ext/nokogiri/xml_dtd.c +1 -1
- data/ext/nokogiri/xml_dtd.h +1 -1
- data/ext/nokogiri/xml_entity_reference.c +13 -4
- data/ext/nokogiri/xml_entity_reference.h +1 -1
- data/ext/nokogiri/xml_io.h +1 -1
- data/ext/nokogiri/xml_namespace.c +69 -0
- data/ext/nokogiri/xml_namespace.h +12 -0
- data/ext/nokogiri/xml_node.c +232 -124
- data/ext/nokogiri/xml_node.h +3 -4
- data/ext/nokogiri/xml_node_set.c +206 -19
- data/ext/nokogiri/xml_node_set.h +1 -1
- data/ext/nokogiri/xml_processing_instruction.c +14 -4
- data/ext/nokogiri/xml_processing_instruction.h +1 -1
- data/ext/nokogiri/xml_reader.c +87 -7
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +106 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +122 -2
- data/ext/nokogiri/xml_sax_parser.h +1 -1
- data/ext/nokogiri/xml_sax_push_parser.c +1 -0
- data/ext/nokogiri/xml_sax_push_parser.h +1 -1
- data/ext/nokogiri/xml_schema.c +107 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.h +1 -1
- data/ext/nokogiri/xml_text.c +10 -3
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath.h +1 -1
- data/ext/nokogiri/xml_xpath_context.h +1 -1
- data/ext/nokogiri/xslt_stylesheet.c +29 -16
- data/ext/nokogiri/xslt_stylesheet.h +1 -1
- data/lib/action-nokogiri.rb +7 -1
- data/lib/nokogiri.rb +21 -5
- data/lib/nokogiri/css/generated_parser.rb +49 -14
- data/lib/nokogiri/css/generated_tokenizer.rb +2 -2
- data/lib/nokogiri/css/node.rb +13 -3
- data/lib/nokogiri/css/parser.rb +8 -0
- data/lib/nokogiri/css/parser.y +7 -7
- data/lib/nokogiri/css/tokenizer.rb +2 -0
- data/lib/nokogiri/css/xpath_visitor.rb +10 -6
- data/lib/nokogiri/decorators/hpricot/node.rb +1 -1
- data/lib/nokogiri/decorators/hpricot/node_set.rb +2 -2
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +2 -0
- data/lib/nokogiri/decorators/slop.rb +3 -1
- data/lib/nokogiri/ffi/html/document.rb +37 -0
- data/lib/nokogiri/ffi/html/element_description.rb +85 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser.rb +21 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +32 -0
- data/lib/nokogiri/ffi/libxml.rb +314 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
- data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
- data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
- data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
- data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
- data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
- data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
- data/lib/nokogiri/ffi/xml/attr.rb +41 -0
- data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
- data/lib/nokogiri/ffi/xml/comment.rb +18 -0
- data/lib/nokogiri/ffi/xml/document.rb +107 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +26 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +42 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +38 -0
- data/lib/nokogiri/ffi/xml/node.rb +380 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +130 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +217 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +51 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +148 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +38 -0
- data/lib/nokogiri/ffi/xml/schema.rb +55 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +76 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
- data/lib/nokogiri/hpricot.rb +14 -3
- data/lib/nokogiri/html.rb +11 -46
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +62 -6
- data/lib/nokogiri/html/document_fragment.rb +15 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +2 -0
- data/lib/nokogiri/html/sax/parser.rb +27 -1
- data/lib/nokogiri/version.rb +26 -1
- data/lib/nokogiri/version_warning.rb +11 -0
- data/lib/nokogiri/xml.rb +25 -51
- data/lib/nokogiri/xml/builder.rb +166 -10
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/document.rb +39 -6
- data/lib/nokogiri/xml/document_fragment.rb +41 -1
- data/lib/nokogiri/xml/dtd.rb +3 -1
- data/lib/nokogiri/xml/entity_declaration.rb +3 -1
- data/lib/nokogiri/xml/fragment_handler.rb +24 -3
- data/lib/nokogiri/xml/namespace.rb +7 -0
- data/lib/nokogiri/xml/node.rb +314 -65
- data/lib/nokogiri/xml/node/save_options.rb +12 -2
- data/lib/nokogiri/xml/node_set.rb +58 -8
- data/lib/nokogiri/xml/parse_options.rb +80 -0
- data/lib/nokogiri/xml/processing_instruction.rb +2 -0
- data/lib/nokogiri/xml/reader.rb +42 -3
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +0 -7
- data/lib/nokogiri/xml/sax/document.rb +84 -0
- data/lib/nokogiri/xml/sax/parser.rb +38 -2
- data/lib/nokogiri/xml/sax/push_parser.rb +12 -0
- data/lib/nokogiri/xml/schema.rb +65 -0
- data/lib/nokogiri/xml/syntax_error.rb +11 -0
- data/lib/nokogiri/xml/xpath.rb +1 -1
- data/lib/nokogiri/xml/xpath_context.rb +2 -0
- data/lib/nokogiri/xslt.rb +21 -1
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/xsd/xmlparser/nokogiri.rb +12 -2
- data/tasks/test.rb +42 -19
- data/test/css/test_parser.rb +29 -0
- data/test/ffi/test_document.rb +35 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/helper.rb +38 -8
- data/test/html/sax/test_parser.rb +12 -0
- data/test/html/test_builder.rb +25 -2
- data/test/html/test_document.rb +91 -20
- data/test/html/test_document_fragment.rb +97 -0
- data/test/html/test_element_description.rb +95 -0
- data/test/html/test_node.rb +66 -3
- data/test/test_convert_xpath.rb +1 -1
- data/test/test_memory_leak.rb +57 -18
- data/test/test_nokogiri.rb +24 -2
- data/test/test_reader.rb +77 -0
- data/test/test_xslt_transforms.rb +120 -82
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +9 -0
- data/test/xml/sax/test_push_parser.rb +24 -0
- data/test/xml/test_attr.rb +7 -0
- data/test/xml/test_builder.rb +48 -0
- data/test/xml/test_cdata.rb +19 -0
- data/test/xml/test_comment.rb +6 -0
- data/test/xml/test_document.rb +101 -2
- data/test/xml/test_document_fragment.rb +55 -3
- data/test/xml/test_entity_reference.rb +4 -0
- data/test/xml/test_namespace.rb +43 -0
- data/test/xml/test_node.rb +255 -8
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +9 -2
- data/test/xml/test_node_set.rb +197 -1
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +5 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +65 -0
- data/test/xml/test_text.rb +5 -0
- data/test/xml/test_unparented_node.rb +3 -3
- metadata +128 -12
- data/lib/nokogiri/xml/comment.rb +0 -6
- data/lib/nokogiri/xml/element.rb +0 -6
- data/lib/nokogiri/xml/text.rb +0 -6
data/bin/nokogiri
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'open-uri'
|
4
|
+
require 'irb'
|
5
|
+
require 'uri'
|
6
|
+
require 'rubygems'
|
7
|
+
require 'nokogiri'
|
8
|
+
|
9
|
+
opts = OptionParser.new do |opts|
|
10
|
+
opts.banner = "Nokogiri: an HTML, XML, SAX, and Reader parser"
|
11
|
+
opts.define_head "Usage: nokogiri <uri|path> [options]"
|
12
|
+
opts.separator ""
|
13
|
+
opts.separator "Examples:"
|
14
|
+
opts.separator " nokogiri http://www.ruby-lang.org/"
|
15
|
+
opts.separator " nokogiri ./public/index.html"
|
16
|
+
opts.separator ""
|
17
|
+
opts.separator "Options:"
|
18
|
+
|
19
|
+
opts.on_tail("-?", "--help", "Show this message") do
|
20
|
+
puts opts
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on_tail("-v", "--version", "Show version") do
|
25
|
+
require 'yaml'
|
26
|
+
puts Nokogiri::VERSION_INFO.to_yaml
|
27
|
+
exit
|
28
|
+
end
|
29
|
+
end
|
30
|
+
opts.parse!
|
31
|
+
|
32
|
+
uri = ARGV.shift
|
33
|
+
|
34
|
+
if uri.to_s.strip.empty?
|
35
|
+
puts opts
|
36
|
+
exit 1
|
37
|
+
end
|
38
|
+
|
39
|
+
if URI.parse(uri).scheme
|
40
|
+
@doc = Nokogiri(open(uri).read)
|
41
|
+
else
|
42
|
+
@doc = Nokogiri(File.read(uri))
|
43
|
+
end
|
44
|
+
|
45
|
+
puts "Your document is stored in @doc..."
|
46
|
+
IRB.start
|
47
|
+
|
data/ext/nokogiri/extconf.rb
CHANGED
@@ -12,7 +12,9 @@ end
|
|
12
12
|
|
13
13
|
$CFLAGS << " #{ENV["CFLAGS"]}"
|
14
14
|
if Config::CONFIG['target_os'] == 'mingw32'
|
15
|
-
$CFLAGS << " -DXP_WIN -DXP_WIN32"
|
15
|
+
$CFLAGS << " -DXP_WIN -DXP_WIN32 -DUSE_INCLUDED_VASPRINTF"
|
16
|
+
elsif Config::CONFIG['target_os'] == 'solaris2'
|
17
|
+
$CFLAGS << " -DUSE_INCLUDED_VASPRINTF"
|
16
18
|
else
|
17
19
|
$CFLAGS << " -g -DXP_UNIX"
|
18
20
|
end
|
@@ -33,16 +35,10 @@ LIB_DIRS = [
|
|
33
35
|
'/usr/lib'
|
34
36
|
]
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
else
|
42
|
-
unless find_header('iconv.h', INCLUDEDIR, '/opt/local/include',
|
43
|
-
'/usr/local/include', '/usr/include')
|
44
|
-
abort "iconv is missing. try 'port install iconv' or 'yum install iconv'"
|
45
|
-
end
|
38
|
+
iconv_dirs = dir_config('iconv', '/opt/local/include', '/opt/local/lib')
|
39
|
+
unless [nil, nil] == iconv_dirs
|
40
|
+
HEADER_DIRS.unshift iconv_dirs.first
|
41
|
+
LIB_DIRS.unshift iconv_dirs[1]
|
46
42
|
end
|
47
43
|
|
48
44
|
xml2_dirs = dir_config('xml2', '/opt/local/include/libxml2', '/opt/local/lib')
|
@@ -57,8 +53,12 @@ unless [nil, nil] == xslt_dirs
|
|
57
53
|
LIB_DIRS.unshift xslt_dirs[1]
|
58
54
|
end
|
59
55
|
|
56
|
+
unless find_header('iconv.h', *HEADER_DIRS)
|
57
|
+
abort "iconv is missing. try 'port install iconv' or 'yum install iconv'"
|
58
|
+
end
|
59
|
+
|
60
60
|
unless find_header('libxml/parser.h', *HEADER_DIRS)
|
61
|
-
abort "libxml2 is missing. try 'port install libxml2' or 'yum install libxml2'"
|
61
|
+
abort "libxml2 is missing. try 'port install libxml2' or 'yum install libxml2-devel'"
|
62
62
|
end
|
63
63
|
|
64
64
|
unless find_header('libxslt/xslt.h', *HEADER_DIRS)
|
@@ -80,4 +80,10 @@ unless find_library('exslt', 'exsltFuncRegister', *LIB_DIRS)
|
|
80
80
|
abort "libxslt is missing. try 'port install libxslt' or 'yum install libxslt-devel'"
|
81
81
|
end
|
82
82
|
|
83
|
-
|
83
|
+
if ENV['CPUPROFILE']
|
84
|
+
unless find_library('profiler', 'ProfilerEnable', *LIB_DIRS)
|
85
|
+
abort "google performance tools are not installed"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
create_makefile('nokogiri/nokogiri')
|
@@ -8,15 +8,19 @@
|
|
8
8
|
*/
|
9
9
|
static VALUE new(int argc, VALUE *argv, VALUE klass)
|
10
10
|
{
|
11
|
-
VALUE uri, external_id;
|
11
|
+
VALUE uri, external_id, rest, rb_doc;
|
12
12
|
|
13
|
-
rb_scan_args(argc, argv, "
|
13
|
+
rb_scan_args(argc, argv, "0*", &rest);
|
14
|
+
uri = rb_ary_entry(rest, 0);
|
15
|
+
external_id = rb_ary_entry(rest, 1);
|
14
16
|
|
15
17
|
htmlDocPtr doc = htmlNewDoc(
|
16
18
|
RTEST(uri) ? (const xmlChar *)StringValuePtr(uri) : NULL,
|
17
19
|
RTEST(external_id) ? (const xmlChar *)StringValuePtr(external_id) : NULL
|
18
20
|
);
|
19
|
-
|
21
|
+
rb_doc = Nokogiri_wrap_xml_document(klass, doc);
|
22
|
+
rb_funcall2(rb_doc, rb_intern("initialize"), argc, argv);
|
23
|
+
return rb_doc ;
|
20
24
|
}
|
21
25
|
|
22
26
|
/*
|
@@ -127,6 +131,36 @@ static VALUE type(VALUE self)
|
|
127
131
|
return INT2NUM((int)doc->type);
|
128
132
|
}
|
129
133
|
|
134
|
+
/*
|
135
|
+
* call-seq:
|
136
|
+
* meta_encoding=
|
137
|
+
*
|
138
|
+
* Set the meta tag encoding for this document.
|
139
|
+
*/
|
140
|
+
static VALUE set_meta_encoding(VALUE self, VALUE encoding)
|
141
|
+
{
|
142
|
+
htmlDocPtr doc;
|
143
|
+
Data_Get_Struct(self, xmlDoc, doc);
|
144
|
+
|
145
|
+
htmlSetMetaEncoding(doc, (const xmlChar *)StringValuePtr(encoding));
|
146
|
+
|
147
|
+
return encoding;
|
148
|
+
}
|
149
|
+
|
150
|
+
/*
|
151
|
+
* call-seq:
|
152
|
+
* meta_encoding
|
153
|
+
*
|
154
|
+
* Get the meta tag encoding for this document.
|
155
|
+
*/
|
156
|
+
static VALUE meta_encoding(VALUE self)
|
157
|
+
{
|
158
|
+
htmlDocPtr doc;
|
159
|
+
Data_Get_Struct(self, xmlDoc, doc);
|
160
|
+
|
161
|
+
return NOKOGIRI_STR_NEW2(htmlGetMetaEncoding(doc), doc->encoding);
|
162
|
+
}
|
163
|
+
|
130
164
|
VALUE cNokogiriHtmlDocument ;
|
131
165
|
void init_html_document()
|
132
166
|
{
|
@@ -144,4 +178,6 @@ void init_html_document()
|
|
144
178
|
rb_define_singleton_method(klass, "new", new, -1);
|
145
179
|
|
146
180
|
rb_define_method(klass, "type", type, 0);
|
181
|
+
rb_define_method(klass, "meta_encoding", meta_encoding, 0);
|
182
|
+
rb_define_method(klass, "meta_encoding=", set_meta_encoding, 1);
|
147
183
|
}
|
@@ -0,0 +1,272 @@
|
|
1
|
+
#include <html_element_description.h>
|
2
|
+
|
3
|
+
/*
|
4
|
+
* call-seq:
|
5
|
+
* required_attributes
|
6
|
+
*
|
7
|
+
* A list of required attributes for this element
|
8
|
+
*/
|
9
|
+
static VALUE required_attributes(VALUE self)
|
10
|
+
{
|
11
|
+
htmlElemDesc * description;
|
12
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
13
|
+
|
14
|
+
VALUE list = rb_ary_new();
|
15
|
+
|
16
|
+
if(NULL == description->attrs_req) return list;
|
17
|
+
|
18
|
+
int i = 0;
|
19
|
+
while(description->attrs_req[i]) {
|
20
|
+
rb_ary_push(list, NOKOGIRI_STR_NEW2(description->attrs_req[i], "UTF-8"));
|
21
|
+
i++;
|
22
|
+
}
|
23
|
+
|
24
|
+
return list;
|
25
|
+
}
|
26
|
+
|
27
|
+
/*
|
28
|
+
* call-seq:
|
29
|
+
* deprecated_attributes
|
30
|
+
*
|
31
|
+
* A list of deprecated attributes for this element
|
32
|
+
*/
|
33
|
+
static VALUE deprecated_attributes(VALUE self)
|
34
|
+
{
|
35
|
+
htmlElemDesc * description;
|
36
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
37
|
+
|
38
|
+
VALUE list = rb_ary_new();
|
39
|
+
|
40
|
+
if(NULL == description->attrs_depr) return list;
|
41
|
+
|
42
|
+
int i = 0;
|
43
|
+
while(description->attrs_depr[i]) {
|
44
|
+
rb_ary_push(list, NOKOGIRI_STR_NEW2(description->attrs_depr[i], "UTF-8"));
|
45
|
+
i++;
|
46
|
+
}
|
47
|
+
|
48
|
+
return list;
|
49
|
+
}
|
50
|
+
|
51
|
+
/*
|
52
|
+
* call-seq:
|
53
|
+
* optional_attributes
|
54
|
+
*
|
55
|
+
* A list of optional attributes for this element
|
56
|
+
*/
|
57
|
+
static VALUE optional_attributes(VALUE self)
|
58
|
+
{
|
59
|
+
htmlElemDesc * description;
|
60
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
61
|
+
|
62
|
+
VALUE list = rb_ary_new();
|
63
|
+
|
64
|
+
if(NULL == description->attrs_opt) return list;
|
65
|
+
|
66
|
+
int i = 0;
|
67
|
+
while(description->attrs_opt[i]) {
|
68
|
+
rb_ary_push(list, NOKOGIRI_STR_NEW2(description->attrs_opt[i], "UTF-8"));
|
69
|
+
i++;
|
70
|
+
}
|
71
|
+
|
72
|
+
return list;
|
73
|
+
}
|
74
|
+
|
75
|
+
/*
|
76
|
+
* call-seq:
|
77
|
+
* default_sub_element
|
78
|
+
*
|
79
|
+
* The default sub element for this element
|
80
|
+
*/
|
81
|
+
static VALUE default_sub_element(VALUE self)
|
82
|
+
{
|
83
|
+
htmlElemDesc * description;
|
84
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
85
|
+
|
86
|
+
return NOKOGIRI_STR_NEW2(description->defaultsubelt, "UTF-8");
|
87
|
+
}
|
88
|
+
|
89
|
+
/*
|
90
|
+
* call-seq:
|
91
|
+
* sub_elements
|
92
|
+
*
|
93
|
+
* A list of allowed sub elements for this element.
|
94
|
+
*/
|
95
|
+
static VALUE sub_elements(VALUE self)
|
96
|
+
{
|
97
|
+
htmlElemDesc * description;
|
98
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
99
|
+
|
100
|
+
VALUE list = rb_ary_new();
|
101
|
+
|
102
|
+
if(NULL == description->subelts) return list;
|
103
|
+
|
104
|
+
int i = 0;
|
105
|
+
while(description->subelts[i]) {
|
106
|
+
rb_ary_push(list, NOKOGIRI_STR_NEW2(description->subelts[i], "UTF-8"));
|
107
|
+
i++;
|
108
|
+
}
|
109
|
+
|
110
|
+
return list;
|
111
|
+
}
|
112
|
+
|
113
|
+
/*
|
114
|
+
* call-seq:
|
115
|
+
* description
|
116
|
+
*
|
117
|
+
* The description for this element
|
118
|
+
*/
|
119
|
+
static VALUE description(VALUE self)
|
120
|
+
{
|
121
|
+
htmlElemDesc * description;
|
122
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
123
|
+
|
124
|
+
return NOKOGIRI_STR_NEW2(description->desc, "UTF-8");
|
125
|
+
}
|
126
|
+
|
127
|
+
/*
|
128
|
+
* call-seq:
|
129
|
+
* inline?
|
130
|
+
*
|
131
|
+
* Is this element an inline element?
|
132
|
+
*/
|
133
|
+
static VALUE inline_eh(VALUE self)
|
134
|
+
{
|
135
|
+
htmlElemDesc * description;
|
136
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
137
|
+
|
138
|
+
if(description->isinline) return Qtrue;
|
139
|
+
return Qfalse;
|
140
|
+
}
|
141
|
+
|
142
|
+
/*
|
143
|
+
* call-seq:
|
144
|
+
* deprecated?
|
145
|
+
*
|
146
|
+
* Is this element deprecated?
|
147
|
+
*/
|
148
|
+
static VALUE deprecated_eh(VALUE self)
|
149
|
+
{
|
150
|
+
htmlElemDesc * description;
|
151
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
152
|
+
|
153
|
+
if(description->depr) return Qtrue;
|
154
|
+
return Qfalse;
|
155
|
+
}
|
156
|
+
|
157
|
+
/*
|
158
|
+
* call-seq:
|
159
|
+
* empty?
|
160
|
+
*
|
161
|
+
* Is this an empty element?
|
162
|
+
*/
|
163
|
+
static VALUE empty_eh(VALUE self)
|
164
|
+
{
|
165
|
+
htmlElemDesc * description;
|
166
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
167
|
+
|
168
|
+
if(description->empty) return Qtrue;
|
169
|
+
return Qfalse;
|
170
|
+
}
|
171
|
+
|
172
|
+
/*
|
173
|
+
* call-seq:
|
174
|
+
* save_end_tag?
|
175
|
+
*
|
176
|
+
* Should the end tag be saved?
|
177
|
+
*/
|
178
|
+
static VALUE save_end_tag_eh(VALUE self)
|
179
|
+
{
|
180
|
+
htmlElemDesc * description;
|
181
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
182
|
+
|
183
|
+
if(description->saveEndTag) return Qtrue;
|
184
|
+
return Qfalse;
|
185
|
+
}
|
186
|
+
|
187
|
+
/*
|
188
|
+
* call-seq:
|
189
|
+
* implied_end_tag?
|
190
|
+
*
|
191
|
+
* Can the end tag be implied for this tag?
|
192
|
+
*/
|
193
|
+
static VALUE implied_end_tag_eh(VALUE self)
|
194
|
+
{
|
195
|
+
htmlElemDesc * description;
|
196
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
197
|
+
|
198
|
+
if(description->endTag) return Qtrue;
|
199
|
+
return Qfalse;
|
200
|
+
}
|
201
|
+
|
202
|
+
/*
|
203
|
+
* call-seq:
|
204
|
+
* implied_start_tag?
|
205
|
+
*
|
206
|
+
* Can the start tag be implied for this tag?
|
207
|
+
*/
|
208
|
+
static VALUE implied_start_tag_eh(VALUE self)
|
209
|
+
{
|
210
|
+
htmlElemDesc * description;
|
211
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
212
|
+
|
213
|
+
if(description->startTag) return Qtrue;
|
214
|
+
return Qfalse;
|
215
|
+
}
|
216
|
+
|
217
|
+
/*
|
218
|
+
* call-seq:
|
219
|
+
* name
|
220
|
+
*
|
221
|
+
* Get the tag name for this ElemementDescription
|
222
|
+
*/
|
223
|
+
static VALUE name(VALUE self)
|
224
|
+
{
|
225
|
+
htmlElemDesc * description;
|
226
|
+
Data_Get_Struct(self, htmlElemDesc, description);
|
227
|
+
|
228
|
+
if(NULL == description->name) return Qnil;
|
229
|
+
return NOKOGIRI_STR_NEW2(description->name, "UTF-8");
|
230
|
+
}
|
231
|
+
|
232
|
+
/*
|
233
|
+
* call-seq:
|
234
|
+
* [](tag_name)
|
235
|
+
*
|
236
|
+
* Get ElemementDescription for +tag_name+
|
237
|
+
*/
|
238
|
+
static VALUE get_description(VALUE klass, VALUE tag_name)
|
239
|
+
{
|
240
|
+
const htmlElemDesc * description = htmlTagLookup(
|
241
|
+
(const xmlChar *)StringValuePtr(tag_name)
|
242
|
+
);
|
243
|
+
|
244
|
+
if(NULL == description) return Qnil;
|
245
|
+
return Data_Wrap_Struct(klass, 0, 0, description);
|
246
|
+
}
|
247
|
+
|
248
|
+
VALUE cNokogiriHtmlElementDescription ;
|
249
|
+
void init_html_element_description()
|
250
|
+
{
|
251
|
+
VALUE nokogiri = rb_define_module("Nokogiri");
|
252
|
+
VALUE html = rb_define_module_under(nokogiri, "HTML");
|
253
|
+
VALUE klass = rb_define_class_under(html, "ElementDescription",rb_cObject);
|
254
|
+
|
255
|
+
cNokogiriHtmlElementDescription = klass;
|
256
|
+
|
257
|
+
rb_define_singleton_method(klass, "[]", get_description, 1);
|
258
|
+
|
259
|
+
rb_define_method(klass, "name", name, 0);
|
260
|
+
rb_define_method(klass, "implied_start_tag?", implied_start_tag_eh, 0);
|
261
|
+
rb_define_method(klass, "implied_end_tag?", implied_end_tag_eh, 0);
|
262
|
+
rb_define_method(klass, "save_end_tag?", save_end_tag_eh, 0);
|
263
|
+
rb_define_method(klass, "empty?", empty_eh, 0);
|
264
|
+
rb_define_method(klass, "deprecated?", deprecated_eh, 0);
|
265
|
+
rb_define_method(klass, "inline?", inline_eh, 0);
|
266
|
+
rb_define_method(klass, "description", description, 0);
|
267
|
+
rb_define_method(klass, "sub_elements", sub_elements, 0);
|
268
|
+
rb_define_method(klass, "default_sub_element", default_sub_element, 0);
|
269
|
+
rb_define_method(klass, "optional_attributes", optional_attributes, 0);
|
270
|
+
rb_define_method(klass, "deprecated_attributes", deprecated_attributes, 0);
|
271
|
+
rb_define_method(klass, "required_attributes", required_attributes, 0);
|
272
|
+
}
|