Differential D20774 Diff 49536 src/infrastructure/markup/blockrule/PhutilRemarkupQuotedBlockRule.php
Changeset View
Changeset View
Standalone View
Standalone View
src/infrastructure/markup/blockrule/PhutilRemarkupQuotedBlockRule.php
- This file was added.
<?php | |||||
abstract class PhutilRemarkupQuotedBlockRule | |||||
extends PhutilRemarkupBlockRule { | |||||
final public function supportsChildBlocks() { | |||||
return true; | |||||
} | |||||
final protected function normalizeQuotedBody($text) { | |||||
$text = phutil_split_lines($text, true); | |||||
foreach ($text as $key => $line) { | |||||
$text[$key] = substr($line, 1); | |||||
} | |||||
// If every line in the block is empty or begins with at least one leading | |||||
// space, strip the initial space off each line. When we quote text, we | |||||
// normally add "> " (with a space) to the beginning of each line, which | |||||
// can disrupt some other rules. If the block appears to have this space | |||||
// in front of each line, remove it. | |||||
$strip_space = true; | |||||
foreach ($text as $key => $line) { | |||||
$len = strlen($line); | |||||
if (!$len) { | |||||
// We'll still strip spaces if there are some completely empty | |||||
// lines, they may have just had trailing whitespace trimmed. | |||||
continue; | |||||
} | |||||
// If this line is part of a nested quote block, just ignore it when | |||||
// realigning this quote block. It's either an author attribution | |||||
// line with ">>!", or we'll deal with it in a subrule when processing | |||||
// the nested quote block. | |||||
if ($line[0] == '>') { | |||||
continue; | |||||
} | |||||
if ($line[0] == ' ' || $line[0] == "\n") { | |||||
continue; | |||||
} | |||||
// The first character of this line is something other than a space, so | |||||
// we can't strip spaces. | |||||
$strip_space = false; | |||||
break; | |||||
} | |||||
if ($strip_space) { | |||||
foreach ($text as $key => $line) { | |||||
$len = strlen($line); | |||||
if (!$len) { | |||||
continue; | |||||
} | |||||
if ($line[0] !== ' ') { | |||||
continue; | |||||
} | |||||
$text[$key] = substr($line, 1); | |||||
} | |||||
} | |||||
// Strip leading empty lines. | |||||
foreach ($text as $key => $line) { | |||||
if (!strlen(trim($line))) { | |||||
unset($text[$key]); | |||||
} | |||||
} | |||||
return implode('', $text); | |||||
} | |||||
final protected function getQuotedText($text) { | |||||
$text = rtrim($text, "\n"); | |||||
$no_whitespace = array( | |||||
// For readability, we render nested quotes as ">> quack", | |||||
// not "> > quack". | |||||
'>' => true, | |||||
// If the line is empty except for a newline, do not add an | |||||
// unnecessary dangling space. | |||||
"\n" => true, | |||||
); | |||||
$text = phutil_split_lines($text, true); | |||||
foreach ($text as $key => $line) { | |||||
$c = null; | |||||
if (isset($line[0])) { | |||||
$c = $line[0]; | |||||
} else { | |||||
$c = null; | |||||
} | |||||
if (isset($no_whitespace[$c])) { | |||||
$text[$key] = '>'.$line; | |||||
} else { | |||||
$text[$key] = '> '.$line; | |||||
} | |||||
} | |||||
$text = implode('', $text); | |||||
return $text; | |||||
} | |||||
} |