From 17398fc51314dc8bcafed5e22f7780b095603cb5 Mon Sep 17 00:00:00 2001 From: Eric Lippmann Date: Wed, 23 Nov 2016 11:05:39 +0100 Subject: [PATCH] Drop zero width space charater insertion word-break: break-word is sufficient. fixes #12774 --- .../views/helpers/PluginOutput.php | 100 ++---------------- 1 file changed, 10 insertions(+), 90 deletions(-) diff --git a/modules/monitoring/application/views/helpers/PluginOutput.php b/modules/monitoring/application/views/helpers/PluginOutput.php index fc3ec8e30..0de6cf14c 100644 --- a/modules/monitoring/application/views/helpers/PluginOutput.php +++ b/modules/monitoring/application/views/helpers/PluginOutput.php @@ -45,35 +45,6 @@ class Zend_View_Helper_PluginOutput extends Zend_View_Helper_Abstract '@@@@@@', ); - /** - * The character ​ - * - * @var string - */ - protected $zeroWidthSpace; - - /** - * The encoded character ​ - * - * @var string - */ - protected $zeroWidthSpaceEnt = '​'; - - /** - * Create a new Zend_View_Helper_PluginOutput - */ - public function __construct() - { - // This is actually not required as the value is constant, - // but as its (visual) length is 0, it's likely to be mixed up with the empty string. - $this->zeroWidthSpace = '' - . html_entity_decode($this->zeroWidthSpaceEnt, ENT_NOQUOTES, 'UTF-8') - . ''; - $this->zeroWidthSpaceEnt = '' - . $this->zeroWidthSpaceEnt - . ''; - } - /** * Render plugin output * @@ -96,29 +67,21 @@ class Zend_View_Helper_PluginOutput extends Zend_View_Helper_Abstract $this->getPurifier()->purify($output) ); $isHtml = true; - $useDom = true; } else { // Plaintext - $count = 0; $output = preg_replace( self::$txtPatterns, self::$txtReplacements, - $this->view->escape($output), - -1, - $count + $this->view->escape($output) ); $isHtml = false; - $useDom = (bool) $count; } - - // Help browsers to break words in plugin output $output = trim($output); - // Add space after comma where missing + // Add space after comma where missing, to help browsers to break words in plugin output $output = preg_replace('/,(?=[^\s])/', ', ', $output); - $output = $useDom ? $this->fixLinksAndWrapping($output) : $this->fixWrapping($output, $this->zeroWidthSpaceEnt); - if (! $raw) { if ($isHtml) { + $output = $this->fixLinks($output); $output = '
' . $output . '
'; } else { $output = '
' . $output . '
'; @@ -128,40 +91,31 @@ class Zend_View_Helper_PluginOutput extends Zend_View_Helper_Abstract } /** - * Replace classic Icinga CGI links with Icinga Web 2 links and - * add zero width space to make wrapping easier for the user agent + * Replace classic Icinga CGI links with Icinga Web 2 links * * @param string $html * * @return string */ - protected function fixLinksAndWrapping($html) + protected function fixLinks($html) { - - $ret = array(); - $dom = new DOMDocument; + $dom = new DOMDocument(); $dom->loadXML('
' . $html . '
', LIBXML_NOERROR | LIBXML_NOWARNING); $dom->preserveWhiteSpace = false; - $links = $dom->getElementsByTagName('a'); - foreach ($links as $tag) - { - $href = $tag->getAttribute('href'); + foreach ($links as $link) { + /** @var \DOMElement $link */ + $href = $link->getAttribute('href'); if (preg_match('~^/cgi\-bin/status\.cgi\?(.+)$~', $href, $m)) { parse_str($m[1], $params); if (isset($params['host'])) { - $tag->setAttribute('href', $this->view->baseUrl( + $link->setAttribute('href', $this->view->baseUrl( '/monitoring/host/show?host=' . urlencode($params['host'] ))); } - } else { - // ignoring } - //$ret[$tag->getAttribute('href')] = $tag->childNodes->item(0)->nodeValue; } - $this->fixWrappingRecursive($dom); - return substr($dom->saveHTML(), 5, -7); } @@ -194,38 +148,4 @@ class Zend_View_Helper_PluginOutput extends Zend_View_Helper_Abstract } return self::$purifier; } - - /** - * Add zero width space to all text in the DOM to make wrapping easier for the user agent - * - * @param DOMNode $node - */ - protected function fixWrappingRecursive(DOMNode $node) - { - if ($node instanceof DOMText) { - $node->data = $this->fixWrapping($node->data, $this->zeroWidthSpace); - } elseif ($node->childNodes !== null) { - foreach ($node->childNodes as $childNode) { - $this->fixWrappingRecursive($childNode); - } - } - } - - /** - * Add zero width space to make wrapping easier for the user agent - * - * @param string $output - * @param string $zeroWidthSpace - * - * @return string - */ - protected function fixWrapping($output, $zeroWidthSpace) - { - // TODO(el): Disabled until we find a bulletproof implementation - return $output; - // Add zero width space after ')', ']', ':', '.', '_' and '-' if not surrounded by whitespaces - $output = preg_replace('/([^\s])([\\)\\]:._-])([^\s])/', '$1$2' . $zeroWidthSpace . '$3', $output); - // Add zero width space before '(' and '[' if not surrounded by whitespaces - return preg_replace('/([^\s])([([])([^\s])/', '$1' . $zeroWidthSpace . '$2$3', $output); - } }