private function doreplacetag($tag) { $out = array(); $child = array(); $last_root = 0; $diff = 0; $oldlen = 0; $newlen = 0; $out = array_reverse($this->out_arr); $lastlevel = 0; //print_r($out); foreach ($out as $key => $item) { $idx = !empty($item['attr'][0]) ? 1 : 0; $cfgtag = $this->template_tag[$tag][$idx]; $calcLen = $item['innerLen'] + $diff; $innerText = substr($this->html, $item['innerPos'], $calcLen); $left = preg_replace("/\\%attr1\\%/si", $item['attr'][0], $cfgtag['begin']); for ($i = 1; $i < count($item['attr']) - 1; $i++) { $regex = "/\\%attr{$i}\\%/si"; $left = preg_replace($regex, $item['attr'][$i], $left); } switch ($tag) { case 'list': $inner = preg_replace("#<br>|<br />#si", "", $innerText); $inner = $this->process_list_items($inner); break; case 'quote': $inner = $innerText; break; case 'code': $inner = preg_replace("#<br>|<br />#si", "", $innerText); // for geshi highlighter if (preg_match('/' . $this->highlight_lang . '/usi', $item['attr'][0])) { $inner = Highlighter::parse($inner, $item['attr'][0]); $inner = preg_replace("#\r?\n#si", "", $inner); } break; case 'chk': $chk_arr = preg_split("/[^\\d]+/si", trim($item['attr'][0])); $chk_list = implode("|", $chk_arr); //Kohana::$log->add(Log::INFO,$chk_list." ".trim($item['attr'][0])); $inner = preg_replace("#<br>|<br />#si", "", $innerText); $inner = preg_replace("/\\b({$chk_list})\\b/si", "<span style=\"background-color:orange;\">\$1</span>", $inner); break; default: $inner = $innerText; } //$right = (!empty($item['attr'])) ? $cfgtag['altPos'] : $cfgtag['fPos'] ; $right = preg_replace("/\\%attr1\\%/si", $item['attr'][0], $cfgtag['end']); for ($i = 1; $i < count($item['attr']) - 1; $i++) { $regex = "/\\%attr{$i}\\%/si"; $right = preg_replace($regex, $item['attr'][$i], $right); } $newstr = $left . $inner . $right; $newlen = strlen($newstr); $oldlen = $calcLen + strlen($item['tagLeft']) + strlen($item['tagRight']); $this->html = substr_replace($this->html, $newstr, $item['pos'], $oldlen); $lastlevel = $item['level']; $diff_flag = $lastlevel > 1; $diff = $diff_flag ? $diff + ($newlen - $oldlen) : 0; } }