WordPress.org

Make WordPress Core

Ticket #53: 0000053-balancetags-patch2.diff

File 0000053-balancetags-patch2.diff, 2.6 KB (added by anonymousbugger, 13 years ago)
  • .php

    old new  
    176176 @license         GPL v2.0
    177177 @notes           
    178178 @changelog       
     179             ---  Modified by Scott Reilly (coffee2code) 02 Aug 2004
    179180             1.2  ***TODO*** Make better - change loop condition to $text
    180181             1.1  Fixed handling of append/stack pop order of end text
    181182                  Added Cleaning Hooks
     
    195196        $text = preg_replace('#<([0-9]{1})#', '&lt;$1', $text);
    196197
    197198        while (preg_match("/<(\/?\w*)\s*([^>]*)>/",$text,$regex)) {
    198                 $newtext = $newtext . $tagqueue;
     199                $newtext .= $tagqueue;
    199200
    200201                $i = strpos($text,$regex[0]);
    201                 $l = strlen($tagqueue) + strlen($regex[0]);
     202                $l = strlen($regex[0]);
    202203
    203204                // clear the shifter
    204205                $tagqueue = '';
     
    234235
    235236                        // Tag Cleaning
    236237
    237                         // Push if not img or br or hr
    238                         if($tag != 'br' && $tag != 'img' && $tag != 'hr') {
     238                        // If self-closing or '', don't do anything.
     239                        if((substr($regex[2],-1) == '/') || ($tag == '')) {
     240                        }
     241                        // ElseIf it's a known single-entity tag but it doesn't close itself, do so
     242                        elseif ($tag == 'br' || $tag == 'img' || $tag == 'hr' || $tag == 'input') {
     243                                $regex[2] .= '/';
     244                        } else {        // Push the tag onto the stack
     245                                // If the top of the stack is the same as the tag we want to push, close previous tag
     246                                if (($stacksize > 0) && ($tag != 'div') && ($tagstack[$stacksize - 1] == $tag)) {
     247                                        $tagqueue = '</' . array_pop ($tagstack) . '>';
     248                                        $stacksize--;
     249                                }
    239250                                $stacksize = array_push ($tagstack, $tag);
    240251                        }
    241252
    242253                        // Attributes
    243                         // $attributes = $regex[2];
    244254                        $attributes = $regex[2];
    245255                        if($attributes) {
    246256                                $attributes = ' '.$attributes;
    247257                        }
    248258                        $tag = '<'.$tag.$attributes.'>';
     259                        //If already queuing a close tag, then put this tag on, too
     260                        if ($tagqueue) {
     261                                $tagqueue .= $tag;
     262                                $tag = '';
     263                        }
    249264                }
    250265                $newtext .= substr($text,0,$i) . $tag;
    251266                $text = substr($text,$i+$l);
    252267        } 
    253268
    254269        // Clear Tag Queue
    255         $newtext = $newtext . $tagqueue;
     270        $newtext .= $tagqueue;
    256271
    257272        // Add Remaining text
    258273        $newtext .= $text;
    259274
    260275        // Empty Stack
    261276        while($x = array_pop($tagstack)) {
    262                 $newtext = $newtext . '</' . $x . '>'; // Add remaining tags to close     
     277                $newtext .= '</' . $x . '>'; // Add remaining tags to close     
    263278        }
    264279
    265280        // WP fix for the bug with HTML comments