mensbeam / lit
PHP中的TextMate-like语法高亮
Requires
- php: ^8.0
- ext-dom: *
- ext-json: *
- mensbeam/framework: ^1.0
README
Lit是一个用PHP编写的多语言语法高亮器。它接收代码作为输入,并返回一个包含使用基于代码中标记的类span的HTML pre元素的HTML pre元素,以高亮显示代码。它基于Atom的Highlights,后者用于Atom文本编辑器中的代码语法高亮。Atom的Highlights本身是基于TextMate的语法高亮,使用其作用域选择器和编程语言组件的常见关键字的概念。Lit不是Atom的Highlights的移植,而是通过分析其他实现来独立实现我对TextMate语法语法、解析和标记化的理解。它旨在至少具有与Atom的Highlights相同或更好的功能。
使用前警告
这个库是实验性的。代码完全没有经过测试,为其编写测试将是一项艰巨的任务,因为没有可以测试的任何规范。还需要创建一个规范,这超出了仅为了解决痒点的项目的范围。由于同样的原因,Atom的Highlights本身也几乎没有经过测试。现在有大量没有测试套件的PHP库;没有一个是符合我们通常标准的。这就是为什么存在这个警告。
文档
MensBeam\Lit\Grammar::__construct
创建一个新的MensBeam\Lit\Grammar
对象。
public function MensBeam\Lit\Grammar::__construct(?string $scopeName = null, ?array $patterns = null, ?string $name = null, ?array $injections = null, ?array $repository = null)
参数
在库的正常使用中,参数不会被使用(请参阅MensBeam\Lit\Grammar::loadJSON
和下面的示例以获取更多信息),但为了完整性,以下列出了它们。
scopeName - 语法的作用域名称
patterns - 语法中的模式列表
name - 语法的人类可读名称
injections - 语法中的注入列表
repository - 语法中的存储库项列表
MensBeam\Lit\Grammar::loadJSON
将Atom JSON语法导入到MensBeam\Lit\Grammar
对象中。
public function MensBeam\Lit\Grammar::loadJSON(string $filename)
参数
filename - 要导入的JSON文件
MensBeam\Lit\GrammarRegistry::clear
清除注册表中的所有语法
public static function MensBeam\Lit\GrammarRegistry::clear()
MensBeam\Lit\GrammarRegistry::get
从注册表中检索语法
public static function MensBeam\Lit\GrammarRegistry::get(string $scopeName): Grammar|false
参数
scopeName - 被请求的语法的作用域名称(例如:text.html.php)
返回值
在成功时返回一个MensBeam\Lit\Grammar
对象,在失败时返回false
。
MensBeam\Lit\GrammarRegistry::set
从注册表中检索语法
public static function MensBeam\Lit\GrammarRegistry::set(string $scopeName, MensBeam\Lit\Grammar $grammar): bool
参数
scopeName - 被设置的语法的作用域名称(例如:text.html.php)
grammar - 要放入注册表的语法
返回值
在成功时返回true
,在失败时返回false
。
MensBeam\Lit\Highlight::toElement
突出显示传入的字符串数据,并输出一个PHP DOMElement
。
public static MensBeam\Lit\Highlight::toElement(string $data, string $scopeName, ?\DOMDocument $document = null, string $encoding = 'windows-1252'): \DOMElement
参数
data - 输入数据字符串
scopeName - 需要突出显示输入数据的语法的作用域名称(例如:text.html.php)
document - 一个现有的DOMDocument
,用作返回的DOMElement
的所有者文档;如果省略,则将创建一个
encoding - 输入数据字符串的编码;仅在未提供前一个参数的文档时使用,否则它使用现有DOMDocument
的编码;默认为HTML标准默认的windows-1252
返回值
返回一个
DOMElement
。
MenBeam\Lit\Highlight::toString
突出显示传入的字符串数据,并输出包含序列化HTML的字符串。
public static MensBeam\Lit\Highlight::toString(string $data, string $scopeName, string $encoding = 'windows-1252'): string
参数
data - 输入数据字符串
scopeName - 需要突出显示输入数据的语法的作用域名称(例如:text.html.php)
encoding - 输入数据字符串的编码;默认为HTML标准默认的windows-1252
返回值
返回一个字符串。
示例
以下是一个突出显示PHP代码的示例
$code = <<<CODE <?php echo "🐵 OOK! 🐵"; ?> CODE; // Use UTF-8 as the encoding to preserve the emojis. $element = MensBeam\Lit\Highlight::toElement($code, 'text.html.php', null, 'UTF-8'); $element->setAttribute('class', 'highlighted'); // Use PHP DOM's DOMDocument::saveHTML method to print the highlighted markup // when finished with manipulating it. echo $element->ownerDocument->saveHTML($element);
这将生成
<pre class="highlighted"><code class="text html php"><span class="meta embedded block php"><span class="punctuation section embedded begin php"><?php</span><span class="source php"> <span class="support function construct output php">echo</span> <span class="string quoted double php"><span class="punctuation definition string begin php">"</span>🐵 OOK! 🐵<span class="punctuation definition string end php">"</span></span><span class="punctuation terminator expression php">;</span> </span><span class="punctuation section embedded end php"><span class="source php">?</span>></span></span></code></pre>
可以使用已存在的DOMDocument
作为返回的pre
元素的拥有者文档
... $document = new DOMDocument(); // $element will be owned by $document. $element = MensBeam\Lit\Highlight::toElement($code, 'text.html.php', $document);
其他继承自并/或封装PHP DOM的DOM库,如MensBeam\HTML-DOM
,也可以使用
... $document = new MensBeam\HTML\DOM\Document(); // $element will be owned by $document. $element = MensBeam\Lit\Highlight::toElement($code, 'text.html.php', $document->innerNode); $element = $element->ownerDocument->getWrapperNode($element); // MensBeam\HTML\DOM\Element can simply be cast to a string to serialize. $string = (string)$element;
当然,Lit也可以简单地输出一个字符串
... $string = MensBeam\Lit\Highlight::toString($code, 'text.html.php');
Lit支持相当多的开箱即用的语言,但有时需要突出显示其他语言
... // Import a hypothetical Ook Atom JSON language grammar into a Grammar object // and add it to the registry. $grammar = new MensBeam\Lit\Grammar; $grammar->loadJSON('/path/to/source.ook.json'); MensBeam\Lit\GrammarRegistry::set($grammar->scopeName, $grammar); // Now the grammar can be used to highlight code $element = MensBeam\Lit\Highlight::toElement($code, $grammar->scopeName);
支持的语言与格式
- AppleScript
- C
- C#
- C# Cake文件
- C# 脚本文件
- C++
- CoffeeScript
- CSS
- Diff
- GitHub Flavored Markdown
- Git配置
- Go
- Go模块
- Go模板
- HTML
- Java
- Java表达式语言
- Java属性
- JavaScript
- JavaScript正则表达式
- JSDoc
- JSON
- Less
- Lua
- Makefile
- Markdown(CommonMark)
- Objective C
- Perl
- Perl 6
- PHP
- Plist
- Plist(XML,旧式)
- Python
- Python控制台
- Python正则表达式
- Python跟踪
- Ruby
- Ruby gemfile
- Ruby on Rails(RJS)
- Rust
- Sass
- SassDoc
- SCSS
- Shell(Bash)
- Shell会话(Bash)
- SQL
- SQL(Mustache)
- Textile
- 待办事项
- XML
- XSL