HTML_BBCodeParser2
[ class tree: HTML_BBCodeParser2 ] [ index: HTML_BBCodeParser2 ] [ all elements ]

Source for file Links.php

Documentation is available at Links.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 5                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2003 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Author: Stijn de Reede <sjr@gmx.co.uk>                               |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id$
  20. //
  21.  
  22. /**
  23. @package  HTML_BBCodeParser2
  24. @author   Stijn de Reede  <sjr@gmx.co.uk>
  25. */
  26. require_once 'HTML/BBCodeParser2/Filter.php';
  27.  
  28. /**
  29.  *
  30.  */
  31. {
  32.     /**
  33.      * List of allowed schemes
  34.      *
  35.      * @access  private
  36.      * @var     array 
  37.      */
  38.     var $_allowedSchemes = array('http''https''ftp''irc');
  39.  
  40.     /**
  41.      * Default scheme
  42.      *
  43.      * @access  private
  44.      * @var     string 
  45.      */
  46.     var $_defaultScheme 'http';
  47.  
  48.     /**
  49.      * An array of tags parsed by the engine
  50.      *
  51.      * @access   private
  52.      * @var      array 
  53.      */
  54.     var $_definedTags = array(
  55.         'url' => array(
  56.             'htmlopen'  => 'a',
  57.             'htmlclose' => 'a',
  58.             'allowed'   => 'none^img',
  59.             'attributes'=> array('url' => 'href=%2$s%1$s%2$s',
  60.                                  't'   => 'target=%2$s%1$s%2$s')
  61.         )
  62.     );
  63.  
  64.  
  65.     /**
  66.      * Executes statements before the actual array building starts
  67.      *
  68.      * This method should be overwritten in a filter if you want to do
  69.      * something before the parsing process starts. This can be useful to
  70.      * allow certain short alternative tags which then can be converted into
  71.      * proper tags with preg_replace() calls.
  72.      * The main class walks through all the filters and and calls this
  73.      * method if it exists. The filters should modify their private $_text
  74.      * variable.
  75.      *
  76.      * @return   none 
  77.      * @access   private
  78.      * @see      $_text
  79.      * @author   Stijn de Reede <sjr@gmx.co.uk>
  80.      * @author   Seth Price <seth@pricepages.org>
  81.      */
  82.     function _preparse()
  83.     {
  84.         $options $this->_options;
  85.         $o $options['open'];
  86.         $c $options['close'];
  87.         $oe $options['open_esc'];
  88.         $ce $options['close_esc'];
  89.  
  90.         $schemes implode('|'$this->_allowedSchemes);
  91.  
  92.         $pattern = array(   "/(?<![\"'=".$ce."\/])(".$oe."[^".$ce."]*".$ce.")?(((".$schemes."):\/\/|www)[@-a-z0-9.]+\.[a-z]{2,4}[^\s()\[\]]*)/i",
  93.                             "!".$oe."url(".$ce."|\s.*".$ce.")(.*)".$oe."/url".$ce."!iU",
  94.                             "!".$oe."url=((([a-z]*:(//)?)|www)[@-a-z0-9.]+)([^\s\[\]]*)".$ce."(.*)".$oe."/url".$ce."!i");
  95.  
  96.         $pp preg_replace_callback($pattern[0]array($this'smarterPPLinkExpand')$this->_text);
  97.         $pp preg_replace($pattern[1]$o."url=\$2\$1\$2".$o."/url".$c$pp);
  98.         $this->_preparsed preg_replace_callback($pattern[2]array($this'smarterPPLink')$pp);
  99.  
  100.     }
  101.  
  102.     /**
  103.      * Intelligently expand a URL into a link
  104.      *
  105.      * @return  string 
  106.      * @access  private
  107.      * @author  Seth Price <seth@pricepages.org>
  108.      * @author  Lorenzo Alberton <l.alberton@quipo.it>
  109.      */
  110.     function smarterPPLinkExpand($matches)
  111.     {
  112.         $options $this->_options;
  113.         $o $options['open'];
  114.         $c $options['close'];
  115.         $oe $options['open_esc'];
  116.         $ce $options['close_esc'];
  117.  
  118.         //If we have an intro tag that is [url], then skip this match
  119.         if (preg_match("/".$oe."url(=[^\s()\[\]=]+)?".$ce."/i"$matches[1])) {
  120.             return $matches[0];
  121.         }
  122.  
  123.         $punctuation '.,;:'// Links can't end with these chars
  124.         $trailing '';
  125.         // Knock off ending punctuation
  126.         $last substr($matches[2]-1);
  127.         while (strpos($punctuation$last!== false{
  128.             // Last character is punctuation - remove it from the url
  129.             $trailing $last.$trailing;
  130.             $matches[2substr($matches[2]0-1);
  131.             $last substr($matches[2]-1);
  132.         }
  133.  
  134.         $off strpos($matches[2]':');
  135.  
  136.         //Is a ":" (therefore a scheme) defined?
  137.         if ($off === false{
  138.             /*
  139.              * Create a link with the default scheme of http. Notice that the
  140.              * text that is viewable to the user is unchanged, but the link
  141.              * itself contains the "http://".
  142.              */
  143.             return $matches[1].$o.'url='.$this->_defaultScheme.'://'.$matches[2].$c.$matches[2].$o.'/url'.$c.$trailing;
  144.         }
  145.  
  146.         $scheme substr($matches[2]0$off);
  147.  
  148.         /*
  149.          * If protocol is in the approved list than allow it. Note that this
  150.          * check isn't really needed, but the created link will just be deleted
  151.          * later in smarterPPLink() if we create it now and it isn't on the
  152.          * scheme list.
  153.          */
  154.         if (in_array($scheme$this->_allowedSchemes)) {
  155.             return $matches[1].$o.'url'.$c.$matches[2].$o.'/url'.$c.$trailing;
  156.         }
  157.         
  158.         return $matches[0];
  159.     }
  160.  
  161.     /**
  162.      * Finish preparsing URL to clean it up
  163.      *
  164.      * @return  string 
  165.      * @access  private
  166.      * @author  Seth Price <seth@pricepages.org>
  167.      */
  168.     function smarterPPLink($matches)
  169.     {
  170.         $options $this->_options;
  171.         $o $options['open'];
  172.         $c $options['close'];
  173.  
  174.         $urlServ $matches[1];
  175.         $path $matches[5];
  176.  
  177.         $off strpos($urlServ':');
  178.  
  179.         if ($off === false{
  180.             //Default to http
  181.             $urlServ $this->_defaultScheme.'://'.$urlServ;
  182.             $off strpos($urlServ':');
  183.         }
  184.  
  185.         //Add trailing slash if missing (to create a valid URL)
  186.         if (!$path{
  187.             $path '/';
  188.         }
  189.  
  190.         $protocol substr($urlServ0$off);
  191.  
  192.         if (in_array($protocol$this->_allowedSchemes)) {
  193.             //If protocol is in the approved list than allow it
  194.             return $o.'url='.$urlServ.$path.$c.$matches[6].$o.'/url'.$c;
  195.         }
  196.         
  197.         //Else remove url tag
  198.         return $matches[6];
  199.     }
  200. }
  201. ?>

Documentation generated on Sat, 03 Nov 2012 14:30:03 +0000 by phpDocumentor 1.4.3. PEAR Logo Copyright © PHP Group 2004.