#!/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', 'preface')
partreplace(xml, 'introduction', 'preface')
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 empty notes/web links sections'
[
  'Notes',
  'Web links',
  'Web link',
].each do |title|
  xml.xpath("//title[text()='%s']" % title).each do |node|
    p = node.parent
    node.remove
    if p.content =~ /^\s*$/
      p.remove
    else
      raise RuntimeError, 'Non-empty «%s» found' % title
    end
  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, 'replace colophon page with one for this edition'
 xml.xpath('//colophon/para').remove
s = xml.xpath('//colophon')[0]
s.first_element_child.after(<<'XML')
<para>Made With Creative Commons</para>

<para>by Paul Stacey & Sarah Hinchliff Pearson</para>

<para>© 2017 by the Creative Commons Foundation.</para>

<para>Published under a Creative Commons Attribution-ShareAlike
license (CC BY-SA), version 4.0.</para>

<para>ISBN: YET-TO-BE-DECIDED (PDF), YET-TO-BE-DECIDED (ePub),
YET-TO-BE-DECIDED (Paperback) </para>

<para>Illustrations by Bryan Mathers, <ulink url="https://bryanmathers.com/"/></para>

<para>Publisher: Gunnar Wolf.</para>

<!-- space for information about translators -->
<para>&nbsp;</para>

<para>Downloadable e-book available at
<ulink url="https://madewith.cc/"/></para>

<para>This book is published under a CC BY-SA license, which means that you
can copy, redistribute, remix, transform, and build upon the content for
any purpose, even commercially, as long as you give appropriate credit,
provide a link to the license, and indicate if changes were made. If you
remix, transform, or build upon the material, you must distribute your
contributions under the same license as the original. License details:
<ulink url="http://creativecommons.org/licenses/by-sa/4.0/"/></para>

<para>Made With Creative Commons is published with the kind support of
Creative Commons and backers of our crowdfunding-campaign on the
Kickstarter.com platform.</para>

XML

log 0, 'remove title from colophon'
xml.css('colophon title')[0].content = ""

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)}
