]> pere.pagekite.me Git - text-madewithcc.git/commitdiff
Move Docbook XML editing to new fixup-docbook.rb script.
authorPetter Reinholdtsen <pere@hungry.com>
Tue, 6 Feb 2018 08:48:35 +0000 (09:48 +0100)
committerPetter Reinholdtsen <pere@hungry.com>
Tue, 6 Feb 2018 08:53:33 +0000 (08:53 +0000)
Makefile
fixup-docbook.rb [new file with mode: 0755]

index 8327c897f88bd9882b30acb51680ecd990c0c258..fd91c4b8fa3efdefed68e4366fdb568cc9dcf571 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -74,9 +74,10 @@ $(SOURCE).nb.md: $(SOURCE).md po/nb/mwcc.po
        po4a-translate -f text -m $(SOURCE).md -p po/nb/mwcc.po -l $@ -l $@ -L utf-8 -M utf-8 -k 0
 
 %.xml: %.md
-       pandoc -s -o $@ $(PANDOC_OPTS) $^
-       perl -p -i -e 's/!DOCTYPE article/!DOCTYPE book/ ; \
-               s!<(/?)article(info|)?>!<$$1book$$2>!' $@
+       TEMP=`tempfile -p mwcc` && \
+         pandoc -s -o $$TEMP $(PANDOC_OPTS) $(SOURCE).md && \
+         ruby fixup-docbook.rb $$TEMP $@ && \
+         rm $$TEMP
 
 pdf: $(SOURCE).pdf
 %.pdf: %.tex
diff --git a/fixup-docbook.rb b/fixup-docbook.rb
new file mode 100755 (executable)
index 0000000..884450f
--- /dev/null
@@ -0,0 +1,72 @@
+#!/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)}