346 lines
13 KiB
PHP
346 lines
13 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Injector that auto paragraphs text in the root node based on
|
|
* double-spacing.
|
|
* @todo Ensure all states are unit tested, including variations as well.
|
|
* @todo Make a graph of the flow control for this Injector.
|
|
*/
|
|
class HTMLPurifier_Injector_AutoParagraph extends HTMLPurifier_Injector
|
|
{
|
|
|
|
public $name = 'AutoParagraph';
|
|
public $needed = array('p');
|
|
|
|
private function _pStart() {
|
|
$par = new HTMLPurifier_Token_Start('p');
|
|
$par->armor['MakeWellFormed_TagClosedError'] = true;
|
|
return $par;
|
|
}
|
|
|
|
public function handleText(&$token) {
|
|
$text = $token->data;
|
|
// Does the current parent allow <p> tags?
|
|
if ($this->allowsElement('p')) {
|
|
if (empty($this->currentNesting) || strpos($text, "\n\n") !== false) {
|
|
// Note that we have differing behavior when dealing with text
|
|
// in the anonymous root node, or a node inside the document.
|
|
// If the text as a double-newline, the treatment is the same;
|
|
// if it doesn't, see the next if-block if you're in the document.
|
|
|
|
$i = $nesting = null;
|
|
if (!$this->forwardUntilEndToken($i, $current, $nesting) && $token->is_whitespace) {
|
|
// State 1.1: ... ^ (whitespace, then document end)
|
|
// ----
|
|
// This is a degenerate case
|
|
} else {
|
|
if (!$token->is_whitespace || $this->_isInline($current)) {
|
|
// State 1.2: PAR1
|
|
// ----
|
|
|
|
// State 1.3: PAR1\n\nPAR2
|
|
// ------------
|
|
|
|
// State 1.4: <div>PAR1\n\nPAR2 (see State 2)
|
|
// ------------
|
|
$token = array($this->_pStart());
|
|
$this->_splitText($text, $token);
|
|
} else {
|
|
// State 1.5: \n<hr />
|
|
// --
|
|
}
|
|
}
|
|
} else {
|
|
// State 2: <div>PAR1... (similar to 1.4)
|
|
// ----
|
|
|