',
'',
'',
'',
'',
'',
'@@@@@@'
];
/** @var string[] Patterns to be replaced in html plugin output */
protected const HTML_PATTERNS = [
'~\\\t~',
'~\\\n~'
];
/** @var string[] Replacements for {@see PluginOutput::HTML_PATTERNS} */
protected const HTML_REPLACEMENTS = [
"\t",
"\n"
];
/** @var string Already rendered output */
protected $renderedOutput;
/** @var bool Whether the output contains HTML */
protected $isHtml;
/** @var int The maximum amount of characters to process */
protected $characterLimit = 1000;
/** @var bool Whether output will be enriched */
protected $enrichOutput = true;
/** @var string The name of the command that produced the output */
protected $commandName;
/**
* Get whether the output contains HTML
*
* Requires the output being already rendered.
*
* @return bool
*
* @throws LogicException In case the output hasn't been rendered yet
*/
public function isHtml(): bool
{
if ($this->isHtml === null) {
if (empty($this->getContent())) {
// "Nothing" can't be HTML
return false;
}
throw new LogicException('Output not rendered yet');
}
return $this->isHtml;
}
/**
* Set the maximum amount of characters to process
*
* @param int $limit
*
* @return $this
*/
public function setCharacterLimit(int $limit): self
{
$this->characterLimit = $limit;
return $this;
}
/**
* Set whether the output should be enriched
*
* @param bool $state
*
* @return $this
*/
public function setEnrichOutput(bool $state = true): self
{
$this->enrichOutput = $state;
return $this;
}
/**
* Set name of the command that produced the output
*
* @param string $name
*
* @return $this
*/
public function setCommandName(string $name): self
{
$this->commandName = $name;
return $this;
}
/**
* Render plugin output of the given object
*
* @param Host|Service $object
*
* @return static
*
* @throws InvalidArgumentException If $object is neither a host nor a service
*/
public static function fromObject(Model $object): self
{
if (! $object instanceof Host && ! $object instanceof Service) {
throw new InvalidArgumentException(
sprintf('Object is not a host or service, got %s instead', get_class($object))
);
}
return (new static($object->state->output . "\n" . $object->state->long_output))
->setCommandName($object->checkcommand_name);
}
public function render(): string
{
if ($this->renderedOutput !== null) {
return $this->renderedOutput;
}
$output = parent::render();
if (empty($output)) {
return '';
}
if ($this->commandName !== null) {
$output = PluginOutputHook::processOutput($output, $this->commandName, $this->enrichOutput);
}
$output = substr($output, 0, $this->characterLimit);
$this->isHtml = (bool) preg_match('~<\w+(?>\s\w+=[^>]*)?>~', $output);
if ($this->isHtml) {
if ($this->enrichOutput) {
$output = preg_replace(self::TEXT_PATTERNS, self::TEXT_REPLACEMENTS, $output);
} else {
$output = preg_replace(self::HTML_PATTERNS, self::HTML_REPLACEMENTS, $output);
}
$output = HtmlPurifier::process($output);
} else {
$output = preg_replace(
self::TEXT_PATTERNS,
self::TEXT_REPLACEMENTS,
htmlspecialchars($output, ENT_COMPAT | ENT_SUBSTITUTE | ENT_HTML5, null, false)
);
}
$output = trim($output);
// Add zero-width space after commas which are not followed by a whitespace character
// in oder to help browsers to break words in plugin output
$output = preg_replace('/,(?=[^\s])/', ',', $output);
$this->renderedOutput = $output;
return $output;
}
}