All pastes #281440 Raw Edit

Anonymous

public php v1 · immutable
#281440 ·published 2006-12-16 20:22 UTC
rendered paste body
	function bbcode_parse_list($in)	{		if (!$this->check_bbcode('list', $in))		{			return '';		}		// $tok holds characters to stop at. Since the string starts with a '[' we'll get everything up to the first ']' which should be the opening [list] tag		$tok = ']';		$out = '[';		// First character is [		$in = substr($in, 1);		$list_end_tags = $item_end_tags = array();		do		{			$pos = strlen($in);			for ($i = 0, $tok_len = strlen($tok); $i < $tok_len; ++$i)			{				$tmp_pos = strpos($in, $tok[$i]);				if ($tmp_pos !== false && $tmp_pos < $pos)				{					$pos = $tmp_pos;				}			}			$buffer = substr($in, 0, $pos);			$tok = $in[$pos];			$in = substr($in, $pos + 1);			if ($tok == ']')			{				// if $tok is ']' the buffer holds a tag				if (strtolower($buffer) == '/list' && sizeof($list_end_tags))				{					// valid [/list] tag					if (sizeof($item_end_tags))					{						// current li tag has not been closed						$out = preg_replace('/\n?\[$/', '[', $out) . array_pop($item_end_tags) . '][';					}					$out .= array_pop($list_end_tags) . ']';					$tok = '[';				}				else if (preg_match('#list(=[0-9a-z])?#i', $buffer, $m))				{					// sub-list, add a closing tag					if (empty($m[1]) || preg_match('/^(disc|square|circle)$/i', $m[1]))					{						array_push($list_end_tags, '/list:u:' . $this->bbcode_uid);					}					else					{						array_push($list_end_tags, '/list:o:' . $this->bbcode_uid);					}					$out .= $buffer . ':' . $this->bbcode_uid . ']';					$tok = '[';				}				else				{					if (($buffer == '*' || substr($buffer, -2) == '[*') && sizeof($list_end_tags))					{						// the buffer holds a bullet tag and we have a [list] tag open						if (sizeof($item_end_tags) >= sizeof($list_end_tags))						{							if (substr($buffer, -2) == '[*')							{								$out .= substr($buffer, 0, -2) . '[';							}							// current li tag has not been closed							if (preg_match('/\n\[$/', $out, $m))							{								$out = preg_replace('/\n\[$/', '[', $out);								$buffer = array_pop($item_end_tags) . "]\n[*:" . $this->bbcode_uid;							}							else							{								$buffer = array_pop($item_end_tags) . '][*:' . $this->bbcode_uid;							}						}						else						{							$buffer = '*:' . $this->bbcode_uid;						}						$item_end_tags[] = '/*:m:' . $this->bbcode_uid;					}					else if ($buffer == '/*')					{						if (array_pop($item_end_tags) == '/*:m:' . $this->bbcode_uid)						{							array_pop($item_end_tags);						}						$buffer = '/*:' . $this->bbcode_uid;					}					$out .= $buffer . $tok;					$tok = '[]';				}			}			else			{				// Not within a tag, just add buffer to the return string				$out .= $buffer . $tok;				$tok = ($tok == '[') ? ']' : '[]';			}		}		while ($in);		// do we have some tags open? close them now		if (sizeof($item_end_tags))		{			$out .= '[' . implode('][', $item_end_tags) . ']';		}		if (sizeof($list_end_tags))		{			$out .= '[' . implode('][', $list_end_tags) . ']';		}		return $out;	}