php-school/keylighter

PHP 另一个语法高亮工具

0.8.4 2020-11-01 14:21 UTC

README

Logo

Packagist Scrutinizer Code Quality Travis build Code Coverage Try it

stability: stable stability: unstable

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++ 模块。

Powershell Support

为什么选择 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

CLI

它甚至可以进行样式化,默认样式存储在 Styles\Cli\Default.php 中,但您也可以在构造函数中传递额外的参数

new \Kadet\Highlighter\Formatter\CliFormatter([
    'string'      => ['color' => 'green'],
    'keyword'     => ['color' => 'yellow'],
    ...
])

HTML \Kadet\Highlighter\Formatter\HtmlFormatter

HTML

每个标记都放置在其自己的 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.singlestring,但 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中嵌入cssjs,在php中嵌入sql等等。《KeyLighter》可以无任何问题地处理并突出显示嵌入式语言。

Embedded languages

快速 Optimized for php7.0

尽管它不是PHP中最快的代码高亮器,但它仍然相当快,比GeSHi快几倍。它在PHP 7上的性能最佳(在所有情况下都比GeSHi快2倍以上)。

测试 Code Coverage

KeyLighter使用phpunit进行测试

$ phpunit

路线图

还有一些事情要做,你可以在trello上找到所有内容。

贡献

有关详细信息,请参阅CONTRIBUTING.md

谢谢

感谢MaciejMaciej和Monika的所有支持,包括精神上的支持。