blob: 78be79b2f08e2cecf1158c1f725c0069b96b4e24 [file] [log] [blame]
Dieter Baron3f5dbfe2012-06-25 15:15:15 +02001#!/usr/bin/env perl
2
3use strict;
4
Dieter Barone336eac2013-04-17 11:54:57 +02005my $DOCSETUTIL = '/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil';
6
7my $BASE_URL = 'http://nih.at/libzip';
8my $BUNDLE_ID = 'at.nih.libzip';
9
Dieter Baronb5cd45d2014-11-12 15:33:32 +010010my $SRCDIR = $ENV{SRCDIR} // '.';
11
Dieter Baron3f5dbfe2012-06-25 15:15:15 +020012my @files = @ARGV;
13
14my $docset = 'at.nih.libzip.docset';
Dieter Baronc3612b42016-01-29 17:19:57 +010015my @sh_nodes = qw(zipcmp zipmerge ziptool);
Dieter Baron3f5dbfe2012-06-25 15:15:15 +020016
17(system('rm', '-rf', $docset) == 0) or die "can't remove old version of docset: $!";
18
19mkdir($docset) or die "can't create docset directory: $!";
20mkdir("$docset/Contents") or die "can't create docset directory: $!";
21mkdir("$docset/Contents/Resources") or die "can't create docset directory: $!";
22mkdir("$docset/Contents/Resources/Documents") or die "can't create docset directory: $!";
23
Dieter Baronacde35d2012-06-26 20:59:34 +020024my $version = `sed -n 's/#define PACKAGE_VERSION "\\(.*\\)"/\\1/p' ../config.h`;
25chomp $version;
26
Dieter Barone336eac2013-04-17 11:54:57 +020027my $suffix = '';
28$suffix = '-hg' if ($version =~ /[a-z]$/);
29
30my $package_file = "$BUNDLE_ID-$version.xar";
31my $download_url = "$BASE_URL/$package_file";
32my $feed_url = "$BASE_URL/at.nih.libzip$suffix.atom";
33
Dieter Baron3f5dbfe2012-06-25 15:15:15 +020034open I, "> $docset/Contents/Info.plist" or die "can't create Info.plist: $!";
35print I <<EOF;
36<?xml version="1.0" encoding="UTF-8"?>
37<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
38<plist version="1.0">
39<dict>
40 <key>CFBundleIdentifier</key>
Dieter Barone336eac2013-04-17 11:54:57 +020041 <string>$BUNDLE_ID.docset</string>
Dieter Baron3f5dbfe2012-06-25 15:15:15 +020042 <key>CFBundleName</key>
43 <string>libzip</string>
44 <key>DocSetPublisherIdentifier</key>
45 <string>at.nih</string>
46 <key>DocSetPublisherName</key>
47 <string>NiH</string>
48 <key>NSHumanReadableCopyright</key>
Dieter Baronc3612b42016-01-29 17:19:57 +010049 <string>Copyright © 2016 Dieter Baron and Thomas Klausner</string>
Dieter Baronacde35d2012-06-26 20:59:34 +020050 <key>CFBundleVersion</key>
51 <string>$version</string>
Dieter Barone336eac2013-04-17 11:54:57 +020052 <key>DocSetFeedURL</key>
53 <string>$feed_url</string>
54 <key>DocSetFeedName</key>
55 <string>libzip</string>
Dieter Baron3f5dbfe2012-06-25 15:15:15 +020056</dict>
57</plist>
58EOF
59close I;
60
61open N, "> $docset/Contents/Resources/Nodes.xml" or die "can't create Nodes.xml: $!";
62
63my %tl_nodes = (libzip => 1);
64
65for (@sh_nodes) {
66 $tl_nodes{$_} = 1;
67}
68
Dieter Baron606b45b2012-06-25 18:26:35 +020069my @tokens = ();
Dieter Baron3f5dbfe2012-06-25 15:15:15 +020070
71print N <<EOF;
72<?xml version="1.0" encoding="UTF-8"?>
73<DocSetNodes version="1.0">
74 <TOC>
Dieter Baronacde35d2012-06-26 20:59:34 +020075 <Node noindex="1" type="folder">
Dieter Baronead38d42012-06-26 11:18:02 +020076 <Name>libzip package</Name>
77 <Subnodes>
Dieter Baronacde35d2012-06-26 20:59:34 +020078 <Node noindex="1" type="folder">
Dieter Baronead38d42012-06-26 11:18:02 +020079 <Name>Library</Name>
80 <Path>libzip.html</Path>
81 <Subnodes>
Dieter Baron3f5dbfe2012-06-25 15:15:15 +020082EOF
83
84
85my $id = 1001;
86
87for my $html (@files) {
88 my $name = $html;
89 $name =~ s/.html//;
Dieter Baron3f5dbfe2012-06-25 15:15:15 +020090
91 if ($tl_nodes{$name}) {
92 next;
93 }
94
Dieter Baronead38d42012-06-26 11:18:02 +020095 process_file($html, 'c', $id++);
Dieter Baron3f5dbfe2012-06-25 15:15:15 +020096}
97
Dieter Baronead38d42012-06-26 11:18:02 +020098print N " </Subnodes>\n";
99print N " </Node>\n";
Dieter Baronacde35d2012-06-26 20:59:34 +0200100print N " <Node noindex=\"1\" type=\"folder\">\n";
Dieter Baronead38d42012-06-26 11:18:02 +0200101print N " <Name>Commands</Name>\n";
102print N " <Subnodes>\n";
Dieter Baron3f5dbfe2012-06-25 15:15:15 +0200103
Dieter Baronead38d42012-06-26 11:18:02 +0200104$id = 2;
105
106for my $name (@sh_nodes) {
107 process_file("$name.html", 'c', $id++);
108}
109
110print N " </Subnodes>\n";
111print N " </Node>\n";
112print N " </Subnodes>\n";
113print N " </Node>\n";
114print N " </TOC>\n";
115print N "</DocSetNodes>\n";
Dieter Baron3f5dbfe2012-06-25 15:15:15 +0200116
117close N;
118
Dieter Baronb5cd45d2014-11-12 15:33:32 +0100119link("$SRCDIR/nih-man.css", "$docset/Contents/Resources/Documents/nih-man.css") or die "can't link css file: $!";
Dieter Baron3f5dbfe2012-06-25 15:15:15 +0200120copy_html('libzip.html', "$docset/Contents/Resources/Documents/libzip.html");
121
Dieter Baron606b45b2012-06-25 18:26:35 +0200122write_tokens();
123
Dieter Barone336eac2013-04-17 11:54:57 +0200124system($DOCSETUTIL, 'index', $docset) == 0 or die "can't index docset: $!";
125system($DOCSETUTIL, 'validate', $docset) == 0 or die "can't validate docset: $!";
Dieter Baron606b45b2012-06-25 18:26:35 +0200126
127unlink("$docset/Contents/Resources/Nodes.xml");
128unlink("$docset/Contents/Resources/Tokens.xml");
Dieter Baron3f5dbfe2012-06-25 15:15:15 +0200129
Dieter Barone336eac2013-04-17 11:54:57 +0200130system($DOCSETUTIL, 'package', '-output', "at.nih.libzip-$version.xar", '-atom', "at.nih.libzip$suffix.atom", '-download-url', "$BASE_URL/at.nih.libzip-$version.xar", $docset);
131
132
Dieter Baron3f5dbfe2012-06-25 15:15:15 +0200133sub copy_html {
134 my ($src, $dst) = @_;
135
136 my $content = `cat $src`;
137 $content =~ s,</head>,<meta name="viewport" content="width=device-width"></head>,;
138 $content =~ s,../nih-man.css,nih-man.css,;
139
Dieter Baroncc7d2482012-06-26 20:35:38 +0200140 # remove header and footer
141 $content =~ s,<table[^>]*class="(heade?r?|foote?r?)".*?</table>,,sg;
142
Dieter Baronb9e1c0b2012-06-25 15:49:30 +0200143 $content =~ s,(<div class="sec-body") style="margin-left: 5.00ex;",$1,g;
144 $content =~ s,(<div class="ssec-head") style="margin-left: -2.00ex;",$1,g;
Dieter Baron3f5dbfe2012-06-25 15:15:15 +0200145
146 open X, "> $dst" or die "can't create $dst: $!";
147 print X $content;
148 close X;
149}
150
Dieter Baronead38d42012-06-26 11:18:02 +0200151sub process_file {
152 my ($html, $lang, $id) = @_;
153
154 my $name = $html;
155 $name =~ s/.html//;
Dieter Baronb5cd45d2014-11-12 15:33:32 +0100156 my $mdoc = "$SRCDIR/$name.mdoc";
Dieter Baronead38d42012-06-26 11:18:02 +0200157
158 my $description;
159 my @names = ();
160
161 open MD, "< $mdoc" or die "can't open $mdoc: $!";
162
163 while (my $line = <MD>) {
164 if ($line =~ m/^.Nm (.*?)( ,)?$/) {
165 push @names, $1;
166 }
167 elsif ($line =~ m/^.Nd (.*)/) {
168 $description = $1;
169 }
170 elsif ($line =~ m/^.Sh SYNOPSIS/) {
171 last;
172 }
173 }
174
175 close MD;
176
177 print N " <Node id=\"$id\">\n";
178 print N " <Name>$name</Name>\n";
179 print N " <Path>$html</Path>\n";
180 print N " </Node>\n";
181
182 for my $name (@names) {
183 push @tokens, { type => "//apple_ref/$lang/func",
184 path => $html,
185 name => $name,
186 description => $description,
187 id => $id };
188 }
189
190 copy_html($html, "$docset/Contents/Resources/Documents/$html");
191}
192
Dieter Baron3f5dbfe2012-06-25 15:15:15 +0200193sub write_token {
194 my ($T, $token) = @_;
195
196 print $T " <Token>\n";
197 print $T " <TokenIdentifier>$token->{type}/$token->{name}</TokenIdentifier>\n";
198 print $T " <Path>$token->{path}</Path>\n";
199 print $T " <Abstract>$token->{description}</Abstract>\n";
200 print $T " <NodeRef refid=\"$token->{id}\" />\n";
201 print $T " </Token>\n";
202}
203
204sub write_tokens {
205 open my $T, "> $docset/Contents/Resources/Tokens.xml" or die "can't create Tokens.xml: $!";
206 print $T "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
207 print $T "<Tokens version=\"1.0\">\n";
208
209 for my $token (sort { $a->{name} cmp $b->{name} } @tokens) {
210 write_token($T, $token);
211 }
212
213 print $T "</Tokens>\n";
214
215 close $T;
216}