<?php

/**
* 
* Parses for an API function documentation block.
* 
* @category Text
* 
* @package Text_Wiki
* 
* @author Paul M. Jones <pmjones@php.net>
* 
* @license LGPL
* 
* @version $Id$
* 
*/

/**
* 
* Parses for an API function documentation block.
*
* @category Text
* 
* @package Text_Wiki
* 
* @author Paul M. Jones <pmjones@php.net>
* 
*/

class Text_Wiki_Parse_Default_Function extends Text_Wiki_Parse {

    var $regex = '/^(\<function\>)\n(.+)\n(\<\/function\>)(\s|$)/Umsi';
    
    function process(&$matches)
    {
        // default options
        $opts = array(
            "name" => null,
            "access" => null,
            "return" => null,
            "params" => array(),
            "throws" => array()
        );
        
        // split apart the markup lines and loop through them
        $lines = explode("\n", $matches[2]);
        foreach ($lines as $line) {
            
            // skip blank lines
            if (trim($line) == "") {
                continue;
            }
            
            // find the first ':' on the line; the left part is the 
            // type, the right part is the value. skip lines without
            // a ':' on them.
            $pos = strpos($line, ":");
            if ($pos === false) {
                continue;
            }
            
            // $type is the line type: name, access, return, param, throws
            // 012345678901234
            // name: something
            $type = trim(substr($line, 0, $pos));
            $val = trim(substr($line, $pos+1));
            
            switch($type) {
            
            case "a":
            case "access":
                $opts["access"] = $val;
                break;
                
            case "n":
            case "name":
                $opts["name"] = $val;
                break;
                
            case "p":
            case "param":
                $tmp = explode(",", $val);
                $k = count($tmp);
                if ($k == 1) {
                    $opts["params"][] = array(
                        "type" => $tmp[0],
                        "descr" => null,
                        "default" => null
                    );
                } elseif ($k == 2) {
                    $opts["params"][] = array(
                        "type" => $tmp[0],
                        "descr" => $tmp[1],
                        "default" => null
                    );
                } else {
                    $opts["params"][] = array(
                        "type" => $tmp[0],
                        "descr" => $tmp[1],
                        "default" => $tmp[2]
                    );
                }
                break;
            
            case "r":
            case "return":
            case "returns":
                $opts["return"] = $val;
                break;
            
            case "t":
            case "throws":
                $tmp = explode(",", $val);
                $k = count($tmp);
                if ($k == 1) {
                    $opts["throws"][] = array(
                        "type" => $tmp[0],
                        "descr" => null
                    );
                } else {
                    $opts["throws"][] = array(
                        "type" => $tmp[0],
                        "descr" => $tmp[1]
                    );
                }
                break;
        
            default:
                $opts[$type] = $val;
                break;
            
            }
        }
        
        // add the token back in place
        return $this->wiki->addToken($this->rule, $opts) . $matches[4];
    }
}

?>
