packages/ssoinabox-webui/root/usr/local/share/ssoinabox/htdocs/includes/smarty/plugins/outputfilter.trimwhitespace.php
changeset 0 3906ca745819
equal deleted inserted replaced
-1:000000000000 0:3906ca745819
       
     1 <?php
       
     2 /**
       
     3  * Smarty plugin
       
     4  *
       
     5  * @package Smarty
       
     6  * @subpackage PluginsFilter
       
     7  */
       
     8 
       
     9 /**
       
    10  * Smarty trimwhitespace outputfilter plugin
       
    11  *
       
    12  * Trim unnecessary whitespace from HTML markup.
       
    13  *
       
    14  * @author   Rodney Rehm
       
    15  * @param string                   $source input string
       
    16  * @param Smarty_Internal_Template $smarty Smarty object
       
    17  * @return string filtered output
       
    18  * @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail!
       
    19  */
       
    20 function smarty_outputfilter_trimwhitespace($source, Smarty_Internal_Template $smarty)
       
    21 {
       
    22     $store = array();
       
    23     $_store = 0;
       
    24     $_offset = 0;
       
    25 
       
    26     // Unify Line-Breaks to \n
       
    27     $source = preg_replace("/\015\012|\015|\012/", "\n", $source);
       
    28 
       
    29     // capture Internet Explorer Conditional Comments
       
    30     if (preg_match_all('#<!--\[[^\]]+\]>.*?<!\[[^\]]+\]-->#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
       
    31         foreach ($matches as $match) {
       
    32             $store[] = $match[0][0];
       
    33             $_length = strlen($match[0][0]);
       
    34             $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
       
    35             $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length);
       
    36 
       
    37             $_offset += $_length - strlen($replace);
       
    38             $_store++;
       
    39         }
       
    40     }
       
    41 
       
    42     // Strip all HTML-Comments
       
    43     // yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124
       
    44     $source = preg_replace( '#<!--.*?-->#ms', '', $source );
       
    45 
       
    46     // capture html elements not to be messed with
       
    47     $_offset = 0;
       
    48     if (preg_match_all('#<(script|pre|textarea)[^>]*>.*?</\\1>#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
       
    49         foreach ($matches as $match) {
       
    50             $store[] = $match[0][0];
       
    51             $_length = strlen($match[0][0]);
       
    52             $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
       
    53             $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length);
       
    54 
       
    55             $_offset += $_length - strlen($replace);
       
    56             $_store++;
       
    57         }
       
    58     }
       
    59 
       
    60     $expressions = array(
       
    61         // replace multiple spaces between tags by a single space
       
    62         // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements
       
    63         '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2',
       
    64         // remove spaces between attributes (but not in attribute values!)
       
    65         '#(([a-z0-9]\s*=\s*(["\'])[^\3]*?\3)|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \4',
       
    66         // note: for some very weird reason trim() seems to remove spaces inside attributes.
       
    67         // maybe a \0 byte or something is interfering?
       
    68         '#^\s+<#Ss' => '<',
       
    69         '#>\s+$#Ss' => '>',
       
    70     );
       
    71 
       
    72     $source = preg_replace( array_keys($expressions), array_values($expressions), $source );
       
    73     // note: for some very weird reason trim() seems to remove spaces inside attributes.
       
    74     // maybe a \0 byte or something is interfering?
       
    75     // $source = trim( $source );
       
    76 
       
    77     // capture html elements not to be messed with
       
    78     $_offset = 0;
       
    79     if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
       
    80         foreach ($matches as $match) {
       
    81             $store[] = $match[0][0];
       
    82             $_length = strlen($match[0][0]);
       
    83             $replace = array_shift($store);
       
    84             $source = substr_replace($source, $replace, $match[0][1] + $_offset, $_length);
       
    85 
       
    86             $_offset += strlen($replace) - $_length;
       
    87             $_store++;
       
    88         }
       
    89     }
       
    90 
       
    91     return $source;
       
    92 }
       
    93 
       
    94 ?>