]> pere.pagekite.me Git - text-madewithcc.git/blob - fixup-docbook.rb
Use dblatex param instead of LaTeX editing to set charset encoding to UTF-8.
[text-madewithcc.git] / fixup-docbook.rb
1 #!/usr/bin/ruby
2 # coding: utf-8
3
4 require 'nokogiri'
5
6 LogLevel=1
7 raise ArgumentError, 'Source/destination files not specified' if ARGV.size != 2
8 srcfile = ARGV[0]
9 dstfile = ARGV[1]
10
11 f=File.open(srcfile)
12 xml = Nokogiri::XML(f)
13
14 def log(level,what)
15 indicators = %w(! • # -)
16 if level >= LogLevel
17 print indicators[level]
18 else
19 print "\n%s %s\n" % ['*' * (level+1), what]
20 end
21 end
22
23 def partreplace(xml, partid, tag)
24 xml.css('part[id=' + partid + ']').each do |part|
25 part.name = tag
26 end
27 end
28
29
30 log 0, 'replace article* with book*'
31 xml.css('articleinfo').each do |node|
32 node.name = 'bookinfo'
33 node.first_element_child.before(<<'XML')
34 <publisher>
35 <publishername>Gunnar Wolf</publishername>
36 <address><city>Mexico City</city></address>
37 </publisher>
38 XML
39 node.first_element_child.before(<<'XML')
40 <copyright>
41 <year>2017</year>
42 <holder>Creative Commons</holder>
43 </copyright>
44 XML
45 end
46 xml.css('article').each do |node|
47 node.name = 'book'
48 node['lang'] = 'en'
49 end
50
51 log 0, 'change parts to colophon, dedication and chapter'
52 partreplace(xml, 'colophon', 'colophon')
53 partreplace(xml, 'dedication', 'dedication')
54 partreplace(xml, 'foreword', 'chapter')
55 partreplace(xml, 'introduction', 'chapter')
56 partreplace(xml, 'bibliography', 'chapter')
57 partreplace(xml, 'acknowledgments', 'chapter')
58
59 log 0, 'place part introduction into <partintro>'
60 s = xml.xpath("//part/title[text()='The Case Studies']")[0]
61 if s
62 s.after('<partintro>')
63 p = xml.css('part partintro')[0]
64 s.parent.xpath("//part/para").each do |node|
65 node.parent = p
66 end
67 end
68
69 log 0, 'Writing processed file'
70 # Unable to figure out API way to replace DOCTYPE
71 data = xml.to_xml().gsub!(/DOCTYPE article/, 'DOCTYPE book')
72 File.open(dstfile, 'w') {|f| f.write(data)}