diff --git a/Parserus.php b/Parserus.php index 96a4b50..6ec64c2 100644 --- a/Parserus.php +++ b/Parserus.php @@ -1,7 +1,7 @@ * @link https://github.com/MioVisman/Parserus * @license https://opensource.org/licenses/MIT The MIT License (MIT) @@ -205,6 +205,7 @@ public function addBBCode(array $bb) } $res['handler'] = isset($bb['handler']) ? $bb['handler'] : null; + $res['text handler'] = isset($bb['text handler']) ? $bb['text handler'] : null; $required = []; $attrs = []; @@ -1067,6 +1068,49 @@ public function getCode($id = 0) return '[' . $tag . $def . $other . ']' . (isset($this->bbcodes[$tag]['single']) ? '' : $body . '[/' . $tag .']'); } + /** + * Метод возвращает текст без bb-кодов построенный на основании дерева тегов + * + * @param int $id Указатель на текущий тег + * + * @return string + */ + public function getText($id = 0) + { + if (isset($this->data[$id]['tag'])) { + + $body = ''; + foreach ($this->data[$id]['children'] as $cid) { + $child = $this->getText($cid); + if (isset($body{0}, $child{0})) { + $body .= ' ' . $child; + } else { + $body .= $child; + } + } + + $bb = $this->bbcodes[$this->data[$id]['tag']]; + + if (null === $bb['text handler']) { + return $body; + } + + $attrs = []; + foreach ($this->data[$id]['attrs'] as $key => $val) { + if (isset($bb['attrs'][$key])) { + $attrs[$key] = $val; + } + } + + return $bb['text handler']($body, $attrs, $this); + } + + $pid = $this->data[$id]['parent']; + $bb = $this->bbcodes[$this->data[$pid]['tag']]; + + return isset($bb['tags only']) ? '' : $this->data[$id]['text']; + } + /** * Метод ищет в текстовых узлах ссылки и создает на их месте узлы с bb-кодами url * Для уменьшения нагрузки использовать при сохранении, а не при выводе diff --git a/examples/getText.php b/examples/getText.php new file mode 100644 index 0000000..2fb2951 --- /dev/null +++ b/examples/getText.php @@ -0,0 +1,140 @@ +setBBCodes([ + ['tag' => 'table', + 'type' => 'table', + 'tags only' => true, + 'self nesting' => 3, + 'attrs' => [ + 'no attr' => true, + 'style' => true, + 'align' => true, + 'background' => true, + 'bgcolor' => true, + 'border' => true, + 'bordercolor' => true, + 'cellpadding' => true, + 'cellspacing' => true, + 'frame' => true, + 'rules' => true, + ], + 'handler' => function($body, $attrs) { + $attr = ''; + foreach ($attrs as $key => $val) { + $attr .= ' ' . $key . '="' . $val . '"'; + } + return '