summary refs log tree commit diff
path: root/nixos/doc/varlistentry-fixer.rb
blob: 6c7cc1e6439b14f24ea8b192a43b5c629ddd31d8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/usr/bin/env ruby

# This script is written intended as a living, evolving tooling
# to fix oopsies within the docbook documentation.
#
# This is *not* a formatter. It, instead, handles some known cases
# where something bad happened, and fixing it manually is tedious.
#
# Read the code to see the different cases it handles.
#
# ALWAYS `make format` after fixing with this!
# ALWAYS read the changes, this tool isn't yet proven to be always right.

require "rexml/document"
include REXML

if ARGV.length < 1 then
	$stderr.puts "Needs a filename."
	exit 1
end

filename = ARGV.shift
doc = Document.new(File.open(filename))

$touched = false

# Fixing varnames having a sibling element without spacing.
# This is to fix an initial `xmlformat` issue where `term`
# would mangle as spaces.
#
#   <varlistentry>
#    <term><varname>types.separatedString</varname><replaceable>sep</replaceable> <----
#    </term>
#    ...
#
# Generates: types.separatedStringsep
#                               ^^^^
#
# <varlistentry xml:id='fun-makeWrapper'>
#  <term>
#   <function>makeWrapper</function><replaceable>executable</replaceable><replaceable>wrapperfile</replaceable><replaceable>args</replaceable>  <----
#  </term>
#
# Generates: makeWrapperexecutablewrapperfileargs
#                     ^^^^      ^^^^    ^^  ^^
#
#    <term>
#     <option>--option</option><replaceable>name</replaceable><replaceable>value</replaceable> <-----
#    </term>
#
# Generates: --optionnamevalue
#                   ^^  ^^
doc.elements.each("//varlistentry/term") do |term|
	["varname", "function", "option", "replaceable"].each do |prev_name|
		term.elements.each(prev_name) do |el|
			if el.next_element and
					el.next_element.name == "replaceable" and
					el.next_sibling_node.class == Element
				then
				$touched = true
				term.insert_after(el, Text.new(" "))
			end
		end
	end
end



#  <cmdsynopsis>
#   <command>nixos-option</command>
#   <arg>
#    <option>-I</option><replaceable>path</replaceable>        <------
#   </arg>
#
# Generates: -Ipath
#             ^^
doc.elements.each("//cmdsynopsis/arg") do |term|
	["option", "replaceable"].each do |prev_name|
		term.elements.each(prev_name) do |el|
			if el.next_element and
				el.next_element.name == "replaceable" and
				el.next_sibling_node.class == Element
			then
				$touched = true
				term.insert_after(el, Text.new(" "))
			end
		end
	end
end

#  <cmdsynopsis>
#   <arg>
#    <group choice='req'>
#    <arg choice='plain'>
#     <option>--profile-name</option>
#    </arg>
#
#    <arg choice='plain'>
#     <option>-p</option>
#    </arg>
#     </group><replaceable>name</replaceable>   <----
#   </arg>
#
# Generates: [{--profile-name | -p }name]
#                                   ^^^^
doc.elements.each("//cmdsynopsis/arg") do |term|
	["group"].each do |prev_name|
		term.elements.each(prev_name) do |el|
			if el.next_element and
				el.next_element.name == "replaceable" and
				el.next_sibling_node.class == Element
			then
				$touched = true
				term.insert_after(el, Text.new(" "))
			end
		end
	end
end


if $touched then
	doc.context[:attribute_quote] = :quote
	doc.write(output: File.open(filename, "w"))
end