Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 1 | #!/usr/bin/env perl |
| 2 | |
| 3 | use strict; |
| 4 | |
Dieter Baron | e336eac | 2013-04-17 11:54:57 +0200 | [diff] [blame] | 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 | |
Dieter Baron | b5cd45d | 2014-11-12 15:33:32 +0100 | [diff] [blame] | 10 | my $SRCDIR = $ENV{SRCDIR} // '.'; |
| 11 | |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 12 | my @files = @ARGV; |
| 13 | |
| 14 | my $docset = 'at.nih.libzip.docset'; |
Dieter Baron | c3612b4 | 2016-01-29 17:19:57 +0100 | [diff] [blame] | 15 | my @sh_nodes = qw(zipcmp zipmerge ziptool); |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 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 | |
Dieter Baron | acde35d | 2012-06-26 20:59:34 +0200 | [diff] [blame] | 24 | my $version = `sed -n 's/#define PACKAGE_VERSION "\\(.*\\)"/\\1/p' ../config.h`; |
| 25 | chomp $version; |
| 26 | |
Dieter Baron | e336eac | 2013-04-17 11:54:57 +0200 | [diff] [blame] | 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 | |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 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> |
Dieter Baron | e336eac | 2013-04-17 11:54:57 +0200 | [diff] [blame] | 41 | <string>$BUNDLE_ID.docset</string> |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 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> |
Dieter Baron | c3612b4 | 2016-01-29 17:19:57 +0100 | [diff] [blame] | 49 | <string>Copyright © 2016 Dieter Baron and Thomas Klausner</string> |
Dieter Baron | acde35d | 2012-06-26 20:59:34 +0200 | [diff] [blame] | 50 | <key>CFBundleVersion</key> |
| 51 | <string>$version</string> |
Dieter Baron | e336eac | 2013-04-17 11:54:57 +0200 | [diff] [blame] | 52 | <key>DocSetFeedURL</key> |
| 53 | <string>$feed_url</string> |
| 54 | <key>DocSetFeedName</key> |
| 55 | <string>libzip</string> |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 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 | |
Dieter Baron | 606b45b | 2012-06-25 18:26:35 +0200 | [diff] [blame] | 69 | my @tokens = (); |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 70 | |
| 71 | print N <<EOF; |
| 72 | <?xml version="1.0" encoding="UTF-8"?> |
| 73 | <DocSetNodes version="1.0"> |
| 74 | <TOC> |
Dieter Baron | acde35d | 2012-06-26 20:59:34 +0200 | [diff] [blame] | 75 | <Node noindex="1" type="folder"> |
Dieter Baron | ead38d4 | 2012-06-26 11:18:02 +0200 | [diff] [blame] | 76 | <Name>libzip package</Name> |
| 77 | <Subnodes> |
Dieter Baron | acde35d | 2012-06-26 20:59:34 +0200 | [diff] [blame] | 78 | <Node noindex="1" type="folder"> |
Dieter Baron | ead38d4 | 2012-06-26 11:18:02 +0200 | [diff] [blame] | 79 | <Name>Library</Name> |
| 80 | <Path>libzip.html</Path> |
| 81 | <Subnodes> |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 82 | EOF |
| 83 | |
| 84 | |
| 85 | my $id = 1001; |
| 86 | |
| 87 | for my $html (@files) { |
| 88 | my $name = $html; |
| 89 | $name =~ s/.html//; |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 90 | |
| 91 | if ($tl_nodes{$name}) { |
| 92 | next; |
| 93 | } |
| 94 | |
Dieter Baron | ead38d4 | 2012-06-26 11:18:02 +0200 | [diff] [blame] | 95 | process_file($html, 'c', $id++); |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 96 | } |
| 97 | |
Dieter Baron | ead38d4 | 2012-06-26 11:18:02 +0200 | [diff] [blame] | 98 | print N " </Subnodes>\n"; |
| 99 | print N " </Node>\n"; |
Dieter Baron | acde35d | 2012-06-26 20:59:34 +0200 | [diff] [blame] | 100 | print N " <Node noindex=\"1\" type=\"folder\">\n"; |
Dieter Baron | ead38d4 | 2012-06-26 11:18:02 +0200 | [diff] [blame] | 101 | print N " <Name>Commands</Name>\n"; |
| 102 | print N " <Subnodes>\n"; |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 103 | |
Dieter Baron | ead38d4 | 2012-06-26 11:18:02 +0200 | [diff] [blame] | 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"; |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 116 | |
| 117 | close N; |
| 118 | |
Dieter Baron | b5cd45d | 2014-11-12 15:33:32 +0100 | [diff] [blame] | 119 | link("$SRCDIR/nih-man.css", "$docset/Contents/Resources/Documents/nih-man.css") or die "can't link css file: $!"; |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 120 | copy_html('libzip.html', "$docset/Contents/Resources/Documents/libzip.html"); |
| 121 | |
Dieter Baron | 606b45b | 2012-06-25 18:26:35 +0200 | [diff] [blame] | 122 | write_tokens(); |
| 123 | |
Dieter Baron | e336eac | 2013-04-17 11:54:57 +0200 | [diff] [blame] | 124 | system($DOCSETUTIL, 'index', $docset) == 0 or die "can't index docset: $!"; |
| 125 | system($DOCSETUTIL, 'validate', $docset) == 0 or die "can't validate docset: $!"; |
Dieter Baron | 606b45b | 2012-06-25 18:26:35 +0200 | [diff] [blame] | 126 | |
| 127 | unlink("$docset/Contents/Resources/Nodes.xml"); |
| 128 | unlink("$docset/Contents/Resources/Tokens.xml"); |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 129 | |
Dieter Baron | e336eac | 2013-04-17 11:54:57 +0200 | [diff] [blame] | 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 | |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 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 | |
Dieter Baron | cc7d248 | 2012-06-26 20:35:38 +0200 | [diff] [blame] | 140 | # remove header and footer |
| 141 | $content =~ s,<table[^>]*class="(heade?r?|foote?r?)".*?</table>,,sg; |
| 142 | |
Dieter Baron | b9e1c0b | 2012-06-25 15:49:30 +0200 | [diff] [blame] | 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; |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 145 | |
| 146 | open X, "> $dst" or die "can't create $dst: $!"; |
| 147 | print X $content; |
| 148 | close X; |
| 149 | } |
| 150 | |
Dieter Baron | ead38d4 | 2012-06-26 11:18:02 +0200 | [diff] [blame] | 151 | sub process_file { |
| 152 | my ($html, $lang, $id) = @_; |
| 153 | |
| 154 | my $name = $html; |
| 155 | $name =~ s/.html//; |
Dieter Baron | b5cd45d | 2014-11-12 15:33:32 +0100 | [diff] [blame] | 156 | my $mdoc = "$SRCDIR/$name.mdoc"; |
Dieter Baron | ead38d4 | 2012-06-26 11:18:02 +0200 | [diff] [blame] | 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 | |
Dieter Baron | 3f5dbfe | 2012-06-25 15:15:15 +0200 | [diff] [blame] | 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 | } |