+#!/usr/bin/ruby
+# coding: utf-8
+
+require 'nokogiri'
+
+LogLevel=1
+raise ArgumentError, 'Source/destination files not specified' if ARGV.size != 2
+srcfile = ARGV[0]
+dstfile = ARGV[1]
+
+f=File.open(srcfile)
+xml = Nokogiri::XML(f)
+
+def log(level,what)
+ indicators = %w(! • # -)
+ if level >= LogLevel
+ print indicators[level]
+ else
+ print "\n%s %s\n" % ['*' * (level+1), what]
+ end
+end
+
+def partreplace(xml, partid, tag)
+ xml.css('part[id=' + partid + ']').each do |part|
+ part.name = tag
+ end
+end
+
+
+log 0, 'replace article* with book*'
+xml.css('articleinfo').each do |node|
+ node.name = 'bookinfo'
+ node.first_element_child.before(<<'XML')
+<publisher>
+ <publishername>Gunnar Wolf</publishername>
+ <address><city>Mexico City</city></address>
+</publisher>
+XML
+ node.first_element_child.before(<<'XML')
+<copyright>
+ <year>2017</year>
+ <holder>Creative Commons</holder>
+</publisher>
+XML
+end
+xml.css('article').each do |node|
+ node.name = 'book'
+ node['lang'] = 'en'
+end
+
+log 0, 'change parts to colophon, dedication and chapter'
+partreplace(xml, 'colophon', 'colophon')
+partreplace(xml, 'dedication', 'dedication')
+partreplace(xml, 'foreword', 'chapter')
+partreplace(xml, 'introduction', 'chapter')
+partreplace(xml, 'bibliography', 'chapter')
+partreplace(xml, 'acknowledgments', 'chapter')
+
+log 0, 'place part introduction into <partintro>'
+s = xml.xpath("//part/title[text()='The Case Studies']")[0]
+if s
+ s.after('<partintro>')
+ p = xml.css('part partintro')[0]
+ s.parent.xpath("//part/para").each do |node|
+ node.parent = p
+ end
+end
+
+log 0, 'Writing processed file'
+# Unable to figure out API way to replace DOCTYPE
+data = xml.to_xml().gsub!(/DOCTYPE article/, 'DOCTYPE book')
+File.open(dstfile, 'w') {|f| f.write(data)}