Imported Upstream version 1.2.0
[platform/upstream/libzip.git] / man / mkdocset.pl
1 #!/usr/bin/env perl
2
3 use strict;
4
5 my $DOCSETUTIL = '/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil';
6
7 my $BASE_URL = 'http://nih.at/libzip';
8 my $BUNDLE_ID = 'at.nih.libzip';
9
10 my $SRCDIR = $ENV{SRCDIR} // '.';
11
12 my @files = @ARGV;
13
14 my $docset = 'at.nih.libzip.docset';
15 my @sh_nodes = qw(zipcmp zipmerge ziptool);
16
17 (system('rm', '-rf', $docset) == 0) or die "can't remove old version of docset: $!";
18
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: $!";
23
24 my $version = `sed -n 's/#define PACKAGE_VERSION "\\(.*\\)"/\\1/p' ../config.h`;
25 chomp $version;
26
27 my $suffix = '';
28 $suffix = '-hg' if ($version =~ /[a-z]$/);
29
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";
33
34 open I, "> $docset/Contents/Info.plist" or die "can't create Info.plist: $!";
35 print 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>
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>
47         <string>NiH</string>
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>
56 </dict>
57 </plist>
58 EOF
59 close I;
60
61 open N, "> $docset/Contents/Resources/Nodes.xml" or die "can't create Nodes.xml: $!";
62
63 my %tl_nodes = (libzip => 1);
64
65 for (@sh_nodes) {
66     $tl_nodes{$_} = 1;
67 }
68
69 my @tokens = ();
70
71 print N <<EOF;
72 <?xml version="1.0" encoding="UTF-8"?>
73 <DocSetNodes version="1.0">
74   <TOC>
75     <Node noindex="1" type="folder">
76       <Name>libzip package</Name>
77       <Subnodes>
78         <Node noindex="1" type="folder">
79           <Name>Library</Name>
80           <Path>libzip.html</Path>
81           <Subnodes>
82 EOF
83
84     
85 my $id = 1001;
86
87 for my $html (@files) {
88     my $name = $html;
89     $name =~ s/.html//;
90
91     if ($tl_nodes{$name}) {
92         next;
93     }
94
95     process_file($html, 'c', $id++);
96 }
97
98 print N "          </Subnodes>\n";
99 print N "        </Node>\n";
100 print N "        <Node noindex=\"1\" type=\"folder\">\n";
101 print N "          <Name>Commands</Name>\n";
102 print N "          <Subnodes>\n";
103
104 $id = 2;
105
106 for my $name (@sh_nodes) {
107     process_file("$name.html", 'c', $id++);
108 }
109
110 print N "          </Subnodes>\n";
111 print N "        </Node>\n";
112 print N "      </Subnodes>\n";
113 print N "    </Node>\n";
114 print N "  </TOC>\n";
115 print N "</DocSetNodes>\n";
116
117 close N;
118
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");
121
122 write_tokens();
123
124 system($DOCSETUTIL, 'index', $docset) == 0 or die "can't index docset: $!";
125 system($DOCSETUTIL, 'validate', $docset) == 0 or die "can't validate docset: $!";
126
127 unlink("$docset/Contents/Resources/Nodes.xml");
128 unlink("$docset/Contents/Resources/Tokens.xml");
129
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);
131
132
133 sub 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
140     # remove header and footer
141     $content =~ s,<table[^>]*class="(heade?r?|foote?r?)".*?</table>,,sg;
142
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;
145
146     open X, "> $dst" or die "can't create $dst: $!";
147     print X $content;
148     close X;
149 }
150
151 sub process_file {
152     my ($html, $lang, $id) = @_;
153
154     my $name = $html;
155     $name =~ s/.html//;
156     my $mdoc = "$SRCDIR/$name.mdoc";
157
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
193 sub 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
204 sub 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 }