file = $file; $this->highlight = $highlight; $this->highlightSeverity = $highlightSeverity; } /** * @throws \Icinga\Exception\IcingaException */ protected function assemble() { $source = $this->linkObjects(Html::escape($this->file->getContent())); if ($this->highlight) { $source = $this->highlight( $source, $this->highlight, $this->highlightSeverity ); } $this->add(Html::tag( 'pre', ['class' => 'generated-config'], new HtmlString($source) )); } /** * @param $match * @return string * @throws \Icinga\Exception\IcingaException * @throws \Icinga\Exception\ProgrammingError */ protected function linkObject($match) { if ($match[2] === 'Service') { return $match[0]; } $controller = $match[2]; if ($match[2] === 'CheckCommand') { $controller = 'command'; } $name = $this->decode($match[3]); return sprintf( '%s %s "%s" {', $match[1], $match[2], Link::create( $name, 'director/' . $controller, ['name' => $name], ['data-base-target' => '_next'] ) ); } protected function decode($str) { return htmlspecialchars_decode($str, ENT_COMPAT | ENT_SUBSTITUTE | ENT_HTML5); } protected function linkObjects($config) { $pattern = '/^(object|template)\s([A-Z][A-Za-z]*?)\s"(.+?)"\s{/m'; return preg_replace_callback( $pattern, [$this, 'linkObject'], $config ); } protected function highlight($what, $line, $severity) { $lines = explode("\n", $what); $lines[$line - 1] = '' . $lines[$line - 1] . ''; return implode("\n", $lines); } }