PHP中的TextMate-like语法高亮

0.0.3 2022-01-12 22:58 UTC

This package is auto-updated.

Last update: 2024-09-08 12:27:05 UTC


README

Lit是一个用PHP编写的多语言语法高亮器。它接收代码作为输入,并返回一个包含使用基于代码中标记的类span的HTML pre元素的HTML pre元素,以高亮显示代码。它基于AtomHighlights,后者用于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">&lt;?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>&gt;</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