Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public function addition() {
- $content = $this->modx->documentOutput;
- $tags= array ();
- if ($collected = $this->modx->parser->collectElementTags($content, $tags, '[[', ']]')) {
- $dom = new DOMDocument();
- // Disable libxml errors occur when parsing tags modx
- libxml_use_internal_errors(true);
- $dom->loadHTML($content);
- $xpath = new DOMXpath($dom);
- foreach ($tags as $tag) {
- /* Avoid all processing for comment tags, e.g. [[- comments here]] */
- if (substr($tag[1], 0, 1) === '-') {
- continue;
- }
- $tagParts= xPDO :: escSplit('?', $tag[1], '`', 2);
- $tagName= trim($tagParts[0]);
- /* String of parameters. Not yet used. */
- //$tagPropString= null;
- //if (isset ($tagParts[1])) {
- // $tagPropString= trim($tagParts[1]);
- //}
- $token = substr($tagName, 0, 1);
- $tokenOffset = 0;
- if ($token === '!') {
- $tokenOffset++;
- $token = substr($tagName, $tokenOffset, 1);
- }
- unset($elementPS);
- if (strpos($tagName, '@') !== false) {
- $split = xPDO :: escSplit('@', $tagName);
- if ($split && isset($split[1])) {
- $psName = $split[1];
- $filters = xPDO :: escSplit(':', $psName);
- if ($filters && isset($filters[0]) && !empty($filters[0])) {
- $ps = $this->modx->getObject('modPropertySet', array('name' => $filters[0] ));
- $elementPS = array(
- 'type' => 'propertyset',
- 'identifier' => $ps->get('id'),
- 'name' => $filters[0]
- );
- }
- }
- }
- switch ($token) {
- case '%':
- case '~':
- /* skip links and lexicons */
- continue 2;
- break;
- case '+':
- if(substr($tagName, 0, 2) == '++') {
- $tagName = substr($tagName, 2 + $tokenOffset);
- $tagName = $this->modx->parser->realname($tagName);
- $element = array(
- 'type' => 'system',
- 'identifier' => $tagName
- );
- } else {
- /* skip placeholders */
- continue 2;
- }
- break;
- case '$':
- $tagName = substr($tagName, 1 + $tokenOffset);
- $tagName = $this->modx->parser->realname($tagName);
- $element = array(
- 'type' => 'chunk',
- 'identifier' => $this->modx->getObject('modChunk',array('name' => $tagName ))->get('id'),
- 'name' => $tagName
- );
- break;
- case '#': // TODO: fastfield in pdoParser
- continue 2;
- case '*':
- $tagName = substr($tagName, 1 + $tokenOffset);
- $tagName = $this->modx->parser->realname($tagName);
- if (is_array($this->modx->resource->_fieldMeta) && in_array($tagName, array_keys($this->modx->resource->_fieldMeta))) {
- $element = array(
- 'type' => 'field',
- 'identifier' => $tagName,
- 'resource' => $this->modx->resourceIdentifier
- );
- } else {
- $element = array(
- 'type' => 'tv',
- 'identifier' => $this->modx->getObject('modTemplateVar', array('name'=>$tagName))->get('id'),
- 'resource' => $this->modx->resourceIdentifier
- );
- }
- break;
- default:
- if($this->config['snippets_editable']) {
- $tagName = substr($tagName, $tokenOffset);
- $tagName = $this->modx->parser->realname($tagName);
- if($snippet = $this->modx->getObject('modSnippet', array('name' => $tagName))) {
- $element = array(
- 'type' => 'snippet',
- 'identifier' => $snippet->get('id'),
- 'name' => $tagName
- );
- }
- }
- }
- if(isset($element)) {
- $key = implode('-', $element);
- $attr = array(
- $key => $element
- );
- if(isset($elementPS)) {
- $attr['propertyset-'.$elementPS['identifier']] = $elementPS;
- }
- /** @var DOMNodeList $NodeList */
- $NodeList = $xpath->query('/html/body//text()[contains(.,"' . $tag[0] . '")]/..|/html/body//attribute::*[contains(.,"' . $tag[0] . '")]/..');
- /** @var DOMNode $Node */
- foreach ($NodeList as $Node) {
- if($Node->hasAttribute('frontmanager')) {
- $attr = array_merge(
- $this->modx->fromJSON($Node->getAttribute('frontmanager')),
- $attr
- );
- }
- $Node->setAttribute(
- "frontmanager",
- $this->modx->toJSON($attr)
- );
- }
- $content = $dom->saveHTML();
- }
- }
- /* fix percent-encoding for "[" and "]" */
- $content = str_replace("%5D", "]",str_replace("%5B", "[", $content));
- $this->modx->documentOutput = $content;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement