1*bd1f8aebSAndroid Build Coastguard Worker=head1 NAME 2*bd1f8aebSAndroid Build Coastguard Worker 3*bd1f8aebSAndroid Build Coastguard Workerdocbook2man-spec - convert DocBook RefEntries to Unix manpages 4*bd1f8aebSAndroid Build Coastguard Worker 5*bd1f8aebSAndroid Build Coastguard Worker=head1 SYNOPSIS 6*bd1f8aebSAndroid Build Coastguard Worker 7*bd1f8aebSAndroid Build Coastguard WorkerThe SGMLSpm package from CPAN. This contains the sgmlspl script which 8*bd1f8aebSAndroid Build Coastguard Workeris used to grok this file. Use it like this: 9*bd1f8aebSAndroid Build Coastguard Worker 10*bd1f8aebSAndroid Build Coastguard Workernsgmls some-docbook-document.sgml | sgmlspl docbook2man-spec.pl 11*bd1f8aebSAndroid Build Coastguard Worker 12*bd1f8aebSAndroid Build Coastguard Worker=head1 DESCRIPTION 13*bd1f8aebSAndroid Build Coastguard Worker 14*bd1f8aebSAndroid Build Coastguard WorkerThis is a sgmlspl spec file that produces Unix-style 15*bd1f8aebSAndroid Build Coastguard Workermanpages from RefEntry markup. 16*bd1f8aebSAndroid Build Coastguard Worker 17*bd1f8aebSAndroid Build Coastguard WorkerSee the accompanying RefEntry man page for 'plain new' documentation. :) 18*bd1f8aebSAndroid Build Coastguard Worker 19*bd1f8aebSAndroid Build Coastguard Worker=head1 LIMITATIONS 20*bd1f8aebSAndroid Build Coastguard Worker 21*bd1f8aebSAndroid Build Coastguard WorkerTrying docbook2man on non-DocBook or non-conformant SGML results in 22*bd1f8aebSAndroid Build Coastguard Workerundefined behavior. :-) 23*bd1f8aebSAndroid Build Coastguard Worker 24*bd1f8aebSAndroid Build Coastguard WorkerThis program is a slow, dodgy Perl script. 25*bd1f8aebSAndroid Build Coastguard Worker 26*bd1f8aebSAndroid Build Coastguard WorkerThis program does not come close to supporting all the possible markup 27*bd1f8aebSAndroid Build Coastguard Workerin DocBook, and will produce wrong output in some cases with supported 28*bd1f8aebSAndroid Build Coastguard Workermarkup. 29*bd1f8aebSAndroid Build Coastguard Worker 30*bd1f8aebSAndroid Build Coastguard Worker=head1 TODO 31*bd1f8aebSAndroid Build Coastguard Worker 32*bd1f8aebSAndroid Build Coastguard WorkerAdd new element handling and fix existing handling. Be robust. 33*bd1f8aebSAndroid Build Coastguard WorkerProduce cleanest, readable man output as possible (unlike some 34*bd1f8aebSAndroid Build Coastguard Workerother converters). Follow Linux man(7) convention. 35*bd1f8aebSAndroid Build Coastguard WorkerIf this results in added logic in this script, 36*bd1f8aebSAndroid Build Coastguard Workerthat's okay. The code should still be reasonably organized. 37*bd1f8aebSAndroid Build Coastguard Worker 38*bd1f8aebSAndroid Build Coastguard WorkerMake it faster. If Perl sucks port it to another language. 39*bd1f8aebSAndroid Build Coastguard Worker 40*bd1f8aebSAndroid Build Coastguard Worker=head1 COPYRIGHT 41*bd1f8aebSAndroid Build Coastguard Worker 42*bd1f8aebSAndroid Build Coastguard WorkerCopyright (C) 1998-1999 Steve Cheng <[email protected]> 43*bd1f8aebSAndroid Build Coastguard Worker 44*bd1f8aebSAndroid Build Coastguard WorkerThis program is free software; you can redistribute it and/or modify it 45*bd1f8aebSAndroid Build Coastguard Workerunder the terms of the GNU General Public License as published by the Free 46*bd1f8aebSAndroid Build Coastguard WorkerSoftware Foundation; either version 2, or (at your option) any later 47*bd1f8aebSAndroid Build Coastguard Workerversion. 48*bd1f8aebSAndroid Build Coastguard Worker 49*bd1f8aebSAndroid Build Coastguard WorkerYou should have received a copy of the GNU General Public License along with 50*bd1f8aebSAndroid Build Coastguard Workerthis program; see the file COPYING. If not, please write to the Free 51*bd1f8aebSAndroid Build Coastguard WorkerSoftware Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 52*bd1f8aebSAndroid Build Coastguard Worker 53*bd1f8aebSAndroid Build Coastguard Worker=cut 54*bd1f8aebSAndroid Build Coastguard Worker 55*bd1f8aebSAndroid Build Coastguard Worker# $Id: docbook2man-spec.pl,v 1.1 2000/07/21 20:22:30 rosalia Exp $ 56*bd1f8aebSAndroid Build Coastguard Worker 57*bd1f8aebSAndroid Build Coastguard Workeruse SGMLS; # Use the SGMLS package. 58*bd1f8aebSAndroid Build Coastguard Workeruse SGMLS::Output; # Use stack-based output. 59*bd1f8aebSAndroid Build Coastguard Workeruse SGMLS::Refs; 60*bd1f8aebSAndroid Build Coastguard Worker 61*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 62*bd1f8aebSAndroid Build Coastguard Worker# SGMLSPL script produced automatically by the script sgmlspl.pl 63*bd1f8aebSAndroid Build Coastguard Worker# 64*bd1f8aebSAndroid Build Coastguard Worker# Document Type: any, but processes only RefEntries 65*bd1f8aebSAndroid Build Coastguard Worker# Edited by: me :) 66*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 67*bd1f8aebSAndroid Build Coastguard Worker 68*bd1f8aebSAndroid Build Coastguard Worker$write_manpages = 0; 69*bd1f8aebSAndroid Build Coastguard Worker$blank_xrefs = 0; 70*bd1f8aebSAndroid Build Coastguard Worker 71*bd1f8aebSAndroid Build Coastguard Workersgml('start', sub { 72*bd1f8aebSAndroid Build Coastguard Worker push_output('nul'); 73*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata = 1; # Makes it a bit faster. 74*bd1f8aebSAndroid Build Coastguard Worker 75*bd1f8aebSAndroid Build Coastguard Worker # Links file 76*bd1f8aebSAndroid Build Coastguard Worker open(LINKSFILE, ">manpage.links"); 77*bd1f8aebSAndroid Build Coastguard Worker 78*bd1f8aebSAndroid Build Coastguard Worker $Refs = new SGMLS::Refs("manpage.refs"); 79*bd1f8aebSAndroid Build Coastguard Worker}); 80*bd1f8aebSAndroid Build Coastguard Workersgml('end', sub { 81*bd1f8aebSAndroid Build Coastguard Worker close(LINKSFILE); 82*bd1f8aebSAndroid Build Coastguard Worker if($blank_xrefs) { 83*bd1f8aebSAndroid Build Coastguard Worker print STDERR "Warning: output contains unresolved XRefs\n"; 84*bd1f8aebSAndroid Build Coastguard Worker } 85*bd1f8aebSAndroid Build Coastguard Worker}); 86*bd1f8aebSAndroid Build Coastguard Worker 87*bd1f8aebSAndroid Build Coastguard Worker 88*bd1f8aebSAndroid Build Coastguard Worker 89*bd1f8aebSAndroid Build Coastguard Worker 90*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 91*bd1f8aebSAndroid Build Coastguard Worker# 92*bd1f8aebSAndroid Build Coastguard Worker# Output helpers 93*bd1f8aebSAndroid Build Coastguard Worker# 94*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 95*bd1f8aebSAndroid Build Coastguard Worker 96*bd1f8aebSAndroid Build Coastguard Worker# Our own version of sgml() and output() to allow simple string output 97*bd1f8aebSAndroid Build Coastguard Worker# to play well with roff's stupid whitespace rules. 98*bd1f8aebSAndroid Build Coastguard Worker 99*bd1f8aebSAndroid Build Coastguard Workersub man_sgml 100*bd1f8aebSAndroid Build Coastguard Worker{ 101*bd1f8aebSAndroid Build Coastguard Worker if(ref($_[1]) eq 'CODE') { 102*bd1f8aebSAndroid Build Coastguard Worker return &sgml; 103*bd1f8aebSAndroid Build Coastguard Worker } 104*bd1f8aebSAndroid Build Coastguard Worker 105*bd1f8aebSAndroid Build Coastguard Worker my $s = $_[1]; 106*bd1f8aebSAndroid Build Coastguard Worker 107*bd1f8aebSAndroid Build Coastguard Worker $s =~ s/\\/\\\\/g; 108*bd1f8aebSAndroid Build Coastguard Worker $s =~ s/'/\\'/g; 109*bd1f8aebSAndroid Build Coastguard Worker 110*bd1f8aebSAndroid Build Coastguard Worker # \n at the beginning means start at beginning of line 111*bd1f8aebSAndroid Build Coastguard Worker if($s =~ s/^\n//) { 112*bd1f8aebSAndroid Build Coastguard Worker $sub = 'sub { output "\n" unless $newline_last++; '; 113*bd1f8aebSAndroid Build Coastguard Worker if($s eq '') { 114*bd1f8aebSAndroid Build Coastguard Worker sgml($_[0], eval('sub { output "\n" unless $newline_last++; }')); 115*bd1f8aebSAndroid Build Coastguard Worker } elsif($s =~ /\n$/) { 116*bd1f8aebSAndroid Build Coastguard Worker sgml($_[0], eval("sub { output \"\\n\" unless \$newline_last++; output '$s'; }")); 117*bd1f8aebSAndroid Build Coastguard Worker } else { 118*bd1f8aebSAndroid Build Coastguard Worker sgml($_[0], eval("sub { output \"\\n\" unless \$newline_last; output '$s'; \$newline_last = 0; }")); 119*bd1f8aebSAndroid Build Coastguard Worker } 120*bd1f8aebSAndroid Build Coastguard Worker } else { 121*bd1f8aebSAndroid Build Coastguard Worker if($s =~ /\n$/) { 122*bd1f8aebSAndroid Build Coastguard Worker sgml($_[0], eval("sub { output '$s'; \$newline_last = 1; }")); 123*bd1f8aebSAndroid Build Coastguard Worker } else { 124*bd1f8aebSAndroid Build Coastguard Worker sgml($_[0], eval("sub { output '$s'; \$newline_last = 0; }")); 125*bd1f8aebSAndroid Build Coastguard Worker } 126*bd1f8aebSAndroid Build Coastguard Worker } 127*bd1f8aebSAndroid Build Coastguard Worker} 128*bd1f8aebSAndroid Build Coastguard Worker 129*bd1f8aebSAndroid Build Coastguard Workersub man_output 130*bd1f8aebSAndroid Build Coastguard Worker{ 131*bd1f8aebSAndroid Build Coastguard Worker $_ = shift; 132*bd1f8aebSAndroid Build Coastguard Worker if(s/^\n//) { 133*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 134*bd1f8aebSAndroid Build Coastguard Worker } 135*bd1f8aebSAndroid Build Coastguard Worker return if $_ eq ''; 136*bd1f8aebSAndroid Build Coastguard Worker 137*bd1f8aebSAndroid Build Coastguard Worker output $_; 138*bd1f8aebSAndroid Build Coastguard Worker 139*bd1f8aebSAndroid Build Coastguard Worker if(@_) { 140*bd1f8aebSAndroid Build Coastguard Worker output @_; 141*bd1f8aebSAndroid Build Coastguard Worker $newline_last = (pop(@_) =~ /\n$/); 142*bd1f8aebSAndroid Build Coastguard Worker } else { 143*bd1f8aebSAndroid Build Coastguard Worker $newline_last = ($_ =~ /\n$/) 144*bd1f8aebSAndroid Build Coastguard Worker } 145*bd1f8aebSAndroid Build Coastguard Worker} 146*bd1f8aebSAndroid Build Coastguard Worker 147*bd1f8aebSAndroid Build Coastguard Worker# Fold lines into one, quote some characters 148*bd1f8aebSAndroid Build Coastguard Workersub fold_string 149*bd1f8aebSAndroid Build Coastguard Worker{ 150*bd1f8aebSAndroid Build Coastguard Worker $_ = shift; 151*bd1f8aebSAndroid Build Coastguard Worker 152*bd1f8aebSAndroid Build Coastguard Worker s/\\/\\\\/g; 153*bd1f8aebSAndroid Build Coastguard Worker s/"/\\\&"/g; 154*bd1f8aebSAndroid Build Coastguard Worker 155*bd1f8aebSAndroid Build Coastguard Worker # Change tabs to spaces 156*bd1f8aebSAndroid Build Coastguard Worker tr/\t\n/ /; 157*bd1f8aebSAndroid Build Coastguard Worker 158*bd1f8aebSAndroid Build Coastguard Worker # Trim whitespace from beginning and end. 159*bd1f8aebSAndroid Build Coastguard Worker s/^ +//; 160*bd1f8aebSAndroid Build Coastguard Worker s/ +$//; 161*bd1f8aebSAndroid Build Coastguard Worker 162*bd1f8aebSAndroid Build Coastguard Worker return $_; 163*bd1f8aebSAndroid Build Coastguard Worker} 164*bd1f8aebSAndroid Build Coastguard Worker 165*bd1f8aebSAndroid Build Coastguard Workersub save_cdata() 166*bd1f8aebSAndroid Build Coastguard Worker{ 167*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata++; 168*bd1f8aebSAndroid Build Coastguard Worker push_output('string'); 169*bd1f8aebSAndroid Build Coastguard Worker} 170*bd1f8aebSAndroid Build Coastguard Worker 171*bd1f8aebSAndroid Build Coastguard Workersub bold_on() 172*bd1f8aebSAndroid Build Coastguard Worker{ 173*bd1f8aebSAndroid Build Coastguard Worker # If the last font is also bold, don't change anything. 174*bd1f8aebSAndroid Build Coastguard Worker # Basically this is to just get more readable man output. 175*bd1f8aebSAndroid Build Coastguard Worker if($fontstack[$#fontstack] ne 'bold') { 176*bd1f8aebSAndroid Build Coastguard Worker if(!$raw_cdata) { 177*bd1f8aebSAndroid Build Coastguard Worker output '\fB'; 178*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 0; 179*bd1f8aebSAndroid Build Coastguard Worker } 180*bd1f8aebSAndroid Build Coastguard Worker } 181*bd1f8aebSAndroid Build Coastguard Worker push(@fontstack, 'bold'); 182*bd1f8aebSAndroid Build Coastguard Worker} 183*bd1f8aebSAndroid Build Coastguard Worker 184*bd1f8aebSAndroid Build Coastguard Workersub italic_on() 185*bd1f8aebSAndroid Build Coastguard Worker{ 186*bd1f8aebSAndroid Build Coastguard Worker # If the last font is also italic, don't change anything. 187*bd1f8aebSAndroid Build Coastguard Worker if($fontstack[$#fontstack] ne 'italic') { 188*bd1f8aebSAndroid Build Coastguard Worker if(!$raw_cdata) { 189*bd1f8aebSAndroid Build Coastguard Worker output '\fI'; 190*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 0; 191*bd1f8aebSAndroid Build Coastguard Worker } 192*bd1f8aebSAndroid Build Coastguard Worker } 193*bd1f8aebSAndroid Build Coastguard Worker push(@fontstack, 'italic'); 194*bd1f8aebSAndroid Build Coastguard Worker} 195*bd1f8aebSAndroid Build Coastguard Worker 196*bd1f8aebSAndroid Build Coastguard Workersub font_off() 197*bd1f8aebSAndroid Build Coastguard Worker{ 198*bd1f8aebSAndroid Build Coastguard Worker my $thisfont = pop(@fontstack); 199*bd1f8aebSAndroid Build Coastguard Worker my $lastfont = $fontstack[$#fontstack]; 200*bd1f8aebSAndroid Build Coastguard Worker 201*bd1f8aebSAndroid Build Coastguard Worker # Only output font change if it is different 202*bd1f8aebSAndroid Build Coastguard Worker if($thisfont ne $lastfont) { 203*bd1f8aebSAndroid Build Coastguard Worker if($raw_cdata) { return; } 204*bd1f8aebSAndroid Build Coastguard Worker elsif($lastfont eq 'bold') { output '\fB'; } 205*bd1f8aebSAndroid Build Coastguard Worker elsif($lastfont eq 'italic') { output '\fI'; } 206*bd1f8aebSAndroid Build Coastguard Worker else { output '\fR'; } 207*bd1f8aebSAndroid Build Coastguard Worker 208*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 0; 209*bd1f8aebSAndroid Build Coastguard Worker } 210*bd1f8aebSAndroid Build Coastguard Worker} 211*bd1f8aebSAndroid Build Coastguard Worker 212*bd1f8aebSAndroid Build Coastguard Worker 213*bd1f8aebSAndroid Build Coastguard Worker 214*bd1f8aebSAndroid Build Coastguard Worker 215*bd1f8aebSAndroid Build Coastguard Worker 216*bd1f8aebSAndroid Build Coastguard Worker 217*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 218*bd1f8aebSAndroid Build Coastguard Worker# 219*bd1f8aebSAndroid Build Coastguard Worker# Manpage management 220*bd1f8aebSAndroid Build Coastguard Worker# 221*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 222*bd1f8aebSAndroid Build Coastguard Worker 223*bd1f8aebSAndroid Build Coastguard Workersgml('<REFENTRY>', sub { 224*bd1f8aebSAndroid Build Coastguard Worker # This will be overwritten at end of REFMETA, when we know the name of the page. 225*bd1f8aebSAndroid Build Coastguard Worker pop_output(); 226*bd1f8aebSAndroid Build Coastguard Worker 227*bd1f8aebSAndroid Build Coastguard Worker $write_manpages = 1; # Currently writing manpage. 228*bd1f8aebSAndroid Build Coastguard Worker 229*bd1f8aebSAndroid Build Coastguard Worker $nocollapse_whitespace = 0; # Current whitespace collapse counter. 230*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 1; # At beginning of line? 231*bd1f8aebSAndroid Build Coastguard Worker # Just a bit of warning, you will see this variable manipulated 232*bd1f8aebSAndroid Build Coastguard Worker # manually a lot. It makes the code harder to follow but it 233*bd1f8aebSAndroid Build Coastguard Worker # saves you from having to worry about collapsing at the end of 234*bd1f8aebSAndroid Build Coastguard Worker # parse, stopping at verbatims, etc. 235*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata = 0; # Instructs certain output functions to 236*bd1f8aebSAndroid Build Coastguard Worker # leave CDATA alone, so we can assign 237*bd1f8aebSAndroid Build Coastguard Worker # it to a string and process it, etc. 238*bd1f8aebSAndroid Build Coastguard Worker @fontstack = (); # Fonts being activated. 239*bd1f8aebSAndroid Build Coastguard Worker 240*bd1f8aebSAndroid Build Coastguard Worker $manpage_title = ''; # Needed for indexing. 241*bd1f8aebSAndroid Build Coastguard Worker $manpage_sect = ''; 242*bd1f8aebSAndroid Build Coastguard Worker @manpage_names = (); 243*bd1f8aebSAndroid Build Coastguard Worker 244*bd1f8aebSAndroid Build Coastguard Worker $manpage_misc = ''; 245*bd1f8aebSAndroid Build Coastguard Worker 246*bd1f8aebSAndroid Build Coastguard Worker $list_nestlevel = 0; # Indent certain nested content. 247*bd1f8aebSAndroid Build Coastguard Worker}); 248*bd1f8aebSAndroid Build Coastguard Workersgml('</REFENTRY>', sub { 249*bd1f8aebSAndroid Build Coastguard Worker if(!$newline_last) { 250*bd1f8aebSAndroid Build Coastguard Worker output "\n"; 251*bd1f8aebSAndroid Build Coastguard Worker } 252*bd1f8aebSAndroid Build Coastguard Worker 253*bd1f8aebSAndroid Build Coastguard Worker $write_manpages = 0; 254*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata = 1; 255*bd1f8aebSAndroid Build Coastguard Worker push_output('nul'); 256*bd1f8aebSAndroid Build Coastguard Worker}); 257*bd1f8aebSAndroid Build Coastguard Worker 258*bd1f8aebSAndroid Build Coastguard Workersgml('</REFMETA>', sub { 259*bd1f8aebSAndroid Build Coastguard Worker push_output('file', "$manpage_title.$manpage_sect"); 260*bd1f8aebSAndroid Build Coastguard Worker 261*bd1f8aebSAndroid Build Coastguard Worker output <<_END_BANNER; 262*bd1f8aebSAndroid Build Coastguard Worker.\\" This manpage has been automatically generated by docbook2man 263*bd1f8aebSAndroid Build Coastguard Worker.\\" from a DocBook document. This tool can be found at: 264*bd1f8aebSAndroid Build Coastguard Worker.\\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> 265*bd1f8aebSAndroid Build Coastguard Worker.\\" Please send any bug reports, improvements, comments, patches, 266*bd1f8aebSAndroid Build Coastguard Worker.\\" etc. to Steve Cheng <steve\@ggi-project.org>. 267*bd1f8aebSAndroid Build Coastguard Worker_END_BANNER 268*bd1f8aebSAndroid Build Coastguard Worker 269*bd1f8aebSAndroid Build Coastguard Worker my $manpage_date = `date "+%d %B %Y"`; 270*bd1f8aebSAndroid Build Coastguard Worker 271*bd1f8aebSAndroid Build Coastguard Worker output '.TH "'; 272*bd1f8aebSAndroid Build Coastguard Worker 273*bd1f8aebSAndroid Build Coastguard Worker # If the title is not mixed-case, convention says to 274*bd1f8aebSAndroid Build Coastguard Worker # uppercase the whole title. (The canonical title is 275*bd1f8aebSAndroid Build Coastguard Worker # lowercase.) 276*bd1f8aebSAndroid Build Coastguard Worker if($manpage_title =~ /[A-Z]/) { 277*bd1f8aebSAndroid Build Coastguard Worker output fold_string($manpage_title); 278*bd1f8aebSAndroid Build Coastguard Worker } else { 279*bd1f8aebSAndroid Build Coastguard Worker output uc(fold_string($manpage_title)); 280*bd1f8aebSAndroid Build Coastguard Worker } 281*bd1f8aebSAndroid Build Coastguard Worker 282*bd1f8aebSAndroid Build Coastguard Worker output '" "', fold_string($manpage_sect), 283*bd1f8aebSAndroid Build Coastguard Worker '" "', fold_string(`date "+%d %B %Y"`), 284*bd1f8aebSAndroid Build Coastguard Worker '" "', $manpage_misc, 285*bd1f8aebSAndroid Build Coastguard Worker '" "', $manpage_manual, 286*bd1f8aebSAndroid Build Coastguard Worker "\"\n"; 287*bd1f8aebSAndroid Build Coastguard Worker 288*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 1; 289*bd1f8aebSAndroid Build Coastguard Worker 290*bd1f8aebSAndroid Build Coastguard Worker # References to this RefEntry. 291*bd1f8aebSAndroid Build Coastguard Worker my $id = $_[0]->parent->attribute('ID')->value; 292*bd1f8aebSAndroid Build Coastguard Worker if($id ne '') { 293*bd1f8aebSAndroid Build Coastguard Worker # The 'package name' part of the section should 294*bd1f8aebSAndroid Build Coastguard Worker # not be used when citing it. 295*bd1f8aebSAndroid Build Coastguard Worker my ($sectnum) = ($manpage_sect =~ /([0-9]*)/); 296*bd1f8aebSAndroid Build Coastguard Worker 297*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->parent->attribute('XREFLABEL')->value eq '') { 298*bd1f8aebSAndroid Build Coastguard Worker $Refs->put("refentry:$id", "$manpage_title($sectnum)"); 299*bd1f8aebSAndroid Build Coastguard Worker } else { 300*bd1f8aebSAndroid Build Coastguard Worker $Refs->put("refentry:$id", 301*bd1f8aebSAndroid Build Coastguard Worker $_[0]->parent->attribute('XREFLABEL')->value . 302*bd1f8aebSAndroid Build Coastguard Worker "($sectnum)"); 303*bd1f8aebSAndroid Build Coastguard Worker } 304*bd1f8aebSAndroid Build Coastguard Worker } 305*bd1f8aebSAndroid Build Coastguard Worker}); 306*bd1f8aebSAndroid Build Coastguard Worker 307*bd1f8aebSAndroid Build Coastguard Workersgml('<REFENTRYTITLE>', sub { 308*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->in('REFMETA')) { 309*bd1f8aebSAndroid Build Coastguard Worker save_cdata(); 310*bd1f8aebSAndroid Build Coastguard Worker } else { 311*bd1f8aebSAndroid Build Coastguard Worker # Manpage citations are in bold. 312*bd1f8aebSAndroid Build Coastguard Worker bold_on(); 313*bd1f8aebSAndroid Build Coastguard Worker } 314*bd1f8aebSAndroid Build Coastguard Worker}); 315*bd1f8aebSAndroid Build Coastguard Workersgml('</REFENTRYTITLE>', sub { 316*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->in('REFMETA')) { 317*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata--; 318*bd1f8aebSAndroid Build Coastguard Worker $manpage_title = pop_output(); 319*bd1f8aebSAndroid Build Coastguard Worker } 320*bd1f8aebSAndroid Build Coastguard Worker else { font_off(); } 321*bd1f8aebSAndroid Build Coastguard Worker}); 322*bd1f8aebSAndroid Build Coastguard Worker 323*bd1f8aebSAndroid Build Coastguard Workersgml('<MANVOLNUM>', sub { 324*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->in('REFMETA')) { 325*bd1f8aebSAndroid Build Coastguard Worker save_cdata(); 326*bd1f8aebSAndroid Build Coastguard Worker } else { 327*bd1f8aebSAndroid Build Coastguard Worker # Manpage citations use (). 328*bd1f8aebSAndroid Build Coastguard Worker output '('; 329*bd1f8aebSAndroid Build Coastguard Worker } 330*bd1f8aebSAndroid Build Coastguard Worker}); 331*bd1f8aebSAndroid Build Coastguard Workersgml('</MANVOLNUM>', sub { 332*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->in('REFMETA')) { 333*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata--; 334*bd1f8aebSAndroid Build Coastguard Worker $manpage_sect = pop_output(); 335*bd1f8aebSAndroid Build Coastguard Worker } 336*bd1f8aebSAndroid Build Coastguard Worker else { output ')' } 337*bd1f8aebSAndroid Build Coastguard Worker}); 338*bd1f8aebSAndroid Build Coastguard Worker 339*bd1f8aebSAndroid Build Coastguard Workersgml('<REFMISCINFO>', \&save_cdata); 340*bd1f8aebSAndroid Build Coastguard Workersgml('</REFMISCINFO>', sub { 341*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata--; 342*bd1f8aebSAndroid Build Coastguard Worker $manpage_misc = fold_string(pop_output()); 343*bd1f8aebSAndroid Build Coastguard Worker}); 344*bd1f8aebSAndroid Build Coastguard Worker 345*bd1f8aebSAndroid Build Coastguard Worker 346*bd1f8aebSAndroid Build Coastguard Worker# NAME section 347*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFNAMEDIV>', "\n.SH NAME\n"); 348*bd1f8aebSAndroid Build Coastguard Worker 349*bd1f8aebSAndroid Build Coastguard Workersgml('<REFNAME>', \&save_cdata); 350*bd1f8aebSAndroid Build Coastguard Workersgml('</REFNAME>', sub { 351*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata--; 352*bd1f8aebSAndroid Build Coastguard Worker push(@manpage_names, pop_output()); 353*bd1f8aebSAndroid Build Coastguard Worker}); 354*bd1f8aebSAndroid Build Coastguard Worker 355*bd1f8aebSAndroid Build Coastguard Workersgml('<REFPURPOSE>', \&save_cdata); 356*bd1f8aebSAndroid Build Coastguard Workersgml('</REFPURPOSE>', sub { 357*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata--; 358*bd1f8aebSAndroid Build Coastguard Worker my $manpage_purpose = fold_string(pop_output()); 359*bd1f8aebSAndroid Build Coastguard Worker 360*bd1f8aebSAndroid Build Coastguard Worker for(my $i = 0; $i < $#manpage_names; $i++) { 361*bd1f8aebSAndroid Build Coastguard Worker output fold_string($manpage_names[$i]), ', '; 362*bd1f8aebSAndroid Build Coastguard Worker } 363*bd1f8aebSAndroid Build Coastguard Worker 364*bd1f8aebSAndroid Build Coastguard Worker output fold_string($manpage_names[$#manpage_names]); 365*bd1f8aebSAndroid Build Coastguard Worker output " \\- $manpage_purpose\n"; 366*bd1f8aebSAndroid Build Coastguard Worker 367*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 1; 368*bd1f8aebSAndroid Build Coastguard Worker 369*bd1f8aebSAndroid Build Coastguard Worker foreach(@manpage_names) { 370*bd1f8aebSAndroid Build Coastguard Worker # Don't link to itself 371*bd1f8aebSAndroid Build Coastguard Worker if($_ ne $manpage_title) { 372*bd1f8aebSAndroid Build Coastguard Worker print LINKSFILE "$manpage_title.$manpage_sect $_.$manpage_sect\n"; 373*bd1f8aebSAndroid Build Coastguard Worker } 374*bd1f8aebSAndroid Build Coastguard Worker } 375*bd1f8aebSAndroid Build Coastguard Worker}); 376*bd1f8aebSAndroid Build Coastguard Worker 377*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFCLASS>', "\n.sp\n"); 378*bd1f8aebSAndroid Build Coastguard Worker 379*bd1f8aebSAndroid Build Coastguard Worker#RefDescriptor 380*bd1f8aebSAndroid Build Coastguard Worker 381*bd1f8aebSAndroid Build Coastguard Worker 382*bd1f8aebSAndroid Build Coastguard Worker 383*bd1f8aebSAndroid Build Coastguard Worker 384*bd1f8aebSAndroid Build Coastguard Worker 385*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 386*bd1f8aebSAndroid Build Coastguard Worker# 387*bd1f8aebSAndroid Build Coastguard Worker# SYNOPSIS section and synopses 388*bd1f8aebSAndroid Build Coastguard Worker# 389*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 390*bd1f8aebSAndroid Build Coastguard Worker 391*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFSYNOPSISDIV>', "\n.SH SYNOPSIS\n"); 392*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</REFSYNOPSISDIV>', "\n"); 393*bd1f8aebSAndroid Build Coastguard Worker 394*bd1f8aebSAndroid Build Coastguard Worker## FIXME! Must be made into block elements!! 395*bd1f8aebSAndroid Build Coastguard Worker#sgml('<FUNCSYNOPSIS>', \&bold_on); 396*bd1f8aebSAndroid Build Coastguard Worker#sgml('</FUNCSYNOPSIS>', \&font_off); 397*bd1f8aebSAndroid Build Coastguard Worker#sgml('<CMDSYNOPSIS>', \&bold_on); 398*bd1f8aebSAndroid Build Coastguard Worker#sgml('</CMDSYNOPSIS>', \&font_off); 399*bd1f8aebSAndroid Build Coastguard Worker 400*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<FUNCSYNOPSIS>', sub { 401*bd1f8aebSAndroid Build Coastguard Worker man_output("\n.sp\n"); 402*bd1f8aebSAndroid Build Coastguard Worker bold_on(); 403*bd1f8aebSAndroid Build Coastguard Worker}); 404*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</FUNCSYNOPSIS>', sub { 405*bd1f8aebSAndroid Build Coastguard Worker font_off(); 406*bd1f8aebSAndroid Build Coastguard Worker man_output("\n"); 407*bd1f8aebSAndroid Build Coastguard Worker}); 408*bd1f8aebSAndroid Build Coastguard Worker 409*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<CMDSYNOPSIS>', "\n\n"); 410*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</CMDSYNOPSIS>', "\n\n"); 411*bd1f8aebSAndroid Build Coastguard Worker 412*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<FUNCPROTOTYPE>', "\n.sp\n"); 413*bd1f8aebSAndroid Build Coastguard Worker 414*bd1f8aebSAndroid Build Coastguard Worker# Arguments to functions. This is C convention. 415*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<PARAMDEF>', '('); 416*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</PARAMDEF>', ");\n"); 417*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<VOID>', "(void);\n"); 418*bd1f8aebSAndroid Build Coastguard Worker 419*bd1f8aebSAndroid Build Coastguard Worker 420*bd1f8aebSAndroid Build Coastguard Worker 421*bd1f8aebSAndroid Build Coastguard Workersub arg_start 422*bd1f8aebSAndroid Build Coastguard Worker{ 423*bd1f8aebSAndroid Build Coastguard Worker # my $choice = $_[0]->attribute('CHOICE')->value; 424*bd1f8aebSAndroid Build Coastguard Worker 425*bd1f8aebSAndroid Build Coastguard Worker # The content model for CmdSynopsis doesn't include #PCDATA, 426*bd1f8aebSAndroid Build Coastguard Worker # so we won't see any of the whitespace in the source file, 427*bd1f8aebSAndroid Build Coastguard Worker # so we have to add it after each component. 428*bd1f8aebSAndroid Build Coastguard Worker output ' '; 429*bd1f8aebSAndroid Build Coastguard Worker 430*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->attribute('CHOICE')->value =~ /opt/i) { 431*bd1f8aebSAndroid Build Coastguard Worker output '['; 432*bd1f8aebSAndroid Build Coastguard Worker } 433*bd1f8aebSAndroid Build Coastguard Worker bold_on(); 434*bd1f8aebSAndroid Build Coastguard Worker} 435*bd1f8aebSAndroid Build Coastguard Workersub arg_end 436*bd1f8aebSAndroid Build Coastguard Worker{ 437*bd1f8aebSAndroid Build Coastguard Worker font_off(); 438*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->attribute('REP')->value =~ /^Repeat/i) { 439*bd1f8aebSAndroid Build Coastguard Worker italic_on(); 440*bd1f8aebSAndroid Build Coastguard Worker output ' ...'; 441*bd1f8aebSAndroid Build Coastguard Worker font_off(); 442*bd1f8aebSAndroid Build Coastguard Worker } 443*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->attribute('CHOICE')->value =~ /opt/i) { 444*bd1f8aebSAndroid Build Coastguard Worker output ']'; 445*bd1f8aebSAndroid Build Coastguard Worker } 446*bd1f8aebSAndroid Build Coastguard Worker} 447*bd1f8aebSAndroid Build Coastguard Worker 448*bd1f8aebSAndroid Build Coastguard Workersgml('<ARG>', \&arg_start); 449*bd1f8aebSAndroid Build Coastguard Workersgml('</ARG>', \&arg_end); 450*bd1f8aebSAndroid Build Coastguard Workersgml('<GROUP>', \&arg_start); 451*bd1f8aebSAndroid Build Coastguard Workersgml('</GROUP>', \&arg_end); 452*bd1f8aebSAndroid Build Coastguard Worker 453*bd1f8aebSAndroid Build Coastguard Workersgml('<OPTION>', \&bold_on); 454*bd1f8aebSAndroid Build Coastguard Workersgml('</OPTION>', \&font_off); 455*bd1f8aebSAndroid Build Coastguard Worker 456*bd1f8aebSAndroid Build Coastguard Worker# FIXME: This is one _blank_ line. 457*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<SBR>', "\n\n"); 458*bd1f8aebSAndroid Build Coastguard Worker 459*bd1f8aebSAndroid Build Coastguard Worker 460*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 461*bd1f8aebSAndroid Build Coastguard Worker# 462*bd1f8aebSAndroid Build Coastguard Worker# General sections 463*bd1f8aebSAndroid Build Coastguard Worker# 464*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 465*bd1f8aebSAndroid Build Coastguard Worker 466*bd1f8aebSAndroid Build Coastguard Worker# The name of the section is handled by TITLE. This just sets 467*bd1f8aebSAndroid Build Coastguard Worker# up the roff markup. 468*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFSECT1>', "\n.SH "); 469*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFSECT2>', "\n.SS "); 470*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<REFSECT3>', "\n.SS "); 471*bd1f8aebSAndroid Build Coastguard Worker 472*bd1f8aebSAndroid Build Coastguard Worker 473*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 474*bd1f8aebSAndroid Build Coastguard Worker# 475*bd1f8aebSAndroid Build Coastguard Worker# Titles, metadata. 476*bd1f8aebSAndroid Build Coastguard Worker# 477*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 478*bd1f8aebSAndroid Build Coastguard Worker 479*bd1f8aebSAndroid Build Coastguard Workersgml('<TITLE>', sub { 480*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->in('REFERENCE') or $_[0]->in('BOOK')) { 481*bd1f8aebSAndroid Build Coastguard Worker $write_manpages = 1; 482*bd1f8aebSAndroid Build Coastguard Worker } 483*bd1f8aebSAndroid Build Coastguard Worker save_cdata(); 484*bd1f8aebSAndroid Build Coastguard Worker}); 485*bd1f8aebSAndroid Build Coastguard Workersgml('</TITLE>', sub { 486*bd1f8aebSAndroid Build Coastguard Worker my $title = fold_string(pop_output()); 487*bd1f8aebSAndroid Build Coastguard Worker $raw_cdata--; 488*bd1f8aebSAndroid Build Coastguard Worker 489*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->in('REFERENCE') or $_[0]->in('BOOK')) { 490*bd1f8aebSAndroid Build Coastguard Worker # We use TITLE of enclosing Reference or Book as manual name 491*bd1f8aebSAndroid Build Coastguard Worker $manpage_manual = $title; 492*bd1f8aebSAndroid Build Coastguard Worker $write_manpages = 0; 493*bd1f8aebSAndroid Build Coastguard Worker } 494*bd1f8aebSAndroid Build Coastguard Worker elsif(exists $_[0]->parent->ext->{'title'}) { 495*bd1f8aebSAndroid Build Coastguard Worker # By far the easiest case. Just fold the string as 496*bd1f8aebSAndroid Build Coastguard Worker # above, and then set the parent element's variable. 497*bd1f8aebSAndroid Build Coastguard Worker $_[0]->parent->ext->{'title'} = $title; 498*bd1f8aebSAndroid Build Coastguard Worker } 499*bd1f8aebSAndroid Build Coastguard Worker else { 500*bd1f8aebSAndroid Build Coastguard Worker # If the parent element's handlers are lazy, 501*bd1f8aebSAndroid Build Coastguard Worker # output the folded string for them :) 502*bd1f8aebSAndroid Build Coastguard Worker # We assume they want uppercase and a newline. 503*bd1f8aebSAndroid Build Coastguard Worker output '"', uc($title), "\"\n"; 504*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 1; 505*bd1f8aebSAndroid Build Coastguard Worker } 506*bd1f8aebSAndroid Build Coastguard Worker}); 507*bd1f8aebSAndroid Build Coastguard Worker 508*bd1f8aebSAndroid Build Coastguard Workersgml('<ATTRIBUTION>', sub { push_output('string') }); 509*bd1f8aebSAndroid Build Coastguard Workersgml('</ATTRIBUTION>', sub { $_[0]->parent->ext->{'attribution'} = pop_output(); }); 510*bd1f8aebSAndroid Build Coastguard Worker 511*bd1f8aebSAndroid Build Coastguard Worker 512*bd1f8aebSAndroid Build Coastguard Worker# IGNORE. 513*bd1f8aebSAndroid Build Coastguard Workersgml('<DOCINFO>', sub { push_output('nul'); }); 514*bd1f8aebSAndroid Build Coastguard Workersgml('</DOCINFO>', sub { pop_output(); }); 515*bd1f8aebSAndroid Build Coastguard Workersgml('<REFSECT1INFO>', sub { push_output('nul'); }); 516*bd1f8aebSAndroid Build Coastguard Workersgml('</REFSECT1INFO>', sub { pop_output(); }); 517*bd1f8aebSAndroid Build Coastguard Workersgml('<REFSECT2INFO>', sub { push_output('nul'); }); 518*bd1f8aebSAndroid Build Coastguard Workersgml('</REFSECT2INFO>', sub { pop_output(); }); 519*bd1f8aebSAndroid Build Coastguard Workersgml('<REFSECT3INFO>', sub { push_output('nul'); }); 520*bd1f8aebSAndroid Build Coastguard Workersgml('</REFSECT3INFO>', sub { pop_output(); }); 521*bd1f8aebSAndroid Build Coastguard Worker 522*bd1f8aebSAndroid Build Coastguard Workersgml('<INDEXTERM>', sub { push_output('nul'); }); 523*bd1f8aebSAndroid Build Coastguard Workersgml('</INDEXTERM>', sub { pop_output(); }); 524*bd1f8aebSAndroid Build Coastguard Worker 525*bd1f8aebSAndroid Build Coastguard Worker 526*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 527*bd1f8aebSAndroid Build Coastguard Worker# 528*bd1f8aebSAndroid Build Coastguard Worker# Set bold on enclosed content 529*bd1f8aebSAndroid Build Coastguard Worker# 530*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 531*bd1f8aebSAndroid Build Coastguard Worker 532*bd1f8aebSAndroid Build Coastguard Workersgml('<APPLICATION>', \&bold_on); sgml('</APPLICATION>', \&font_off); 533*bd1f8aebSAndroid Build Coastguard Worker 534*bd1f8aebSAndroid Build Coastguard Workersgml('<CLASSNAME>', \&bold_on); sgml('</CLASSNAME>', \&font_off); 535*bd1f8aebSAndroid Build Coastguard Workersgml('<STRUCTNANE>', \&bold_on); sgml('</STRUCTNAME>', \&font_off); 536*bd1f8aebSAndroid Build Coastguard Workersgml('<STRUCTFIELD>', \&bold_on); sgml('</STRUCTFIELD>', \&font_off); 537*bd1f8aebSAndroid Build Coastguard Workersgml('<SYMBOL>', \&bold_on); sgml('</SYMBOL>', \&font_off); 538*bd1f8aebSAndroid Build Coastguard Workersgml('<TYPE>', \&bold_on); sgml('</TYPE>', \&font_off); 539*bd1f8aebSAndroid Build Coastguard Worker 540*bd1f8aebSAndroid Build Coastguard Workersgml('<ENVAR>', \&bold_on); sgml('</ENVAR>', \&font_off); 541*bd1f8aebSAndroid Build Coastguard Worker 542*bd1f8aebSAndroid Build Coastguard Workersgml('<FUNCTION>', \&bold_on); sgml('</FUNCTION>', \&font_off); 543*bd1f8aebSAndroid Build Coastguard Worker 544*bd1f8aebSAndroid Build Coastguard Workersgml('<EMPHASIS>', \&bold_on); sgml('</EMPHASIS>', \&font_off); 545*bd1f8aebSAndroid Build Coastguard Worker 546*bd1f8aebSAndroid Build Coastguard Workersgml('<ERRORNAME>', \&bold_on); sgml('</ERRORNAME>', \&font_off); 547*bd1f8aebSAndroid Build Coastguard Worker# ERRORTYPE 548*bd1f8aebSAndroid Build Coastguard Worker 549*bd1f8aebSAndroid Build Coastguard Workersgml('<COMMAND>', \&bold_on); sgml('</COMMAND>', \&font_off); 550*bd1f8aebSAndroid Build Coastguard Worker 551*bd1f8aebSAndroid Build Coastguard Workersgml('<GUIBUTTON>', \&bold_on); sgml('</GUIBUTTON>', \&font_off); 552*bd1f8aebSAndroid Build Coastguard Workersgml('<GUIICON>', \&bold_on); sgml('</GUIICON>', \&font_off); 553*bd1f8aebSAndroid Build Coastguard Worker# GUILABEL 554*bd1f8aebSAndroid Build Coastguard Worker# GUIMENU 555*bd1f8aebSAndroid Build Coastguard Worker# GUIMENUITEM 556*bd1f8aebSAndroid Build Coastguard Worker# GUISUBMENU 557*bd1f8aebSAndroid Build Coastguard Worker# MENUCHOICE 558*bd1f8aebSAndroid Build Coastguard Worker# MOUSEBUTTON 559*bd1f8aebSAndroid Build Coastguard Worker 560*bd1f8aebSAndroid Build Coastguard Workersgml('<ACCEL>', \&bold_on); sgml('</ACCEL>', \&font_off); 561*bd1f8aebSAndroid Build Coastguard Workersgml('<KEYCAP>', \&bold_on); sgml('</KEYCAP>', \&font_off); 562*bd1f8aebSAndroid Build Coastguard Workersgml('<KEYSYM>', \&bold_on); sgml('</KEYSYM>', \&font_off); 563*bd1f8aebSAndroid Build Coastguard Worker# KEYCODE 564*bd1f8aebSAndroid Build Coastguard Worker# KEYCOMBO 565*bd1f8aebSAndroid Build Coastguard Worker# SHORTCUT 566*bd1f8aebSAndroid Build Coastguard Worker 567*bd1f8aebSAndroid Build Coastguard Workersgml('<USERINPUT>', \&bold_on); sgml('</USERINPUT>', \&font_off); 568*bd1f8aebSAndroid Build Coastguard Worker 569*bd1f8aebSAndroid Build Coastguard Workersgml('<INTERFACEDEFINITION>', \&bold_on); 570*bd1f8aebSAndroid Build Coastguard Workersgml('</INTERFACEDEFINITION>', \&font_off); 571*bd1f8aebSAndroid Build Coastguard Worker 572*bd1f8aebSAndroid Build Coastguard Worker# May need to look at the CLASS 573*bd1f8aebSAndroid Build Coastguard Workersgml('<SYSTEMITEM>', \&bold_on); 574*bd1f8aebSAndroid Build Coastguard Workersgml('</SYSTEMITEM>', \&font_off); 575*bd1f8aebSAndroid Build Coastguard Worker 576*bd1f8aebSAndroid Build Coastguard Worker 577*bd1f8aebSAndroid Build Coastguard Worker 578*bd1f8aebSAndroid Build Coastguard Worker 579*bd1f8aebSAndroid Build Coastguard Worker 580*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 581*bd1f8aebSAndroid Build Coastguard Worker# 582*bd1f8aebSAndroid Build Coastguard Worker# Set italic on enclosed content 583*bd1f8aebSAndroid Build Coastguard Worker# 584*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 585*bd1f8aebSAndroid Build Coastguard Worker 586*bd1f8aebSAndroid Build Coastguard Workersgml('<FIRSTTERM>', \&italic_on); sgml('</FIRSTTERM>', \&font_off); 587*bd1f8aebSAndroid Build Coastguard Worker 588*bd1f8aebSAndroid Build Coastguard Workersgml('<FILENAME>', \&italic_on); sgml('</FILENAME>', \&font_off); 589*bd1f8aebSAndroid Build Coastguard Workersgml('<PARAMETER>', \&italic_on); sgml('</PARAMETER>', \&font_off); 590*bd1f8aebSAndroid Build Coastguard Workersgml('<PROPERTY>', \&italic_on); sgml('</PROPERTY>', \&font_off); 591*bd1f8aebSAndroid Build Coastguard Worker 592*bd1f8aebSAndroid Build Coastguard Workersgml('<REPLACEABLE>', sub { 593*bd1f8aebSAndroid Build Coastguard Worker italic_on(); 594*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->in('TOKEN')) { 595*bd1f8aebSAndroid Build Coastguard Worker # When tokenizing, follow more 'intuitive' convention 596*bd1f8aebSAndroid Build Coastguard Worker output "<"; 597*bd1f8aebSAndroid Build Coastguard Worker } 598*bd1f8aebSAndroid Build Coastguard Worker}); 599*bd1f8aebSAndroid Build Coastguard Workersgml('</REPLACEABLE>', sub { 600*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->in('TOKEN')) { 601*bd1f8aebSAndroid Build Coastguard Worker output ">"; 602*bd1f8aebSAndroid Build Coastguard Worker } 603*bd1f8aebSAndroid Build Coastguard Worker font_off(); 604*bd1f8aebSAndroid Build Coastguard Worker}); 605*bd1f8aebSAndroid Build Coastguard Worker 606*bd1f8aebSAndroid Build Coastguard Workersgml('<CITETITLE>', \&italic_on); sgml('</CITETITLE>', \&font_off); 607*bd1f8aebSAndroid Build Coastguard Workersgml('<FOREIGNPHRASE>', \&italic_on); sgml('</FOREIGNPHRASE>', \&font_off); 608*bd1f8aebSAndroid Build Coastguard Worker 609*bd1f8aebSAndroid Build Coastguard Workersgml('<LINEANNOTATION>', \&italic_on); sgml('</LINEANNOTATION>', \&font_off); 610*bd1f8aebSAndroid Build Coastguard Worker 611*bd1f8aebSAndroid Build Coastguard Worker 612*bd1f8aebSAndroid Build Coastguard Worker 613*bd1f8aebSAndroid Build Coastguard Worker 614*bd1f8aebSAndroid Build Coastguard Worker 615*bd1f8aebSAndroid Build Coastguard Worker 616*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 617*bd1f8aebSAndroid Build Coastguard Worker# 618*bd1f8aebSAndroid Build Coastguard Worker# Other 'inline' elements 619*bd1f8aebSAndroid Build Coastguard Worker# 620*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 621*bd1f8aebSAndroid Build Coastguard Worker 622*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<EMAIL>', '<'); 623*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</EMAIL>', '>'); 624*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<OPTIONAL>', '['); 625*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</OPTIONAL>', ']'); 626*bd1f8aebSAndroid Build Coastguard Worker 627*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</TRADEMARK>', "\\u\\s-2TM\\s+2\\d"); 628*bd1f8aebSAndroid Build Coastguard Worker 629*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<COMMENT>', "[Comment: "); 630*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</COMMENT>', "]"); 631*bd1f8aebSAndroid Build Coastguard Worker 632*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<QUOTE>', "``"); 633*bd1f8aebSAndroid Build Coastguard Workerman_sgml('</QUOTE>', "''"); 634*bd1f8aebSAndroid Build Coastguard Worker 635*bd1f8aebSAndroid Build Coastguard Worker#man_sgml('<LITERAL>', '"'); 636*bd1f8aebSAndroid Build Coastguard Worker#man_sgml('</LITERAL>', '"'); 637*bd1f8aebSAndroid Build Coastguard Worker 638*bd1f8aebSAndroid Build Coastguard Worker# No special presentation: 639*bd1f8aebSAndroid Build Coastguard Worker 640*bd1f8aebSAndroid Build Coastguard Worker# AUTHOR 641*bd1f8aebSAndroid Build Coastguard Worker# AUTHORINITIALS 642*bd1f8aebSAndroid Build Coastguard Worker 643*bd1f8aebSAndroid Build Coastguard Worker# ABBREV 644*bd1f8aebSAndroid Build Coastguard Worker# ACTION 645*bd1f8aebSAndroid Build Coastguard Worker# ACRONYM 646*bd1f8aebSAndroid Build Coastguard Worker# ALT 647*bd1f8aebSAndroid Build Coastguard Worker# CITATION 648*bd1f8aebSAndroid Build Coastguard Worker# PHRASE 649*bd1f8aebSAndroid Build Coastguard Worker# QUOTE 650*bd1f8aebSAndroid Build Coastguard Worker# WORDASWORD 651*bd1f8aebSAndroid Build Coastguard Worker 652*bd1f8aebSAndroid Build Coastguard Worker# COMPUTEROUTPUT 653*bd1f8aebSAndroid Build Coastguard Worker# MARKUP 654*bd1f8aebSAndroid Build Coastguard Worker# PROMPT 655*bd1f8aebSAndroid Build Coastguard Worker# RETURNVALUE 656*bd1f8aebSAndroid Build Coastguard Worker# SGMLTAG 657*bd1f8aebSAndroid Build Coastguard Worker# TOKEN 658*bd1f8aebSAndroid Build Coastguard Worker 659*bd1f8aebSAndroid Build Coastguard Worker# DATABASE 660*bd1f8aebSAndroid Build Coastguard Worker# HARDWARE 661*bd1f8aebSAndroid Build Coastguard Worker# INTERFACE 662*bd1f8aebSAndroid Build Coastguard Worker# MEDIALABEL 663*bd1f8aebSAndroid Build Coastguard Worker 664*bd1f8aebSAndroid Build Coastguard Worker# There doesn't seem to be a good way to represent LITERAL in -man 665*bd1f8aebSAndroid Build Coastguard Worker 666*bd1f8aebSAndroid Build Coastguard Worker 667*bd1f8aebSAndroid Build Coastguard Worker 668*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 669*bd1f8aebSAndroid Build Coastguard Worker# 670*bd1f8aebSAndroid Build Coastguard Worker# Paragraph and paragraph-like elements 671*bd1f8aebSAndroid Build Coastguard Worker# 672*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 673*bd1f8aebSAndroid Build Coastguard Worker 674*bd1f8aebSAndroid Build Coastguard Workersub para_start { 675*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 676*bd1f8aebSAndroid Build Coastguard Worker 677*bd1f8aebSAndroid Build Coastguard Worker # In lists, etc., don't start paragraph with .PP since 678*bd1f8aebSAndroid Build Coastguard Worker # the indentation will be gone. 679*bd1f8aebSAndroid Build Coastguard Worker 680*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->parent->ext->{'nobreak'}==1) { 681*bd1f8aebSAndroid Build Coastguard Worker # Usually this is the FIRST element of 682*bd1f8aebSAndroid Build Coastguard Worker # a hanging tag, so we MUST not do a full 683*bd1f8aebSAndroid Build Coastguard Worker # paragraph break. 684*bd1f8aebSAndroid Build Coastguard Worker $_[0]->parent->ext->{'nobreak'} = 2; 685*bd1f8aebSAndroid Build Coastguard Worker } elsif($_[0]->parent->ext->{'nobreak'}==2) { 686*bd1f8aebSAndroid Build Coastguard Worker # Usually these are the NEXT elements of 687*bd1f8aebSAndroid Build Coastguard Worker # a hanging tag. If we break using a blank 688*bd1f8aebSAndroid Build Coastguard Worker # line, we're okay. 689*bd1f8aebSAndroid Build Coastguard Worker output "\n"; 690*bd1f8aebSAndroid Build Coastguard Worker } else { 691*bd1f8aebSAndroid Build Coastguard Worker # Normal case. (For indented blocks too, at least 692*bd1f8aebSAndroid Build Coastguard Worker # -man isn't so braindead in this area.) 693*bd1f8aebSAndroid Build Coastguard Worker output ".PP\n"; 694*bd1f8aebSAndroid Build Coastguard Worker } 695*bd1f8aebSAndroid Build Coastguard Worker} 696*bd1f8aebSAndroid Build Coastguard Worker# Actually applies to a few other block elements as well 697*bd1f8aebSAndroid Build Coastguard Workersub para_end { 698*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 699*bd1f8aebSAndroid Build Coastguard Worker} 700*bd1f8aebSAndroid Build Coastguard Worker 701*bd1f8aebSAndroid Build Coastguard Workersgml('<PARA>', \¶_start); 702*bd1f8aebSAndroid Build Coastguard Workersgml('</PARA>', \¶_end); 703*bd1f8aebSAndroid Build Coastguard Workersgml('<SIMPARA>', \¶_start); 704*bd1f8aebSAndroid Build Coastguard Workersgml('</SIMPARA>', \¶_end); 705*bd1f8aebSAndroid Build Coastguard Worker 706*bd1f8aebSAndroid Build Coastguard Worker# Nothing special, except maybe FIXME set nobreak. 707*bd1f8aebSAndroid Build Coastguard Workersgml('<INFORMALEXAMPLE>', \¶_start); 708*bd1f8aebSAndroid Build Coastguard Workersgml('</INFORMALEXAMPLE>', \¶_end); 709*bd1f8aebSAndroid Build Coastguard Worker 710*bd1f8aebSAndroid Build Coastguard Worker 711*bd1f8aebSAndroid Build Coastguard Worker 712*bd1f8aebSAndroid Build Coastguard Worker 713*bd1f8aebSAndroid Build Coastguard Worker 714*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 715*bd1f8aebSAndroid Build Coastguard Worker# 716*bd1f8aebSAndroid Build Coastguard Worker# Blocks using SS sections 717*bd1f8aebSAndroid Build Coastguard Worker# 718*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 719*bd1f8aebSAndroid Build Coastguard Worker 720*bd1f8aebSAndroid Build Coastguard Worker# FIXME: We need to consider the effects of SS 721*bd1f8aebSAndroid Build Coastguard Worker# in a hanging tag :( 722*bd1f8aebSAndroid Build Coastguard Worker 723*bd1f8aebSAndroid Build Coastguard Worker# Complete with the optional-title dilemma (again). 724*bd1f8aebSAndroid Build Coastguard Workersgml('<ABSTRACT>', sub { 725*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'title'} = 'ABSTRACT'; 726*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 727*bd1f8aebSAndroid Build Coastguard Worker push_output('string'); 728*bd1f8aebSAndroid Build Coastguard Worker}); 729*bd1f8aebSAndroid Build Coastguard Workersgml('</ABSTRACT>', sub { 730*bd1f8aebSAndroid Build Coastguard Worker my $content = pop_output(); 731*bd1f8aebSAndroid Build Coastguard Worker 732*bd1f8aebSAndroid Build Coastguard Worker # As ABSTRACT is never on the same level as RefSect1, 733*bd1f8aebSAndroid Build Coastguard Worker # this leaves us with only .SS in terms of -man macros. 734*bd1f8aebSAndroid Build Coastguard Worker output ".SS \"", uc($_[0]->ext->{'title'}), "\"\n"; 735*bd1f8aebSAndroid Build Coastguard Worker 736*bd1f8aebSAndroid Build Coastguard Worker output $content; 737*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 738*bd1f8aebSAndroid Build Coastguard Worker}); 739*bd1f8aebSAndroid Build Coastguard Worker 740*bd1f8aebSAndroid Build Coastguard Worker# Ah, I needed a break. Example always has a title. 741*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<EXAMPLE>', "\n.SS "); 742*bd1f8aebSAndroid Build Coastguard Workersgml('</EXAMPLE>', \¶_end); 743*bd1f8aebSAndroid Build Coastguard Worker 744*bd1f8aebSAndroid Build Coastguard Worker# Same with sidebar. 745*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<SIDEBAR>', "\n.SS "); 746*bd1f8aebSAndroid Build Coastguard Workersgml('</SIDEBAR>', \¶_end); 747*bd1f8aebSAndroid Build Coastguard Worker 748*bd1f8aebSAndroid Build Coastguard Worker# NO title. 749*bd1f8aebSAndroid Build Coastguard Workerman_sgml('<HIGHLIGHTS>', "\n.SS HIGHLIGHTS\n"); 750*bd1f8aebSAndroid Build Coastguard Workersgml('</HIGHLIGHTS>', \¶_end); 751*bd1f8aebSAndroid Build Coastguard Worker 752*bd1f8aebSAndroid Build Coastguard Worker 753*bd1f8aebSAndroid Build Coastguard Worker 754*bd1f8aebSAndroid Build Coastguard Worker 755*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 756*bd1f8aebSAndroid Build Coastguard Worker# 757*bd1f8aebSAndroid Build Coastguard Worker# Indented 'Block' elements 758*bd1f8aebSAndroid Build Coastguard Worker# 759*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 760*bd1f8aebSAndroid Build Coastguard Worker 761*bd1f8aebSAndroid Build Coastguard Workersub indent_block_start 762*bd1f8aebSAndroid Build Coastguard Worker{ 763*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 764*bd1f8aebSAndroid Build Coastguard Worker output ".sp\n.RS\n"; 765*bd1f8aebSAndroid Build Coastguard Worker} 766*bd1f8aebSAndroid Build Coastguard Workersub indent_block_end 767*bd1f8aebSAndroid Build Coastguard Worker{ 768*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 769*bd1f8aebSAndroid Build Coastguard Worker output ".RE\n"; 770*bd1f8aebSAndroid Build Coastguard Worker} 771*bd1f8aebSAndroid Build Coastguard Worker 772*bd1f8aebSAndroid Build Coastguard Worker# This element is almost like an admonition (below), 773*bd1f8aebSAndroid Build Coastguard Worker# only the default title is blank :) 774*bd1f8aebSAndroid Build Coastguard Worker 775*bd1f8aebSAndroid Build Coastguard Workersgml('<BLOCKQUOTE>', sub { 776*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'title'} = ''; 777*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 778*bd1f8aebSAndroid Build Coastguard Worker push_output('string'); 779*bd1f8aebSAndroid Build Coastguard Worker}); 780*bd1f8aebSAndroid Build Coastguard Workersgml('</BLOCKQUOTE>', sub { 781*bd1f8aebSAndroid Build Coastguard Worker my $content = pop_output(); 782*bd1f8aebSAndroid Build Coastguard Worker 783*bd1f8aebSAndroid Build Coastguard Worker indent_block_start(); 784*bd1f8aebSAndroid Build Coastguard Worker 785*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->ext->{'title'}) { 786*bd1f8aebSAndroid Build Coastguard Worker output ".B \"", $_[0]->ext->{'title'}, ":\"\n"; 787*bd1f8aebSAndroid Build Coastguard Worker } 788*bd1f8aebSAndroid Build Coastguard Worker 789*bd1f8aebSAndroid Build Coastguard Worker output $content; 790*bd1f8aebSAndroid Build Coastguard Worker 791*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->ext->{'attribution'}) { 792*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 793*bd1f8aebSAndroid Build Coastguard Worker # One place where roff's space-sensitivity makes sense :) 794*bd1f8aebSAndroid Build Coastguard Worker output "\n -- "; 795*bd1f8aebSAndroid Build Coastguard Worker output $_[0]->ext->{'attribution'} . "\n"; 796*bd1f8aebSAndroid Build Coastguard Worker } 797*bd1f8aebSAndroid Build Coastguard Worker 798*bd1f8aebSAndroid Build Coastguard Worker indent_block_end(); 799*bd1f8aebSAndroid Build Coastguard Worker}); 800*bd1f8aebSAndroid Build Coastguard Worker 801*bd1f8aebSAndroid Build Coastguard Worker# Set off admonitions from the rest of the text by indenting. 802*bd1f8aebSAndroid Build Coastguard Worker# FIXME: Need to check if this works inside paragraphs, not enclosing them. 803*bd1f8aebSAndroid Build Coastguard Workersub admonition_end { 804*bd1f8aebSAndroid Build Coastguard Worker my $content = pop_output(); 805*bd1f8aebSAndroid Build Coastguard Worker 806*bd1f8aebSAndroid Build Coastguard Worker indent_block_start(); 807*bd1f8aebSAndroid Build Coastguard Worker 808*bd1f8aebSAndroid Build Coastguard Worker # When the admonition is only one paragraph, 809*bd1f8aebSAndroid Build Coastguard Worker # it looks nicer if the title was inline. 810*bd1f8aebSAndroid Build Coastguard Worker my $num_para; 811*bd1f8aebSAndroid Build Coastguard Worker while ($content =~ /^\.PP/gm) { $num_para++ } 812*bd1f8aebSAndroid Build Coastguard Worker if($num_para==1) { 813*bd1f8aebSAndroid Build Coastguard Worker $content =~ s/^\.PP\n//; 814*bd1f8aebSAndroid Build Coastguard Worker } 815*bd1f8aebSAndroid Build Coastguard Worker 816*bd1f8aebSAndroid Build Coastguard Worker output ".B \"" . $_[0]->ext->{'title'} . ":\"\n"; 817*bd1f8aebSAndroid Build Coastguard Worker output $content; 818*bd1f8aebSAndroid Build Coastguard Worker 819*bd1f8aebSAndroid Build Coastguard Worker indent_block_end(); 820*bd1f8aebSAndroid Build Coastguard Worker} 821*bd1f8aebSAndroid Build Coastguard Worker 822*bd1f8aebSAndroid Build Coastguard Workersgml('<NOTE>', sub { 823*bd1f8aebSAndroid Build Coastguard Worker # We can't see right now whether or not there is a TITLE 824*bd1f8aebSAndroid Build Coastguard Worker # element, so we have to save the output now and add it back 825*bd1f8aebSAndroid Build Coastguard Worker # at the end of this admonition. 826*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'title'} = 'Note'; 827*bd1f8aebSAndroid Build Coastguard Worker 828*bd1f8aebSAndroid Build Coastguard Worker # Although admonition_end's indent_block_start will do this, 829*bd1f8aebSAndroid Build Coastguard Worker # we need to synchronize the output _now_ 830*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 831*bd1f8aebSAndroid Build Coastguard Worker 832*bd1f8aebSAndroid Build Coastguard Worker push_output('string'); 833*bd1f8aebSAndroid Build Coastguard Worker}); 834*bd1f8aebSAndroid Build Coastguard Workersgml('</NOTE>', \&admonition_end); 835*bd1f8aebSAndroid Build Coastguard Worker 836*bd1f8aebSAndroid Build Coastguard Worker# Same as above. 837*bd1f8aebSAndroid Build Coastguard Workersgml('<WARNING>', sub { 838*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'title'} = 'Warning'; 839*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 840*bd1f8aebSAndroid Build Coastguard Worker push_output('string'); 841*bd1f8aebSAndroid Build Coastguard Worker}); 842*bd1f8aebSAndroid Build Coastguard Workersgml('</WARNING>', \&admonition_end); 843*bd1f8aebSAndroid Build Coastguard Worker 844*bd1f8aebSAndroid Build Coastguard Workersgml('<TIP>', sub { 845*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'title'} = 'Tip'; 846*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 847*bd1f8aebSAndroid Build Coastguard Worker push_output('string'); 848*bd1f8aebSAndroid Build Coastguard Worker}); 849*bd1f8aebSAndroid Build Coastguard Workersgml('</TIP>', \&admonition_end); 850*bd1f8aebSAndroid Build Coastguard Workersgml('<CAUTION>', sub { 851*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'title'} = 'Caution'; 852*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 853*bd1f8aebSAndroid Build Coastguard Worker push_output('string'); 854*bd1f8aebSAndroid Build Coastguard Worker}); 855*bd1f8aebSAndroid Build Coastguard Workersgml('</CAUTION>', \&admonition_end); 856*bd1f8aebSAndroid Build Coastguard Worker 857*bd1f8aebSAndroid Build Coastguard Workersgml('<IMPORTANT>', sub { 858*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'title'} = 'Important'; 859*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 860*bd1f8aebSAndroid Build Coastguard Worker push_output('string'); 861*bd1f8aebSAndroid Build Coastguard Worker}); 862*bd1f8aebSAndroid Build Coastguard Workersgml('</IMPORTANT>', \&admonition_end); 863*bd1f8aebSAndroid Build Coastguard Worker 864*bd1f8aebSAndroid Build Coastguard Worker 865*bd1f8aebSAndroid Build Coastguard Worker 866*bd1f8aebSAndroid Build Coastguard Worker 867*bd1f8aebSAndroid Build Coastguard Worker 868*bd1f8aebSAndroid Build Coastguard Worker 869*bd1f8aebSAndroid Build Coastguard Worker 870*bd1f8aebSAndroid Build Coastguard Worker 871*bd1f8aebSAndroid Build Coastguard Worker 872*bd1f8aebSAndroid Build Coastguard Worker 873*bd1f8aebSAndroid Build Coastguard Worker 874*bd1f8aebSAndroid Build Coastguard Worker 875*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 876*bd1f8aebSAndroid Build Coastguard Worker# 877*bd1f8aebSAndroid Build Coastguard Worker# Verbatim displays. 878*bd1f8aebSAndroid Build Coastguard Worker# 879*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 880*bd1f8aebSAndroid Build Coastguard Worker 881*bd1f8aebSAndroid Build Coastguard Workersub verbatim_start { 882*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 883*bd1f8aebSAndroid Build Coastguard Worker 884*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->parent->ext->{'nobreak'}==1) { 885*bd1f8aebSAndroid Build Coastguard Worker # Usually this is the FIRST element of 886*bd1f8aebSAndroid Build Coastguard Worker # a hanging tag, so we MUST not do a full 887*bd1f8aebSAndroid Build Coastguard Worker # paragraph break. 888*bd1f8aebSAndroid Build Coastguard Worker $_[0]->parent->ext->{'nobreak'} = 2; 889*bd1f8aebSAndroid Build Coastguard Worker } else { 890*bd1f8aebSAndroid Build Coastguard Worker output "\n"; 891*bd1f8aebSAndroid Build Coastguard Worker } 892*bd1f8aebSAndroid Build Coastguard Worker 893*bd1f8aebSAndroid Build Coastguard Worker output(".nf\n") unless $nocollapse_whitespace++; 894*bd1f8aebSAndroid Build Coastguard Worker} 895*bd1f8aebSAndroid Build Coastguard Worker 896*bd1f8aebSAndroid Build Coastguard Workersub verbatim_end { 897*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 898*bd1f8aebSAndroid Build Coastguard Worker output(".fi\n") unless --$nocollapse_whitespace; 899*bd1f8aebSAndroid Build Coastguard Worker} 900*bd1f8aebSAndroid Build Coastguard Worker 901*bd1f8aebSAndroid Build Coastguard Workersgml('<PROGRAMLISTING>', \&verbatim_start); 902*bd1f8aebSAndroid Build Coastguard Workersgml('</PROGRAMLISTING>', \&verbatim_end); 903*bd1f8aebSAndroid Build Coastguard Worker 904*bd1f8aebSAndroid Build Coastguard Workersgml('<SCREEN>', \&verbatim_start); 905*bd1f8aebSAndroid Build Coastguard Workersgml('</SCREEN>', \&verbatim_end); 906*bd1f8aebSAndroid Build Coastguard Worker 907*bd1f8aebSAndroid Build Coastguard Workersgml('<LITERALLAYOUT>', \&verbatim_start); 908*bd1f8aebSAndroid Build Coastguard Workersgml('</LITERALLAYOUT>', \&verbatim_end); 909*bd1f8aebSAndroid Build Coastguard Worker 910*bd1f8aebSAndroid Build Coastguard Worker#sgml('<SYNOPSIS>', sub { 911*bd1f8aebSAndroid Build Coastguard Worker# if($_[0]->attribute('FORMAT')->value =~ /linespecific/i) { 912*bd1f8aebSAndroid Build Coastguard Worker# &verbatim_start; 913*bd1f8aebSAndroid Build Coastguard Worker# } else { 914*bd1f8aebSAndroid Build Coastguard Worker# roffcmd(""); 915*bd1f8aebSAndroid Build Coastguard Worker# } 916*bd1f8aebSAndroid Build Coastguard Worker#}); 917*bd1f8aebSAndroid Build Coastguard Worker# 918*bd1f8aebSAndroid Build Coastguard Worker#sgml('</SYNOPSIS>', sub { 919*bd1f8aebSAndroid Build Coastguard Worker# if($_[0]->attribute('FORMAT')->value =~ /linespecific/i) { 920*bd1f8aebSAndroid Build Coastguard Worker# &verbatim_end; 921*bd1f8aebSAndroid Build Coastguard Worker# } 922*bd1f8aebSAndroid Build Coastguard Worker# else { 923*bd1f8aebSAndroid Build Coastguard Worker# roffcmd("");# not sure about this. 924*bd1f8aebSAndroid Build Coastguard Worker# } 925*bd1f8aebSAndroid Build Coastguard Worker#}); 926*bd1f8aebSAndroid Build Coastguard Workersgml('<SYNOPSIS>', \&verbatim_start); 927*bd1f8aebSAndroid Build Coastguard Workersgml('</SYNOPSIS>', \&verbatim_end); 928*bd1f8aebSAndroid Build Coastguard Worker 929*bd1f8aebSAndroid Build Coastguard Worker 930*bd1f8aebSAndroid Build Coastguard Worker 931*bd1f8aebSAndroid Build Coastguard Worker 932*bd1f8aebSAndroid Build Coastguard Worker 933*bd1f8aebSAndroid Build Coastguard Worker 934*bd1f8aebSAndroid Build Coastguard Worker 935*bd1f8aebSAndroid Build Coastguard Worker 936*bd1f8aebSAndroid Build Coastguard Worker 937*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 938*bd1f8aebSAndroid Build Coastguard Worker# 939*bd1f8aebSAndroid Build Coastguard Worker# Lists 940*bd1f8aebSAndroid Build Coastguard Worker# 941*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 942*bd1f8aebSAndroid Build Coastguard Worker 943*bd1f8aebSAndroid Build Coastguard Worker# Indent nested lists. 944*bd1f8aebSAndroid Build Coastguard Workersub indent_list_start { 945*bd1f8aebSAndroid Build Coastguard Worker if($list_nestlevel++) { 946*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 947*bd1f8aebSAndroid Build Coastguard Worker output ".RS\n"; 948*bd1f8aebSAndroid Build Coastguard Worker } 949*bd1f8aebSAndroid Build Coastguard Worker} 950*bd1f8aebSAndroid Build Coastguard Workersub indent_list_end { 951*bd1f8aebSAndroid Build Coastguard Worker if(--$list_nestlevel) { 952*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 953*bd1f8aebSAndroid Build Coastguard Worker output ".RE\n"; 954*bd1f8aebSAndroid Build Coastguard Worker } 955*bd1f8aebSAndroid Build Coastguard Worker} 956*bd1f8aebSAndroid Build Coastguard Worker 957*bd1f8aebSAndroid Build Coastguard Workersgml('<VARIABLELIST>', \&indent_list_start); 958*bd1f8aebSAndroid Build Coastguard Workersgml('</VARIABLELIST>', \&indent_list_end); 959*bd1f8aebSAndroid Build Coastguard Workersgml('<ITEMIZEDLIST>', \&indent_list_start); 960*bd1f8aebSAndroid Build Coastguard Workersgml('</ITEMIZEDLIST>', \&indent_list_end); 961*bd1f8aebSAndroid Build Coastguard Workersgml('<ORDEREDLIST>', sub { 962*bd1f8aebSAndroid Build Coastguard Worker indent_list_start(); 963*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'count'} = 1; 964*bd1f8aebSAndroid Build Coastguard Worker}); 965*bd1f8aebSAndroid Build Coastguard Workersgml('</ORDEREDLIST>', \&indent_list_end); 966*bd1f8aebSAndroid Build Coastguard Worker 967*bd1f8aebSAndroid Build Coastguard Worker# Output content on one line, bolded. 968*bd1f8aebSAndroid Build Coastguard Workersgml('<TERM>', sub { 969*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 970*bd1f8aebSAndroid Build Coastguard Worker output ".TP\n"; 971*bd1f8aebSAndroid Build Coastguard Worker bold_on(); 972*bd1f8aebSAndroid Build Coastguard Worker push_output('string'); 973*bd1f8aebSAndroid Build Coastguard Worker}); 974*bd1f8aebSAndroid Build Coastguard Workersgml('</TERM>', sub { 975*bd1f8aebSAndroid Build Coastguard Worker my $term = pop_output(); 976*bd1f8aebSAndroid Build Coastguard Worker $term =~ tr/\n/ /; 977*bd1f8aebSAndroid Build Coastguard Worker output $term; 978*bd1f8aebSAndroid Build Coastguard Worker font_off(); 979*bd1f8aebSAndroid Build Coastguard Worker output "\n"; 980*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 1; 981*bd1f8aebSAndroid Build Coastguard Worker}); 982*bd1f8aebSAndroid Build Coastguard Worker 983*bd1f8aebSAndroid Build Coastguard Workersgml('<LISTITEM>', sub { 984*bd1f8aebSAndroid Build Coastguard Worker # A bulleted list. 985*bd1f8aebSAndroid Build Coastguard Worker if($_[0]->in('ITEMIZEDLIST')) { 986*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 987*bd1f8aebSAndroid Build Coastguard Worker output ".TP 0.2i\n\\(bu\n"; 988*bd1f8aebSAndroid Build Coastguard Worker } 989*bd1f8aebSAndroid Build Coastguard Worker 990*bd1f8aebSAndroid Build Coastguard Worker # Need numbers. 991*bd1f8aebSAndroid Build Coastguard Worker # Assume Arabic numeration for now. 992*bd1f8aebSAndroid Build Coastguard Worker elsif($_[0]->in('ORDEREDLIST')) { 993*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 994*bd1f8aebSAndroid Build Coastguard Worker output ".TP ", $_[0]->parent->ext->{'count'}++, ". \n"; 995*bd1f8aebSAndroid Build Coastguard Worker } 996*bd1f8aebSAndroid Build Coastguard Worker 997*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'nobreak'} = 1; 998*bd1f8aebSAndroid Build Coastguard Worker}); 999*bd1f8aebSAndroid Build Coastguard Worker 1000*bd1f8aebSAndroid Build Coastguard Workersgml('<SIMPLELIST>', sub { 1001*bd1f8aebSAndroid Build Coastguard Worker $_[0]->ext->{'first_member'} = 1; 1002*bd1f8aebSAndroid Build Coastguard Worker}); 1003*bd1f8aebSAndroid Build Coastguard Worker 1004*bd1f8aebSAndroid Build Coastguard Workersgml('<MEMBER>', sub { 1005*bd1f8aebSAndroid Build Coastguard Worker my $parent = $_[0]->parent; 1006*bd1f8aebSAndroid Build Coastguard Worker 1007*bd1f8aebSAndroid Build Coastguard Worker if($parent->attribute('TYPE')->value =~ /Inline/i) { 1008*bd1f8aebSAndroid Build Coastguard Worker if($parent->ext->{'first_member'}) { 1009*bd1f8aebSAndroid Build Coastguard Worker # If this is the first member don't put any commas 1010*bd1f8aebSAndroid Build Coastguard Worker $parent->ext->{'first_member'} = 0; 1011*bd1f8aebSAndroid Build Coastguard Worker } else { 1012*bd1f8aebSAndroid Build Coastguard Worker output ", "; 1013*bd1f8aebSAndroid Build Coastguard Worker } 1014*bd1f8aebSAndroid Build Coastguard Worker } elsif($parent->attribute('TYPE')->value =~ /Vert/i) { 1015*bd1f8aebSAndroid Build Coastguard Worker output "\n" unless $newline_last++; 1016*bd1f8aebSAndroid Build Coastguard Worker output "\n"; 1017*bd1f8aebSAndroid Build Coastguard Worker } 1018*bd1f8aebSAndroid Build Coastguard Worker}); 1019*bd1f8aebSAndroid Build Coastguard Worker 1020*bd1f8aebSAndroid Build Coastguard Worker 1021*bd1f8aebSAndroid Build Coastguard Worker 1022*bd1f8aebSAndroid Build Coastguard Worker 1023*bd1f8aebSAndroid Build Coastguard Worker 1024*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 1025*bd1f8aebSAndroid Build Coastguard Worker# 1026*bd1f8aebSAndroid Build Coastguard Worker# Stuff we don't know how to handle (yet) 1027*bd1f8aebSAndroid Build Coastguard Worker# 1028*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 1029*bd1f8aebSAndroid Build Coastguard Worker 1030*bd1f8aebSAndroid Build Coastguard Worker# Address blocks: 1031*bd1f8aebSAndroid Build Coastguard Worker 1032*bd1f8aebSAndroid Build Coastguard Worker# Credit stuff: 1033*bd1f8aebSAndroid Build Coastguard Worker# ACKNO 1034*bd1f8aebSAndroid Build Coastguard Worker# ADDRESS 1035*bd1f8aebSAndroid Build Coastguard Worker# AFFILIATION 1036*bd1f8aebSAndroid Build Coastguard Worker# ARTPAGENUMS 1037*bd1f8aebSAndroid Build Coastguard Worker# ATTRIBUTION 1038*bd1f8aebSAndroid Build Coastguard Worker# AUTHORBLURB 1039*bd1f8aebSAndroid Build Coastguard Worker# AUTHORGROUP 1040*bd1f8aebSAndroid Build Coastguard Worker# OTHERCREDIT 1041*bd1f8aebSAndroid Build Coastguard Worker# HONORIFIC 1042*bd1f8aebSAndroid Build Coastguard Worker 1043*bd1f8aebSAndroid Build Coastguard Worker# Areas: 1044*bd1f8aebSAndroid Build Coastguard Worker# AREA 1045*bd1f8aebSAndroid Build Coastguard Worker# AREASET 1046*bd1f8aebSAndroid Build Coastguard Worker# AREASPEC 1047*bd1f8aebSAndroid Build Coastguard Worker 1048*bd1f8aebSAndroid Build Coastguard Worker 1049*bd1f8aebSAndroid Build Coastguard Worker 1050*bd1f8aebSAndroid Build Coastguard Worker 1051*bd1f8aebSAndroid Build Coastguard Worker 1052*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 1053*bd1f8aebSAndroid Build Coastguard Worker# 1054*bd1f8aebSAndroid Build Coastguard Worker# Linkage, cross references 1055*bd1f8aebSAndroid Build Coastguard Worker# 1056*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 1057*bd1f8aebSAndroid Build Coastguard Worker 1058*bd1f8aebSAndroid Build Coastguard Worker# Print the URL 1059*bd1f8aebSAndroid Build Coastguard Workersgml('</ULINK>', sub { 1060*bd1f8aebSAndroid Build Coastguard Worker# output ' <URL:', $_[0]->attribute('URL')->value, '>'; 1061*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 0; 1062*bd1f8aebSAndroid Build Coastguard Worker}); 1063*bd1f8aebSAndroid Build Coastguard Worker 1064*bd1f8aebSAndroid Build Coastguard Worker# If cross reference target is a RefEntry, 1065*bd1f8aebSAndroid Build Coastguard Worker# output CiteRefEntry-style references. 1066*bd1f8aebSAndroid Build Coastguard Workersgml('<XREF>', sub { 1067*bd1f8aebSAndroid Build Coastguard Worker my $id = $_[0]->attribute('LINKEND')->value; 1068*bd1f8aebSAndroid Build Coastguard Worker my $manref = $Refs->get("refentry:$id"); 1069*bd1f8aebSAndroid Build Coastguard Worker 1070*bd1f8aebSAndroid Build Coastguard Worker if($manref) { 1071*bd1f8aebSAndroid Build Coastguard Worker my ($title, $sect) = ($manref =~ /(.*)(\(.*\))/); 1072*bd1f8aebSAndroid Build Coastguard Worker bold_on(); 1073*bd1f8aebSAndroid Build Coastguard Worker output $title; 1074*bd1f8aebSAndroid Build Coastguard Worker font_off(); 1075*bd1f8aebSAndroid Build Coastguard Worker output $sect; 1076*bd1f8aebSAndroid Build Coastguard Worker } else { 1077*bd1f8aebSAndroid Build Coastguard Worker $blank_xrefs++ if $write_manpages; 1078*bd1f8aebSAndroid Build Coastguard Worker output "[XRef to $id]"; 1079*bd1f8aebSAndroid Build Coastguard Worker } 1080*bd1f8aebSAndroid Build Coastguard Worker 1081*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 0; 1082*bd1f8aebSAndroid Build Coastguard Worker}); 1083*bd1f8aebSAndroid Build Coastguard Worker 1084*bd1f8aebSAndroid Build Coastguard Worker# Anchor 1085*bd1f8aebSAndroid Build Coastguard Worker 1086*bd1f8aebSAndroid Build Coastguard Worker 1087*bd1f8aebSAndroid Build Coastguard Worker 1088*bd1f8aebSAndroid Build Coastguard Worker 1089*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 1090*bd1f8aebSAndroid Build Coastguard Worker# 1091*bd1f8aebSAndroid Build Coastguard Worker# Other handlers 1092*bd1f8aebSAndroid Build Coastguard Worker# 1093*bd1f8aebSAndroid Build Coastguard Worker######################################################################## 1094*bd1f8aebSAndroid Build Coastguard Worker 1095*bd1f8aebSAndroid Build Coastguard Workerman_sgml('|[lt ]|', '<'); 1096*bd1f8aebSAndroid Build Coastguard Workerman_sgml('|[gt ]|', '>'); 1097*bd1f8aebSAndroid Build Coastguard Workerman_sgml('|[amp ]|', '&'); 1098*bd1f8aebSAndroid Build Coastguard Worker 1099*bd1f8aebSAndroid Build Coastguard Worker# 1100*bd1f8aebSAndroid Build Coastguard Worker# Default handlers (uncomment these if needed). Right now, these are set 1101*bd1f8aebSAndroid Build Coastguard Worker# up to gag on any unrecognised elements, sdata, processing-instructions, 1102*bd1f8aebSAndroid Build Coastguard Worker# or entities. 1103*bd1f8aebSAndroid Build Coastguard Worker# 1104*bd1f8aebSAndroid Build Coastguard Worker# sgml('start_element',sub { die "Unknown element: " . $_[0]->name; }); 1105*bd1f8aebSAndroid Build Coastguard Worker# sgml('end_element',''); 1106*bd1f8aebSAndroid Build Coastguard Worker 1107*bd1f8aebSAndroid Build Coastguard Worker# This is for weeding out and escaping certain characters. 1108*bd1f8aebSAndroid Build Coastguard Worker# This looks like it's inefficient since it's done on every line, but 1109*bd1f8aebSAndroid Build Coastguard Worker# in reality, SGMLSpm and sgmlspl parsing ESIS takes _much_ longer. 1110*bd1f8aebSAndroid Build Coastguard Worker 1111*bd1f8aebSAndroid Build Coastguard Workersgml('cdata', sub 1112*bd1f8aebSAndroid Build Coastguard Worker{ 1113*bd1f8aebSAndroid Build Coastguard Worker if(!$write_manpages) { return; } 1114*bd1f8aebSAndroid Build Coastguard Worker elsif($raw_cdata) { output $_[0]; return; } 1115*bd1f8aebSAndroid Build Coastguard Worker 1116*bd1f8aebSAndroid Build Coastguard Worker # Escape backslashes 1117*bd1f8aebSAndroid Build Coastguard Worker $_[0] =~ s/\\/\\\\/g; 1118*bd1f8aebSAndroid Build Coastguard Worker 1119*bd1f8aebSAndroid Build Coastguard Worker # In non-'pre'-type elements: 1120*bd1f8aebSAndroid Build Coastguard Worker if(!$nocollapse_whitespace) { 1121*bd1f8aebSAndroid Build Coastguard Worker # Change tabs to spaces 1122*bd1f8aebSAndroid Build Coastguard Worker $_[0] =~ tr/\t/ /; 1123*bd1f8aebSAndroid Build Coastguard Worker 1124*bd1f8aebSAndroid Build Coastguard Worker # Do not allow indents at beginning of line 1125*bd1f8aebSAndroid Build Coastguard Worker # groff chokes on that. 1126*bd1f8aebSAndroid Build Coastguard Worker if($newline_last) { 1127*bd1f8aebSAndroid Build Coastguard Worker $_[0] =~ s/^ +//; 1128*bd1f8aebSAndroid Build Coastguard Worker 1129*bd1f8aebSAndroid Build Coastguard Worker # If the line is all blank, don't do anything. 1130*bd1f8aebSAndroid Build Coastguard Worker if($_[0] eq '') { return; } 1131*bd1f8aebSAndroid Build Coastguard Worker 1132*bd1f8aebSAndroid Build Coastguard Worker $_[0] =~ s/^\./\\\&\./; 1133*bd1f8aebSAndroid Build Coastguard Worker 1134*bd1f8aebSAndroid Build Coastguard Worker # Argh... roff doesn't like ' either... 1135*bd1f8aebSAndroid Build Coastguard Worker $_[0] =~ s/^\'/\\\&\'/; 1136*bd1f8aebSAndroid Build Coastguard Worker } 1137*bd1f8aebSAndroid Build Coastguard Worker } 1138*bd1f8aebSAndroid Build Coastguard Worker 1139*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 0; 1140*bd1f8aebSAndroid Build Coastguard Worker 1141*bd1f8aebSAndroid Build Coastguard Worker output $_[0]; 1142*bd1f8aebSAndroid Build Coastguard Worker}); 1143*bd1f8aebSAndroid Build Coastguard Worker 1144*bd1f8aebSAndroid Build Coastguard Worker 1145*bd1f8aebSAndroid Build Coastguard Worker# When in whitespace-collapsing mode, we disallow consecutive newlines. 1146*bd1f8aebSAndroid Build Coastguard Worker 1147*bd1f8aebSAndroid Build Coastguard Workersgml('re', sub 1148*bd1f8aebSAndroid Build Coastguard Worker{ 1149*bd1f8aebSAndroid Build Coastguard Worker if($nocollapse_whitespace || !$newline_last) { 1150*bd1f8aebSAndroid Build Coastguard Worker output "\n"; 1151*bd1f8aebSAndroid Build Coastguard Worker } 1152*bd1f8aebSAndroid Build Coastguard Worker 1153*bd1f8aebSAndroid Build Coastguard Worker $newline_last = 1; 1154*bd1f8aebSAndroid Build Coastguard Worker}); 1155*bd1f8aebSAndroid Build Coastguard Worker 1156*bd1f8aebSAndroid Build Coastguard Workersgml('sdata',sub { die "Unknown SDATA: " . $_[0]; }); 1157*bd1f8aebSAndroid Build Coastguard Workersgml('pi',sub { die "Unknown processing instruction: " . $_[0]; }); 1158*bd1f8aebSAndroid Build Coastguard Workersgml('entity',sub { die "Unknown external entity: " . $_[0]->name; }); 1159*bd1f8aebSAndroid Build Coastguard Workersgml('start_subdoc',sub { die "Unknown subdoc entity: " . $_[0]->name; }); 1160*bd1f8aebSAndroid Build Coastguard Workersgml('end_subdoc',''); 1161*bd1f8aebSAndroid Build Coastguard Workersgml('conforming',''); 1162*bd1f8aebSAndroid Build Coastguard Worker 1163*bd1f8aebSAndroid Build Coastguard Worker1; 1164*bd1f8aebSAndroid Build Coastguard Worker 1165