Magical Logic Laboratory

プログラムを生成します。

<?
/**
 * phpのマニュアルの cvs から、関数の使い方を抜き出す
 * まず cvs で phpdoc をとりだしてください。
 *  cvs -d :pserver:cvsread@cvs.php.net:/repository login
 *  cvs -q checkout -P phpdoc-ja/reference
 * てなかんじで( cvs のインストールは自分で..)
 * で、そのディレクトリで
 *  php xyzzy_php_infotip.php
 * とかすると、phpfunc.txt が生まれます。
 */
set_time_limit(0);

$funcout = fopen( "phpfunc.txt","w" ) or die("phpfunc.txt に書き込めない");
$refdir = dir( "./phpdoc-ja/reference" );
if( !
is_object($refdir)){
  print( 
"phpdoc-ja というディレクトリがありません\n");
  print( 
" cvs -d :pserver:cvsread@cvs.php.net:/repository login\n");
  print( 
" cvs -q checkout -P phpdoc-ja/reference\n");
}

while (
false !== ($category = $refdir->read())) {
  
$catdir = @dir( $refdir->path ."/". $category."/functions" );
  if( !
is_object( $catdir) )continue;
  while (
false !== ($func = $catdir->read())) {
    
$filename = $catdir->path ."/". $func;
    if( 
is_readable($filename) && ! is_dir($filename) ){
      
$info = kansuuyomi( $filename );
      if( 
$info ){
        
fwrite( $funcout, $info."\n" );
      }
    }
  }
}
fclose($funcout);

function 
kansuuyomi( $filename ){
  
$info=null;
  
$fp = @fopen( $filename,"r" );
  if( 
$fp ){
    
$text = fread( $fp, filesize( $filename ) );
    
fclose( $fp );
    
// せっかく xml なのに正規表現で抜き出し(;´Д`)
    
if( preg_match('{\<methodsynopsis\>(.*?)</methodsynopsis\>}s',$text, $reg) ){
      
$info = $reg[1];
      
$info = str_replace( '\n',' ',$info );
      
$info = str_replace( '<optional>','[',$info );
      
$info = str_replace( '</optional>',']',$info );
      
$info = str_replace( '<void/>','()',$info );
      
$info = preg_replace( '{\<\/?(type|methodname|parameter|replaceable)\/?\>}',' ',$info);
      
$info = preg_replace( '{\<methodparam(.*)\<\/methodparam\>}s','($0)',$info);
      
$info = preg_replace( '{(\<methodparam choice\=(?:\"|\')opt(?:\"|\')\>)(.*?)(\<\/methodparam\>)}s','<methodparam>[$2]$3',$info);
      
$info = preg_replace( '{(\<methodparam rep\=\"repeat\"\>)(.*?)(\<\/methodparam\>)}s','<methodparam>$2$3',$info);
      
$info = preg_replace( '{(\<\/methodparam\>)(\s|\n)*(\<\methodparam)}s','$1,$3',$info);
      
$info = preg_replace( '{\<\/?methodparam\>}',' ',$info);
      
$info = preg_replace( '{\&amp\;}','&',$info);
      
$info = preg_replace( '{\s+}s',' ',$info);
      
$info = trim($info);
      if( 
preg_match('{\<refpurpose\>(.*?)</refpurpose\>}s',$text, $reg) ){
        
$tip = trim(mb_convert_encoding($reg[1],"sjis","utf-8"));
        
$tip = strip_tags($tip);
//        $tip = preg_replace( '{\<\/?(function|acronym)\/?\>}',' ',$tip);
        
$tip = preg_replace( '{\&false\;}','FALSE',$tip);
        
$tip = preg_replace( '{\&true\;}','TRUE',$tip);
        
$tip = preg_replace( '{\&null\;}','NULL',$tip);
        
$tip = preg_replace( '{\&url\.iptc\;}','http://www.IPTC.org/',$tip);
        
$tip = preg_replace( '{\s*\n\s*}','',$tip);
        
$info .= ";$tip";
      }
      if( 
strpos( $info, "<")!==false )  die($info);
    }
  }
  return 
$info;
}
?>