goba            Fri Jan  4 11:06:07 2002 EDT

  Added files:                 
    /phpdoc/scripts     checkdoc.php 
  Log:
  Ported the chechdoc script from Perl to PHP, the most common language
  known by any person here in the doc group :)
  
  

Index: phpdoc/scripts/checkdoc.php
+++ phpdoc/scripts/checkdoc.php
#!/usr/bin/php -q
<?php

if ($argc > 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>

Check documented functions in phpdoc

  Usage:
  <?=$argv[0]?> [missing]

  By providing the optional "missing" parameter,
  only a list of undocumented functions is listed,
  otherwise a full status report is printed.
  
  This program depends on ../funclist.txt as the
  list of functions compiled from the PHP source.
  
  Original Perl script written by Stig Bakken <[EMAIL PROTECTED]>,
  ported to PHP by Gabor Hojtsy <[EMAIL PROTECTED]>, 2002-01-04

<?php
  exit;
}

// CONFIG SECTION
$docdir  = "../en/functions";
$funclist = "../funclist.txt";

/*********************************************************************/
/* Nothing to modify below this line                                 */
/*********************************************************************/

// Documented functions list
$func_documented = array();

// Functions in PHP (from funclist.txt)
$func_in_php = array();

// Longest function name for display
$longest = 0;

/*********************************************************************/
/* Here starts the functions part                                    */
/*********************************************************************/

// Checks a diretory of phpdoc XML files
function check_dir($dir, &$functions)
{
    // Collect files and diretcories in these arrays
    $directories = array();
    $files = array();

    // Open and traverse the directory
    $handle = @opendir($dir);
    while ($file = @readdir($handle)) {

      // Collect XML files
      if (strstr($file, ".xml")) {
        $files[] = $file;
      }

    }
    @closedir($handle);

    // Sort and check files
    sort($files);
    foreach ($files as $file) {
      check_file($dir, $file, $functions);
    }

} // check_dir() function end

function check_file ($dirname, $filename, &$functions)
{
    // Read in file contents
    $contents = preg_replace("/[\r\n]/", "", join("", file($dirname.$filename)));
    
    // Find all functions defined in this file
    preg_match_all("!id\s*=\s*([\"'])(function|class)\.([^\\1]+)\\1!U", $contents, 
$ids_found);

    // No ids found in file
    if (count($ids_found[3]) == 0) { return; }
    
    // Put functions into function list
    foreach ($ids_found[3] as $id) {
        $functions[str_replace("-", "_", $id)] = $filename;
    }
    ksort($functions);

} // check_file() function end
  
// Parse funclist.txt file for function names
function parse_funclist($funclist, &$longest, &$functions)
{
    // Read in file, initialize longest
    $file_lines = file($funclist);
    
    // Go through all lines, and find function names
    foreach ($file_lines as $line) {
        $line = trim($line);
        $length = strlen($line);
        // Not a comment, and contains a function name
        if ($line[0] != "#" && $length > 0) {
            $functions[] = $line;
            if ($length > $longest) { $longest = $length; }
        }
    }
    sort($functions);
    $functions = array_unique($functions);

} // parse_funclist() function end

/*********************************************************************/
/* Here starts the program                                           */
/*********************************************************************/

// Start with searching header
echo "Searching in $docdir for XML files...\n";
    
// Check the requested directory
check_dir("$docdir/", $func_documented);

// Process $funclist for PHP functions
parse_funclist($funclist, $longest, $func_in_php);
   
if ($argv[1] == "missing") {
    $undocumented = array_diff($func_in_php, array_keys($func_documented));
    echo "Functions in PHP source but not in documentation:\n\n";
    foreach ($undocumented as $func) {
      echo $func . "\n";
    }
} else {
    printf("%-{$longest}s    %s\n", "FUNCTION NAME", "DOCUMENTED IN");
    printf("%'-70s\n", '');
    foreach ($func_in_php as $function) {
        printf("%-{$longest}s    %s\n", $function, $func_documented[$function]);
    }
    $n_functions = count($func_in_php);
    $n_documented = count($func_documented);
    $percent_done = intval(($n_documented * 100) / $n_functions);

    printf("\n%d of %d functions documented (%d%% done, %d%% remaining).\n",
       $n_documented, $n_functions, $percent_done, 100-$percent_done);
}

echo "Possible documentation errors coming:\n\n";
$is_error = FALSE;
foreach ($func_documented as $func => $file) {
    if (!in_array($func, $func_in_php)) {
        echo "  $func in $file but not in $funclist\n";
        $is_error = TRUE;
    }
}
if (!$is_error) { echo "No documented but not implemented functions found.\n"; }

echo "Done!";

?>


Reply via email to