]> pere.pagekite.me Git - text-madewithcc.git/blob - fixup-docbook.rb
Replace colophon page content in Docbook file.
[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', 'preface')
55 partreplace(xml, 'introduction', 'preface')
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, 'remove title from dedication'
70 xml.css('dedication title')[0].content = ""
71
72 log 0, 'move legal notice to bookinfo'
73 xml.css('book bookinfo')[0].first_element_child.before('<legalnotice>')
74 ln = xml.css('book bookinfo legalnotice')[0]
75 xml.css('para').each do |para|
76 if para.content =~ /This book is published under a/
77 log 0, 'found legal'
78 para.parent = ln
79 break
80 end
81 end
82
83 log 0, 'replace colophon page with one for this edition'
84 xml.xpath('//colophon/para').remove
85 s = xml.xpath('//colophon')[0]
86 s.first_element_child.after(<<'XML')
87 <para>Made With Creative Commons</para>
88
89 <para>by Paul Stacey & Sarah Hinchliff Pearson</para>
90
91 <para>© 2017 by the Creative Commons Foundation.</para>
92
93 <para>Published under a Creative Commons Attribution-ShareAlike
94 license (CC BY-SA), version 4.0.</para>
95
96 <para>ISBN: YET-TO-BE-DECIDED (PDF), YET-TO-BE-DECIDED (ePub),
97 YET-TO-BE-DECIDED (Paperback) </para>
98
99 <para>Illustrations by Bryan Mathers, <ulink url="https://bryanmathers.com/"/></para>
100
101 <para>Publisher: Gunnar Wolf.</para>
102
103 <!-- space for information about translators -->
104 <para>&nbsp;</para>
105
106 <para>Downloadable e-book available at
107 <ulink url="https://madewith.cc/"/></para>
108
109 <para>This book is published under a CC BY-SA license, which means that you
110 can copy, redistribute, remix, transform, and build upon the content for
111 any purpose, even commercially, as long as you give appropriate credit,
112 provide a link to the license, and indicate if changes were made. If you
113 remix, transform, or build upon the material, you must distribute your
114 contributions under the same license as the original. License details:
115 <ulink url="http://creativecommons.org/licenses/by-sa/4.0/"/></para>
116
117 <para>Made With Creative Commons is published with the kind support of
118 Creative Commons and backers of our crowdfunding-campaign on the
119 Kickstarter.com platform.</para>
120
121 XML
122
123 log 0, 'change CC logo images to informalfigure'
124 xml.css('figure mediaobject imageobject imagedata[width="40.0%"]').each do |id|
125 f = id.parent.parent.parent
126 f.name = 'informalfigure'
127 end
128
129 log 0, 'Writing processed file'
130 # Unable to figure out API way to replace DOCTYPE
131 data = xml.to_xml().gsub!(/DOCTYPE article/, 'DOCTYPE book')
132 File.open(dstfile, 'w') {|f| f.write(data)}