Annotation of /trunk/build-docbook-catalog/build-docbook-catalog
Parent Directory | Revision Log
Revision 2504 -
(hide annotations)
(download)
Thu Apr 3 22:33:13 2014 UTC (10 years, 5 months ago) by niro
File size: 10053 byte(s)
Thu Apr 3 22:33:13 2014 UTC (10 years, 5 months ago) by niro
File size: 10053 byte(s)
-adde build-docbook-catalog
1 | niro | 2504 | #!/bin/bash |
2 | # $Header: /var/cvsroot/gentoo-src/build-docbook-catalog/build-docbook-catalog,v 1.4 2008/09/22 14:10:17 flameeyes Exp $ | ||
3 | # | ||
4 | # build-docbook-catalog: populate /etc/xml/docbook based in | ||
5 | # installed docbook-xml-dtd versions. | ||
6 | # | ||
7 | # Copyright 2004 Gentoo Foundation | ||
8 | # Distributed under the terms of the GNU General Public License v2 | ||
9 | # written by Aron Griffis | ||
10 | # | ||
11 | |||
12 | ROOTCATALOG=/etc/xml/catalog | ||
13 | CATALOG=/etc/xml/docbook | ||
14 | DOCBOOKDIR=/usr/share/sgml/docbook | ||
15 | DTDS= | ||
16 | LATEST_DTD= | ||
17 | LATEST_DATE= | ||
18 | VERBOSE=false | ||
19 | ZERO=${0##*/} | ||
20 | |||
21 | # | ||
22 | # main (called from bottom) | ||
23 | # | ||
24 | main() { | ||
25 | typeset d v opts | ||
26 | |||
27 | opts=$(getopt -o v --long verbose -n "$ZERO" -- "$@") || exit 1 | ||
28 | eval set -- "$opts" | ||
29 | while true; do | ||
30 | case "$1" in | ||
31 | -v|--verbose) VERBOSE=true ; shift ;; | ||
32 | --) shift ; break ;; | ||
33 | *) echo "Options parsing failed on $1!" >&2 ; exit 1 ;; | ||
34 | esac | ||
35 | done | ||
36 | |||
37 | create_catalogs # will exit on error | ||
38 | for type in xsl xsl-ns xsl-saxon xsl-xalan; do | ||
39 | populate_xsl $type | ||
40 | done | ||
41 | |||
42 | # Clean out old dtds from catalog | ||
43 | verb "Cleaning out old DocBook XML versions from ${CATALOG} and ${ROOTCATALOG}" | ||
44 | clean_catalog "${DOCBOOKDIR}/xml-dtd-[^/\"']*/[^/\"']*" ${CATALOG} | ||
45 | clean_catalog "${DOCBOOKDIR}/xml-dtd-[^/\"']*/[^/\"']*" ${ROOTCATALOG} | ||
46 | |||
47 | if set_dtds; then | ||
48 | for d in ${DTDS}; do | ||
49 | populate_dtd ${d} | ||
50 | done | ||
51 | populate_entities | ||
52 | fi | ||
53 | |||
54 | exit 0 | ||
55 | } | ||
56 | |||
57 | # | ||
58 | # verbose echo -- only echo if called with --verbose | ||
59 | # | ||
60 | verb() { | ||
61 | $VERBOSE && echo "$*" | ||
62 | } | ||
63 | |||
64 | # | ||
65 | # fill in the DTDS variable based on installed versions | ||
66 | # | ||
67 | set_dtds() { | ||
68 | DTDS=$(find ${DOCBOOKDIR} -path '*/xml-dtd-*/docbookx.dtd') | ||
69 | if [[ -z ${DTDS} ]]; then | ||
70 | echo "No installed DocBook XML DTDs found" | ||
71 | return 1 | ||
72 | else | ||
73 | return 0 | ||
74 | fi | ||
75 | } | ||
76 | |||
77 | # | ||
78 | # create the catalogs root and docbook specific | ||
79 | # | ||
80 | create_catalogs() { | ||
81 | if [[ ! -r ${ROOTCATALOG} ]] ; then | ||
82 | echo "Creating XML Catalog root ${ROOTCATALOG}" | ||
83 | /usr/bin/xmlcatalog --noout --create ${ROOTCATALOG} | ||
84 | if [[ ! -r ${ROOTCATALOG} ]] ; then | ||
85 | echo "Failed creating ${ROOTCATALOG}, aborting" >&2 | ||
86 | exit 1 | ||
87 | fi | ||
88 | else | ||
89 | verb "Found XML Catalog root ${ROOTCATALOG}" | ||
90 | # clean out existing entries | ||
91 | verb " Cleaning existing ${CATALOG} delegates from ${ROOTCATALOG}" | ||
92 | clean_catalog "file://${CATALOG}" ${ROOTCATALOG} | ||
93 | fi | ||
94 | |||
95 | if [[ ! -r ${CATALOG} ]] ; then | ||
96 | echo "Creating DocBook XML Catalog ${CATALOG}" | ||
97 | /usr/bin/xmlcatalog --noout --create ${CATALOG} | ||
98 | if [[ ! -r ${CATALOG} ]] ; then | ||
99 | echo "Failed creating ${CATALOG}, aborting" >&2 | ||
100 | exit 1 | ||
101 | fi | ||
102 | else | ||
103 | verb "Found DocBook XML Catalog ${CATALOG}" | ||
104 | fi | ||
105 | |||
106 | # dtd pointers | ||
107 | verb " Populating ${ROOTCATALOG} with DTD delegates to ${CATALOG}" | ||
108 | xmlcatalog --noout --add "delegatePublic" "-//OASIS//ENTITIES DocBook XML" "file://${CATALOG}" ${ROOTCATALOG} | ||
109 | xmlcatalog --noout --add "delegatePublic" "-//OASIS//DTD DocBook XML" "file://${CATALOG}" ${ROOTCATALOG} | ||
110 | xmlcatalog --noout --add "delegateSystem" "http://www.oasis-open.org/docbook/" "file://${CATALOG}" ${ROOTCATALOG} | ||
111 | xmlcatalog --noout --add "delegateURI" "http://www.oasis-open.org/docbook/" "file://${CATALOG}" ${ROOTCATALOG} | ||
112 | |||
113 | # entities pointer | ||
114 | verb " Populating ${ROOTCATALOG} with ISO entities delegate to ${CATALOG}" | ||
115 | xmlcatalog --noout --add "delegatePublic" "ISO 8879:1986" "file://${CATALOG}" ${ROOTCATALOG} | ||
116 | } | ||
117 | |||
118 | # | ||
119 | # clean_catalog | ||
120 | # $1 == regex to clean | ||
121 | # $2 == catalog | ||
122 | # | ||
123 | clean_catalog() { | ||
124 | typeset list f regex=$1 catalog=$2 | ||
125 | |||
126 | list=$(egrep --only-matching "${regex}" "${catalog}" | sort -u) | ||
127 | for f in ${list}; do | ||
128 | xmlcatalog --noout --del "${f}" ${catalog} | ||
129 | done | ||
130 | } | ||
131 | |||
132 | # | ||
133 | # populate a specific dtd version into the docbook catalog | ||
134 | # $1 == /path/to/docbookx.dtd | ||
135 | # | ||
136 | populate_dtd() { | ||
137 | typeset dtd=$1 docbookdir=${1%/*} dtd_date | ||
138 | typeset v=${docbookdir##*-} | ||
139 | |||
140 | # sanity check | ||
141 | if [[ ${dtd} != */xml-dtd-*/* ]]; then | ||
142 | echo "Warning: I don't understand \"${dtd}\"" >&2 | ||
143 | return | ||
144 | fi | ||
145 | echo "Found DocBook XML ${v} in ${docbookdir}" | ||
146 | |||
147 | # Populate the docbook catalog with this version | ||
148 | verb " Populating ${CATALOG} based on ${docbookdir}" | ||
149 | xmlcatalog --noout --add "public" "-//OASIS//ELEMENTS DocBook XML Information Pool V${v}//EN" "file://${docbookdir}/dbpoolx.mod" ${CATALOG} | ||
150 | xmlcatalog --noout --add "public" "-//OASIS//DTD DocBook XML V${v}//EN" "file://${docbookdir}/docbookx.dtd" ${CATALOG} | ||
151 | xmlcatalog --noout --add "public" "-//OASIS//ENTITIES DocBook XML Character Entities V${v}//EN" "file://${docbookdir}/dbcentx.mod" ${CATALOG} | ||
152 | xmlcatalog --noout --add "public" "-//OASIS//ENTITIES DocBook XML Notations V${v}//EN" "file://${docbookdir}/dbnotnx.mod" ${CATALOG} | ||
153 | xmlcatalog --noout --add "public" "-//OASIS//ENTITIES DocBook XML Additional General Entities V${v}//EN" "file://${docbookdir}/dbgenent.mod" ${CATALOG} | ||
154 | xmlcatalog --noout --add "public" "-//OASIS//ELEMENTS DocBook XML Document Hierarchy V${v}//EN" "file://${docbookdir}/dbhierx.mod" ${CATALOG} | ||
155 | xmlcatalog --noout --add "public" "-//OASIS//DTD XML Exchange Table Model 19990315//EN" "file://${docbookdir}/soextblx.dtd" ${CATALOG} | ||
156 | xmlcatalog --noout --add "public" "-//OASIS//DTD DocBook XML CALS Table Model V${v}//EN" "file://${docbookdir}/calstblx.dtd" ${CATALOG} | ||
157 | xmlcatalog --noout --add "rewriteSystem" "http://www.oasis-open.org/docbook/xml/${v}" "file://${docbookdir}" ${CATALOG} | ||
158 | xmlcatalog --noout --add "rewriteURI" "http://www.oasis-open.org/docbook/xml/${v}" "file://${docbookdir}" ${CATALOG} | ||
159 | |||
160 | # grab the RCS date from docbookx.dtd for comparison purposes | ||
161 | if [[ ! -f ${docbookdir}/ent/iso-lat1.ent ]]; then | ||
162 | verb " No entities available for ${dtd}" | ||
163 | return 0 | ||
164 | fi | ||
165 | dtd_date=$(egrep --only-matching --max-count=1 \ | ||
166 | '[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}' "${dtd}") | ||
167 | if [[ -z ${dtd_date} ]]; then | ||
168 | verb " Couldn't find RCS date in ${dtd}, ignoring entities" | ||
169 | return 0 | ||
170 | fi | ||
171 | verb " RCS datestamp in ${dtd} is ${dtd_date}" | ||
172 | dtd_date=$(date -d "$dtd_date" +%s) | ||
173 | if [[ -z $LATEST_DTD || $dtd_date -gt $LATEST_DATE ]]; then | ||
174 | LATEST_DATE=${dtd_date} | ||
175 | LATEST_DTD=${dtd} | ||
176 | fi | ||
177 | } | ||
178 | |||
179 | # | ||
180 | # populate ISO DocBook entities from the most recent DTD | ||
181 | # | ||
182 | populate_entities() { | ||
183 | typeset isodir=${LATEST_DTD%/*}/ent i j | ||
184 | typeset -a entities avail | ||
185 | |||
186 | # sanity check | ||
187 | if [[ -z ${LATEST_DTD} || ! -d ${isodir} ]]; then | ||
188 | echo "No ISO DocBook entities available for catalog" | ||
189 | return 0 | ||
190 | fi | ||
191 | echo "Using ISO DocBook entities from ${isodir}" | ||
192 | |||
193 | # here are the entities we know about; | ||
194 | # note these must remain sorted! | ||
195 | entities=( | ||
196 | "iso-amsa.ent" "ISO 8879:1986//ENTITIES Added Math Symbols: Arrow Relations//EN" | ||
197 | "iso-amsb.ent" "ISO 8879:1986//ENTITIES Added Math Symbols: Binary Operators//EN" | ||
198 | "iso-amsc.ent" "ISO 8879:1986//ENTITIES Added Math Symbols: Delimiters//EN" | ||
199 | "iso-amsn.ent" "ISO 8879:1986//ENTITIES Added Math Symbols: Negated Relations//EN" | ||
200 | "iso-amso.ent" "ISO 8879:1986//ENTITIES Added Math Symbols: Ordinary//EN" | ||
201 | "iso-amsr.ent" "ISO 8879:1986//ENTITIES Added Math Symbols: Relations//EN" | ||
202 | "iso-box.ent" "ISO 8879:1986//ENTITIES Box and Line Drawing//EN" | ||
203 | "iso-cyr1.ent" "ISO 8879:1986//ENTITIES Russian Cyrillic//EN" | ||
204 | "iso-cyr2.ent" "ISO 8879:1986//ENTITIES Non-Russian Cyrillic//EN" | ||
205 | "iso-dia.ent" "ISO 8879:1986//ENTITIES Diacritical Marks//EN" | ||
206 | "iso-grk1.ent" "ISO 8879:1986//ENTITIES Greek Letters//EN" | ||
207 | "iso-grk2.ent" "ISO 8879:1986//ENTITIES Monotoniko Greek//EN" | ||
208 | "iso-grk3.ent" "ISO 8879:1986//ENTITIES Greek Symbols//EN" | ||
209 | "iso-grk4.ent" "ISO 8879:1986//ENTITIES Alternative Greek Symbols//EN" | ||
210 | "iso-lat1.ent" "ISO 8879:1986//ENTITIES Added Latin 1//EN" | ||
211 | "iso-lat2.ent" "ISO 8879:1986//ENTITIES Added Latin 2//EN" | ||
212 | "iso-num.ent" "ISO 8879:1986//ENTITIES Numeric and Special Graphic//EN" | ||
213 | "iso-pub.ent" "ISO 8879:1986//ENTITIES Publishing//EN" | ||
214 | "iso-tech.ent" "ISO 8879:1986//ENTITIES General Technical//EN" | ||
215 | ) | ||
216 | |||
217 | # here are the entities available; assume no spaces in filenames... | ||
218 | avail=($(ls ${isodir} | sort)) | ||
219 | |||
220 | # double-check the lists | ||
221 | verb " Populating ${CATALOG} with ISO DocBook entities" | ||
222 | i=0 ; j=0 | ||
223 | while [[ ${i} -lt ${#entities[@]} || ${j} -lt ${#avail[@]} ]]; do | ||
224 | if [[ ${i} -ge ${#entities[@]} ]]; then | ||
225 | echo "Warning: Extra ISO entities file: ${avail[j]}" | ||
226 | let j=j+1 | ||
227 | elif [[ ${j} -ge ${#avail[@]} ]]; then | ||
228 | echo "Warning: Entities file not found: ${entities[i]}" | ||
229 | let i=i+2 | ||
230 | elif [[ ${avail[j]} < ${entities[i]} ]]; then | ||
231 | echo "Warning: Extra ISO entities file: ${avail[j]}" | ||
232 | let j=j+1 | ||
233 | elif [[ ${entities[i]} < ${avail[j]} ]]; then | ||
234 | echo "Warning: Entities file not found: ${entities[i]}" | ||
235 | let i=i+2 | ||
236 | elif [[ ${entities[i]} == ${avail[j]} ]]; then | ||
237 | xmlcatalog --noout --add "public" "${entities[i+1]}" \ | ||
238 | "file://${isodir}/${entities[i]}" ${CATALOG} | ||
239 | let j=j+1 | ||
240 | let i=i+2 | ||
241 | else | ||
242 | echo "${0}: Whoah, shouldn't be here, aborting" >&2 | ||
243 | exit 1 | ||
244 | fi | ||
245 | done | ||
246 | } | ||
247 | |||
248 | # | ||
249 | # populate XSL stylesheets | ||
250 | # | ||
251 | populate_xsl() { | ||
252 | typeset listed avail f | ||
253 | |||
254 | # This is either xsl, xsl-ns, xsl-saxon or xsl-xalan | ||
255 | local type=$1 | ||
256 | |||
257 | # Delete current entries from the catalog (delete legacy versioned entries too) | ||
258 | clean_catalog "${DOCBOOKDIR}/${type}-stylesheets(-[0-9\.]+)?" $CATALOG | ||
259 | clean_catalog "${DOCBOOKDIR}/${type}-stylesheets(-[0-9\.]+)?" $ROOTCATALOG | ||
260 | |||
261 | xsldir=/usr/share/sgml/docbook/${type}-stylesheets | ||
262 | |||
263 | if [[ ! -d ${xsldir} ]]; then | ||
264 | echo "DocBook XSL stylesheets (${type}) not found" >&2 | ||
265 | return 1 | ||
266 | fi | ||
267 | |||
268 | if [[ ! -e ${xsldir}/html/docbook.xsl || ! -e ${xsldir}/common/l10n.xml ]]; then | ||
269 | echo "DocBook XSL stylesheets are missing files from ${xsldir}" >&2 | ||
270 | return 1 | ||
271 | fi | ||
272 | |||
273 | # Populate catalog with XSL entries | ||
274 | echo "Found DocBook XSL stylesheets (${type}) in ${xsldir}" | ||
275 | |||
276 | verb " Populating ${ROOTCATALOG} with XSL delegations" | ||
277 | xmlcatalog --noout --add "delegateSystem" "http://docbook.sourceforge.net/release/${type}/" "file://${CATALOG}" ${ROOTCATALOG} | ||
278 | xmlcatalog --noout --add "delegateURI" "http://docbook.sourceforge.net/release/${type}/" "file://${CATALOG}" ${ROOTCATALOG} | ||
279 | |||
280 | verb " Populating ${CATALOG} with XSL stylesheets" | ||
281 | xmlcatalog --noout --add "rewriteSystem" "http://docbook.sourceforge.net/release/${type}/current" "file://${xsldir}" ${CATALOG} | ||
282 | xmlcatalog --noout --add "rewriteURI" "http://docbook.sourceforge.net/release/${type}/current" "file://${xsldir}" ${CATALOG} | ||
283 | } | ||
284 | |||
285 | # Call the main routine | ||
286 | main "$@" |