PHP의 또 다른 구문 강조 표시는 확장 가능하고 사용하기 쉬우면서도 성능을 염두에 두고 만들어졌습니다.
https://KeyLighter.kadet.net/에서 최신 버전으로 라이브로 사용해 볼 수 있습니다.
" KeyLighter "라는 이름은 사진과 영화 촬영의 Key Light 개념에서 영감을 받았습니다.
주 조명은 사진 작가, 촬영 감독, 조명 카메라맨 또는 기타 장면 작곡가가 조명 설정에서 사용하는 첫 번째이자 일반적으로 가장 중요한 조명입니다. 주광의 목적은 피사체의 형태와 차원을 강조하는 것입니다.
KeyLighter 코드에 대해서도 동일한 작업을 수행해야 합니다.
$ composer require kadet/ KeyLighter
KeyLighter 사용하려면 PHP 7.3 이상이 필요하며 특별한 확장이 필요하지 않습니다.
KeyLighter 글로벌 작곡가 라이브러리로 설치할 수 있습니다.
$ 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
명령을 명시적으로 지정할 필요는 없습니다.
Windows에서 PowerShell을 사용하고 있나요? 시원한! KeyLighter CLI 사용을 더욱 향상시키는 통합 PowerShell 모듈이 함께 제공됩니다. 모듈(예: 프로필)을 가져오기만 하면 바로 사용할 수 있습니다.
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 ' ]
];
}
}
나는 가능한 한 많은 정의를 작성하려고 노력할 것이지만 어떤 PR도 환영합니다.
여러 언어를 동시에 사용할 수 있습니다. html 내부에서는 css 나 js , sql 에서는
php 등등. KeyLighter 내장된 언어를 문제 없이 처리하고 강조 표시할 수 있습니다.
PHP에서 가장 빠른 코드 하이라이터가 아니었음에도 불구하고 GeSHi보다 2배 이상 빠른 여전히 매우 빠릅니다.
KeyLighter 테스트를 위해 phpunit
사용합니다.
$ ./vendor/bin/phpunit
아직 할 일이 거의 없습니다. trello에서 모두 찾을 수 있습니다.
자세한 내용은 CONTRIBUTING.md를 참조하세요.
Maciej, Maciej 및 Monika의 모든 지원은 도덕적이기도 합니다.