5 my $DOCSETUTIL = '/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil';
7 my $BASE_URL = 'http://nih.at/libzip';
8 my $BUNDLE_ID = 'at.nih.libzip';
10 my $SRCDIR = $ENV{SRCDIR} // '.';
14 my $docset = 'at.nih.libzip.docset';
15 my @sh_nodes = qw(zipcmp zipmerge ziptool);
17 (system('rm', '-rf', $docset) == 0) or die "can't remove old version of docset: $!";
19 mkdir($docset) or die "can't create docset directory: $!";
20 mkdir("$docset/Contents") or die "can't create docset directory: $!";
21 mkdir("$docset/Contents/Resources") or die "can't create docset directory: $!";
22 mkdir("$docset/Contents/Resources/Documents") or die "can't create docset directory: $!";
24 my $version = `sed -n 's/#define PACKAGE_VERSION "\\(.*\\)"/\\1/p' ../config.h`;
28 $suffix = '-hg' if ($version =~ /[a-z]$/);
30 my $package_file = "$BUNDLE_ID-$version.xar";
31 my $download_url = "$BASE_URL/$package_file";
32 my $feed_url = "$BASE_URL/at.nih.libzip$suffix.atom";
34 open I, "> $docset/Contents/Info.plist" or die "can't create Info.plist: $!";
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">
40 <key>CFBundleIdentifier</key>
41 <string>$BUNDLE_ID.docset</string>
42 <key>CFBundleName</key>
43 <string>libzip</string>
44 <key>DocSetPublisherIdentifier</key>
45 <string>at.nih</string>
46 <key>DocSetPublisherName</key>
48 <key>NSHumanReadableCopyright</key>
49 <string>Copyright © 2016 Dieter Baron and Thomas Klausner</string>
50 <key>CFBundleVersion</key>
51 <string>$version</string>
52 <key>DocSetFeedURL</key>
53 <string>$feed_url</string>
54 <key>DocSetFeedName</key>
55 <string>libzip</string>
61 open N, "> $docset/Contents/Resources/Nodes.xml" or die "can't create Nodes.xml: $!";
63 my %tl_nodes = (libzip => 1);
72 <?xml version="1.0" encoding="UTF-8"?>
73 <DocSetNodes version="1.0">
75 <Node noindex="1" type="folder">
76 <Name>libzip package</Name>
78 <Node noindex="1" type="folder">
80 <Path>libzip.html</Path>
87 for my $html (@files) {
91 if ($tl_nodes{$name}) {
95 process_file($html, 'c', $id++);
98 print N " </Subnodes>\n";
100 print N " <Node noindex=\"1\" type=\"folder\">\n";
101 print N " <Name>Commands</Name>\n";
102 print N " <Subnodes>\n";
106 for my $name (@sh_nodes) {
107 process_file("$name.html", 'c', $id++);
110 print N " </Subnodes>\n";
111 print N " </Node>\n";
112 print N " </Subnodes>\n";
113 print N " </Node>\n";
115 print N "</DocSetNodes>\n";
119 link("$SRCDIR/nih-man.css", "$docset/Contents/Resources/Documents/nih-man.css") or die "can't link css file: $!";
120 copy_html('libzip.html', "$docset/Contents/Resources/Documents/libzip.html");
124 system($DOCSETUTIL, 'index', $docset) == 0 or die "can't index docset: $!";
125 system($DOCSETUTIL, 'validate', $docset) == 0 or die "can't validate docset: $!";
127 unlink("$docset/Contents/Resources/Nodes.xml");
128 unlink("$docset/Contents/Resources/Tokens.xml");
130 system($DOCSETUTIL, 'package', '-output', "at.nih.libzip-$version.xar", '-atom', "at.nih.libzip$suffix.atom", '-download-url', "$BASE_URL/at.nih.libzip-$version.xar", $docset);
134 my ($src, $dst) = @_;
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,;
140 # remove header and footer
141 $content =~ s,<table[^>]*class="(heade?r?|foote?r?)".*?</table>,,sg;
143 $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;
146 open X, "> $dst" or die "can't create $dst: $!";
152 my ($html, $lang, $id) = @_;
156 my $mdoc = "$SRCDIR/$name.mdoc";
161 open MD, "< $mdoc" or die "can't open $mdoc: $!";
163 while (my $line = <MD>) {
164 if ($line =~ m/^.Nm (.*?)( ,)?$/) {
167 elsif ($line =~ m/^.Nd (.*)/) {
170 elsif ($line =~ m/^.Sh SYNOPSIS/) {
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";
182 for my $name (@names) {
183 push @tokens, { type => "//apple_ref/$lang/func",
186 description => $description,
190 copy_html($html, "$docset/Contents/Resources/Documents/$html");
194 my ($T, $token) = @_;
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";
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";
209 for my $token (sort { $a->{name} cmp $b->{name} } @tokens) {
210 write_token($T, $token);
213 print $T "</Tokens>\n";