<?php

/**
*
* Parses for image placement.
*
* @category Text
*
* @package Text_Wiki
*
* @author Paul M. Jones <pmjones@php.net>
*
* @license LGPL
*
* @version $Id$
*
*/

/**
*
* Parses for image placement.
*
* @category Text
*
* @package Text_Wiki
*
* @author Paul M. Jones <pmjones@php.net>
*
*/

class Text_Wiki_Parse_Default_Image extends Text_Wiki_Parse {

    /**
     * URL schemes recognized by this rule.
     *
     * @access public
     * @var array
    */
    var $conf = array(
        "schemes" => "http|https|ftp|gopher|news",
        "host_regexp" => '(?:[^.\s/"\'<\\\#delim#\ca-\cz]+\.)*[a-z](?:[-a-z0-9]*[a-z0-9])?\.?',
        "path_regexp" => '(?:/[^\s"<\\\#delim#\ca-\cz]*)?'
    );

    /**
    *
    * The regular expression used to find source text matching this
    * rule.
    *
    * @access public
    *
    * @var string
    *
    */

    var $regex = '/(\[\[image\s+)(.+?)(\]\])/i';


    /**
     * The regular expressions used to check ecternal urls
     *
     * @access public
     * @var string
     * @see parse()
     */
    var $url = "";

     /**
     * Constructor.
     * We override the constructor to build up the url regex from config
     *
     * @param object &$obj the base conversion handler
     * @return The parser object
     * @access public
     */
    function __construct(&$obj)
    {
        $default = $this->conf;
        parent::__construct($obj);

        // convert the list of recognized schemes to a regex OR,
        $schemes = $this->getConf("schemes", $default["schemes"]);
        $this->url = str_replace( "#delim#", $this->wiki->delim,
           "#(?:" . (is_array($schemes) ? implode("|", $schemes) : $schemes) . ")://"
           . $this->getConf("host_regexp", $default["host_regexp"])
           . $this->getConf("path_regexp", $default["path_regexp"]) ."#");
    }

    /**
     * Constructor.
     * We override the constructor to build up the url regex from config
     *
     * @param object &$obj the base conversion handler
     * @return The parser object
     * @access public
     */
    function Text_Wiki_Parse_Default_Image(&$obj)
    {
        self::__construct($obj);
    }

    /**
    *
    * Generates a token entry for the matched text.  Token options are:
    *
    * 'src' => The image source, typically a relative path name.
    *
    * 'opts' => Any macro options following the source.
    *
    * @access public
    *
    * @param array &$matches The array of matches from parse().
    *
    * @return A delimited token number to be used as a placeholder in
    * the source text.
    *
    */

    function process(&$matches)
    {
        $pos = strpos($matches[2], " ");

        if ($pos === false) {
            $options = array(
                "src" => $matches[2],
                "attr" => array());
        } else {
            // everything after the space is attribute arguments
            $options = array(
                "src" => substr($matches[2], 0, $pos),
                "attr" => $this->getAttrs(substr($matches[2], $pos+1))
            );
            // check the scheme case of external link
            if (array_key_exists("link", $options["attr"])) {
                // external url ?
                if (($pos = strpos($options["attr"]["link"], "://")) !== false) {
                    if (!preg_match($this->url, $options["attr"]["link"])) {
                        return $matches[0];
                    }
                } elseif (in_array("Wikilink", $this->wiki->disable)) {
                        return $matches[0]; // Wikilink disabled
                }
            }
        }

        return $this->wiki->addToken($this->rule, $options);
    }
}
