基本概念

highlight.js

一个用于在页面上高亮显示代码的 JavaScript 库。

theme 主题

指的是代码块的样式主题或外观设置。样式主题决定了代码块文本的颜色、背景颜色、字体样式以及其他与代码块显示相关的视觉属性。
通过选择不同的主题,你可以改变代码块的外观,以适应你的网站或应用程序的设计需求。

language 语言

指的是编程语言或文档格式的定义。

language aliase 语言别名

在 Highlight.js 中,语言别名是一种用于定义编程语言的缩写或其他常用名的机制。这些别名用一种便捷的方式,允许你使用一种熟悉的名称来引用特定语言模式,而无需记住或输入完整的语言名称。
通过使用语言别名,你可以在代码块的 HTML 标记中指定更简单、更容易理解的名称,而 Highlight.js 仍然能够识别并应用正确的语言模式。

language mode 语言模式

Highlight.js 库中的一个概念,指的是代码块所属的编程语言的定义和规则。每个编程语言都有其对应的语言模式,用于告诉 Highlight.js 如何识别和高亮显示代码块中的不同语法元素。这些语言模式包含了特定语言的语法规则和正则表达式模式,以帮助库正确地解析和着色代码块。
在 Highlight.js 中,每种编程语言都对应一个特定的语言模式,这些模式通常存储在库中的语法定义文件中。这些语法定义文件包含了与语言模式相关的信息,例如:语法规则、关键字、数据类型、注释、字符串、函数和方法等。

scope reference 作用域引用

在 Highlight.js 中,作用域引用通常指的是在语法定义文件中定义的命名作用域,用于标识和描述不同语法元素的范围。作用域引用是 Highlight.js 语法定义文件的一部分,用于定义代码高亮显示规则。
作用域引用的主要作用是将不同的语法元素与其在样式表(通常是 CSS)中定义的样式规则关联起来。通过为每个语法元素指定一个唯一的作用域引用,Highlight.js 可以根据语法规则将正确的样式应用到相应的元素上,从而实现代码高亮显示。
例如,如果你要高亮显示 JavaScript 中的关键字,可以在语法定义文件中定义一个作用域引用(如 keyword),然后将这个引用应用到 JavaScript 中的关键字规则中。接着,你可以在样式表中为 keyword 这个引用定义样式规则,以确定关键字的颜色、字体等样式。
总之,作用域引用是 Highlight.js 语法定义文件中用于标识和描述不同语法元素范围的一种机制,它们帮助实现代码高亮显示的样式和规则分离。通过为每个语法元素指定唯一的作用域引用,可以更容易地管理和自定义代码高亮的外观。

relevance 相关性

是一个表示代码块或语言模式的相关性得分的概念。这个得分用于衡量代码块与特定语言模式的匹配程度。通常,相关性得分越高,表示代码块越适合使用特定的语言模式进行高亮显示。
relevance 的主要作用是帮助 Highlight.js 在多个可能的语言模式之间选择最合适的模式来高亮显示代码块。当代码块的相关性得分高于一定阈值时,Highlight.js 将选择该模式进行高亮显示。这有助于避免将不相关的语言模式错误地应用于代码块,提高代码高亮的准确性。
相关性得分的计算通常基于代码块中的关键词、语法元素、注释等与特定语言模式匹配的程度。得分的计算方法可以根据 Highlight.js 的版本和语言模式的定义而有所不同。
总之,relevance 在 Highlight.js 中是一个用于衡量代码块与特定语言模式匹配程度的得分,帮助库选择正确的语言模式来高亮显示代码块,以提高代码高亮的准确性。

使用手册

plaintext 纯文本代码块

指的是一段纯文本格式的代码,其中没有任何的格式标记、样式或者其他的元素,仅仅是纯文本。这种代码块通常用于在文章、文档或者论坛帖子中展示代码,它不包含任何的语法高亮、折叠、缩进等功能。

common subset of languages 通用语言子集

在 highlight.js 中,通用语言子集指的是该库支持的一部分编程语言列表,它包含了 highlight.js 支持的主要编程语言和它们的变体,例如C、C++、Java、JavaScript、Python等。

semantic 语义化

是指将信息或者数据的含义明确地表达出来,以便于让计算机和人类都能够理解。在计算机编程中,语义化主要指在编写HTML、CSS、JavaScript等代码时,使用符合语义、易于理解的代码结构和命名,以便于维护和理解代码。

Web Worker

一种 JavaScript API,它允许开发者在浏览器中创建一个独立的、在后台运行的线程,以便在主线程之外执行代码。Web Worker 的主要目的是为了在浏览器中提高多线程的能力。

AMD

Asynchronous Module Definition(异步模块定义)的缩写,是一种定义模块的规范。AMD 的主要目标是在浏览器环境中实现模块化开发,允许 JavaScript 开发者异步加载代码和依赖项,从而提高应用程序的性能和可维护性。与 CommonJS 规范不同,AMD 规范支持异步加载模块,因此更适合于浏览器环境,而不是服务器端环境。

CommonJS

一种用于定义模块的规范,它主要用于服务器端的 JavaScript 开发。其主要目标是提供一种在服务器端开发中组织和重用代码的标准方法。与浏览器环境不同,服务器端环境通常支持同步加载代码和依赖项,因此 CommonJS 规范支持同步加载模块。
CommonJS 规范已经被广泛应用于服务器端的 JavaScript 开发,特别是在 Node.js 环境中。在 Node.js 中,使用 require 函数来加载模块是非常常见的方式。

RequireJS

一个基于 AMD 规范的 JavaScript 模块加载器,它允许开发者异步加载模块,这意味着模块只有在需要的时候才会被加载,从而提高了应用程序的性能。RequireJS 可以在浏览器环境和 Node.js 环境中使用。

Browserify

一个基于 CommonJS 规范的 JavaScript 模块加载器,它允许开发者像在 Node.js 中一样使用 require() 函数来加载模块。Browserify 可以将 Node.js 中的模块打包成适合在浏览器环境中使用的 JavaScript 文件。

Almond

它是 RequireJS 的一个瘦身版本,不依赖于 RequireJS 的其他组件。Almond 的主要目的是在生产环境中优化 JavaScript 应用程序的性能,通过将模块加载器的功能与应用程序打包在一起,从而减少了不必要的网络请求和文件大小。

SRI 子资源完整性

Subresource Integrity 的缩写,它是一种在 web 安全领域中用于验证外部脚本、样式表等子资源完整性的技术。
SRI 的工作原理是:在 HTML 的 link 和 script 标签中添加一个 integrity 属性,该属性的值是一个 hash 值,用于表示引入的子资源的内容的完整性。当浏览器加载该子资源时,会对其进行 hash 计算,并将计算结果与 integrity 属性中的值进行比较,如果一致,则表示该子资源没有被篡改,可以被安全加载;否则,浏览器会拒绝加载该子资源,从而避免恶意攻击和数据篡改。SRI 技术可以有效防止网络攻击,如 XSS 攻击、CDN 污染攻击等,提高 web 应用程序的安全性。

编译与测试

CI(持续集成)流程

CI(持续集成)流程通常由以下步骤组成:
1. 代码提交:开发人员将代码推送到 GitHub 上的代码仓库中。
2. 测试代码:CI 服务器会在收到代码后运行测试,这些测试可以是单元测试、集成测试等等。
3. 构建代码:如果测试通过,CI 服务器将会执行构建步骤,这可以包括编译代码、打包文件等等。
4. 部署代码:一旦构建完成,CI 服务器可以将代码部署到指定的环境中,如测试环境或生产环境。
5. 发送通知:最后,CI 服务器会向相关人员发送通知,以告知代码提交是否成功,并提供有关构建和测试结果的详细信息。
CI 的目的是在代码变更后快速发现并解决问题,确保代码质量并加速开发流程。

Mocha

Mocha 是一个流行的 JavaScript 测试框架,用于编写和运行前端和后端 JavaScript 应用程序的测试用例。它是一个灵活的测试框架,支持多种断言库和测试报告器,并能够在不同的 JavaScript 运行时环境中运行测试。

主题、语言、语言模式

parser 解析器

在 highlight.js 中,解析器(parser)是用于解析源代码并将其转换为标记化(tokenization)结果的组件。解析器以插件的形式实现,并被用于为不同的编程语言、标记语言、模板引擎等等提供高亮显示支持。每个解析器插件会定义一组语法规则(rules),用于匹配和标记化源代码中的各种语法元素。
当highlight.js需要对某段源代码进行高亮显示时,它会根据该代码所属的语言或文件格式选择相应的解析器插件,并调用其标记化方法来将源代码转换为标记化结果。标记化结果包含一系列标记(tokens),每个标记代表源代码中的一个语法元素,并包含其类型和内容等信息。随后,highlight.js 会根据标记类型和主题信息来渲染高亮显示效果。

look-ahead assertion 先行断言

是一种非捕获匹配(non-capturing match),它用于查找匹配某个模式之前必须满足另一个模式的情况。具体来说,先行断言用于确定一个位置在匹配字符串的开始之前或结束之后,以便在该位置后面或前面应用另一个模式。
先行断言有两种类型:
1. 正向先行断言(positive lookahead assertion):用于查找满足指定模式的字符串,但不包含在匹配结果中。
例如,正则表达式 foo(?=bar) 匹配以 'foo' 开头,并且后面跟着 'bar' 的字符串 'foobar' 中的 'foo'。在这个例子中,'(?=bar)' 是正向先行断言,表示 'foo' 之后必须紧跟着 'bar'。
反向先行断言(negative lookahead assertion):用于查找不满足指定模式的字符串,但也不包含在匹配结果中。
例如,正则表达式 foo(?!bar) 匹配以 'foo' 开头,并且后面不跟着 'bar' 的字符串 'foobaz' 中的 'foo'。在这个例子中,'(?!bar)' 是反向先行断言,表示 'foo' 之后不能跟着 'bar'。

look-behind assertion 后行断言

是一种零宽度断言,用于匹配在当前位置之前的文本。它用于指定一个正则表达式只有在某些文本之前出现才匹配成功,但是这些文本并不包含在匹配结果中。
后行断言的语法格式是(?<=pattern),其中 pattern 是一个普通的正则表达式,用于匹配需要出现在当前位置之前的文本。例如,(?<=foo)bar 表示只匹配紧跟在 'foo' 后面的 'bar',但不会包含 'foo' 在匹配结果中。
后行断言有两种类型:正向后行断言(positive lookbehind)和反向后行断言(negative lookbehind)。正向后行断言用于匹配在当前位置之前出现的文本,而负向后行断言用于匹配当前位置之前不出现的文本。

capture group 捕获组

在正则表达式中,捕获组(capture group)指的是被包含在括号(())中的一段正则表达式。当正则表达式匹配成功时,捕获组可以用来提取匹配的部分,以便进一步处理或分析。
举个例子,假设我们有一个字符串 hello world,我们想要提取其中的 hello 部分。我们可以使用正则表达式 /(\w+)\s/,其中 (\w+) 就是一个捕获组。

concatenated 正则连接

在正则表达式中,可以使用特定的字符或语法将多个正则表达式连接起来。这些字符或语法包括:
空格:使用空格可以将两个或多个正则表达式连接起来,表示它们需要按顺序依次匹配。
管道符(|):使用管道符可以将两个或多个正则表达式连接起来,表示它们中的任意一个都可以匹配成功。
方括号([]):使用方括号可以将多个字符或字符范围连接起来,表示需要匹配其中的任意一个字符。
大括号({}):使用大括号可以表示匹配特定次数的前一个字符或字符组。

syntactic sugar 语法糖

是指一种在不改变语言功能的情况下,通过简化代码的写法,使得程序员更易于编写和阅读代码的语法结构。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。举个例子:在 C 语言里用 a[i] 表示 *(a+i),用 a[i][j] 表示 *(*(a+i)+j)。

正则表达式字面量

是一种在编程语言中表示正则表达式的方式,通常使用两个斜杠(/)将正则表达式包裹起来,并可能包含一些修饰符。正则表达式字面量是一种方便的方式,允许你直接在代码中嵌入正则表达式,而不必使用字符串或其他方式来表示。
在许多编程语言中,包括 JavaScript、Perl、PHP 等,正则表达式字面量的一般语法是:/正则表达式模式/修饰符

作用域引用

CSS 选择器

CSS Selector 是一种用于选择 HTML 或 XML 文档中特定元素的字符串模式。