nokogiri 1.7.2 → 1.8.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.

Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.cross_rubies +4 -4
  3. data/.travis.yml +43 -24
  4. data/CHANGELOG.md +54 -6
  5. data/Gemfile +8 -7
  6. data/Gemfile-libxml-ruby +3 -0
  7. data/LICENSE-DEPENDENCIES.md +1612 -0
  8. data/{LICENSE.txt → LICENSE.md} +1 -1
  9. data/Manifest.txt +5 -8
  10. data/README.md +8 -5
  11. data/Rakefile +15 -31
  12. data/appveyor.yml +2 -0
  13. data/dependencies.yml +12 -7
  14. data/ext/nokogiri/extconf.rb +12 -17
  15. data/ext/nokogiri/nokogiri.h +0 -10
  16. data/ext/nokogiri/xml_attr.c +12 -8
  17. data/ext/nokogiri/xml_node.c +17 -14
  18. data/ext/nokogiri/xml_sax_push_parser.c +56 -12
  19. data/lib/nokogiri/html/sax/parser.rb +10 -0
  20. data/lib/nokogiri/version.rb +5 -4
  21. data/lib/nokogiri/xml/document.rb +9 -9
  22. data/lib/nokogiri/xml/node.rb +7 -7
  23. data/lib/nokogiri/xml/node_set.rb +12 -7
  24. data/lib/nokogiri/xml/sax/parser.rb +6 -7
  25. data/lib/nokogiri/xml/searchable.rb +34 -25
  26. data/lib/nokogiri/xml/syntax_error.rb +24 -1
  27. data/test/decorators/test_slop.rb +4 -1
  28. data/test/helper.rb +10 -0
  29. data/test/html/sax/test_parser.rb +27 -0
  30. data/test/html/test_document.rb +12 -1
  31. data/test/html/test_document_encoding.rb +1 -3
  32. data/test/html/test_document_fragment.rb +3 -0
  33. data/test/xml/sax/test_push_parser.rb +48 -0
  34. data/test/xml/test_attr.rb +7 -0
  35. data/test/xml/test_document.rb +1 -1
  36. data/test/xml/test_document_fragment.rb +27 -0
  37. data/test/xml/test_entity_reference.rb +2 -2
  38. data/test/xml/test_node.rb +12 -15
  39. data/test/xml/test_node_reparenting.rb +14 -0
  40. data/test/xml/test_node_set.rb +8 -6
  41. data/test/xml/test_reader.rb +19 -0
  42. data/test/xml/test_syntax_error.rb +21 -15
  43. data/test/xml/test_unparented_node.rb +54 -11
  44. data/test/xml/test_xpath.rb +23 -6
  45. metadata +31 -19
  46. data/suppressions/nokogiri_ree-1.8.7.358.supp +0 -61
  47. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  48. data/suppressions/nokogiri_ruby-1.9.2.320.supp +0 -28
  49. data/suppressions/nokogiri_ruby-1.9.3.327.supp +0 -28
  50. data/test_all +0 -105
@@ -1,6 +1,6 @@
1
1
  (The MIT License)
2
2
 
3
- Copyright (c) 2008 - 2016:
3
+ Copyright (c) 2008 - 2017:
4
4
 
5
5
  * [Aaron Patterson](http://tenderlovemaking.com)
6
6
  * [Mike Dalessio](http://mike.daless.io)
@@ -7,7 +7,9 @@ CHANGELOG.md
7
7
  CONTRIBUTING.md
8
8
  C_CODING_STYLE.rdoc
9
9
  Gemfile
10
- LICENSE.txt
10
+ Gemfile-libxml-ruby
11
+ LICENSE-DEPENDENCIES.md
12
+ LICENSE.md
11
13
  Manifest.txt
12
14
  README.md
13
15
  ROADMAP.md
@@ -54,7 +56,6 @@ ext/java/nokogiri/internals/ClosedStreamException.java
54
56
  ext/java/nokogiri/internals/HtmlDomParserContext.java
55
57
  ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java
56
58
  ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java
57
- ext/java/nokogiri/internals/NokogiriDocumentCache.java
58
59
  ext/java/nokogiri/internals/NokogiriDomParser.java
59
60
  ext/java/nokogiri/internals/NokogiriEncodingReaderWrapper.java
60
61
  ext/java/nokogiri/internals/NokogiriEntityResolver.java
@@ -75,10 +76,10 @@ ext/java/nokogiri/internals/ReaderNode.java
75
76
  ext/java/nokogiri/internals/SaveContextVisitor.java
76
77
  ext/java/nokogiri/internals/SchemaErrorHandler.java
77
78
  ext/java/nokogiri/internals/UncloseableInputStream.java
79
+ ext/java/nokogiri/internals/XalanDTMManagerPatch.java
78
80
  ext/java/nokogiri/internals/XmlDeclHandler.java
79
81
  ext/java/nokogiri/internals/XmlDomParserContext.java
80
82
  ext/java/nokogiri/internals/XmlSaxParser.java
81
- ext/java/nokogiri/internals/XsltExtensionFunction.java
82
83
  ext/java/nokogiri/internals/c14n/AttrCompare.java
83
84
  ext/java/nokogiri/internals/c14n/C14nHelper.java
84
85
  ext/java/nokogiri/internals/c14n/CanonicalFilter.java
@@ -106,6 +107,7 @@ ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java
106
107
  ext/java/nokogiri/internals/c14n/NodeFilter.java
107
108
  ext/java/nokogiri/internals/c14n/UtfHelpper.java
108
109
  ext/java/nokogiri/internals/c14n/XMLUtils.java
110
+ ext/java/org/apache/xml/dtm/ref/dom2dtm/DOM2DTMExt.java
109
111
  ext/nokogiri/depend
110
112
  ext/nokogiri/extconf.rb
111
113
  ext/nokogiri/html_document.c
@@ -253,10 +255,6 @@ patches/libxslt/0001-Fix-heap-overread-in-xsltFormatNumberConversion.patch
253
255
  patches/libxslt/0002-Check-for-integer-overflow-in-xsltAddTextString.patch
254
256
  patches/sort-patches-by-date
255
257
  suppressions/README.txt
256
- suppressions/nokogiri_ree-1.8.7.358.supp
257
- suppressions/nokogiri_ruby-1.8.7.370.supp
258
- suppressions/nokogiri_ruby-1.9.2.320.supp
259
- suppressions/nokogiri_ruby-1.9.3.327.supp
260
258
  tasks/test.rb
261
259
  test/css/test_nthiness.rb
262
260
  test/css/test_parser.rb
@@ -366,4 +364,3 @@ test/xml/test_xinclude.rb
366
364
  test/xml/test_xpath.rb
367
365
  test/xslt/test_custom_functions.rb
368
366
  test/xslt/test_exception_handling.rb
369
- test_all
data/README.md CHANGED
@@ -10,10 +10,13 @@
10
10
 
11
11
  ## Status
12
12
 
13
- [![Travis Build Status](https://travis-ci.org/sparklemotion/nokogiri.svg?branch=master)](https://travis-ci.org/sparklemotion/nokogiri)
14
- [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/sparklemotion/nokogiri?branch=master&svg=true)](https://ci.appveyor.com/project/flavorjones/nokogiri?branch=master)
15
- [![Code Climate](https://codeclimate.com/github/sparklemotion/nokogiri.svg)](https://codeclimate.com/github/sparklemotion/nokogiri)
16
- [![Version Eye](https://www.versioneye.com/ruby/nokogiri/badge.png)](https://www.versioneye.com/ruby/nokogiri)
13
+ |System|Status|
14
+ |--|--|
15
+ | Concourse | [![Concourse CI](https://ci.nokogiri.org/api/v1/teams/nokogiri-core/pipelines/nokogiri/jobs/ruby-2.4-system/badge)](https://ci.nokogiri.org/teams/nokogiri-core/pipelines/nokogiri?groups=master) |
16
+ | Travis | [![Travis Build Status](https://travis-ci.org/sparklemotion/nokogiri.svg?branch=master)](https://travis-ci.org/sparklemotion/nokogiri) |
17
+ | Appveyor | [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/sparklemotion/nokogiri?branch=master&svg=true)](https://ci.appveyor.com/project/flavorjones/nokogiri?branch=master) |
18
+ | Code Climate | [![Code Climate](https://codeclimate.com/github/sparklemotion/nokogiri.svg)](https://codeclimate.com/github/sparklemotion/nokogiri) |
19
+ | Version Eye | [![Version Eye](https://www.versioneye.com/ruby/nokogiri/badge.png)](https://www.versioneye.com/ruby/nokogiri) |
17
20
 
18
21
 
19
22
  ## Description
@@ -167,4 +170,4 @@ explicitly setting the encoding to EUC-JP on the parser:
167
170
 
168
171
  ## License
169
172
 
170
- MIT. See the `LICENSE.txt` file.
173
+ MIT. See the `LICENSE.md` file.
data/Rakefile CHANGED
@@ -125,25 +125,29 @@ HOE = Hoe.spec 'nokogiri' do
125
125
 
126
126
  unless java?
127
127
  self.extra_deps += [
128
- ["mini_portile2", "~> 2.1.0"], # keep version in sync with extconf.rb
128
+ ["mini_portile2", "~> 2.2.0"], # keep version in sync with extconf.rb
129
129
  ]
130
130
  end
131
131
 
132
132
  self.extra_dev_deps += [
133
133
  ["hoe-bundler", "~> 1.2.0"],
134
- ["hoe-debugging", "~> 1.2.1"],
134
+ ["hoe-debugging", "~> 1.3.0"],
135
135
  ["hoe-gemspec", "~> 1.0.0"],
136
136
  ["hoe-git", "~> 1.6.0"],
137
137
  ["minitest", "~> 5.8.4"],
138
- ["rake", "~> 10.5.0"],
139
- ["rake-compiler", "~> 0.9.2"],
140
- ["rake-compiler-dock", "~> 0.5.1"],
138
+ ["rake", "~> 12.0"],
139
+ ["rake-compiler", "~> 1.0.3"],
140
+ ["rake-compiler-dock", "~> 0.6.0"],
141
141
  ["racc", "~> 1.4.14"],
142
- ["rexical", "~> 1.0.5"]
142
+ ["rexical", "~> 1.0.5"],
143
+ ["concourse", "~> 0.11"],
143
144
  ]
144
145
 
145
146
  if java?
146
- self.spec_extras = { :platform => 'java' }
147
+ self.spec_extras = {
148
+ :platform => 'java',
149
+ :required_ruby_version => '>= 1.9.3' # JRuby >= 1.7
150
+ }
147
151
  else
148
152
  self.spec_extras = {
149
153
  :extensions => ["ext/nokogiri/extconf.rb"],
@@ -230,11 +234,6 @@ else
230
234
  ext.cross_compiling do |spec|
231
235
  libs = dependencies.map { |name, dep| "#{name}-#{dep["version"]}" }.join(', ')
232
236
 
233
- spec.required_ruby_version = [
234
- '>= 2.1.0',
235
- "< #{CROSS_RUBIES.max_by(&:ver).minor_ver.succ}"
236
- ]
237
-
238
237
  spec.post_install_message = <<-EOS
239
238
  Nokogiri is built with the packaged libraries: #{libs}.
240
239
  EOS
@@ -259,7 +258,7 @@ task 'bundler:gemfile' do
259
258
  old_gemfile_task.invoke if old_gemfile_task
260
259
 
261
260
  lines = File.open('Gemfile', 'r') { |f| f.readlines }.map do |line|
262
- line =~ /racc|rexical/ ? "#{line.strip}, :platform => :ruby" : line
261
+ line =~ /racc|rexical/ ? "#{line.strip}, :platform => [:ruby, :mingw, :x64_mingw]" : line
263
262
  end
264
263
  File.open('Gemfile', 'w') { |f| lines.each { |line| f.puts line } }
265
264
  end
@@ -314,23 +313,8 @@ if Hoe.plugins.include?(:debugging)
314
313
  end
315
314
  end
316
315
 
317
- task "test:libxml-ruby" do
318
- ENV['TEST_NOKOGIRI_WITH_LIBXML_RUBY'] = "1"
319
- warn "#{__FILE__}:#{__LINE__}: --- running tests with libxml-ruby loaded ---"
320
- Rake::Task[:test].execute
321
- ENV['TEST_NOKOGIRI_WITH_LIBXML_RUBY'] = nil
322
- end
323
-
324
- Rake::Task["test:libxml-ruby"].prerequisites << :compile
325
-
326
- task "test:valgrind:libxml-ruby" do
327
- ENV['TEST_NOKOGIRI_WITH_LIBXML_RUBY'] = "1"
328
- warn "#{__FILE__}:#{__LINE__}: --- running tests with libxml-ruby loaded ---"
329
- Rake::Task["test:valgrind"].execute
330
- ENV['TEST_NOKOGIRI_WITH_LIBXML_RUBY'] = nil
331
- end
332
-
333
- Rake::Task["test:valgrind:libxml-ruby"].prerequisites << :compile
316
+ require 'concourse'
317
+ Concourse.new("nokogiri").create_tasks!
334
318
 
335
319
  # ----------------------------------------
336
320
 
@@ -352,7 +336,7 @@ end
352
336
  task :cross do
353
337
  rake_compiler_config_path = File.expand_path("~/.rake-compiler/config.yml")
354
338
  unless File.exists? rake_compiler_config_path
355
- raise "rake-compiler has not installed any cross rubies. Try using rake-compiler-dev-box for building binary windows gems.'"
339
+ raise "rake-compiler has not installed any cross rubies. Use rake-compiler-dock or 'rake gem:windows' for building binary windows gems."
356
340
  end
357
341
 
358
342
  CROSS_RUBIES.each do |cross_ruby|
@@ -13,6 +13,8 @@ test_script:
13
13
 
14
14
  environment:
15
15
  matrix:
16
+ - ruby_version: "23"
17
+ - ruby_version: "23-x64"
16
18
  - ruby_version: "22"
17
19
  - ruby_version: "22-x64"
18
20
  - ruby_version: "21"
@@ -1,6 +1,6 @@
1
1
  libxml2:
2
2
  version: "2.9.4"
3
- md5: "ae249165c173b1ff386ee8ad676815f5" # manually confirmed via `gpg --verify`
3
+ sha256: "ffb911191e509b966deb55de705387f14156e1a56b21824357cdf0053233633c" # manually confirmed via `gpg --verify`
4
4
  # gpg: Signature made Mon 23 May 2016 04:02:13 AM EDT using DSA key ID DE95BC1F
5
5
  # gpg: Good signature from "Daniel Veillard (Red Hat work email) <veillard@redhat.com>"
6
6
  # gpg: aka "Daniel Veillard <Daniel.Veillard@w3.org>"
@@ -10,7 +10,7 @@ libxml2:
10
10
 
11
11
  libxslt:
12
12
  version: "1.1.29"
13
- md5: "a129d3c44c022de3b9dcf6d6f288d72e"
13
+ sha256: "b5976e3857837e7617b29f2249ebb5eeac34e249208d31f1fbf7a6ba7a4090ce"
14
14
  # gpg: Signature made Mon 23 May 2016 09:58:52 PM EDT using DSA key ID DE95BC1F
15
15
  # gpg: Good signature from "Daniel Veillard (Red Hat work email) <veillard@redhat.com>"
16
16
  # gpg: aka "Daniel Veillard <Daniel.Veillard@w3.org>"
@@ -20,10 +20,15 @@ libxslt:
20
20
 
21
21
  zlib:
22
22
  version: "1.2.11"
23
- md5: "1c9f62f0778697a09d36121ead88e08e"
23
+ sha256: "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1"
24
+ # SHA-256 hash provided on http://zlib.net/
24
25
 
25
26
  libiconv:
26
- version: "1.14"
27
- md5: "e34509b1623cec449dfeb73d7ce9c6c6"
28
- # gpg: Signature made Sun 07 Aug 2011 01:58:18 PM EDT using DSA key ID F059B1D1
29
- # gpg: BAD signature from "Bruno Haible (Open Source Development) <bruno@clisp.org>"
27
+ version: "1.15"
28
+ sha256: "ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc8913178"
29
+ # gpg: Signature made Fri Feb 3 00:38:12 2017 CET
30
+ # gpg: using RSA key 4F494A942E4616C2
31
+ # gpg: Good signature from "Bruno Haible (Open Source Development) <bruno@clisp.org>" [unknown]
32
+ # gpg: WARNING: This key is not certified with a trusted signature!
33
+ # gpg: There is no indication that the signature belongs to the owner.
34
+ # Primary key fingerprint: 68D9 4D8A AEEA D48A E7DC 5B90 4F49 4A94 2E46 16C2
@@ -223,8 +223,8 @@ def iconv_configure_flags
223
223
 
224
224
  return [
225
225
  '--with-iconv=yes',
226
- *("CPPFLAGS=#{idirs.map { |dir| '-I' << dir }.join(' ')}" if idirs),
227
- *("LDFLAGS=#{ldirs.map { |dir| '-L' << dir }.join(' ')}" if ldirs),
226
+ *("CPPFLAGS=#{idirs.map { |dir| '-I' + dir }.join(' ')}" if idirs),
227
+ *("LDFLAGS=#{ldirs.map { |dir| '-L' + dir }.join(' ')}" if ldirs),
228
228
  ]
229
229
  end
230
230
  end
@@ -260,11 +260,12 @@ end
260
260
 
261
261
  def process_recipe(name, version, static_p, cross_p)
262
262
  MiniPortile.new(name, version).tap do |recipe|
263
- recipe.target = portsdir = File.join(ROOT, "ports")
263
+ recipe.target = File.join(ROOT, "ports")
264
264
  # Prefer host_alias over host in order to use i586-mingw32msvc as
265
265
  # correct compiler prefix for cross build, but use host if not set.
266
266
  recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"]
267
267
  recipe.patch_files = Dir[File.join(ROOT, "patches", name, "*.patch")].sort
268
+ recipe.configure_options << "--libdir=#{File.join(recipe.path, "lib")}"
268
269
 
269
270
  yield recipe
270
271
 
@@ -307,7 +308,7 @@ def process_recipe(name, version, static_p, cross_p)
307
308
  if RbConfig::CONFIG['target_cpu'] == 'universal'
308
309
  %w[CFLAGS LDFLAGS].each do |key|
309
310
  unless env[key].include?('-arch')
310
- env[key] << ' ' << RbConfig::CONFIG['ARCH_FLAG']
311
+ env[key] += ' ' + RbConfig::CONFIG['ARCH_FLAG']
311
312
  end
312
313
  end
313
314
  end
@@ -391,7 +392,7 @@ when arg_config('--clean')
391
392
  do_clean
392
393
  end
393
394
 
394
- if openbsd?
395
+ if openbsd? && !using_system_libraries?
395
396
  ENV['CC'] ||= find_executable('egcc') or
396
397
  abort "Please install gcc 4.9+ from ports using `pkg_add -v gcc`"
397
398
  end
@@ -456,7 +457,7 @@ else
456
457
  # The gem version constraint in the Rakefile is not respected at install time.
457
458
  # Keep this version in sync with the one in the Rakefile !
458
459
  require 'rubygems'
459
- gem 'mini_portile2', '~> 2.1.0'
460
+ gem 'mini_portile2', '~> 2.2.0'
460
461
  require 'mini_portile2'
461
462
  message "Using mini_portile version #{MiniPortile::VERSION}\n"
462
463
 
@@ -473,8 +474,8 @@ else
473
474
  if cross_build_p || windows?
474
475
  zlib_recipe = process_recipe("zlib", dependencies["zlib"]["version"], static_p, cross_build_p) do |recipe|
475
476
  recipe.files = [{
476
- url: "http://zlib.net/#{recipe.name}-#{recipe.version}.tar.gz",
477
- md5: dependencies["zlib"]["md5"]
477
+ url: "http://zlib.net/fossils/#{recipe.name}-#{recipe.version}.tar.gz",
478
+ sha256: dependencies["zlib"]["sha256"]
478
479
  }]
479
480
  class << recipe
480
481
  attr_accessor :cross_build_p
@@ -512,7 +513,7 @@ else
512
513
  libiconv_recipe = process_recipe("libiconv", dependencies["libiconv"]["version"], static_p, cross_build_p) do |recipe|
513
514
  recipe.files = [{
514
515
  url: "http://ftp.gnu.org/pub/gnu/libiconv/#{recipe.name}-#{recipe.version}.tar.gz",
515
- md5: dependencies["libiconv"]["md5"]
516
+ sha256: dependencies["libiconv"]["sha256"]
516
517
  }]
517
518
  recipe.configure_options += [
518
519
  "CPPFLAGS=-Wall",
@@ -547,7 +548,7 @@ EOM
547
548
  libxml2_recipe = process_recipe("libxml2", dependencies["libxml2"]["version"], static_p, cross_build_p) do |recipe|
548
549
  recipe.files = [{
549
550
  url: "http://xmlsoft.org/sources/#{recipe.name}-#{recipe.version}.tar.gz",
550
- md5: dependencies["libxml2"]["md5"]
551
+ sha256: dependencies["libxml2"]["sha256"]
551
552
  }]
552
553
  recipe.configure_options += [
553
554
  "--without-python",
@@ -563,7 +564,7 @@ EOM
563
564
  libxslt_recipe = process_recipe("libxslt", dependencies["libxslt"]["version"], static_p, cross_build_p) do |recipe|
564
565
  recipe.files = [{
565
566
  url: "http://xmlsoft.org/sources/#{recipe.name}-#{recipe.version}.tar.gz",
566
- md5: dependencies["libxslt"]["md5"]
567
+ sha256: dependencies["libxslt"]["sha256"]
567
568
  }]
568
569
  recipe.configure_options += [
569
570
  "--without-python",
@@ -657,12 +658,6 @@ have_func('xmlRelaxNGSetValidStructuredErrors')
657
658
  have_func('xmlSchemaSetValidStructuredErrors')
658
659
  have_func('xmlSchemaSetParserStructuredErrors')
659
660
 
660
- if ENV['CPUPROFILE']
661
- unless find_library('profiler', 'ProfilerEnable', *LIB_DIRS)
662
- abort "google performance tools are not installed"
663
- end
664
- end
665
-
666
661
  create_makefile('nokogiri/nokogiri')
667
662
 
668
663
  if enable_config('clean', true)
@@ -34,16 +34,6 @@ int vasprintf (char **strp, const char *fmt, va_list ap);
34
34
  #include <ruby/st.h>
35
35
  #include <ruby/encoding.h>
36
36
 
37
- #ifndef UNUSED
38
- # if defined(__GNUC__)
39
- # define MAYBE_UNUSED(name) name __attribute__((unused))
40
- # define UNUSED(name) MAYBE_UNUSED(UNUSED_ ## name)
41
- # else
42
- # define MAYBE_UNUSED(name) name
43
- # define UNUSED(name) name
44
- # endif
45
- #endif
46
-
47
37
  #ifndef NORETURN
48
38
  # if defined(__GNUC__)
49
39
  # define NORETURN(name) __attribute__((noreturn)) name
@@ -11,11 +11,11 @@ static VALUE set_value(VALUE self, VALUE content)
11
11
  xmlAttrPtr attr;
12
12
  Data_Get_Struct(self, xmlAttr, attr);
13
13
 
14
- if(attr->children) xmlFreeNodeList(attr->children);
14
+ if (attr->children) { xmlFreeNodeList(attr->children); }
15
15
 
16
16
  attr->children = attr->last = NULL;
17
17
 
18
- if(content) {
18
+ if (content) {
19
19
  xmlChar *buffer;
20
20
  xmlNode *tmp;
21
21
 
@@ -30,7 +30,7 @@ static VALUE set_value(VALUE self, VALUE content)
30
30
  for(tmp = attr->children; tmp; tmp = tmp->next) {
31
31
  tmp->parent = (xmlNode *)attr;
32
32
  tmp->doc = attr->doc;
33
- if(tmp->next == NULL) attr->last = tmp;
33
+ if (tmp->next == NULL) { attr->last = tmp; }
34
34
  }
35
35
 
36
36
  /* Free up memory */
@@ -57,20 +57,24 @@ static VALUE new(int argc, VALUE *argv, VALUE klass)
57
57
 
58
58
  rb_scan_args(argc, argv, "2*", &document, &name, &rest);
59
59
 
60
+ if (! rb_obj_is_kind_of(document, cNokogiriXmlDocument)) {
61
+ rb_raise(rb_eArgError, "parameter must be a Nokogiri::XML::Document");
62
+ }
63
+
60
64
  Data_Get_Struct(document, xmlDoc, xml_doc);
61
65
 
62
66
  node = xmlNewDocProp(
63
- xml_doc,
64
- (const xmlChar *)StringValueCStr(name),
65
- NULL
66
- );
67
+ xml_doc,
68
+ (const xmlChar *)StringValueCStr(name),
69
+ NULL
70
+ );
67
71
 
68
72
  nokogiri_root_node((xmlNodePtr)node);
69
73
 
70
74
  rb_node = Nokogiri_wrap_xml_node(klass, (xmlNodePtr)node);
71
75
  rb_obj_call_init(rb_node, argc, argv);
72
76
 
73
- if(rb_block_given_p()) rb_yield(rb_node);
77
+ if (rb_block_given_p()) { rb_yield(rb_node); }
74
78
 
75
79
  return rb_node;
76
80
  }
@@ -833,37 +833,40 @@ static VALUE set(VALUE self, VALUE property, VALUE value)
833
833
  static VALUE get(VALUE self, VALUE rattribute)
834
834
  {
835
835
  xmlNodePtr node;
836
- xmlChar* value = 0;
837
- VALUE rvalue ;
838
- char* attribute = 0;
839
- char *colon = 0, *attr_name = 0, *prefix = 0;
836
+ const xmlChar *value = 0;
837
+ VALUE rvalue;
838
+ xmlChar *colon;
839
+ const xmlChar *attribute, *attr_name, *prefix;
840
840
  xmlNsPtr ns;
841
841
 
842
842
  if (NIL_P(rattribute)) return Qnil;
843
843
 
844
844
  Data_Get_Struct(self, xmlNode, node);
845
- attribute = strdup(StringValueCStr(rattribute));
845
+ attribute = xmlCharStrdup(StringValueCStr(rattribute));
846
846
 
847
- colon = strchr(attribute, ':');
847
+ colon = (xmlChar *)xmlStrchr(attribute, (const xmlChar)':');
848
848
  if (colon) {
849
- (*colon) = 0 ; /* create two null-terminated strings of the prefix and attribute name */
850
- prefix = attribute ;
851
- attr_name = colon + 1 ;
852
- ns = xmlSearchNs(node->doc, node, (const xmlChar *)(prefix));
849
+ /* split the attribute string into separate prefix and name by
850
+ * null-terminating the prefix at the colon */
851
+ prefix = attribute;
852
+ attr_name = colon + 1;
853
+ (*colon) = 0;
854
+
855
+ ns = xmlSearchNs(node->doc, node, prefix);
853
856
  if (ns) {
854
- value = xmlGetNsProp(node, (xmlChar*)(attr_name), ns->href);
857
+ value = xmlGetNsProp(node, attr_name, ns->href);
855
858
  } else {
856
859
  value = xmlGetProp(node, (xmlChar*)StringValueCStr(rattribute));
857
860
  }
858
861
  } else {
859
- value = xmlGetNoNsProp(node, (xmlChar*)attribute);
862
+ value = xmlGetNoNsProp(node, attribute);
860
863
  }
861
864
 
862
- free(attribute);
865
+ xmlFree((void *)attribute);
863
866
  if (!value) return Qnil;
864
867
 
865
868
  rvalue = NOKOGIRI_STR_NEW2(value);
866
- xmlFree(value);
869
+ xmlFree((void *)value);
867
870
 
868
871
  return rvalue ;
869
872
  }