php-school / keylighter
PHP 另一个语法高亮工具
Requires
- php: ^7.1.3 | ^8.0
Requires (Dev)
- phpunit/phpunit: ^8.0
- symfony/console: ^2.8|^3.0
Suggests
- symfony/console: Allows usage of keylighters CLI utility.
This package is auto-updated.
Last update: 2024-08-29 05:37:12 UTC
README
PHP 中的另一个语法高亮工具,旨在尽可能扩展性和易于使用,但同时也考虑了性能。
您可以在 http://keylighter.kadet.net/ 上尝试最新版本。
名称
名称 "KeyLighter" 受摄影和电影中的 Key Light 概念启发。
关键光通常是摄影师、电影摄影师、灯光摄影师或其他场景制作人首先使用的灯光,其目的是突出主题的形状和维度。
KeyLighter 应该做同样的事情——针对代码。
安装
$ composer require kadet/keylighter
要使用 KeyLighter,您只需要 PHP 5.5 或更高版本,不需要特殊扩展。
全局安装
您可以将 KeyLighter 作为全局 Composer 库安装
$ composer global require kadet/keylighter
然后您可以使用内建的简单 CLI 高亮应用
$ keylighter [command = highlight] [-l|--language [LANGUAGE]] [-f|--format [FORMAT]] [-d|--debug [DEBUG]] [--] <path>...
如果您想将内容传递到 KeyLighter,只需指定 php://stdin
作为路径。您可以使用 list
命令查看所有可用命令,并使用 --help
参数获取详细帮助。您不需要明确指定 highlight
命令。
PowerShell
您在 Windows 上使用 PowerShell?太棒了!KeyLighter 内置了 PowerShell 模块,使得 CLI 使用更加出色。只需导入模块(例如在配置文件中),然后您就可以开始使用了。
PS> Import-Module "${env:APPDATA}\Composer\vendor\kadet\keylighter\bin\KeyLighter.psd1"
要使用自动补全功能,您需要 PowerShell v5(与 Windows 10 一起提供)或安装 TabExpansion++ 模块。
为什么选择 KeyLighter?
易于使用
use Kadet\Highlighter\Language; echo \Kadet\Highlighter\highlight($source, new Language\Php(), $formatter); // or echo \Kadet\Highlighter\KeyLighter::get()->highlight($source, new Language\Php(), $formatter); // or $keylighter = new \Kadet\Highlighter\KeyLighter([options]); echo $keylighter->highlight($source, new Language\Php(), $formatter);
它在 CLI 上工作!还有更多!
KeyLighter最初是为我的个人使用而设计的 CLI 高亮工具,但后来我决定它应该能够生成任何可能的输出,目前支持
Cli \Kadet\Highlighter\Formatter\CliFormatter
它甚至可以进行样式化,默认样式存储在 Styles\Cli\Default.php
中,但您也可以在构造函数中传递额外的参数
new \Kadet\Highlighter\Formatter\CliFormatter([ 'string' => ['color' => 'green'], 'keyword' => ['color' => 'yellow'], ... ])
HTML \Kadet\Highlighter\Formatter\HtmlFormatter
每个标记都放置在其自己的 span
中,因此可以使用 CSS 容易地进行样式化。
<span class="variable">$maxOption</span>
pre > span.variable { color: #F7750D; }
您自己的?
编写您自己的格式化程序非常容易。文档即将推出。
上下文敏感
一些标记在某些上下文中有效,而在其他上下文中则无效。这个库是上下文敏感的,您可以定义它们何时有效。
在这种情况下,上下文意味着“在另一个标记内部”,例如假设“string”标记被定义为从“”到下一个“”之间的所有内容,“keyword”被定义为“sit”子串。
↓ string:start ↓ keyword:start "Lorem ipsum dolor sit amtet" keyword:end ↑ ↑ string:end Token tree: Token.name Token.pos ------------------------------ string:start 0 keyword:start 21 keyword:end 23 string:end 30
因此,如您所见,“keyword”位于“string”内部,因此它不是有效的,应该被删除。您可以在某些上下文中定义仅有效的标记,或在其他上下文中定义无效的标记。
哦,还有标记名称是级联的,这意味着 string.single
是 string
,但 string
必然不是 string.single
。
轻松编写您自己的语言定义
您可以使用 KeyLighter
轻松扩展新语言,更详细的文档即将推出。
例如,XML 定义看起来像这样
class Xml extends GreedyLanguage { const IDENTIFIER = '(?P<namespace>[\w\.-]+:)?(?P<name>[\w\.-]+)'; /** * Tokenization rules */ public function setupRules() { $this->rules->addMany([ 'tag.open' => [ new OpenRule(new RegexMatcher('/(<\w+)[:\/>:\s]/')), new CloseRule(new SubStringMatcher('>'), ['context' => ['!string', '!comment']]) ], 'tag.close' => new Rule(new RegexMatcher('/(<\/(?:\w+:)?(?:[\w\.]+)>)/')), 'symbol.tag' => new Rule(new RegexMatcher('/<\\/?' . self::IDENTIFIER . '/', [ 'name' => Token::NAME, 'namespace' => '$.namespace' ]), ['context' => ['tag', '!string']]), 'symbol.attribute' => new Rule(new RegexMatcher('/' . self::IDENTIFIER . '=/', [ 'name' => Token::NAME, 'namespace' => '$.namespace' ]), ['context' => ['tag', '!string']]), 'constant.entity' => new Rule(new RegexMatcher('/(&(?:\#\d+|[a-z])+;)/si')), 'comment' => new Rule(new CommentMatcher(null, [['<!--', '-->']])), 'string' => CommonFeatures::strings(['single' => '\'', 'double' => '"'], ['context' => ['tag']]), ]); } /** {@inheritdoc} */ public function getIdentifier() { return 'xml'; } }
我将尽力写下尽可能多的定义,但任何PR都欢迎。
嵌入式语言
许多语言可以同时使用,例如在html中嵌入css或js,在php中嵌入sql等等。《KeyLighter》可以无任何问题地处理并突出显示嵌入式语言。
快速 
尽管它不是PHP中最快的代码高亮器,但它仍然相当快,比GeSHi快几倍。它在PHP 7上的性能最佳(在所有情况下都比GeSHi快2倍以上)。
测试 
KeyLighter使用phpunit
进行测试
$ phpunit
路线图
还有一些事情要做,你可以在trello上找到所有内容。
贡献
有关详细信息,请参阅CONTRIBUTING.md。