Hi, Here's a patch to make_man.php that will - handle example indentation better (doesn't use 'indent' any more) - will write man pages gzipped if php is compiled with zlib support (using gzwrite) cheers, roel
Index: make_man.php =================================================================== RCS file: /repository/phpdoc/make_man.php,v retrieving revision 1.1 diff -u -r1.1 make_man.php --- make_man.php 2001/04/13 23:41:10 1.1 +++ make_man.php 2001/05/07 17:04:24 @@ -1,4 +1,4 @@ -#!/usr/local/bin/php -q +#!/usr/bin/php -q <?php /* @@ -9,58 +9,86 @@ /* * Problems: - * - examples are not showed correctly - */ + * - examples are not shown correctly + */ $lang = 'en'; + -$file = `cat \`find phpdoc/$lang | grep .xml\``; -$file = str_replace("\n", '', $file); +$file = `cat \`find $lang | grep .xml\``; +#$file = str_replace("\n", '', $file); // First get everything in <refentry></refentry> tags -preg_match_all('/<refentry.*?<\/refentry>/', $file, $refentries); +preg_match_all('/<refentry.*?<\/refentry>/s', $file, $refentries); $functions = array(); $i = 0; foreach($refentries[0] as $refentry) { - preg_match('/<refname>(.*)<\/refname>/', $refentry, $matches); - $functions[$i]['name'] = $matches[1]; - - preg_match('/<refpurpose>(.*)<\/refpurpose>/', $refentry, $matches); - $functions[$i]['shortdesc'] = $matches[1]; - - preg_match('/<funcprototype>(.*)<\/funcprototype>/', $refentry, $matches); - $funcprototype = $matches[1]; - - preg_match('/<funcdef>(.*)<\/funcdef>/', $funcprototype, $matches); - $functions[$i]['prototype'] = $matches[1]; - $functions[$i]['prototype'] = preg_replace('/<.*?>/', '', $functions[$i]['prototype']); - $functions[$i]['prototype'] .= '('; + preg_match('/<refname>(.*)<\/refname>/s', $refentry, $matches); + if(!empty($matches[1])) { + $functions[$i]['name'] = $matches[1]; + } else { + $functions[$i]['name'] = ''; + } - preg_match_all('/<paramdef>.*?<\/paramdef>/', $funcprototype, $matches); + preg_match('/<refpurpose>(.*)<\/refpurpose>/s', $refentry, $matches); + if(!empty($matches[1])) { + $functions[$i]['shortdesc'] = $matches[1]; + } else { + $functions[$i]['shortdesc'] = ''; + } + + preg_match('/<funcprototype>(.*)<\/funcprototype>/s', $refentry, $matches); + if(!empty($matches[1])) { + $funcprototype = $matches[1]; + } else { + $funcprototype = ''; + } + + preg_match('/<funcdef>(.*)<\/funcdef>/s', $funcprototype, $matches); + if(!empty($matches[1])) { + $functions[$i]['prototype'] = $matches[1]; + $functions[$i]['prototype'] = preg_replace('/<.*?>/s', '', +$functions[$i]['prototype']); + $functions[$i]['prototype'] .= '('; + } else { + $functions[$i]['prototype'] = ''; + } + + preg_match_all('/<paramdef>.*?<\/paramdef>/s', $funcprototype, $matches); + $first = 1; foreach($matches[0] as $param) { - $param = preg_replace('/\s{2,}/', ' ', $param); - $functions[$i]['prototype'] .= preg_replace('/<.*?>/', '', $param); - $functions[$i]['prototype'] .= ', '; + if(preg_match('/<optional>.*<\/optional>/s', $param)) { + if($first != 1 ) { + $functions[$i]['prototype'] .= ' [, ' . trim(preg_replace('/<.*?>/s', +'', $param)) . ']'; + } else { + $functions[$i]['prototype'] .= ' [' . trim(preg_replace('/<.*?>/s', +'', $param)) . ']'; + $first = 0; + } + } else { + if($first != 1 ) { + $functions[$i]['prototype'] .= ', '; + } else { + $first = 0; + } + $functions[$i]['prototype'] .= trim(preg_replace('/<.*?>/s', '', $param)); + } } - $functions[$i]['prototype'] = substr($functions[$i]['prototype'], 0, strrpos($functions[$i]['prototype'], ',')); + $functions[$i]['prototype'] = preg_replace('/\n/', '', +$functions[$i]['prototype']); + $functions[$i]['prototype'] = preg_replace('/\s{2,}/s', ' ', +$functions[$i]['prototype']); $functions[$i]['prototype'] .= ')'; - + $y = 0; - preg_match_all('/<para>.*?<\/para>/', $refentry, $matches); + preg_match_all('/<para>.*?<\/para>/s', $refentry, $matches); foreach($matches[0] as $paragraph) { - /* Put every paragraph literally in the man page. Whoever has - an idea to do this better, feel free to do so :-) */ - - if(preg_match('/<example>/', $paragraph)) { + if(preg_match('/<example>/s', $paragraph)) { // If this paragraph has an example, do some special formatting. - preg_match('/<title>(.*)<\/title>/', $paragraph, $tmp); + preg_match('/<title>(.*)<\/title>/s', $paragraph, $tmp); $functions[$i]['example'] = $tmp[1]; $functions[$i]['example'] = preg_replace('/\s{2,}/', ' ', $functions[$i]['example']); $functions[$i]['example'] = preg_replace('/<.*?>/', '', $functions[$i]['example']); $functions[$i]['example'] .= "\n\n"; - preg_match('/<programlisting.*?>(.*)<\/programlisting>/', $paragraph, $tmp); + preg_match('/<programlisting.*?>(.*)<\/programlisting>/s', $paragraph, +$tmp); $programlisting = $tmp[1]; // Hmm, no function for this? $programlisting = str_replace('<', '<', $programlisting); @@ -69,8 +97,10 @@ $programlisting = str_replace('&', '&', $programlisting); $programlisting = str_replace(' ', ' ', $programlisting); $programlisting = str_replace('&sp;', ' ', $programlisting); - $functions[$i]['example'] .= `echo '$programlisting' | indent -kr` . "\n\n"; - } elseif(preg_match('/See also/', $paragraph)) { + $programlisting = str_replace('&', '&', $programlisting); + #$functions[$i]['example'] .= `echo '$programlisting' | indent -kr` . +"\n\n"; + $functions[$i]['example'] .= $programlisting; + } elseif(preg_match('/See also/s', $paragraph)) { $functions[$i]['seealso'] = preg_replace('/<.*?>/', '', $paragraph); $functions[$i]['seealso'] = preg_replace('/See also:/', '', $functions[$i]['seealso']); $functions[$i]['seealso'] = preg_replace('/\s{2,}/', ' ', $functions[$i]['seealso']); @@ -81,7 +111,7 @@ } $y++; } - + $i++; } @@ -95,7 +125,11 @@ } foreach($functions as $function) { - $fp = fopen("man7/php_" . $function['name'] . ".man", 'w'); + if(function_exists('gzwrite')) { + $fp = fopen('man7/php_' . $function['name'] . '.man.gz', 'w'); + } else { + $fp = fopen('man7/php_' . $function['name'] . '.man', 'w'); + } /* $function['name'] $function['shortdesc'] @@ -105,7 +139,7 @@ $function['example'] */ - $page = ".TH " . $function['name'] . " 7 \"" . date("j F, Y") . "\" \"PHPDOC MANPAGE\" \"PHP Programmer's Manual\"\n.SH NAME\n" . + $page = '.TH ' . $function['name'] . " 7 \"" . date("j F, Y") . "\" \"PHPDOC +MANPAGE\" \"PHP Programmer's Manual\"\n.SH NAME\n" . $function['name'] . "\n.SH SYNOPSIS\n.B " . $function['prototype'] . "\n.SH DESCRIPTION\n" . $function['shortdesc'] . ".\n"; if(!empty($function['paragraph']) && count($function['paragraph']) > 0) { foreach($function['paragraph'] as $para) { @@ -123,237 +157,13 @@ $page .= ".SH \"SEE ALSO\"\n"; $page .= $function['seealso'] . "\n"; } - fwrite($fp, $page); -} -/* - -source of fopen() manpage as reference: - -.\" Copyright (c) 1990, 1991 The Regents of the University of California. -.\" All rights reserved. -.\" -.\" This code is derived from software contributed to Berkeley by -.\" Chris Torek and the American National Standards Committee X3, -.\" on Information Processing Systems. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)fopen.3 6.8 (Berkeley) 6/29/91 -.\" -.\" Converted for Linux, Mon Nov 29 15:22:01 1993, [EMAIL PROTECTED] -.\" Modified, aeb, 960421, 970806 -.\" -.TH FOPEN 3 "13 December 1995" "BSD MANPAGE" "Linux Programmer's Manual" -.SH NAME -fopen, fdopen, freopen \- stream open functions -.SH SYNOPSIS -.B #include <stdio.h> -.sp -.BI "FILE *fopen (const char *" path ", const char *" mode ); -.br -.BI "FILE *fdopen (int " fildes ", const char *" mode ); -.br -.BI "FILE *freopen (const char *" path ", const char *" mode ", FILE *" stream ); -.SH DESCRIPTION -The -.B fopen -function opens the file whose name is the string pointed to by -.I path -and associates a stream with it. -.PP -The argument -.I mode -points to a string beginning with one of the following sequences -(Additional characters may follow these sequences.): -.TP -.B r -Open text file for reading. The stream is positioned at the beginning of -the file. -.TP -.B r+ -Open for reading and writing. The stream is positioned at the beginning of -the file. -.TP -.B w -Truncate file to zero length or create text file for writing. The stream -is positioned at the beginning of the file. -.TP -.B w+ -Open for reading and writing. The file is created if it does not exist, -otherwise it is truncated. The stream is positioned at the beginning of -the file. -.TP -.B a -Open for writing. The file is created if it does not exist. The stream is -positioned at the end of the file. -.TP -.B a+ -Open for reading and writing. The file is created if it does not exist. -The stream is positioned at the end of the file. -.PP -The -.I mode -string can also include the letter ``b'' either as a last character or as -a character between the characters in any of the two-character strings -described above. This is strictly for compatibility with ANSI X3.159-1989 -(``ANSI C'') and has no effect; the ``b'' is ignored on all POSIX -conforming systems, including Linux. -(Other systems may treat text files and binary files differently, -and adding the ``b'' may be a good idea if you do I/O to a binary -file and expect that your program may be ported to non-Unix -environments.) -.PP -Any created files will have mode -.BR S_IRUSR \&| S_IWUSR \&| S_IRGRP \&| S_IWGRP \&| S_IROTH \&| S_IWOTH -(0666), as modified by the process' umask value (see -.BR umask (2). -.PP -Reads and writes may be intermixed on read/write streams in any order. -Note that ANSI C requires that a file positioning function intervene -between output and input, unless an input operation encounters end-of-file. -(If this condition is not met, then a read is allowed to return the -result of writes other than the most recent.) -Therefore it is good practice (and indeed sometimes necessary -under Linux) to put an -.B fseek -or -.B fgetpos -operation between write and read operations on such a stream. This -operation may be an apparent no-op (as in \fIfseek(..., 0L, -SEEK_CUR)\fR called for its synchronizing side effect. -.PP -The -.B fdopen -function associates a stream with the existing file descriptor, -.IR fildes . -The -.I mode -of the stream (one of the values "r", "r+", "w", "w+", "a", "a+") -must be compatible with the mode of the file descriptor. -The file position indicator of the new stream is set to that -belonging to -.IR fildes , -and the error and end-of-file indicators are cleared. -Modes "w" or "w+" do not cause truncation of the file. -The file descriptor is not dup'ed, and will be closed when -the stream created by -.B fdopen -is closed. -The result of applying -.B fdopen -to a shared memory object is undefined. -.PP -The -.B freopen -function opens the file whose name is the string pointed to by -.I path -and associates the stream pointed to by -.I stream -with it. The original stream (if it exists) is closed. The -.I mode -argument is used just as in the -.B fopen -function. The primary use of the -.B freopen -function is to change the file associated with a standard text stream -.IR "" ( stderr ", " stdin ", or " stdout ). -.SH "RETURN VALUES" -Upon successful completion -.BR fopen , -.B fdopen -and -.B freopen -return a -.B FILE -pointer. Otherwise, -.B NULL -is returned and the global variable -.I errno -is set to indicate the error. -.SH ERRORS -.TP -.B EINVAL -The -.I mode -provided to -.BR fopen , -.BR fdopen , -or -.B freopen -was invalid. -.PP -The -.BR fopen , -.B fdopen -and -.B freopen -functions may also fail and set -.I errno -for any of the errors specified for the routine -.BR malloc (3). -.PP -The -.B fopen -function may also fail and set -.I errno -for any of the errors specified for the routine -.BR open (2). -.PP -The -.B fdopen -function may also fail and set -.I errno -for any of the errors specified for the routine -.BR fcntl (2). -.PP -The -.B freopen -function may also fail and set -.I errno -for any of the errors specified for the routines -.BR open (2), -.BR fclose (3) -and -.BR fflush (3). -.SH "SEE ALSO" -.BR open "(2), " fclose (3) -.SH STANDARDS -The -.B fopen -and -.B freopen -functions conform to ANSI X3.159-1989 (``ANSI C''). The -.B fdopen -function conforms to IEEE Std1003.1-1988 (``POSIX.1''). - -*/ + if(function_exists('gzwrite')) { + gzwrite($fp, $page); + } else { + fwrite($fp, $page); + } +} ?>