Еще один инструмент выделения синтаксиса в PHP, который должен быть максимально расширяемым и простым в использовании, но с учетом производительности.
Вы можете опробовать его в самой последней версии на https://KeyLighter.kadet.net/.
Название « KeyLighter » вдохновлено концепцией Key Light в фотографии и кинематографии.
Ключевой свет — это первый и обычно самый важный свет, который фотограф, кинематографист, оператор по свету или другой композитор сцены будет использовать в настройке освещения. Цель ключевого света — подчеркнуть форму и размер объекта.
KeyLighter должен делать то же самое — для кода.
$ composer require kadet/ KeyLighter
Чтобы использовать KeyLighter , вам нужен PHP 7.3 или новее, никаких специальных расширений не требуется.
KeyLighter можно установить как глобальную библиотеку композиторов.
$ composer global require kadet/ KeyLighter
Затем вы можете использовать встроенное простое приложение для подсветки командной строки:
$ KeyLighter [command = highlight] [-l | --language [LANGUAGE]] [-f | --format [FORMAT]] [-d | --debug [DEBUG]] [--] < path > ...
Если вы хотите подключиться к KeyLighter просто укажите путь php://stdin
. Вы можете использовать команду list
, чтобы просмотреть все доступные команды, и аргумент --help
для получения подробной справки. Вам не нужно явно указывать команду highlight
.
Вы используете PowerShell в Windows? Прохладный! KeyLighter поставляется со встроенным модулем PowerShell, который делает использование CLI еще удобнее. Просто импортируйте модуль (например, в профиль), и все готово.
PS > Import-Module " ${ env: APPDATA} Composervendorkadet KeyLighter bin KeyLighter .psd1 "
Для использования функций автозаполнения вам понадобится PowerShell v5 (поставляется с Windows 10) или установите модуль TabExpansion++.
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 );
Вы можете найти все доступные языки здесь и форматтеры здесь.
KeyLighter изначально разрабатывался как подсветка CLI для моего собственного использования, но затем я решил, что он должен иметь возможность генерировать любой возможный вывод, который поддерживается в настоящее время:
KadetHighlighterFormatterCliFormatter
Его даже можно стилизовать, стили по умолчанию хранятся в StylesCliDefault.php
, но вы можете просто передать дополнительный аргумент в конструктор:
new Kadet Highlighter Formatter CliFormatter ([
' string ' => [ ' color ' => ' green ' ],
' keyword ' => [ ' color ' => ' yellow ' ],
...
])
KadetHighlighterFormatterHtmlFormatter
Каждый токен помещается внутри своего собственного span
, а классы имеют префикс, поэтому его можно легко стилизовать с помощью CSS, и он не должен мешать ни одному из ваших существующих классов.
< span class =" kl-variable " > $maxOption </ span >
pre > span . kl-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
{
private 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 ( ' /(</ ' . self :: IDENTIFIER . ' >)/ ' )),
' 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 ' ;
}
public static function getMetadata ()
{
return [
' name ' => [ ' xml ' ],
' mime ' => [ ' application/xml ' , ' text/xml ' ],
' extension ' => [ ' *.xml ' ]
];
}
}
Я постараюсь написать как можно больше определений, но любые пиар-сообщения приветствуются.
Многие языки могут использоваться одновременно: css или js внутри html , sql в
php и так далее. KeyLighter может без проблем обрабатывать и выделять встроенные языки.
Несмотря на то, что он не должен был быть самым быстрым средством подсветки кода в PHP, он все равно довольно быстрый, более чем в 2 раза быстрее, чем GeSHi.
KeyLighter использует phpunit
для тестирования:
$ ./vendor/bin/phpunit
Дел еще мало, все можно найти в Trello.
Подробности смотрите на CONTRIBUTING.md.
Мачею, Мацею и Монике за всю поддержку, моральную тоже.