Differential D20977 Diff 49988 src/infrastructure/markup/syntax/highlighter/PhutilLexerSyntaxHighlighter.php
Changeset View
Changeset View
Standalone View
Standalone View
src/infrastructure/markup/syntax/highlighter/PhutilLexerSyntaxHighlighter.php
- This file was added.
<?php | |||||
final class PhutilLexerSyntaxHighlighter extends PhutilSyntaxHighlighter { | |||||
private $config = array(); | |||||
public function setConfig($key, $value) { | |||||
$this->config[$key] = $value; | |||||
return $this; | |||||
} | |||||
public function getHighlightFuture($source) { | |||||
$strip = false; | |||||
$state = 'start'; | |||||
$lang = idx($this->config, 'language'); | |||||
if ($lang == 'php') { | |||||
if (strpos($source, '<?') === false) { | |||||
$state = 'php'; | |||||
} | |||||
} | |||||
$lexer = idx($this->config, 'lexer'); | |||||
$tokens = $lexer->getTokens($source, $state); | |||||
$tokens = $lexer->mergeTokens($tokens); | |||||
$result = array(); | |||||
foreach ($tokens as $token) { | |||||
list($type, $value, $context) = $token; | |||||
$data_name = null; | |||||
switch ($type) { | |||||
case 'nc': | |||||
case 'nf': | |||||
case 'na': | |||||
$data_name = $value; | |||||
break; | |||||
} | |||||
if (strpos($value, "\n") !== false) { | |||||
$value = explode("\n", $value); | |||||
} else { | |||||
$value = array($value); | |||||
} | |||||
foreach ($value as $part) { | |||||
if (strlen($part)) { | |||||
if ($type) { | |||||
$result[] = phutil_tag( | |||||
'span', | |||||
array( | |||||
'class' => $type, | |||||
'data-symbol-context' => $context, | |||||
'data-symbol-name' => $data_name, | |||||
), | |||||
$part); | |||||
} else { | |||||
$result[] = $part; | |||||
} | |||||
} | |||||
$result[] = "\n"; | |||||
} | |||||
// Throw away the last "\n". | |||||
array_pop($result); | |||||
} | |||||
$result = phutil_implode_html('', $result); | |||||
return new ImmediateFuture($result); | |||||
} | |||||
} |