From 8446dad9043a00d78a23ba79d0789b888e892442 Mon Sep 17 00:00:00 2001 From: Petter Reinholdtsen Date: Tue, 6 Feb 2018 09:48:35 +0100 Subject: [PATCH] Move Docbook XML editing to new fixup-docbook.rb script. --- Makefile | 7 +++-- fixup-docbook.rb | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 3 deletions(-) create mode 100755 fixup-docbook.rb diff --git a/Makefile b/Makefile index 8327c89..fd91c4b 100644 --- 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 index 0000000..884450f --- /dev/null +++ b/fixup-docbook.rb @@ -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') + + Gunnar Wolf +
Mexico City
+
+XML + node.first_element_child.before(<<'XML') + + 2017 + Creative Commons + +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 ' +s = xml.xpath("//part/title[text()='The Case Studies']")[0] +if s + s.after('') + 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)} -- 2.47.2