เครื่องมือเน้นไวยากรณ์อีกตัวหนึ่งใน 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
อย่างชัดเจน
คุณกำลังใช้ 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 ' ]
];
}
}
ฉันจะพยายามเขียนคำจำกัดความให้มากที่สุดเท่าที่จะทำได้ แต่ยินดีต้อนรับ PR ใด ๆ
สามารถใช้หลายภาษาพร้อมกันได้ css หรือ js ภายใน html , sql in
php และอื่นๆ KeyLighter สามารถจัดการและเน้นภาษาที่ฝังไว้ได้โดยไม่มีปัญหา
แม้ว่าจะไม่ควรเป็นเครื่องมือเน้นโค้ดที่เร็วที่สุดใน PHP แต่ก็ยังค่อนข้างเร็ว เร็วกว่า GeSHIi มากกว่า 2 เท่า
KeyLighter ใช้ phpunit
สำหรับการทดสอบ:
$ ./vendor/bin/phpunit
ยังมีอีกหลายสิ่งที่ต้องทำ คุณสามารถค้นหาทั้งหมดได้บน trello
ดู CONTRIBUTING.md สำหรับรายละเอียด
สำหรับ Maciej, Maciej และ Monika สำหรับการสนับสนุนและคุณธรรมด้วยเช่นกัน