#!/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>
</copyright>
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, 'remove title from dedication'
xml.css('dedication title')[0].content = ""

log 0, 'move legal notice to bookinfo'
xml.css('book bookinfo')[0].first_element_child.before('<legalnotice>')
ln = xml.css('book bookinfo legalnotice')[0]
xml.css('para').each do |para|
  if para.content =~ /This book is published under a/
    log 0, 'found legal'
    para.parent = ln
    break
  end
end

log 0, 'change CC logo images to informalfigure'
xml.css('figure mediaobject imageobject imagedata[width="40.0%"]').each do |id|
  f = id.parent.parent.parent
  f.name = 'informalfigure'
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)}
