#!/usr/bin/env perl use strict; my $DOCSETUTIL = '/Applications/Xcode.app/Contents/Developer/usr/bin/docsetutil'; my $BASE_URL = 'http://nih.at/libzip'; my $BUNDLE_ID = 'at.nih.libzip'; my $SRCDIR = $ENV{SRCDIR} // '.'; my @files = @ARGV; my $docset = 'at.nih.libzip.docset'; my @sh_nodes = qw(zipcmp zipmerge ziptool); (system('rm', '-rf', $docset) == 0) or die "can't remove old version of docset: $!"; mkdir($docset) or die "can't create docset directory: $!"; mkdir("$docset/Contents") or die "can't create docset directory: $!"; mkdir("$docset/Contents/Resources") or die "can't create docset directory: $!"; mkdir("$docset/Contents/Resources/Documents") or die "can't create docset directory: $!"; my $version = `sed -n 's/#define PACKAGE_VERSION "\\(.*\\)"/\\1/p' ../config.h`; chomp $version; my $suffix = ''; $suffix = '-hg' if ($version =~ /[a-z]$/); my $package_file = "$BUNDLE_ID-$version.xar"; my $download_url = "$BASE_URL/$package_file"; my $feed_url = "$BASE_URL/at.nih.libzip$suffix.atom"; open I, "> $docset/Contents/Info.plist" or die "can't create Info.plist: $!"; print I < CFBundleIdentifier $BUNDLE_ID.docset CFBundleName libzip DocSetPublisherIdentifier at.nih DocSetPublisherName NiH NSHumanReadableCopyright Copyright © 2016 Dieter Baron and Thomas Klausner CFBundleVersion $version DocSetFeedURL $feed_url DocSetFeedName libzip EOF close I; open N, "> $docset/Contents/Resources/Nodes.xml" or die "can't create Nodes.xml: $!"; my %tl_nodes = (libzip => 1); for (@sh_nodes) { $tl_nodes{$_} = 1; } my @tokens = (); print N < libzip package Library libzip.html EOF my $id = 1001; for my $html (@files) { my $name = $html; $name =~ s/.html//; if ($tl_nodes{$name}) { next; } process_file($html, 'c', $id++); } print N " \n"; print N " \n"; print N " \n"; print N " Commands\n"; print N " \n"; $id = 2; for my $name (@sh_nodes) { process_file("$name.html", 'c', $id++); } print N " \n"; print N " \n"; print N " \n"; print N " \n"; print N " \n"; print N "\n"; close N; link("$SRCDIR/nih-man.css", "$docset/Contents/Resources/Documents/nih-man.css") or die "can't link css file: $!"; copy_html('libzip.html', "$docset/Contents/Resources/Documents/libzip.html"); write_tokens(); system($DOCSETUTIL, 'index', $docset) == 0 or die "can't index docset: $!"; system($DOCSETUTIL, 'validate', $docset) == 0 or die "can't validate docset: $!"; unlink("$docset/Contents/Resources/Nodes.xml"); unlink("$docset/Contents/Resources/Tokens.xml"); 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); sub copy_html { my ($src, $dst) = @_; my $content = `cat $src`; $content =~ s,,,; $content =~ s,../nih-man.css,nih-man.css,; # remove header and footer $content =~ s,]*class="(heade?r?|foote?r?)".*?,,sg; $content =~ s,(
$dst" or die "can't create $dst: $!"; print X $content; close X; } sub process_file { my ($html, $lang, $id) = @_; my $name = $html; $name =~ s/.html//; my $mdoc = "$SRCDIR/$name.mdoc"; my $description; my @names = (); open MD, "< $mdoc" or die "can't open $mdoc: $!"; while (my $line = ) { if ($line =~ m/^.Nm (.*?)( ,)?$/) { push @names, $1; } elsif ($line =~ m/^.Nd (.*)/) { $description = $1; } elsif ($line =~ m/^.Sh SYNOPSIS/) { last; } } close MD; print N " \n"; print N " $name\n"; print N " $html\n"; print N " \n"; for my $name (@names) { push @tokens, { type => "//apple_ref/$lang/func", path => $html, name => $name, description => $description, id => $id }; } copy_html($html, "$docset/Contents/Resources/Documents/$html"); } sub write_token { my ($T, $token) = @_; print $T " \n"; print $T " $token->{type}/$token->{name}\n"; print $T " $token->{path}\n"; print $T " $token->{description}\n"; print $T " {id}\" />\n"; print $T " \n"; } sub write_tokens { open my $T, "> $docset/Contents/Resources/Tokens.xml" or die "can't create Tokens.xml: $!"; print $T "\n"; print $T "\n"; for my $token (sort { $a->{name} cmp $b->{name} } @tokens) { write_token($T, $token); } print $T "\n"; close $T; }