هناك أداة تمييز Syntax Highlighter أخرى في 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
على أنها سلسلة فرعية "الجلوس".
↓ 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، إلا أنه لا يزال سريعًا جدًا، أسرع مرتين من GeSHI.
يستخدم KeyLighter phpunit
للاختبار:
$ ./vendor/bin/phpunit
لا يزال هناك القليل من الأشياء التي يمكنك القيام بها، يمكنك العثور على كل شيء على trello.
راجع CONTRIBUTING.md للحصول على التفاصيل.
لماسيج وماسيج ومونيكا لكل الدعم المعنوي أيضًا.