Mais um Marcador de Sintaxe em PHP destinado a ser tão extensível e fácil de usar quanto possível, mas com o desempenho em mente.
Você pode experimentá-lo ao vivo com a versão mais recente em https://KeyLighter.kadet.net/.
O nome " KeyLighter " é inspirado no conceito Key Light em fotografia e cinematografia.
A luz principal é a primeira e geralmente a mais importante luz que um fotógrafo, diretor de fotografia, cinegrafista de iluminação ou outro compositor de cena usará em uma configuração de iluminação. O objetivo da luz principal é destacar a forma e a dimensão do assunto.
Supõe-se que KeyLighter faça a mesma coisa - para o código.
$ composer require kadet/ KeyLighter
Para usar KeyLighter você só precisa do PHP 7.3 ou posterior, sem necessidade de extensões especiais.
É possível instalar KeyLighter como uma biblioteca global de compositores
$ composer global require kadet/ KeyLighter
Então você pode usar o aplicativo de destaque CLI simples integrado:
$ KeyLighter [command = highlight] [-l | --language [LANGUAGE]] [-f | --format [FORMAT]] [-d | --debug [DEBUG]] [--] < path > ...
Se você quiser entrar no KeyLighter basta especificar php://stdin
como caminho. Você pode usar o comando list
para ver todos os comandos disponíveis e o argumento --help
para obter ajuda detalhada. Você não precisa especificar explicitamente o comando highlight
.
Você está usando o PowerShell no Windows? Legal! KeyLighter vem com módulo PowerShell integrado que torna o uso da CLI ainda melhor. Basta importar o módulo (por exemplo, no perfil) e você estará pronto para começar.
PS > Import-Module " ${ env: APPDATA} Composervendorkadet KeyLighter bin KeyLighter .psd1 "
Para usar os recursos de preenchimento automático, você precisará do PowerShell v5 (vem com o Windows 10) ou instalar o módulo 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 );
Você pode encontrar todos os idiomas disponíveis aqui e formatadores aqui.
KeyLighter foi originalmente projetado como marcador CLI para meu próprio uso, mas então decidi que deveria ser capaz de gerar qualquer saída possível, atualmente suportada:
KadetHighlighterFormatterCliFormatter
Pode até ser estilizado, os estilos padrão são armazenados em StylesCliDefault.php
, mas você pode simplesmente passar argumentos adicionais para um construtor:
new Kadet Highlighter Formatter CliFormatter ([
' string ' => [ ' color ' => ' green ' ],
' keyword ' => [ ' color ' => ' yellow ' ],
...
])
KadetHighlighterFormatterHtmlFormatter
Cada token é colocado dentro de seu próprio span
e as classes são prefixadas para que possam ser facilmente estilizadas com css e não interfiram em nenhuma de suas classes existentes
< span class =" kl-variable " > $maxOption </ span >
pre > span . kl-variable { color : # F7750D ; }
É fácil escrever seus próprios formatadores. Documentação em breve.
Alguns tokens são válidos em alguns contextos, outros não. Esta biblioteca é sensível ao contexto e você pode definir quando elas são válidas.
Neste caso, o contexto significa apenas "dentro de outro token", por exemplo, vamos supor que o token string
seja definido como tudo de "ao próximo" e keyword
seja definida como substring '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
Como você pode ver, keyword
está dentro de string
e, portanto, não é válida e deve ser excluída. Você pode definir tokens válidos apenas em algum contexto ou inválidos em outro.
Ah, e os nomes dos tokens estão em cascata, isso significa que string.single
é string
, mas string
não é necessariamente string.single
.
É possível estender facilmente KeyLighter
com novos idiomas, documentação mais detalhada em breve.
Por exemplo, a definição XML é semelhante a esta:
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 ' ]
];
}
}
Tentarei escrever tantas definições quanto puder, mas quaisquer PRs são bem-vindos.
Muitas linguagens podem ser usadas simultaneamente, css ou js dentro de html , sql em
php e assim por diante. KeyLighter pode manipular e destacar idiomas incorporados sem nenhum problema.
Mesmo que não fosse para ser o marcador de código mais rápido em PHP, ainda é bastante rápido, mais de 2x mais rápido que o GeSHi.
KeyLighter usa phpunit
para teste:
$ ./vendor/bin/phpunit
Ainda há poucas coisas para fazer, você encontra tudo no trello.
Consulte CONTRIBUTING.md para obter detalhes.
Para Maciej, Maciej e Monika por todo apoio, moral também.