xml-mixup 0.1.6 → 0.1.8
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 +4 -4
- data/.gitignore +1 -0
- data/lib/xml/mixup/version.rb +1 -1
- data/lib/xml/mixup.rb +79 -20
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d600f3895e5048db0b914aa5252b480486bf0c45591a3eb73e4ddcef410b5d8
|
4
|
+
data.tar.gz: '088830420d03127e46e1d5d9e23dc8e6e9ab9bf9caad6ad88f9906ad8928fabe'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac41a0326ac73bff9b2fb89f8ead181e0cc308195d64d0b29ad76315e8c8687dfd570eb546572212fb8ab2f6fd08d6c559a0a1069982b18cadd4eb4c45c56384
|
7
|
+
data.tar.gz: 8fea64d8a5079e1f7e6e4e592f4517499c5026281ae9c62806f91e4e8aa2fdaf6fce26bfd739dabbe6d003f10ab7df30873f63698f9e1f4a86d6d1f9ad0a3f73
|
data/.gitignore
CHANGED
data/lib/xml/mixup/version.rb
CHANGED
data/lib/xml/mixup.rb
CHANGED
@@ -304,9 +304,13 @@ module XML::Mixup
|
|
304
304
|
p, _ = /^(?:([^:]+):)?(.+)$/.match(k).captures
|
305
305
|
ns[p] ||= nil
|
306
306
|
end
|
307
|
+
|
307
308
|
# also do the tag prefix but only if there is a local name
|
308
309
|
ns[prefix] ||= nil if local
|
309
310
|
|
311
|
+
# unconditionally remove ns['xml'], we never want it in there
|
312
|
+
ns.delete 'xml'
|
313
|
+
|
310
314
|
# pseudo is a stand-in for non-parent adjacent nodes
|
311
315
|
pseudo = nodes[:pseudo] || nodes[:parent]
|
312
316
|
|
@@ -324,7 +328,7 @@ module XML::Mixup
|
|
324
328
|
|
325
329
|
# there should be no nil namespace declarations now
|
326
330
|
if ns.has_value? nil
|
327
|
-
raise
|
331
|
+
raise "INTERNAL ERROR: nil namespace declaration: #{ns}"
|
328
332
|
end
|
329
333
|
|
330
334
|
# generate the node
|
@@ -373,7 +377,8 @@ module XML::Mixup
|
|
373
377
|
#
|
374
378
|
# @param vocab [#to_s] the contents of the root node's +vocab=+.
|
375
379
|
#
|
376
|
-
# @param lang [#to_s] the contents of +lang=+ and when applicable,
|
380
|
+
# @param lang [#to_s] the contents of +lang=+ and when applicable,
|
381
|
+
# +xml:lang+.
|
377
382
|
#
|
378
383
|
# @param title [#to_s, #to_a, Hash] the contents of the +<title>+
|
379
384
|
# tag. When given as an array-like object, all elements after the
|
@@ -381,9 +386,11 @@ module XML::Mixup
|
|
381
386
|
# the +property=+ attribute. When given as a {Hash}, it will be
|
382
387
|
# coerced into a snippet of spec that produces the appropriate tag.
|
383
388
|
#
|
384
|
-
# @param link [#to_a, Hash] A spec describing one or more +<link/>+
|
389
|
+
# @param link [#to_a, Hash] A spec describing one or more +<link/>+
|
390
|
+
# elements.
|
385
391
|
#
|
386
|
-
# @param meta [#to_a, Hash] A spec describing one or more +<meta/>+
|
392
|
+
# @param meta [#to_a, Hash] A spec describing one or more +<meta/>+
|
393
|
+
# elements.
|
387
394
|
#
|
388
395
|
# @param style [#to_a, Hash] A spec describing one or more
|
389
396
|
# +<style/>+ elements.
|
@@ -391,12 +398,16 @@ module XML::Mixup
|
|
391
398
|
# @param script [#to_a, Hash] A spec describing one or more
|
392
399
|
# +<script/>+ elements.
|
393
400
|
#
|
401
|
+
# @param extra [#to_a, Hash] A spec describing any extra elements
|
402
|
+
# inside +<head>+ that aren't in the previous categories.
|
403
|
+
#
|
394
404
|
# @param attr [Hash] A spec containing attributes for the +<body>+.
|
395
405
|
#
|
396
406
|
# @param content [Hash, Array, Nokogiri::XML::Node, ...] A spec which
|
397
407
|
# will be attached underneath the +<body>+.
|
398
408
|
#
|
399
|
-
# @param head [Hash] A spec which overrides the entire
|
409
|
+
# @param head [Hash, Array] A Hash spec which overrides the entire
|
410
|
+
# +<head>+ element, or otherwise an array of its children.
|
400
411
|
#
|
401
412
|
# @param body [Hash] A spec which overrides the entire +<body>+.
|
402
413
|
#
|
@@ -418,7 +429,7 @@ module XML::Mixup
|
|
418
429
|
|
419
430
|
def xhtml_stub doc: nil, base: nil, ns: {}, prefix: {}, vocab: nil,
|
420
431
|
lang: nil, title: nil, link: [], meta: [], style: [], script: [],
|
421
|
-
head: {}, body: {}, attr: {}, content: [],
|
432
|
+
extra: [], head: {}, body: {}, attr: {}, content: [],
|
422
433
|
transform: nil, dtd: true, xmlns: true, args: []
|
423
434
|
|
424
435
|
spec = []
|
@@ -426,8 +437,7 @@ module XML::Mixup
|
|
426
437
|
# add xslt stylesheet
|
427
438
|
if transform
|
428
439
|
spec << (transform.is_a?(Hash) ? transform :
|
429
|
-
|
430
|
-
type: 'text/xsl', href: transform.to_s })
|
440
|
+
{ '#pi' => 'xml-stylesheet', type: 'text/xsl', href: transform })
|
431
441
|
end
|
432
442
|
|
433
443
|
# add doctype declaration
|
@@ -436,19 +446,47 @@ module XML::Mixup
|
|
436
446
|
spec << { nil => %w{#dtd html} + ps }
|
437
447
|
end
|
438
448
|
|
449
|
+
# normalize title
|
450
|
+
|
451
|
+
if title.nil? or (title.respond_to?(:empty?) and title.empty?)
|
452
|
+
title = { '#title' => '' } # add an empty string for closing tag
|
453
|
+
elsif title.is_a? Hash
|
454
|
+
# nothing
|
455
|
+
elsif title.respond_to? :to_a
|
456
|
+
title = title.to_a
|
457
|
+
text = title.shift
|
458
|
+
props = title
|
459
|
+
title = { '#title' => text }
|
460
|
+
title[:property] = props unless props.empty?
|
461
|
+
else
|
462
|
+
title = { '#title' => title }
|
463
|
+
end
|
464
|
+
|
465
|
+
# normalize base
|
466
|
+
|
467
|
+
if base and not base.is_a? Hash
|
468
|
+
base = { nil => :base, href: base }
|
469
|
+
end
|
470
|
+
|
471
|
+
# TODO normalize link, meta, style, script elements
|
472
|
+
|
439
473
|
# construct document tree
|
440
474
|
|
441
475
|
head ||= {}
|
442
|
-
if head.
|
443
|
-
head[nil] = [:head, title, base, link, meta, style, script]
|
476
|
+
if head.is_a? Hash and head.empty?
|
477
|
+
head[nil] = [:head, title, base, link, meta, style, script, extra]
|
478
|
+
elsif head.is_a? Array
|
479
|
+
# children of unmarked head element
|
480
|
+
head = { nil => [:head] + head }
|
444
481
|
end
|
445
482
|
|
446
483
|
body ||= {}
|
447
|
-
if body.
|
484
|
+
if body.is_a? Hash and body.empty?
|
448
485
|
body[nil] = [:body, content]
|
486
|
+
body = attr.merge(body) if attr and attr.is_a?(Hash)
|
449
487
|
end
|
450
488
|
|
451
|
-
root = { nil => [:html,
|
489
|
+
root = { nil => [:html, head, body] }
|
452
490
|
root[:vocab] = vocab if vocab
|
453
491
|
root[:lang] = lang if lang
|
454
492
|
|
@@ -458,31 +496,52 @@ module XML::Mixup
|
|
458
496
|
|
459
497
|
# namespaced language attribute
|
460
498
|
root['xml:lang'] = lang if lang
|
499
|
+
|
500
|
+
if !prefix and xmlns.is_a? Hash
|
501
|
+
x = prefix.transform_keys { |k| "xmlns:#{k}" }
|
502
|
+
root = x.merge(root)
|
503
|
+
end
|
461
504
|
end
|
462
505
|
|
463
506
|
# deal with prefixes distinct from namespaces
|
464
|
-
|
507
|
+
prefix ||= {}
|
508
|
+
if prefix.respond_to? :to_h
|
509
|
+
prefix = prefix.to_h
|
510
|
+
unless prefix.empty?
|
511
|
+
# this will get automatically smushed into the right shape
|
512
|
+
root[:prefix] = prefix
|
513
|
+
|
514
|
+
if xmlns
|
515
|
+
x = prefix.transform_keys { |k| "xmlns:#{k}" }
|
516
|
+
root = x.merge(root)
|
517
|
+
end
|
518
|
+
end
|
465
519
|
end
|
466
520
|
|
467
521
|
# add the document structure to the spec
|
468
522
|
spec << root
|
469
523
|
|
470
524
|
# as usual this will return the last innermost node
|
471
|
-
markup spec: spec, doc: doc
|
525
|
+
markup spec: spec, doc: doc, args: args
|
472
526
|
end
|
473
527
|
|
474
528
|
private
|
475
529
|
|
476
530
|
def element tag, doc: nil, ns: {}, attr: {}, args: []
|
477
531
|
raise 'Document node must be present' unless doc
|
478
|
-
|
532
|
+
pfx = nil
|
479
533
|
if tag.respond_to? :to_a
|
480
|
-
|
481
|
-
tag = tag[0..1].join ':'
|
534
|
+
pfx = tag[0]
|
535
|
+
tag = tag.to_a[0..1].join ':'
|
536
|
+
elsif m = tag.match(/([^:]+):/)
|
537
|
+
pfx = m[1]
|
482
538
|
end
|
539
|
+
|
483
540
|
elem = doc.create_element tag.to_s
|
484
|
-
|
485
|
-
|
541
|
+
elem.default_namespace = ns[pfx] if ns[pfx]
|
542
|
+
|
543
|
+
ns.keys.sort { |a, b| a.to_s <=> b.to_s }.each do |p|
|
544
|
+
elem.add_namespace((p.nil? ? p : p.to_s), ns[p].to_s)
|
486
545
|
end
|
487
546
|
attr.sort.each do |k, v|
|
488
547
|
elem[k.to_s] = flatten(v, args)
|
@@ -491,7 +550,7 @@ module XML::Mixup
|
|
491
550
|
elem
|
492
551
|
end
|
493
552
|
|
494
|
-
ATOMS = [String, Symbol, Numeric, NilClass, FalseClass, TrueClass]
|
553
|
+
ATOMS = [String, Symbol, Numeric, NilClass, FalseClass, TrueClass].freeze
|
495
554
|
|
496
555
|
# yo dawg
|
497
556
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xml-mixup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dorian Taylor
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|