@@ -314,7 +314,7 @@ def initialize(options = {}, root = nil, &block)
314
314
315
315
@context = nil
316
316
@arity = nil
317
- @ns = nil
317
+ @ns_prefix = nil
318
318
319
319
options = DEFAULT_DOCUMENT_OPTIONS . merge ( options )
320
320
options . each do |k , v |
@@ -355,20 +355,8 @@ def comment(string)
355
355
###
356
356
# Build a tag that is associated with namespace +ns+. Raises an
357
357
# ArgumentError if +ns+ has not been defined higher in the tree.
358
- def []( ns )
359
- if @parent != @doc
360
- @ns = @parent . namespace_definitions . find { |x | x . prefix == ns . to_s }
361
- end
362
- return self if @ns
363
-
364
- @parent . ancestors . each do |a |
365
- next if a == doc
366
-
367
- @ns = a . namespace_definitions . find { |x | x . prefix == ns . to_s }
368
- return self if @ns
369
- end
370
-
371
- @ns = { pending : ns . to_s }
358
+ def []( ns_prefix )
359
+ @ns_prefix = ns_prefix . to_s
372
360
self
373
361
end
374
362
@@ -395,29 +383,33 @@ def method_missing(method, *args, &block) # :nodoc:
395
383
if @context &.respond_to? ( method )
396
384
@context . send ( method , *args , &block )
397
385
else
398
- node = @doc . create_element ( method . to_s . sub ( /[_!]$/ , "" ) , *args ) do |n |
399
- # Set up the namespace
400
- if @ns . is_a? ( Nokogiri ::XML ::Namespace )
401
- n . namespace = @ns
402
- @ns = nil
403
- end
404
- end
405
-
406
- if @ns . is_a? ( Hash )
407
- node . namespace = node . namespace_definitions . find { |x | x . prefix == @ns [ :pending ] }
408
- if node . namespace . nil?
409
- raise ArgumentError , "Namespace #{ @ns [ :pending ] } has not been defined"
410
- end
411
-
412
- @ns = nil
413
- end
414
-
386
+ node = @doc . create_element ( method . to_s . sub ( /[_!]$/ , "" ) , *args )
387
+ bind_ns ( node )
415
388
insert ( node , &block )
416
389
end
417
390
end
418
391
419
392
private
420
393
394
+ def bind_ns ( node )
395
+ return if @ns_prefix . nil?
396
+
397
+ ancestors = [ node , parent , parent . ancestors ] . flatten
398
+ ancestors . each do |ancestor |
399
+ break if ancestor . nil? || ancestor == @doc
400
+
401
+ if ( ns = ancestor . namespace_definitions . find { |x | x . prefix == @ns_prefix } )
402
+ @ns_prefix = nil
403
+ node . namespace = ns
404
+ break
405
+ end
406
+ end
407
+
408
+ return if @ns_prefix . nil?
409
+
410
+ raise ArgumentError , "Namespace prefix #{ @ns_prefix . inspect } has not been defined"
411
+ end
412
+
421
413
###
422
414
# Insert +node+ as a child of the current Node
423
415
def insert ( node , &block )
0 commit comments