From 68de9bc49fd12a7a8bb5507a82bef6dfcf26d7fc Mon Sep 17 00:00:00 2001 From: minging Date: Sat, 2 Feb 2019 10:15:17 +0800 Subject: [PATCH 001/814] Update 03-Objects-Everywhere.md --- book/03-Objects-Everywhere.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index a6586deb..2ed68035 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -224,7 +224,7 @@ ATypeName a = new ATypeName(); ### 属性 -当我们创建好了一个类之后,我们可以往类里存放两种类型的元素。方法(**method**)和属性(**field**)。类的属性可以是基本类型。如果类的属性是对象的话,那么必须要初始化该引用将其关联到一个实际的对象上(通过之前介绍的创建对象的方法)。每个对象都都会为其属性保留独立的存储空间。通常,属性不再对象之间做共享。下面是一个包含部分属性的类的代码示例: +当我们创建好了一个类之后,我们可以往类里存放两种类型的元素。方法(**method**)和属性(**field**)。类的属性可以是基本类型。如果类的属性是对象的话,那么必须要初始化该引用将其关联到一个实际的对象上(通过之前介绍的创建对象的方法)。每个对象都会为其属性保留独立的存储空间。通常,属性不再对象之间做共享。下面是一个包含部分属性的类的代码示例: ```JAVA class DataOnly { From 85688e4a53c7d6e2c2e67932b3675aeec3dc85b6 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Tue, 26 Feb 2019 02:42:45 +0800 Subject: [PATCH 002/814] AUTOCOMMIT --- book/03-Objects-Everywhere.md | 74 +++++++++++++++-------------------- 1 file changed, 32 insertions(+), 42 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index 2ed68035..f7ed84ee 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -471,55 +471,45 @@ Incrementable.increment(); ## 小试牛刀 +最后,我们来开始编写第一个完整的程序。我们使用 Java 标准库来展示一个字符串和日期。 Finally, here’s the first complete program. It starts by displaying a String, followed by the date, using the Date class from the Java standard library. + +```JAVA + // objects/HelloDate.java import java.util.*; -public class HelloDate { -public static void main(String[] args) { -System.out.println("Hello, it's: "); -System.out.println(new Date()); -} + + public class HelloDate { + public static void main(String[] args) { + System.out.println("Hello, it's: "); + System.out.println(new Date()); + } } -In this book I treat the first line specially; it’s always a comment line -containing the the path information to the file (using the directory -name objects for this chapter) followed by the file name. I have -tools to automatically extract and test the book’s code based on this -information, and you will easily find the code example in the -repository by referring to the first line. -At the beginning of each program file, you must place import -statements to bring in any extra classes you need for the code in that -file. I say “extra” because there’s a certain library of classes -automatically included in every Java file: java.lang. Start up your -Web browser and look at the documentation from Oracle. If you -haven’t downloaded the JDK documentation from the Oracle Java site, do so -now8, or find it on the Internet. If you look at the list of packages, you’ll see -all the different class libraries that come with Java. -Select java.lang. This will bring up a list of all the classes that are -part of that library. Since java.lang is implicitly included in every -Java code file, these classes are automatically available. There’s no -Date class listed in java.lang, which means you must import -another library to use that. If you don’t know the library where a -particular class is, or if you want to see all classes, select “Tree” in the -Java documentation. Now you can find every single class that comes -with Java. Use the browser’s “find” function to find Date. You’ll see it -listed as java.util.Date, which tells you it’s in the util library -and you must import java.util.* in order to use Date. -If inside the documentation you select java.lang, then System, -you’ll see that the System class has several fields, and if you select -out, you’ll discover it’s a static PrintStream object. Since it’s -static, you don’t need to use new—the out object is always there, -and you can just use it. What you can do with this out object is -determined by its type: PrintStream. Conveniently, -PrintStream is shown in the description as a hyperlink, so if you -click on that, you’ll see a list of all the methods you can call for -PrintStream. There are quite a few, and these are covered later in -the book. For now all we’re interested in is println(), which in -effect means “Print what I’m giving you out to the console and end -with a newline.” Thus, in any Java program you can write something -like this: + +``` + +在这本书中,代码块的第一行,我将使用注释行,其中包含文件的路径信息(使用本章的目录名对象),后跟文件名。我的工具可以根据这些信息自动提取和测试书籍的代码,你也可以通过参考第一行注释信息轻松地在 Github 库中找到相应的代码示例。 + +如果你想在代码中使用到一些额外的库,那么你需要在程序文件的开始处使用 **import** 关键字来导入它们。之所以说是额外的,因为有一些库已经默认自动包含到每个文件里了。例如:**java.lang** 包。 + +现在打开你的浏览器在 [Oracle](https://www.oracle.com/) 上查看文档。如果你还没有在 [Oracle](https://www.oracle.com/) 网站上下载 JDK 文档,那就趁现在 ^[4] 。查看包列表,你会看到 Java 附带的所有不同的类库。 + +[^4]: 脚注预留 + + +选择 **java.lang**。这里显示的是该库中所有类的列表。由于 **java.lang** 隐式包含在每个 Java代码文件中,因此这些类是自动可用的。**java.lang** 中没有列出 **Date** 类,所以我们必须将其导入库才能使用它。如果你不清楚某个类名或者想查看所有的类,可以在 Java 文档中选择“Tree”。 + +现在,我们可以找到 Java 附带的每个类。使用浏览器的“查找”功能查找 “Date”。搜索结果中将会列出 java.util.Date,显而易见,它在 util 库中,所以我们必须导入 java.util.* 才能使用 Date。 + +如果你在文档中选择java.lang,然后选择 System,你会看到 System 类中有几个字段,如果你选择 `out`,你会发现它是一个静态的 PrintStream 对象。 所以 即使我们没有使用 new 创建, `out` 对象就已经存在并可以使用。 使用此 `out` 对象可以执行的操作取决于 PrintStream 。方便的是,PrintStream 在描述中显示为超链接,因此如果单击该链接,我们将看到可以为 PrintStream 所用的所有方法的列表。更多详情,将在本书后面介绍。现在我们感兴趣的是 println(),这个方法的作用是“打印我给你的东西到控制台并以换行符结束。”因此,Java程序中我们写下如下代码示例: + +```JAVA + System.out.println("A String of things"); +``` + whenever you want to display information to the console. One of the classes in the file must have the same name as the file. (The compiler complains if you don’t do this.) When you’re creating a From f80e0d5532466777e6c1be7b51b355c7de566091 Mon Sep 17 00:00:00 2001 From: LingCoder <34231795+LingCoder@users.noreply.github.com> Date: Mon, 11 Mar 2019 15:12:09 +0800 Subject: [PATCH 003/814] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 9b5300e1..39edf820 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,10 @@ - 最近公司项目赶着上线,等忙完继续! +## 一起交流 + +交流群:721698221 OnJava8翻译交流( 点击图标即可加入 )
+ ## 更新记录 - 2018-11-20 初始化项目 From b463f2a3d36ca89df17f2de504bf04d4bc012fef Mon Sep 17 00:00:00 2001 From: LingCoder <34231795+LingCoder@users.noreply.github.com> Date: Mon, 11 Mar 2019 15:20:11 +0800 Subject: [PATCH 004/814] Add files via upload --- images/QQGroupQRCode.png | Bin 0 -> 15366 bytes images/qqgroup.png | Bin 0 -> 2018 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/QQGroupQRCode.png create mode 100644 images/qqgroup.png diff --git a/images/QQGroupQRCode.png b/images/QQGroupQRCode.png new file mode 100644 index 0000000000000000000000000000000000000000..05d6ae404fc08a7b84f9c7b71eac0116e4f93360 GIT binary patch literal 15366 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 A`v3p{ literal 0 HcmV?d00001 From ecf485d07655fb8d7e0c4dcf3988c08246b396c3 Mon Sep 17 00:00:00 2001 From: LingCoder <34231795+LingCoder@users.noreply.github.com> Date: Mon, 11 Mar 2019 15:23:24 +0800 Subject: [PATCH 005/814] Update README.md --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 39edf820..c98a7d11 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,12 @@ ## 一起交流 -交流群:721698221 OnJava8翻译交流( 点击图标即可加入 )
+交流群:721698221 OnJava8翻译交流( 点击图标即可加入 )
+ +
+QQGroupQRCode +
+ ## 更新记录 From f45ca9ec9b8c3f2b840831bc52e8176e57c9a6e1 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 14 Mar 2019 06:16:15 +0800 Subject: [PATCH 006/814] autocommit --- book/03-Objects-Everywhere.md | 74 ++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index f7ed84ee..a9a217c7 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -503,36 +503,39 @@ import java.util.*; 现在,我们可以找到 Java 附带的每个类。使用浏览器的“查找”功能查找 “Date”。搜索结果中将会列出 java.util.Date,显而易见,它在 util 库中,所以我们必须导入 java.util.* 才能使用 Date。 -如果你在文档中选择java.lang,然后选择 System,你会看到 System 类中有几个字段,如果你选择 `out`,你会发现它是一个静态的 PrintStream 对象。 所以 即使我们没有使用 new 创建, `out` 对象就已经存在并可以使用。 使用此 `out` 对象可以执行的操作取决于 PrintStream 。方便的是,PrintStream 在描述中显示为超链接,因此如果单击该链接,我们将看到可以为 PrintStream 所用的所有方法的列表。更多详情,将在本书后面介绍。现在我们感兴趣的是 println(),这个方法的作用是“打印我给你的东西到控制台并以换行符结束。”因此,Java程序中我们写下如下代码示例: +如果你在文档中选择 java.lang,然后选择 System,你会看到 System 类中有几个字段,如果你选择 `out`,你会发现它是一个静态的 PrintStream 对象。 所以,即使我们没有使用 new 创建, `out` 对象就已经存在并可以使用。 `out` 对象可以执行的操作取决于 PrintStream 。 其在文档中的描述中显示为超链接,如果单击该链接,我们将可以看到 PrintStream 所对应的方法列表。(更多详情,将在本书后面介绍。) 现在我们重点说的是 println()这个方法。 它的作用是“j将信息输出到控制台,并以换行符结束。” 既然如此,我们可以这样编码来输出信息到控制带。 + +代码示例: ```JAVA System.out.println("A String of things"); ``` -whenever you want to display information to the console. -One of the classes in the file must have the same name as the file. (The -compiler complains if you don’t do this.) When you’re creating a -standalone program such as this one, the class with the name of the -file must contain an entry point from which the program starts. This -special method is called main(), with the following signature and -return type: +每个 java 源文件中允许有多个类。与此同时,源文件的名称必须要和其中一个类名相同,否则编译器将会报错。每个独立的程序应该包含一个 mian 方法作为程序运行的入口。其方法签名和返回类型如下 + +代码示例: + +```JAVA public static void main(String[] args) { -The public keyword means the method is available to the outside -world (described in detail in the Implementation Hiding chapter). The -argument to main() is an array of String objects. The args won’t -be used in the current program, but the Java compiler insists they be -there because they hold the arguments from the command line. -The line that prints the date is interesting: + +} +``` +关键字 `public` 表示方法可以被外界锁访问到。( 更多详情将在 **隐藏实现** 章节讲到) +main() 方法的参数是一个 字符串(String) 数组。 参数 `args` 并没有在当前的程序中使用到,但是 Java 虚拟机强制要求必须要有。 这是因为它们被用于保存命令行中的参数。 + +下面我们来看一段有趣的代码: + +```JAVA System.out.println(new Date()); -The argument is a Date object that is only created to send its value -(automatically converted to a String) to println(). As soon as -this statement is finished, that Date is unnecessary, and the garbage -collector can come along and get it anytime. We don’t worry about -cleaning it up. -When you look at the JDK documentation, you see that System has -many other useful methods (one of Java’s assets is its large set of -standard libraries). For example: +``` + +上面的示例中,我们创建了一个日期(Date)型对象并将其转化为字符串类型并输出到控制台中。 一旦这一行语句执行完毕,我们就不再需要该日期对象了。这时, JAVA 的垃圾回收器就可以将其占用的内存回收,我们无需去主动清除它们。 + +查看 JDK 文档,我们可以看到, **System** 类下还有很多其他有用的方法。( Java 的牛逼之处还在于,它拥有一个庞大的标准库资源。) 代码示例: + +```JAVA + // objects/ShowProperties.java public class ShowProperties { public static void main(String[] args) { @@ -542,7 +545,8 @@ System.out.println( System.getProperty("java.library.path")); } } -/* Output: (First 20 Lines) + +/* Output:(前20行) -- listing properties -- java.runtime.name=Java(TM) SE Runtime Environment sun.boot.library.path=C:\Program @@ -568,19 +572,17 @@ os.arch=amd64 java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\ ... */ -The first line in main() displays all “properties” from the system -where you are running the program, so it gives you environment -information. The list() method sends the results to its argument, -System.out. You will see later in the book that you can send the -results elsewhere, to a file, for example. You can also ask for a specific -property—here, user.name and java.library.path. -The /* Output: tag at the end of the file indicates the beginning of -the output generated by this file. Most examples in this book that -produce output will contain the output in this commented form, so -you see the output and know it is correct. The tag allows the output to -be automatically updated into the text of this book after being checked -with a compiler and executed. -Compiling and Running +``` + +上例主方法中的第一行,会输出所有的系统属性,也就是环境信息。 **list()** 方法将结果发送给它的参数 **System.out** 在本书的后面,我们还会接触到将结果输出到其他地方,如文件中。另外,我们还可以请求特定的属性。该例中我们使用到了 **user.name** 和 **java.library.path**。 末尾的 “/* Output:”标记表示此文件生成的输出的开头。本书中产生输出的大多数示例将会以包含此注释形式的输出,因此我们可以看到输出并知道它是正确的。带有这个标签允许在使用编译器检查并执行后将输出自动更新到本书的文本中。 + +您将在本书后面看到,您可以将结果发送到其他地方,例如。您还可以要求特定的属性 - here,user.name和java.library.path。文件末尾的/ * Output:标记表示此文件生成的输出的开头。本书中产生输出的大多数示例将包含此注释形式的输出,因此您可以看到输出并知道它是正确的。标签允许在使用编译器检查并执行后将输出自动更新到本书的文本中。 + + + +### 编译和运行 + + To compile and run this program, and all the other programs in this book, you must first have a Java programming environment. The installation process was described in Installing Java and the Book From 25f79dd717319ff51c8c3a9882e2b9bd74a491d3 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 14 Mar 2019 06:19:49 +0800 Subject: [PATCH 007/814] autocommit --- book/03-Objects-Everywhere.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index a9a217c7..21d16ee7 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -521,6 +521,7 @@ public static void main(String[] args) { } ``` + 关键字 `public` 表示方法可以被外界锁访问到。( 更多详情将在 **隐藏实现** 章节讲到) main() 方法的参数是一个 字符串(String) 数组。 参数 `args` 并没有在当前的程序中使用到,但是 Java 虚拟机强制要求必须要有。 这是因为它们被用于保存命令行中的参数。 @@ -576,9 +577,6 @@ java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\ 上例主方法中的第一行,会输出所有的系统属性,也就是环境信息。 **list()** 方法将结果发送给它的参数 **System.out** 在本书的后面,我们还会接触到将结果输出到其他地方,如文件中。另外,我们还可以请求特定的属性。该例中我们使用到了 **user.name** 和 **java.library.path**。 末尾的 “/* Output:”标记表示此文件生成的输出的开头。本书中产生输出的大多数示例将会以包含此注释形式的输出,因此我们可以看到输出并知道它是正确的。带有这个标签允许在使用编译器检查并执行后将输出自动更新到本书的文本中。 -您将在本书后面看到,您可以将结果发送到其他地方,例如。您还可以要求特定的属性 - here,user.name和java.library.path。文件末尾的/ * Output:标记表示此文件生成的输出的开头。本书中产生输出的大多数示例将包含此注释形式的输出,因此您可以看到输出并知道它是正确的。标签允许在使用编译器检查并执行后将输出自动更新到本书的文本中。 - - ### 编译和运行 From 6daeacab6b3d8a083d6b437ba775b2855fb4349f Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 14 Mar 2019 06:47:39 +0800 Subject: [PATCH 008/814] autocommit --- book/03-Objects-Everywhere.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index 21d16ee7..b67a2fa7 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -580,24 +580,15 @@ java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\ ### 编译和运行 +要编译和运行本书中的代码示例,首先必须具有Java编程环境。 第二章的示例中描述了安装过程。如果你遵循这些说明,那么你将会在不受 Oracle 的限制的条件下用到 Java 开发人员工具包(JDK)。如果你使用其他开发系统,请查看该系统的文档以确定如何编译和运行程序。 第二章还介绍了如何安装本书的示例。 -To compile and run this program, and all the other programs in this -book, you must first have a Java programming environment. The -installation process was described in Installing Java and the Book -Examples. If you followed these instructions, you are using the Java -Developer’s Kit (JDK), free from Oracle. If you use another -development system, look in the documentation for that system to -determine how to compile and run programs. -Installing Java and the Book Examples also describes how to install the -examples for this book. Move to the subdirectory named -objects and type: +移动到 objects 子目录下并键入: + +``` bash javac HelloDate.java -This command should produce no response. If you get any kind of an -error message, it means you haven’t installed the JDK properly and -you must investigate those problems. -On the other hand, if you just get your command prompt back, you can -type: -java HelloDate +``` + + and you’ll get the message and the date as output. This is the process to compile and run each program (containing a main()) in this book9. However, the source code for this book also has a file @@ -607,6 +598,15 @@ and running the files for the book. When you run the gradlew command for the first time, Gradle will automatically install itself (assuming you have Java installed). +此命令不应生成任何响应。如果我们收到任何类型的错误消息,则表示未正确安装 JDK,并且必须检查这些问题。 + +此外,仅仅是执行的话,则可以键入: + +```JAVA +java HelloDate +``` +我们将会获得信息反馈,日期输出。这是我们编译和运行本书中每个程序(包含main())的过程^[9]。但是,本书的源代码在根目录中也有一个名为 **build.gradle** 的文件,其中包含用于自动构建,测试和运行本书文件的 **Gradle** 配置。当您第一次运行 `gradlew` 命令时,**Gradle** 将自动安装(前提已安装Java)。 + ## 编码风格 From d991c521568d43f1a8301f63887f3a8652ca2705 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 14 Mar 2019 06:50:57 +0800 Subject: [PATCH 009/814] autocommit --- book/03-Objects-Everywhere.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index b67a2fa7..d786ef82 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -588,16 +588,6 @@ java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\ javac HelloDate.java ``` - -and you’ll get the message and the date as output. -This is the process to compile and run each program (containing a -main()) in this book9. However, the source code for this book also has a file -called build.gradle in the root directory, and this -contains the Gradle configuration for automatically building, testing, -and running the files for the book. When you run the gradlew -command for the first time, Gradle will automatically install itself -(assuming you have Java installed). - 此命令不应生成任何响应。如果我们收到任何类型的错误消息,则表示未正确安装 JDK,并且必须检查这些问题。 此外,仅仅是执行的话,则可以键入: From abb0d71218567b5cf089bb0e7d602e12034a2d79 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 14 Mar 2019 07:08:04 +0800 Subject: [PATCH 010/814] =?UTF-8?q?=E7=BC=96=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/03-Objects-Everywhere.md | 40 +++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index d786ef82..f2aac10e 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -600,26 +600,30 @@ java HelloDate ## 编码风格 -The style described in the document Code Conventions for the Java -Programming Language 10 is to capitalize the first letter of a class name. If -the class name consists of several words, they are run -together (that is, you don’t use underscores to separate the names), -and the first letter of each embedded word is capitalized, such as: -class AllTheColorsOfTheRainbow { // ... -This is sometimes called “camel-casing.” For almost everything else— -methods, fields (member variables), and object reference names—the -accepted style is just as it is for classes except that the first letter of the -identifier is lowercase. For example: + +Java 的代码约定规范(*Code Conventions for the Java Programming Language*)要求类名的首字母大写。 如果类名是由多个单词构成的,则每个单词的首字母都应大写(不采用下划线来分隔)例如: + +```JAVA class AllTheColorsOfTheRainbow { -int anIntegerRepresentingColors; -void changeTheHueOfTheColor(int newHue) { -// ... -} -// ... + // ``` +``` + + +这种风格也被称之为“驼峰式”。对于几乎所有其他方法,字段(成员变量)和对象引用名称 - 除了标识符的首字母是小写之外其他规范与类的命名一致。代码示例: + +```JAVA +class AllTheColorsOfTheRainbow { + int anIntegerRepresentingColors; + void changeTheHueOfTheColor(int newHue) { + // ... + } + // ... } -The user must also type these long names, so be merciful. -The Java code you find in the Oracle libraries also follows the -placement of open-and-close curly braces in this book. + +``` + +在 Oracle 的库中,开放式花括号的位置同样遵循和本书中相同的规范。 + ## 本章小结 From ecbdfa5cf63e0f7dcc503a4b2a7a53bfcb1f5e85 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 14 Mar 2019 07:11:15 +0800 Subject: [PATCH 011/814] autocommit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c98a7d11..5f17f748 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ - [x] 简介 - [x] 第一章 对象的概念 - [x] 第二章 安装Java和本书用例 -- [ ] 第三章 万物皆对象 +- [x] 第三章 万物皆对象 - [ ] 第四章 运算符 - [ ] 待续······ @@ -46,6 +46,8 @@ - 2019-01-06 第二章 安装Java和本书用例翻译完成 +- 2019-03-14 第三章 万物皆对象翻译完成 + ## 原书作者
From 29207bb9553725a0fa432090002c008464736861 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 14 Mar 2019 13:32:50 +0800 Subject: [PATCH 012/814] =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E4=BD=9C=E7=94=A8?= =?UTF-8?q?=E5=9F=9F=E4=BC=98=E5=8C=96=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/03-Objects-Everywhere.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index f2aac10e..a74aeb85 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -193,12 +193,11 @@ Java 对象与基本类型具有不同的生命周期。当我们使用 `new` } // 作用域结束 ``` -上例中,变量 s 的范围在标注的地方结束了。但是,引用的字符串对象依然还在占用内存。在这段代码中,变量 s 的唯一引用超出了作用域,因此它无法在作用域外被访问。在后面的章节中,你将学习到如何在编程过程中传递和复制对象的引用。 +上例中,变量 s 的范围在标注的地方结束了。但是,引用的字符串对象依然还在占用内存。在这段代码中,变量 s 的唯一引用超出了作用域,因此它无法在作用域外被访问。在后面的章节中,你我们还会学习怎么在编程中传递和复制对象的引用。 -只要你还需要它们,这些用 `new` 关键字创建出来的对象就不会消失。因此,这个在 C++ 编程中大量存在的问题在 Java 中消失了。在 C++ 中你不仅要确保对象在你操作的范围内存在,而且还必须在完成后销毁对象。 +只要程序需要, `new` 出来的对象就不会被销毁。 相比在 C++ 编码中操作内存可能会出现的诸多问题,这些困扰在 Java 中都不复存在了。在 C++ 中你不仅要确保对象的内存在你操作的范围内存在,还必须在完成后销毁对象。 -随之而来的问题:如果 Java 并没有清理周围的这些对象,那么它是如何避免 C++ 中出现的内存泄漏和程序终止的问题呢?答案是:Java 的垃圾收集器会查找所有 `new` 出来的对象并判断哪些不再可达。然后释放那些对象所占用的内存。这意味着我们不必再需要自己操作回收内存了。我们只需要简单的创建对象,当这些对象不再被需要时,它们能自行被垃圾收集器释放。这意味着您不必担心回收内存。您只需创建对象,当您不再需要时他们,他们自己消失。 -这就有效地防止了一类重要的编程问题:因程序员忘记释放内存而造成的“内存泄漏”。 +那么问题来了:我们在 Java 中并没有去主动清理这些对象,那么它是如何避免 C++ 中出现的内存泄漏和程序终止的问题呢?答案是:Java 的垃圾收集器会检查所有 `new` 出来的对象并判断哪些不再可达,继而释放那些被占用的内存。至此,我们不必再自己操作回收内存了。取而代之,只需简单创建对象即可。当其不再被需要时,能自行被垃圾收集器释放。垃圾回收机制有效防止了因程序员忘记释放内存而造成的“内存泄漏”问题。 ## 类的创建 From dc79b38ce5a72421057be465dbd5376e2555ece3 Mon Sep 17 00:00:00 2001 From: Langdon <575998772@qq.com> Date: Sun, 17 Mar 2019 10:51:04 +0800 Subject: [PATCH 013/814] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E7=AB=A0=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GLOSSARY.md | 1 + book/05-Control Flow.md | 776 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 777 insertions(+) create mode 100644 book/05-Control Flow.md diff --git a/GLOSSARY.md b/GLOSSARY.md index 51391107..9b18bbee 100644 --- a/GLOSSARY.md +++ b/GLOSSARY.md @@ -7,3 +7,4 @@ | **Aggregation** | 聚合,关联关系的一种,是强的关联关系| | **Composition** | 组合,关联关系的一种,是比聚合关系强的关系 | | **STL**(*the Standard Template Library*)| C++ 标准模板库| + diff --git a/book/05-Control Flow.md b/book/05-Control Flow.md new file mode 100644 index 00000000..d95f27c9 --- /dev/null +++ b/book/05-Control Flow.md @@ -0,0 +1,776 @@ +# 第五章 控制执行流程 + +> 程序操纵它的世界并做出选择。 在Java中,您可以使用执行控制语句进行选择。 + +Java使用C的所有执行控制语句,因此如果您使用C或C ++进行编程,那么您所看到的大部分内容都是熟悉的。 大多数过程编程语言都有某种控制语句,并且语言之间经常存在重叠。在Java中,关键字包括**if-else,while,do-while,for,return,break**和名为**switch**的选择语句。 但是,Java并不支持备受诟病的**goto**(它仍然是解决某些类型问题的最有效方法)。 你仍然可以进行类似goto的跳转,但它比其他语言中的**goto**更受限制。 + +[TOC] + +## true and flase + +条件表达式的示例是**a == b**。这里有一个条件表达式示例,它使用条件操作符**“==”**来查看**a**的值是否等于**b**的值。 表达式返回**true**或**false**。 如果显示条件表达式的结果,则会生成表示布尔值的字符串**“true”**和**“false”**。 + +```java +// control/TrueFalse.java +public class TrueFalse { + public static void main(String[] args) { + System.out.println(1 == 1); + System.out.println(1 == 2); + } +} +/* Output: +true false */ +``` + +您在上一章中看到的任何关系运算符都可以生成条件语句。 请注意,Java不允许您使用数字作为布尔值,即使它在C和C ++中允许(在这些语言中,真"为非零,而”假“是零)。如果想在布尔测试中使用非布尔值,例如**if(a**),必须首先使用一个条件表达式将其转换为布尔值,例如**if(a!= 0)**。 + +## if-else + +**if-else**语句是控制程序流程的最基本的形式。 其中的**else**是可选的,因此您可以使用两种形式的**if**: + +```java +if(Boolean-expression) + statement +``` + +或 + +```java +if(Boolean-expression) + statement +else + statement +``` + +布尔表达式必须生成布尔结果,statement指用分号结尾的简单语句,或复合语句——封闭在花括号内的一组简单语句。 每当使用“statement”一词时,它总是暗示语句可以是简单的或复合的。 + +作为**if-else**的一个例子,下面这个**test()**方法可以告诉您,您猜的数大于、小于还是等于目标数: + +```java +// control/IfElse.java +public class IfElse { + static int result = 0; + static void test(int testval, int target) { + if(testval > target) + result = +1; + else if(testval < target) // [1] + result = -1; + else + result = 0; // Match + } + public static void main(String[] args) { + test(10, 5); + System.out.println(result); + test(5, 10); + System.out.println(result); + test(5, 5); + System.out.println(result); + } +} +/* Output: +1 +-1 +0 +*/ +``` + +**[1]** “else if”不是新关键字,只是一个else后跟一个新的if语句。 + +尽管Java(如之前的C和C ++)是一种“自由格式”语言,但通常会缩进控件流语句的主体,以便读者可以轻松确定它的开始和结束位置。 + + + +## 迭代语句 + +循环由**while**,**do-while**和**for**控制,有时称为迭代语句。 语句会重复执行,直到起控制作用的**布尔表达式**(Boolean expression)计算为"假"。 +### while +while循环的形式是: + +```java +while(Boolean-expression) + statement +``` + +在循环开始时,会计算一次布尔表达式的值,而在语句的每次进一步迭代之前再次计算一次。 + +下面这个简单的例子将可产生随机数,直到满足特定条件: + +```java +// control/WhileTest.java + +public class WhileTest { + static boolean condition() { + boolean result = Math.random() < 0.99; + System.out.print(result + ", "); + return result; + } + public static void main(String[] args) { + while(condition()) + System.out.println("Inside 'while'"); + System.out.println("Exited 'while'"); + } +} +/* Output: (First and Last 5 Lines) +true, Inside 'while' +true, Inside 'while' +true, Inside 'while' +true, Inside 'while' +true, Inside 'while' +...________...________...________...________... +true, Inside 'while' +true, Inside 'while' +true, Inside 'while' +true, Inside 'while' +false, Exited 'while' +*/ +``` + +**condition()**方法用到了**Math**库里的**static**(静态)方法**random()**,该方法的作用是产生0和1之间 (包括0,但不包括1) 的一个**double**值。**result**的值是通过比较操作符<而得到它的,这个操作符产生**boolean**类型的结果。在打印**boolean**类型的值时,将自动地得到适合的字符串**true**或**false**。while的条件表达式意思是说:"只要**condition()**返回**true**,就重复执行循环体中的语句"。 + +### do-while + +**do-while**的格式如下: + +```java +do + statement +while(Boolean-expression); +``` + +**while**和**do-while**之间的唯一区别是**do-while**的语句总是至少执行一次,即使表达式第一次计算为false也是如此。 在**while**循环结构中,如果条件第一次就为**false**,那么其中的语句根本不会执行。在实际应用中,**while**比**do-while**更常用一点。 + +### for + +**for**循环可能是最常用的迭代形式。 该循环在第一次迭代之前执行初始化。 随后,它会执行条件测试,并在每次迭代结束时,进行某种形式的“步进”。**for**循环的形式是: + +```java +for(initialization; Boolean-expression; step) + statement +``` + +初始化(initialization)表达式、布尔表达式(Boolean-expression),或者步进(step)运算,都可以为空。在每次迭代之前都会测试表达式,并且一旦计算结果为false,就会在for语句后面的行继续执行。 在每个循环结束时,执行一次步进。 + +**for**循环通常用于“计数”任务: + +```java +// control/ListCharacters.java + +public class ListCharacters { + public static void main(String[] args) { + for(char c = 0; c < 128; c++) + if(Character.isLowerCase(c)) + System.out.println("value: " + (int)c + + " character: " + c); + } +} +/* Output: (First 10 Lines) +value: 97 character: a +value: 98 character: b +value: 99 character: c +value: 100 character: d +value: 101 character: e +value: 102 character: f +value: 103 character: g +value: 104 character: h +value: 105 character: i +value: 106 character: j +... +*/ +``` + +请注意,变量**c**在程序用到它的地方被定义的,也就是在for循环的控制表达式内,而不是在**main()**的开头。**c**的范围是由**for**控制的语句。 + +像C这样的传统过程语言要求在块的开头定义所有变量。 当编译器创建块时,它可以为这些变量分配空间。 在Java和C ++中,您可以在整个块中传播变量声明,并在需要时定义它们。 这允许更自然的编码风格并使代码更容易理解。[1] + +这个程序也使用了**java.lang.Character**包装器类,这个类不但能把**char**基本类型的值包装进对象,还提供了一些别的有用的方法。这里用到了**static isLowerCase()**方法来检查问题中的字符是否为小写字母。 + + + +#### 逗号操作符 + +逗号运算符(不是逗号分隔符,逗号作为分隔符用于分隔定义和方法参数)在Java中只有一个用法:在**for**循环的控制表达式中。 在控制表达式的初始化和步进控制中,您可以使用逗号分隔多个语句,并按顺序计算这些语句。使用逗号运算符,您可以在**for**语句中定义多个变量,但它们必须属于同一类型: + +```java +// control/CommaOperator.java + +public class CommaOperator { + public static void main(String[] args) { + for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) { + System.out.println("i = " + i + " j = " + j); + } + } +} +/* Output: +i = 1 j = 11 +i = 2 j = 4 +i = 3 j = 6 +i = 4 j = 8 +*/ +``` + +**for**语句中的**int**定义覆盖了**i**和**j**,在初始化部分实际上可以拥有任意数量的具有相同类型的变量定义。在控制表达式中定义变量的能力仅限于**for**循环。 您不能将此方法与任何其他选择或迭代语句一起使用。 + +可以看到,无论在初始化还是在步进部分,语句都是顺序执行的。 + +## for-in语法 + +Java 5引入了更简洁的**for**语法,用于数组和集合(您将在“数组和集合”章节中了解更多有关这些内容的信息)。 这有时被称为**增强版for循环**,并且您将看到的大部分文档称为*for-each*语法,但Java 8添加了大量使用的**forEach()**。 这会混淆术语,所以我拿了一些许可证,而是称之为*for-in*(例如,在Python中,你实际上是**for x in sequence**,所以有合理的先例)。 请记住,您可能会在其他地方看到它的不同叫法。 + +**for-in**会自动为您生成每个项,因此你不必创建**int**变量去对由访问项构成的序列进行奇数。 例如,假设您有一个**float**数组,并且您想要选取该数组中的每个元素: + +```java +// control/ForInFloat.java + +import java.util.*; + +public class ForInFloat { + public static void main(String[] args) { + Random rand = new Random(47); + float[] f = new float[10]; + for(int i = 0; i < 10; i++) + f[i] = rand.nextFloat(); + for(float x : f) + System.out.println(x); + } +} +/* Output: +0.72711575 +0.39982635 +0.5309454 +0.0534122 +0.16020656 +0.57799757 +0.18847865 +0.4170137 +0.51660204 +0.73734957 +*/ +``` + +这个数组是用旧式的for循环组装的,因为在组装时必须按索引访问它。在下面这行中可以看到foreach方法: + +```java +for(float x : f) { +``` + +这条语句定义了一个**float**类型的变量**x**,继而将每一个**f**的元素赋值给**x**。 + +任何返回一个数组的方法都可以使用**for-in**。例如**String**类有一个方法**toCharArray()**,它返回一个**char**数组,因此可以很容易地下像下面这样迭代在字符串里面的所有字符: + +```java +// control/ForInString.java + +public class ForInString { + public static void main(String[] args) { + for(char c : "An African Swallow".toCharArray()) + System.out.print(c + " "); + } +} +/* Output: +A n A f r i c a n S w a l l o w +*/ +``` + +就像在集合的章节所看到的,for-in还可以用于任何**iterable**对象。 + +许多**for**语句都会在一个整型值序列中步进,就像下面这样: + +```java +for(int i = 0; i < 100; i++) +``` + +对于这样的语句,for-in语法将不起作用,除非先创建一个**int**数组。为了简化这些任务,我会在**onjava.Range**包中创建一个名为**range()**的方法,它将自动生成恰当的数组。 + +隐藏实施过程这一章节( Implementation Hiding )介绍了静态导入。 但是,您无需了解这些详细信息即可开始使用此库。 你可以在**import**语句中看到**static import**语法: + +```java +// control/ForInInt.java + +import static onjava.Range.*; + +public class ForInInt { + public static void main(String[] args) { + for(int i : range(10)) // 0..9 + System.out.print(i + " "); + System.out.println(); + for(int i : range(5, 10)) // 5..9 + System.out.print(i + " "); + System.out.println(); + for(int i : range(5, 20, 3)) // 5..20 step 3 + System.out.print(i + " "); + System.out.println(); + for(int i : range(20, 5, -3)) // Count down + System.out.print(i + " "); + System.out.println(); + } +} +/* Output: +0 1 2 3 4 5 6 7 8 9 +5 6 7 8 9 +5 8 11 14 17 +20 17 14 11 8 +*/ +``` + +**range()**方法已经被重载,重载表示相同的方法名可以具有不同的参数列表(你将很快学习重载)。**range()**的第一个种重载形式是从0开始产生值,直到范围的上限,但不包括该上限。第二种重载形式是从第一个值开始产生值,直至比第二值小1的值为止。第三种形式有一个步进值,因此它每次的增量为该值。第四种**range()**表明还可以递减。**range()**是所谓生成器的一个非常简单的版本,有关生成器的内容将在本书稍后进行介绍。 + +**range()**允许在更多地方使用for-in语法,因此可以说提高可读性。 + +请注意,**System.out.print()**不会输出换行符,因此您可以分段输出一行。 + +*for-in*语法不仅可以节省编写代码的时间。 更重要的是,它更容易阅读并说明你要做什么(获取数组的每个元素)而不是详细说明你是如何做到的(“我正在创建这个索引,所以我可以使用它来选择每个数组元素。“)。 本书只要有可能就会使用*for-in*语法。 + +## return + +在Java中有几个关键字代表无条件分支,这意味着分支在没有任何测试的情况下发生。 这些包括**return**,**break**,**continue**和跳转到带标签语句的方法,类似于其他语言中的**goto**。 + +**return**关键字有两方面的用途:一方面指定一个方法返回什么值(假设它没有**void**返回值),另一方面它会导致当前的方法退出,并返回那个值。可据此改写上面的**IfElse.java**里的**test()**方法,使其利用这些特点: + +```java +// control/TestWithReturn.java + +public class TestWithReturn { + static int test(int testval, int target) { + if(testval > target) + return +1; + if(testval < target) + return -1; + return 0; // Match + } + public static void main(String[] args) { + System.out.println(test(10, 5)); + System.out.println(test(5, 10)); + System.out.println(test(5, 5)); + } +} +/* Output: +1 +-1 +0 +*/ +``` + +不需要**else**,因为该方法在执行返回后不会继续执行。 + +如果在返回**void**的方法中没有**return**语句,则在该方法结束时会有一个隐式的**return**,因此一个方法中并不总是需要包含**return**语句。 但是,如果您的方法声明它将返回除**void**之外的任何返回类型,则必须确保每个代码路径都返回一个值。 + +## break and continue + +在任何迭代语句的主体部分,都可以使用**break**和**continue**来控制循环的流程。 其中,**break**退出循环而不执行循环中的其余语句。 而**continue**停止执行当前的迭代,然后退回循环起始处,以开始下一次迭代。 + +下面这个程序向大家展示了**break**和**continue**在**for**和**while**循环中的例子: + +```java +// control/BreakAndContinue.java +// Break and continue keywords + +import static onjava.Range.*; + +public class BreakAndContinue { + public static void main(String[] args) { + for(int i = 0; i < 100; i++) { // [1] + if(i == 74) break; // Out of for loop + if(i % 9 != 0) continue; // Next iteration + System.out.print(i + " "); + } + System.out.println(); + // Using for-in: + for(int i : range(100)) { // [2] + if(i == 74) break; // Out of for loop + if(i % 9 != 0) continue; // Next iteration + System.out.print(i + " "); + } + System.out.println(); + int i = 0; + // An "infinite loop": + while(true) { // [3] + i++; + int j = i * 27; + if(j == 1269) break; // Out of loop + if(i % 10 != 0) continue; // Top of loop + System.out.print(i + " "); + } + } +} +/* Output: +0 9 18 27 36 45 54 63 72 +0 9 18 27 36 45 54 63 72 +10 20 30 40 +*/ +``` + +**[1]**在这个**for**循环中,**i**的值永远不会达到100;因为一旦**i**达到74,**break**语句就会中断循环。通常,只有在不知道中断条件何时满足时,才需要这样使用**break**。因为**i**不能被9整除,**continue**语句就会使执行过程返回到循环的最开头(这使**i**递增)。如果能够整除,则将值显示出来。 + +**[2]**使用for-in语法将产生相同的结果。 + +**[3]**最后,可以看到一个"无穷**while**循环"的情况。然而,循环内部有一个**break**语句,可中止循环。请注意,**continue**语句将控制权移回循环的顶部,而不会执行**continue**之后的任何操作。 因此,只有当i的值可被10整除时才会显示。在输出中,显示值0,因为0%9产生0。 + +无限循环的另一种形式是**for(;;)**。 编译器以同样的方式处理**while(true)**和**for(;;)**,因此使用哪种取决于编程品味。 + + + +## 臭名昭著的goto + +goto关键字很早就在程序设计语言中出现。事实上,goto是汇编语言的程序控制结构的始 祖:“若条件A,则跳到这里;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码,就 会发现程序控制里包含了许多跳转。然而,goto是在源码的级别跳转的,所以招致了不好的 声誉。若程序总是从一个地方跳到另一个地方,还有什么办法能识别代码的流程呢?随着 Edsger Dijkstra著名的“Goto有害”论的问世,goto便从此失宠。 + +事实上,真正的问题并不在于使用goto,而在于goto的滥用。而且在一些少见的情况下,goto 是组织控制流程的最佳手段。 + +尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在 break和continue这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳 转,而是中断循环语句的一种方法。之所以把它们纳入goto问题中一起讨论,是由于它们使 用了相同的机制:标签。 + +“标签”是后面跟一个冒号的标识符,就象下面这样: + +```java +label1: +``` + +对Java来说,唯一用到标签的地方是在循环语句之前。进一步说,它实际需要紧靠在循环语 句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一 理由是:我们希望在其中嵌套另一个循环或者一个开关。这是由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。如下所示: + +```java +label1: +outer-iteration { + inner-iteration { + // ... + break; // [1] + // ... + continue; // [2] + // ... + continue label1; // [3] + // ... + break label1; // [4] + } +} +``` + +**[1]** **break**中断内部循环,并在外部循环结束。 + +**[2]**,**continue**移回内部循环的 起始处。但在条件3中,**continue label1**却同时中断内部循环以及外部循环,并移至**label1** 处。 + +**[3]**随后,它实际是继续循环,但却从外部循环开始。 + +**[4]**,**break label1**也会中断所有循环,并回到**label1**处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。 + +下面是for循环的一个例子: + +```java +// control/LabeledFor.java +// For loops with "labeled break"/"labeled continue." + +public class LabeledFor { + public static void main(String[] args) { + int i = 0; + outer: // Can't have statements here + for(; true ;) { // infinite loop + inner: // Can't have statements here + for(; i < 10; i++) { + System.out.println("i = " + i); + if(i == 2) { + System.out.println("continue"); + continue; + } + if(i == 3) { + System.out.println("break"); + i++; // Otherwise i never + // gets incremented. + break; + } + if(i == 7) { + System.out.println("continue outer"); + i++; // Otherwise i never + // gets incremented. + continue outer; + } + if(i == 8) { + System.out.println("break outer"); + break outer; + } + for(int k = 0; k < 5; k++) { + if(k == 3) { + System.out.println("continue inner"); + continue inner; + } + } + } + } + // Can't break or continue to labels here + } +} +/* Output: +i = 0 +continue inner +i = 1 +continue inner +i = 2 +continue +i = 3 +break +i = 4 +continue inner +i = 5 +continue inner +i = 6 +continue inner +i = 7 +continue outer +i = 8 +break outer +*/ +``` + +注意**break**会中断**for**循环,而且在抵达**for**循环的末尾之前,递增表达式不会执行。由于**break** 跳过了递增表达式,所以递增会在**i==3**的情况下直接执行。在**i==7**的情况下,**continue outer** 语句也会到达循环顶部,而且也会跳过递增,所以它也是直接递增的。 + +如果没有**break outer**语句,就没有办法在一个内部循环里找到出外部循环的路径。这是由于 **break**本身只能中断最内层的循环(对于**continue**同样如此)。 当然,若想在中断循环的同时退出方法,简单地用一个**return**即可。 + +下面这个例子向大家展示了带标签的**break**以及**continue**语句在**while**循环中的用法: + +```java +// control/LabeledWhile.java +// "While" with "labeled break" and "labeled continue." + +public class LabeledWhile { + public static void main(String[] args) { + int i = 0; + outer: + while(true) { + System.out.println("Outer while loop"); + while(true) { + i++; + System.out.println("i = " + i); + if(i == 1) { + System.out.println("continue"); + continue; + } + if(i == 3) { + System.out.println("continue outer"); + continue outer; + } + if(i == 5) { + System.out.println("break"); + break; + } + if(i == 7) { + System.out.println("break outer"); + break outer; + } + } + } + } +} +/* Output: +Outer while loop +i = 1 +continue +i = 2 +i = 3 +continue outer +Outer while loop +i = 4 +i = 5 +break +Outer while loop +i = 6 +i = 7 +break outer +*/ +``` + +同样的规则亦适用于**while**: + +(1) 简单的一个**continue**会退回最内层循环的开头(顶部),并继续执行。 + +(2) 带有标签的**continue**会到达标签的位置,并重新进入紧接在那个标签后面的循环。 + +(3) **break**会中断当前循环,并移离当前标签的末尾。 + +(4) 带标签的**break**会中断当前循环,并移离由那个标签指示的循环的末尾。 + +大家要记住的重点是:在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中**break**或**continue**。 + +**break**和**continue**标签已经成为相对少用的推测特征(在前面的语言中很少或没有先例),所以你很少在代码里看到它们。 + +在**Dijkstra**的**“Goto有害”**论中,他最反对的就是标签,而非**goto**。随着标签在一个程序里数量 的增多,他发现产生错误的机会也越来越多。标签和**goto**使我们难于对程序作静态分析。但是,Java标签不会造成这方面的问题,因为它们的应用场合已经收到了限制,没有特别的方式用于概念程序的控制。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。 + +## switch + +**switch**有时也被划归为一种选择语句。根据整数表达式的值,**switch**语句可以从一系列代码中选出一段去执行。它的格式如下: + +```java +switch(integral-selector) { + case integral-value1 : statement; break; + case integral-value2 : statement; break; + case integral-value3 : statement; break; + case integral-value4 : statement; break; + case integral-value5 : statement; break; + // ... + default: statement; +} +``` + +其中,integral-selector(整数选择因子)是一个能够产生整数值的表达式,**switch**能够将这个表达式的结果与每个integral-value(整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相 符的,就执行default语句。 + +在上面的定义中,大家会注意到每个**case**均以一个**break**结尾。这样可使执行流程跳转至 switch主体的末尾。这是构建**switch**语句的一种传统方式,但**break**是可选的。若省略break, 会继续执行后面的**case**语句的代码,直到遇到一个**break**为止。尽管通常不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的**default**语句没有**break**,因为执行流程已到了break的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在**default** 语句的末尾放置一个**break**,尽管它并没有任何实际的用处。 + +switch语句是实现多路选择的一种干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是int或char那样的整数值。例如,假若将一个字串或者浮点数 作为选择因子使用,那么它们在switch语句里是不会工作的。对于非整数类型,则必须使用一 系列if语句。 下面这个例子可随机生成字母,并判断它们是元音还是辅音字母: + +```java +// control/VowelsAndConsonants.java + +// Demonstrates the switch statement +import java.util.*; + +public class VowelsAndConsonants { + public static void main(String[] args) { + Random rand = new Random(47); + for(int i = 0; i < 100; i++) { + int c = rand.nextInt(26) + 'a'; + System.out.print((char)c + ", " + c + ": "); + switch(c) { + case 'a': + case 'e': + case 'i': + case 'o': + case 'u': System.out.println("vowel"); + break; + case 'y': + case 'w': System.out.println("Sometimes vowel"); + break; + default: System.out.println("consonant"); + } + } + } +} +/* Output: (First 13 Lines) +y, 121: Sometimes vowel +n, 110: consonant +z, 122: consonant +b, 98: consonant +r, 114: consonant +n, 110: consonant +y, 121: Sometimes vowel +g, 103: consonant +c, 99: consonant +f, 102: consonant +o, 111: vowel +w, 119: Sometimes vowel +z, 122: consonant +... +*/ +``` + +由于**Random.nextInt(26)**会产生0到26之间的一个值,所以在其上加上一个偏移量"a",即可产生小写字母。在**case**语句中,使用单引号引起的字符也会产生用于比较的整数值。 + +请注意**case**语句能够堆叠在一起,为一段代码形成多重匹配,即只要符合多种条件中的一种,就执行那段特别的代码。这时也应该注意将**break**语句置于特定**case**的末尾,否则控制流程会简单地下移,处理后面的**case**。 + +在下面的语句中: + +```java +int c = rand.nextInt(26) + 'a'; +``` + +**Random.nextInt()**将产生0~25之间的一个随机**int**值,它将被加到**"a"**上。这表示**"a"**将自动被转换为**int**以执行假发。为了把**c**当作字符打印,必须将其转型为**char**;否则,将产生整数输出。 + +##Switching on Strings + +Java 7增加了在字符串上**switch**的用法。 此示例展示了您从一组String可能性中选择的旧方法,以及使用switch的新方法: + +```java +// control/StringSwitch.java + +public class StringSwitch { + public static void main(String[] args) { + String color = "red"; + // Old way: using if-then + if("red".equals(color)) { + System.out.println("RED"); + } else if("green".equals(color)) { + System.out.println("GREEN"); + } else if("blue".equals(color)) { + System.out.println("BLUE"); + } else if("yellow".equals(color)) { + System.out.println("YELLOW"); + } else { + System.out.println("Unknown"); + } + // New way: Strings in switch + switch(color) { + case "red": + System.out.println("RED"); + break; + case "green": + System.out.println("GREEN"); + break; + case "blue": + System.out.println("BLUE"); + break; + case "yellow": + System.out.println("YELLOW"); + break; + default: + System.out.println("Unknown"); + break; + } + } +} +/* Output: +RED +RED +*/ +``` + +一旦理解了switch,这种语法就是一个逻辑扩展。 结果更清晰,更易于理解和维护。 + +作为**switch**字符串的第二个例子,我们重新访问Math.random()。 它是否产生从0到1的值,包括还是不包括值“1”? 在数学术语中,是(0,1),还是[0,1],还是(0,1)还是[0,1]? (方括号表示“包括”,而括号表示“不包括”。) + +下面一个可能提供答案的测试程序。 所有命令行参数都作为**String**对象传递,因此我们可以**switch**参数来决定要做什么。 有一个问题:用户可能不提供任何参数,因此索引到args数组会导致程序失败。 要解决这个问题,我们检查数组的长度,如果它为零,我们使用一个空字符串,否则我们选择**args**数组中的第一个元素: + +```java +// control/RandomBounds.java + +// Does Math.random() produce 0.0 and 1.0? +// {java RandomBounds lower} +import onjava.*; + +public class RandomBounds { + public static void main(String[] args) { + new TimedAbort(3); + switch(args.length == 0 ? "" : args[0]) { + case "lower": + while(Math.random() != 0.0) + ; // Keep trying + System.out.println("Produced 0.0!"); + break; + case "upper": + while(Math.random() != 1.0) + ; // Keep trying + System.out.println("Produced 1.0!"); + break; + default: + System.out.println("Usage:"); + System.out.println("\tRandomBounds lower"); + System.out.println("\tRandomBounds upper"); + System.exit(1); + } + } +} +``` + +要运行该程序,请键入以下任一命令: + +```java +java RandomBounds lower +or +java RandomBounds upper +``` + +使用onjava包中的TimedAbort类,程序在三秒后中止,因此看起来Math.random()从不生成0.0或1.0。 但这就是这样一个实验可以欺骗的地方。 如果考虑0到1之间所有不同**double**类型的分数(double fractions)的数量,实验中达到任何一个值的可能性可能超过一台计算机甚至一个实验者的寿命。 结果是0.0包含在**Math.random()**的输出中,而1.0则不包括在内。 在数学术语中,它是[0,1)。 您必须小心分析您的实验并了解它们的局限性。结果是0.0包含在**Math.random()**的输出中,而1.0则不包括在内。 在数学术语中,它是[0,1)。 您必须小心分析您的实验并了解它们的局限性。 + + + +## Summary + +本章总结了我们对大多数编程语言中出现的基本特征的探索:计算,运算符优先级,类型转换,选择和迭代。 现在,您已准备好开始采取措施,使您更接近面向对象和函数式编程的世界。 下一章将介绍初始化和清理对象的重要问题,接下来的章节将介绍隐藏实现细节(implementation hiding)的这一核心概念。 + + + +1. 在早期的语言中,大量的决策都是基于使编译器编写者的生活更轻松。 你会发现,在现代语言中,大多数设计决策都会让语言用户的生活更轻松,尽管有时会有妥协 - 这通常会让语言设计师感到后悔。 + +2. 请注意,这似乎是一个难以支持的主张,并且很可能是称为相关因果关系谬误的认知偏差的一个例子 \ No newline at end of file From 49b99f0d8f447c5f3be76547c15c460d2945f07d Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 17 Mar 2019 12:22:00 +0800 Subject: [PATCH 014/814] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 1 + book/{05-Control Flow.md => 05-Control-Flow.md} | 0 2 files changed, 1 insertion(+) rename book/{05-Control Flow.md => 05-Control-Flow.md} (100%) diff --git a/SUMMARY.md b/SUMMARY.md index 23312f60..03c7a518 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -52,5 +52,6 @@ * [编码风格](book/03-Objects-Everywhere.md#编码风格) * [本章小结](book/03-Objects-Everywhere.md#本章小结) * [第四章 运算符](book/04-Operators.md) +* [第五章 控制流](book/05-Control-Flow.md) * [词汇表](GLOSSARY.md) diff --git a/book/05-Control Flow.md b/book/05-Control-Flow.md similarity index 100% rename from book/05-Control Flow.md rename to book/05-Control-Flow.md From e125ea74a85eead23a69d80f25fca4e582ef7d1d Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 17 Mar 2019 12:42:09 +0800 Subject: [PATCH 015/814] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + book/05-Control-Flow.md | 137 ++++++++++++++++++++-------------------- 2 files changed, 71 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 5f17f748..2535617a 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ - [x] 第二章 安装Java和本书用例 - [x] 第三章 万物皆对象 - [ ] 第四章 运算符 +- [x] 第五章 控制流 - [ ] 待续······ - 最近公司项目赶着上线,等忙完继续! diff --git a/book/05-Control-Flow.md b/book/05-Control-Flow.md index d95f27c9..ea20bd69 100644 --- a/book/05-Control-Flow.md +++ b/book/05-Control-Flow.md @@ -1,14 +1,14 @@ -# 第五章 控制执行流程 +# 第五章 控制流 > 程序操纵它的世界并做出选择。 在Java中,您可以使用执行控制语句进行选择。 -Java使用C的所有执行控制语句,因此如果您使用C或C ++进行编程,那么您所看到的大部分内容都是熟悉的。 大多数过程编程语言都有某种控制语句,并且语言之间经常存在重叠。在Java中,关键字包括**if-else,while,do-while,for,return,break**和名为**switch**的选择语句。 但是,Java并不支持备受诟病的**goto**(它仍然是解决某些类型问题的最有效方法)。 你仍然可以进行类似goto的跳转,但它比其他语言中的**goto**更受限制。 +Java 使用 C 的所有执行控制语句,因此如果您使用 C 或 C++ 进行编程,那么您所看到的大部分内容都是熟悉的。 大多数过程编程语言都有某种控制语句,并且语言之间经常存在重叠。在 Java 中,关键字包括 **if-else,while,do-while,for,return,break** 和名为 **switch** 的选择语句。 但是,Java并不支持备受诟病的**goto**(它仍然是解决某些类型问题的最有效方法)。 你仍然可以进行类似goto的跳转,但它比其他语言中的**goto**更受限制。 [TOC] ## true and flase -条件表达式的示例是**a == b**。这里有一个条件表达式示例,它使用条件操作符**“==”**来查看**a**的值是否等于**b**的值。 表达式返回**true**或**false**。 如果显示条件表达式的结果,则会生成表示布尔值的字符串**“true”**和**“false”**。 +条件表达式的示例是 **a == b**。这里有一个条件表达式示例,它使用条件操作符**“==”**来查看 **a**的值是否等于 **b** 的值。 表达式返回 **true** 或 **false**。 如果显示条件表达式的结果,则会生成表示布尔值的字符串 **“true”** 和 **“false”**。 ```java // control/TrueFalse.java @@ -22,11 +22,11 @@ public class TrueFalse { true false */ ``` -您在上一章中看到的任何关系运算符都可以生成条件语句。 请注意,Java不允许您使用数字作为布尔值,即使它在C和C ++中允许(在这些语言中,真"为非零,而”假“是零)。如果想在布尔测试中使用非布尔值,例如**if(a**),必须首先使用一个条件表达式将其转换为布尔值,例如**if(a!= 0)**。 +您在上一章中看到的任何关系运算符都可以生成条件语句。 请注意,Java 不允许您使用数字作为布尔值,即使它在 C 和 C++ 中允许(在这些语言中,真"为非零,而”假“是零)。如果想在布尔测试中使用非布尔值,例如**if(a**),必须首先使用一个条件表达式将其转换为布尔值,例如 **if(a!= 0)**。 ## if-else -**if-else**语句是控制程序流程的最基本的形式。 其中的**else**是可选的,因此您可以使用两种形式的**if**: +**if-else** 语句是控制程序流程的最基本的形式。 其中的 **else** 是可选的,因此您可以使用两种形式的 **if**: ```java if(Boolean-expression) @@ -42,9 +42,9 @@ else statement ``` -布尔表达式必须生成布尔结果,statement指用分号结尾的简单语句,或复合语句——封闭在花括号内的一组简单语句。 每当使用“statement”一词时,它总是暗示语句可以是简单的或复合的。 +布尔表达式必须生成布尔结果,statement 指用分号结尾的简单语句,或复合语句——封闭在花括号内的一组简单语句。 每当使用 “statement” 一词时,它总是暗示语句可以是简单的或复合的。 -作为**if-else**的一个例子,下面这个**test()**方法可以告诉您,您猜的数大于、小于还是等于目标数: +作为 **if-else** 的一个例子,下面这个 **test()** 方法可以告诉您,您猜的数大于、小于还是等于目标数: ```java // control/IfElse.java @@ -82,8 +82,11 @@ public class IfElse { ## 迭代语句 -循环由**while**,**do-while**和**for**控制,有时称为迭代语句。 语句会重复执行,直到起控制作用的**布尔表达式**(Boolean expression)计算为"假"。 +循环由 **while**,**do-while** 和 **for** 控制,有时称为迭代语句。 语句会重复执行,直到起控制作用的 **布尔表达式** (Boolean expression)计算为"假"。 + + ### while + while循环的形式是: ```java @@ -125,11 +128,11 @@ false, Exited 'while' */ ``` -**condition()**方法用到了**Math**库里的**static**(静态)方法**random()**,该方法的作用是产生0和1之间 (包括0,但不包括1) 的一个**double**值。**result**的值是通过比较操作符<而得到它的,这个操作符产生**boolean**类型的结果。在打印**boolean**类型的值时,将自动地得到适合的字符串**true**或**false**。while的条件表达式意思是说:"只要**condition()**返回**true**,就重复执行循环体中的语句"。 +**condition()** 方法用到了 **Math** 库里的 **static** (静态)方法 **random()**,该方法的作用是产生 0 和 1 之间 (包括 0,但不包括 1) 的一个**double**值。**result** 的值是通过比较操作符<而得到它的,这个操作符产生 **boolean** 类型的结果。在打印 **boolean** 类型的值时,将自动地得到适合的字符串 **true** 或 **false**。while 的条件表达式意思是说:"只要 **condition()**返回 **true**,就重复执行循环体中的语句"。 ### do-while -**do-while**的格式如下: +**do-while** 的格式如下: ```java do @@ -137,18 +140,18 @@ do while(Boolean-expression); ``` -**while**和**do-while**之间的唯一区别是**do-while**的语句总是至少执行一次,即使表达式第一次计算为false也是如此。 在**while**循环结构中,如果条件第一次就为**false**,那么其中的语句根本不会执行。在实际应用中,**while**比**do-while**更常用一点。 +**while** 和 **do-while** 之间的唯一区别是 **do-while** 的语句总是至少执行一次,即使表达式第一次计算为 false 也是如此。 在 **while** 循环结构中,如果条件第一次就为 **false**,那么其中的语句根本不会执行。在实际应用中,**while** 比 **do-while** 更常用一点。 ### for -**for**循环可能是最常用的迭代形式。 该循环在第一次迭代之前执行初始化。 随后,它会执行条件测试,并在每次迭代结束时,进行某种形式的“步进”。**for**循环的形式是: +**for** 循环可能是最常用的迭代形式。 该循环在第一次迭代之前执行初始化。 随后,它会执行条件测试,并在每次迭代结束时,进行某种形式的“步进”。**for** 循环的形式是: ```java for(initialization; Boolean-expression; step) statement ``` -初始化(initialization)表达式、布尔表达式(Boolean-expression),或者步进(step)运算,都可以为空。在每次迭代之前都会测试表达式,并且一旦计算结果为false,就会在for语句后面的行继续执行。 在每个循环结束时,执行一次步进。 +初始化 (initialization) 表达式、布尔表达式 (Boolean-expression) ,或者步进 (step) 运算,都可以为空。在每次迭代之前都会测试表达式,并且一旦计算结果为 false,就会在 for 语句后面的行继续执行。 在每个循环结束时,执行一次步进。 **for**循环通常用于“计数”任务: @@ -178,17 +181,17 @@ value: 106 character: j */ ``` -请注意,变量**c**在程序用到它的地方被定义的,也就是在for循环的控制表达式内,而不是在**main()**的开头。**c**的范围是由**for**控制的语句。 +请注意,变量 **c** 在程序用到它的地方被定义的,也就是在for循环的控制表达式内,而不是在 **main()** 的开头。**c** 的范围是由 **for** 控制的语句。 像C这样的传统过程语言要求在块的开头定义所有变量。 当编译器创建块时,它可以为这些变量分配空间。 在Java和C ++中,您可以在整个块中传播变量声明,并在需要时定义它们。 这允许更自然的编码风格并使代码更容易理解。[1] -这个程序也使用了**java.lang.Character**包装器类,这个类不但能把**char**基本类型的值包装进对象,还提供了一些别的有用的方法。这里用到了**static isLowerCase()**方法来检查问题中的字符是否为小写字母。 +这个程序也使用了 **java.lang.Character** 包装器类,这个类不但能把 **char** 基本类型的值包装进对象,还提供了一些别的有用的方法。这里用到了 **static isLowerCase()** 方法来检查问题中的字符是否为小写字母。 #### 逗号操作符 -逗号运算符(不是逗号分隔符,逗号作为分隔符用于分隔定义和方法参数)在Java中只有一个用法:在**for**循环的控制表达式中。 在控制表达式的初始化和步进控制中,您可以使用逗号分隔多个语句,并按顺序计算这些语句。使用逗号运算符,您可以在**for**语句中定义多个变量,但它们必须属于同一类型: +逗号运算符(不是逗号分隔符,逗号作为分隔符用于分隔定义和方法参数)在 Java 中只有一个用法:在**for** 循环的控制表达式中。 在控制表达式的初始化和步进控制中,您可以使用逗号分隔多个语句,并按顺序计算这些语句。使用逗号运算符,您可以在 **for** 语句中定义多个变量,但它们必须属于同一类型: ```java // control/CommaOperator.java @@ -208,15 +211,15 @@ i = 4 j = 8 */ ``` -**for**语句中的**int**定义覆盖了**i**和**j**,在初始化部分实际上可以拥有任意数量的具有相同类型的变量定义。在控制表达式中定义变量的能力仅限于**for**循环。 您不能将此方法与任何其他选择或迭代语句一起使用。 +**for** 语句中的 **int** 定义覆盖了 **i** 和 **j**,在初始化部分实际上可以拥有任意数量的具有相同类型的变量定义。在控制表达式中定义变量的能力仅限于 **for** 循环。 您不能将此方法与任何其他选择或迭代语句一起使用。 可以看到,无论在初始化还是在步进部分,语句都是顺序执行的。 ## for-in语法 -Java 5引入了更简洁的**for**语法,用于数组和集合(您将在“数组和集合”章节中了解更多有关这些内容的信息)。 这有时被称为**增强版for循环**,并且您将看到的大部分文档称为*for-each*语法,但Java 8添加了大量使用的**forEach()**。 这会混淆术语,所以我拿了一些许可证,而是称之为*for-in*(例如,在Python中,你实际上是**for x in sequence**,所以有合理的先例)。 请记住,您可能会在其他地方看到它的不同叫法。 +Java 5引入了更简洁的 **for** 语法,用于数组和集合(您将在“数组和集合”章节中了解更多有关这些内容的信息)。 这有时被称为 **增强版for循环**,并且您将看到的大部分文档称为 *for-each* 语法,但Java 8添加了大量使用的 **forEach()**。 这会混淆术语,所以我拿了一些许可证,而是称之为*for-in* (例如,在Python中,你实际上是 **for x in sequence**,所以有合理的先例)。 请记住,您可能会在其他地方看到它的不同叫法。 -**for-in**会自动为您生成每个项,因此你不必创建**int**变量去对由访问项构成的序列进行奇数。 例如,假设您有一个**float**数组,并且您想要选取该数组中的每个元素: +**for-in** 会自动为您生成每个项,因此你不必创建 **int** 变量去对由访问项构成的序列进行奇数。 例如,假设您有一个 **float** 数组,并且您想要选取该数组中的每个元素: ```java // control/ForInFloat.java @@ -253,9 +256,9 @@ public class ForInFloat { for(float x : f) { ``` -这条语句定义了一个**float**类型的变量**x**,继而将每一个**f**的元素赋值给**x**。 +这条语句定义了一个 **float** 类型的变量 **x**,继而将每一个 **f** 的元素赋值给 **x**。 -任何返回一个数组的方法都可以使用**for-in**。例如**String**类有一个方法**toCharArray()**,它返回一个**char**数组,因此可以很容易地下像下面这样迭代在字符串里面的所有字符: +任何返回一个数组的方法都可以使用 **for-in**。例如 **String** 类有一个方法 **toCharArray()**,它返回一个 **char** 数组,因此可以很容易地下像下面这样迭代在字符串里面的所有字符: ```java // control/ForInString.java @@ -271,17 +274,17 @@ A n A f r i c a n S w a l l o w */ ``` -就像在集合的章节所看到的,for-in还可以用于任何**iterable**对象。 +就像在集合的章节所看到的,for-in还可以用于任何 **iterable** 对象。 -许多**for**语句都会在一个整型值序列中步进,就像下面这样: +许多 **for** 语句都会在一个整型值序列中步进,就像下面这样: ```java for(int i = 0; i < 100; i++) ``` -对于这样的语句,for-in语法将不起作用,除非先创建一个**int**数组。为了简化这些任务,我会在**onjava.Range**包中创建一个名为**range()**的方法,它将自动生成恰当的数组。 +对于这样的语句,for-in语法将不起作用,除非先创建一个 **int** 数组。为了简化这些任务,我会在**onjava.Range** 包中创建一个名为 **range()** 的方法,它将自动生成恰当的数组。 -隐藏实施过程这一章节( Implementation Hiding )介绍了静态导入。 但是,您无需了解这些详细信息即可开始使用此库。 你可以在**import**语句中看到**static import**语法: +隐藏实施过程这一章节( Implementation Hiding )介绍了静态导入。 但是,您无需了解这些详细信息即可开始使用此库。 你可以在 **import** 语句中看到 **static import** 语法: ```java // control/ForInInt.java @@ -312,19 +315,19 @@ public class ForInInt { */ ``` -**range()**方法已经被重载,重载表示相同的方法名可以具有不同的参数列表(你将很快学习重载)。**range()**的第一个种重载形式是从0开始产生值,直到范围的上限,但不包括该上限。第二种重载形式是从第一个值开始产生值,直至比第二值小1的值为止。第三种形式有一个步进值,因此它每次的增量为该值。第四种**range()**表明还可以递减。**range()**是所谓生成器的一个非常简单的版本,有关生成器的内容将在本书稍后进行介绍。 +**range()** 方法已经被重载,重载表示相同的方法名可以具有不同的参数列表(你将很快学习重载)。**range()** 的第一个种重载形式是从0开始产生值,直到范围的上限,但不包括该上限。第二种重载形式是从第一个值开始产生值,直至比第二值小1的值为止。第三种形式有一个步进值,因此它每次的增量为该值。第四种 **range()** 表明还可以递减。**range()**是所谓生成器的一个非常简单的版本,有关生成器的内容将在本书稍后进行介绍。 -**range()**允许在更多地方使用for-in语法,因此可以说提高可读性。 +**range()** 允许在更多地方使用for-in语法,因此可以说提高可读性。 -请注意,**System.out.print()**不会输出换行符,因此您可以分段输出一行。 +请注意,**System.out.print()** 不会输出换行符,因此您可以分段输出一行。 -*for-in*语法不仅可以节省编写代码的时间。 更重要的是,它更容易阅读并说明你要做什么(获取数组的每个元素)而不是详细说明你是如何做到的(“我正在创建这个索引,所以我可以使用它来选择每个数组元素。“)。 本书只要有可能就会使用*for-in*语法。 +*for-in* 语法不仅可以节省编写代码的时间。 更重要的是,它更容易阅读并说明你要做什么(获取数组的每个元素)而不是详细说明你是如何做到的(“我正在创建这个索引,所以我可以使用它来选择每个数组元素。“)。 本书只要有可能就会使用 *for-in* 语法。 ## return -在Java中有几个关键字代表无条件分支,这意味着分支在没有任何测试的情况下发生。 这些包括**return**,**break**,**continue**和跳转到带标签语句的方法,类似于其他语言中的**goto**。 +在Java中有几个关键字代表无条件分支,这意味着分支在没有任何测试的情况下发生。 这些包括**return**,**break**,**continue** 和跳转到带标签语句的方法,类似于其他语言中的 **goto**。 -**return**关键字有两方面的用途:一方面指定一个方法返回什么值(假设它没有**void**返回值),另一方面它会导致当前的方法退出,并返回那个值。可据此改写上面的**IfElse.java**里的**test()**方法,使其利用这些特点: +**return**关键字有两方面的用途:一方面指定一个方法返回什么值(假设它没有 **void** 返回值),另一方面它会导致当前的方法退出,并返回那个值。可据此改写上面的 **IfElse.java** 里的 **test()** 方法,使其利用这些特点: ```java // control/TestWithReturn.java @@ -350,15 +353,15 @@ public class TestWithReturn { */ ``` -不需要**else**,因为该方法在执行返回后不会继续执行。 +不需要 **else**,因为该方法在执行返回后不会继续执行。 -如果在返回**void**的方法中没有**return**语句,则在该方法结束时会有一个隐式的**return**,因此一个方法中并不总是需要包含**return**语句。 但是,如果您的方法声明它将返回除**void**之外的任何返回类型,则必须确保每个代码路径都返回一个值。 +如果在返回 **void** 的方法中没有 **return** 语句,则在该方法结束时会有一个隐式的 **return**,因此一个方法中并不总是需要包含 **return** 语句。 但是,如果您的方法声明它将返回除 **void** 之外的任何返回类型,则必须确保每个代码路径都返回一个值。 ## break and continue -在任何迭代语句的主体部分,都可以使用**break**和**continue**来控制循环的流程。 其中,**break**退出循环而不执行循环中的其余语句。 而**continue**停止执行当前的迭代,然后退回循环起始处,以开始下一次迭代。 +在任何迭代语句的主体部分,都可以使用 **break** 和 **continue** 来控制循环的流程。 其中,**break** 退出循环而不执行循环中的其余语句。 而 **continue** 停止执行当前的迭代,然后退回循环起始处,以开始下一次迭代。 -下面这个程序向大家展示了**break**和**continue**在**for**和**while**循环中的例子: +下面这个程序向大家展示了 **break** 和 **continue** 在 **for** 和 **while** 循环中的例子: ```java // control/BreakAndContinue.java @@ -399,23 +402,23 @@ public class BreakAndContinue { */ ``` -**[1]**在这个**for**循环中,**i**的值永远不会达到100;因为一旦**i**达到74,**break**语句就会中断循环。通常,只有在不知道中断条件何时满足时,才需要这样使用**break**。因为**i**不能被9整除,**continue**语句就会使执行过程返回到循环的最开头(这使**i**递增)。如果能够整除,则将值显示出来。 +**[1]** 在这个 **for** 循环中,**i** 的值永远不会达到 100;因为一旦 **i** 达到 74,**break** 语句就会中断循环。通常,只有在不知道中断条件何时满足时,才需要这样使用 **break**。因为**i** 不能被 9 整除,**continue** 语句就会使执行过程返回到循环的最开头(这使 **i** 递增)。如果能够整除,则将值显示出来。 -**[2]**使用for-in语法将产生相同的结果。 +**[2]** 使用 for-in 语法将产生相同的结果。 -**[3]**最后,可以看到一个"无穷**while**循环"的情况。然而,循环内部有一个**break**语句,可中止循环。请注意,**continue**语句将控制权移回循环的顶部,而不会执行**continue**之后的任何操作。 因此,只有当i的值可被10整除时才会显示。在输出中,显示值0,因为0%9产生0。 +**[3]** 最后,可以看到一个"无穷 **while** 循环"的情况。然而,循环内部有一个 **break** 语句,可中止循环。请注意,**continue** 语句将控制权移回循环的顶部,而不会执行 **continue** 之后的任何操作。 因此,只有当 i 的值可被 10 整除时才会显示。在输出中,显示值 0,因为 0%9 产生0。 -无限循环的另一种形式是**for(;;)**。 编译器以同样的方式处理**while(true)**和**for(;;)**,因此使用哪种取决于编程品味。 +无限循环的另一种形式是 **for(;;)**。 编译器以同样的方式处理 **while(true)** 和 **for(;;)**,因此使用哪种取决于编程品味。 ## 臭名昭著的goto -goto关键字很早就在程序设计语言中出现。事实上,goto是汇编语言的程序控制结构的始 祖:“若条件A,则跳到这里;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码,就 会发现程序控制里包含了许多跳转。然而,goto是在源码的级别跳转的,所以招致了不好的 声誉。若程序总是从一个地方跳到另一个地方,还有什么办法能识别代码的流程呢?随着 Edsger Dijkstra著名的“Goto有害”论的问世,goto便从此失宠。 +goto 关键字很早就在程序设计语言中出现。事实上,goto 是汇编语言的程序控制结构的始 祖:“若条件A,则跳到这里;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码,就 会发现程序控制里包含了许多跳转。然而,goto是在源码的级别跳转的,所以招致了不好的 声誉。若程序总是从一个地方跳到另一个地方,还有什么办法能识别代码的流程呢?随着 Edsger Dijkstra 著名的 “Goto 有害”论的问世,goto 便从此失宠。 -事实上,真正的问题并不在于使用goto,而在于goto的滥用。而且在一些少见的情况下,goto 是组织控制流程的最佳手段。 +事实上,真正的问题并不在于使用 goto,而在于 goto 的滥用。而且在一些少见的情况下,goto 是组织控制流程的最佳手段。 -尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在 break和continue这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳 转,而是中断循环语句的一种方法。之所以把它们纳入goto问题中一起讨论,是由于它们使 用了相同的机制:标签。 +尽管 goto 仍是 Java 的一个保留字,但并未在语言中得到正式使用;Java 没有 goto。然而,在 break和 continue 这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳 转,而是中断循环语句的一种方法。之所以把它们纳入 goto 问题中一起讨论,是由于它们使 用了相同的机制:标签。 “标签”是后面跟一个冒号的标识符,就象下面这样: @@ -423,7 +426,7 @@ goto关键字很早就在程序设计语言中出现。事实上,goto是汇编 label1: ``` -对Java来说,唯一用到标签的地方是在循环语句之前。进一步说,它实际需要紧靠在循环语 句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一 理由是:我们希望在其中嵌套另一个循环或者一个开关。这是由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。如下所示: +对 Java 来说,唯一用到标签的地方是在循环语句之前。进一步说,它实际需要紧靠在循环语 句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一 理由是:我们希望在其中嵌套另一个循环或者一个开关。这是由于 break 和 continue 关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。如下所示: ```java label1: @@ -441,13 +444,13 @@ outer-iteration { } ``` -**[1]** **break**中断内部循环,并在外部循环结束。 +**[1]** **break** 中断内部循环,并在外部循环结束。 -**[2]**,**continue**移回内部循环的 起始处。但在条件3中,**continue label1**却同时中断内部循环以及外部循环,并移至**label1** 处。 +**[2]**,**continue** 移回内部循环的 起始处。但在条件3中,**continue label1** 却同时中断内部循环以及外部循环,并移至 **label1** 处。 **[3]**随后,它实际是继续循环,但却从外部循环开始。 -**[4]**,**break label1**也会中断所有循环,并回到**label1**处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。 +**[4]**,**break label1** 也会中断所有循环,并回到 **label1** 处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。 下面是for循环的一个例子: @@ -516,11 +519,11 @@ break outer */ ``` -注意**break**会中断**for**循环,而且在抵达**for**循环的末尾之前,递增表达式不会执行。由于**break** 跳过了递增表达式,所以递增会在**i==3**的情况下直接执行。在**i==7**的情况下,**continue outer** 语句也会到达循环顶部,而且也会跳过递增,所以它也是直接递增的。 +注意 **break** 会中断 **for** 循环,而且在抵达 **for** 循环的末尾之前,递增表达式不会执行。由于 **break** 跳过了递增表达式,所以递增会在 **i==3** 的情况下直接执行。在 **i==7** 的情况下,**continue outer** 语句也会到达循环顶部,而且也会跳过递增,所以它也是直接递增的。 -如果没有**break outer**语句,就没有办法在一个内部循环里找到出外部循环的路径。这是由于 **break**本身只能中断最内层的循环(对于**continue**同样如此)。 当然,若想在中断循环的同时退出方法,简单地用一个**return**即可。 +如果没有 **break outer** 语句,就没有办法在一个内部循环里找到出外部循环的路径。这是由于 **break** 本身只能中断最内层的循环(对于 **continue** 同样如此)。 当然,若想在中断循环的同时退出方法,简单地用一个 **return** 即可。 -下面这个例子向大家展示了带标签的**break**以及**continue**语句在**while**循环中的用法: +下面这个例子向大家展示了带标签的 **break** 以及 **continue** 语句在 **while** 循环中的用法: ```java // control/LabeledWhile.java @@ -573,25 +576,25 @@ break outer */ ``` -同样的规则亦适用于**while**: +同样的规则亦适用于 **while**: -(1) 简单的一个**continue**会退回最内层循环的开头(顶部),并继续执行。 +(1) 简单的一个 **continue** 会退回最内层循环的开头(顶部),并继续执行。 -(2) 带有标签的**continue**会到达标签的位置,并重新进入紧接在那个标签后面的循环。 +(2) 带有标签的 **continue** 会到达标签的位置,并重新进入紧接在那个标签后面的循环。 -(3) **break**会中断当前循环,并移离当前标签的末尾。 +(3) **break** 会中断当前循环,并移离当前标签的末尾。 (4) 带标签的**break**会中断当前循环,并移离由那个标签指示的循环的末尾。 -大家要记住的重点是:在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中**break**或**continue**。 +大家要记住的重点是:在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中 **break** 或 **continue**。 -**break**和**continue**标签已经成为相对少用的推测特征(在前面的语言中很少或没有先例),所以你很少在代码里看到它们。 +**break** 和 **continue** 标签已经成为相对少用的推测特征(在前面的语言中很少或没有先例),所以你很少在代码里看到它们。 -在**Dijkstra**的**“Goto有害”**论中,他最反对的就是标签,而非**goto**。随着标签在一个程序里数量 的增多,他发现产生错误的机会也越来越多。标签和**goto**使我们难于对程序作静态分析。但是,Java标签不会造成这方面的问题,因为它们的应用场合已经收到了限制,没有特别的方式用于概念程序的控制。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。 +在 **Dijkstra** 的 **“ goto 有害”** 论中,他最反对的就是标签,而非 **goto**。随着标签在一个程序里数量 的增多,他发现产生错误的机会也越来越多。标签和 **goto** 使我们难于对程序作静态分析。但是,Java 标签不会造成这方面的问题,因为它们的应用场合已经收到了限制,没有特别的方式用于概念程序的控制。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。 ## switch -**switch**有时也被划归为一种选择语句。根据整数表达式的值,**switch**语句可以从一系列代码中选出一段去执行。它的格式如下: +**switch** 有时也被划归为一种选择语句。根据整数表达式的值,**switch** 语句可以从一系列代码中选出一段去执行。它的格式如下: ```java switch(integral-selector) { @@ -605,11 +608,11 @@ switch(integral-selector) { } ``` -其中,integral-selector(整数选择因子)是一个能够产生整数值的表达式,**switch**能够将这个表达式的结果与每个integral-value(整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相 符的,就执行default语句。 +其中,integral-selector (整数选择因子)是一个能够产生整数值的表达式,**switch** 能够将这个表达式的结果与每个 integral-value (整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相 符的,就执行 default 语句。 -在上面的定义中,大家会注意到每个**case**均以一个**break**结尾。这样可使执行流程跳转至 switch主体的末尾。这是构建**switch**语句的一种传统方式,但**break**是可选的。若省略break, 会继续执行后面的**case**语句的代码,直到遇到一个**break**为止。尽管通常不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的**default**语句没有**break**,因为执行流程已到了break的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在**default** 语句的末尾放置一个**break**,尽管它并没有任何实际的用处。 +在上面的定义中,大家会注意到每个 **case** 均以一个 **break** 结尾。这样可使执行流程跳转至 switch 主体的末尾。这是构建 **switch** 语句的一种传统方式,但 **break** 是可选的。若省略break, 会继续执行后面的 **case** 语句的代码,直到遇到一个 **break** 为止。尽管通常不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的 **default** 语句没有 **break**,因为执行流程已到了break的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在**default** 语句的末尾放置一个 **break**,尽管它并没有任何实际的用处。 -switch语句是实现多路选择的一种干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是int或char那样的整数值。例如,假若将一个字串或者浮点数 作为选择因子使用,那么它们在switch语句里是不会工作的。对于非整数类型,则必须使用一 系列if语句。 下面这个例子可随机生成字母,并判断它们是元音还是辅音字母: +switch 语句是实现多路选择的一种干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是 int 或 char 那样的整数值。例如,假若将一个字串或者浮点数 作为选择因子使用,那么它们在 switch 语句里是不会工作的。对于非整数类型,则必须使用一 系列 if 语句。 下面这个例子可随机生成字母,并判断它们是元音还是辅音字母: ```java // control/VowelsAndConsonants.java @@ -656,9 +659,9 @@ z, 122: consonant */ ``` -由于**Random.nextInt(26)**会产生0到26之间的一个值,所以在其上加上一个偏移量"a",即可产生小写字母。在**case**语句中,使用单引号引起的字符也会产生用于比较的整数值。 +由于 **Random.nextInt(26)** 会产生0到26之间的一个值,所以在其上加上一个偏移量 "a",即可产生小写字母。在 **case** 语句中,使用单引号引起的字符也会产生用于比较的整数值。 -请注意**case**语句能够堆叠在一起,为一段代码形成多重匹配,即只要符合多种条件中的一种,就执行那段特别的代码。这时也应该注意将**break**语句置于特定**case**的末尾,否则控制流程会简单地下移,处理后面的**case**。 +请注意 **case** 语句能够堆叠在一起,为一段代码形成多重匹配,即只要符合多种条件中的一种,就执行那段特别的代码。这时也应该注意将 **break** 语句置于特定 **case** 的末尾,否则控制流程会简单地下移,处理后面的 **case**。 在下面的语句中: @@ -666,11 +669,11 @@ z, 122: consonant int c = rand.nextInt(26) + 'a'; ``` -**Random.nextInt()**将产生0~25之间的一个随机**int**值,它将被加到**"a"**上。这表示**"a"**将自动被转换为**int**以执行假发。为了把**c**当作字符打印,必须将其转型为**char**;否则,将产生整数输出。 +**Random.nextInt()**将产生0~25之间的一个随机 **int** 值,它将被加到 **"a"** 上。这表示 **"a"** 将自动被转换为 **int** 以执行假发。为了把 **c** 当作字符打印,必须将其转型为 **char**;否则,将产生整数输出。 ##Switching on Strings -Java 7增加了在字符串上**switch**的用法。 此示例展示了您从一组String可能性中选择的旧方法,以及使用switch的新方法: +Java 7增加了在字符串上 **switch** 的用法。 此示例展示了您从一组String可能性中选择的旧方法,以及使用switch的新方法: ```java // control/StringSwitch.java @@ -718,9 +721,9 @@ RED 一旦理解了switch,这种语法就是一个逻辑扩展。 结果更清晰,更易于理解和维护。 -作为**switch**字符串的第二个例子,我们重新访问Math.random()。 它是否产生从0到1的值,包括还是不包括值“1”? 在数学术语中,是(0,1),还是[0,1],还是(0,1)还是[0,1]? (方括号表示“包括”,而括号表示“不包括”。) +作为 **switch** 字符串的第二个例子,我们重新访问 Math.random()。 它是否产生从 0 到 1 的值,包括还是不包括值“1”? 在数学术语中,是(0,1),还是[0,1],还是(0,1)还是[0,1]? (方括号表示“包括”,而括号表示“不包括”。) -下面一个可能提供答案的测试程序。 所有命令行参数都作为**String**对象传递,因此我们可以**switch**参数来决定要做什么。 有一个问题:用户可能不提供任何参数,因此索引到args数组会导致程序失败。 要解决这个问题,我们检查数组的长度,如果它为零,我们使用一个空字符串,否则我们选择**args**数组中的第一个元素: +下面一个可能提供答案的测试程序。 所有命令行参数都作为 **String** 对象传递,因此我们可以 **switch** 参数来决定要做什么。 有一个问题:用户可能不提供任何参数,因此索引到args数组会导致程序失败。 要解决这个问题,我们检查数组的长度,如果它为零,我们使用一个空字符串,否则我们选择 **args** 数组中的第一个元素: ```java // control/RandomBounds.java @@ -761,7 +764,7 @@ or java RandomBounds upper ``` -使用onjava包中的TimedAbort类,程序在三秒后中止,因此看起来Math.random()从不生成0.0或1.0。 但这就是这样一个实验可以欺骗的地方。 如果考虑0到1之间所有不同**double**类型的分数(double fractions)的数量,实验中达到任何一个值的可能性可能超过一台计算机甚至一个实验者的寿命。 结果是0.0包含在**Math.random()**的输出中,而1.0则不包括在内。 在数学术语中,它是[0,1)。 您必须小心分析您的实验并了解它们的局限性。结果是0.0包含在**Math.random()**的输出中,而1.0则不包括在内。 在数学术语中,它是[0,1)。 您必须小心分析您的实验并了解它们的局限性。 +使用 onjava 包中的 TimedAbort 类,程序在三秒后中止,因此看起来 Math.random()从不生成 0.0或 1.0。 但这就是这样一个实验可以欺骗的地方。 如果考虑0到1之间所有不同 **double** 类型的分数(double fractions)的数量,实验中达到任何一个值的可能性可能超过一台计算机甚至一个实验者的寿命。 结果是0.0包含在 **Math.random()**的输出中,而 1.0 则不包括在内。 在数学术语中,它是[0,1)。 您必须小心分析您的实验并了解它们的局限性。结果是 0.0 包含在 **Math.random()**的输出中,而 1.0 则不包括在内。 在数学术语中,它是 [0,1)。 您必须小心分析您的实验并了解它们的局限性。 From f44236dfc44d3ac5b85d77f32464463be4898128 Mon Sep 17 00:00:00 2001 From: Langdon <575998772@qq.com> Date: Sun, 17 Mar 2019 12:48:05 +0800 Subject: [PATCH 016/814] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/05-Control Flow.md | 137 ++++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 67 deletions(-) diff --git a/book/05-Control Flow.md b/book/05-Control Flow.md index d95f27c9..ea20bd69 100644 --- a/book/05-Control Flow.md +++ b/book/05-Control Flow.md @@ -1,14 +1,14 @@ -# 第五章 控制执行流程 +# 第五章 控制流 > 程序操纵它的世界并做出选择。 在Java中,您可以使用执行控制语句进行选择。 -Java使用C的所有执行控制语句,因此如果您使用C或C ++进行编程,那么您所看到的大部分内容都是熟悉的。 大多数过程编程语言都有某种控制语句,并且语言之间经常存在重叠。在Java中,关键字包括**if-else,while,do-while,for,return,break**和名为**switch**的选择语句。 但是,Java并不支持备受诟病的**goto**(它仍然是解决某些类型问题的最有效方法)。 你仍然可以进行类似goto的跳转,但它比其他语言中的**goto**更受限制。 +Java 使用 C 的所有执行控制语句,因此如果您使用 C 或 C++ 进行编程,那么您所看到的大部分内容都是熟悉的。 大多数过程编程语言都有某种控制语句,并且语言之间经常存在重叠。在 Java 中,关键字包括 **if-else,while,do-while,for,return,break** 和名为 **switch** 的选择语句。 但是,Java并不支持备受诟病的**goto**(它仍然是解决某些类型问题的最有效方法)。 你仍然可以进行类似goto的跳转,但它比其他语言中的**goto**更受限制。 [TOC] ## true and flase -条件表达式的示例是**a == b**。这里有一个条件表达式示例,它使用条件操作符**“==”**来查看**a**的值是否等于**b**的值。 表达式返回**true**或**false**。 如果显示条件表达式的结果,则会生成表示布尔值的字符串**“true”**和**“false”**。 +条件表达式的示例是 **a == b**。这里有一个条件表达式示例,它使用条件操作符**“==”**来查看 **a**的值是否等于 **b** 的值。 表达式返回 **true** 或 **false**。 如果显示条件表达式的结果,则会生成表示布尔值的字符串 **“true”** 和 **“false”**。 ```java // control/TrueFalse.java @@ -22,11 +22,11 @@ public class TrueFalse { true false */ ``` -您在上一章中看到的任何关系运算符都可以生成条件语句。 请注意,Java不允许您使用数字作为布尔值,即使它在C和C ++中允许(在这些语言中,真"为非零,而”假“是零)。如果想在布尔测试中使用非布尔值,例如**if(a**),必须首先使用一个条件表达式将其转换为布尔值,例如**if(a!= 0)**。 +您在上一章中看到的任何关系运算符都可以生成条件语句。 请注意,Java 不允许您使用数字作为布尔值,即使它在 C 和 C++ 中允许(在这些语言中,真"为非零,而”假“是零)。如果想在布尔测试中使用非布尔值,例如**if(a**),必须首先使用一个条件表达式将其转换为布尔值,例如 **if(a!= 0)**。 ## if-else -**if-else**语句是控制程序流程的最基本的形式。 其中的**else**是可选的,因此您可以使用两种形式的**if**: +**if-else** 语句是控制程序流程的最基本的形式。 其中的 **else** 是可选的,因此您可以使用两种形式的 **if**: ```java if(Boolean-expression) @@ -42,9 +42,9 @@ else statement ``` -布尔表达式必须生成布尔结果,statement指用分号结尾的简单语句,或复合语句——封闭在花括号内的一组简单语句。 每当使用“statement”一词时,它总是暗示语句可以是简单的或复合的。 +布尔表达式必须生成布尔结果,statement 指用分号结尾的简单语句,或复合语句——封闭在花括号内的一组简单语句。 每当使用 “statement” 一词时,它总是暗示语句可以是简单的或复合的。 -作为**if-else**的一个例子,下面这个**test()**方法可以告诉您,您猜的数大于、小于还是等于目标数: +作为 **if-else** 的一个例子,下面这个 **test()** 方法可以告诉您,您猜的数大于、小于还是等于目标数: ```java // control/IfElse.java @@ -82,8 +82,11 @@ public class IfElse { ## 迭代语句 -循环由**while**,**do-while**和**for**控制,有时称为迭代语句。 语句会重复执行,直到起控制作用的**布尔表达式**(Boolean expression)计算为"假"。 +循环由 **while**,**do-while** 和 **for** 控制,有时称为迭代语句。 语句会重复执行,直到起控制作用的 **布尔表达式** (Boolean expression)计算为"假"。 + + ### while + while循环的形式是: ```java @@ -125,11 +128,11 @@ false, Exited 'while' */ ``` -**condition()**方法用到了**Math**库里的**static**(静态)方法**random()**,该方法的作用是产生0和1之间 (包括0,但不包括1) 的一个**double**值。**result**的值是通过比较操作符<而得到它的,这个操作符产生**boolean**类型的结果。在打印**boolean**类型的值时,将自动地得到适合的字符串**true**或**false**。while的条件表达式意思是说:"只要**condition()**返回**true**,就重复执行循环体中的语句"。 +**condition()** 方法用到了 **Math** 库里的 **static** (静态)方法 **random()**,该方法的作用是产生 0 和 1 之间 (包括 0,但不包括 1) 的一个**double**值。**result** 的值是通过比较操作符<而得到它的,这个操作符产生 **boolean** 类型的结果。在打印 **boolean** 类型的值时,将自动地得到适合的字符串 **true** 或 **false**。while 的条件表达式意思是说:"只要 **condition()**返回 **true**,就重复执行循环体中的语句"。 ### do-while -**do-while**的格式如下: +**do-while** 的格式如下: ```java do @@ -137,18 +140,18 @@ do while(Boolean-expression); ``` -**while**和**do-while**之间的唯一区别是**do-while**的语句总是至少执行一次,即使表达式第一次计算为false也是如此。 在**while**循环结构中,如果条件第一次就为**false**,那么其中的语句根本不会执行。在实际应用中,**while**比**do-while**更常用一点。 +**while** 和 **do-while** 之间的唯一区别是 **do-while** 的语句总是至少执行一次,即使表达式第一次计算为 false 也是如此。 在 **while** 循环结构中,如果条件第一次就为 **false**,那么其中的语句根本不会执行。在实际应用中,**while** 比 **do-while** 更常用一点。 ### for -**for**循环可能是最常用的迭代形式。 该循环在第一次迭代之前执行初始化。 随后,它会执行条件测试,并在每次迭代结束时,进行某种形式的“步进”。**for**循环的形式是: +**for** 循环可能是最常用的迭代形式。 该循环在第一次迭代之前执行初始化。 随后,它会执行条件测试,并在每次迭代结束时,进行某种形式的“步进”。**for** 循环的形式是: ```java for(initialization; Boolean-expression; step) statement ``` -初始化(initialization)表达式、布尔表达式(Boolean-expression),或者步进(step)运算,都可以为空。在每次迭代之前都会测试表达式,并且一旦计算结果为false,就会在for语句后面的行继续执行。 在每个循环结束时,执行一次步进。 +初始化 (initialization) 表达式、布尔表达式 (Boolean-expression) ,或者步进 (step) 运算,都可以为空。在每次迭代之前都会测试表达式,并且一旦计算结果为 false,就会在 for 语句后面的行继续执行。 在每个循环结束时,执行一次步进。 **for**循环通常用于“计数”任务: @@ -178,17 +181,17 @@ value: 106 character: j */ ``` -请注意,变量**c**在程序用到它的地方被定义的,也就是在for循环的控制表达式内,而不是在**main()**的开头。**c**的范围是由**for**控制的语句。 +请注意,变量 **c** 在程序用到它的地方被定义的,也就是在for循环的控制表达式内,而不是在 **main()** 的开头。**c** 的范围是由 **for** 控制的语句。 像C这样的传统过程语言要求在块的开头定义所有变量。 当编译器创建块时,它可以为这些变量分配空间。 在Java和C ++中,您可以在整个块中传播变量声明,并在需要时定义它们。 这允许更自然的编码风格并使代码更容易理解。[1] -这个程序也使用了**java.lang.Character**包装器类,这个类不但能把**char**基本类型的值包装进对象,还提供了一些别的有用的方法。这里用到了**static isLowerCase()**方法来检查问题中的字符是否为小写字母。 +这个程序也使用了 **java.lang.Character** 包装器类,这个类不但能把 **char** 基本类型的值包装进对象,还提供了一些别的有用的方法。这里用到了 **static isLowerCase()** 方法来检查问题中的字符是否为小写字母。 #### 逗号操作符 -逗号运算符(不是逗号分隔符,逗号作为分隔符用于分隔定义和方法参数)在Java中只有一个用法:在**for**循环的控制表达式中。 在控制表达式的初始化和步进控制中,您可以使用逗号分隔多个语句,并按顺序计算这些语句。使用逗号运算符,您可以在**for**语句中定义多个变量,但它们必须属于同一类型: +逗号运算符(不是逗号分隔符,逗号作为分隔符用于分隔定义和方法参数)在 Java 中只有一个用法:在**for** 循环的控制表达式中。 在控制表达式的初始化和步进控制中,您可以使用逗号分隔多个语句,并按顺序计算这些语句。使用逗号运算符,您可以在 **for** 语句中定义多个变量,但它们必须属于同一类型: ```java // control/CommaOperator.java @@ -208,15 +211,15 @@ i = 4 j = 8 */ ``` -**for**语句中的**int**定义覆盖了**i**和**j**,在初始化部分实际上可以拥有任意数量的具有相同类型的变量定义。在控制表达式中定义变量的能力仅限于**for**循环。 您不能将此方法与任何其他选择或迭代语句一起使用。 +**for** 语句中的 **int** 定义覆盖了 **i** 和 **j**,在初始化部分实际上可以拥有任意数量的具有相同类型的变量定义。在控制表达式中定义变量的能力仅限于 **for** 循环。 您不能将此方法与任何其他选择或迭代语句一起使用。 可以看到,无论在初始化还是在步进部分,语句都是顺序执行的。 ## for-in语法 -Java 5引入了更简洁的**for**语法,用于数组和集合(您将在“数组和集合”章节中了解更多有关这些内容的信息)。 这有时被称为**增强版for循环**,并且您将看到的大部分文档称为*for-each*语法,但Java 8添加了大量使用的**forEach()**。 这会混淆术语,所以我拿了一些许可证,而是称之为*for-in*(例如,在Python中,你实际上是**for x in sequence**,所以有合理的先例)。 请记住,您可能会在其他地方看到它的不同叫法。 +Java 5引入了更简洁的 **for** 语法,用于数组和集合(您将在“数组和集合”章节中了解更多有关这些内容的信息)。 这有时被称为 **增强版for循环**,并且您将看到的大部分文档称为 *for-each* 语法,但Java 8添加了大量使用的 **forEach()**。 这会混淆术语,所以我拿了一些许可证,而是称之为*for-in* (例如,在Python中,你实际上是 **for x in sequence**,所以有合理的先例)。 请记住,您可能会在其他地方看到它的不同叫法。 -**for-in**会自动为您生成每个项,因此你不必创建**int**变量去对由访问项构成的序列进行奇数。 例如,假设您有一个**float**数组,并且您想要选取该数组中的每个元素: +**for-in** 会自动为您生成每个项,因此你不必创建 **int** 变量去对由访问项构成的序列进行奇数。 例如,假设您有一个 **float** 数组,并且您想要选取该数组中的每个元素: ```java // control/ForInFloat.java @@ -253,9 +256,9 @@ public class ForInFloat { for(float x : f) { ``` -这条语句定义了一个**float**类型的变量**x**,继而将每一个**f**的元素赋值给**x**。 +这条语句定义了一个 **float** 类型的变量 **x**,继而将每一个 **f** 的元素赋值给 **x**。 -任何返回一个数组的方法都可以使用**for-in**。例如**String**类有一个方法**toCharArray()**,它返回一个**char**数组,因此可以很容易地下像下面这样迭代在字符串里面的所有字符: +任何返回一个数组的方法都可以使用 **for-in**。例如 **String** 类有一个方法 **toCharArray()**,它返回一个 **char** 数组,因此可以很容易地下像下面这样迭代在字符串里面的所有字符: ```java // control/ForInString.java @@ -271,17 +274,17 @@ A n A f r i c a n S w a l l o w */ ``` -就像在集合的章节所看到的,for-in还可以用于任何**iterable**对象。 +就像在集合的章节所看到的,for-in还可以用于任何 **iterable** 对象。 -许多**for**语句都会在一个整型值序列中步进,就像下面这样: +许多 **for** 语句都会在一个整型值序列中步进,就像下面这样: ```java for(int i = 0; i < 100; i++) ``` -对于这样的语句,for-in语法将不起作用,除非先创建一个**int**数组。为了简化这些任务,我会在**onjava.Range**包中创建一个名为**range()**的方法,它将自动生成恰当的数组。 +对于这样的语句,for-in语法将不起作用,除非先创建一个 **int** 数组。为了简化这些任务,我会在**onjava.Range** 包中创建一个名为 **range()** 的方法,它将自动生成恰当的数组。 -隐藏实施过程这一章节( Implementation Hiding )介绍了静态导入。 但是,您无需了解这些详细信息即可开始使用此库。 你可以在**import**语句中看到**static import**语法: +隐藏实施过程这一章节( Implementation Hiding )介绍了静态导入。 但是,您无需了解这些详细信息即可开始使用此库。 你可以在 **import** 语句中看到 **static import** 语法: ```java // control/ForInInt.java @@ -312,19 +315,19 @@ public class ForInInt { */ ``` -**range()**方法已经被重载,重载表示相同的方法名可以具有不同的参数列表(你将很快学习重载)。**range()**的第一个种重载形式是从0开始产生值,直到范围的上限,但不包括该上限。第二种重载形式是从第一个值开始产生值,直至比第二值小1的值为止。第三种形式有一个步进值,因此它每次的增量为该值。第四种**range()**表明还可以递减。**range()**是所谓生成器的一个非常简单的版本,有关生成器的内容将在本书稍后进行介绍。 +**range()** 方法已经被重载,重载表示相同的方法名可以具有不同的参数列表(你将很快学习重载)。**range()** 的第一个种重载形式是从0开始产生值,直到范围的上限,但不包括该上限。第二种重载形式是从第一个值开始产生值,直至比第二值小1的值为止。第三种形式有一个步进值,因此它每次的增量为该值。第四种 **range()** 表明还可以递减。**range()**是所谓生成器的一个非常简单的版本,有关生成器的内容将在本书稍后进行介绍。 -**range()**允许在更多地方使用for-in语法,因此可以说提高可读性。 +**range()** 允许在更多地方使用for-in语法,因此可以说提高可读性。 -请注意,**System.out.print()**不会输出换行符,因此您可以分段输出一行。 +请注意,**System.out.print()** 不会输出换行符,因此您可以分段输出一行。 -*for-in*语法不仅可以节省编写代码的时间。 更重要的是,它更容易阅读并说明你要做什么(获取数组的每个元素)而不是详细说明你是如何做到的(“我正在创建这个索引,所以我可以使用它来选择每个数组元素。“)。 本书只要有可能就会使用*for-in*语法。 +*for-in* 语法不仅可以节省编写代码的时间。 更重要的是,它更容易阅读并说明你要做什么(获取数组的每个元素)而不是详细说明你是如何做到的(“我正在创建这个索引,所以我可以使用它来选择每个数组元素。“)。 本书只要有可能就会使用 *for-in* 语法。 ## return -在Java中有几个关键字代表无条件分支,这意味着分支在没有任何测试的情况下发生。 这些包括**return**,**break**,**continue**和跳转到带标签语句的方法,类似于其他语言中的**goto**。 +在Java中有几个关键字代表无条件分支,这意味着分支在没有任何测试的情况下发生。 这些包括**return**,**break**,**continue** 和跳转到带标签语句的方法,类似于其他语言中的 **goto**。 -**return**关键字有两方面的用途:一方面指定一个方法返回什么值(假设它没有**void**返回值),另一方面它会导致当前的方法退出,并返回那个值。可据此改写上面的**IfElse.java**里的**test()**方法,使其利用这些特点: +**return**关键字有两方面的用途:一方面指定一个方法返回什么值(假设它没有 **void** 返回值),另一方面它会导致当前的方法退出,并返回那个值。可据此改写上面的 **IfElse.java** 里的 **test()** 方法,使其利用这些特点: ```java // control/TestWithReturn.java @@ -350,15 +353,15 @@ public class TestWithReturn { */ ``` -不需要**else**,因为该方法在执行返回后不会继续执行。 +不需要 **else**,因为该方法在执行返回后不会继续执行。 -如果在返回**void**的方法中没有**return**语句,则在该方法结束时会有一个隐式的**return**,因此一个方法中并不总是需要包含**return**语句。 但是,如果您的方法声明它将返回除**void**之外的任何返回类型,则必须确保每个代码路径都返回一个值。 +如果在返回 **void** 的方法中没有 **return** 语句,则在该方法结束时会有一个隐式的 **return**,因此一个方法中并不总是需要包含 **return** 语句。 但是,如果您的方法声明它将返回除 **void** 之外的任何返回类型,则必须确保每个代码路径都返回一个值。 ## break and continue -在任何迭代语句的主体部分,都可以使用**break**和**continue**来控制循环的流程。 其中,**break**退出循环而不执行循环中的其余语句。 而**continue**停止执行当前的迭代,然后退回循环起始处,以开始下一次迭代。 +在任何迭代语句的主体部分,都可以使用 **break** 和 **continue** 来控制循环的流程。 其中,**break** 退出循环而不执行循环中的其余语句。 而 **continue** 停止执行当前的迭代,然后退回循环起始处,以开始下一次迭代。 -下面这个程序向大家展示了**break**和**continue**在**for**和**while**循环中的例子: +下面这个程序向大家展示了 **break** 和 **continue** 在 **for** 和 **while** 循环中的例子: ```java // control/BreakAndContinue.java @@ -399,23 +402,23 @@ public class BreakAndContinue { */ ``` -**[1]**在这个**for**循环中,**i**的值永远不会达到100;因为一旦**i**达到74,**break**语句就会中断循环。通常,只有在不知道中断条件何时满足时,才需要这样使用**break**。因为**i**不能被9整除,**continue**语句就会使执行过程返回到循环的最开头(这使**i**递增)。如果能够整除,则将值显示出来。 +**[1]** 在这个 **for** 循环中,**i** 的值永远不会达到 100;因为一旦 **i** 达到 74,**break** 语句就会中断循环。通常,只有在不知道中断条件何时满足时,才需要这样使用 **break**。因为**i** 不能被 9 整除,**continue** 语句就会使执行过程返回到循环的最开头(这使 **i** 递增)。如果能够整除,则将值显示出来。 -**[2]**使用for-in语法将产生相同的结果。 +**[2]** 使用 for-in 语法将产生相同的结果。 -**[3]**最后,可以看到一个"无穷**while**循环"的情况。然而,循环内部有一个**break**语句,可中止循环。请注意,**continue**语句将控制权移回循环的顶部,而不会执行**continue**之后的任何操作。 因此,只有当i的值可被10整除时才会显示。在输出中,显示值0,因为0%9产生0。 +**[3]** 最后,可以看到一个"无穷 **while** 循环"的情况。然而,循环内部有一个 **break** 语句,可中止循环。请注意,**continue** 语句将控制权移回循环的顶部,而不会执行 **continue** 之后的任何操作。 因此,只有当 i 的值可被 10 整除时才会显示。在输出中,显示值 0,因为 0%9 产生0。 -无限循环的另一种形式是**for(;;)**。 编译器以同样的方式处理**while(true)**和**for(;;)**,因此使用哪种取决于编程品味。 +无限循环的另一种形式是 **for(;;)**。 编译器以同样的方式处理 **while(true)** 和 **for(;;)**,因此使用哪种取决于编程品味。 ## 臭名昭著的goto -goto关键字很早就在程序设计语言中出现。事实上,goto是汇编语言的程序控制结构的始 祖:“若条件A,则跳到这里;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码,就 会发现程序控制里包含了许多跳转。然而,goto是在源码的级别跳转的,所以招致了不好的 声誉。若程序总是从一个地方跳到另一个地方,还有什么办法能识别代码的流程呢?随着 Edsger Dijkstra著名的“Goto有害”论的问世,goto便从此失宠。 +goto 关键字很早就在程序设计语言中出现。事实上,goto 是汇编语言的程序控制结构的始 祖:“若条件A,则跳到这里;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码,就 会发现程序控制里包含了许多跳转。然而,goto是在源码的级别跳转的,所以招致了不好的 声誉。若程序总是从一个地方跳到另一个地方,还有什么办法能识别代码的流程呢?随着 Edsger Dijkstra 著名的 “Goto 有害”论的问世,goto 便从此失宠。 -事实上,真正的问题并不在于使用goto,而在于goto的滥用。而且在一些少见的情况下,goto 是组织控制流程的最佳手段。 +事实上,真正的问题并不在于使用 goto,而在于 goto 的滥用。而且在一些少见的情况下,goto 是组织控制流程的最佳手段。 -尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在 break和continue这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳 转,而是中断循环语句的一种方法。之所以把它们纳入goto问题中一起讨论,是由于它们使 用了相同的机制:标签。 +尽管 goto 仍是 Java 的一个保留字,但并未在语言中得到正式使用;Java 没有 goto。然而,在 break和 continue 这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳 转,而是中断循环语句的一种方法。之所以把它们纳入 goto 问题中一起讨论,是由于它们使 用了相同的机制:标签。 “标签”是后面跟一个冒号的标识符,就象下面这样: @@ -423,7 +426,7 @@ goto关键字很早就在程序设计语言中出现。事实上,goto是汇编 label1: ``` -对Java来说,唯一用到标签的地方是在循环语句之前。进一步说,它实际需要紧靠在循环语 句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一 理由是:我们希望在其中嵌套另一个循环或者一个开关。这是由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。如下所示: +对 Java 来说,唯一用到标签的地方是在循环语句之前。进一步说,它实际需要紧靠在循环语 句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一 理由是:我们希望在其中嵌套另一个循环或者一个开关。这是由于 break 和 continue 关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。如下所示: ```java label1: @@ -441,13 +444,13 @@ outer-iteration { } ``` -**[1]** **break**中断内部循环,并在外部循环结束。 +**[1]** **break** 中断内部循环,并在外部循环结束。 -**[2]**,**continue**移回内部循环的 起始处。但在条件3中,**continue label1**却同时中断内部循环以及外部循环,并移至**label1** 处。 +**[2]**,**continue** 移回内部循环的 起始处。但在条件3中,**continue label1** 却同时中断内部循环以及外部循环,并移至 **label1** 处。 **[3]**随后,它实际是继续循环,但却从外部循环开始。 -**[4]**,**break label1**也会中断所有循环,并回到**label1**处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。 +**[4]**,**break label1** 也会中断所有循环,并回到 **label1** 处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。 下面是for循环的一个例子: @@ -516,11 +519,11 @@ break outer */ ``` -注意**break**会中断**for**循环,而且在抵达**for**循环的末尾之前,递增表达式不会执行。由于**break** 跳过了递增表达式,所以递增会在**i==3**的情况下直接执行。在**i==7**的情况下,**continue outer** 语句也会到达循环顶部,而且也会跳过递增,所以它也是直接递增的。 +注意 **break** 会中断 **for** 循环,而且在抵达 **for** 循环的末尾之前,递增表达式不会执行。由于 **break** 跳过了递增表达式,所以递增会在 **i==3** 的情况下直接执行。在 **i==7** 的情况下,**continue outer** 语句也会到达循环顶部,而且也会跳过递增,所以它也是直接递增的。 -如果没有**break outer**语句,就没有办法在一个内部循环里找到出外部循环的路径。这是由于 **break**本身只能中断最内层的循环(对于**continue**同样如此)。 当然,若想在中断循环的同时退出方法,简单地用一个**return**即可。 +如果没有 **break outer** 语句,就没有办法在一个内部循环里找到出外部循环的路径。这是由于 **break** 本身只能中断最内层的循环(对于 **continue** 同样如此)。 当然,若想在中断循环的同时退出方法,简单地用一个 **return** 即可。 -下面这个例子向大家展示了带标签的**break**以及**continue**语句在**while**循环中的用法: +下面这个例子向大家展示了带标签的 **break** 以及 **continue** 语句在 **while** 循环中的用法: ```java // control/LabeledWhile.java @@ -573,25 +576,25 @@ break outer */ ``` -同样的规则亦适用于**while**: +同样的规则亦适用于 **while**: -(1) 简单的一个**continue**会退回最内层循环的开头(顶部),并继续执行。 +(1) 简单的一个 **continue** 会退回最内层循环的开头(顶部),并继续执行。 -(2) 带有标签的**continue**会到达标签的位置,并重新进入紧接在那个标签后面的循环。 +(2) 带有标签的 **continue** 会到达标签的位置,并重新进入紧接在那个标签后面的循环。 -(3) **break**会中断当前循环,并移离当前标签的末尾。 +(3) **break** 会中断当前循环,并移离当前标签的末尾。 (4) 带标签的**break**会中断当前循环,并移离由那个标签指示的循环的末尾。 -大家要记住的重点是:在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中**break**或**continue**。 +大家要记住的重点是:在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中 **break** 或 **continue**。 -**break**和**continue**标签已经成为相对少用的推测特征(在前面的语言中很少或没有先例),所以你很少在代码里看到它们。 +**break** 和 **continue** 标签已经成为相对少用的推测特征(在前面的语言中很少或没有先例),所以你很少在代码里看到它们。 -在**Dijkstra**的**“Goto有害”**论中,他最反对的就是标签,而非**goto**。随着标签在一个程序里数量 的增多,他发现产生错误的机会也越来越多。标签和**goto**使我们难于对程序作静态分析。但是,Java标签不会造成这方面的问题,因为它们的应用场合已经收到了限制,没有特别的方式用于概念程序的控制。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。 +在 **Dijkstra** 的 **“ goto 有害”** 论中,他最反对的就是标签,而非 **goto**。随着标签在一个程序里数量 的增多,他发现产生错误的机会也越来越多。标签和 **goto** 使我们难于对程序作静态分析。但是,Java 标签不会造成这方面的问题,因为它们的应用场合已经收到了限制,没有特别的方式用于概念程序的控制。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。 ## switch -**switch**有时也被划归为一种选择语句。根据整数表达式的值,**switch**语句可以从一系列代码中选出一段去执行。它的格式如下: +**switch** 有时也被划归为一种选择语句。根据整数表达式的值,**switch** 语句可以从一系列代码中选出一段去执行。它的格式如下: ```java switch(integral-selector) { @@ -605,11 +608,11 @@ switch(integral-selector) { } ``` -其中,integral-selector(整数选择因子)是一个能够产生整数值的表达式,**switch**能够将这个表达式的结果与每个integral-value(整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相 符的,就执行default语句。 +其中,integral-selector (整数选择因子)是一个能够产生整数值的表达式,**switch** 能够将这个表达式的结果与每个 integral-value (整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相 符的,就执行 default 语句。 -在上面的定义中,大家会注意到每个**case**均以一个**break**结尾。这样可使执行流程跳转至 switch主体的末尾。这是构建**switch**语句的一种传统方式,但**break**是可选的。若省略break, 会继续执行后面的**case**语句的代码,直到遇到一个**break**为止。尽管通常不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的**default**语句没有**break**,因为执行流程已到了break的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在**default** 语句的末尾放置一个**break**,尽管它并没有任何实际的用处。 +在上面的定义中,大家会注意到每个 **case** 均以一个 **break** 结尾。这样可使执行流程跳转至 switch 主体的末尾。这是构建 **switch** 语句的一种传统方式,但 **break** 是可选的。若省略break, 会继续执行后面的 **case** 语句的代码,直到遇到一个 **break** 为止。尽管通常不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的 **default** 语句没有 **break**,因为执行流程已到了break的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在**default** 语句的末尾放置一个 **break**,尽管它并没有任何实际的用处。 -switch语句是实现多路选择的一种干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是int或char那样的整数值。例如,假若将一个字串或者浮点数 作为选择因子使用,那么它们在switch语句里是不会工作的。对于非整数类型,则必须使用一 系列if语句。 下面这个例子可随机生成字母,并判断它们是元音还是辅音字母: +switch 语句是实现多路选择的一种干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是 int 或 char 那样的整数值。例如,假若将一个字串或者浮点数 作为选择因子使用,那么它们在 switch 语句里是不会工作的。对于非整数类型,则必须使用一 系列 if 语句。 下面这个例子可随机生成字母,并判断它们是元音还是辅音字母: ```java // control/VowelsAndConsonants.java @@ -656,9 +659,9 @@ z, 122: consonant */ ``` -由于**Random.nextInt(26)**会产生0到26之间的一个值,所以在其上加上一个偏移量"a",即可产生小写字母。在**case**语句中,使用单引号引起的字符也会产生用于比较的整数值。 +由于 **Random.nextInt(26)** 会产生0到26之间的一个值,所以在其上加上一个偏移量 "a",即可产生小写字母。在 **case** 语句中,使用单引号引起的字符也会产生用于比较的整数值。 -请注意**case**语句能够堆叠在一起,为一段代码形成多重匹配,即只要符合多种条件中的一种,就执行那段特别的代码。这时也应该注意将**break**语句置于特定**case**的末尾,否则控制流程会简单地下移,处理后面的**case**。 +请注意 **case** 语句能够堆叠在一起,为一段代码形成多重匹配,即只要符合多种条件中的一种,就执行那段特别的代码。这时也应该注意将 **break** 语句置于特定 **case** 的末尾,否则控制流程会简单地下移,处理后面的 **case**。 在下面的语句中: @@ -666,11 +669,11 @@ z, 122: consonant int c = rand.nextInt(26) + 'a'; ``` -**Random.nextInt()**将产生0~25之间的一个随机**int**值,它将被加到**"a"**上。这表示**"a"**将自动被转换为**int**以执行假发。为了把**c**当作字符打印,必须将其转型为**char**;否则,将产生整数输出。 +**Random.nextInt()**将产生0~25之间的一个随机 **int** 值,它将被加到 **"a"** 上。这表示 **"a"** 将自动被转换为 **int** 以执行假发。为了把 **c** 当作字符打印,必须将其转型为 **char**;否则,将产生整数输出。 ##Switching on Strings -Java 7增加了在字符串上**switch**的用法。 此示例展示了您从一组String可能性中选择的旧方法,以及使用switch的新方法: +Java 7增加了在字符串上 **switch** 的用法。 此示例展示了您从一组String可能性中选择的旧方法,以及使用switch的新方法: ```java // control/StringSwitch.java @@ -718,9 +721,9 @@ RED 一旦理解了switch,这种语法就是一个逻辑扩展。 结果更清晰,更易于理解和维护。 -作为**switch**字符串的第二个例子,我们重新访问Math.random()。 它是否产生从0到1的值,包括还是不包括值“1”? 在数学术语中,是(0,1),还是[0,1],还是(0,1)还是[0,1]? (方括号表示“包括”,而括号表示“不包括”。) +作为 **switch** 字符串的第二个例子,我们重新访问 Math.random()。 它是否产生从 0 到 1 的值,包括还是不包括值“1”? 在数学术语中,是(0,1),还是[0,1],还是(0,1)还是[0,1]? (方括号表示“包括”,而括号表示“不包括”。) -下面一个可能提供答案的测试程序。 所有命令行参数都作为**String**对象传递,因此我们可以**switch**参数来决定要做什么。 有一个问题:用户可能不提供任何参数,因此索引到args数组会导致程序失败。 要解决这个问题,我们检查数组的长度,如果它为零,我们使用一个空字符串,否则我们选择**args**数组中的第一个元素: +下面一个可能提供答案的测试程序。 所有命令行参数都作为 **String** 对象传递,因此我们可以 **switch** 参数来决定要做什么。 有一个问题:用户可能不提供任何参数,因此索引到args数组会导致程序失败。 要解决这个问题,我们检查数组的长度,如果它为零,我们使用一个空字符串,否则我们选择 **args** 数组中的第一个元素: ```java // control/RandomBounds.java @@ -761,7 +764,7 @@ or java RandomBounds upper ``` -使用onjava包中的TimedAbort类,程序在三秒后中止,因此看起来Math.random()从不生成0.0或1.0。 但这就是这样一个实验可以欺骗的地方。 如果考虑0到1之间所有不同**double**类型的分数(double fractions)的数量,实验中达到任何一个值的可能性可能超过一台计算机甚至一个实验者的寿命。 结果是0.0包含在**Math.random()**的输出中,而1.0则不包括在内。 在数学术语中,它是[0,1)。 您必须小心分析您的实验并了解它们的局限性。结果是0.0包含在**Math.random()**的输出中,而1.0则不包括在内。 在数学术语中,它是[0,1)。 您必须小心分析您的实验并了解它们的局限性。 +使用 onjava 包中的 TimedAbort 类,程序在三秒后中止,因此看起来 Math.random()从不生成 0.0或 1.0。 但这就是这样一个实验可以欺骗的地方。 如果考虑0到1之间所有不同 **double** 类型的分数(double fractions)的数量,实验中达到任何一个值的可能性可能超过一台计算机甚至一个实验者的寿命。 结果是0.0包含在 **Math.random()**的输出中,而 1.0 则不包括在内。 在数学术语中,它是[0,1)。 您必须小心分析您的实验并了解它们的局限性。结果是 0.0 包含在 **Math.random()**的输出中,而 1.0 则不包括在内。 在数学术语中,它是 [0,1)。 您必须小心分析您的实验并了解它们的局限性。 From 13c295b09eae7d7643d354bcb6768df738607ad3 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 17 Mar 2019 12:53:42 +0800 Subject: [PATCH 017/814] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=8B=E9=93=BE=20?= =?UTF-8?q?effective=20java=203=E4=B8=AD=E6=96=87=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 2535617a..470f5027 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,11 @@ 如还有其它问题,欢迎发送 issue,谢谢~ +## 友情链接 + +[Effective.Java.3rd.Edition 中文版](https://sjsdfg.github.io/effctive-java-3rd-chinese/#/) + + ## 捐赠鼓励 **捐赠1毛,鼓励作者!** From a40360b8e922886b7df59c09287fb4fb7ed6b19b Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 17 Mar 2019 13:01:42 +0800 Subject: [PATCH 018/814] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E6=8D=90=E8=B5=A0=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 -------- images/alipay.PNG | Bin 34677 -> 0 bytes images/wechat.PNG | Bin 42189 -> 0 bytes 3 files changed, 8 deletions(-) delete mode 100644 images/alipay.PNG delete mode 100644 images/wechat.PNG diff --git a/README.md b/README.md index 470f5027..d55187e5 100644 --- a/README.md +++ b/README.md @@ -93,14 +93,6 @@ [Effective.Java.3rd.Edition 中文版](https://sjsdfg.github.io/effctive-java-3rd-chinese/#/) -## 捐赠鼓励 - -**捐赠1毛,鼓励作者!** - -
-微信捐赠 -支付宝捐赠 -
## 开源协议 diff --git a/images/alipay.PNG b/images/alipay.PNG deleted file mode 100644 index f345f910fc3730f63621e516ffead1ccb6f968b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34677 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 agX72E1at6|zaKmX|J_nlQ^=7s^7%i$$xlcC diff --git a/images/wechat.PNG b/images/wechat.PNG deleted file mode 100644 index 4f687a3945d0163414bbf1a976f6ea175252fcb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42189 zcmd42^;=Y5*f%O&A`Jo(L#H50NHf&XFm#K82+|!QHMGLe-3@|D4BaB7C@I}Yhotmb z_S8AwCWMojZ33m0)u4J9p3uZhvsG!I8JB zT7uvYnk!rpdZ%*m!3KDPX)U8BbLY z$;s$=neAkHz9H{9yCFnZ3cwF%i{MJT13}9RUT-;_^X(}*o$GMZwtGiVuStkaoBU>H zBHA}fWk$u09Th(j(Ud8&a(emuaZlRfZtRn~8720Ov*jyNnCIi_>ZZdvYmc?bt!vi} zDHhxyM%;$)?l*fkS5l;yGQ@}(1;p(^1SS)U3^68zg&2YdPJsmCDiLGK;Nr=_z&j|6 z5qf(v6rCiF5jTjKG#q(*DN_3XN0-V(<86S6$~SgwNxVld&SCO<;`586tJC@FE31Q@ zy7}Qu&$+%N3zy5k&gY9^3=;w~`_~tHICj}|qHf`4J{zp4tY*yf(=QQZ+d`q}F_PyT zS8Gx?7Sj#~ztbIudFy66lNJN~PPVIm4BuRzN}=xhpB?`)-#Bf%kucWhZ`eUiua|#p zeLih@aQH)N1dL=LNlWwTo4@=mS0~eU{#d~e$c80OXJiXil8btKVT%G|<@&`Ml4pn= zzIY<3OJtc|MSqgT@Fxq|^DXn6{-i~0+)C9{0Xx%cc(a%D)F%rJ(?++53hs{q*YZ-X z)A#Y;J$M?|da)~p+F`@F_aG-Fbis~5z9E4$C?a$MdI_L$xEr=| zuw4?!s)QU2KLgjB&Y`Ip@0e3e{Dh85B zB37-JT)i(~8D5KIVq%(TeDLYVWop&(`2c2AWH5xKa)-@8h3pl?`FKUJe&?X5ouJgP z`elvXq<~R_i&d7@?o5M^3}>AmTkb;^9yXJf55mAB6^1nW_tFsy_ z(>?krOJtMkWF_(}`+EN7${clJcXqHknj?dOnst!&f5#wY#t>|BK_}!e12cc~2W#4c z%ox($-941?)ODiq0RR4r#{vQqJC8Z{p`Fp!8^zg2?FssUF&9Y3r9*vwr&>=4HOL@VqHsAGaPbbuuy~>U zyAiy`5Q}*ga8wS~3PY^Wlf*GVJ9P#070hIcw%^3!ZcHI@`>06beC1#QR%^lFtX>Hg z`v0O3hbSlOFj4a2Ln~V-Ni@_y0a_^}NZ^e(-StW)RZpu9M$y?DS*h^_b!;pGf=o zh#ha*SCGjp>p-?9*Sia@q!2@VykJuOPz;Zw5CW$UqL8*{#U5-2qg%LO1e z=<`J`qlPdsuKC(7JCiI(`=QW_y{0|M*{{-{Ui93{R1e$Y6JDs@y*dBYHi1f?z%NyJ zPxHimQwQ}hKAv6UCAVybwE^OWF>fu-#nqU|L-@fFp_GFrTCr+-Dn zAeqs6bM1?|OLmtjmy6}z-I{wdH!c3wLD%vR#Xu~yJ0E~}zt(enIf37ol=|5ErSIoJ zzgoWwk4%d|?k=V|8b)vRuOiUec-CT5yArK#K{mKW%3ZL4& zLmxe9!ZkpUV?wY52qOq#!{Hqnuj7@>h~XQ`MF4j2?4WF}(>A+3-qVkP7@NJv3A z_{+iGYW_r!Z;}jyGB=n+qWZIqsi2$$@@M61LMCn>>22g7R#Zw9VN5LMaxigH$Qihd z2)qIT3F4LSUqa;}ft)d&B0X3aFZo?X@Fb8D?&4B~+eZ+AoMDDm z$$^{Mg&?pzKpp#al}xd*vEj4$kOlqi-^H-`w`n(DUzf%@2XJ>;f}F1hooe%M+oi3% z8@9gwikGFJ)_Lj$YQTneJcq}m9?9E<$$k!!eK)Fy(BLLWn8LU2JMGcO@2$0kdKE@T zgJOFowb>#M&6;1ilUNL_^u@a?;1s{9e7nufGxJ>?*83sA?{!k_WShN!cKH82HZqz? z>|IbId7iqhBa?88rmE1nr~e>m^h5hbG^FeW0~imx{uS!QJKi6RYLyjDP0}AIyt^;6 zHD2*zfd8rU65{RqC%@>0-yD7y78O{YvK+2+G`~7`bMS9O%iA3(CNfS|3cE+g!Ne2< z3gdm9Sn7=Of!oEkeX8a}UsPE5d0v=W%;Q7!QT?@WETgVfs;B19SpnCJcq+!_h+!_qPj=E#T(f`6&`Y}Il>$9}u-dJY4oAm!O4C^&6 z-YH4Fzyt6Md!clj(0+&P)gmOiw3Mfb8e}xc>;lKYd{fi3_E@%Je)L!AQkw~u<`Z(W} z+|UJPB0)?Bk~mf@PALA7D2p*;!Iv*`sE1_#65IdYMBAfvB^eiw`kv<8JU~sVGT94b z^Fq*0bfe0A7Eh?d*w@}eB*&;*1Nc!bZXJTyf zr>E9vmR)}H1um=oK3b3KvQj7`!SIMhp!7P^FJ%EpDiY`Kw(| z!&`V*1~0@1MR7)~{%}xiQs4mp77VJT3b0Ne-VMqUab_|O?OTqKQqT6ke%h3+ilkc^ z(>J#Q@#1%0Gv>_(J&_6xK47^s zRf|SJYPR*gcAABgGs2?KNqt+)MWqx)+Vef)5t$_>itF*pCGTH7&DgOs{L2{+Ex zvaJW4y7bNc3S)d7q*5n#s~y{}lCD|-?m_ZefRt({;n0pXds}f(eVBg3)z%uyFxa!x zKv|HnvLqJz`SEIypKi9s%6m|p2G3OGipWUdLYQ#a9d8(WQh*|N@Z;ypF9ELYJ`dzN>sp5YZ zf=Bb@2|(~?UrYHkdgnFvD-riAlHPe9^Z82ue{BuW^-C3S-{qhW%<1(g5;$pBZFq ztc-@#)e`{aA9U@toMvg){g78j)zmLxK zF!+DaW^}fy&jskyCo-~p0JHSH9p>FsYpRgH027hY(yCDLnORPgtD^H3Xexl>s|d?g z&0#K>A&>jMKnXjDLVhxLRe_}(tn~BWRu`}`5G*8dME{kce^uuV$ci9k^zuR$bbMe^iC>tqWcn}cVF(s&4@r>AR6yx;kb`-pKzDDG*KN%LHv*Lm9rB*~aVRfy%F1{` zrWCZFh-6rnNa72M^EM@rK)}6k;a3FGi{~jx9!o}NfV^jr z%9`^#H9cR?k2&BmsIhr`e>DmDDUE@h{Fg_3R~V6Yrl|W-c~3Rd!-vuKF~YFLPLPcN za`72r`$ZpLH|L|$W|j`}5$78wX6DJ0lxIIf?CJ$nX#{Nxs2E)B1-t=#bW^|qX|KSi zle@h^C>7C&MCwINOOiF8&;Ca5(SyBW5D;^^atw0iX{yu20I<>+NfA;G2p?9r2zLE{ zfZQ61j)CE1hILl{=^z_G;u%s>^`e9X@@x;^#||?hrgfgSRAe9U>y+paGWOS(XN`U) zPwx@0=E+A*oTTWK>wV{PC;me5ZdAr3UDZw-N8-;HvhzdmItWs*jcsELd0HCm#N#x* z9`M3u{bw$~)F`NcHjb5ijyBFBI{KQ3zP=gSix1zsWdf<-GE8*{1m@@a0SyAGp+pQ0 ziCleb4P4l@g0IKd0siVj3tkDrA^>pwQmHbsMg`W+qyNFgz1&C-rBHbfDc#_ zLJ)qA@g~P0-bSgO-kt@8`mZRsj0GWZOYe}}h4`IJT7!{v5W~H^M2tga9q>7kAG3Qk zp!lNz-*DbA0baOLjH`rj69gEAL&}OB+TRwA#3u%T)S@eNHHx!I^DRT%zjO%2A%UYY zNy)>!Z&T&hiD$S<|FF_OLI^4(=_U!>0gp4`u^^zBAnO5&`9Co0zcNU{2xdxJ(uy4* zqkkdY-?m~5nf1T9O32Ep)ZWCUpQ?Rbj3ZLnrV7B(HgPXgKzELz^GYv?U!03o3Z?+G zlY7v5FryU5uTt&a$Ci_{!SRkniy$(q<*)C-m*i{SM<=8fKtnvn@d{eNwy}DK`{LOruko>;vay)Fx3Chdgklnz z`(L@ENH9K8km@0sLkRM+KZHj_3p^O&rFh-~Ieb%F21JYlELb z(E9xW1wMIJGG3Yh&ppqfQjLvB@^4P7&l+mTaXv+Q1TP!tLM@m&Zu2L`O z?cD%w4t6&Tq$Hg~4UAa@{c=|U5zE8^5j*&RL^9!&@Bc|#&sYM)w&=FH*~jz&8HT~< z>i8F!2IL@SsSC&_=m0z?+5F5w69lVWC5g|x5{CrLH43V%s%p9Q$Y!)8_HB#6sUKNE zbw{3l<=yyubfW96zo+bs-=Iv(RIvUG_o(=8v4*O2T3)tGxawh{pnqqbD`+jCCiP^FxZQBdnm z+4KsnyMgePqyG`4$Im3Bm{neXp0^yNmk*%%3BMla0Rvm9nr`!#0*FcPVEQh;$VQs5 zVqsw>7Ge^T4%9T}$K8nrS9aqV;rjMP zpvt7OG5S?jHe(JGW4Z9RUFFP5&u{~b43Yafp0NcWp$1pEfx`kg&F>( z03^lM%LA26oPVXYPuCvkS}mb-tJ?s|J>LOO|-9{m&+^u|o8+sd;2Pz0l?t+;}B)Wu^buexOJ2NvtgX{ol zB5@;%8Pz8L0q;McR7(B7$0p}w`ztubNZ{*?&;x+h8DNMn@#aO_c6*SJ16e|*f}cRn z_&?|8s7>CcP!PinVgKhKJIL^43EW+Tq_>jU7iQ=|_5(6fY?}<7`#(QY6a;nPA7}z~ z>=Yu8UxjIjML#6}q#MkFKK)&qC*gn+9sd44LZHylIOBAFWV1P3NMM{S+Y?Q<0Vv%! zk6il_jmgEaxiBJzlc#Jg4FHQAU9o|fl_n?!eAw;!(i^A>#wfeo!A!C0i+(h!heB|| z8YHsPb|_EYE`25-WZ^bCJ;>~EC=~&!S$J%~|1Hr1{?SZA)P0kD`iAW`!HzBMgfYA| z;6trWk@GZq?x_=r@81Ce5b_076fnGKT>cWApo~`dof0Y>VxVjdHeI(}pKtMWBtG*X z!DzSMH>|uXynsK&h7ru$c6kt$#IK)>aeWOKBw%-V?vO<$4mP&0YhFj#XA}74CCGnB ztTQK);sk`y%O6=4e4+Jzs{tQq!fgqxtLeb{k5+q-Z<0Q9o4X9vdcJmdZ@5{4y7yN# z1fK$w%Sdw0=e2zMFJGn;$Ysz@W?BbgA1_}1o+7*Jq6$-tp|5RJ#RZYq=IKCeD(E!Ie!v-mMRT{z#>U2OT8;P$5a1?|X8)=dDklQf`zHX$ejR;d zxNN5Gk!T+R!4v=$2lKwG7faCi8fabsm z#g}v;x)lquni*MYV#~{OAkYI0Kpz37%X)^3=l6YVl@YoWi_7U1j=Yrq$4kX?A3zrW zy!Hp6F7Ic>Y9<%Hpy!|*?AmalKrbsECZKy;m-{r2QYYC8teTh>R5S_l40BRJe zr7QTKk7NUh@(eJ84Nw6^AImU`xc+`OmIpUR3NHWsvutO|rXg{hFou619aN)vI^#<8 zo?aqt7Uv#7^M&8jg{yZwy5?GZD=5X75|sh}1InJo=4h!KAo|tz0x~{Dcw}s!0Q%-e zW1<9NZXh|_z#v845J7-hxzq4H5Ci7}CMg9);bQ|QtCSq^^v`!ERqQDDag1P&Eyqds z?$o0$2n3>=fp23caVxPS0&iomSL@TT*V31WZJB4JbaZN9Apn)(>`xEFaX_DaHeMxa zWMsr$?mjLu2$OVi(*>gv1q7vU<5odOim>I*L=shg`<~;rK2Ya8XC*6vnES;lK9WmP z((L2t+SE!Y;77XVPn_)qHUQ1^JLqEvPaTPlt@m&Ir0w!_zjig-J?7C(oWP(9ii(EC z_L{p++WMGd#GzILNmg5r@CuN~Rdg!-UbfEKS##pVd5>v(px1*hkU+bD=%V28Buw7c6+N}!&aF8=D1qo^Q-;g=1ms9`Y5?}3OsMY} zyo=(&A)tErEiRE;e|YO-+aQqo@80cYYOn3Xw9!f8G3*>)4egGi+7f7JRK3R_X-6>x zq|>)o=QSQXMyQAW9g?!B=<)mVGr&9=(&&9K=r~EnGaEB4RHpE_m44yAQ? zHoX%1o>qACYM^#@WuYV3sM91n^%j@5`Yc7Tf0&}`U%3A%LWln^)2%jwH)x-J=zMj4 ztmjwv=FG+K_PL4gw_{AcRPT`V1u<4#;R$HQXtTE~ia`~>8R@YzRj9A`V%75{BOT5? z+`DGrc>{s&^3|k;Hf7~=QP16P02FY(Vic*Q_m>$*|A4Q!NmlugY-Q_w!2G%sHTy*m zW-vQAwj3HBj_Vin^4E`vml>+yCcxJk49h~eccQMnsEE3 z2z&fuX?(nA{?0pnDhv0eJ+LYnRGrkHi6()fy3xh|x?@L!OtpIH4WOekX^(K@!Qs+; zC#`Qg>}2VFp&uTL{HTA+4`d{0eZ=6JXb+k;u28UXjtp1c$<8#$3Y_Mx&4cV9_Co=* zmDZqec28aKll;$L0!jor-pOQ|;OnYcYd~{i$G-qB^pFYZ5ys6--ac9h^dI9(61WE- zE_@63d*82=QBzYJg@P}(_9Ocjl>vB>l7|9I2RU42H8A0$DhKo$25<%AE!74x{L2eU z$e#%X*csY?It-vQw;JC+wN}LeuN0_UAaw&yax3zIBK}Xt1G&0N4x9yqB%tkrmC*{q z8D!d9&G=SX0{Y?qtL*$ENVocL4+A9kV}rl}E#TMi1)%X7-+y;!92;$I{`VfRD82^Z z_m%!?qF`ES-VnUPjmO$huR0L2AUK=5Yzu0^VC<(;MKUF{9 zU+B==JFmlHr`Jn!wRf3l^=s1gcn^3*eV(}U66SOfNVnNL^KDW&sWkl3%*&VnIGkWq z&Q(ua-(Nt=2XHf|0NJ^pD}*RIaN4mg6Og`)x+qHC=UW0D=(_2WsP{<8%YE6aDQ5uj z>vOs!7pGSE0N*Nn`91CPj!<76RMcZTWiFyVZSY>@i(A539$+(4^x3^0O{;tF?P*ha zrI3i^&84f~>Ht7xdMtvPyCH(c#Ayx2olH>+ZBPLAjaYUi$bNYL^ zn0i;sA`2(6N=+U+=xGD@oQ_i%8E8(h5M5)d0UHbjBOTs-iDW!T_T5`HI=%A#`=fyC z3f*!_<78nIf1elJEbX;Dw3cjvjP)n=fv>BD&-89#%b0%cjKW2f6tqgI(pIGuUU+mx z1s4AFFAZsW6toI0n6~JozA*^TB?N2ptsFmsydM*w?C)bug!gNl1T$y7u_2QMxp=_U zPWVh2N0<_)xTFJI5|H0%iC3{)UUp%V#9{pl{5j@2GbxK;fSm!txV1X$LM$)N@&2uw zteJO6yQ1xXv3?0sI1bRmJ89J#8iRo3Dgj_F`zSa$A(I!#S+{}}Kqg>bUnl_yN+t@q zzryy5P57U(WOxg0IGdV*?g}mgfGG~^9~w$HCBDVV6?2E?PUaV|J)JOXRoal-@TR|)GXo0)^jdaR@Tq%sg}ujUFOKp z-ykx;B=gPtoo1SGM3Tk4Zo-IW{V=cqY}JQmcH>HmkCANpp|sb3d!&p^mhiOKF~SC7p*5N_Z#}zWnH4#Ngpw)- z2o0>i+Gm3mLOMLpsNBiuQt_+@I1+JR-_!O4k<&gqS|3Wt$oS?_Lks34fd}Xqpg+Q8 ze?f+>c<{7&pdbIu+=W>9f!)C!rq|dm0Z&&`tVC{pY@g2DTpVu|^L?s+EBKjW_*RXi z%60Yo9ZF^91u@o=HQ;MGBE7hJ=JG@0)ZjRR7pO*+%9iwtQT&)tw#vs*Z2co^`y>^JHCUvokY}3hqjbL_Iy&`WsD;f^;40Vw7jN|xG8wdPe`~%p zsUa0`fSe^T6QFz3E7dz@g>D0}X4F^U|4b3LKyM6LeB4XjmuPV?s;#lH3@9RDoQa^E zGXn85b?eKsSSkd0*<`EzA4OPrKQQY9zNCTSNx52K0^NBZFBIuy0(4aw1bH5S4fsX~ zav0={48WHIc93yF%9aK+Et#2Rdtg6r@%(N7c*V3^k%zc=Kp3IOzC#&!Tvb*LX!=zj zn-B1fss5f?ImNKaAG=zNnWs5Wnf=n=H zsqI+#K*Jz2=AoydmVuw-wtyB%cZuVvSy`pl6NkUAXr!LsReKC})*)b6O$Hgoz=zj^rC#G7WupYc7tB=oUuN?2@} zqk_q9yhYNx`;VYfU!2!}LVVUTJ<)}FSKa?DaUNn|gUUlJ7{*J?f`1P-2kH%)DjdG# zEznib8|o|_De<31>99j$l|vOZy%zZey{KC8al0d60jD?B7{PDIDytT9LWGj~DPwZsi&|xuut+X)8P-Z}9QzrI)GklOl{5w$Xc^OCKG|r6M?>n-iKCU*c*+qqaVth#E{)Ki!^H zwvL%oEslARlm3gZ_)Hc@d%lRb)Vp>n0p5zwniyUDWddII&LA=>e7q|7NZEv{a_bOR zNnSkXR2 zFdB~v7F%$%PLD!I3uS0()zu2oGJS{dvzB>RQx1Kj{-wRQE5T9dK^GYjS=4F!?1b{2 z6uF*PQMWk88)sHrxrf9GcCpWOl;vSok==kWL~|u_Y19tr7ZfQ8mT1JY)i_OPHon;M z@!4O|@>%aRZ1mc_nWj4UQUG#!p& z|7`n|jg76RJzav~&A!ZSXU^1p9ZhUD$GaN&=kN12$Q*K3ql8C#NtRzp-=NtpY!{;*s}a0u8GTc(kL|(JFr9@;I2c(b#Qd_1MgRL=IU za9MaKH|$4NZWu$ebWBED_Ta2H!ULoRGEw*36ZcImqvwJY5ZxU7M^>e8{=jwE1oTwy zX~kJj4KlN;&dMmi!r^Abn%cN*3P;zDKfk6b+9aQ#w@dcCnF_iJxXX~z*cE*5_vfH6 zhWZ!6QU^c>(K_B7o0Jp)T#vMkiI%|AA$20l8Wf3NrQ!9UN#tEF@UZS<{?Qo)B6v0C zSz5COzM~UGn4+6Trf8vd;R-qEU87RVmdv!TqurknKqUjK5oo_URhCL80gu3K=@~%h z$Hio$>hEu<`P%QC+_BK_=DEk0X%)k3MX{Q_Fr5mh^F6HW(*5-}P)T0+`NQ2d5oi!2BZ2CqMI<3q zIsBoTQsGjm*;)T+o{v4vL={Cvnn-l?-n1G~_EXsylX_{Qa$LL-4`DN@_^6;Rx?Tj_Jzuqf`@TP6S%FN#AmeC|jQ{)YBK)j2#oy_|qkebPyEUMj$ zXjtYD@2vVm+`dCcSK18wwexWXCq6ulxy4u~>l<@;@D$2^`e>BvG&3l&0%;dmWA{+R zUb-gg5qX_peIsa~04xje{%~B3#N12_c8zIDdz;;ikS7+GPtt^5vsO&|M`CLj%8>nb z$gdUK%bjZp(~f7Wcy)OcGFrR$%JwHmFu>qSbYgD#t(m^sJDas8QtJU7biu8zM13Tr zU(g_n^zb(kB4zL@@iAWGKpNdj^~?kjMbB;3@~<(4U0eD;C4B3C2G**)T21);q|%jr zGtDTQMz>6%c0jM7AnuQj7G8zPqnLNZbQ``f1-BJ(`{Kd`yzqD8BT-q3?G5&i7SBb+ z_E%;<7*@-{D1q&N+Xnyy3vtfct)WXSZkx61rdMlf>^589iH0u;>qdeIFKpJ=H%1%% z_-yl;ig#NS;mhwTb;=!R#y;q!i+a+_X@BJ_kTmttw$pj{BPZi&@?M(>{mi2UUjjTL zh7=OG6>GtY0L8IiZj#`Z)@i7kjY+Y3&6}fVQ=+dQ@IDYiDtN9-o6;0)v2Vl4%HZGY z@pYb}#90&C-Aog>Mws(CmN~^}Ay1hELJ|z+yjY)iKFPw^mGD_^Vju>TWF6U{@JAPeH?{=JMq`1bUMgQR8L|rs8Z>i+D-P1D4 zWSD!uZqYe~t>%Dj->9iPG=Hk5AoWUgXhE-{#Bb+(l!Y^Om{iA2rzkEun)G@9I{P*w zi}=r+5Vy1ISZ3z14+tH(TH1wq;th&FPSasw4?evt4__-rZwt<-yda#vVuV%!E&vpx zw@504W&FTkQU)=+FRl;(Dw@$&HDM!BM>4gP)@Y-eO|?he`5XdOASWlo#>(`H)iWE1 z{-&yw*cYRXHe6^LHJ@?NJv|jyOA|>~?oMd5)f~jXyI%B;zgLk%9O|+QF*OX+F_RaG zQ07V00gf=$$Ks_;cAcUk-7>9YA9oweiO{dw<2V|gSSG;0g4&d?wTkL4 zc~y?!B72QwEO62#%BpN~xe1StB_nxC>LQIu&`ns83yAjW!Vf9^VeZY3ZY4q_bH`e$ zHz5-UwhOT@pq*kyaxndPDqzhU!+Op2*(#q{)!3;-tyLCO(p_jJDhrm%4Z*mK4CHyb zl{HsgR!f|(ut)tDUTw~}k`q!3Mo~IQC@2m}s`>d4<&btq-Uzk740~MSi|zYkVNVW* z3^`25WM*lhER}n}s*s!u5R_73zgC3+o=)8xd0V|&d_udS0Hg5_YVHHNxtm;(WhPY_ zqy{#}nQ@}B7?wI!>lD-!`mqE>>lwYh#&Y+f-#s`JF(Dys^J9xnh@@;ix4=_WrGM&u z0vcydZdcHM;Xat~(PxiXyZMt)>FZHMp9O-&`%eTcpq26mVbjoUu^8gD-b?TmLC^kd;Igs~Pb z6>`XE%$J5gL^a20pck_00J2Cp_N$gV=y&{3ovOCq%x_ zr%~$DsZ@PRN65-PmiJrDNc$?`s}5(bz*wnPdRn1y(cG1S=9W+kM~j8==FIE+_LKez zU)53+hFJ4PbJ8b|bjP3ZkH;972cFf1(cp7>m%REKJM5@2BmV{d^a?48|(pA*rWf@(=<*YtdyoZb<>#LV1 zz?m-Vht9st%;He3Ere;MfyP28STDfnF!&O=eW&+rIt6Hp#w|f2>6Uef&2`9Sq zOJNo>2tGO1goGtB(o&<^v{C*FNUhCST4?lrl@ZFy!h5sWTEU^bCDtDUpIENnFH12{ z@(-g$Jl!`Wd+fr`%!0G_7T(9?#Q{lD=H^`N6PwYG)MrWLl9xyuEvo7NqpXvX7nNWC z{4+Tfb%o{1j4(7+o^M{bk%?(--XLSE7xI|6&v|;8NZqoqj&8)O(GJ$n%*A4tDd0>B z$xN)iY5TiGFjZwm(B0EheIfBN;7Fog@hhFbgY-#AviaMyGS?6cyw`l3rLJo^z(u`n z??1mh{4pu?^jU^M>zk+3=4`rUIzx5F^&U82w*e`(bipuaslGC;0oB0X2>wFr*bMAaLaK)*Klf_arYz$?8^hsyXPg|MXgUcTuMY)R3|M}B zM=iQX2aGmLw{{8KN;M%92`@@`up&uh#CzQ#O=cQFpS$)`sHmjM8D)FXlL9W?aPkcsBdbQuN@{0UOX2;p`*gCiY2$Dx zm&R(Og%4knGN(=A-I#HvD7-^)-QqnuQ_8pq%DB!1qMlm(zPgWz?{w!an$R|-rF3+t z(0Pq&{@UMITU!2%V^vx2W6!oc^)*{u>W^*zVS85e){ZNX#0ON2X_c4u?B9?w)*3U=;(2h2Y~kDfrb?6)<=|k zgJ)pd2yo;*_U7zazkOT4)->4&2~#X16I3@X)Xi5;MEde2bw*LXs`adEb?C| z==nRYV~oa5j;4^YrYyv6FQvS^u*WAlO^SrS8^qk@$0pf=bJqA$? zQj?)|uU112_6xKY0UbW_(v67oqdaUdV0}Tt02}}A_~2+l9dW?p1@kli`xN>l@a{M( z&iuE`X(Dcz_C~0T-I=y{^|^*@^;vJE`utnu!weAxqIrKkXDJD%-*+=beG(knHty_9 z)})T}n!=bbPI9O45)(%|bsK(}>V^fALC#QT%1v|vWEwBq>bi{;eCACkhgqZ8yP?## z3Tc4}XmZJF27^M11UFe5ZAWH^6A^=QIgX#GiC#)#9{cr(R#n)3TE=tUhc;8vv-@J0t}hI z!n=FY3c3SH`G113N9ZnyhR#M#hfH&*BrH@0U_e_pXCIH_k9M6C^aoBb@tPQcl1 zicz2UtD_wDKK69FiC8{rFC}w3U(c*@_(N(tUC${Wrg*N(01YKB@HB3bY5EhO_!8PU zetmRS`M=KypM+FHeNNV;*A97f-D3Ozve99>7#j;!VS2|zK#}XB^?9_y3VUa^SsriQ ztkM2PX3Bs0o~ZLhrrY8dCDv5!qlMHFw?E&gML*`{5frPB45d5fCb~N0*mLWT{9&#e zNqylt)Zn{Yco?3rE2_}r*!EtJ*Ff4vFs?L(lz!9Q34yp!Ozp!?u|K`em<*fqx|zMq zia4XbdU`ueAC`e=sMw2#w}(&^&5V({{+s3vdP9$l`9DvIaDy}^>pA0$W30gMy%<7O z0{j6W0slnV8=JD}C-+ecB9|~h?{zA_1$xWzxG~^=({+x&2#6X4s?Y_Z-@hNj$ac-M zd@7BND93TXf<4uI9)P@6=(>#hYHa7;i00?zE_>1!Vrdr*ebdT+)idR;tnB%7(wCT( zu9$#b<7b2Kp6*Rs@=4{qT>Lp@DuDU7ta+MNO%G~kiQvjfxeYXaD>X6nA}%$P`pZCm+6bw3rKf(!Wh3yDkSe#aEI-O2=b zr(eEb^#ul&%Kwi!%*+Rrr`t~o59G_@@lhtfvSJKDM2Q{I z4f28xM$lIntxoslxE!6$bJ%Yga-dK=K17)VG+WWe6UXIqat@B(DgfZz46 zAK<(2{HVSIXw-udU&Q!d2J?1(5o+Md(_HCU?(fCV_#nb*cOontj*TyFfsMEDXHU6s zV0ilv*^va}ng!MjgO4WO>eAW8#u655D#050U++MAxDTWQ(^8m|*LwL`P~P7G0?`6nab4RGCA8f*co<^*lc*GI)tSUNBi-}(R^1Z_{| z36c>Glv>1a*{_^L*R>LkwHig3vH($O_TM@j7!K5>eor8owNNsD^)MhZYxL&NVIDdh zJlLm=e)A4A!wnLwU%E|M^U4{V_F=;j3*tAe=)c~!9~AXbFwcoP~Hrsjr_sa5=`b(T2vgf6EX^UWa?&%$Ma z$}1E`CgyMz_G@k>=uFjELNcXXp%JSe;`*#07Mr_A)P5h=xBo2r;P2%gE@UVSs9Z6i zi+Ucg%$BMz`R>-sD#4UCT@u`GQsZl!C(+B&HM5>ak&kUeGBWr6R5D$WQ=Jp33QG9- z@~yAl!_=N6!>{3#v4=j{)AsB98bFk}`&rWS7&loq4`kW8|t>-9{!;%g^0NKH+r6BYnxE zac|dmUFNtUOxN-#JgZ7frDv}`_2s(Vx-EW z%Vib>=Vtl&C9q|E{kxd1n=6sT<$|Hlip-B-g8FQ?RkOHApTW%hLuHutZey4_Lw95T zvYVE?mZ(qX70Yp^;uGtQPCw5Pwdrwq_PdulO{#`m`3Q33`*_A(rIvD!xGLXnhASz` zWWjnd=zaDV42xHq-cMSbj3r*z)1+3BL7Zl_%wO%7}tB|2}Vl=&G{z>DSU4r+!>fA1@qJ5zo5lgoj+55+9i8*dJr?-@Nx# zrQc_ndwT5clt$m|1eMqBS?_JFcwz-Jw@uQCu>F!$;9?3_zhfJjIu5_A&5c=fXF^qTfMCa?wA7YX-iRRAs> z*@m>({D`x0^BPla%=Kq4V=#~AN)8`~mg$y}Tj_jMZb>T~TC!nYAH+!Cxct*~ltVfq zOQp_vG|CK_-<<2C)EvBSu1?)i*uV_uL01r^03DE;=~WnpgjI8G ziaO+GxKXCeoV8H#_v=3+QQuRgPv`362I(i{>MGJzn2m&srktIX6|`tnX9derVD_(d z^5@=fjU4Bn4@W0fZ=77wZmbNYuU{`Ku6J&{IBK74qVTFmE8$q5;S}{hDToZ+&2?pm zaslLZ~*FyrSHOD zjC*er`apFiqYowoySz%&CIh!|j2@7M98X(Cm3OpOk*fMqr1H>D>dVWyZhV^~JX%8n*+d zsa8u$x|y1H(c2~(b-Qz_iXM(5Gi4&pt^_;ts5I2aOpQY}LTx7HUwJlVd3i+)wm(f^C)?^ zQK1~oIEvanLo#D`frZI)Ls}My7%cNFCMJa|~>w z8COoN0uEg`bVKta<#+0dM33*Z8j8YvIU~M$ukj?j2Hv~<*}unIZ2$PHW_m%S5j28? z9-_-*1|=vnOC3%yYyCi~WN4d*7_PV5n15CF_7_j<1HmDGzG8&7`qiK;87pJJ4?!L> zMM9P2JnTpxXJ;K*Q(gUVj!H}N+<=4xBsrcuGe^FH?v%LegUrdc)Ls2y@rKvDvo&tm zY8xY2G zMo)^yUYw5v7HZeNQ{OdGKix6DNJr8)dy8exG(?VT&_KU)v#y6xGqPwTkjp1VDQdq@ zfhXj#z}ws&6qaXiD02}mCzvRgX6INw5ack7+Hk+Hp$SRUJRhKeGzjJW>`?7O)xmJj!TvrGEA0 zMw{4_6P`EbnXjT*QL>bv)11O39M{i9oyfTo5vdB%g_CZNh`e_&5?8~s!N?S=(Io)c z;n?jI#p?E|`+<>=Eu;HuBs5V+jETV4%yf~L#<>2P9D)V5QvVNO&G70Ue2?TWS<1z- zG-_|joBCr_>X@%%G*QQGpDzCH9&d(fU1ej|?#!p~-C2~0ylnZ#w=8!zk9mbg{~OBg zmyNFno(uM#=CM)qYd-&s%SA;mvzmxpqQK*N9w^PFprARn)LmK>nPQt9o+}#Js5O)v zk=Lj^?yj;>4D~CzCs{0~*JOZKMy>U(tW1E5;(fv2Jg@LYWt|nxGEI`J$4Y&6a?`)v zs%;Nb{n8WOB_JK9@}`;t)wd0l6oq+o@CHa}z7NFRpksL8)(jSStA+)sKhmEy;x z?Qz@oD&-A_0T-JTvU&&XqQCp4d(@Lu=V-Xbhk_UFUsX=l?jk8gI>Nlj$c6 zL)dchkTLnOG^#SQGN?^xvx5K<%9=9D!p!}k_I>g96tZ{y^HYvbbVt()?*~1ZI-sR; zV9M2>>e9NDY<7~O>-AuxTk1k2R%a?-P-~R=q~f4n`)Y8N>M|=T-tEqr8-FU`5yVZV zyADPv!F=SuNBb{3Z0ByZZhI9WZV(BPtajK@SLrr-P_@h_u`WfY?qA3 z2zDQsyhfFNQOY1oB?vGE*XaB_Gz1H!WJ?|Y1TnZd-!m|Qam9Sz0fmV76yE|NM)Hl% zpPkC}2b1XCePoQ-)Q2LB+p&FIw39xxz+}aacOh}O-sNcn=aXeWAU-nv^drV-Htp-|X#m>UGY@^akBO$b6dkp`}{uWK$IhfhY>A3j6OCNEXpT@KSWi zrz+Oo=>P1yWLU=KE>_Sx?cnG3%M^@FiR|Yr)3&;#VD_|$*ptB3Q?*6BLsnkVEk6cp zI9>T-D?;<&S+Px1;^9hzl8P54-AYrut4S-Iq^?62A11oe?IK^} zG*=KYe=k;BZiJ7pExi5cfz2r2cNvI3<&(LxWdLf~16%6nD&!CJx9Z;j_S0zA1mj_q z)a&S3cjd{7S5E^Ty_RKe5rhxVaV(3wEBb zmt}x2i)IngipJ*!9*VcbSNnqwjKfq!3=~RQmZyG;Wc*!BP<-#3hXy&wH@wQcsZP4r zc6-8I`qnhLsEjhdPX+sdP35rC)`iJ?_F?K0sLj}+ilRcxyRw2j0sN>(sadw4DB|+ z1$FDIGMcy-#u)~BSx1b3F?F96kf!;r>JblH7VW^&xqpgp_+|j`1GFgE)h$~mSl0;f zkEVt?cR!}_ykP@JM#H|}n<>d($+QKi!@uqT6x4aiD8Ylj8Ps3V0tORSO1KL~qv5g^`_&>Hg|rHS4P?kRxirQi>=KH)y@q(WG>UGjl~wFMr&;L; zpjv5g#iCoOhr61Hr=E^IP|ZfbYwJu>J1Q>I?vjvIIw<20mOQ-W`Dd-P`E_l2GF1w* z0ht&09lQ||wEAmWe&l08B6@=iQOGJNDv~Lhv|m>uq^9D~@Vq_tYdR{Imbz-#A=L4g zq}1i>YH~QL=g+jmS&mAR58A<4$c~Yhe%?$`^`O#vAOHbvAyTZY;8Sl-qDT%uyYdRQ zSpE{MuC87p6?j@dlr;h}<_cb4KUsa`uhc2Vkvg5X230#~oTZINVcJ|dei z_y;L^bt_y9st^zfs$jHmwJ88PQrKH`>7Sy~xEt_n;6-}~-T76QM= z4+rDEHy<(6fF~Y>7ZCMP5N&bCz9qOr_tSl08~YRf9pV?aB90#$>TbU(ishvIV({TS zpPRBm;{ZKVr^21!G>7=m3X`+eM+g^tnHbOX^6)ZDsS(0fDzHHDz}VsO0kY^d;NJne zVqNU@7o>yAbto#TDjQ4~F3UuxRh%Xrs0DU56}V`iQO^3oox7aK!lHP8wuC7pukFk` z5=JHpyxr03A4gSRpae3~US=XNor<)|KSILL$}G_;sMN9_)-b6*g3j-=s0(urkloB;#`SjsCzPJvK$D38v(N z{#@qB9UGtUu-2j>`B~F;H>u!7H*ZGFd=rc!usV~mbga!|3#7r|>A2zIpr<+YQy7pT zK+qku&;}zJaDu^OVxCkW8brD8Utu#b$@*;EV0%9XX2JuGE1KbroeWHJ9inn7kb8Ji z%$}<^y_?~&)Le33tcy4+y&sk$9u*7G5Vx>n)_?NXF=tac6d153^)(jm3(1 zPn@Q!3Giol*|X4bx~$95h>*()~!_Z^g)_bh9z?UkRWv9vTY%4TU%n5+XNfA7KDJS z6K^l&i!~-gBE$UptrX!fVx0-aCyiOleK2t9U`UO>Jvg8J5@bUtgu2}-{ zzQnry}6X78%H9lQhdof1vBaV>b>>a+}r)iU!n<$ z4~uz@f_A|AgcqOq#pV@-!&}tve<7O!YtVC}r^ccc)Vzmlxpsa|$^$0CMdrkMl}_Pz z(a>H#k!piTa%(l+A4OyVKlta47D=B!UT$F zR7)kxiS_!Osao-^Gz9xp&!5!2SFsYOk8&V^WyFOpH=m$dGvmdyvte`cJd$U}|5mRY1 zcgTnnIO|U7v?w~5A({fwYezo(ng4^AllkwyCg}YwJqu1J`Pc*fP`6{_) zIy5!dN|6X7BqA7_)G4iT-|wgwb9MdT0COF$z&!}&wgJlkB+CvrrT9G=^+{Gq@9I4c zM-!{&HMjFgk z$bGEhKoz0&9b#hN8;Dh_?L#l#l+Tt8szUa0&kD?hhNcc*P{7Jlc4`;s$z1ZKPg{ra zmRgNR9NJUJ=zT0ETdRT#tbJQWh0XDOET_+BxJpG!4Uq~by+Q>Nr3#QM7CBvTO}+VqqjYpFubOOhL_wvgUsP170y+*eCDLPutLAHZ&xDXq zYZ$~bL^bbe(sCpfjOi&)vQzTb=!E}{WkMgZTuiob$*0A;yTODHa-D-rQ=oa{hkH9d=Q?u-rd{amLOnD!F{j_=@ZFa7Ywus^X(kZh2vM}cUN>jm>*%5*flU4HiEHvl-H55dq< za50DFh)x?({(x(SX+K3uHUg$Enz!`zE^73fxrM70 zuqCi`zUbFptXS-Y{pC-xOoQie!e%S50y@))&?;Vment2PCfXC{J{7@oFI2U$W4Rt^ z4iZGdV!6A@_doTB3OwBc2pK?H_{%W_a-Q>Iw{9{mNZV3ZXg+#<2Co+lui_D_r@NQi zyJhQRtg6UTp~PkLrxr;)GQPi(mri<6SRxGnoJd>bc4ZwvxbUC}-cborCEnae+%Vv} z|L|Zf6FkAH?kk_^ClB9Q47}uA6!YOcIGBq(ZFW?>(1&^#yr5ahDSSUuhQG4df=>rq zL%8abjn}ARM=yyP_Ukq}P9sQKUFBLUUZb_+yianYytQNYEGY^`9dwgUMUiSt*`-sT z>0Nd|c-(YYDv@mpE{R=KIxZ!)PJ7^S?X-PkjDYgbr=!)-uiR88`(@kHNuQC!5UmBS z`@GTd(D#1fILq0G(V6x)hP80)~ zkSask`P$`ybLF#{6T z51)1UH_-Dp^otACJCG1MU}EKfe>y{lnGsgb206rGcXxoMc%oMb7Chc*U_W2RLZG&?@!7~P zTHgbf!u=0>EU=>-fhPN(cNS+mSq>amU;FaJeACw%3$;6Gb|&H3qjO!!aCKcmxa#P3 z+}24YpXEiLwc1qVqunxApOoB++C|$@%F^kgmay1bRy6iepVLoZYIQA5K18fDZwz=| z)atqnBAD|?Op%LiB^IPvE2UBix~R{?cEm8x=yb>IjtUpugTVnJv{xL?Nr5;r!Foxg zytdMZldVTMEg@d}QYV91zn3xg6Ov)9=Zd)by8a#IPJFvtgF_BDQ4L=MajiX&0k=;Q ziv|(N8T8*hRB`k;>pQwF3<>9AYI+(>ts6Hv$R;NzgEAb&|tS9=n1?g;X zY7ggXOq8!dY^?UY*6$CXnYGVSW`e1&+piJqc61MxeK-A9djZO7?xb(5c?3+=4YP(K z*g;x&Jp%A<&gvYq7x;F-k4${KrWJFYF&r^nqPsK3XWRrKWgb6E-n6;udhvNgpYFTZ zggi-Pg~A3ux5dLS-PwX=A(6~7Z)aIT{q48UjUG{I9P6Rru@Z=kJ67xX%^DQZ`+=&^$ut^Se$$w4LS zg2srhijJa+zjKhswd;9h`-0gL3S=D|x?+3Ed|(=07v6Jf@LXSq*$AKU+2$w1G zdz6(TXM?|hV}?=Qd3pKnPyzMXksMF-i2*aZj=3nb2}@9yd{NRz*d@V1iLu}Tbp6M-pfTF1U`l*CC<;|Lt}3@; zGF@1EAFPX8GI8D=Dk@HO=i{qNCs1gbs+dSk9dj{Glf~uxqZY3A8W)2k13#Dw&xLPU zq|_7CGCiGxN3Scl1X|-Gj&J#XXG`gQIulfmtI_wR7^>raRYK5_QdE_TOM`#qu^Rh^ z%2VP*`Ba;QqtkiSY*}LWAY{`Sa2>l#+x`=ti0xd{laxh6u)4h^2a(b%anJ2xw=Whv zEplO!aE2ssf9~8W+X4wbOOPK`V02&s_t@iBDR);7pGXO2)<_UB9mZ!0<@sV2aOcmW zq;CJ%MT$SA0`#s(ovw<#XGU?+o6?(|DD*}UG-5`J!)z9Xn$aP*dQ*G?aY$)8PTEErnT^bC!=n`Aa_wm#WtE3ucz%$c3HE zz7wuD2NwX6ob@kA3r_nxL_N(Rv2uC&@RS{b1_f9X6s{#Kl|%w#nQl;YH=SE{I`Ij8%; zs=)JKS*w%E^kOU2<(mxQg>PXdw**b>U`@i51GK74Sh+c9Z~d_8rNbj*;e!1yy<$Zz z%}AXw!BQwVma(~8c2vqVNWP?Oo)NTn`3y`DaNPwX7S8zqcFJ7hbSDK%cPqkzx~v3> z7^ULU94S@R8`^dhZtQ3x&>zK(D{6ym91KK z#X)|*tf?^AY%xbSyJe=PvSgEN>QIR*fLrtFVa=%YWEuW}8`zl~GiyUaQe*R6r*x9Z zGtbA%5a^~BUrJ;1DnZ^_z1;K`M}?{Yzp}KO0aHcNW-y(#afw(H$pYFjUDQN|=$M01 z+y`UG^b_03zdac(`wBw(O=3;YZaSJt#W*5ec5#tktyxGu|-}E_oI-T44}_d=p>R_Pq#d z`t;rUi>$=JSD`GO;4B7^KmaBI%zC=WKsM0G+^UaELQFMKx&F8>@Xqn0AV&gPZH5MC5$0GgwtU9Qs}u8qV?Ey%(l4 z_gUB^#@3+5QMlZW95jBYKO;5cW+&LtJ5!4y4lh=Wn;Oksj5CduFRK+lqM>>rb;#{h zg*YchDQ*3%H_%Kw!y1L@DuWW(@7DA2B41vI6L?;ejv_2WdYRw%wfXzFp=pmgJg2gB zBp$JzztQfKQfnMyXVZLRcCPz_N;-Q*iimi4P5)b&`4^^nM-&!~Xf@36MkMxs>rq=e z9=;rR8IJs~W(tz8H?kIF9K#&2lI0Pxh|#-=zj?d0dp}ePKU1Uu8(RTec*kUHVfXP} z`p?(Zv#3!<ECmqu<`OWkxDj#ICc%2}uH4L)Ye!{=&-z0A!LHpaKNIpG#AiYl_x zr_n7IB-Tm(c!w>gP(|Ot2+YbF3>Fd)>&W%5Md??`QJ`lFUw|``S-5#q@Fy9zqCWJF zrPfL@&aSu2YXs=wDE&&4EcbO#yreDF_0m^Lk&xbkGRP{;OD_uz+$37P+*mPO4VfT_ z0aGc3uQ0Pl9im}utUIf(4{pTuvN*mgFx%|lza0JH*dQ>Yt74=5D@wRoEsEyblifhk zk2q&Dgbs#8M^)50dHIB3RJLS(GqRM zkDv>#rLROAy1W}8RD*g8*J%Z2EjHXf(K`{Y$$_Y#1fUYtoRo%3Hk#8OK~|@!F=snq zIwX{uoa%lY{4dLPgg2yjB6D`#7vQoayuPZJS@zwhvIgKlBESUn zJzO3EbY~1QwNYh5ujl0p37{9ipwC_ndVmU|MeZCNSR7xigWyB|JYWeZ&3uO|jX0^q7<5-IBt#q(s+5F_ooI8fU97Ha&rjCWqK`{TRTb3u z&C0K&I_(2#P=dMV!WGIlvr16A@k+woYEGBqOkH=~U+%LD7ixHc&h~v`Se~Z5Ny+rK zX3gHYd9H)`+W2{7Xd5-yckHw3uB0qxBb7U-j}MAc3z-RwMT+XMle~GDNcKx92KaPS z-ru}Ou_RV5eX_4ztcnk1lZf3Uh^{)|R3AJReL;UTUd_;TF&cVNEw+rHJDml{@spkb z>FrZqWxIT!Zm1aV-$dl!H@bTPSgmhCxh0r5k9UjteIy^CJOl8MYudtXu1UBL&Qhj+ z??bbW8T9OSiyRVKNq(|7&GAv9p^ouVZNaoUnwyD()y7*UHm_QSS#G;g-X@%5TkvL8 z`q{zK5Mc4_-sB(zF@V0%1Rk2hbubW#!GcjN{dA7>-h7XL=^6}r*(Kq9NY`37jV`ad z9Wn67Z7vV1aXchn7(O`C<~GPdb5;6Pn#3t_6{;KR_AePwTZTGb^Qo$@IE;WjO8fGC z|8%mdX%Nll;#J~(Zm{t;Y2Ftu4-CwjYG6yy38R@sHl*lFoK#pOor}Q=nCnDUIagqr zv7YJ33c~%Ubdo*Ak7?`aq(1Mi11+xb@wv!I(1oRV&zP+LwE2!zC>slkAmK7;Y6?0q zHWq~d2rgnlI5%7)-{v+4tEHFpdAJ4+4$(cpAnZOF~%weiJprC?Km+LXzOJ z1npJECmZRKraLa4jl=OSjEvn6^qC~oQ*L&Y8-SKXC=c2DxKvRzF(*tIu_bJ{WN9<7 z6=_yBS85eQDVc0{s|nQ7Y|=Rw9vVEwVrCe|eMq+)4q6MEYKT|g6;_IZRTY9db{z<` zW)oaj5FO?0dYA7#p*m(p2q<$x$3qr-RMk<7In%!M2)*klU+cTu9L#rWa|>@231$NX z6?pdmwswp`SKDq=|93#_N;qN`;SFZ^x7NubW3@+^$)IeaQCS8xkf5o3%)>;QgW&Et zy$j6s=v0DhpP7=E$+(ZgHKSRt312r8@JtfAlktQ$49iSm6_`{Vp zI9gT;sjb6Jt&`)3;8x_V(l5mVqht{+W5?Jt&sLzfX5MzE=y33s+zygF3vSBj@GF4j zE^&r77sPOTW-T_0XzZ0;tyQumz}8GrVIRC5WVfEQXoq|(fN}rKS`?RG^XuqQ#tqVf z^~6Th4^vKMFLj3V`5Dal3abS9L4KXj6l!Xy#yrxB0V%=i*!bAW)2#NruGW$F%f1wc zZ=W%drC{m<+{|a50R| zgiE#wrJEIvOOA;Ddio7?wei80J)g*J;w*k!UyR-=abVi+o-H7T~*NnWyWTNF|7tD+jU_`>HDO!W@2mnBf(P6m*0Z`!+l3t{tBX8(or+qnGNX zPYk@Z)C%*6b&vJ@224bXWyfex^>zuc##m&IpuL|m4i2SR<*=i3_Sc!GQu=AnA|2oG z%74+fxvPIq&wJkW37NRRTkp-Yg=#=A#So+Zn=lq9V`B2rjvyy5+v(cCF*f;hx^ewF zrJpcT$Ggy-+l)1ZTX9hPGQuAXxCg|r&#yjkacO|jDyR@RjmuhWCr*HszeiOt`PAxV zgGoYJI>$L(Y*qb!SanghH_c=l(}`P3Era{Lg7;DC%dc~A#M~+vaOd>Ga&^p|^j&$_ z+PU(9`LV7)P*N9AH zck5(T0MvBO{sKs3OO4f_KU$Ym*Ri5hSVhG_HJT`EMj-q{lS^&z8bnbJHd8K}MXr65 z=5rB#g5yfOQsqP<^yht42R^ak`c8!}`b<@Bz_=1mCA9nxyRWlKs(Vr;Z{DJl%nB{5 z-do4C3MEsn%NCO^X>3w{f2!_HES$AduZ*S9z90^s|4EbnHzfU0Zu6ZbDHmmL?d#xb znmD_vK_$IuZpun~phG7a$Cvt$c|wZ%0| z6ce2>W!BFLO zsUg+7X=Y0M#@rboF$yF0@#o^?XOZB5FF96#JC|nY=m$5$tTxQmUzFW#m5bFp| zH#t`nvrHVDSzjJuY0y+~R-O1jeg8@32F*zi9iVD#)t|>4B2qrzd0D1{#L*ffc8rRqm-M7r?g}-3yd=PuImN?u ze~+~ip3FgchyFR9p^ccvPB-0yyxj>FwxeDT+kgR$1vA|X2CioKmvO@yx% z(U@!gLYTlK_#fQ2pmw!MHJzpMb|{FnNsaqR1)$#GLD$4Ezr@t65TZ$lUy%QOI$0Ny zqPtg*hlEOI>5^|&YIqW(XY1*Som0wgPrnVObF3*U{~GgShOd&~M5U^{s6t7&+E$P9 zzR1*6-_C>k#L(S*^tHc#q1j5-jLb-ds`tae$^baQ@C6o5x!LMty(zm3x}4X;eJ=!) zDN@4y{;-=yc#jCSbB`OEe#yQN<*3)FbtH^92GhrlKJ6Qo<#|PbuLr0q$KMw8wDded zdo3bDKv)~!BaV_ssTJ^_fq(}rgFjQ@S3lqM*84;|O;Et{2%<)Z7wQe%*$(cE0VJ4$gf#ADWWJU09mV5RztRDgN=NmFrH0iqx#$^PUD>c%C|H(7 zZ8^D`E0YygrVtfb!qA^8y{d9IvuEZO80s}El^x9-4d2p;KsdG15ZkI$#BMQ#1XIhg}l2WE_Kz0Q$X+$QIqWr21l^+#p zBs|heD=y;FbfG=GFHXw;SkFiEvV)k|AJgD$(oK5J_VTD2|jdekR$75;z{0 z->?f4)^YZ)?cAM{9Yro_W-u1Otua;wE#mV@Nkj1a7$yajlsd?sXlNB*CD1yYbBS+U zchA~)%<2mw%@fdrZ;AbxT^a|;bWPO(D@!bq{^dH> z`A(9>G>CS`yIwtK82jTupmA==dJ^2p;^Y7JzEAL5He&xy+Ogm6l4IBY?74r@uIED` zSDF@Aztli@>lRQ*Y#?!=e3%sAf6V4c@Y?ZiGl{P^IH{LzczjC%-P}SW52RTcQ8Qq* z*K$krORx>&ZSGC;>#N}r+69V1N)Ic2D)bJrW{{4yNW^GJ*5cL;e1%oJ5l zI@@;QbkPi{6-P_Cu(5Kry_1k`)wS#Im--hwm~J9)ZvFRJ-(mVfQpm=tbt`gk-0GS2(6NR_c!>FO$+ zJc7aE3f9B>lqA#1Wb`~kmt04IN&z9}EVgQI3QzVwqgvO3)U;myy4M`^w!wl~u4PC%c9<#)|uMb>%=6WfS*D{O}17wv+*eK&DF)AO~Qqi2Kgu;Iv`A zlD#VmbjNO;fMXlZ=>zY_z?2jmDF7gcn8f44p^!;B&ksp30CpbXF-j@|xS+WZ{AA+K zM1vcH!6+2;Y2gD~Xq776{>%)i*g98Ni%6B;^eDHW?#*YV&vl^O>WWGdPOUpkIOkr{qG>Hy14@^{EmzMTp%aVmVWdefd-geGU)T%ZGc`$R4tOUbrHe;2_>R1G_ z(z?~^c~P)KVNgQWjPa#2w6Za{RktV>zHX$su`5Nu8%@K%VEFfZ@Y92BYN1n;=80jG~XO18jyd}weN*Vr>{%PfopwQnEHYl6L30y zn-{=19XnC%0HzunFGEhmwDIoisJlGy>Uf(!tgW?to^3jdlf(GBh5yy#FV=VPM3}Jt z(k2r}L~vHx0AL4$dAwsfw>&YALD|=|w0LqJov}7SAec!3S)<4wcfxmKB%~A#jS6vK zZ%Nf9edLt#=Bl^KDVUg4y{LL52+eXu!`eO$ZP@p|l$(C~ppHS?-A3;;62eQ%_dM)1 zzsTHqg15x^naK&uIxuRH2K*YDgY^x)tr)LLYg+ys(vs72anu@&KZ2t`D4rSh!2<4n zFGjDu1veFd#pSlqKQR(KR-A{N|BKKEH|8+b^S*4mV$jO=h>Sy1U&yNZjDFBd&@JWC z8L5C8k;QU@YBCQdv4e7b`;bH{HxXVtJd7piDf7aRQ(-n0iDJkLN*NChibZza^_%T3 z4tDb^wGQdk&>GNxDPZta-*98_9vv}pVC$pYD|B04%EjNcklFo|#0tEs%WMs)W@e?GQH;K`pP4e+)&HbK9GF?;x)5>`%4VROoUDP(B-A^4?c$QULhaq z+gy=~+AkIGk=l}3qslT$+=4nfWO<`rR9#tQ3D5GxH2*B$rR#Ac7-2O%vCcQ|-fb7l z*Gc|FkPoTY&llXyJjyFd3i=xKA=N}ydHZJT>nwG_`FQZn^e-JNL1cQ%U z3HqbdC|?lS12v98-?=iiu`py?q58!`s{>#Uwqo)Er2o~sj{j=i|t84E?7FOB|^52gct zFO&9O6-*F!MMp2;ga8+n3ll|97xV{iv5E7Ju&N4+y?fynFBP z+uhk;t)KGBetqcVb8Ac?d-YqQ#YuUh>s0vQ?@Pk8;EmBsmK!58{_T=xzjuNq5%KLIQG6gL=XxdKPk!Jg9a0t=>T$z0fAYjM9X#5v z95Qh^ktfd7n0OJ+)w^`%`#QM&_-%02cMPSL;uJ_iGgjzB04w7)ycQS}`Y-Xi#OU41 zJ`q*x_wl^F$;C<(!1;*Bo$|56BqOjj82MZRgA$0OF`8h1X2Qs$Fa|#m*8|MsuyC>w zfp*dM4Pbw0>UjOGZ=!kW7A%L6)h5+u>{@Lq@{rXIEexq!LI?0l~T)7k1=1hP8}ybo9jL^x5IryNip} z`IjI1{!~Bf2?uio_6bP+y+iAv-72?hS--yr{30)F>{_Nho{^osB+Df{Dhx3%I0`;b zl)l`i2sq32Yl6FPxC4&xo;u@laI@|8)nyYf@m3{bk#yl~VM3Eh9%AdueMQc-e5ruG zJ$<;+xzLhbZPsZpk?w!wt;3POsv@LWAr(B)n@Yl0GpdYApj&_Ox zgJWE!zAlTEIQd$=mqG^@f0Zu1A8=%UlM#+=RyHa=KGCv3F<1np<^8@qI#FaTd)si- z7KDD3f&D5*h=X$AG9FaGnPq;{X2n zWe`RSJdQn&*IQ6nUl#E2sk0zy+bdKgwRx7w#d4!Ceh4tmrmZlsC&EG3oWI$grvzMS zaTqUI8JvG`pm}5igtwVky|M^7#(>HZw*8vyZqOfdN-_VX&6jI`VJ2n27GyTedRWLQ zG#@Wm1v6+Z`y9+Cn+N}4J72#zbNK#5s`8j{quN{Wrd~j09Xl#ki)yO%`pQ6STI%O8 zi^S177#=ENBd?IfPmWChjudXO2%GE!+I+xHUb{LK1Ct?m_~bys)VFm86eNa9uFROO zWG!*49QI?fz~fz6m!+n{6vwA`xt!lj@WL|=JZ>76iMih1PT*p_qu2GA*SP+b^!a|Y z_uQJ>bSCZhk_YrQGBky{6Vz6H#VbLphZS=VbFb0B*_+QW1*lT8J4d}1y}L)H)D|;m zQ2raS@LHvRBs>DLsb&veaB*Ds1YMv5-85*#%6@(s)q(yXhjtk?e2RIfq}bp866fmM z_u40SKxvkm3BU72K~YJ!X|b%DlZ?LbtbbZAw7O^@%nm&4$<7PGxO5&xM$c^&70cJ63@OVOW1$bpVVxJ1Pu%ZJ_(0kEz@c6UcTxFpz z-+5cLqdKs^j1uTS)?s63oy;@q+|2+l(Wu9pYfwR1Pe%m)se1!QA`CYIA>(_ntb&ny zT^_7iOhru?Ox?VeR1UfLq89Yc`uk}7g!Cn1eAQ1$ZTExAlEXlUkM~kC%kgjPq`g38 ze>9=(Ep7>Haween@xD!#!rTk|6zpv5?2Rr2?4ftaWsW1>2yIrfyp-nozFID0duLc9 zB{g+#BIHV_Gl9LWJUshwmqD^7N|uWB!TN}5SJrk_NRT4K^*+n__M`mCX|3x}*Tv2^ zqDU;}J5$*#0^&Ov6Q;V3;Ng1!7sn@2c=%X;G^P5L%whMLIe62O**uJxUpzt7sej1A6szCU^Sl~hYg5wPNs zRAh%78>W4h(fLM1;;<=JDad%HkaAqo67E%4rA*i7rEgj!cze~3JQ$Y;L-sE5RCd91?#7r$N0DT?HgD|t6UustV-g9D-|Kn3sg!UH!B zALn7o%?+^Zj3lNafcbeFmuX|P7HIjLLoz`!PJQS1)+iqPy%Mp?its0i%kG*Z*c?*e z(QOs*(l_sg!}2n<(zWiQlOP{$+UjBV?G6JYq(`s5lsc+bdrd z#;uS1dy1ec!)-8#$GrWZsBgE&MQw2SRN-tG0~vMpQSY@hpyWLkC5r^2MNe>W8)N}Q zg22GHKjdM<_y2`2iilR=L5(3 zqr~pPAm8IVUH#aOkq>;h*!c%f;9!g%!+G3@h=4pm5k`bzeZbP0#&8t^fPq=)wm7Lk z1v@LNgR|~j1kEn#cF*=X4{%}vKJ33i3SbuT6*G~i14{Imr!E^2xA-k(RNL~K{Ep0t z>HWcq;=m!~d2ULC^B<8OBM|`(J5mLTLUJ%h@Uv~lI%V!+0Vo$hfvg5l>yQY<8D2A9 zB_nWzDMr{}{I#HONnd!6i4r==;7PjY2&BaS#0g)d0G^f(SUCUZ$H;V7Z(?Szgu#p% z$WVYU!yiFe*Yq`y=qEK1y+0byEntk`A?LT*D(WSAvGsy?*s5TH8E_vBVAlK@*0+HG zEOjR@FcAzKe*~^1{YBB|GR#`pL7{WHTQ_zV57#H8SgTog(D>~B-xi(`Wl{e4@#8r9 z>EF1z7B@ThUg9)A4u%g47X<~A1d^;S2*7zSTf13aCFbnDCB^U#39MiZBuOg~iZg0t67lO!x7-E?7BAgt+ z7ONSR38=x4fz6Fq?f~PAnYnI=jHfr1>e~i}D+zh5Id%#n0to)VNeDk|xvgQ=G1vtD zWdrC>oGl(()+-Yf0w0iqbnst)urxuM!I^|Jkc)>fvfTkfzk7P{+^{En8vJ@;2f*$q zn<#;o>!imI)KRJ9kNZw)@Tny2-=q+QD5n!1Ua$kfPKEi)u{1Kwi3pz9+s?(7LD6={ z0(>Ao?|Mj#q6boxB9`p%o$ITk>*HBcOkNFPS^5-=OM>DsJYEC96T?5<-hEoD@rSI7 zh-?RUj+$iN9y3)giX4=dmtez)Q8|GbgvP-=^mSxE2z$bVD}m?4`F`Om@Ta>H@wo8* zT|SXi|3Cum;8^Sb$G^bH%~or`HF;Z3RYk>W3Bdr;VE+lsWM#lL&BB`9r}58B29(L3 z`S82CzHtv-fH51W);qPSQb0Eah|!wvFx|d`*;>wkRvBYZ&~;z}e2I24rox<3wKr&C zhG(JrbCBe|=Am2RT;^&R30-e+Pyp~F`A|hw|K7K_c5DuNuonq*ueXQ9@(-)9!J=U_CYCudZ}a+HnCUiZ3p{KX{8}mrY$PK;xBjs?cnp}B^+Efu zsPQ+klbw?A$A@J2B!Nkegx9L$munAARm6!SMa`hWV^QWu;}>MyM+%I0xGN70Lyi>r#~1s z|HmvbNy0Z@NRUmd0#cHoq)+tVf~fcG20!-=ykjiFDl~Y0fa4FatKsoM;1ggGCw}~> z(PYexhxJASGbPnrE6K2EDAe3EP~F|R#d#s6W{4P+y?jXcV3<=N{{pBTq)FO(eBQl? z3QAvj5jP_{PYu?4jV$3pj0DK`R`^RgrUlR_@zXF_wKL@ETv_ba~kUz0=O(|8L zx_CM>>62?p13BQg)ov55C3g^Y)i!x+myovZ{7!!fqf!Rn*6@#j>y z))lOVV^LwOB|vg5XoxB8O(M1li|&$5&Hm>GXJIY>208=(>1e7zqF`#52UC&&w+)dc$0%}vA@bh}4*p5N_;2m^ z)B-~j+SKHEd3P~C43twUfSC>?Ya=yyDrMi60SHVKumf1dJ~J&agE|lZJ~7rD08fkp zoEe~3>+cIUJh2<>JnE?;bp?wFBuOan)ET%94AL!i7Go$lz5{?almGTmr-1U#z) zWF+pR7CB0cDGQUI3a4te@Ymzr9~49j*@>95T&*;GV~n zpyx{+Y;>>FYe!R6Q`7FF$2&Qb_!p-4`xvzd@N>Ig{Ia7Xwp4s+2dyzqJ8at`0e?qM z#=U~4*MEOK>{~~5`niE`yyQ#YJB%>%FDz8j(gSW)uz?o*18~OG%#=AdL>y-sMM^7dBlGwPr@e_s5#*``DTEU5AY$29|6w|KqLa`6^11g z#swE58`kUx4kuHH=h_(#S8v-<_WJ2f&pV!Lq&R^6@fbzs$}IV1)LrK4QFfO@3!@)R zEe4PWZVZvuHlUm20Cs&Oj8k2 zQ3GXRAR>P^$PV5?hdOBUzU2mY$8RFfkC^S2j*?HkP4E^#t1#RZW@1v##oKcPN3(Jw zOMby*x=Kn>cq0I%8mxT>EaX83lOPWEJ)9R@eXMfaZ5Zh!rg@eU_)i5xzy}UW;DNw+ z#(D;J65wtMQ%l6>g71UzQgL9pq<&G+NBv(&ks<|DM;x(uT=sY$5N5vNCKW9I3LQ-5 z4C9OfOj7Wq_+s=B6gA+lyB3KX)1>n_%sVJZaPTa)da!A z*Y62DG1q2)r~3xBNfa%doU>E<2kyhy16BRt!vmc*hvwfi29UPL!>;*OwryiP-5vsA z$CBXFFj{bBnXRwq?;gzscSzN7GAb05((5OaqDygJxP-N!sfI=P(PdnSmdVQM8`wy^ zqi(y>($yE-&EHzI4x4+k_F^X&Z2s@6)?9S4Wh0D;Fodm%^&*S{Z|P^}+9fbA5<`U2 z&3uV(;P;%PtDNs&g(1|8AQQ6`L_dM~8UB%|y}J>+swCvFHy%F&vY=e zf%iOsqy$MVxDAdM088>D7FK)U>JK)*6GwmWjlrRhD4Q?>0rKr#qvTurOH?d63U8k zkH!5f626l$foi4XhAtcvDoW~s(M&V_0Ty3HjIU3QfEU!zj6V^%m`nSgq0%$ypYH57T$_3d zI8uOt9y4+#52UTGy_de=V+PBADp=5x|EGM>^TpZ@#igI*ssDjq`}B_c3bbr=dI5fe z#mF+57e^M9*hZyEXNSP|XlX0N44yi~y!WOQ)o$@@yzLh)4zGbTTH0u0dZaypSATXE zK-rQu40hZ4Bfo>i!OzxVgOx`2KF(VI1f=nO#nI){OiL53oX34&ls4@QU?yyqY*JEE ziY%Ut&wh#0{y)84`9IYA_s^Dnn;}FP#1&C0OUg2qOO5uZ8=**LSJ`D7gvz*r;J_Q&@;=O5h!l?cW%?&O1jNRJ*p8hUPxpW9StypB_%)6<>z z(Ax0zc6l_>Se?>@Q|^$BV}Xj2qrJ;I(-}nji>ES1aeeJ4bGVc=Cc$n$%%yf;rm*_8lSR`Chk<@!dK9~A5>8+ia%v6zEVw;FjJsksj0G&SXRD6K1TU^~RvZOVa-_L})iFiMn zFK=vD1yODzIQ@vcl?fuik*?ZJKzT<$6=Oc!2|5=l<|h|#mzs$%=o%|EgTDf)XNtwI zG^Dj{%tfEIiv&emV$Dlb$)smR{bP`{Ct~ahMfgRIdcL?_j5Q`hBMdV=c_B^nDveMb zm)&6p8lI948&t&I#Xp}xz7~JK{5KXKHwK!`SFFg{5O=D4wOw<@_I40nTt6f`JaQu% zG9d&Iu+>LU6VH?+iPPy}X~19{71BYjg;U1_3UE**9DWHQ>yW6P^Cb^&0Sh?9{&bl# z$%hp29=enpOjsic%k{jI;(}Z2rKKp%=@%EeDu|`Cnf}f z2s3JqsMh2nG=X#_NcM%ecgYJ@*9h;}|D`+V5$)+|bRC4wvAA-aR!BtMF}H{pd8X-C z!Yyp|Imr*7miC=`!VR6A&l@_y;s>eiva0SKpd0@{+P>=0bp(UzB`3yMK33!RN#DH2 zn_UuD(8|kWv|sg!D6hKgu3{$GkbK|X2gl(y$MiP9uAP)9$Ksmzgtet5(_4?Vi4Yqc zj1PJfqS2kqqrJ`QYZ75w?HyFxi#^Lm+!0f~>U>K|PE;*u><)?NNI4-}Uzxd{d-6Q~ zT5hqCFV9Lf?a;R2)ly&Bk1KhT6v!Q)`x`Y0hu?Ua4R773>b!+Dv{imCgX;sv-1)A^ ziKyUA{Q|*O&|)#UBPSvd@Yz!`z}@gI-C~4%`#eC6*+6`PT6tjD6k%9>B0C&mdHo>S zKqAYgKt;PR+j5$D;wIr;Z(xxN{Z z61jb^ykmCl-JGfII=Y(UhdSE^mw0WBpK~)Ft*gu<-DIk{0Jw}9ItiF6$SuxJM4O#K z5*YMH)a>%mw>`~cbyl$X>lZR#Vv@AhA67gS^{<0^3$}*B1yR3wH)Xegpk`>fo`S?p z<$4L&8Zu_pV3V}HBEUTqdlEq3M0+7Z!OxvHO>WI0UhU-~D#@_LE&Y-;U=NE`O5YWs z?;k+HPslkA;mu*d(MDZCP7aF`+Co3(7(%2x9W}>PoI>`4%UcOBo5)WU8aUXyVE4FO z*V0CRj>dtn1Qh0>^ce!P14>H(03ZUxv%Mt3JQqRqKS|y}6*x$uvuk%Ui2+ss@*=?l zii8kcKx&LEg?;;o;9wYHI)TVj!wCI@7OP1rU2O(*ILEe)^Jp5p$YJFv(3}h_?d+2K z=YJ5l$?Hxyyl#$8VfdA#EHln*NKwl5V0p?j7o~Tb5CYcxU#e%`Y(}5KGt;pu_}R#a ztgzK}yPO7}tAdZ>I=>LM!p!8LDb*Zahxmv2wrR)b2rt5yc{s-x;p%|F$Mv(I=CHV3 zVxb(%_wtuIW=38XS$_Z{7k!$+Y+t&U4EIHhQmT0Ol&5~;Ppb}_*#V*FZXe`HLE+Zo z+H;=w1x;eD?%){0TzP&X!L%L1$zA$<$v93UFKdo{5?oBt$lqIfXgK55p152GbH&nu z0k^<88uv<~L$dh;n(KD<$46g08KKviJ%ssdIraU6aZ!`Th~Au!1MhWZgDXO-ikkym zjolM$BpgZ|e}N}qTb*GkGpOA9b4wZ(@*jPPHPDxn^}-u5+oX(x^zHPMV$zU6^Ve{Z zwb3R@r7GC6c_?bIN8B$@X!0w2piAfuN5gqLVYpsNdsXIJbX}udkA53$=nXPVvZ4;3 z=qdO23X4fJr3$Id<4{mnfNhAW#SD!mwdH!(7B==j^WTz(z<5anh_5rViLPXy-v<^f z644NbphUk^0x)vF463T{GD!bw9QGKdkGug|)VhPMcse31G%;Yoi%rz@i#-+ru%2N7 zU;<|@=sojsRV3gQ6PEU<5;54VR1AOaPY!0Vxb`syPae}eOeJ`R<j3pxk`O|fB-QN3XA^dSS3G~4JqWuMbtb_No1eCy0SbKC!(U<~VhaQ(o zllCX3K#|;ubztiKlj#<%A|{SX2z;m$=~ajO`uf(-?A;Q5YuPD=XBsiG)R&;NgD|ky z&z92MK`(&6?BZGvlr5_SR4xi3d*+9-T$(dd9c*Z{=Q}R}ZlLg_TBi``TWMjhf8VaccQ`%a%qHS!NR6b$#WVw{@36)_we1QU5+ze66di ztJl7&;)^Bsr=A*r;nQ$%VAg`K(kO(lI|@AqH&Dc_pVPIPjN-Kj&=kF-gI_7!jANz7 za>JgCJ@r*}SeZ#M{FH^VM#bIk`R?<(5Kf>BCv`~Wju+6^22Z%mf(Yu;i{X3va@&@| zr6b__;3rBH&qD4LzF9@kqu)+}f8vzd&;f_ZbE1YRJmiYMo7*7SNm2$^b5b+$1E5Kw zzyXO>QjtL5L{2!%17zd=2}NqqS0s>UQ44IE*mw69o%C^vs~?OZRCWgb`{LJ?1ySXr zj3R1#&SM3PfT?2Nsv~Q*!E3W_lTFyykIyuO5TU(hw1}Hkbg=bY*^(WgXt4j|RmL^S z@Dp*-w6G_#^9xDRoASp1<2eRb--XwER#%){m6(*&;rR#T*_daAeAm5inTQ|dIcuh< z6@4ve{Ea=evj42{o#*(1xs7y^;J`k~LS@v_SR2*Z8T}RxEM+avC*CFNj%Z`eXuibt z;o_sOE7#qRP(Rhg6u>&XDC2Lt^~(j8CL7}=P(@h!`}=!!+fB&1N!ETS<$kteF+bpd zLXcrXx!w=H?QJ~b8yE%Y%956Tj;2}4t+mKa2n^eb(v~Z0F*><~8*s&}`i=`m$GY^W z(Wvc4US2sC;W^nL@7oSZ1-70-d*i8c?sfYAU8{}!6iBykj{cSP@1cHtjG&ashJWEA19l88U8e$l^&9dCH)D zKxfaQ4(fhu$sPI}qw!{$eH0?o@qzw)V*!evQ&opI>p~y$i7vGyyQCDsEnER@k-#Tn zl7GfA{OZ*S;+5D+?852qnjul*&`%&5040{!KEi68NTXE#e_xLr5z-`$9g^xiMsbb&fys0(t|Pt^LOxZ2>$RA=OtC~%v@ycZ z)6+~{Y7RKbf=2I7-)#8ebG#eA@9wh22WwjjH)#J>uhQ8gL0aN|Z0;Xk8D~VR1KrpP z=nwvBfNp?Gd!v8--Db7>{*SpDuiJ&x%+G4gMUd}^-mFq473wN5$GsK985|mnx{+Ep zdKX@8o5&hlst$obw1k36r-r$`!usPj;+e>cm}t0$Oqc8(w2GzDPDpon8<<;jD>(Gb zuZ3%S<^wdpS7pPmSkVuW_0?U^-wDfvRzEZAB%)s`9?+vdn_R$HwMXULvNBUUzsH|? zD$=~~3-14U=D4L}PEXX7yo?>emm9Ivi@ zZ@uQGrpq-yKluVv5;ph$B;oTgeB-@CguSTPRb+5vwIopui047Qr^%}qvlF2-<$PlB z3OtmhxI2X~(cqFMUC~opjSs1LEA`!o5HZjwwvnch#Q0%BFgl2YWpp<(MS3ko`i{Ub z;YmJ9bj@H05Q(?}!42s{%ljZN1RU#wm=Z zu|MY(EXFpxV=Ot^X<5*ssDJfJnQ74?9mDQxEq%Paz=UN8}=cBa#&cHoU zA}nxayhj)DN{}p@K4};b!i+OY=*hg$bj{N%i|`3Xx8b&q%6S9dEkq9#-3H9}eDQDb zzACtcyZfVf&*a;Y)dcZ4t@XAdl=iN_|JYh9hf7iv>!8oee4R)Bxt=oLoZ8tNH5D|Tn_Uda)QBDa-jg!vv04VD z;f3>94(;GXOPa)LT8{pc4|8vVU#7m+_xKXjJ^s!kL2TLaB*n3Bt2CV|*FrDo$#s$O zU;S4esV}ENGaoI2ZXxU=Up5Qh=hE*g;Ep6JEf59A20FsTOu|YfKx0^$c zyU9WnDV~oD9WJs6D)9la?2=YFFhdHnlQ3-SP%9 z{>$N0+$>NwJonn#mG(5X-0epHc29)y4Wx*8Bh3e%0DutK!&Zo8jT%s&@gtgI(bMheaLQoW?#7r3x704aq%2qs*T8g>E!H@SLObycMm^{ zdF?RYQRrlRu_3X0tGdlpY&HoTm~t53S(!qm7{M!g3Jz$P5d&{1AKLD{7PawjK>P2R zZilpguK~-%;yu5QDPJsuyu(}tpH?i2|36no(+ZCwmV23#XlmC7M_N+4)Ew%ouX=ai za}T@gE&P=Y_aWd8zt|dN5ihxrL^BPCC!#{(0i7{$3)^Uz3BZqH6!D8FFeOn{#7I*9 z%Fkz>82o*qbTEa17m}tTibxEPxqrvX>9`i0Y94j`#7L2*5dZMsHiDyCc-I_JyGdmCX!h$BwWv6 znN39TEYZ4EF(1J5rZXQI==c{}V0*p-v= z>pWjPFDiQK(;_BEW*%N+WR$(K(HWi@XhrV?M#gym$}@mJD^+z@W77zuGTnzKyD%74 zKjJ7?A^Md~G>{ey5AB^Jk+Y`3l?j|PKTfA{J4RM;@rblwQQf>!!trMSc;ev@lOGcn zm`}vDpd)p#yMOV3C!rmHOHn<=pePjT(j*FakM_PATceO;v+rR>>bcsGLuvdHH$zP3 zza6}Hx<|eJ!`?u=YhH5+UW%5bO^mVt)du`5{!itW{8L#VMuK#T_$i%XMpqMvQKs{% zs1d)bCP5LzFH@ogY$bTj1qA Date: Sun, 17 Mar 2019 13:19:30 +0800 Subject: [PATCH 019/814] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E7=AB=A0=E5=AD=90?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 10 ++++++++++ book/05-Control-Flow.md | 15 ++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 03c7a518..0bd5def3 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -53,5 +53,15 @@ * [本章小结](book/03-Objects-Everywhere.md#本章小结) * [第四章 运算符](book/04-Operators.md) * [第五章 控制流](book/05-Control-Flow.md) + * [本章小结](book/05-Control-Flow.md#true和flase) + * [本章小结](book/05-Control-Flow.md#if-else) + * [本章小结](book/05-Control-Flow.md#迭代语句) + * [本章小结](book/05-Control-Flow.md#for-in语法) + * [本章小结](book/05-Control-Flow.md#return) + * [本章小结](book/05-Control-Flow.md#break和continue) + * [本章小结](book/05-Control-Flow.md#臭名昭著的goto) + * [本章小结](book/05-Control-Flow.md#switch) + * [本章小结](book/05-Control-Flow.md#switch字符串) + * [本章小结](book/05-Control-Flow.md#本章小结) * [词汇表](GLOSSARY.md) diff --git a/book/05-Control-Flow.md b/book/05-Control-Flow.md index ea20bd69..4e213851 100644 --- a/book/05-Control-Flow.md +++ b/book/05-Control-Flow.md @@ -6,7 +6,7 @@ Java 使用 C 的所有执行控制语句,因此如果您使用 C 或 C++ 进 [TOC] -## true and flase +## true和flase 条件表达式的示例是 **a == b**。这里有一个条件表达式示例,它使用条件操作符**“==”**来查看 **a**的值是否等于 **b** 的值。 表达式返回 **true** 或 **false**。 如果显示条件表达式的结果,则会生成表示布尔值的字符串 **“true”** 和 **“false”**。 @@ -357,7 +357,7 @@ public class TestWithReturn { 如果在返回 **void** 的方法中没有 **return** 语句,则在该方法结束时会有一个隐式的 **return**,因此一个方法中并不总是需要包含 **return** 语句。 但是,如果您的方法声明它将返回除 **void** 之外的任何返回类型,则必须确保每个代码路径都返回一个值。 -## break and continue +## break和continue 在任何迭代语句的主体部分,都可以使用 **break** 和 **continue** 来控制循环的流程。 其中,**break** 退出循环而不执行循环中的其余语句。 而 **continue** 停止执行当前的迭代,然后退回循环起始处,以开始下一次迭代。 @@ -671,7 +671,9 @@ int c = rand.nextInt(26) + 'a'; **Random.nextInt()**将产生0~25之间的一个随机 **int** 值,它将被加到 **"a"** 上。这表示 **"a"** 将自动被转换为 **int** 以执行假发。为了把 **c** 当作字符打印,必须将其转型为 **char**;否则,将产生整数输出。 -##Switching on Strings + + +## switch字符串 Java 7增加了在字符串上 **switch** 的用法。 此示例展示了您从一组String可能性中选择的旧方法,以及使用switch的新方法: @@ -768,7 +770,7 @@ java RandomBounds upper -## Summary +## 本章小结 本章总结了我们对大多数编程语言中出现的基本特征的探索:计算,运算符优先级,类型转换,选择和迭代。 现在,您已准备好开始采取措施,使您更接近面向对象和函数式编程的世界。 下一章将介绍初始化和清理对象的重要问题,接下来的章节将介绍隐藏实现细节(implementation hiding)的这一核心概念。 @@ -776,4 +778,7 @@ java RandomBounds upper 1. 在早期的语言中,大量的决策都是基于使编译器编写者的生活更轻松。 你会发现,在现代语言中,大多数设计决策都会让语言用户的生活更轻松,尽管有时会有妥协 - 这通常会让语言设计师感到后悔。 -2. 请注意,这似乎是一个难以支持的主张,并且很可能是称为相关因果关系谬误的认知偏差的一个例子 \ No newline at end of file +2. 请注意,这似乎是一个难以支持的主张,并且很可能是称为相关因果关系谬误的认知偏差的一个例子。 + + +
\ No newline at end of file From c028a4cd98f9463f88c1da1a1c67e7c6742809e8 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 17 Mar 2019 13:23:39 +0800 Subject: [PATCH 020/814] autocommit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d55187e5..c676703b 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ - 2019-03-14 第三章 万物皆对象翻译完成 +- 2019-03-17 第五章 控制流翻译完成 + ## 原书作者
@@ -61,7 +63,7 @@ ## 贡献者 * 主译: LingCoder -* 参译: +* 参译: LortSir * 校对:nickChenyx From b0ee793c4695c90396afe20ec81cdf8dfbb294a3 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 17 Mar 2019 13:34:19 +0800 Subject: [PATCH 021/814] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=8D=90=E8=B5=A0?= =?UTF-8?q?=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book.json | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/book.json b/book.json index 031275fd..f99031f5 100644 --- a/book.json +++ b/book.json @@ -21,7 +21,6 @@ "emphasize", "toggle-chapters", "katex", - "donate", "mermaid-gb3", "advanced-emoji", "include-codeblock" @@ -30,14 +29,6 @@ "edit-link": { "base": "https://github.com/lingcoder/OnJava8/edit/master", "label": "Edit This Page" - }, - "donate": { - "wechat": "https://github.com/LingCoder/OnJava8/raw/master/images/wechat.PNG", - "alipay": "https://github.com/LingCoder/OnJava8/raw/master/images/alipay.PNG", - "title": "", - "button": "赏", - "alipayText": "支付宝打赏", - "wechatText": "微信打赏" - } + } } } From cb22fe35c28d0aa090c4d917e46b4b7c5cd30f35 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Wed, 20 Mar 2019 10:08:12 +0800 Subject: [PATCH 022/814] =?UTF-8?q?=E8=84=9A=E6=B3=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/03-Objects-Everywhere.md | 115 ++++++++++++---------------------- 1 file changed, 40 insertions(+), 75 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index a74aeb85..fb18f132 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -116,9 +116,7 @@ Java 的设计主要目标之一是安全性,因此许多困扰 C 和 C++ 程 我们还可创建基本类型的数组。编译器通过将该数组的内存归零来保证初始化。本书稍后将详细介绍数组,特别是在数组章节中。 - [^1]: 脚注预留 - [^2]: 脚注预留 - [^3]: 脚注预留 + ## 代码注释 @@ -300,7 +298,7 @@ class DataOnly { 方法的返回类型表明了当你调用它时会返回的结果类型。参数列表则显示了可被传递到方法内部的参数类型及名称。方法的名称和参数列表被统称为**方法签名**(**signature of the method**)。签名作为方法的唯一性标识。 -Java 中的方法只能作为类的一部分创建。它只能被对象所调用,并且该对象必须有权限来执行调用。若对象调用错误的方法,则程序将在编译时报错。 +Java 中的方法只能作为类的一部分创建。它只能被对象所调用 [^4],并且该对象必须有权限来执行调用。若对象调用错误的方法,则程序将在编译时报错。 我们可以通过在对象名的后面跟上 `.` 符号+方法名及其参数来调用一个方法。代码示例: @@ -319,7 +317,7 @@ int x = a.f(); #### 参数列表 -方法参数列表指定传递给方法的信息。正如你可能猜到的,这些信息 —— 就像 Java 中的其他所有信息 —— 采用对象的形式。参数列表必须指定对象类型和每个对象的名称。同样,我们并没有直接处理对象,而是在传递对象引用。但是引用的类型必须是正确的。如果方法需要 String 参数,则必须传入 String,否则编译器将报错。 +方法参数列表指定传递给方法的信息。正如你可能猜到的,这些信息 —— 就像 Java 中的其他所有信息 —— 采用对象的形式。参数列表必须指定对象类型和每个对象的名称。同样,我们并没有直接处理对象,而是在传递对象引用 [^5] 。但是引用的类型必须是正确的。如果方法需要 String 参数,则必须传入 String,否则编译器将报错。 ```JAVA int storage(String s) { @@ -405,11 +403,13 @@ import java.util.*; #### static关键字 -类是对象的外观及行为方式的描述。通常只有在使用 `new` 关键字之后程序才能被分配存储空间以及使用其方法。 +类是对象的外观及行为方式的描述。通常只有在使用 `new` 关键字之后程序才能被分配存储空间以及使用其方法。这种方式在两种情况下是不足的。 + +1. 有时你只需要为特定字段分配一个共享存储空间,无论该类创建了多少个对象,或者即使没有创建任何对象; -这种方式在两种情况下是不足的。1. 有时你只需要为特定字段分配一个共享存储空间,无论该类创建了多少个对象,或者即使没有创建任何对象;第二种情况是,创建一个与此类本身任何对象无关的方法。也就是说,即使没有创建对象,也能调用该方法。 +2. 创建一个与此类本身任何对象无关的方法。也就是说,即使没有创建对象,也能调用该方法。 -**static** 关键字(从 C++ 采用)就符合我们的要求。当我们说某些东西是静态的时,它意味着该字段或方法不依赖于任何特定的对象实例。即使我们从未创建过该类的对象,也可以调用其静态方法或访问静态字段。相反,对于普通的非静态字段和方法,我们必须要先创建一个对象并使用该对象来访问该字段或方法,因为非静态字段和方法必须与替对象关联. +**static** 关键字(从 C++ 采用)就符合我们的要求。当我们说某些东西是静态的时,它意味着该字段或方法不依赖于任何特定的对象实例 。 即使我们从未创建过该类的对象,也可以调用其静态方法或访问静态字段。相反,对于普通的非静态字段和方法,我们必须要先创建一个对象并使用该对象来访问该字段或方法,因为非静态字段和方法必须与替对象关联 [^6] 。 一些面向对象的语言使用类数据(**class data**)和类方法(**class method**)这样的术语来表述静态。静态的数据意味着该数据和方法仅存在于类中,而非类的任何实例对象中。有时 Java 文献也使用这些术语。我们可以通过在类的属性或方法前添加 `static` 修饰来表示这是一个静态属性或静态方法。 @@ -429,7 +429,7 @@ StaticTest st1 = new StaticTest(); StaticTest st2 = new StaticTest(); ``` -st1.i和st2.i的值都是47,因为它们属于同一段内存。引用静态变量有两种方法。在前面的示例中,我们可以通过一个对象来命名它;例如,st2.i。同时,你也可以通过它的类名直接调用它(这是非静态成员不能执行的操作): +st1.i 和 st2.i 的值都是47,因为它们属于同一段内存。引用静态变量有两种方法。在前面的示例中,我们可以通过一个对象来命名它;例如,st2.i。同时,你也可以通过它的类名直接调用它(这是非静态成员不能执行的操作): ```JAVA StaticTest.i ++; @@ -437,7 +437,7 @@ StaticTest.i ++; `++` 运算符将会使变量结果 + 1。此时 st1.i 和 st2.i 的值就变成了48了。 -使用类名直接引用静态变量的首选方法,因为它强调了变量的静态属性。类似的逻辑也适用于静态方法。我们可以通过对象引用静态方法,就像使用任何方法一样,也可以使用特殊的附加语法 classname.method()来直接调用静态属性或方法。 +使用类名直接引用静态变量的首选方法,因为它强调了变量的静态属性。类似的逻辑也适用于静态方法。我们可以通过对象引用静态方法,就像使用任何方法一样,也可以使用特殊的附加语法 classname.method()来直接调用静态属性或方法 [^7]。 代码示例: @@ -448,6 +448,7 @@ class Incrementable { } } ``` + 上例中 Incrementable 类调用静态方法 increment()。后者再使用 `++` 运算符递增静态变量 int i。我们依然可以先实例化对象再调用该方法。 代码示例: @@ -471,9 +472,6 @@ Incrementable.increment(); ## 小试牛刀 最后,我们来开始编写第一个完整的程序。我们使用 Java 标准库来展示一个字符串和日期。 -Finally, here’s the first complete program. It starts by displaying a -String, followed by the date, using the Date class from the Java -standard library. ```JAVA @@ -493,9 +491,9 @@ import java.util.*; 如果你想在代码中使用到一些额外的库,那么你需要在程序文件的开始处使用 **import** 关键字来导入它们。之所以说是额外的,因为有一些库已经默认自动包含到每个文件里了。例如:**java.lang** 包。 -现在打开你的浏览器在 [Oracle](https://www.oracle.com/) 上查看文档。如果你还没有在 [Oracle](https://www.oracle.com/) 网站上下载 JDK 文档,那就趁现在 ^[4] 。查看包列表,你会看到 Java 附带的所有不同的类库。 +现在打开你的浏览器在 [Oracle](https://www.oracle.com/) 上查看文档。如果你还没有在 [Oracle](https://www.oracle.com/) 网站上下载 JDK 文档,那就趁现在 [^8] 。查看包列表,你会看到 Java 附带的所有不同的类库。 + -[^4]: 脚注预留 选择 **java.lang**。这里显示的是该库中所有类的列表。由于 **java.lang** 隐式包含在每个 Java代码文件中,因此这些类是自动可用的。**java.lang** 中没有列出 **Date** 类,所以我们必须将其导入库才能使用它。如果你不清楚某个类名或者想查看所有的类,可以在 Java 文档中选择“Tree”。 @@ -579,7 +577,7 @@ java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\ ### 编译和运行 -要编译和运行本书中的代码示例,首先必须具有Java编程环境。 第二章的示例中描述了安装过程。如果你遵循这些说明,那么你将会在不受 Oracle 的限制的条件下用到 Java 开发人员工具包(JDK)。如果你使用其他开发系统,请查看该系统的文档以确定如何编译和运行程序。 第二章还介绍了如何安装本书的示例。 +要编译和运行本书中的代码示例,首先必须具有 Java 编程环境。 第二章的示例中描述了安装过程。如果你遵循这些说明,那么你将会在不受 Oracle 的限制的条件下用到 Java 开发人员工具包(JDK)。如果你使用其他开发系统,请查看该系统的文档以确定如何编译和运行程序。 第二章还介绍了如何安装本书的示例。 移动到 objects 子目录下并键入: @@ -594,13 +592,13 @@ javac HelloDate.java ```JAVA java HelloDate ``` -我们将会获得信息反馈,日期输出。这是我们编译和运行本书中每个程序(包含main())的过程^[9]。但是,本书的源代码在根目录中也有一个名为 **build.gradle** 的文件,其中包含用于自动构建,测试和运行本书文件的 **Gradle** 配置。当您第一次运行 `gradlew` 命令时,**Gradle** 将自动安装(前提已安装Java)。 +我们将会获得信息反馈,日期输出。这是我们编译和运行本书中每个程序(包含main())的过程 [^9]。但是,本书的源代码在根目录中也有一个名为 **build.gradle** 的文件,其中包含用于自动构建,测试和运行本书文件的 **Gradle** 配置。当您第一次运行 `gradlew` 命令时,**Gradle** 将自动安装(前提已安装Java)。 ## 编码风格 -Java 的代码约定规范(*Code Conventions for the Java Programming Language*)要求类名的首字母大写。 如果类名是由多个单词构成的,则每个单词的首字母都应大写(不采用下划线来分隔)例如: +Java 的代码约定规范(*Code Conventions for the Java Programming Language*)[^10] 要求类名的首字母大写。 如果类名是由多个单词构成的,则每个单词的首字母都应大写(不采用下划线来分隔)例如: ```JAVA class AllTheColorsOfTheRainbow { @@ -626,61 +624,28 @@ class AllTheColorsOfTheRainbow { ## 本章小结 -This chapter shows you just enough Java so you understand how to -write a simple program. You’ve also seen an overview of the language -and some of its basic ideas. However, the examples so far have all been -of the form “Do this, then do that, then do something else.” The next -two chapters will introduce the basic operators used in Java -programming, and show you how to control the flow of your program. -1. This can be a flashpoint. There are those who say, “Clearly, it’s a -pointer,” but this presumes an underlying implementation. Also, -the syntax of Java references is much more akin to C++ references -than to pointers. In the 1st edition of Thinking in Java, I chose to -invent a new term, “handle,” because C++ references and Java -references have some important differences. I was coming out of -C++ and did not want to confuse the C++ programmers whom I -assumed would be the largest audience for Java. In the 2nd -edition of Thinking in Java, I decided that “reference” was the -more commonly used term, and that anyone changing from C++ -would have a lot more to cope with than the terminology of -references, so they might as well jump in with both feet. However, -there are people who disagree even with the term “reference.” In -one book I read that it was “completely wrong to say that Java -supports pass by reference,” because Java object identifiers -(according to that author) are actually “object references.” And -(he goes on) everything is actually pass by value. So you’re not -passing by reference, you’re “passing an object reference by -value.” One could argue for the precision of such convoluted -explanations, but I think my approach simplifies the -understanding of the concept without hurting anything (well, -language lawyers may claim I’m lying to you, but I’ll say that I’m -providing an appropriate abstraction).↩ -2. Most microprocessor chips do have additional cache memory but -this is organized as traditional memory and not as registers↩ -3. An example of this is the String pool. All literal Strings and -String-valued constant expressions are interned automatically -and put into special static storage. ↩ -4. static methods, which you’ll learn about soon, can be called for -the class, without an object.↩ -5. With the usual exception of the aforementioned “special” data -types boolean, char, byte, short, int, long, float, and double. In general, -though, you pass objects, which really means -you pass references to objects. ↩ -6. static methods don’t require objects to be created before they -are used, so they cannot directly access non-static members or -methods by calling those other members without referring to a -named object (since non-static members and methods must be -tied to a particular object).↩ -7. In some cases it also gives the compiler better opportunities for -optimization↩ -8. Note this documentation doesn’t come packed with the JDK; you -must do a separate download to get it. ↩ -9. For every program in this book to compile and run through the -command line, you might also need to set your CLASSPATH. ↩ -10. (Search the Internet; also look for “Google Java Style”). To keep -code listings narrow for this book, not all these guidelines could -be followed, but you’ll see that the style I use here matches the -Java standard as much as possible.↩ - -
+本章向您展示了简单的 Java 程序编写以及该语言相关的基本概念。到目前为止,我们的示例都只是些简单的顺序执行。在接下来的两章里,我们将会接触到 Java 的一些基本操作符,以及如何去控制程序执行的流程。 + + + [^1]: 这里可能有争议。有人说这是一个指针,但这假定了一个潜在的实现。此外,Java 引用的语法更类似于 C++ 引用而非指针。在 *Thinking in Java* 的第 1 版中,我发明了一个新术语叫“句柄”(*handle*),因为 C++ 引用和Java 引用有一些重要的区别。作为一个从 C++ 的过来人,我不想混淆 Java 可能的最大受众 —— C++ 程序员。在*Thinking in Java* 的第 2 版中,我认为“引用”(*reference*)是更常用的术语,从 C++ 转过来的人除了引用的术语之外,还有很多东西需要处理,所以他们不妨双脚都跳进去。但是,也有些人甚至不同意“引用”。在某书中我读到一个观点:Java 支持引用传递的说法是完全错误的,因为 Java 对象标识符(根据该作者)实际上是“对象引用”(*object references*),并且一切都是值传递。所以你不是通过引用传递,而是“通过值传递对象引用。人们可以质疑我的这种解释的准确性,但我认为我的方法简化了对概念的理解而又没对语言造成伤害(嗯,语言专家可能会说我骗你,但我会说我只是对此进行了适当的抽象。) + + [^2]: 大多数微处理器芯片都有额外的高速缓冲存储器,但这是按照传统存储器而不是寄存器。 + + [^3]: 一个例子是字符串常量池。所有文字字符串和字符串值常量表达式都会自动放入特殊的静态存储中。 + + [^4]: 静态方法,我们很快就能接触到,它可以在没有对象的情况下直接被类调用。 + + [^5]: 通常除了前面提到的“特殊”数据类型 boolean,char,byte,short,int,long,float 和 double。通常来说,传递对象就意味者传递对象的引用。 + + [^6]: 静态方法在使用之前不需要创建对象,因此它们不能直接调用非静态的成员或方法(因为非静态成员和方法必须要先实例化为对象才可以被使用)。 + + [^7]: 在某些情况下,它还为编译器提供了更好的优化可能。 + + [^8]: 请注意,此文档未包含在 JDK 中;你必须单独下载才能获得它。 + + [^9]: 对于本书中编译和运行命令行的每个程序,你可能还需要设置 CLASSPATH 。 + + [^10]: 为了保持本书的代码排版紧凑,我并没完全遵守规范,但我尽量会做到符合 Java 标准。 + +
\ No newline at end of file From b1dd7665b3fc0d8a0c59dd094a7d1aa8d2b4bb9a Mon Sep 17 00:00:00 2001 From: LingCoder Date: Wed, 20 Mar 2019 10:12:09 +0800 Subject: [PATCH 023/814] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/03-Objects-Everywhere.md | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index fb18f132..5f0a8dbf 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -331,9 +331,7 @@ int storage(String s) { ```JAVA s.length() * 2 ``` -产生的。在方法中,我们可以返回任意的数据。如果我们不想方法返回什么数据,则可以通过给方法标识 `void` 来表明这是一个无需返回值的方法。 - -代码示例: +产生的。在方法中,我们可以返回任意的数据。如果我们不想方法返回什么数据,则可以通过给方法标识 `void` 来表明这是一个无需返回值的方法。 代码示例: ```JAVA boolean flag() { @@ -411,9 +409,7 @@ import java.util.*; **static** 关键字(从 C++ 采用)就符合我们的要求。当我们说某些东西是静态的时,它意味着该字段或方法不依赖于任何特定的对象实例 。 即使我们从未创建过该类的对象,也可以调用其静态方法或访问静态字段。相反,对于普通的非静态字段和方法,我们必须要先创建一个对象并使用该对象来访问该字段或方法,因为非静态字段和方法必须与替对象关联 [^6] 。 -一些面向对象的语言使用类数据(**class data**)和类方法(**class method**)这样的术语来表述静态。静态的数据意味着该数据和方法仅存在于类中,而非类的任何实例对象中。有时 Java 文献也使用这些术语。我们可以通过在类的属性或方法前添加 `static` 修饰来表示这是一个静态属性或静态方法。 - -代码示例: +一些面向对象的语言使用类数据(**class data**)和类方法(**class method**)这样的术语来表述静态。静态的数据意味着该数据和方法仅存在于类中,而非类的任何实例对象中。有时 Java 文献也使用这些术语。我们可以通过在类的属性或方法前添加 `static` 修饰来表示这是一个静态属性或静态方法。 代码示例: ```JAVA class StaticTest { @@ -421,8 +417,7 @@ class StaticTest { } ``` -现在,即使你创建了两个 StaticTest 对象,但是静态变量 i 仍只占一份存储空间。两个对象都会共享相同的变量 i。 -代码示例: +现在,即使你创建了两个 StaticTest 对象,但是静态变量 i 仍只占一份存储空间。两个对象都会共享相同的变量 i。 代码示例: ```JAVA StaticTest st1 = new StaticTest(); @@ -437,9 +432,7 @@ StaticTest.i ++; `++` 运算符将会使变量结果 + 1。此时 st1.i 和 st2.i 的值就变成了48了。 -使用类名直接引用静态变量的首选方法,因为它强调了变量的静态属性。类似的逻辑也适用于静态方法。我们可以通过对象引用静态方法,就像使用任何方法一样,也可以使用特殊的附加语法 classname.method()来直接调用静态属性或方法 [^7]。 - -代码示例: +使用类名直接引用静态变量的首选方法,因为它强调了变量的静态属性。类似的逻辑也适用于静态方法。我们可以通过对象引用静态方法,就像使用任何方法一样,也可以使用特殊的附加语法 classname.method()来直接调用静态属性或方法 [^7]。 代码示例: ```JAVA class Incrementable { @@ -449,9 +442,7 @@ class Incrementable { } ``` -上例中 Incrementable 类调用静态方法 increment()。后者再使用 `++` 运算符递增静态变量 int i。我们依然可以先实例化对象再调用该方法。 - -代码示例: +上例中 Incrementable 类调用静态方法 increment()。后者再使用 `++` 运算符递增静态变量 int i。我们依然可以先实例化对象再调用该方法。 代码示例: ```JAVA Incrementable sf = new Incrementable(); @@ -493,25 +484,18 @@ import java.util.*; 现在打开你的浏览器在 [Oracle](https://www.oracle.com/) 上查看文档。如果你还没有在 [Oracle](https://www.oracle.com/) 网站上下载 JDK 文档,那就趁现在 [^8] 。查看包列表,你会看到 Java 附带的所有不同的类库。 - - - 选择 **java.lang**。这里显示的是该库中所有类的列表。由于 **java.lang** 隐式包含在每个 Java代码文件中,因此这些类是自动可用的。**java.lang** 中没有列出 **Date** 类,所以我们必须将其导入库才能使用它。如果你不清楚某个类名或者想查看所有的类,可以在 Java 文档中选择“Tree”。 现在,我们可以找到 Java 附带的每个类。使用浏览器的“查找”功能查找 “Date”。搜索结果中将会列出 java.util.Date,显而易见,它在 util 库中,所以我们必须导入 java.util.* 才能使用 Date。 -如果你在文档中选择 java.lang,然后选择 System,你会看到 System 类中有几个字段,如果你选择 `out`,你会发现它是一个静态的 PrintStream 对象。 所以,即使我们没有使用 new 创建, `out` 对象就已经存在并可以使用。 `out` 对象可以执行的操作取决于 PrintStream 。 其在文档中的描述中显示为超链接,如果单击该链接,我们将可以看到 PrintStream 所对应的方法列表。(更多详情,将在本书后面介绍。) 现在我们重点说的是 println()这个方法。 它的作用是“j将信息输出到控制台,并以换行符结束。” 既然如此,我们可以这样编码来输出信息到控制带。 - -代码示例: +如果你在文档中选择 java.lang,然后选择 System,你会看到 System 类中有几个字段,如果你选择 `out`,你会发现它是一个静态的 PrintStream 对象。 所以,即使我们没有使用 new 创建, `out` 对象就已经存在并可以使用。 `out` 对象可以执行的操作取决于 PrintStream 。 其在文档中的描述中显示为超链接,如果单击该链接,我们将可以看到 PrintStream 所对应的方法列表。(更多详情,将在本书后面介绍。) 现在我们重点说的是 println()这个方法。 它的作用是“j将信息输出到控制台,并以换行符结束。” 既然如此,我们可以这样编码来输出信息到控制带。 代码示例: ```JAVA System.out.println("A String of things"); ``` -每个 java 源文件中允许有多个类。与此同时,源文件的名称必须要和其中一个类名相同,否则编译器将会报错。每个独立的程序应该包含一个 mian 方法作为程序运行的入口。其方法签名和返回类型如下 - -代码示例: +每个 java 源文件中允许有多个类。与此同时,源文件的名称必须要和其中一个类名相同,否则编译器将会报错。每个独立的程序应该包含一个 mian 方法作为程序运行的入口。其方法签名和返回类型如下。代码示例: ```JAVA public static void main(String[] args) { From 4e34b78fa126b9ca1ad5d1ae71a4fa7a30de65f3 Mon Sep 17 00:00:00 2001 From: Langdon <575998772@qq.com> Date: Wed, 20 Mar 2019 19:33:38 +0800 Subject: [PATCH 024/814] =?UTF-8?q?=E7=AC=AC=E5=8D=81=E4=B8=89=E7=AB=A0=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=BC=8F=E7=BC=96=E7=A8=8B=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=88=E6=9C=89=E5=B0=8F2=E4=B8=AA=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E6=8E=92=E7=89=88=E9=97=AE=E9=A2=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/05-Control Flow.md | 2 +- book/13-Functional Programming.md | 1429 +++++++++++++++++++++++++++++ 2 files changed, 1430 insertions(+), 1 deletion(-) create mode 100644 book/13-Functional Programming.md diff --git a/book/05-Control Flow.md b/book/05-Control Flow.md index ea20bd69..c6953d85 100644 --- a/book/05-Control Flow.md +++ b/book/05-Control Flow.md @@ -776,4 +776,4 @@ java RandomBounds upper 1. 在早期的语言中,大量的决策都是基于使编译器编写者的生活更轻松。 你会发现,在现代语言中,大多数设计决策都会让语言用户的生活更轻松,尽管有时会有妥协 - 这通常会让语言设计师感到后悔。 -2. 请注意,这似乎是一个难以支持的主张,并且很可能是称为相关因果关系谬误的认知偏差的一个例子 \ No newline at end of file +2. 请注意,这似乎是一个难以支持的主张,并且很可能是称为相关因果关系谬误的认知偏差的一个例子。 \ No newline at end of file diff --git a/book/13-Functional Programming.md b/book/13-Functional Programming.md new file mode 100644 index 00000000..301cf0cd --- /dev/null +++ b/book/13-Functional Programming.md @@ -0,0 +1,1429 @@ +# 第十三章-函数式编程 + +函数式编程语言操纵代码片段就像操作数据一样容易。 虽然 Java 不是函数式语言,但 Java 8 Lambda 表达式和方法引用 (Method References) 允许您以函数式编程。在计算机时代的早期,内存是稀缺和珍贵的。几乎每个人都用汇编语言编程。 人们对编译器有所了解,但仅仅想到编译生成的代码肯定会比手工编码多了很多字节。 + +通常,只是为了使程序适合有限的内存,程序员通过修改内存中的代码来保存代码空间,以便在程序执行时执行不同的操作。这种技术被称为自修改代码 (self-modifying code,),只要程序足够小,少数人可以维护所有棘手和神秘的汇编代码,你就可以让它运行起来。 + +内存变得更便宜,处理器变得更快。 C语言出现并被大多数汇编语言程序员认为是“高级”。其他人发现C可以使他们显着提高生产力。 使用C,创建自修改代码仍然不是那么难。 + +随着硬件越来越便宜,程序的规模和复杂性都在增长。 只是让程序工作变得困难。 我们想方设法使代码更加一致和易懂。 自我修改代码,以其最纯粹的形式,结果是一个非常糟糕的主意,因为它很难确定它在做什么。 它也很难测试,因为你是测试输出,转换中的一些代码,修改的过程吗?诸如此类。 + +然而,使用代码以某种方式操纵其他代码的想法仍然很有趣,只要有一些方法可以使它更安全。从代码创建,维护和可靠性的角度来看,这个想法非常引人注目。 如果不是从头开始编写大量代码,而是从可以理解,经过充分测试和可靠的现有小块开始。 然后将它们组合在一起以创建新代码。 这不会让我们更有效率,同时创造更强大的代码吗? + +这就是函数式编程(FP)的意义所在。 通过合并现有代码来生成新功能而不是从头开始编写所有内容,您可以更快地获得更可靠的代码。 至少在某些情况下,这个理论似乎很有用。 在路上,函数式语言产生了很好的语法,一些非函数式语言已经习惯了。 + +你也可以这样想: + +OO (object oriented) 是抽象数据,FP (functional programming) 是抽象行为。 + +纯粹的函数式语言在安全性方面更进一步。 它强加了额外的约束,即所有数据必须是不可变的:设置一次,永不改变。 将值传递给函数,该函数然后生成新值但从不修改自身外部的任何东西(包括其参数或该函数范围之外的元素)。 当强制执行此操作时,您知道任何错误都不是由所谓的副作用引起的,因为该函数仅创建并返回结果,而不是其他任何错误。 + +更好的是,“不可变对象和无副作用”范例解决了并发编程中最基本和最棘手的问题之一(当程序的某些部分同时在多个处理器上运行时)。 这是可变共享状态的问题,这意味着代码的不同部分(在不同的处理器上运行)可以尝试同时修改同一块内存(谁赢了?没人知道)。 如果函数永远不会修改现有值但只生成新值,则不会对内存产生争用,这是纯函数式语言的定义。 因此,经常提出纯函数式语言作为并行编程的解决方案(还有其他可行的解决方案)。 + +那么,请注意,函数式语言背后有很多动机,这意味着描述它们可能会有些混乱。 它通常取决于观点。 原因是“它是并行编程”,“代码可靠性”和“代码创建和库重用” 。[^1] 还要记住FP (functional programming)的参数 ( 特别是程序员将更快地创建更强大的代码 ) 至少仍然存在部分假设。 我们已经看到了一些好的结果,[^2]但我们没说纯函数式语言是解决编程问题的最佳方法。 + +FP的想法值得融入非FP语言。 例如,这种情况发生在Python语言中。 Java 8在FP中添加了自己的功能,我们将在此章探讨。 + + + +## 旧 VS 新 + +通常,方法会根据我们传递的数据产生不同的结果。 如果您希望某个方法在从一个调用到下一个调用时表现不同,该怎么办? 如果我们将代码传递给方法,我们可以控制它的行为。 以前,我们通过在方法中创建包含所需行为的对象,然后将该对象传递给我们想要控制的方法来完成此操作。 以下示例显示了这一点,然后添加了 Java 8方法:方法引用和 lambda 表达式。 + +```java +// functional/Strategize.java + +interface Strategy { + String approach(String msg); +} + +class Soft implements Strategy { + public String approach(String msg) { + return msg.toLowerCase() + "?"; + } +} + +class Unrelated { + static String twice(String msg) { + return msg + " " + msg; + } +} + +public class Strategize { + Strategy strategy; + String msg; + Strategize(String msg) { + strategy = new Soft(); // [1] + this.msg = msg; + } + void communicate() { + System.out.println(strategy.approach(msg)); + } + void changeStrategy(Strategy strategy) { + this.strategy = strategy; + } + public static void main(String[] args) { + Strategy[] strategies = { + new Strategy() { // [2] + public String approach(String msg) { + return msg.toUpperCase() + "!"; + } + }, + msg -> msg.substring(0, 5), // [3] + Unrelated::twice // [4] + }; + Strategize s = new Strategize("Hello there"); + s.communicate(); + for(Strategy newStrategy : strategies) { + s.changeStrategy(newStrategy); // [5] + s.communicate(); // [6] + } + } +} +/* Output: +hello there? +HELLO THERE!' +Hello +Hello there Hello there +*/ +``` + +**Strategy** 提供了在其单一 **approach()** 方法中承载功能的接口。 通过创建不同的 **Strategy** 对象,您可以创建不同的行为。 + +传统上,我们通过创建一个实现 **Strategy** 接口的类来实现此行为,比如在 **Soft** 。 + +**[1] **在**Strategize** 中,您可以看到 **Soft** 是默认策略,因为它是在构造函数中分配的。 + +**[2]** 一种略显冗长且更自发的方法是创建一个匿名的内部类。仍然有相当数量的重复代码,你总是要看它,直到你说 “ 哦,我明白,他们正在使用一个匿名的内部类。” + +**[3] **这是 **Java 8 lambda** 表达式,由箭头 **->** 分隔开参数和函数体,箭头左边是参数,箭头右侧是从lambda返回的表达式,即函数体。这实现了与类定义和匿名内部类相同的效果,但代码少得多。 + +**[4]** 这是Java 8 的*方法引用*,由 **::** 区分。在 **::** 的左边是类或对象的名称,在 **::** 的右边是方法的名称,但没有参数列表。 + +**[5]** 在使用默认的 **Soft** **strategy** 之后,我们逐步遍历数组中的所有策略,并使用 **changeStrategy()**将每个策略放入 **s** 中。 + +[6]现在,每次调用**communic()**都会产生不同的行为,具体取决于此刻正在使用的策略 “代码对象”。我们传递行为,而不是仅传递数据。[^3] + +在Java 8之前,我们已经能够通过[1]和[2]传递功能。但是,写入和读取的语法非常笨拙,我们只在强制时才这样做。 方法引用和lambda表达式可以在您需要时传递功能,而不是仅在必要时传递功能。 + +## Lambda 表达式 + +Lambda表达式是使用最小可能语法编写的函数定义: + +1. Lambda 表达式产生函数,而不是类。 在 Java 虚拟机(JVM)上,一切都是一个类,因此在幕后执行各种操作使 Lambda 看起来像函数 - 但作为程序员,你可以高兴地假装它们“只是函数”。 + +2. lambda语法尽可能多,这正是为了使 lambda 易于编写和使用。 + +您在 **Strategize.java** 中看到了一个 lambda 表达式,但还有其他语法变体: + +```java +// functional/LambdaExpressions.java + +interface Description { + String brief(); +} + +interface Body { + String detailed(String head); +} + +interface Multi { + String twoArg(String head, Double d); +} + +public class LambdaExpressions { + + static Body bod = h -> h + " No Parens!"; // [1] + + static Body bod2 = (h) -> h + " More details"; // [2] + + static Description desc = () -> "Short info"; // [3] + + static Multi mult = (h, n) -> h + n; // [4] + + static Description moreLines = () -> { // [5] + System.out.println("moreLines()"); + return "from moreLines()"; + }; + + public static void main(String[] args) { + System.out.println(bod.detailed("Oh!")); + System.out.println(bod2.detailed("Hi!")); + System.out.println(desc.brief()); + System.out.println(mult.twoArg("Pi! ", 3.14159)); + System.out.println(moreLines.brief()); + } +} +/* Output: +Oh! No Parens! +Hi! More details +Short info +Pi! 3.14159 +moreLines() +from moreLines() +*/ +``` + +我们从三个接口开始,每个接口都有一个单独的方法(您很快就会理解它的重要性)。 但是,每个方法都有不同数量的参数,以便演示 lambda 表达式语法。 + +任何lambda表达式的基本语法是: + +1.参数。 + +2.接着是 **->**,您可以选择将其视为 “生成”。 + +3.**->** 之后的所有东西都是方法体。 + +**[1] **当只用一个参数,可以不需要括号。 然而,这是一个特例。 + +**[2]** 正常情况是在参数周围使用括号。 为了保持一致性,您还可以在单个参数周围使用括号,虽然这种情况并不常见。 + +**[3]** 如果没有参数,则必须使用括号表示空参数列表。 + +**[4]** 对于多个参数,将它们放在带括号的参数列表中。 + +到目前为止,所有 lambda 表达式方法体都是单行。 该表达式的结果自动成为 lambda 表达式的返回值,在此处使用 **return** 关键字是非法的。 这是 lambda 表达式缩写用于描述功能的语法的另一种方式。 + +**[5]** 如果在 lambda 表达式中确实需要多行,则必须将这些行放在花括号中。 在这种情况下,就需要使用 **return**。 + +Lambda 表达式通常比**匿名内部类**产生更易读的代码,因此我们将在本书中尽可能使用它们。 + +## 递归 + +递归函数是一个自我调用的函数。 可以编写递归的 lambda 表达式,但需要注意:递归方法必须是实例变量或静态变量,否则会出现编译时错误。 我们将为每个案例创建一个示例。 + +这两个示例都需要一个接受 **int** 并生成 **int** 的接口: + +```java +// functional/IntCall.java + +interface IntCall { + int call(int arg); +} +``` + +整数 n 的阶乘将所有小于或等于 n 的正整数相乘。 阶乘函数是一个常见的递归示例: + +```java +// functional/RecursiveFactorial.java + +public class RecursiveFactorial { + static IntCall fact; + public static void main(String[] args) { + fact = n -> n == 0 ? 1 : n * fact.call(n - 1); + for(int i = 0; i <= 10; i++) + System.out.println(fact.call(i)); + } +} +/* Output: +1 +1 +2 +6 +24 +120 +720 +5040 +40320 +362880 +3628800 +*/ +``` + +这里,**fact** 是一个静态变量。 注意使用三元 **if-else**。 递归函数将一直调用自己,直到 **i == 0**.所有递归函数都有某种 “停止条件”,否则它们将无限递归并产生异常。 + +我们可以将 **Fibonacci 序列** 实现为递归 lambda 表达式,这次使用实例变量: + +```java +// functional/RecursiveFibonacci.java + +public class RecursiveFibonacci { + IntCall fib; + RecursiveFibonacci() { + fib = n -> n == 0 ? 0 : + n == 1 ? 1 : + fib.call(n - 1) + fib.call(n - 2); + } + int fibonacci(int n) { return fib.call(n); } + public static void main(String[] args) { + RecursiveFibonacci rf = new RecursiveFibonacci(); + for(int i = 0; i <= 10; i++) + System.out.println(rf.fibonacci(i)); + } +} +/* Output: +0 +1 +1 +2 +3 +5 +8 +13 +21 +34 +55 +*/ +``` + +将Fibonacci 序列对中的最后两个元素求和来产生下一个元素。 + + + +## 方法引用 + +Java 8 方法引用指的是没有以前版本的Java所需的额外包袱的方法。 方法引用是类名或对象名,后跟:: [^4],然后是方法的名称。 + +```java +// functional/MethodReferences.java + +import java.util.*; + +interface Callable { // [1] + void call(String s); +} + +class Describe { + void show(String msg) { // [2] + System.out.println(msg); + } +} + +public class MethodReferences { + static void hello(String name) { // [3] + System.out.println("Hello, " + name); + } + static class Description { + String about; + Description(String desc) { about = desc; } + void help(String msg) { // [4] + System.out.println(about + " " + msg); + } + } + static class Helper { + static void assist(String msg) { // [5] + System.out.println(msg); + } + } + public static void main(String[] args) { + Describe d = new Describe(); + Callable c = d::show; // [6] + c.call("call()"); // [7] + + c = MethodReferences::hello; // [8] + c.call("Bob"); + + c = new Description("valuable")::help; // [9] + c.call("information"); + + c = Helper::assist; // [10] + c.call("Help!"); + } +} +/* Output: +call() +Hello, Bob +valuable information +Help! +*/ +``` + +**[1]** 我们从单一方法接口开始(同样,您很快就会了解到这一点的重要性)。 + +**[2]** **show()**的签名(参数类型和返回类型)符合 **Callable** 的 **call()**的签名。 + +**[3]** **hello()**也符合 **call()**的签名。 + +[4] ...就像是**help()**,一个静态内部类中的非静态方法。(原文:… as is help(), a non-static method within a static inner class.) + +**[5]** **assist()**是静态内部类中的静态方法。 + +**[6]** 我们将 **Describe** 对象的方法引用分配给 **Callable** , 它没有**show()**方法,而是 **call()**方法。 但是,Java似乎接受用这个看似奇怪的赋值,因为方法引用符合 **Callable** 的 **call()**方法的签名。 + +**[7]** 我们现在可以通过调用 **call()**来调用 **show()**,因为 Java 将 **call()**映射到 **show()**。 + +**[8]** 这是一个静态方法引用。 + +**[9] **这是 **[6]** 的另一个版本:附加到存活对象的方法的方法参考,有时称为*绑定方法引用*。 + +**[10]** 最后,获取静态内部类的静态方法的方法引用,用起来就像 **[8] **中的外部类。 + +这不是一个详尽的例子; 我们很快就会看到方法参考的所有变化。 + +## Runnable + +**Runnable** 接口自 1.0 版以来一直在 Java 中,因此不需要导入。 它也符合特殊的单方法接口格式:它的方法run()不带参数,也没有返回值。 因此,我们可以使用 lambda 表达式和方法引用作为 **Runnable**: + +```java +// functional/RunnableMethodReference.java + +// Method references with interface Runnable + +class Go { + static void go() { + System.out.println("Go::go()"); + } +} + +public class RunnableMethodReference { + public static void main(String[] args) { + + new Thread(new Runnable() { + public void run() { + System.out.println("Anonymous"); + } + }).start(); + + new Thread( + () -> System.out.println("lambda") + ).start(); + + new Thread(Go::go).start(); + } +} +/* Output: +Anonymous +lambda +Go::go() +*/ +``` + +**Thread** 对象将 **Runnable** 作为其构造函数参数,并具有会调用 **run()**的方法 **start()**。 请注意,只有**匿名内部类**才需要具有名为**run()**的方法。 + + + +## 未绑定的方法引用 + +未绑定的方法引用是指没有关联对象的普通(非静态)方法。 要使用未绑定的引用,您必须提供以下对象: + +```java +// functional/UnboundMethodReference.java + +// Method reference without an object + +class X { + String f() { return "X::f()"; } +} + +interface MakeString { + String make(); +} + +interface TransformX { + String transform(X x); +} + +public class UnboundMethodReference { + public static void main(String[] args) { + // MakeString ms = X::f; // [1] + TransformX sp = X::f; + X x = new X(); + System.out.println(sp.transform(x)); // [2] + System.out.println(x.f()); // Same effect + } +} +/* Output: +X::f() +X::f() +*/ +``` + +到目前为止,我们已经看到了对与其关联接口具有相同签名的方法的引用。 在 **[1]**,我们尝试对X中的 **f()**做同样的事情,试图分配给 **MakeString**。 这会产生编译器关于“无效方法引用”的错误 (“invalid method reference),即使 **make()**与**f()**具有相同的签名。 问题是实际上还有另一个(隐藏的)参数:我们的老朋友 **this**。 你不能在没有 **X** 对象的情况下调用 **f()**来调用它。 因此,**X :: f** 表示未绑定的方法引用,因为它尚未“绑定”到对象。 + +要解决这个问题,我们需要一个 **X** 对象,所以我们的接口实际上需要一个额外的参数,就像你在 **TransformX** 中看到的那样。 如果将 **X :: f** 分配给 **TransformX**,Java 很高兴。 我们现在必须进行第二次心理调整 - 使用未绑定的引用时,函数方法的签名(接口中的单个方法)不再与方法引用的签名完全匹配。 有一个很好的理由说服你,那就是你需要一个对象来调用方法。 + +**[2]** 的结果有点像脑筋急转弯。 我接受未绑定的引用并对其调用 **transform()**,将其传递给X,并以某种方式导致对 **x.f()**的调用。 Java知道它必须采用第一个参数,实际上是这个,并在其上调用方法。 + +```java +// functional/MultiUnbound.java + +// Unbound methods with multiple arguments + +class This { + void two(int i, double d) {} + void three(int i, double d, String s) {} + void four(int i, double d, String s, char c) {} +} + +interface TwoArgs { + void call2(This athis, int i, double d); +} + +interface ThreeArgs { + void call3(This athis, int i, double d, String s); +} + +interface FourArgs { + void call4( + This athis, int i, double d, String s, char c); +} + +public class MultiUnbound { + public static void main(String[] args) { + TwoArgs twoargs = This::two; + ThreeArgs threeargs = This::three; + FourArgs fourargs = This::four; + This athis = new This(); + twoargs.call2(athis, 11, 3.14); + threeargs.call3(athis, 11, 3.14, "Three"); + fourargs.call4(athis, 11, 3.14, "Four", 'Z'); + } +} +``` + +为了说明这一点,我将类命名为 **This** ,函数方法的第一个参数则是 **athis**,但是您应该选择其他名称以防止生产代码混淆。 + +## 构造函数引用 + +您还可以捕获构造函数的引用,然后通过引用调用该构造函数。 + +```java +// functional/CtorReference.java + +class Dog { + String name; + int age = -1; // For "unknown" + Dog() { name = "stray"; } + Dog(String nm) { name = nm; } + Dog(String nm, int yrs) { name = nm; age = yrs; } +} + +interface MakeNoArgs { + Dog make(); +} + +interface Make1Arg { + Dog make(String nm); +} + +interface Make2Args { + Dog make(String nm, int age); +} + +public class CtorReference { + public static void main(String[] args) { + MakeNoArgs mna = Dog::new; // [1] + Make1Arg m1a = Dog::new; // [2] + Make2Args m2a = Dog::new; // [3] + + Dog dn = mna.make(); + Dog d1 = m1a.make("Comet"); + Dog d2 = m2a.make("Ralph", 4); + } +} +``` + +**Dog** 有三个构造函数,函数接口内的 **make()**方法反映了构造函数参数列表( make()方法可以有不同的名称)。 + +注意我们如何对 **[1]**,**[2]** 和 **[3]** 中的每一个使用 **Dog :: new**。 所有三个构造函数只有一个名称:**:: new**。 但是构造函数引用在每种情况下都分配给不同的接口,并且编译器可以知道从哪个构造函数引用中进行检测。 + +编译器可以看到调用函数方法( 在本例中为make())意味着调用构造函数。 + +## 函数式接口 + +方法引用和lambda表达式都是必须赋值的,并且这些赋值需要编译器的类型信息以确保类型正确性。 Lambda表达式特别引入了新的要求。 考虑: + +```java +x -> x.toString() +``` + +我们看到返回类型必须是String,但x是什么类型? + +因为 lambda 表达式包含一种类型推断形式(编译器会对类型进行描述,而不是要求程序员显式),编译器必须能够以某种方式推导出 x 的类型。 + +这是第二个例子: + +```java +(x, y) -> x + y +``` + +现在 **x** 和 **y** 可以是支持 **+** 运算符的任何类型,包括两个不同的数字类型或一个 **String** 以及一些将自动转换为**String** 的类型(这包括大多数类型)。 但是,当分配此 lambda 表达式时,编译器必须确定 **x** 和 **y** 的确切类型以生成正确的代码。 + +同样的问题适用于方法引用。 假设你要传递 System.out :: println 到你正在编写的方法 ,你为方法的参数给出了什么类型? + +为了解决这个问题,Java 8 引入了 **java.util.function**,它包含一组接口,这些接口是 lambda 表达式和方法引用的目标类型。 每个接口只包含一个抽象方法,称为函数式方法。 + +在编写接口时,可以使用 **@FunctionalInterface** 注释强制执行此“函数方法”模式: + +```java +// functional/FunctionalAnnotation.java + +@FunctionalInterface +interface Functional { + String goodbye(String arg); +} + +interface FunctionalNoAnn { + String goodbye(String arg); +} + +/* +@FunctionalInterface +interface NotFunctional { + String goodbye(String arg); + String hello(String arg); +} +Produces error message: +NotFunctional is not a functional interface +multiple non-overriding abstract methods +found in interface NotFunctional +*/ + +public class FunctionalAnnotation { + public String goodbye(String arg) { + return "Goodbye, " + arg; + } + public static void main(String[] args) { + FunctionalAnnotation fa = + new FunctionalAnnotation(); + Functional f = fa::goodbye; + FunctionalNoAnn fna = fa::goodbye; + // Functional fac = fa; // Incompatible + Functional fl = a -> "Goodbye, " + a; + FunctionalNoAnn fnal = a -> "Goodbye, " + a; + } +} +``` + +**@FunctionalInterface **注释是可选的; Java 将 **Functional** 和 **FunctionalNoAnn** 视为 **main()**中的函数接口。 **@FunctionalInterface** 的值在 **NotFunctional** 的定义中可见。接口中的如果有多个方法则会产生编译时错误消息。 + +仔细观察 **f** 和 **fna** 定义中会发生什么。 **Functional** 和 **FunctionalNoAnn** 定义接口。 然而,分配的只是方法 **goodbye**()。首先,这只是一种方法而不是一种类。 其次,它甚至不是一个实现了该接口的类里的方法。这是添加到 Java 8 中的一些魔力:如果将方法引用或 lambda 表达式分配给函数接口(以及类型适合),Java将使您的分配适应目标接口。 在背后,编译器将方法引用或 lambda 表达式包装在实现目标接口的类的实例中。 + +尽管 **FunctionalAnnotation** 确实适合 **Functional** 模型,但如果我们尝试将 **FunctionalAnnotation** 直接分配给 **Functional**,就像 **fac** 的定义一样,Java 将不会让我们成功,因为它没有明确地实现 **Functional** 接口。 但令人惊讶的是 ,Java8 允许我们为接口分配函数,从而产生更好,更简单的语法。 + +**java.util.function** 的目标是创建一组完整的目标接口,这样您通常不需要定义自己的接口。 主要是因为原始类型,这会产生一小部分接口。 如果您了解命名模式,通常可以通过查看名称来检测特定接口的作用。 + + 以下是基本命名准则: + +1. 如果它只处理对象而不是原语,那么它只是一个简单的名称,如 **Function**,**Consumer**,**Predicate** 等。参数类型通过泛型添加。 + +2. 如果它采用原始参数,则由名称的第一部分表示,如 **LongConsumer**,**DoubleFunction**,**IntPredicate** 等。例外情况是原始的供应商类型。 + +3. 如果它返回原始结果,则用 **To** 表示,如 **ToLongFunction ** 和 **IntToLongFunction**。 + +4. 如果它返回与其参数相同的类型,则它是一个运算符,其中一个参数使用 **UnaryOperator**,两个参数使用 **BinaryOperator**。 + +5. 如果它需要两个参数并返回一个布尔值,那么它就是一个谓词( Predicate )。 + +6. 如果它需要两个不同类型的参数,则名称中有一个 **Bi**。 + +该表描述了java.util.function中的目标类型 + +……..下面的表格内容,直接复制PDF文档下来很难看懂。( 待整理 ) + +(with noted exceptions): + +**Name Characteristic Functional Usage Method Runnable** No arguments; + + (java.lang) **Runnable** Returns nothing **run() Supplier Supplier BooleanSupplier** No arguments; + +**get() IntSupplier** Returns any type getAstype() LongSupplier DoubleSupplier Callable No arguments; (java.util.concurrent) Callable Returns any type call() Consumer One argument; + +Consumer IntConsumer Returns nothing accept() LongConsumer DoubleConsumer + +Two-argument BiConsumer BiConsumer Consumer accept() Two-argument Consumer; ObjIntConsumer First arg is a ObjtypeConsumer ObjLongConsumer reference; accept() Second arg is a ObjDoubleConsumer primitive Function IntFunction LongFunction DoubleFunction ToIntFunction Function One argument; ToLongFunction apply() Returns a different ToDoubleFunction type Totype & typeTotype: IntToLongFunction applyAstype() IntToDoubleFunction LongToIntFunction LongToDoubleFunction DoubleToIntFunction DoubleToLongFunction UnaryOperator One argument; UnaryOperator IntUnaryOperator Returns the same type apply() LongUnaryOperator DoubleUnaryOperator BinaryOperator Two arguments, same type; BinaryOperator IntBinaryOperator Returns the same apply() LongBinaryOperator type DoubleBinaryOperator Two arguments, Comparator same type; (java.util) Comparator Returns int compare() Predicate BiPredicate Two arguments; Predicate IntPredicate Returns boolean test() LongPredicate DoublePredicate IntToLongFunction IntToDoubleFunction Primitive argument; typeTotypeFunction LongToIntFunction Returns a primitive applyAstype() LongToDoubleFunction DoubleToIntFunction DoubleToLongFunction BiFunction BiConsumer Two arguments; Bioperation BiPredicate Different types (method name varies) ToIntBiFunction ToLongBiFunction ToDoubleBiFunction + + + +您可能会想到用于进一步添加更多行,但此表提供了基本概念,并且应该帮到或多或少地推断出您需要的函数接口。 + +您可以看到在创建 **java.util.function** 时做出了一些选择。 例如,为什么没有 **IntComparator**,**LongComparator** 和 **DoubleComparator** ? 有一个 **BooleanSupplier**,但没有其他接口表示 **Boolean**。 有一个通用的 **BiConsumer**,但没有用于所有 **int**,**long** 和 **double** 的 **BiConsumers** 变体( 我可以支持他们为什么放弃那个)。 这是疏忽还是有人决定(他们是如何得出这个结论的)? + +您还可以看到原始类型为 Java 添加了多少复杂性。 由于效率问题,它们被包含在该语言的第一版中 - 这很快就得到了缓解。 现在,在语言的生命周期中,我们仍然受到语言设计选择不佳的影响。 + +下面枚举基于lambda表达式的所有不同 Function 变体的示例: + +```java +// functional/FunctionVariants.java + +import java.util.function.*; + +class Foo {} + +class Bar { + Foo f; + Bar(Foo f) { this.f = f; } +} + +class IBaz { + int i; + IBaz(int i) { + this.i = i; + } +} + +class LBaz { + long l; + LBaz(long l) { + this.l = l; + } +} + +class DBaz { + double d; + DBaz(double d) { + this.d = d; + } +} + +public class FunctionVariants { + static Function f1 = f -> new Bar(f); + static IntFunction f2 = i -> new IBaz(i); + static LongFunction f3 = l -> new LBaz(l); + static DoubleFunction f4 = d -> new DBaz(d); + static ToIntFunction f5 = ib -> ib.i; + static ToLongFunction f6 = lb -> lb.l; + static ToDoubleFunction f7 = db -> db.d; + static IntToLongFunction f8 = i -> i; + static IntToDoubleFunction f9 = i -> i; + static LongToIntFunction f10 = l -> (int)l; + static LongToDoubleFunction f11 = l -> l; + static DoubleToIntFunction f12 = d -> (int)d; + static DoubleToLongFunction f13 = d -> (long)d; + + public static void main(String[] args) { + Bar b = f1.apply(new Foo()); + IBaz ib = f2.apply(11); + LBaz lb = f3.apply(11); + DBaz db = f4.apply(11); + int i = f5.applyAsInt(ib); + long l = f6.applyAsLong(lb); + double d = f7.applyAsDouble(db); + l = f8.applyAsLong(12); + d = f9.applyAsDouble(12); + i = f10.applyAsInt(12); + d = f11.applyAsDouble(12); + i = f12.applyAsInt(13.0); + l = f13.applyAsLong(13.0); + } +} +``` + +这些 **lambda** 表达式尝试生成适合对应函数签名的最简代码。 在某些情况下,强制转换是必要的,否则编译器会抱怨截断错误。 + +**main()**中的每个测试都显示了 **Function** 接口中不同类型的 **apply** 方法。 每个都产生一个对其相关的**lambda** 表达式的调用。 + +方法引用有自己的魔力: + +```java +/ functional/MethodConversion.java + +import java.util.function.*; + +class In1 {} +class In2 {} + +public class MethodConversion { + static void accept(In1 i1, In2 i2) { + System.out.println("accept()"); + } + static void someOtherName(In1 i1, In2 i2) { + System.out.println("someOtherName()"); + } + public static void main(String[] args) { + BiConsumer bic; + + bic = MethodConversion::accept; + bic.accept(new In1(), new In2()); + + bic = MethodConversion::someOtherName; + // bic.someOtherName(new In1(), new In2()); // Nope + bic.accept(new In1(), new In2()); + } +} +/* Output: +accept() +someOtherName() +*/ +``` + +查看 **BiConsumer** 的文档。 你会看到它的函数方法是 **accept()**。 实际上,如果我们将方法命名为**accept()**,它就可以作为方法引用。 但是我们可以给它一个完全不同的名称,比如**someOtherName()**,它也可以运行,只要参数类型和返回类型与 **BiConsumer** 的 **accept()**相同。 + +因此,在使用函数接口时,名称无关紧要 - 只有参数类型和返回类型相同。 Java 将您的名称映射到接口的函数方法。 要调用方法,可以调用函数方法名称(在本例中为 **accept()**),而不是你的方法名称。 + +现在我们将查看应用于方法引用的所有基于类的 Functionals(即那些不涉及原始类型的函数)。 我再次创建了适合函数签名的最简单方法: + +```java +// functional/ClassFunctionals.java + +import java.util.*; +import java.util.function.*; + +class AA {} +class BB {} +class CC {} + +public class ClassFunctionals { + static AA f1() { return new AA(); } + static int f2(AA aa1, AA aa2) { return 1; } + static void f3(AA aa) {} + static void f4(AA aa, BB bb) {} + static CC f5(AA aa) { return new CC(); } + static CC f6(AA aa, BB bb) { return new CC(); } + static boolean f7(AA aa) { return true; } + static boolean f8(AA aa, BB bb) { return true; } + static AA f9(AA aa) { return new AA(); } + static AA f10(AA aa1, AA aa2) { return new AA(); } + public static void main(String[] args) { + Supplier s = ClassFunctionals::f1; + s.get(); + Comparator c = ClassFunctionals::f2; + c.compare(new AA(), new AA()); + Consumer cons = ClassFunctionals::f3; + cons.accept(new AA()); + BiConsumer bicons = ClassFunctionals::f4; + bicons.accept(new AA(), new BB()); + Function f = ClassFunctionals::f5; + CC cc = f.apply(new AA()); + BiFunction bif = ClassFunctionals::f6; + cc = bif.apply(new AA(), new BB()); + Predicate p = ClassFunctionals::f7; + boolean result = p.test(new AA()); + BiPredicate bip = ClassFunctionals::f8; + result = bip.test(new AA(), new BB()); + UnaryOperator uo = ClassFunctionals::f9; + AA aa = uo.apply(new AA()); + BinaryOperator bo = ClassFunctionals::f10; + aa = bo.apply(new AA(), new AA()); + } +} +``` + +请注意,每个方法名称都是任意的( **f1(),f2()**等),但正如您刚才看到的,一旦将方法引用分配给函数接口,您就可以调用与该接口关联的函数方法。 在此示例中,这些是 **get(),compare(),accept(),apply()**和 **test()**。 + + + +## 有着更多参数的函数接口 + +**java.util.functional** 中的接口是有限的。 比如有了 **BiFunction**,但它不能变化。 如果需要三参数函数的接口怎么办? 其实这些接口非常简单,很容易查看 Java 库源代码并自行创建: + +```java +// functional/TriFunction.java + +@FunctionalInterface +public interface TriFunction { + R apply(T t, U u, V v); +} +``` + +一个简短的测试将验证它是否有效: + +```java +// functional/TriFunctionTest.java + +public class TriFunctionTest { + static int f(int i, long l, double d) { return 99; } + public static void main(String[] args) { + TriFunction tf = + TriFunctionTest::f; + tf = (i, l, d) -> 12; + } +} +``` + +这里我们测试方法引用和 lambda 表达式。 + +## 缺少原始类型的函数 + +让我们重温一下 **BiConsumer**,看看我们如何创建缺少 **int,long** 和 **double **的各种排列: + +```java +// functional/BiConsumerPermutations.java + +import java.util.function.*; + +public class BiConsumerPermutations { + static BiConsumer bicid = (i, d) -> + System.out.format("%d, %f%n", i, d); + static BiConsumer bicdi = (d, i) -> + System.out.format("%d, %f%n", i, d); + static BiConsumer bicil = (i, l) -> + System.out.format("%d, %d%n", i, l); + public static void main(String[] args) { + bicid.accept(47, 11.34); + bicdi.accept(22.45, 92); + bicil.accept(1, 11L); + } +} +/* Output: +47, 11.340000 +92, 22.450000 +1, 11 +*/ +``` + +为了显示,我使用 **System.out.format()**,它类似于 **System.out.println()**,除了它提供了更多的显示选项。 这里,**%f** 表示我将 **n** 作为浮点值给出,**%d** 表示 **n** 是一个整数值。 我能够包含空格,并且它不会添加换行符,除非你输入%n - 它也会接受传统 **\ n** 换行符,但 **%n** 是自动跨平台的,这是使用的 **format()** 的另一个原因。 + +该示例仅使用适当的包装器类型,装箱和拆箱负责在原始类型之间来回转换。 我们也可以使用包装类型,例如 Function,而不是预定义的原始类型: + +```java +// functional/FunctionWithWrapped.java + +import java.util.function.*; + +public class FunctionWithWrapped { + public static void main(String[] args) { + Function fid = i -> (double)i; + IntToDoubleFunction fid2 = i -> i; + } +} +``` + +如果没有强制转换,则会收到错误消息:“ Integer 无法转换为 Double ”,而 **IntToDoubleFunction** 版本没有此类问题。 Java库代码里 **IntToDoubleFunction** 是这样子的: + +```java +@FunctionalInterface +public interface IntToDoubleFunction { + double applyAsDouble(int value); +} +``` + +因为我们可以简单地编写 **Function ** 并产生工作结果,所以很明显,函数的原始类型的唯一原因是为了防止传递参数和返回结果所涉及的自动装箱和自动装箱。 也就是说,为了性能。 + +似乎可以安全地推测,某些函数类型具有定义而其他类型没有定义是因为考虑到了使用频率。 + +当然,如果由于缺少原始类型的函数而导致性能实际上成为问题,您可以轻松编写自己的接口( 使用Java库源进行参考 ) - 尽管这似乎不太可能是您的性能瓶颈。 + + + +## 高阶函数 + +这个名字听起来有点令人生畏,但是:高阶函数只是一个消耗或产生函数的函数。 + +我们先来看看产生一个函数: + +```java +// functional/ProduceFunction.java + +import java.util.function.*; + +interface +FuncSS extends Function {} // [1] + +public class ProduceFunction { + static FuncSS produce() { + return s -> s.toLowerCase(); // [2] + } + public static void main(String[] args) { + FuncSS f = produce(); + System.out.println(f.apply("YELLING")); + } +} +/* Output: +yelling +*/ +``` + +这里,**produce()**是高阶函数。 + +**[1]** 使用继承,您可以轻松地为你的专用接口创建别名。 + +**[2]** 使用 **lambda** 表达式,在方法中创建和返回一个函数几乎毫不费力。 + +要 **consume** 函数(consume a function),其对应的 **consuming** 方法 (the consuming method)的参数列表必须正确描述函数类型: + +```java +// functional/ConsumeFunction.java + +import java.util.function.*; + +class One {} +class Two {} + +public class ConsumeFunction { + static Two consume(Function onetwo) { + return onetwo.apply(new One()); + } + public static void main(String[] args) { + Two two = consume(one -> new Two()); + } +} +``` + +当您根据 **consume** 的函数生成新函数时,事情变得特别有趣,比如: + +```java +// functional/TransformFunction.java + +import java.util.function.*; + +class I { + @Override + public String toString() { return "I"; } +} + +class O { + @Override + public String toString() { return "O"; } +} + +public class TransformFunction { + static Function transform(Function in) { + return in.andThen(o -> { + System.out.println(o); + return o; + }); + } + public static void main(String[] args) { + Function f2 = transform(i -> { + System.out.println(i); + return new O(); + }); + O o = f2.apply(new I()); + } +} +/* Output: +I +O +*/ +``` + +在这里,**transform()**生成一个与传入的函数具有相同签名的函数,但是您可以生成任何您想要的类型。这在 **Function** 接口中使用名为 **andThen()**的默认方法,该方法专门用于操作函数。 顾名思义,在调用in函数之后调用 **toThen()**(还有 **compose()**,它在 **in** 函数之前应用新函数)。 要附加一个**andThen()**函数,我们只需将该函数作为参数传递。 **transform()**产生的是一个新函数,它将 **in** 的动作与 **andThen()**参数的动作结合起来。 + +## 闭包 + +在上一节的 **ProduceFunction.java** 中,我们从方法返回了一个 lambda 函数。 这个例子让事情变得简单,但是我们必须在返回 lambdas 时探讨一些问题。 + +*闭包*一词概括了这些问题。 闭包非常重要,因为它们可以轻松生成函数。 + +考虑一个更复杂的 lambda,它使用函数作用域之外的变量。 返回该函数会发生什么? 也就是说,当您调用函数时,它对那些 “外部 ”变量引用了什么? 如果语言不能自动解决这个问题,那将变得非常具有挑战性。 能够解决这个问题的语言被称为**支持闭包**,或者在词法上限定范围( 也使用术语变量捕获 )。Java 8提供了有限但合理的闭包支持, + +我们将用一些简单的例子来研究它。 + +首先,这里有一个方法返回一个访问对象字段和方法参数的函数: + +```java +// functional/Closure1.java + +import java.util.function.*; + +public class Closure1 { + int i; + IntSupplier makeFun(int x) { + return () -> x + i++; + } +} +``` + +但是,仔细考虑一下,**i** 的这种用法并不是一个很大的挑战,因为对象很可能在您调用 **makeFun()** 之后就存在了——实际上,垃圾收集器几乎肯定会保留一个对象,并将现有的函数以这种方式绑定到该对象上。当然,如果你对同一个对象多次调用 **makeFun()** ,你最终会得到多个函数,它们都为 **i** 共享相同的存储空间: + +```java +// functional/SharedStorage.java + +import java.util.function.*; + +public class SharedStorage { + public static void main(String[] args) { + Closure1 c1 = new Closure1(); + IntSupplier f1 = c1.makeFun(0); + IntSupplier f2 = c1.makeFun(0); + IntSupplier f3 = c1.makeFun(0); + System.out.println(f1.getAsInt()); + System.out.println(f2.getAsInt()); + System.out.println(f3.getAsInt()); + } +} +/* Output: +0 +1 +2 +*/ +``` + +每次调用 **getAsInt()**都会增加 **i **,表明存储是共享的。 + +如果 **i** 是 **makeFun()**的本地怎么办? 在正常情况下,当 **makeFun()**完成时 **i** 就消失。 但它仍然编译: + +```java +// functional/Closure2.java + +import java.util.function.*; + +public class Closure2 { + IntSupplier makeFun(int x) { + int i = 0; + return () -> x + i; + } +} +``` + +由 **makeFun()**返回的 **IntSupplier** “关闭” **i** 和 **x**,因此当您调用返回的函数时两者仍然有效。 但请注意,我没有像 **Closure1.java** 那样增加i。 尝试递增它会产生编译时错误: + +```java +// functional/Closure3.java + +// {WillNotCompile} +import java.util.function.*; + +public class Closure3 { + IntSupplier makeFun(int x) { + int i = 0; + // Neither x++ nor i++ will work: + return () -> x++ + i++; + } +} +``` + +**x** 和 **i** 的操作都犯了同样的错误: + +显然,从 lambda 表达式引用的局部变量必须是 **final** 或者 实际的 **final** (effectively final),如果我们声明 **x**和 **i** 是 **final** ,它将起作用,因为那时我们不能增加任何一个: + +```java +// functional/Closure4.java + +import java.util.function.*; + +public class Closure4 { + IntSupplier makeFun(final int x) { + final int i = 0; + return () -> x + i; + } +} +``` + +但是为什么 **Closure2.java** 在 **x** 和 **i **不是 **final** 却可以运行? + +这就是 “实际” **final **(effectively final)的含义出现的地方。 这个术语是为 Java 8 创建的,表示你没有明确地声明变量是 **final** 的,但你仍然是这样对待它 - 你没有改变它。 如果局部变量的初始值永远不会改变,那么它实际上是最终的。 + +如果 **x** 和 **i** 在方法中的其他位置更改(但不在返回函数内部),则编译器仍将其视为错误。 每个增量产生一个单独的错误消息: + +```java +/ functional/Closure5.java + +// {WillNotCompile} +import java.util.function.*; + +public class Closure5 { + IntSupplier makeFun(int x) { + int i = 0; + i++; + x++; + return () -> x + i; + } +} +``` + +要成为 “effectively final” ,意味着您可以将 final 关键字应用于变量声明而不更改任何其余代码。 它实际上是 **final**的,你只是没有明说。 + +我们实际上可以通过在闭包中使用它们之前将 **x** 和 **i** 分配给 **final** 变量来解决 **Closure5.java** 中的问题: + +```java + +// functional/Closure6.java + +import java.util.function.*; + +public class Closure6 { + IntSupplier makeFun(int x) { + int i = 0; + i++; + x++; + final int iFinal = i; + final int xFinal = x; + return () -> xFinal + iFinal; + } +} +``` + +由于我们在分配后永远不会更改 **iFinal** 和 **xFinal** ,因此在这里使用 **final** 是多余的。 + +如果您使用引用怎么办? 我们可以从 **int** 更改为 **Integer**: + +```java +// functional/Closure7.java + +// {WillNotCompile} +import java.util.function.*; + +public class Closure7 { + IntSupplier makeFun(int x) { + Integer i = 0; + i = i + 1; + return () -> x + i; + } +} +``` + +编译器仍然足够聪明,可以看到 **i** 正在被更改。 包装器类型可能正在进行特殊处理,所以让我们尝试一下List: + +```java +// functional/Closure8.java + +import java.util.*; +import java.util.function.*; + +public class Closure8 { + Supplier> makeFun() { + final List ai = new ArrayList<>(); + ai.add(1); + return () -> ai; + } + public static void main(String[] args) { + Closure8 c7 = new Closure8(); + List + l1 = c7.makeFun().get(), + l2 = c7.makeFun().get(); + System.out.println(l1); + System.out.println(l2); + l1.add(42); + l2.add(96); + System.out.println(l1); + System.out.println(l2); + } +} +/* Output: +[1] +[1] +[1, 42] +[1, 96] +*/ +``` + +这次它可以运行:我们修改 **List** 的内容而没产生编译时错误。 当您查看此示例的输出时,它看起来确实非常安全,因为每次调用 **makeFun()**时,都会创建并返回一个全新的 **ArrayList** - 这意味着它不会被共享,因此每个生成的闭包都有自己独立的 **ArrayList** 他们不能互相干扰。 + +并且请注意我已经声明 **ai** 是 **final** 的,尽管在这个例子中你可以去掉 **final** 并得到相同的结果(试试吧!)。 应用于对象引用的 **final** 关键字仅表示不会重新分配引用。 它并没有说你无法修改对象本身。 + +看看 **Closure7.java** 和 **Closure8.java** 之间的区别,我们看到 **Closure7.java** 实际上有一个 **i** 的重新分配。 也许这是 “effectively final” 错误消息的触发点: + +```java +// functional/Closure9.java + +// {WillNotCompile} +import java.util.*; +import java.util.function.*; + +public class Closure9 { + Supplier> makeFun() { + List ai = new ArrayList<>(); + ai = new ArrayList<>(); // Reassignment + return () -> ai; + } +} +``` + +引用的重新分配确实会触发错误消息。 如果只修改指向的对象,Java 会接受它。 只要没有其他人获得对该对象的引用(这意味着您有多个可以修改对象的实体,此时事情会变得非常混乱),这可能是安全的。[^6] + +然而,如果我们现在回顾一下 **Closure1.java.** ,那就有一个难题:**i** 被修改却没有编译器投诉。 它既不是 **final** 的,也不是“effectively final"的。因为 **i** 是外围类的成员,所以这样做肯定是安全的( 除非你正在创建共享可变内存的多个函数)。实际上,您可以争辩说在这种情况下不会发生变量捕获(variable capture)。 可以肯定的是,**Closure3.java** 的错误消息专门针对局部变量。 因此,规则并不像说“在lambda之外定义的任何变量必须是 **final** 的或 **effectively final** 那么简单。相反,你必须考虑捕获的变量是否实际 **final**。 如果它是对象中的字段,那么它有一个独立的生存期,并且不需要任何特殊的捕获,以便稍后在调用 **lambda** 时存在。 + + + +## 作为闭包的内部类 + +我们可以复制我们的例子使用匿名内部类: + +```java +// functional/AnonymousClosure.java + +import java.util.function.*; + +public class AnonymousClosure { + IntSupplier makeFun(int x) { + int i = 0; + // Same rules apply: + // i++; // Not "effectively final" + // x++; // Ditto + return new IntSupplier() { + public int getAsInt() { return x + i; } + }; + } +} +``` + +事实证明,只要有内部类,就会有闭包(Java 8只 会使闭包变得更容易)。 在 Java 8 之前,要求是 **x** 和 **i** 被明确声明为 **final**。 使用 Java 8,内部类的规则已经放宽,包括 “effectively final”。 + + + +## 函数组合 + +函数组合基本上意味着“将函数粘贴在一起以创建新函数”,它通常被认为是函数编程的一部分。您在**TransformFunction.java** 中看到了一个使用 **andThen()** 的函数组合示例。一些 **java.util** 的函数接口包含支持函数组合的方法。 + +Compositional Supporting Method Interfaces Function BiFunction Consumer BiConsumer IntConsumer andThen(argument) Performs the original LongConsumer operation followed by DoubleConsumer the argument operation. + +UnaryOperator IntUnaryOperator LongUnaryOperator DoubleUnaryOperator BinaryOperator Function compose(argument) UnaryOperator Performs the argument IntUnaryOperator operation followed by the original operation. LongUnaryOperator DoubleUnaryOperator Predicate and(argument) BiPredicate Short-circuiting logical IntPredicate AND of the original predicate and the LongPredicate argument predicate. DoublePredicate Predicate or(argument) BiPredicate Short-circuiting logical OR of the original IntPredicate predicate and the LongPredicate argument predicate. DoublePredicate Predicate negate() BiPredicate A predicate that is the IntPredicate logical negation of this predicate. LongPredicate DoublePredicate + +( 待整理 ) + +此示例使用 **Function** 里的 **compose()**和 **andThen()** + +```java +// functional/FunctionComposition.java + +import java.util.function.*; + +public class FunctionComposition { + static Function + f1 = s -> { + System.out.println(s); + return s.replace('A', '_'); + }, + f2 = s -> s.substring(3), + f3 = s -> s.toLowerCase(), + f4 = f1.compose(f2).andThen(f3); + public static void main(String[] args) { + System.out.println( + f4.apply("GO AFTER ALL AMBULANCES")); + } +} +/* Output: +AFTER ALL AMBULANCES +_fter _ll _mbul_nces +*/ +``` + +这里要看的重要一点是我们正在创建一个新函数 **f4**,然后可以使用 **apply()**(几乎)像任何其他函数一样调用它。[^8] + +当 **f1** 获得String时,它已经被**f2** 剥离了前三个字符。 这是因为对 **compose(f2)**的调用意味着在 **f1** 之前调用 **f2**。 + +这是Predicate逻辑运算的演示: + +```java +// functional/PredicateComposition.java + +import java.util.function.*; +import java.util.stream.*; + +public class PredicateComposition { + static Predicate + p1 = s -> s.contains("bar"), + p2 = s -> s.length() < 5, + p3 = s -> s.contains("foo"), + p4 = p1.negate().and(p2).or(p3); + public static void main(String[] args) { + Stream.of("bar", "foobar", "foobaz", "fongopuckey") + .filter(p4) + .forEach(System.out::println); + } +} +/* Output: +foobar +foobaz +*/ +``` + +**p4** 获取所有谓词并将它们组合成一个更复杂的谓词,其中包含:“如果 **String** 不包含 'bar' 且长度小于5,或者它包含 'foo' ,则结果为 **true**。”因为它产生如此清晰的语法,我在**main()**中作了一些小伎俩,并借用了下一章的内容。 首先,我创建一个 **String** 对象的 “流”(序列),然后将每个对象提供给 **filter()**操作。 **filter()**使用我们的 **p4** 谓词来决定要保留流中的哪个对象以及要丢弃的对象。 最后,我使用 **forEach()**将 **println** 方法引用应用于每个幸存的对象。 + +你可以从输出中看到 **p4** 是如何工作的:任何带有 “foo ”的东西都会存活,即使它的长度大于5。 “fongopuckey” 太长了,没有 “bar” 来保存它。 + +## Currying和Partial Evaluation + +*Currying* 以 Haskell Curry 命名,Haskell Curry 是其发明者之一,可能是唯一一个以他的名字命名的重要事物的计算机领域的人物(另一个是 Haskell 编程语言)。 Currying 意味着从一个函数开始,该函数接受多个参数,并将其转换为一系列函数,每个函数只接受一个参数。 + +```java +// functional/CurryingAndPartials.java + +import java.util.function.*; + +public class CurryingAndPartials { + // Uncurried: + static String uncurried(String a, String b) { + return a + b; + } + public static void main(String[] args) { + // Curried function: + Function> sum = + a -> b -> a + b; // [1] + + System.out.println(uncurried("Hi ", "Ho")); + + Function + hi = sum.apply("Hi "); // [2] + System.out.println(hi.apply("Ho")); + + // Partial application: + Function sumHi = + sum.apply("Hup "); + System.out.println(sumHi.apply("Ho")); + System.out.println(sumHi.apply("Hey")); + } +} +/* Output: +Hi Ho +Hi Ho +Hup Ho +Hup Hey +*/ +``` + +**[1]** 这是一条巧妙的线:一连串的箭头。注意,在函数接口声明中,函数的第二个参数是另一个函数。 + +**[2]** currying 的目标是能够通过提供一个参数来创建一个新函数,所以现在有了一个 “带参函数” 和剩下的 “无参函数” 。实际上,你从一个双参数函数开始,最后得到一个单参数函数。 + +您可以通过添加另一个级别来 curry 一个三参数函数: + +```java +// functional/Curry3Args.java + +import java.util.function.*; + +public class Curry3Args { + public static void main(String[] args) { + Function>> sum = + a -> b -> c -> a + b + c; + Function> hi = + sum.apply("Hi "); + Function ho = + hi.apply("Ho "); + System.out.println(ho.apply("Hup")); + } +} +/* Output: +Hi Ho Hup +*/ +``` + +对于每个级别的箭头级联(arrow-cascading),您可以围绕类型声明包装另一个函数。 + +处理原始类型和装箱时,请使用适当的功能接口: + +```java +// functional/CurriedIntAdd.java + +import java.util.function.*; + +public class CurriedIntAdd { + public static void main(String[] args) { + IntFunction + curriedIntAdd = a -> b -> a + b; + IntUnaryOperator add4 = curriedIntAdd.apply(4); + System.out.println(add4.applyAsInt(5)); + } +} +/* Output: +9 +*/ +``` + +您可以在因特网上找到更多 currying 示例。 通常这些是 Java 以外的语言,但如果你理解它们的基本概念,它们应该很容易翻译。 + + + +## 纯函数式编程 + +在没有函数支持的情况下,即使用像C这样的原始语言,也可以按照一定的原则编写纯函数程序。Java使它比这更容易,但是您必须小心地使一切都成为 **final**,并确保您的所有方法和函数没有副作用。因为 Java 本质上不是一种不可变的语言,所以如果您犯了错误,编译器不会提供任何帮助。 + +有第三方工具可以帮助您[^9],但是使用 **Scala** 或 **Clojure** 这样的语言可能更容易,因为它们从一开始就是为保持不变性而设计的。这些语言使您可以用 Java 编写项目的一部分,如果您必须用纯函数式编写,则可以用**Scala** 编写其他部分 (这需要一些规则) 或 **Clojure** (这需要的少得多)。虽然您将在并发编程一章中看到 Java确实支持并发,但是如果这是您项目的核心部分,您可能会考虑至少在项目的一部分中使用 **Scala** 或 **Clojure**之类的语言。 + +## 总结 + +Lambda 表达式和方法引用并没有将 Java 转换成函数式语言,而是提供了对函数式编程的支持。它们对 Java 是一个巨大的改进,因为它们允许您编写更简洁、更干净、更容易理解的代码。在下一章中,您将看到它们如何启用流。如果你像我一样,你会喜欢流媒体。 + +这些特性可能会满足大部分 Java 程序员的需求,他们已经对 Clojure 和 Scala 等新的、功能更强的语言感到不安和嫉妒,并阻止 Java 程序员流向这些语言 (或者,如果他们仍然决定迁移,至少会为他们做好更好的准备)。 + +但是,Lambdas 和方法引用远非完美,我们永远要为 Java 设计人员在早期令人兴奋的语言中做出的草率决定付出代价。特别是,没有泛型 lambda,所以 lambda 实际上不是 Java 中的第一类公民。这并不意味着 Java 8不是一个很大的改进,但它确实意味着,就像许多 Java 特性一样,您最终会感到沮丧。 + +当您遇到学习困难时,请记住,您可以从 ide (如 NetBeans、IntelliJ Idea 和 Eclipse )获得帮助,这些 ide 将建议您何时可以使用 lambda 表达式或方法引用 (并且经常为您重写代码!) + + + +1. 粘贴功能结合在一起是一个非常不同的方法,但它仍然使一种图书馆。 +2. 例如,这个电子书是利用 Pandoc 制作出来的,纯函数式语言编写的一个程序 Haskell。 +3. 有时函数语言将其描述为“代码即数据”。“ +4. 这个语法来自 C++。 +5. 我还没有验证过这种说法。 +6. 在并发编程一章中,当您理解更改共享变量 “不是线程安全的” 时,这将更有意义。 +7. 接口能够支持方法的原因是它们是 Java 8 默认方法,您将在下一章中了解到。 +8. 一些语言,例如 Python,允许像调用其他函数一样调用组合函数。但这是 Java,所以我们取我们能得到的。 +9. 见,例如,不可变和可变性检测器。( Immutables and Mutability Detector) \ No newline at end of file From 090dd15654a08be2c23e34aa9c65e88ee183b5ae Mon Sep 17 00:00:00 2001 From: Langdon <575998772@qq.com> Date: Wed, 20 Mar 2019 19:52:56 +0800 Subject: [PATCH 025/814] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8D=81=E4=B8=89?= =?UTF-8?q?=E7=AB=A0=E7=9A=84=E6=A0=87=E9=A2=98=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/13-Functional Programming.md | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/book/13-Functional Programming.md b/book/13-Functional Programming.md index 301cf0cd..0d44f230 100644 --- a/book/13-Functional Programming.md +++ b/book/13-Functional Programming.md @@ -1,5 +1,9 @@ # 第十三章-函数式编程 +[TOC] + + + 函数式编程语言操纵代码片段就像操作数据一样容易。 虽然 Java 不是函数式语言,但 Java 8 Lambda 表达式和方法引用 (Method References) 允许您以函数式编程。在计算机时代的早期,内存是稀缺和珍贵的。几乎每个人都用汇编语言编程。 人们对编译器有所了解,但仅仅想到编译生成的代码肯定会比手工编码多了很多字节。 通常,只是为了使程序适合有限的内存,程序员通过修改内存中的代码来保存代码空间,以便在程序执行时执行不同的操作。这种技术被称为自修改代码 (self-modifying code,),只要程序足够小,少数人可以维护所有棘手和神秘的汇编代码,你就可以让它运行起来。 @@ -188,7 +192,7 @@ from moreLines() Lambda 表达式通常比**匿名内部类**产生更易读的代码,因此我们将在本书中尽可能使用它们。 -## 递归 +### 递归 递归函数是一个自我调用的函数。 可以编写递归的 lambda 表达式,但需要注意:递归方法必须是实例变量或静态变量,否则会出现编译时错误。 我们将为每个案例创建一个示例。 @@ -272,7 +276,7 @@ public class RecursiveFibonacci { ## 方法引用 -Java 8 方法引用指的是没有以前版本的Java所需的额外包袱的方法。 方法引用是类名或对象名,后跟:: [^4],然后是方法的名称。 +Java 8 方法引用指的是没有以前版本的 Java 所需的额外包袱的方法。 方法引用是类名或对象名,后面跟 :: [^4],然后是方法的名称。 ```java // functional/MethodReferences.java @@ -350,7 +354,7 @@ Help! 这不是一个详尽的例子; 我们很快就会看到方法参考的所有变化。 -## Runnable +### Runnable **Runnable** 接口自 1.0 版以来一直在 Java 中,因此不需要导入。 它也符合特殊的单方法接口格式:它的方法run()不带参数,也没有返回值。 因此,我们可以使用 lambda 表达式和方法引用作为 **Runnable**: @@ -392,7 +396,7 @@ Go::go() -## 未绑定的方法引用 +### 未绑定的方法引用 未绑定的方法引用是指没有关联对象的普通(非静态)方法。 要使用未绑定的引用,您必须提供以下对象: @@ -473,7 +477,7 @@ public class MultiUnbound { 为了说明这一点,我将类命名为 **This** ,函数方法的第一个参数则是 **athis**,但是您应该选择其他名称以防止生产代码混淆。 -## 构造函数引用 +### 构造函数引用 您还可以捕获构造函数的引用,然后通过引用调用该构造函数。 @@ -793,7 +797,7 @@ public class ClassFunctionals { -## 有着更多参数的函数接口 +### 有着更多参数的函数接口 **java.util.functional** 中的接口是有限的。 比如有了 **BiFunction**,但它不能变化。 如果需要三参数函数的接口怎么办? 其实这些接口非常简单,很容易查看 Java 库源代码并自行创建: @@ -823,7 +827,7 @@ public class TriFunctionTest { 这里我们测试方法引用和 lambda 表达式。 -## 缺少原始类型的函数 +### 缺少原始类型的函数 让我们重温一下 **BiConsumer**,看看我们如何创建缺少 **int,long** 和 **double **的各种排列: @@ -1207,7 +1211,7 @@ public class Closure9 { -## 作为闭包的内部类 +### 作为闭包的内部类 我们可以复制我们的例子使用匿名内部类: @@ -1304,7 +1308,9 @@ foobaz 你可以从输出中看到 **p4** 是如何工作的:任何带有 “foo ”的东西都会存活,即使它的长度大于5。 “fongopuckey” 太长了,没有 “bar” 来保存它。 -## Currying和Partial Evaluation + + +## Currying 和 Partial Evaluation *Currying* 以 Haskell Curry 命名,Haskell Curry 是其发明者之一,可能是唯一一个以他的名字命名的重要事物的计算机领域的人物(另一个是 Haskell 编程语言)。 Currying 意味着从一个函数开始,该函数接受多个参数,并将其转换为一系列函数,每个函数只接受一个参数。 From 7a6ca7efd1754cf2a7e5b5715d8fdd0f9863db39 Mon Sep 17 00:00:00 2001 From: Joe <736777445@qq.com> Date: Thu, 21 Mar 2019 15:00:05 +0800 Subject: [PATCH 026/814] Update README.md fix wrong link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c676703b..2fa7410f 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ ## 友情链接 -[Effective.Java.3rd.Edition 中文版](https://sjsdfg.github.io/effctive-java-3rd-chinese/#/) +[Effective.Java.3rd.Edition 中文版](https://sjsdfg.github.io/effective-java-3rd-chinese/#/) From f8d052f69593527bee386bf7fe56f827077b844a Mon Sep 17 00:00:00 2001 From: Langdon <575998772@qq.com> Date: Thu, 21 Mar 2019 17:11:11 +0800 Subject: [PATCH 027/814] =?UTF-8?q?=E8=A7=84=E8=8C=83=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=91=BD=E5=90=8D-=E8=A7=A3=E5=86=B3=E5=88=86=E6=94=AF?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/{05-Control Flow.md => 05-Control-Flow.md} | 16 +++++++++++----- ...ogramming.md => 13-Functional-Programming.md} | 0 2 files changed, 11 insertions(+), 5 deletions(-) rename book/{05-Control Flow.md => 05-Control-Flow.md} (99%) rename book/{13-Functional Programming.md => 13-Functional-Programming.md} (100%) diff --git a/book/05-Control Flow.md b/book/05-Control-Flow.md similarity index 99% rename from book/05-Control Flow.md rename to book/05-Control-Flow.md index c6953d85..6aac1b1d 100644 --- a/book/05-Control Flow.md +++ b/book/05-Control-Flow.md @@ -6,7 +6,7 @@ Java 使用 C 的所有执行控制语句,因此如果您使用 C 或 C++ 进 [TOC] -## true and flase +## true和flase 条件表达式的示例是 **a == b**。这里有一个条件表达式示例,它使用条件操作符**“==”**来查看 **a**的值是否等于 **b** 的值。 表达式返回 **true** 或 **false**。 如果显示条件表达式的结果,则会生成表示布尔值的字符串 **“true”** 和 **“false”**。 @@ -357,7 +357,7 @@ public class TestWithReturn { 如果在返回 **void** 的方法中没有 **return** 语句,则在该方法结束时会有一个隐式的 **return**,因此一个方法中并不总是需要包含 **return** 语句。 但是,如果您的方法声明它将返回除 **void** 之外的任何返回类型,则必须确保每个代码路径都返回一个值。 -## break and continue +## break和continue 在任何迭代语句的主体部分,都可以使用 **break** 和 **continue** 来控制循环的流程。 其中,**break** 退出循环而不执行循环中的其余语句。 而 **continue** 停止执行当前的迭代,然后退回循环起始处,以开始下一次迭代。 @@ -671,7 +671,9 @@ int c = rand.nextInt(26) + 'a'; **Random.nextInt()**将产生0~25之间的一个随机 **int** 值,它将被加到 **"a"** 上。这表示 **"a"** 将自动被转换为 **int** 以执行假发。为了把 **c** 当作字符打印,必须将其转型为 **char**;否则,将产生整数输出。 -##Switching on Strings + + +## switch字符串 Java 7增加了在字符串上 **switch** 的用法。 此示例展示了您从一组String可能性中选择的旧方法,以及使用switch的新方法: @@ -768,7 +770,7 @@ java RandomBounds upper -## Summary +## 本章小结 本章总结了我们对大多数编程语言中出现的基本特征的探索:计算,运算符优先级,类型转换,选择和迭代。 现在,您已准备好开始采取措施,使您更接近面向对象和函数式编程的世界。 下一章将介绍初始化和清理对象的重要问题,接下来的章节将介绍隐藏实现细节(implementation hiding)的这一核心概念。 @@ -776,4 +778,8 @@ java RandomBounds upper 1. 在早期的语言中,大量的决策都是基于使编译器编写者的生活更轻松。 你会发现,在现代语言中,大多数设计决策都会让语言用户的生活更轻松,尽管有时会有妥协 - 这通常会让语言设计师感到后悔。 -2. 请注意,这似乎是一个难以支持的主张,并且很可能是称为相关因果关系谬误的认知偏差的一个例子。 \ No newline at end of file +2. 请注意,这似乎是一个难以支持的主张,并且很可能是称为相关因果关系谬误的认知偏差的一个例子。 + + + +
\ No newline at end of file diff --git a/book/13-Functional Programming.md b/book/13-Functional-Programming.md similarity index 100% rename from book/13-Functional Programming.md rename to book/13-Functional-Programming.md From bef42e65b6128581e077ebb114a12b2786373b68 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 21 Mar 2019 17:36:37 +0800 Subject: [PATCH 028/814] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AC=AC=E4=BA=94?= =?UTF-8?q?=E7=AB=A0=E7=9B=AE=E5=BD=95=E6=98=BE=E7=A4=BA=E5=87=BA=E9=94=99?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 0bd5def3..18c433cb 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -53,15 +53,15 @@ * [本章小结](book/03-Objects-Everywhere.md#本章小结) * [第四章 运算符](book/04-Operators.md) * [第五章 控制流](book/05-Control-Flow.md) - * [本章小结](book/05-Control-Flow.md#true和flase) - * [本章小结](book/05-Control-Flow.md#if-else) - * [本章小结](book/05-Control-Flow.md#迭代语句) - * [本章小结](book/05-Control-Flow.md#for-in语法) - * [本章小结](book/05-Control-Flow.md#return) - * [本章小结](book/05-Control-Flow.md#break和continue) - * [本章小结](book/05-Control-Flow.md#臭名昭著的goto) - * [本章小结](book/05-Control-Flow.md#switch) - * [本章小结](book/05-Control-Flow.md#switch字符串) + * [true和flase](book/05-Control-Flow.md#true和flase) + * [if-else](book/05-Control-Flow.md#if-else) + * [迭代语句](book/05-Control-Flow.md#迭代语句) + * [for-in语法](book/05-Control-Flow.md#for-in语法) + * [return](book/05-Control-Flow.md#return) + * [continue](book/05-Control-Flow.md#break和continue) + * [臭名昭著的goto](book/05-Control-Flow.md#臭名昭著的goto) + * [switch](book/05-Control-Flow.md#switch) + * [switch字符串](book/05-Control-Flow.md#switch字符串) * [本章小结](book/05-Control-Flow.md#本章小结) * [词汇表](GLOSSARY.md) From 603065ff91e5d412aeda180d36aadc0bf04f4e9b Mon Sep 17 00:00:00 2001 From: LingCoder Date: Fri, 22 Mar 2019 06:31:55 +0800 Subject: [PATCH 029/814] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 19 +- book/04-Operators.md | 1631 +----------------------------------------- 2 files changed, 51 insertions(+), 1599 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 18c433cb..7a89d11a 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,5 +1,6 @@ # Summary +* [Introduction](README.md) * [译者的话](Introduction.md) * [封面](book/00-On-Java-8.md) * [前言](book/00-Preface.md) @@ -52,6 +53,22 @@ * [编码风格](book/03-Objects-Everywhere.md#编码风格) * [本章小结](book/03-Objects-Everywhere.md#本章小结) * [第四章 运算符](book/04-Operators.md) + * [待初始化](book/04-Operators.md#Using-Java-Operators) + * [待初始化](book/04-Operators.md#Precedence) + * [待初始化](book/04-Operators.md#Assignment) + * [待初始化](book/04-Operators.md#Mathematical-Operators) + * [待初始化](book/04-Operators.md#Auto-Increment-and-Decrement) + * [待初始化](book/04-Operators.md#Relational-Operators) + * [待初始化](book/04-Operators.md#Logical-Operators) + * [待初始化](book/04-Operators.md#Literals) + * [待初始化](book/04-Operators.md#Bitwise-Operators) + * [待初始化](book/04-Operators.md#Ternary-if-else-Operator) + * [待初始化](book/04-Operators.md#String-Operator-+-and-+=) + * [待初始化](book/04-Operators.md#Common-Pitfalls-When-Using-Operators) + * [待初始化](book/04-Operators.md#Casting-Operators) + * [待初始化](book/04-Operators.md#Java-Has-No-sizeof) + * [待初始化](book/04-Operators.md#A-Compendium-of-Operators) + * [待初始化](book/04-Operators.md#Summary) * [第五章 控制流](book/05-Control-Flow.md) * [true和flase](book/05-Control-Flow.md#true和flase) * [if-else](book/05-Control-Flow.md#if-else) @@ -61,7 +78,7 @@ * [continue](book/05-Control-Flow.md#break和continue) * [臭名昭著的goto](book/05-Control-Flow.md#臭名昭著的goto) * [switch](book/05-Control-Flow.md#switch) - * [switch字符串](book/05-Control-Flow.md#switch字符串) + * [switch 字符串](book/05-Control-Flow.md#Switching-on-Strings) * [本章小结](book/05-Control-Flow.md#本章小结) * [词汇表](GLOSSARY.md) diff --git a/book/04-Operators.md b/book/04-Operators.md index 5b403b2b..5462fe11 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -1,1600 +1,35 @@ # 第四章 运算符 -Operators manipulate data. -Because Java was inherited from C++, most of its operators are -familiar to C and C++ programmers. Java also adds some -improvements and simplifications. -If you know C or C++ syntax, you can skim through this chapter and -the next, looking for places where Java is different from those -languages. However, if you find yourself floundering a bit in these two -chapters, make sure you go through the free multimedia seminar -Thinking in C, downloadable from www.OnJava8.com. It contains audio -lectures, slides, exercises, and solutions specifically designed to -bring you up to speed with the fundamentals necessary to learn Java. -Using Java Operators -An operator takes one or more arguments and produces a new value. -The arguments are in a different form than ordinary method calls, but -the effect is the same. Addition and unary plus (+), subtraction and -unary minus (-), multiplication (*), division (/), and assignment (=) all work -much the same in any programming language. -All operators produce a value from their operands. In addition, some -operators change the value of an operand. This is called a side effect. -The most common use for operators that modify their operands is to -generate the side effect, but keep in mind that the value produced is -available for your use, just as in operators without side effects. -Almost all operators work only with primitives. The exceptions are =, -== and !=, which work with all objects (and are a point of confusion -for objects). In addition, the String class supports + and +=. -Precedence -Operator precedence defines expression evaluation when several -operators are present. Java has specific rules that determine the order -of evaluation. The easiest one to remember is that multiplication and -division happen before addition and subtraction. Programmers often -forget the other precedence rules, and use parentheses to make the -order of evaluation explicit. For example, look at statements [1] and -[2]: -// operators/Precedence.java -public class Precedence { -public static void main(String[] args) { -int x = 1, y = 2, z = 3; -int a = x + y - 2/2 + z; // [1] -int b = x + (y - 2)/(2 + z); // [2] -System.out.println("a = " + a); -System.out.println("b = " + b); -} -} -/* Output: -a = 5 -b = 1 -*/ -These statements look roughly the same, but from the output you see -they have very different meanings depending on the use of -parentheses. -Notice that System.out.println() uses the + operator. In this -context, + means “String concatenation” and, if necessary, -“String conversion.” When the compiler sees a String followed by -a + followed by a non-String, it attempts to convert the non- -String into a String. The output shows it successfully converts -from int into String for a and b. -Assignment -The operator = performs assignment. It means “Take the value of the -right-hand side (often called the rvalue) and copy it into the left-hand -side (often called the lvalue).” An rvalue is any constant, variable, or -expression that produces a value, but an lvalue must be a distinct, -named variable. (That is, there must be a physical space to store the -value.) For instance, you can assign a constant value to a variable: -a = 4; -but you cannot assign anything to a constant value—it cannot be an -lvalue. (You can’t say 4 = a; .) -Assigning primitives is straightforward. Since the primitive holds the -actual value and not a reference to an object, when you assign -primitives, you copy the contents from one place to another. For -example, if you say a = b for primitives, the contents of b are copied -into a. If you then go on to modify a, b is naturally unaffected by this -modification. As a programmer, this is what you can expect for most -situations. -When you assign objects, however, things change. Whenever you -manipulate an object, what you’re manipulating is the reference, so -when you assign “from one object to another,” you’re actually copying -a reference from one place to another. This means if you say c = d -for objects, you end up with both c and d pointing to the object where, -originally, only d pointed. Here’s an example that demonstrates this -behavior: -// operators/Assignment.java -// Assignment with objects is a bit tricky -class Tank { -int level; -} -public class Assignment { -public static void main(String[] args) { -Tank t1 = new Tank(); -Tank t2 = new Tank(); -t1.level = 9; -t2.level = 47; -System.out.println("1: t1.level: " + t1.level + -", t2.level: " + t2.level); -t1 = t2; -System.out.println("2: t1.level: " + t1.level + -", t2.level: " + t2.level); -t1.level = 27; -System.out.println("3: t1.level: " + t1.level + -", t2.level: " + t2.level); -} -} -/* Output: -1: t1.level: 9, t2.level: 47 -2: t1.level: 47, t2.level: 47 -3: t1.level: 27, t2.level: 27 -*/ -The Tank class is simple, and two instances (t1 and t2) are created -within main(). The level field within each Tank is given a -different value, then t2 is assigned to t1, and t1 is changed. In many -programming languages you expect t1 and t2 to be independent at -all times, but because you’ve assigned a reference, changing the t1 -object appears to change the t2 object as well! This is because both t1 -and t2 contain references that point to the same object. (The original -reference that was in t1, that pointed to the object holding a value of -9, was overwritten during the assignment and effectively lost; its -object is cleaned up by the garbage collector.) -This phenomenon is often called aliasing, and it’s a fundamental way -that Java works with objects. But what if you don’t want aliasing to -occur here? You can forego the assignment and say: -t1.level = t2.level; -This retains the two separate objects instead of discarding one and -tying t1 and t2 to the same object. Manipulating the fields within -objects goes against Java design principles. This is a nontrivial topic, -so keep in mind that assignment for objects can add surprises. -Aliasing During Method Calls -Aliasing will also occur when you pass an object into a method: -// operators/PassObject.java -// Passing objects to methods might not be -// what you're used to -class Letter { -char c; -} -public class PassObject { -static void f(Letter y) { -y.c = 'z'; -} -public static void main(String[] args) { -Letter x = new Letter(); -x.c = 'a'; -System.out.println("1: x.c: " + x.c); -f(x); -System.out.println("2: x.c: " + x.c); -} -} -/* Output: -1: x.c: a -2: x.c: z -*/ -In many programming languages, the method f() appears to make a -copy of its argument Letter y inside the scope of the method. But -once again a reference is passed, so the line -y.c = 'z'; -is actually changing the object outside of f(). -Aliasing and its solution is a complex issue covered in the Appendix: -Passing and Returning Objects. You’re aware of it now so you can -watch for pitfalls. -Mathematical -Operators -The basic mathematical operators are the same as the ones available in -most programming languages: addition (+), subtraction (-), division -(/), multiplication (*) and modulus (%, which produces the remainder -from division). Integer division truncates, rather than rounds, the -result. -Java also uses the shorthand notation from C/C++ that performs an -operation and an assignment at the same time. This is denoted by an -operator followed by an equal sign, and is consistent with all the -operators in the language (whenever it makes sense). For example, to -add 4 to the variable x and assign the result to x, use: x += 4. -This example shows the mathematical operators: -// operators/MathOps.java -// The mathematical operators -import java.util.*; -public class MathOps { -public static void main(String[] args) { -// Create a seeded random number generator: -Random rand = new Random(47); -int i, j, k; -// Choose value from 1 to 100: -j = rand.nextInt(100) + 1; -System.out.println("j : " + j); -k = rand.nextInt(100) + 1; -System.out.println("k : " + k); -i = j + k; -System.out.println("j + k : " + i); -i = j - k; -System.out.println("j - k : " + i); -i = k / j; -System.out.println("k / j : " + i); -i = k * j; -System.out.println("k * j : " + i); -i = k % j; -System.out.println("k % j : " + i); -j %= k; -System.out.println("j %= k : " + j); -// Floating-point number tests: -float u, v, w; // Applies to doubles, too -v = rand.nextFloat(); -System.out.println("v : " + v); -w = rand.nextFloat(); -System.out.println("w : " + w); -u = v + w; -System.out.println("v + w : " + u); -u = v - w; -System.out.println("v - w : " + u); -u = v * w; -System.out.println("v * w : " + u); -u = v / w; -System.out.println("v / w : " + u); -// The following also works for char, -// byte, short, int, long, and double: -u += v; -System.out.println("u += v : " + u); -u -= v; -System.out.println("u -= v : " + u); -u *= v; -System.out.println("u *= v : " + u); -u /= v; -System.out.println("u /= v : " + u); -} -} -/* Output: -j : 59 -k : 56 -j + k : 115 -j - k : 3 -k / j : 0 -k * j : 3304 -k % j : 56 -j %= k : 3 -v : 0.5309454 -w : 0.0534122 -v + w : 0.5843576 -v - w : 0.47753322 -v * w : 0.028358962 -v / w : 9.940527 -u += v : 10.471473 -u -= v : 9.940527 -u *= v : 5.2778773 -u /= v : 9.940527 -*/ -To generate numbers, the program first creates a Random object. If -you create a Random object with no arguments, Java uses the current -time as a seed for the random number generator, and will thus -produce different output for each execution of the program. However, -in the examples in this book, it is important that the output at the end -of each example be as consistent as possible so it can be verified with -external tools. By providing a seed (an initialization value for the -random number generator that always produces the same sequence -for a particular seed value) when creating the Random object, the -same random numbers are generated each time the program is -executed, so the output is verifiable.1 To generate more varying output, feel -free to remove the seed in the examples in the book. -The program generates a number of different types of random -numbers with the Random object by calling the methods nextInt() -and nextFloat() (you can also call nextLong() or -nextDouble()). The argument to nextInt() sets the upper -bound on the generated number. The lower bound is zero, which we -don’t want because of the possibility of a divide-by-zero, so the result -is offset by one. -Unary Minus and Plus -Operators -The unary minus (-) and unary plus (+) are the same operators as -binary minus and plus. The compiler figures out which use is intended -by the way you write the expression. For instance, the statement -x = -a; -has an obvious meaning. The compiler is able to figure out: -x = a * -b; -but the reader might get confused, so it is sometimes clearer to say: -x = a * (-b); -Unary minus inverts the sign on the data. Unary plus provides -symmetry with unary minus, but its only effect is to promote smaller- -type operands to int. -Auto Increment and -Decrement -Java, like C, has a number of shortcuts. Shortcuts can make code much -easier to type, and either easier or harder to read. -Two of the nicer shortcuts are the increment and decrement operators -(often called the auto-increment and auto-decrement operators). The -decrement operator is -- and means “decrease by one unit.” The -increment operator is ++ and means “increase by one unit.” If a is an -int, for example, the expression ++a is equivalent to a = a + 1. -Increment and decrement operators not only modify the variable, but -also produce the value of the variable as a result. -There are two versions of each type of operator, often called prefix and -postfix. Pre-increment means the ++ operator appears before the -variable, and post-increment means the ++ operator appears after the -variable. Similarly, pre-decrement means the --operator appears -before the variable, and post-decrement means the -- operator -appears after the variable. For pre-increment and pre-decrement (i.e., -++a or --a), the operation is performed and the value is produced. -For post-increment and post-decrement (i.e., a++ or a--), the value -is produced, then the operation is performed. -// operators/AutoInc.java -// Demonstrates the ++ and -- operators -public class AutoInc { -public static void main(String[] args) { -int i = 1; -System.out.println("i: " + i); -System.out.println("++i: " + ++i); // Pre-increment -System.out.println("i++: " + i++); // Post-increment -System.out.println("i: " + i); -System.out.println("--i: " + --i); // Pre-decrement -System.out.println("i--: " + i--); // Post-decrement -System.out.println("i: " + i); -} -} -/* Output: -i: 1 -++i: 2 -i++: 2 -i: 3 ---i: 2 -i--: 2 -i: 1 -*/ -For the prefix form, you get the value after the operation is performed, -but with the postfix form, you get the value before the operation is -performed. These are the only operators, other than those involving -assignment, that have side effects—they change the operand rather -than just using its value. -The increment operator is one explanation for the name C++, -implying “one step beyond C.” In an early Java speech, Bill Joy (one of -the Java creators), said that “Java = C++--” (C plus plus minus -minus), suggesting that Java is C++ with the unnecessary hard parts -removed, and therefore a much simpler language. As you progress, -you’ll see that many parts are simpler, and yet in other ways Java isn’t -much easier than C++. -Relational Operators -Relational operators produce a boolean result indicating the -relationship between the values of the operands. A relational -expression produces true if the relationship is true, and false if the -relationship is untrue. The relational operators are less than (< ), -greater than (> ), less than or equal to (<=), greater than or equal to (>=), -equivalent (==) and not equivalent (!=). Equivalence and non-equivalence -work with all primitives, but the other comparisons won’t -work with type boolean. Because boolean values can only be -true or false, “greater than” or “less than” doesn’t make sense. -Testing Object Equivalence -The relational operators == and != also work with all objects, but -their meaning often confuses the first-time Java programmer. Here’s -an example: -// operators/Equivalence.java -public class Equivalence { -public static void main(String[] args) { -Integer n1 = 47; -Integer n2 = 47; -System.out.println(n1 == n2); -System.out.println(n1 != n2); -} -} -/* Output: -true -false -*/ -The statement System.out.println(n1 == n2) will print the -result of the boolean comparison within it. Surely the output should -be “true”, then “false,” since both Integer objects are the same. But -while the contents of the objects are the same, the references are not -the same. The operators == and != compare object references, so the -output is actually “false”, then “true.” Naturally, this surprises people -at first. -How do you compare the actual contents of an object for equivalence? -You must use the special method equals() that exists for all objects -(not primitives, which work fine with == and !=). Here’s how it’s -used: -// operators/EqualsMethod.java -public class EqualsMethod { -public static void main(String[] args) { -Integer n1 = 47; -Integer n2 = 47; -System.out.println(n1.equals(n2)); -} -} -/* Output: -true -*/ -The result is now what you expect. Ah, but it’s not as simple as that. -Create your own class: -// operators/EqualsMethod2.java -// Default equals() does not compare contents -class Value { -int i; -} -public class EqualsMethod2 { -public static void main(String[] args) { -Value v1 = new Value(); -Value v2 = new Value(); -v1.i = v2.i = 100; -System.out.println(v1.equals(v2)); -} -} -/* Output: -false -*/ -Now things are confusing again: The result is false. This is because -the default behavior of equals() is to compare references. So unless -you override equals() in your new class you won’t get the desired -behavior. Unfortunately, you won’t learn about overriding until the -Reuse chapter and about the proper way to define equals() until the -Appendix: Collection Topics, but being aware of the way -equals() behaves might save you some grief in the meantime. -Most of the Java library classes implement equals() to compare the -contents of objects instead of their references. -Logical Operators -Each of the logical operators AND (&& ), OR (||) and NOT (! ) produce a -boolean value of true or false based on the logical -relationship of its arguments. This example uses the relational and -logical operators: -// operators/Bool.java -// Relational and logical operators -import java.util.*; -public class Bool { -public static void main(String[] args) { -Random rand = new Random(47); -int i = rand.nextInt(100); -int j = rand.nextInt(100); -System.out.println("i = " + i); -System.out.println("j = " + j); -System.out.println("i > j is " + (i > j)); -System.out.println("i < j is " + (i < j)); -System.out.println("i >= j is " + (i >= j)); -System.out.println("i <= j is " + (i <= j)); -System.out.println("i == j is " + (i == j)); -System.out.println("i != j is " + (i != j)); -// Treating an int as a boolean is not legal Java: -//- System.out.println("i && j is " + (i && j)); -//- System.out.println("i || j is " + (i || j)); -//- System.out.println("!i is " + !i); -System.out.println("(i < 10) && (j < 10) is " -+ ((i < 10) && (j < 10)) ); -System.out.println("(i < 10) || (j < 10) is " -+ ((i < 10) || (j < 10)) ); -} -} -/* Output: -i = 58 -j = 55 -i > j is true -i < j is false -i >= j is true -i <= j is false -i == j is false -i != j is true -(i < 10) && (j < 10) is false -(i < 10) || (j < 10) is false -*/ -You can apply AND, OR, or NOT to boolean values only. You can’t -use a non-boolean as if it were a boolean in a logical expression as -you can in C and C++. The failed attempts at doing this are -commented out with a //-. The subsequent expressions, however, -produce boolean values using relational comparisons, then use -logical operations on the results. -Note that a boolean value is automatically converted to an -appropriate text form if it is used where a String is expected. -You can replace the definition for int in the preceding program with -any other primitive data type except boolean. Be aware, however, -that the comparison of floating point numbers is very strict. A number -that is the tiniest fraction different from another number is still “not -equal.” A number that is the tiniest bit above zero is still nonzero. -Short-Circuiting -Logical operators support a phenomenon called “short-circuiting.” this -means the expression is evaluated only until the truth or falsehood of -the entire expression can be unambiguously determined. As a result, -the latter parts of a logical expression might not be evaluated. Here’s a -demonstration: -// operators/ShortCircuit.java -// Short-circuiting behavior with logical operators -public class ShortCircuit { -static boolean test1(int val) { -System.out.println("test1(" + val + ")"); -System.out.println("result: " + (val < 1)); -return val < 1; -} -static boolean test2(int val) { -System.out.println("test2(" + val + ")"); -System.out.println("result: " + (val < 2)); -return val < 2; -} -static boolean test3(int val) { -System.out.println("test3(" + val + ")"); -System.out.println("result: " + (val < 3)); -return val < 3; -} -public static void main(String[] args) { -boolean b = test1(0) && test2(2) && test3(2); -System.out.println("expression is " + b); -} -} -/* Output: -test1(0) -result: true -test2(2) -result: false -expression is false -*/ -Each test performs a comparison against the argument and returns -true or false. It also prints information to show you it’s being -called. The tests are used in the expression: -test1(0) && test2(2) && test3(2) -You might naturally expect all three tests to execute, but the output -shows otherwise. The first test produces a true result, so the -expression evaluation continues. However, the second test produces a -false result. Since this means the whole expression must be false, -why continue evaluating the rest of the expression? It might be -expensive. The reason for short-circuiting, in fact, is that you can get a -potential performance increase if all the parts of a logical expression -do not need evaluation. -Literals -Ordinarily, when you insert a literal value into a program, the -compiler knows exactly what type to make it. When the type is -ambiguous, you must guide the compiler by adding some extra -information in the form of characters associated with the literal value. -The following code shows these characters: -// operators/Literals.java -public class Literals { -public static void main(String[] args) { -int i1 = 0x2f; // Hexadecimal (lowercase) -System.out.println( -"i1: " + Integer.toBinaryString(i1)); -int i2 = 0X2F; // Hexadecimal (uppercase) -System.out.println( -"i2: " + Integer.toBinaryString(i2)); -int i3 = 0177; // Octal (leading zero) -System.out.println( -"i3: " + Integer.toBinaryString(i3)); -char c = 0xffff; // max char hex value -System.out.println( -"c: " + Integer.toBinaryString(c)); -byte b = 0x7f; // max byte hex value 10101111; -System.out.println( -"b: " + Integer.toBinaryString(b)); -short s = 0x7fff; // max short hex value -System.out.println( -"s: " + Integer.toBinaryString(s)); -long n1 = 200L; // long suffix -long n2 = 200l; // long suffix (can be confusing) -long n3 = 200; -// Java 7 Binary Literals: -byte blb = (byte)0b00110101; -System.out.println( -"blb: " + Integer.toBinaryString(blb)); -short bls = (short)0B0010111110101111; -System.out.println( -"bls: " + Integer.toBinaryString(bls)); -int bli = 0b00101111101011111010111110101111; -System.out.println( -"bli: " + Integer.toBinaryString(bli)); -long bll = 0b00101111101011111010111110101111; -System.out.println( -"bll: " + Long.toBinaryString(bll)); -float f1 = 1; -float f2 = 1F; // float suffix -float f3 = 1f; // float suffix -double d1 = 1d; // double suffix -double d2 = 1D; // double suffix -// (Hex and Octal also work with long) -} -} -/* Output: -i1: 101111 -i2: 101111 -i3: 1111111 -c: 1111111111111111 -b: 1111111 -s: 111111111111111 -blb: 110101 -bls: 10111110101111 -bli: 101111101011111010111110101111 -bll: 101111101011111010111110101111 -*/ -A trailing character after a literal value establishes its type. Uppercase -or lowercase L means long (however, using a lowercase l is -confusing because it can look like the number one). Uppercase or -lowercase F means float. Uppercase or lowercase D means double. -Hexadecimal (base 16), which works with all the integral data types, is -denoted by a leading 0x or 0X followed by 0-9 or a-f either in uppercase or -lowercase. If you try to initialize a variable with a value -bigger than it can hold (regardless of the numerical form of the value), -the compiler will give you an error message. Notice in the preceding -code the maximum possible hexadecimal values for char, byte, and -short. If you exceed these, the compiler will automatically make the -value an int and declare you need a narrowing cast for the -assignment (casts are defined later in this chapter). You’ll know you’ve -stepped over the line. -Octal (base 8) is denoted by a leading zero in the number and digits -from 0-7. -Java 7 introduced binary literals, denoted by a leading 0b or 0B, -which can initialize all integral types. -When working with integral types, it’s useful to display the binary -form of the results. This is easily accomplished with the static -toBinaryString() methods from the Integer and Long -classes. Notice that when passing smaller types to -Integer.toBinaryString(), the type is automatically -converted to an int. -Underscores in Literals -There’s a thoughtful addition in Java 7: you can include underscores in -numeric literals in order to make the results clearer to read. This is -especially helpful for grouping digits in large values: -// operators/Underscores.java -public class Underscores { -public static void main(String[] args) { -double d = 341_435_936.445_667; -System.out.println(d); -int bin = 0b0010_1111_1010_1111_1010_1111_1010_1111; -System.out.println(Integer.toBinaryString(bin)); -System.out.printf("%x%n", bin); // [1] -long hex = 0x7f_e9_b7_aa; -System.out.printf("%x%n", hex); -} -} -/* Output: -3.41435936445667E8 -101111101011111010111110101111 -2fafafaf -7fe9b7aa -*/ -There are (reasonable) rules: -1. Single underscores only—you can’t double them up. -2. No underscores at the beginning or end of a number. -3. No underscores around suffixes like F, D or L. -4. No around binary or hex identifiers b and x. -[1] Notice the use of %n. If you’re familiar with C-style languages, -you’re probably used to seeing \n to represent a line ending. The -problem with that is it gives you a “Unix style” line ending. If you -are on Windows, you must specify \r\n instead. This difference -is a needless hassle; the programming language should take care -of it for you. That’s what Java has achieved with %n, which always -produces the appropriate line ending for the platform it’s running -on—but only when you’re using System.out.printf() or -System.out.format(). For System.out.println() -you must still use \n; if you use %n, println() will simply emit -%n and not a newline. -Exponential Notation -Exponents use a notation I’ve always found rather dismaying: -// operators/Exponents.java -// "e" means "10 to the power." -public class Exponents { -public static void main(String[] args) { -// Uppercase and lowercase 'e' are the same: -float expFloat = 1.39e-43f; -expFloat = 1.39E-43f; -System.out.println(expFloat); -double expDouble = 47e47d; // 'd' is optional -double expDouble2 = 47e47; // Automatically double -System.out.println(expDouble); -} -} -/* Output: -1.39E-43 -4.7E48 -*/ -In science and engineering, e refers to the base of natural logarithms, -approximately 2.718. (A more precise double value is available in -Java as Math.E.) This is used in exponentiation expressions such as -1.39 x e-43, which means 1.39 x 2.718-43. However, when the -FORTRAN programming language was invented, they decided that e -would mean “ten to the power,” an odd decision because FORTRAN -was designed for science and engineering, and one would think its -designers would be sensitive about introducing such an ambiguity. 2 At any -rate, this custom was followed in C, C++ and now Java. So if -you’re used to thinking in terms of e as the base of natural logarithms, -you must do a mental translation when you see an expression such as -1.39 e-43f in Java; it means 1.39 x 10-43. -Note you don’t need the trailing character when the compiler can -figure out the appropriate type. With -long n3 = 200; -there’s no ambiguity, so an L after the 200 is superfluous. However, -with -float f4 = 1e-43f; // 10 to the power -the compiler normally takes exponential numbers as doubles, so -without the trailing f, it will give you an error declaring you must use -a cast to convert double to float. -Bitwise Operators -The bitwise operators allow you to manipulate individual bits in an -integral primitive data type. Bitwise operators perform Boolean -algebra on the corresponding bits in the two arguments to produce the -result. -The bitwise operators come from C’s low-level orientation, where you -often manipulate hardware directly and must set the bits in hardware -registers. Java was originally designed to be embedded in TV set-top -boxes, so this low-level orientation still made sense. However, you -probably won’t use the bitwise operators much. -The bitwise AND operator (& ) produces a one in the output bit if both -input bits are one; otherwise, it produces a zero. The bitwise OR -operator (|) produces a one in the output bit if either input bit is a one -and produces a zero only if both input bits are zero. The bitwise -EXCLUSIVE OR, or XOR (^), produces a one in the output bit if one -or the other input bit is a one, but not both. The bitwise NOT (~, also -called the ones complement operator) is a unary operator; it takes only -one argument. (All other bitwise operators are binary operators.) -Bitwise NOT produces the opposite of the input bit—a one if the input -bit is zero, a zero if the input bit is one. -The bitwise operators and logical operators use the same characters, -so a mnemonic device helps you remember the meanings: Because bits -are “small,” there is only one character in the bitwise operators. -Bitwise operators can be combined with the = sign to unite the -operation and assignment: &=, |= and ^= are all legitimate. (Since ~ -is a unary operator, it cannot be combined with the = sign.) -The boolean type is treated as a one-bit value, so it is somewhat -different. You can perform a bitwise AND, OR, and XOR, but you can’t -perform a bitwise NOT (presumably to prevent confusion with the -logical NOT). For booleans, the bitwise operators have the same -effect as the logical operators except they do not short circuit. Also, -bitwise operations on booleans include an XOR logical operator that -is not included under the list of “logical” operators. You cannot use -booleans in shift expressions, which are described next. -Shift Operators -The shift operators also manipulate bits. They can be used solely with -primitive, integral types. The left-shift operator (<< ) produces the -operand to the left of the operator after it is shifted to the left by the -number of bits specified to the right of the operator (inserting zeroes -at the lower-order bits). The signed right-shift operator (>> ) produces -the operand to the left of the operator after it is shifted to the right by -the number of bits specified to the right of the operator. The signed -right shift >> uses sign extension: If the value is positive, zeroes are inserted -at the higher-order bits; if the value is negative, ones are -inserted at the higher-order bits. Java has also added the unsigned -right shift >>> , which uses zero extension: Regardless of the sign, zeroes are -inserted at the higher-order bits. This operator does not -exist in C or C++. -If you shift a char, byte, or short, it is promoted to int before the shift takes -place, and the result is an int. Only the five low-order bits -of the right-hand side are used. This prevents you from shifting more -than the number of bits in an int. If you’re operating on a long, -you’ll get a long result. Only the six low-order bits of the right-hand -side are used, so you can’t shift more than the number of bits in a -long. -Shifts can be combined with the equal sign (<<= or >>= or >>>=). -The lvalue is replaced by the lvalue shifted by the rvalue. There is a -problem, however, with the unsigned right shift combined with -assignment. If you use it with byte or short, you don’t get the -correct results. Instead, these are promoted to int and right shifted, -but then truncated as they are assigned back into their variables, so -you get -1 in those cases. Here’s a demonstration: -// operators/URShift.java -// Test of unsigned right shift -public class URShift { -public static void main(String[] args) { -int i = -1; -System.out.println(Integer.toBinaryString(i)); -i >>>= 10; -System.out.println(Integer.toBinaryString(i)); -long l = -1; -System.out.println(Long.toBinaryString(l)); -l >>>= 10; -System.out.println(Long.toBinaryString(l)); -short s = -1; -System.out.println(Integer.toBinaryString(s)); -s >>>= 10; -System.out.println(Integer.toBinaryString(s)); -byte b = -1; -System.out.println(Integer.toBinaryString(b)); -b >>>= 10; -System.out.println(Integer.toBinaryString(b)); -b = -1; -System.out.println(Integer.toBinaryString(b)); -System.out.println(Integer.toBinaryString(b>>>10)); -} -} -/* Output: -11111111111111111111111111111111 -1111111111111111111111 -1111111111111111111111111111111111111111111111111111111 -111111111 -111111111111111111111111111111111111111111111111111111 -11111111111111111111111111111111 -11111111111111111111111111111111 -11111111111111111111111111111111 -11111111111111111111111111111111 -11111111111111111111111111111111 -1111111111111111111111 -*/ -In the last shift, the resulting value is not assigned back into b, but is -printed directly, so the correct behavior occurs. -Here’s an example that exercises all the operators involving bits: -// operators/BitManipulation.java -// Using the bitwise operators -import java.util.*; -public class BitManipulation { -public static void main(String[] args) { -Random rand = new Random(47); -int i = rand.nextInt(); -int j = rand.nextInt(); -printBinaryInt("-1", -1); -printBinaryInt("+1", +1); -int maxpos = 2147483647; -printBinaryInt("maxpos", maxpos); -int maxneg = -2147483648; -printBinaryInt("maxneg", maxneg); -printBinaryInt("i", i); -printBinaryInt("~i", ~i); -printBinaryInt("-i", -i); -printBinaryInt("j", j); -printBinaryInt("i & j", i & j); -printBinaryInt("i | j", i | j); -printBinaryInt("i ^ j", i ^ j); -printBinaryInt("i << 5", i << 5); -printBinaryInt("i >> 5", i >> 5); -printBinaryInt("(~i) >> 5", (~i) >> 5); -printBinaryInt("i >>> 5", i >>> 5); -printBinaryInt("(~i) >>> 5", (~i) >>> 5); -long l = rand.nextLong(); -long m = rand.nextLong(); -printBinaryLong("-1L", -1L); -printBinaryLong("+1L", +1L); -long ll = 9223372036854775807L; -printBinaryLong("maxpos", ll); -long lln = -9223372036854775808L; -printBinaryLong("maxneg", lln); -printBinaryLong("l", l); -printBinaryLong("~l", ~l); -printBinaryLong("-l", -l); -printBinaryLong("m", m); -printBinaryLong("l & m", l & m); -printBinaryLong("l | m", l | m); -printBinaryLong("l ^ m", l ^ m); -printBinaryLong("l << 5", l << 5); -printBinaryLong("l >> 5", l >> 5); -printBinaryLong("(~l) >> 5", (~l) >> 5); -printBinaryLong("l >>> 5", l >>> 5); -printBinaryLong("(~l) >>> 5", (~l) >>> 5); -} -static void printBinaryInt(String s, int i) { -System.out.println( -s + ", int: " + i + ", binary:\n " + -Integer.toBinaryString(i)); -} -static void printBinaryLong(String s, long l) { -System.out.println( -s + ", long: " + l + ", binary:\n " + -Long.toBinaryString(l)); -} -} -/* Output: (First 32 Lines) --1, int: -1, binary: -11111111111111111111111111111111 -+1, int: 1, binary: -1 -maxpos, int: 2147483647, binary: -1111111111111111111111111111111 -maxneg, int: -2147483648, binary: -10000000000000000000000000000000 -i, int: -1172028779, binary: -10111010001001000100001010010101 -~i, int: 1172028778, binary: -1000101110110111011110101101010 --i, int: 1172028779, binary: -1000101110110111011110101101011 -j, int: 1717241110, binary: -1100110010110110000010100010110 -i & j, int: 570425364, binary: -100010000000000000000000010100 -i | j, int: -25213033, binary: -11111110011111110100011110010111 -i ^ j, int: -595638397, binary: -11011100011111110100011110000011 -i << 5, int: 1149784736, binary: -1000100100010000101001010100000 -i >> 5, int: -36625900, binary: -11111101110100010010001000010100 -(~i) >> 5, int: 36625899, binary: -10001011101101110111101011 -i >>> 5, int: 97591828, binary: -101110100010010001000010100 -(~i) >>> 5, int: 36625899, binary: -10001011101101110111101011 -... -*/ -The two methods at the end, printBinaryInt() and -printBinaryLong(), take an int or a long, respectively, and -display it in binary format along with a descriptive String. As well as -demonstrating the effect of all the bitwise operators for int and -long, this example also shows the minimum, maximum, +1, and -1 -values for int and long so you see what they look like. Note that the -high bit represents the sign: 0 means positive and 1 means negative. -The output for the int portion is displayed above. -The binary representation of the numbers is called signed twos -complement. -Ternary if-else -Operator -The ternary operator, also called the conditional operator, is unusual -because it has three operands. It is truly an operator because it -produces a value, unlike the ordinary if-else statement that you’ll -see in the next section of this chapter. The expression is of the form: -boolean-exp ? value0 : value1 -If boolean-exp evaluates to true, value0 is evaluated, and its result becomes -the value produced by the operator. If boolean-exp is false, -value1 is evaluated and its result becomes the value produced by the -operator. -You can also use an ordinary if-else statement (described later), -but the ternary operator is much terser. Although C (where this -operator originated) prides itself on being a terse language, and the -ternary operator might have been introduced partly for efficiency, be -somewhat wary of using it on an everyday basis—it’s easy to produce -unreadable code. -The ternary operator is different from if-else because it produces a -value. Here’s an example comparing the two: -// operators/TernaryIfElse.java -public class TernaryIfElse { -static int ternary(int i) { -return i < 10 ? i * 100 : i * 10; -} -static int standardIfElse(int i) { -if(i < 10) -return i * 100; -else -return i * 10; -} -public static void main(String[] args) { -System.out.println(ternary(9)); -System.out.println(ternary(10)); -System.out.println(standardIfElse(9)); -System.out.println(standardIfElse(10)); -} -} -/* Output: -900 -100 -900 -100 -*/ -The code in ternary() is more compact than what you’d write -without the ternary operator, in standardIfElse(). However, -standardIfElse() is easier to understand, and doesn’t require a -lot more typing. Ponder your reasons when choosing the ternary -operator—it’s primarily warranted when you’re setting a variable to -one of two values. -String Operator + and -+= -There’s one special usage of an operator in Java: The + and += -operators can concatenate Strings, as you’ve already seen. It seems -a natural use of these operators even though it doesn’t fit with the -traditional way they are used. -This capability seemed like a good idea in C++, so operator -overloading was added to C++ to allow the C++ programmer to add -meanings to almost any operator. Unfortunately, operator overloading -combined with some of the other restrictions in C++ turns out to be a -fairly complicated feature for programmers to design into their -classes. Although operator overloading would have been much simpler -to implement in Java than it was in C++ (as demonstrated by the C# -language, which does have straightforward operator overloading), this -feature was still considered too complex, so Java programmers cannot -implement their own overloaded operators like C++ and C# -programmers can. -If an expression begins with a String, all operands that follow must -be Strings (remember that the compiler automatically turns a -double-quoted sequence of characters into a String): -// operators/StringOperators.java -public class StringOperators { -public static void main(String[] args) { -int x = 0, y = 1, z = 2; -String s = "x, y, z "; -System.out.println(s + x + y + z); -// Converts x to a String: -System.out.println(x + " " + s); -s += "(summed) = "; // Concatenation operator -System.out.println(s + (x + y + z)); -// Shorthand for Integer.toString(): -System.out.println("" + x); -} -} -/* Output: -x, y, z 012 -0 x, y, z -x, y, z (summed) = 3 -0 -*/ -Note that the output from the first print statement is o12 instead of -just 3, which you’d get if it was summing the integers. This is because -the Java compiler converts x, y, and z into their String -representations and concatenates those Strings, instead of adding -them together first. The second print statement converts the leading -variable into a String, so the String conversion does not depend -on what comes first. Finally, you see the += operator to append a -String to s, and parentheses to control the order of evaluation of the -expression so the ints are actually summed before they are displayed. -Notice the last example in main(): you sometimes see an empty -String followed by a + and a primitive as a way to perform the -conversion without calling the more cumbersome explicit method -(Integer.toString(), here). -Common Pitfalls When -Using Operators -One of the pitfalls when using operators is attempting to leave out the -parentheses when you are even the least bit uncertain about how an -expression will evaluate. This is still true in Java. -An extremely common error in C and C++ looks like this: -while(x = y) { -// ... -} -The programmer was clearly trying to test for equivalence (==) rather -than do an assignment. In C and C++ the result of this assignment will -always be true if y is nonzero, and you’ll probably get an infinite -loop. In Java, the result of this expression is not a boolean, but the -compiler expects a boolean and won’t convert from an int, so it -will conveniently give you a compile-time error and catch the problem -before you ever try to run the program. So the pitfall never happens in -Java. (The only time you won’t get a compile-time error is when x and -y are boolean, in which case x = y is a legal expression, and in the -preceding example, probably an error.) -A similar problem in C and C++ is using bitwise AND and OR instead -of the logical versions. Bitwise AND and OR use one of the characters -(& or |) while logical AND and OR use two (&& and ||). Just as with -= and ==, it’s easy to type just one character instead of two. In Java, -the compiler again prevents this, because it won’t let you cavalierly use -one type where it doesn’t belong. -Casting Operators -The word cast is used in the sense of “casting into a mold.” Java will -automatically change one type of data into another when appropriate. -For instance, if you assign an integral value to a floating point variable, -the compiler will automatically convert the int to a float. Casting -makes this type conversion explicit, or forces it when it wouldn’t -normally happen. -To perform a cast, put the desired data type inside parentheses to the -left of any value, as seen here: -// operators/Casting.java -public class Casting { -public static void main(String[] args) { -int i = 200; -long lng = (long)i; -lng = i; // "Widening," so a cast is not required -long lng2 = (long)200; -lng2 = 200; -// A "narrowing conversion": -i = (int)lng2; // Cast required -} -} -Thus, you can cast a numeric value as well as a variable. Casts may be -superfluous; for example, the compiler will automatically promote an -int value to a long when necessary. However, you are allowed to use -superfluous casts to make a point or to clarify your code. In other -situations, a cast might be essential just to get the code to compile. -In C and C++, casting can cause some headaches. In Java, casting is -safe, with the exception that when you perform a so-called narrowing -conversion (that is, when you go from a data type that can hold more -information to one that doesn’t hold as much), you run the risk of -losing information. Here the compiler forces you to use a cast, in effect -saying, “This can be a dangerous thing to do—if you want me to do it -anyway you must make the cast explicit.” With a widening conversion -an explicit cast is not needed, because the new type will more than -hold the information from the old type so no information is ever lost. -Java can cast any primitive type to any other primitive type, except for -boolean, which doesn’t allow any casting at all. Class types do not -allow casting. To convert one to the other, there must be special -methods. (You’ll find out later that objects can be cast within a family -of types; an Oak can be cast to a Tree and vice versa, but not to a -foreign type such as a Rock.) -Truncation and Rounding -When you are performing narrowing conversions, you must pay -attention to issues of truncation and rounding. For example, if you -cast from a floating point value to an integral value, what does Java -do? For example, if you cast the value 29.7 to an int, is the resulting -value 30 or 29? The answer is seen here: -// operators/CastingNumbers.java -// What happens when you cast a float -// or double to an integral value? -public class CastingNumbers { -public static void main(String[] args) { -double above = 0.7, below = 0.4; -float fabove = 0.7f, fbelow = 0.4f; -System.out.println("(int)above: " + (int)above); -System.out.println("(int)below: " + (int)below); -System.out.println("(int)fabove: " + (int)fabove); -System.out.println("(int)fbelow: " + (int)fbelow); -} -} -/* Output: -(int)above: 0 -(int)below: 0 -(int)fabove: 0 -(int)fbelow: 0 -*/ -So the answer is that casting from a float or double to an integral -value always truncates the number. If instead you want the result -rounded, use the round() methods in java.lang.Math: -// operators/RoundingNumbers.java -// Rounding floats and doubles -public class RoundingNumbers { -public static void main(String[] args) { -double above = 0.7, below = 0.4; -float fabove = 0.7f, fbelow = 0.4f; -System.out.println( -"Math.round(above): " + Math.round(above)); -System.out.println( -"Math.round(below): " + Math.round(below)); -System.out.println( -"Math.round(fabove): " + Math.round(fabove)); -System.out.println( -"Math.round(fbelow): " + Math.round(fbelow)); -} -} -/* Output: -Math.round(above): 1 -Math.round(below): 0 -Math.round(fabove): 1 -Math.round(fbelow): 0 -*/ -Since round() is part of java.lang, you don’t need an extra -import to use it. -Promotion -You’ll discover that if you perform any mathematical or bitwise -operations on primitive data types smaller than an int (that is, char, -byte, or short), those values are promoted to int before -performing the operations, and the resulting value is of type int. To -assign back into the smaller type, you use a cast. (And, since you’re -assigning back into a smaller type, you might be losing information.) -In general, the largest data type in an expression is the one that -determines the size of the result of that expression. If you multiply a -float and a double, the result is double. If you add an int and a long, the -result is long. -Java Has No “sizeof” -In C and C++, the sizeof() operator tells you the number of bytes -allocated for data items. The most compelling reason for sizeof() -in C and C++ is for portability. Different data types might be different -sizes on different machines, so the programmer must discover how big -those types are when performing operations that are sensitive to size. -For example, one computer might store integers in 32 bits, whereas -another might store integers as 16 bits. Programs could store larger -values in integers on the first machine. As you might imagine, -portability is a huge headache for C and C++ programmers. -Java does not need a sizeof() operator for this purpose, because all -the data types are the same size on all machines. You do not need to -think about portability on this level—it is designed into the language. -A Compendium of -Operators -The following example shows which primitive data types can be used -with particular operators. Basically, it is the same example repeated -over and over, but using different primitive data types. The file will -compile without error because the lines that fail are commented out -with a //-. -// operators/AllOps.java -// Tests all operators on all primitive data types -// to show which ones are accepted by the Java compiler -public class AllOps { -// To accept the results of a boolean test: -void f(boolean b) {} -void boolTest(boolean x, boolean y) { -// Arithmetic operators: -//- x = x * y; -//- x = x / y; -//- x = x % y; -//- x = x + y; -//- x = x - y; -//- x++; -//- x--; -//- x = +y; -//- x = -y; -// Relational and logical: -//- f(x > y); -//- f(x >= y); -//- f(x < y); -//- f(x <= y); -f(x == y); -f(x != y); -f(!y); -x = x && y; -x = x || y; -// Bitwise operators: -//- x = ~y; -x = x & y; -x = x | y; -x = x ^ y; -//- x = x << 1; -//- x = x >> 1; -//- x = x >>> 1; -// Compound assignment: -//- x += y; -//- x -= y; -//- x *= y; -//- x /= y; -//- x %= y; -//- x <<= 1; -//- x >>= 1; -//- x >>>= 1; -x &= y; -x ^= y; -x |= y; -// Casting: -//- char c = (char)x; -//- byte b = (byte)x; -//- short s = (short)x; -//- int i = (int)x; -//- long l = (long)x; -//- float f = (float)x; -//- double d = (double)x; -} -void charTest(char x, char y) { -// Arithmetic operators: -x = (char)(x * y); -x = (char)(x / y); -x = (char)(x % y); -x = (char)(x + y); -x = (char)(x - y); -x++; -x--; -x = (char) + y; -x = (char) - y; -// Relational and logical: -f(x > y); -f(x >= y); -f(x < y); -f(x <= y); -f(x == y); -f(x != y); -//- f(!x); -//- f(x && y); -//- f(x || y); -// Bitwise operators: -x= (char)~y; -x = (char)(x & y); -x = (char)(x | y); -x = (char)(x ^ y); -x = (char)(x << 1); -x = (char)(x >> 1); -x = (char)(x >>> 1); -// Compound assignment: -x += y; -x -= y; -x *= y; -x /= y; -x %= y; -x <<= 1; -x >>= 1; -x >>>= 1; -x &= y; -x ^= y; -x |= y; -// Casting: -//- boolean bl = (boolean)x; -byte b = (byte)x; -short s = (short)x; -int i = (int)x; -long l = (long)x; -float f = (float)x; -double d = (double)x; -} -void byteTest(byte x, byte y) { -// Arithmetic operators: -x = (byte)(x* y); -x = (byte)(x / y); -x = (byte)(x % y); -x = (byte)(x + y); -x = (byte)(x - y); -x++; -x--; -x = (byte) + y; -x = (byte) - y; -// Relational and logical: -f(x > y); -f(x >= y); -f(x < y); -f(x <= y); -f(x == y); -f(x != y); -//- f(!x); -//- f(x && y); -//- f(x || y); -// Bitwise operators: -x = (byte)~y; -x = (byte)(x & y); -x = (byte)(x | y); -x = (byte)(x ^ y); -x = (byte)(x << 1); -x = (byte)(x >> 1); -x = (byte)(x >>> 1); -// Compound assignment: -x += y; -x -= y; -x *= y; -x /= y; -x %= y; -x <<= 1; -x >>= 1; -x >>>= 1; -x &= y; -x ^= y; -x |= y; -// Casting: -//- boolean bl = (boolean)x; -char c = (char)x; -short s = (short)x; -int i = (int)x; -long l = (long)x; -float f = (float)x; -double d = (double)x; -} -void shortTest(short x, short y) { -// Arithmetic operators: -x = (short)(x * y); -x = (short)(x / y); -x = (short)(x % y); -x = (short)(x + y); -x = (short)(x - y); -x++; -x--; -x = (short) + y; -x = (short) - y; -// Relational and logical: -f(x > y); -f(x >= y); -f(x < y); -f(x <= y); -f(x == y); -f(x != y); -//- f(!x); -//- f(x && y); -//- f(x || y); -// Bitwise operators: -x = (short) ~ y; -x = (short)(x & y); -x = (short)(x | y); -x = (short)(x ^ y); -x = (short)(x << 1); -x = (short)(x >> 1); -x = (short)(x >>> 1); -// Compound assignment: -x += y; -x -= y; -x *= y; -x /= y; -x %= y; -x <<= 1; -x >>= 1; -x >>>= 1; -x &= y; -x ^= y; -x |= y; -// Casting: -//- boolean bl = (boolean)x; -char c = (char)x; -byte b = (byte)x; -int i = (int)x; -long l = (long)x; -float f = (float)x; -double d = (double)x; -} -void intTest(int x, int y) { -// Arithmetic operators: -x = x * y; -x = x / y; -x = x % y; -x = x + y; -x = x - y; -x++; -x--; -x = +y; -x = -y; -// Relational and logical: -f(x > y); -f(x >= y); -f(x < y); -f(x <= y); -f(x == y); -f(x != y); -//- f(!x); -//- f(x && y); -//- f(x || y); -// Bitwise operators: -x = ~y; -x = x & y; -x = x | y; -x = x ^ y; -x = x << 1; -x = x >> 1; -x = x >>> 1; -// Compound assignment: -x += y; -x -= y; -x *= y; -x /= y; -x %= y; -x <<= 1; -x >>= 1; -x >>>= 1; -x &= y; -x ^= y; -x |= y; -// Casting: -//- boolean bl = (boolean)x; -char c = (char)x; -byte b = (byte)x; -short s = (short)x; -long l = (long)x; -float f = (float)x; -double d = (double)x; -} -void longTest(long x, long y) { -// Arithmetic operators: -x = x * y; -x = x / y; -x = x % y; -x = x + y; -x = x - y; -x++; -x--; -x = +y; -x = -y; -// Relational and logical: -f(x > y); -f(x >= y); -f(x < y); -f(x <= y); -f(x == y); -f(x != y); -//- f(!x); -//- f(x && y); -//- f(x || y); -// Bitwise operators: -x = ~y; -x = x & y; -x = x | y; -x = x ^ y; -x = x << 1; -x = x >> 1; -x = x >>> 1; -// Compound assignment: -x += y; -x -= y; -x *= y; -x /= y; -x %= y; -x <<= 1; -x >>= 1; -x >>>= 1; -x &= y; -x ^= y; -x |= y; -// Casting: -//- boolean bl = (boolean)x; -char c = (char)x; -byte b = (byte)x; -short s = (short)x; -int i = (int)x; -float f = (float)x; -double d = (double)x; -} -void floatTest(float x, float y) { -// Arithmetic operators: -x = x * y; -x = x / y; -x = x % y; -x = x + y; -x = x - y; -x++; -x--; -x = +y; -x = -y; -// Relational and logical: -f(x > y); -f(x >= y); -f(x < y); -f(x <= y); -f(x == y); -f(x != y); -//- f(!x); -//- f(x && y); -//- f(x || y); -// Bitwise operators: -//- x = ~y; -//- x = x & y; -//- x = x | y; -//- x = x ^ y; -//- x = x << 1; -//- x = x >> 1; -//- x = x >>> 1; -// Compound assignment: -x += y; -x -= y; -x *= y; -x /= y; -x %= y; -//- x <<= 1; -//- x >>= 1; -//- x >>>= 1; -//- x &= y; -//- x ^= y; -//- x |= y; -// Casting: -//- boolean bl = (boolean)x; -char c = (char)x; -byte b = (byte)x; -short s = (short)x; -int i = (int)x; -long l = (long)x; -double d = (double)x; -} -void doubleTest(double x, double y) { -// Arithmetic operators: -x = x * y; -x = x / y; -x = x % y; -x = x + y; -x = x - y; -x++; -x--; -x = +y; -x = -y; -// Relational and logical: -f(x > y); -f(x >= y); -f(x < y); -f(x <= y); -f(x == y); -f(x != y); -//- f(!x); -//- f(x && y); -//- f(x || y); -// Bitwise operators: -//- x = ~y; -//- x = x & y; -//- x = x | y; -//- x = x ^ y; -//- x = x << 1; -//- x = x >> 1; -//- x = x >>> 1; -// Compound assignment: -x += y; -x -= y; -x *= y; -x /= y; -x %= y; -//- x <<= 1; -//- x >>= 1; -//- x >>>= 1; -//- x &= y; -//- x ^= y; -//- x |= y; -// Casting: -//- boolean bl = (boolean)x; -char c = (char)x; -byte b = (byte)x; -short s = (short)x; -int i = (int)x; -long l = (long)x; -float f = (float)x; -} -} -Note that boolean is limited. You can assign to it the values true -and false, and you can test it for truth or falsehood, but you cannot -add Booleans or perform any other type of operation on them. -In char, byte, and short, you see the effect of promotion with the -arithmetic operators. Each arithmetic operation on any of those types -produces an int result, which must be explicitly cast back to the -original type (a narrowing conversion that might lose information) to -assign back to that type. With int values, however, you do not need a -cast, because everything is already an int. Don’t be lulled into -thinking everything is safe, though. If you multiply two ints that are -big enough, you’ll overflow the result. The following example -demonstrates this: -// operators/Overflow.java -// Surprise! Java lets you overflow -public class Overflow { -public static void main(String[] args) { -int big = Integer.MAX_VALUE; -System.out.println("big = " + big); -int bigger = big * 4; -System.out.println("bigger = " + bigger); -} -} -/* Output: -big = 2147483647 -bigger = -4 -*/ -You get no errors or warnings from the compiler, and no exceptions at -run time. Java is good, but it’s not that good. -Compound assignments do not require casts for char, byte, or -short, even though they are performing promotions that have the -same results as the direct arithmetic operations. On the other hand, -the lack of a cast certainly simplifies the code. -Except for boolean, any primitive type can be cast to any other -primitive type. Again, you must be aware of the effect of a narrowing -conversion when casting to a smaller type; otherwise, you might -unknowingly lose information during the cast. -Summary -If you’ve had experience with any languages that use C-like syntax, you -see that the operators in Java are so similar there is virtually no -learning curve. If you found this chapter challenging, make sure you -view the multimedia presentation Thinking in C, freely available at -www.OnJava8.com. -1. As an undergraduate, I attended Pomona College for two years, -where the number 47 was considered a “magic number.” See the -Wikipedia article.↩ -2. John Kirkham writes, “I started computing in 1962 using -FORTRAN II on an IBM 1620. At that time, and throughout the -1960s and into the 1970s, FORTRAN was an all uppercase -language. This probably started because many of the early input -devices were old teletype units that used 5 bit Baudot code, which -had no lowercase capability. The E in the exponential notation -was also always uppercase and was never confused with the -natural logarithm base e, which is always lowercase. The E simply -stood for exponential, which was for the base of the number -system used—usually 10. At the time octal was also widely used by -programmers. Although I never saw it used, if I had seen an octal -number in exponential notation I would have considered it to be -base 8. The first time I remember seeing an exponential using a -lowercase e was in the late 1970s and I also found it confusing. -The problem arose as lowercase crept into FORTRAN, not at its -beginning. We actually had functions to use if you really wanted -to use the natural logarithm base, but they were all uppercase.” ↩ \ No newline at end of file +[TOC] + +## [待初始化](#Using-Java-Operators) + +## [待初始化](#Precedence) + +## [待初始化](#Assignment) + +## [待初始化](#Mathematical-Operators) + +## [待初始化](#Auto-Increment-and-Decrement) + +## [待初始化](#Relational-Operators) + +## [待初始化](#Logical-Operators) + +## [待初始化](#Literals) + +## [待初始化](#Bitwise-Operators) + +## [待初始化](#Ternary-if-else-Operator) + +## [待初始化](#String-Operator-+-and-+=) + +## [待初始化](#Common-Pitfalls-When-Using-Operators) + +## [待初始化](#Casting-Operators) + +## [待初始化](#Java-Has-No-sizeof) + +## [待初始化](#A-Compendium-of-Operators) + +## [待初始化](#Summary) \ No newline at end of file From ed85c81c47c02af3cd164016ce392746cf11bc0a Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sat, 23 Mar 2019 18:18:36 +0800 Subject: [PATCH 030/814] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=85=A8?= =?UTF-8?q?=E4=B9=A6=E4=B8=BB=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 369 +++++++++++++++++- book/06-Housekeeping.md | 2 + book/07-Implementation-Hiding.md | 2 + book/08-Reuse.md | 2 + book/09-Polymorphism.md | 2 + book/10-Interfaces.md | 2 + book/11-Inner-Classes.md | 2 + book/12-Collections.md | 2 + book/14-Streams.md | 2 + book/15-Exceptions.md | 2 + book/16-Validating-Your-Code.md | 2 + book/17-Files.md | 2 + book/18-Strings.md | 2 + book/19-Type-Information.md | 2 + book/20-Generics.md | 2 + book/21-Arrays.md | 2 + book/22-Enumerations.md | 2 + book/23-Annotations.md | 2 + book/24-Concurrent-Programming.md | 2 + book/25-Patterns.md | 2 + book/Appendix-Becoming-a-Programmer.md | 2 + ...efits-and-Costs-of-Static-Type-Checking.md | 2 + book/Appendix-Collection-Topics.md | 2 + book/Appendix-Data-Compression.md | 2 + book/Appendix-IO-Streams.md | 2 + book/Appendix-Javadoc.md | 2 + book/Appendix-Low-Level-Concurrency.md | 2 + book/Appendix-New-IO.md | 2 + book/Appendix-Object-Serialization.md | 2 + .../Appendix-Passing-and-Returning-Objects.md | 2 + book/Appendix-Programming-Guidelines.md | 2 + book/Appendix-Standard-IO.md | 2 + book/Appendix-Supplements.md | 2 + ...Positive-Legacy-of-C-plus-plus-and-Java.md | 2 + ...endix-Understanding-equals-and-hashCode.md | 2 + 35 files changed, 419 insertions(+), 18 deletions(-) create mode 100644 book/06-Housekeeping.md create mode 100644 book/07-Implementation-Hiding.md create mode 100644 book/08-Reuse.md create mode 100644 book/09-Polymorphism.md create mode 100644 book/10-Interfaces.md create mode 100644 book/11-Inner-Classes.md create mode 100644 book/12-Collections.md create mode 100644 book/14-Streams.md create mode 100644 book/15-Exceptions.md create mode 100644 book/16-Validating-Your-Code.md create mode 100644 book/17-Files.md create mode 100644 book/18-Strings.md create mode 100644 book/19-Type-Information.md create mode 100644 book/20-Generics.md create mode 100644 book/21-Arrays.md create mode 100644 book/22-Enumerations.md create mode 100644 book/23-Annotations.md create mode 100644 book/24-Concurrent-Programming.md create mode 100644 book/25-Patterns.md create mode 100644 book/Appendix-Becoming-a-Programmer.md create mode 100644 book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md create mode 100644 book/Appendix-Collection-Topics.md create mode 100644 book/Appendix-Data-Compression.md create mode 100644 book/Appendix-IO-Streams.md create mode 100644 book/Appendix-Javadoc.md create mode 100644 book/Appendix-Low-Level-Concurrency.md create mode 100644 book/Appendix-New-IO.md create mode 100644 book/Appendix-Object-Serialization.md create mode 100644 book/Appendix-Passing-and-Returning-Objects.md create mode 100644 book/Appendix-Programming-Guidelines.md create mode 100644 book/Appendix-Standard-IO.md create mode 100644 book/Appendix-Supplements.md create mode 100644 book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md create mode 100644 book/Appendix-Understanding-equals-and-hashCode.md diff --git a/SUMMARY.md b/SUMMARY.md index 7a89d11a..1a4691e8 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -23,6 +23,9 @@ * [BUG提交](book/00-Introduction.md#BUG提交) * [邮箱订阅](book/00-Introduction.md#邮箱订阅) * [Java图形界面](book/00-Introduction.md#Java图形界面) + +### 正文 + * [第一章 对象的概念](book/01-What-is-an-Object.md) * [抽象](book/01-What-is-an-Object.md#抽象) * [接口](book/01-What-is-an-Object.md#接口) @@ -53,32 +56,362 @@ * [编码风格](book/03-Objects-Everywhere.md#编码风格) * [本章小结](book/03-Objects-Everywhere.md#本章小结) * [第四章 运算符](book/04-Operators.md) - * [待初始化](book/04-Operators.md#Using-Java-Operators) - * [待初始化](book/04-Operators.md#Precedence) - * [待初始化](book/04-Operators.md#Assignment) - * [待初始化](book/04-Operators.md#Mathematical-Operators) - * [待初始化](book/04-Operators.md#Auto-Increment-and-Decrement) - * [待初始化](book/04-Operators.md#Relational-Operators) - * [待初始化](book/04-Operators.md#Logical-Operators) - * [待初始化](book/04-Operators.md#Literals) - * [待初始化](book/04-Operators.md#Bitwise-Operators) - * [待初始化](book/04-Operators.md#Ternary-if-else-Operator) - * [待初始化](book/04-Operators.md#String-Operator-+-and-+=) - * [待初始化](book/04-Operators.md#Common-Pitfalls-When-Using-Operators) - * [待初始化](book/04-Operators.md#Casting-Operators) - * [待初始化](book/04-Operators.md#Java-Has-No-sizeof) - * [待初始化](book/04-Operators.md#A-Compendium-of-Operators) - * [待初始化](book/04-Operators.md#Summary) + * [使用说明](book/04-Operators.md#使用说明) + * [优先级](book/04-Operators.md#优先级) + * [赋值](book/04-Operators.md#赋值) + * [算术运算符](book/04-Operators.md#算术运算符) + * [自动递增和递减](book/04-Operators.md#自动递增和递减) + * [关系运算符](book/04-Operators.md#关系运算符) + * [逻辑运算符](book/04-Operators.md#逻辑运算符) + * [字面值](book/04-Operators.md#字面值) + * [按位运算符](book/04-Operators.md#按位运算符) + * [移位运算符](book/04-Operators.md#移位运算符) + * [三元运算符](book/04-Operators.md#三元运算符) + * [字符串运算符](book/04-Operators.md#字符串运算符) + * [常见陷阱](book/04-Operators.md#常见陷阱) + * [类型转换](book/04-Operators.md#类型转换) + * [Java没有sizeof](book/04-Operators.md#Java没有sizeof) + * [运算符总结](book/04-Operators.md#运算符总结) + * [本章小结](book/04-Operators.md#本章小结) * [第五章 控制流](book/05-Control-Flow.md) * [true和flase](book/05-Control-Flow.md#true和flase) * [if-else](book/05-Control-Flow.md#if-else) * [迭代语句](book/05-Control-Flow.md#迭代语句) * [for-in语法](book/05-Control-Flow.md#for-in语法) * [return](book/05-Control-Flow.md#return) - * [continue](book/05-Control-Flow.md#break和continue) + * [break和continue](book/05-Control-Flow.md#break和continue) * [臭名昭著的goto](book/05-Control-Flow.md#臭名昭著的goto) * [switch](book/05-Control-Flow.md#switch) - * [switch 字符串](book/05-Control-Flow.md#Switching-on-Strings) + * [switch字符串](book/05-Control-Flow.md#switch字符串) * [本章小结](book/05-Control-Flow.md#本章小结) +* [第六章 初始化和清理](book/06-Housekeeping.md) + * [](book/06-Housekeeping.md#) + * [](book/06-Housekeeping.md#) + * [](book/06-Housekeeping.md#) + * [](book/06-Housekeeping.md#) + * [](book/06-Housekeeping.md#) + * [](book/06-Housekeeping.md#) + * [](book/06-Housekeeping.md#) + * [](book/06-Housekeeping.md#) + * [](book/06-Housekeeping.md#) + * [本章小结](book/06-Housekeeping.md#本章小结) +* [第七章 封装](book/07-Implementation-Hiding.md) + * [](book/07-Implementation-Hiding.md#) + * [](book/07-Implementation-Hiding.md#) + * [](book/07-Implementation-Hiding.md#) + * [本章小结](book/07-Implementation-Hiding.md#本章小结) +* [第八章 复用](book/08-Reuse.md) + * [](book/08-Reuse.md#) + * [](book/08-Reuse.md#) + * [](book/08-Reuse.md#) + * [](book/08-Reuse.md#) + * [](book/08-Reuse.md#) + * [](book/08-Reuse.md#) + * [](book/08-Reuse.md#) + * [](book/08-Reuse.md#) + * [](book/08-Reuse.md#) + * [本章小结](book/08-Reuse.md#本章小结) +* [第九章 多态](book/09-Polymorphism.md) + * [](book/09-Polymorphism.md#) + * [](book/09-Polymorphism.md#) + * [](book/09-Polymorphism.md#) + * [](book/09-Polymorphism.md#) + * [本章小结](book/09-Polymorphism.md#本章小结) +* [第十章 接口](book/10-Interfaces.md) + * [](book/10-Interfaces.md#) + * [](book/10-Interfaces.md#) + * [](book/10-Interfaces.md#) + * [](book/10-Interfaces.md#) + * [](book/10-Interfaces.md#) + * [](book/10-Interfaces.md#) + * [](book/10-Interfaces.md#) + * [](book/10-Interfaces.md#) + * [](book/10-Interfaces.md#) + * [](book/10-Interfaces.md#) + * [本章小结](book/10-Interfaces.md#本章小结) +* [第十一章 内部类](book/11-Inner-Classes.md) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [](book/11-Inner-Classes.md#) + * [本章小结](book/11-Inner-Classes.md#本章小结) +* [第十二章 集合](book/12-Collections.md) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [](book/12-Collections.md#) + * [本章小结](book/12-Collections.md#本章小结) +* [第十三章 函数式编程](book/13-Functional-Programming.md) + * [](book/13-Functional-Programming.md#) + * [](book/13-Functional-Programming.md#) + * [](book/13-Functional-Programming.md#) + * [](book/13-Functional-Programming.md#) + * [](book/13-Functional-Programming.md#) + * [](book/13-Functional-Programming.md#) + * [](book/13-Functional-Programming.md#) + * [](book/13-Functional-Programming.md#) + * [](book/13-Functional-Programming.md#) + * [本章小结](book/13-Functional-Programming.md#本章小结) +* [第十四章 流式编程](book/14-Streams.md) + * [](book/14-Streams.md#) + * [](book/14-Streams.md#) + * [](book/14-Streams.md#) + * [](book/14-Streams.md#) + * [](book/14-Streams.md#) + * [本章小结](book/14-Streams.md#本章小结) +* [第十五章 异常](book/15-Exceptions.md) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [](book/15-Exceptions.md#) + * [本章小结](book/15-Exceptions.md#本章小结) +* [第十六章 代码校验](book/16-Validating-Your-Code.md) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [](book/16-Validating-Your-Code.md#) + * [本章小结](book/16-Validating-Your-Code.md#本章小结) +* [第十七章 文件](book/17-Files.md) + * [](book/17-Files.md#) + * [](book/17-Files.md#) + * [](book/17-Files.md#) + * [](book/17-Files.md#) + * [](book/17-Files.md#) + * [](book/17-Files.md#) + * [本章小结](book/17-Files.md#本章小结) +* [第十八章 字符串](book/18-Strings.md) + * [](book/18-Strings.md#) + * [](book/18-Strings.md#) + * [](book/18-Strings.md#) + * [](book/18-Strings.md#) + * [](book/18-Strings.md#) + * [](book/18-Strings.md#) + * [](book/18-Strings.md#) + * [](book/18-Strings.md#) + * [](book/18-Strings.md#) + * [本章小结](book/18-Strings.md#本章小结) +* [第十九章 类型信息](book/19-Type-Information.md) + * [](book/19-Type-Information.md#) + * [](book/19-Type-Information.md#) + * [](book/19-Type-Information.md#) + * [](book/19-Type-Information.md#) + * [](book/19-Type-Information.md#) + * [](book/19-Type-Information.md#) + * [](book/19-Type-Information.md#) + * [](book/19-Type-Information.md#) + * [](book/19-Type-Information.md#) + * [本章小结](book/19-Type-Information.md#本章小结) +* [第二十章 泛型](book/20-Generics.md) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [](book/20-Generics.md#) + * [本章小结](book/20-Generics.md#本章小结) +* [第二十一章 数组](book/21-Arrays.md) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [](book/21-Arrays.md#) + * [本章小结](book/21-Arrays.md#本章小结) +* [第二十二章 枚举](book/22-Enumerations.md) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [](book/22-Enumerations.md#) + * [本章小结](book/22-Enumerations.md#本章小结) +* [第二十三章 注解](book/23-Annotations.md) + * [](book/23-Annotations.md#) + * [](book/23-Annotations.md#) + * [](book/23-Annotations.md#) + * [](book/23-Annotations.md#) + * [本章小结](book/23-Annotations.md#本章小结) +* [第二十四章 并发编程](book/24-Concurrent-Programming.md) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [](book/24-Concurrent-Programming.md#) + * [本章小结](book/24-Concurrent-Programming.md#本章小结) +* [第二十五章 正则表达式](book/25-Patterns.md) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [](book/25-Patterns.md#) + * [本章小结](book/25-Patterns.md#本章小结) + +### 附录 + +* [附录:补充](book/Appendix-Supplements.md) + * [](book/Appendix-Supplements.md#) + * [](book/Appendix-Supplements.md#) + * [](book/Appendix-Supplements.md#) +* [附录:编程指南](book/Appendix-Programming-Guidelines.md) + * [](book/Appendix-Programming-Guidelines.md#) + * [](book/Appendix-Programming-Guidelines.md#) +* [附录:文档注释](book/Appendix-Javadoc.md) +* [附录:对象传递和返回](book/Appendix-Passing-and-Returning-Objects.md) + * [](book/Appendix-Passing-and-Returning-Objects.md#) + * [](book/Appendix-Passing-and-Returning-Objects.md#) + * [](book/Appendix-Passing-and-Returning-Objects.md#) + * [](book/Appendix-Passing-and-Returning-Objects.md#) + * [本章小结](book/Appendix-Passing-and-Returning-Objects.md#本章小结) +* [附录:流式IO](book/Appendix-IO-Streams.md) + * [](book/Appendix-IO-Streams.md#) + * [](book/Appendix-IO-Streams.md#) + * [](book/Appendix-IO-Streams.md#) + * [](book/Appendix-IO-Streams.md#) + * [](book/Appendix-IO-Streams.md#) + * [](book/Appendix-IO-Streams.md#) + * [本章小结](book/Appendix-IO-Streams.md#本章小结) +* [附录:标准IO](book/Appendix-Standard-IO.md) + * [](book/Appendix-Standard-IO.md#) +* [附录:新IO](book/Appendix-New-IO.md) + * [](book/Appendix-New-IO.md#) + * [](book/Appendix-New-IO.md#) + * [](book/Appendix-New-IO.md#) + * [](book/Appendix-New-IO.md#) + * [](book/Appendix-New-IO.md#) + * [](book/Appendix-New-IO.md#) + * [](book/Appendix-New-IO.md#) +* [附录:理解equals和hashCode方法](book/Appendix-Understanding-equals-and-hashCode.md) + * [](book/Appendix-Understanding-equals-and-hashCode.md#) + * [](book/Appendix-Understanding-equals-and-hashCode.md#) + * [](book/Appendix-Understanding-equals-and-hashCode.md#) +* [附录:集合主题](book/Appendix-Collection-Topics.md) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) + * [](book/Appendix-Collection-Topics.md#) +* [附录:并发底层原理](book/Appendix-Low-Level-Concurrency.md) + * [](book/Appendix-Low-Level-Concurrency.md#) + * [](book/Appendix-Low-Level-Concurrency.md#) + * [](book/Appendix-Low-Level-Concurrency.md#) + * [](book/Appendix-Low-Level-Concurrency.md#) + * [](book/Appendix-Low-Level-Concurrency.md#) + * [](book/Appendix-Low-Level-Concurrency.md#) + * [](book/Appendix-Low-Level-Concurrency.md#) + * [本章小结](book/Appendix-Low-Level-Concurrency.md#本章小结) +* [附录:数据压缩](book/Appendix-Data-Compression.md) + * [](book/Appendix-Data-Compression.md#) + * [](book/Appendix-Data-Compression.md#) + * [](book/Appendix-Data-Compression.md#) +* [附录:对象序列化](book/Appendix-Object-Serialization.md) + * [](book/Appendix-Object-Serialization.md#) + * [](book/Appendix-Object-Serialization.md#) + * [](book/Appendix-Object-Serialization.md#) +* [附录:静态语言类型检查](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md) + * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) + * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) + * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) + * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) + * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) +* [附录:C++和Java的优良传统](book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md) +* [附录:成为一名程序员](book/Appendix-Becoming-a-Programmer.md) + * [](book/Appendix-Becoming-a-Programmer.md#) + * [](book/Appendix-Becoming-a-Programmer.md#) + * [](book/Appendix-Becoming-a-Programmer.md#) + * [](book/Appendix-Becoming-a-Programmer.md#) + * [](book/Appendix-Becoming-a-Programmer.md#) + * [](book/Appendix-Becoming-a-Programmer.md#) * [词汇表](GLOSSARY.md) diff --git a/book/06-Housekeeping.md b/book/06-Housekeeping.md new file mode 100644 index 00000000..2fec7de7 --- /dev/null +++ b/book/06-Housekeeping.md @@ -0,0 +1,2 @@ +# 第六章 初始化和清理 + diff --git a/book/07-Implementation-Hiding.md b/book/07-Implementation-Hiding.md new file mode 100644 index 00000000..9bd7a5d8 --- /dev/null +++ b/book/07-Implementation-Hiding.md @@ -0,0 +1,2 @@ +# 第七章 封装 + diff --git a/book/08-Reuse.md b/book/08-Reuse.md new file mode 100644 index 00000000..c0e94dea --- /dev/null +++ b/book/08-Reuse.md @@ -0,0 +1,2 @@ +# 第八章 复用 + diff --git a/book/09-Polymorphism.md b/book/09-Polymorphism.md new file mode 100644 index 00000000..c50bb408 --- /dev/null +++ b/book/09-Polymorphism.md @@ -0,0 +1,2 @@ +# 第九章 多态 + diff --git a/book/10-Interfaces.md b/book/10-Interfaces.md new file mode 100644 index 00000000..9f270823 --- /dev/null +++ b/book/10-Interfaces.md @@ -0,0 +1,2 @@ +# 第十章 接口 + diff --git a/book/11-Inner-Classes.md b/book/11-Inner-Classes.md new file mode 100644 index 00000000..5e93392e --- /dev/null +++ b/book/11-Inner-Classes.md @@ -0,0 +1,2 @@ +# 第十一章 内部类 + diff --git a/book/12-Collections.md b/book/12-Collections.md new file mode 100644 index 00000000..5c5acf3a --- /dev/null +++ b/book/12-Collections.md @@ -0,0 +1,2 @@ +# 第十二章 集合 + diff --git a/book/14-Streams.md b/book/14-Streams.md new file mode 100644 index 00000000..f9ec4063 --- /dev/null +++ b/book/14-Streams.md @@ -0,0 +1,2 @@ +# 第十四章 流式编程 + diff --git a/book/15-Exceptions.md b/book/15-Exceptions.md new file mode 100644 index 00000000..b66472a9 --- /dev/null +++ b/book/15-Exceptions.md @@ -0,0 +1,2 @@ +# 第十五章 异常 + diff --git a/book/16-Validating-Your-Code.md b/book/16-Validating-Your-Code.md new file mode 100644 index 00000000..dfd2abaa --- /dev/null +++ b/book/16-Validating-Your-Code.md @@ -0,0 +1,2 @@ +# 第十六章 代码校验 + diff --git a/book/17-Files.md b/book/17-Files.md new file mode 100644 index 00000000..a1230cfa --- /dev/null +++ b/book/17-Files.md @@ -0,0 +1,2 @@ +# 第十七章 文件 + diff --git a/book/18-Strings.md b/book/18-Strings.md new file mode 100644 index 00000000..9252da21 --- /dev/null +++ b/book/18-Strings.md @@ -0,0 +1,2 @@ +# 第十八章 字符串 + diff --git a/book/19-Type-Information.md b/book/19-Type-Information.md new file mode 100644 index 00000000..5929f739 --- /dev/null +++ b/book/19-Type-Information.md @@ -0,0 +1,2 @@ +# 第十九章 类型信息 + diff --git a/book/20-Generics.md b/book/20-Generics.md new file mode 100644 index 00000000..4bb7980e --- /dev/null +++ b/book/20-Generics.md @@ -0,0 +1,2 @@ +# 第二十章 泛型 + diff --git a/book/21-Arrays.md b/book/21-Arrays.md new file mode 100644 index 00000000..38e066ef --- /dev/null +++ b/book/21-Arrays.md @@ -0,0 +1,2 @@ +# 第二十一章 数组 + diff --git a/book/22-Enumerations.md b/book/22-Enumerations.md new file mode 100644 index 00000000..999ad7c1 --- /dev/null +++ b/book/22-Enumerations.md @@ -0,0 +1,2 @@ +# 第二十二章 枚举 + diff --git a/book/23-Annotations.md b/book/23-Annotations.md new file mode 100644 index 00000000..d30be182 --- /dev/null +++ b/book/23-Annotations.md @@ -0,0 +1,2 @@ +# 第二十三章 注解 + diff --git a/book/24-Concurrent-Programming.md b/book/24-Concurrent-Programming.md new file mode 100644 index 00000000..ab865daa --- /dev/null +++ b/book/24-Concurrent-Programming.md @@ -0,0 +1,2 @@ +# 第二十四章 并发编程 + diff --git a/book/25-Patterns.md b/book/25-Patterns.md new file mode 100644 index 00000000..ea3ca325 --- /dev/null +++ b/book/25-Patterns.md @@ -0,0 +1,2 @@ +# 第二十五章 正则表达式 + diff --git a/book/Appendix-Becoming-a-Programmer.md b/book/Appendix-Becoming-a-Programmer.md new file mode 100644 index 00000000..79cc6c2b --- /dev/null +++ b/book/Appendix-Becoming-a-Programmer.md @@ -0,0 +1,2 @@ +# 附录:成为一名程序员 + diff --git a/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md b/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md new file mode 100644 index 00000000..64468e58 --- /dev/null +++ b/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md @@ -0,0 +1,2 @@ +# 附录:静态语言类型检查 + diff --git a/book/Appendix-Collection-Topics.md b/book/Appendix-Collection-Topics.md new file mode 100644 index 00000000..f10136b5 --- /dev/null +++ b/book/Appendix-Collection-Topics.md @@ -0,0 +1,2 @@ +# 附录:集合主题 + diff --git a/book/Appendix-Data-Compression.md b/book/Appendix-Data-Compression.md new file mode 100644 index 00000000..e7f10154 --- /dev/null +++ b/book/Appendix-Data-Compression.md @@ -0,0 +1,2 @@ +# 附录:数据压缩 + diff --git a/book/Appendix-IO-Streams.md b/book/Appendix-IO-Streams.md new file mode 100644 index 00000000..bc03ea3d --- /dev/null +++ b/book/Appendix-IO-Streams.md @@ -0,0 +1,2 @@ +# 附录:流式IO + diff --git a/book/Appendix-Javadoc.md b/book/Appendix-Javadoc.md new file mode 100644 index 00000000..0c985fcf --- /dev/null +++ b/book/Appendix-Javadoc.md @@ -0,0 +1,2 @@ +# 附录:文档注释 + diff --git a/book/Appendix-Low-Level-Concurrency.md b/book/Appendix-Low-Level-Concurrency.md new file mode 100644 index 00000000..9a8c3a7e --- /dev/null +++ b/book/Appendix-Low-Level-Concurrency.md @@ -0,0 +1,2 @@ +# 附录:并发底层原理 + diff --git a/book/Appendix-New-IO.md b/book/Appendix-New-IO.md new file mode 100644 index 00000000..d7804380 --- /dev/null +++ b/book/Appendix-New-IO.md @@ -0,0 +1,2 @@ +# 附录:新IO + diff --git a/book/Appendix-Object-Serialization.md b/book/Appendix-Object-Serialization.md new file mode 100644 index 00000000..d9699b91 --- /dev/null +++ b/book/Appendix-Object-Serialization.md @@ -0,0 +1,2 @@ +# 附录:对象序列化 + diff --git a/book/Appendix-Passing-and-Returning-Objects.md b/book/Appendix-Passing-and-Returning-Objects.md new file mode 100644 index 00000000..8cff3e7b --- /dev/null +++ b/book/Appendix-Passing-and-Returning-Objects.md @@ -0,0 +1,2 @@ +# 附录:对象传递和返回 + diff --git a/book/Appendix-Programming-Guidelines.md b/book/Appendix-Programming-Guidelines.md new file mode 100644 index 00000000..ebbb6e8a --- /dev/null +++ b/book/Appendix-Programming-Guidelines.md @@ -0,0 +1,2 @@ +# 附录:编程指南 + diff --git a/book/Appendix-Standard-IO.md b/book/Appendix-Standard-IO.md new file mode 100644 index 00000000..d92be155 --- /dev/null +++ b/book/Appendix-Standard-IO.md @@ -0,0 +1,2 @@ +# 附录:标准IO + diff --git a/book/Appendix-Supplements.md b/book/Appendix-Supplements.md new file mode 100644 index 00000000..e58d28de --- /dev/null +++ b/book/Appendix-Supplements.md @@ -0,0 +1,2 @@ +# 附录:补充 + diff --git a/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md b/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md new file mode 100644 index 00000000..71ff1603 --- /dev/null +++ b/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md @@ -0,0 +1,2 @@ +# 附录:C++和Java的优良传统 + diff --git a/book/Appendix-Understanding-equals-and-hashCode.md b/book/Appendix-Understanding-equals-and-hashCode.md new file mode 100644 index 00000000..d3ee4cdc --- /dev/null +++ b/book/Appendix-Understanding-equals-and-hashCode.md @@ -0,0 +1,2 @@ +# 附录:理解equals和hashCode方法 + From d85a7989b03eb862f803ee9f8e5b4f9de43d52e1 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sat, 23 Mar 2019 18:25:18 +0800 Subject: [PATCH 031/814] auto commit --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2fa7410f..bc7187bb 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ - [x] 第三章 万物皆对象 - [ ] 第四章 运算符 - [x] 第五章 控制流 +- [x] 第十三章函数式编程 - [ ] 待续······ - 最近公司项目赶着上线,等忙完继续! @@ -51,6 +52,8 @@ - 2019-03-17 第五章 控制流翻译完成 +- 2019-03-20 第十三章 函数式编程完成 + ## 原书作者
From 3a0084e66fa2c635ef1462d24e09b039762d1ce6 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sat, 23 Mar 2019 18:26:55 +0800 Subject: [PATCH 032/814] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc7187bb..a9cbfd29 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ - [x] 第三章 万物皆对象 - [ ] 第四章 运算符 - [x] 第五章 控制流 -- [x] 第十三章函数式编程 +- [x] 第十三章 函数式编程 - [ ] 待续······ - 最近公司项目赶着上线,等忙完继续! From 9484482726e239aa68987cfad6656a3ec5ac4dc2 Mon Sep 17 00:00:00 2001 From: Langdon <575998772@qq.com> Date: Sun, 24 Mar 2019 16:12:11 +0800 Subject: [PATCH 033/814] =?UTF-8?q?=E9=99=84=E5=BD=95:=E6=96=B0IO=20?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=88=9D=E7=A8=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/Appendix-New-IO.md | 984 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 984 insertions(+) diff --git a/book/Appendix-New-IO.md b/book/Appendix-New-IO.md index d7804380..816c0f80 100644 --- a/book/Appendix-New-IO.md +++ b/book/Appendix-New-IO.md @@ -1,2 +1,986 @@ # 附录:新IO +Java “新” I/O 库,是在Java 1.4引入到 **Java .nio.* package** 中。它有一个目标 : 速度。 + +实际上,“旧的”I/O包是使用 **nio** 重新实现了,因此速度也得到提升,因此即使不显式地使用nio 编写代码,也可以提速。这种速度的提高既发生在文件 I/O 中(这里讨论),也发生在网络I/O 中(例如用于Internet编程)。 + +速度来自于使用更接近操作系统执行 I/O 方式的结构 : 通道和缓冲区。把它想象成一个煤矿;通道是包含煤层的矿井(数据),缓冲区是您发送到矿井的小车。车里装满了煤,你从车上拿煤。也就是说,你不能直接和通道互动 ; 您与缓冲区交互并将缓冲区发送到通道中。通道要么从缓冲区中提取数据,要么将数据放入缓冲区。 + +本附录将深入探讨 nio 包。像I/O streams 这样的高级库使用 **nio**,但是大多数时候您不需要在这个级别使用 I/O 。在Java 7和Java 8,您(理想情况下)除了特殊情况外,甚至不需要使用I/O流。理想情况下,您将经常使用的所有内容都包含在文件一章中。只有在处理性能问题 (例如,可能需要内存映射文件)或创建自己的 I/O 库时,才需要理解 **nio**。 + +## ByteBuffers + +直接与通道通信的缓冲区只有一个类型,就是 bytebuffer 。也就是说,一个保存原始字节的缓冲区。如果您查看 **java.nio.ByteBuffer** 的JDK文档,你会发现它很基本 : 您可以通过告诉它要分配多少存储空间来创建一个方法,并且可以使用一些方法来放置和获取数据,这些方法可以是原始字节形式的数据,也可以是原始数据类型的数据。但是没有办法放置或获取对象,甚至字符串。它是相当低层次的,因为这使得大多数操作系统的映射更加有效。 + +“旧的” I/O 中的三个类被修改,可以生成一个 **FileChannel** 分别是: **FileInputStream**、**FileOutputStream**,以及用于读写的 **RandomAccessFile**。 + +注意,这些是字节操作流,符合 **nio** 的底层特性。 字符模式类的 **Reader** 和 **Writer** 不生成通道,但通道类具有从通道生成 **Reader** 和 **Writer** 的实用方法。 + +在这里,我们使用所有三种类型的流来生成可写、可读/可写和可读的通道: + +```java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Getting channels from streams +import java.nio.*; +import java.nio.channels.*; +import java.io.*; + +public class GetChannel { + private static String name = "data.txt"; + private static final int BSIZE = 1024; + public static void main(String[] args) { + // Write a file: + try( + FileChannel fc = new FileOutputStream(name) + .getChannel() + ) { + fc.write(ByteBuffer + .wrap("Some text ".getBytes())); + } catch(IOException e) { + throw new RuntimeException(e); + } + // Add to the end of the file: + try( + FileChannel fc = new RandomAccessFile( + name, "rw").getChannel() + ) { + fc.position(fc.size()); // Move to the end + fc.write(ByteBuffer + .wrap("Some more".getBytes())); + } catch(IOException e) { + throw new RuntimeException(e); + } + // Read the file: + try( + FileChannel fc = new FileInputStream(name) + .getChannel() + ) { + ByteBuffer buff = ByteBuffer.allocate(BSIZE); + fc.read(buff); + buff.flip(); + while(buff.hasRemaining()) + System.out.write(buff.get()); + } catch(IOException e) { + throw new RuntimeException(e); + } + System.out.flush(); + } +} +/* Output: +Some text Some more +*/ +``` + +对于这里显示的任何流类,**getChannel( )** 将生成一个 **FileChannel** 。通道是相当基本的:给它一个**ByteBuffer** 用于读写,并为独占访问锁定文件的区域(稍后将对此进行描述)。 + +将字节放入 **ByteBuffer** 的一种方法是直接使用 “put” 方法,将一个或多个字节填入 ByteBuffer,当然也可以是其它原始类型。但是,正如这里所看到的,您还可以使用 **wrap()** 方法在 **ByteBuffer**中“包装”现有字节数组。执行此操作时,不会复制底层数组,而是将其用作生成的 **ByteBuffer** 的存储。这样生产的 **ByteBuffer** 是由数组“支持”的。 + +data.txt 文件使用RandomAccessFile重新打开。注意,您可以在文件中移动 **FileChanne** l; 在这里,它被移动到末尾,以便添加额外的写操作。 + +对于只读访问,必须使用 **static allocate()** 方法显式地分配 **ByteBuffer**。**nio** 的目标是快速移动大量数据,因此 **ByteBuffer** 的大小应该很重要——实际上,这里使用的1K可能比您通常使用的要小很多(您必须对工作应用程序进行试验,以找到最佳大小)。 + +还可以通过使用 **allocateDirect()** 而不是 **allocation()** 来生成一个“直接”缓冲区来获得更快的速度,该缓冲区可以与操作系统进行更高的耦合。然而,这种分配的开销更大,而且实际实现因操作系统的不同而有所不同,因此,您必须再次试验您的工作应用程序,以发现直接缓冲区是否会为您带来速度上的优势。 + +一旦您调用 **read()** 来告诉 **FileChannel** 将字节存储到 **ByteBuffer** 中,您必须调用缓冲区上的 **flip()**来告诉它准备好提取字节(是的,这看起来有点粗糙,但是请记住,这是非常低级的,而且是为了达到最高速度)。如果我们要为进一步的 **read()** 操作使用缓冲区,我们还将调用 **clear()** 为每个 **read()** 准备缓冲区。这个简单的文件复制程序演示: + +```java +// newio/ChannelCopy.java + +// Copying a file using channels and buffers +// {java ChannelCopy ChannelCopy.java test.txt} +import java.nio.*; +import java.nio.channels.*; +import java.io.*; + +public class ChannelCopy { + private static final int BSIZE = 1024; + public static void main(String[] args) { + if(args.length != 2) { + System.out.println( + "arguments: sourcefile destfile"); + System.exit(1); + } + try( + FileChannel in = new FileInputStream( + args[0]).getChannel(); + FileChannel out = new FileOutputStream( + args[1]).getChannel() + ) { + ByteBuffer buffer = ByteBuffer.allocate(BSIZE); + while(in.read(buffer) != -1) { + buffer.flip(); // Prepare for writing + out.write(buffer); + buffer.clear(); // Prepare for reading + } + } catch(IOException e) { + throw new RuntimeException(e); + } + } +} + +``` + +打开一个 **FileChannel** 用于读取,另一个 **FileChannel** 用于写入。分配了一个 **ByteBuffer**,当**FileChannel.read() **返回 **-1** 时(毫无疑问,这是Unix和C语言中的一个剩余物 (holdover) ),意味着您已经完成了输入。每次 **read()** 将数据放入缓冲区之后,**flip()** 都会准备好缓冲区,以便 **write()** 提取它的信息。写()之后,信息仍然在缓冲区中,**clear()** 重置所有内部指针,以便在另一次 **read()** 期间接受数据。 + +但是,前面的程序并不是处理这种操作的理想方法。特殊方法 transferTo() 和 transferFrom( )允许你直接连接一个通道到另一个: + +```java +// newio/TransferTo.java + +// Using transferTo() between channels +// {java TransferTo TransferTo.java TransferTo.txt} +import java.nio.channels.*; +import java.io.*; + +public class TransferTo { + public static void main(String[] args) { + if(args.length != 2) { + System.out.println( + "arguments: sourcefile destfile"); + System.exit(1); + } + try( + FileChannel in = new FileInputStream( + args[0]).getChannel(); + FileChannel out = new FileOutputStream( + args[1]).getChannel() + ) { + in.transferTo(0, in.size(), out); + // Or: + // out.transferFrom(in, 0, in.size()); + } catch(IOException e) { + throw new RuntimeException(e); + } + } +} +``` + +你不会经常这样做,但知道这一点很好。 + + + +## 转换数据 + +在 **GetChannel** 中打印文件中的信息。在 java 中,我们每次提取一个字节的数据,并将每个字节转换为 char。这看起来很简单——如果您查看**java.nio.CharBuffer** 类,您将看到它有一个toString()方法,该方法说,“返回一个包含这个缓冲区中的字符的字符串。” + +既然 **ByteBuffer** 可以用 **asCharBuffer()** 方法看作 **CharBuffer**,为什么不使用它呢? 从下面输出语句的第一行可以看出,这并不正确: + +```java +// newio/BufferToText.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Converting text to and from ByteBuffers +import java.nio.*; +import java.nio.channels.*; +import java.nio.charset.*; +import java.io.*; + +public class BufferToText { + private static final int BSIZE = 1024; + public static void main(String[] args) { + try( + FileChannel fc = new FileOutputStream( + "data2.txt").getChannel() + ) { + fc.write(ByteBuffer.wrap("Some text".getBytes())); + } catch(IOException e) { + throw new RuntimeException(e); + } + ByteBuffer buff = ByteBuffer.allocate(BSIZE); + try( + FileChannel fc = new FileInputStream( + "data2.txt").getChannel() + ) { + fc.read(buff); + } catch(IOException e) { + throw new RuntimeException(e); + } + buff.flip(); + // Doesn't work: + System.out.println(buff.asCharBuffer()); + // Decode using this system's default Charset: + buff.rewind(); + String encoding = + System.getProperty("file.encoding"); + System.out.println("Decoded using " + + encoding + ": " + + Charset.forName(encoding).decode(buff)); + // Encode with something that prints: + try( + FileChannel fc = new FileOutputStream( + "data2.txt").getChannel() + ) { + fc.write(ByteBuffer.wrap( + "Some text".getBytes("UTF-16BE"))); + } catch(IOException e) { + throw new RuntimeException(e); + } + // Now try reading again: + buff.clear(); + try( + FileChannel fc = new FileInputStream( + "data2.txt").getChannel() + ) { + fc.read(buff); + } catch(IOException e) { + throw new RuntimeException(e); + } + buff.flip(); + System.out.println(buff.asCharBuffer()); + // Use a CharBuffer to write through: + buff = ByteBuffer.allocate(24); + buff.asCharBuffer().put("Some text"); + try( + FileChannel fc = new FileOutputStream( + "data2.txt").getChannel() + ) { + fc.write(buff); + } catch(IOException e) { + throw new RuntimeException(e); + } + // Read and display: + buff.clear(); + try( + FileChannel fc = new FileInputStream( + "data2.txt").getChannel() + ) { + fc.read(buff); + } catch(IOException e) { + throw new RuntimeException(e); + } + buff.flip(); + System.out.println(buff.asCharBuffer()); + } +} +/* Output: +???? +Decoded using windows-1252: Some text +Some text +Some textNULNULNUL +*/ +``` + +缓冲区包含普通字节,为了将这些字节转换为字符,我们必须在输入时对它们进行编码(这样它们输出时就有意义了),或者在输出时对它们进行解码。 + +这可以使用 **java.nio.charset** 来完成。**Charset** 类,它提供工具来编码成许多不同类型的字符集: + +```java +// newio/AvailableCharSets.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Displays Charsets and aliases +import java.nio.charset.*; +import java.util.*; + +public class AvailableCharSets { + public static void main(String[] args) { + SortedMap charSets = + Charset.availableCharsets(); + for(String csName : charSets.keySet()) { + System.out.print(csName); + Iterator aliases = charSets.get(csName) + .aliases().iterator(); + if(aliases.hasNext()) + System.out.print(": "); + while(aliases.hasNext()) { + System.out.print(aliases.next()); + if(aliases.hasNext()) + System.out.print(", "); + } + System.out.println(); + } + } +} +/* Output: (First 7 Lines) +Big5: csBig5 +Big5-HKSCS: big5-hkscs, big5hk, Big5_HKSCS, big5hkscs +CESU-8: CESU8, csCESU-8 +EUC-JP: csEUCPkdFmtjapanese, x-euc-jp, eucjis, +Extended_UNIX_Code_Packed_Format_for_Japanese, euc_jp, +eucjp, x-eucjp +EUC-KR: ksc5601-1987, csEUCKR, ksc5601_1987, ksc5601, +5601, +euc_kr, ksc_5601, ks_c_5601-1987, euckr +GB18030: gb18030-2000 +GB2312: gb2312, euc-cn, x-EUC-CN, euccn, EUC_CN, +gb2312-80, +gb2312-1980 + ... +*/ +``` + +回到 **BufferToText** 。java 中,如果您 **rewind()** 缓冲区(回到数据的开头),然后使用该平台的默认字符集 **decode()** 数据,生成的 **CharBuffer** 将在控制台上正常显示。要发现默认字符集,使用**System.getProperty(“file.encoding”)**,它生成命名字符集的字符串。 + +另一种方法是使用字符集 **encode()**,该字符集在读取文件时生成可打印的内容,如您在**BufferToText.java** 的第三部分中所看到的。这里,**UTF-16BE** 用于将文本写入文件,当读取文本时,您所要做的就是将其转换为 **CharBuffer**,并生成预期的文本。最后,您将看到如果通过**CharBuffer** 写入 **ByteBuffer** 会发生什么(稍后您将对此有更多的了解)。注意,为 **ByteBuffer** 分配了24个字节。 + +由于每个字符需要两个字节,这对于12个字符已经足够了,但是“some text”只有9个字节。其余的零字节仍然出现在由其toString()生成的CharBuffer的表示中,如输出所示。 + + + +## 获取原始类型 + +虽然 **ByteBuffer** 只包含字节,但它包含了一些方法,用于从它所包含的字节中生成每种不同类型的基元值。这个例子展示了使用以下方法插入和提取各种值: + +```java +// newio/GetData.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Getting different representations from a ByteBuffer +import java.nio.*; + +public class GetData { + private static final int BSIZE = 1024; + public static void main(String[] args) { + ByteBuffer bb = ByteBuffer.allocate(BSIZE); + // Allocation automatically zeroes the ByteBuffer: + int i = 0; + while(i++ < bb.limit()) + if(bb.get() != 0) + System.out.println("nonzero"); + System.out.println("i = " + i); + bb.rewind(); + // Store and read a char array: + bb.asCharBuffer().put("Howdy!"); + char c; + while((c = bb.getChar()) != 0) + System.out.print(c + " "); + System.out.println(); + bb.rewind(); + // Store and read a short: + bb.asShortBuffer().put((short)471142); + System.out.println(bb.getShort()); + bb.rewind(); + // Store and read an int: + bb.asIntBuffer().put(99471142); + System.out.println(bb.getInt()); + bb.rewind(); + // Store and read a long: + bb.asLongBuffer().put(99471142); + System.out.println(bb.getLong()); + bb.rewind(); + // Store and read a float: + bb.asFloatBuffer().put(99471142); + System.out.println(bb.getFloat()); + bb.rewind(); + // Store and read a double: + bb.asDoubleBuffer().put(99471142); + System.out.println(bb.getDouble()); + bb.rewind(); + } +} +/* Output: +i = 1025 +H o w d y ! +12390 +99471142 +99471142 +9.9471144E7 +9.9471142E7 +*/ +``` + +在分配 **ByteBuffer** 之后,将检查它的值,以确定缓冲区分配是否会自动将内容归零——它确实会这样做。检查所有1,024个值(直到 position的值为 缓冲区的 **limit()** ),所有值都为零。 + +将原始值插入ByteBuffer的最简单方法是使用 **asCharBuffer()** 、**asShortBuffer()** 等获取该缓冲区的适当“视图”,然后使用该视图的 **put()** 方法。 + + +这将对每个基本数据类型执行。其中唯一有点奇怪的是 **ShortBuffer** 的 **put()**,它需要强制转换 (强制转换并更改结果值)。所有其他视图缓冲区都不需要在它们的 **put()** 方法中强制转换。 + + + +## 视图缓冲区 + +“视图缓冲区”通过特定原始类型的窗口来查看底层 **ByteBuffer**。**ByteBuffer** 仍然是“支持”视图的实际存储,因此对视图所做的任何更改都反映在对 **ByteBuffer** 中的数据的修改中。 + +如前面的示例所示,这方便地将基本类型插入 **ByteBuffer**。视图缓冲区还可以从 **ByteBuffer** 读取原始值,一次读取一个(ByteBuffer允许),或者批量读取(数组)。下面是一个通过 **IntBuffer**在**ByteBuffer** 中操作 int 的例子: + +```java +// newio/IntBufferDemo.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Manipulating ints in a ByteBuffer with an IntBuffer +import java.nio.*; + +public class IntBufferDemo { + private static final int BSIZE = 1024; + public static void main(String[] args) { + ByteBuffer bb = ByteBuffer.allocate(BSIZE); + IntBuffer ib = bb.asIntBuffer(); + // Store an array of int: + ib.put(new int[]{ 11, 42, 47, 99, 143, 811, 1016 }); + // Absolute location read and write: + System.out.println(ib.get(3)); + ib.put(3, 1811); + // Setting a new limit before rewinding the buffer. + ib.flip(); + while(ib.hasRemaining()) { + int i = ib.get(); + System.out.println(i); + } + } +} +/* Output: +99 +11 +42 +47 +1811 +143 +811 +1016 +*/ +``` + +重载的 **put()** 方法首先用于存储 **int** 数组。下面的 **get()** 和 **put()** 方法调用直接访问底层 **ByteBuffer** 中的 **int** 位置。请注意,通过直接操作 **ByteBuffer** ,这些绝对位置访问也可以用于基本类型。 + +一旦底层 **ByteBuffer** 通过视图缓冲区填充了 **int** 或其他基本类型,那么就可以直接将该 **ByteBuffer **写入通道。您可以轻松地从通道读取数据,并使用视图缓冲区将所有内容转换为特定类型的原语。下面是一个例子,通过在同一个 **ByteBuffer** 上生成不同的视图缓冲区,将相同的字节序列解释为 **short**、**int**、**float**、**long **和 **double**: + +```java +// newio/ViewBuffers.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.nio.*; + +public class ViewBuffers { + public static void main(String[] args) { + ByteBuffer bb = ByteBuffer.wrap( + new byte[]{ 0, 0, 0, 0, 0, 0, 0, 'a' }); + bb.rewind(); + System.out.print("Byte Buffer "); + while(bb.hasRemaining()) + System.out.print( + bb.position()+ " -> " + bb.get() + ", "); + System.out.println(); + CharBuffer cb = + ((ByteBuffer)bb.rewind()).asCharBuffer(); + System.out.print("Char Buffer "); + while(cb.hasRemaining()) + System.out.print( + cb.position() + " -> " + cb.get() + ", "); + System.out.println(); + FloatBuffer fb = + ((ByteBuffer)bb.rewind()).asFloatBuffer(); + System.out.print("Float Buffer "); + while(fb.hasRemaining()) + System.out.print( + fb.position()+ " -> " + fb.get() + ", "); + System.out.println(); + IntBuffer ib = + ((ByteBuffer)bb.rewind()).asIntBuffer(); + System.out.print("Int Buffer "); + while(ib.hasRemaining()) + System.out.print( + ib.position()+ " -> " + ib.get() + ", "); + System.out.println(); + LongBuffer lb = + ((ByteBuffer)bb.rewind()).asLongBuffer(); + System.out.print("Long Buffer "); + while(lb.hasRemaining()) + System.out.print( + lb.position()+ " -> " + lb.get() + ", "); + System.out.println(); + ShortBuffer sb = + ((ByteBuffer)bb.rewind()).asShortBuffer(); + System.out.print("Short Buffer "); + while(sb.hasRemaining()) + System.out.print( + sb.position()+ " -> " + sb.get() + ", "); + System.out.println(); + DoubleBuffer db = + ((ByteBuffer)bb.rewind()).asDoubleBuffer(); + System.out.print("Double Buffer "); + while(db.hasRemaining()) + System.out.print( + db.position()+ " -> " + db.get() + ", "); + } +} +/* Output: +Byte Buffer 0 -> 0, 1 -> 0, 2 -> 0, 3 -> 0, 4 -> 0, 5 +-> 0, 6 -> 0, 7 -> 97, +Char Buffer 0 -> NUL, 1 -> NUL, 2 -> NUL, 3 -> a, +Float Buffer 0 -> 0.0, 1 -> 1.36E-43, +Int Buffer 0 -> 0, 1 -> 97, +Long Buffer 0 -> 97, +Short Buffer 0 -> 0, 1 -> 0, 2 -> 0, 3 -> 97, +Double Buffer 0 -> 4.8E-322, +*/ +``` + +**ByteBuffer** 通过“包装”一个8字节数组生成,然后通过所有不同基本类型的视图缓冲区显示该数组。下图显示了从不同类型的缓冲区读取数据时,数据显示的差异: + +![image-20190324153222402](/Users/langdon/Library/Application Support/typora-user-images/image-20190324153222402.png) + + + +### 端 + +不同的机器可以使用不同的字节顺序方法来存储数据。“Big endian”将最重要的字节(the most significant byte)放在最低内存地址中,而“little endian”将最重要的字节放在最高内存地址中。 + +当存储一个大于一个字节的量时,例如 **int**、**float** 等,您可能需要考虑字节排序。字节缓冲区以大端字节形式存储数据,通过网络发送的数据总是使用大端字节顺序。您可以使用 **order()** 和**ByteOrder** 参数来更改 **ByteBuffer** 端,可选参数只有2个:**ByteOrder.BIG_ENDIAN** 或 **ByteOrder.LITTLE_ENDIAN**。 + +考虑一个包含以下两个字节的 **ByteBuffer** :将数据作为一个**short** (**ByteBuffer. asshortbuffer()**) 读取,生成数字 97 (00000000 01100001)。更改为 little endian 将生成数字 24832 (01100001 00000000)。 + +这显示了字节顺序的变化取决于 endian 设置: + +```java +// newio/Endians.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Endian differences and data storage +import java.nio.*; +import java.util.*; + +public class Endians { + public static void main(String[] args) { + ByteBuffer bb = ByteBuffer.wrap(new byte[12]); + bb.asCharBuffer().put("abcdef"); + System.out.println(Arrays.toString(bb.array())); + bb.rewind(); + bb.order(ByteOrder.BIG_ENDIAN); + bb.asCharBuffer().put("abcdef"); + System.out.println(Arrays.toString(bb.array())); + bb.rewind(); + bb.order(ByteOrder.LITTLE_ENDIAN); + bb.asCharBuffer().put("abcdef"); + System.out.println(Arrays.toString(bb.array())); + } +} +/* Output: +[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102] +[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102] +[97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102, 0] +*/ + +``` + +**ByteBuffer** 分配空间将 **charArray** 中的所有字节作为外部缓冲区保存,因此可以调用 **array()** 方法来显示底层字节。**array()** 方法是“可选的”,您只能在数组支持的缓冲区上调用它 ,否则您将得到一个 **UnsupportedOperationException**。 + +**charArray** 通过 **CharBuffer** 视图插入到 **ByteBuffer **中。当显示底层字节时,默认顺序与随后的大端序相同,而小端序则交换字节。 + + + +## 使用缓冲区进行数据操作 + +下图说明了 nio 类之间的关系,展示了如何移动和转换数据。例如,要将字节数组写入文件,使用ByteBuffer.wrap() 方法包装字节数组,使用 **getChannel()** 在 **FileOutputStream** 上打开通道,然后从 **ByteBuffer** 将数据写入 **FileChannel**。 + +![image-20190324153202297](/Users/langdon/Library/Application Support/typora-user-images/image-20190324153202297.png) + +**ByteBuffer** 是将数据移入和移出通道的唯一方法,您只能创建一个独立的原始类型的缓冲区,或者使用“as”方法从ByteBuffer获得一个新缓冲区。也就是说,不能将基元类型的缓冲区转换为ByteBuffer。但您能够通过视图缓冲区将原始数据移动到 **ByteBuffer** 中或移出 **ByteBuffer**。 + + + +### 缓冲区的细节 + +缓冲区由数据和四个索引组成,以有效地访问和操作该数据: 标记、位置、限制 和 容量(mark, position, limit and capacity)。有一些方法可以设置和重置这些索引并查询它们的值。 + +**capacity()** 返回缓冲区的 capacity。 + +**clear()** 清除缓冲区,将 position 设置为零并 设 limit 为 capacity。您可以调用此方法来覆盖现有缓冲区。 + +**flip()** 将 limit 设置为位置,并将 position 设置为零。此方法用于准备缓冲区,以便在数据写入缓冲区后进行读取。 + +**limit()** 返回 limit 的值。 + +**limit(int lim)** 重设 limit + +**mark()** 设置 mark 为当前的 position + +**position()** 返回 position + +**position(int pos) ** 设置 position + +**remaining()** 返回 limit - position 。 + +**hasRemaining()** 如果在 position 与 limit 中间有元素,返回 **true** + +从缓冲区插入和提取数据的方法更新这些索引来反映所做的更改。这个例子使用了一个非常简单的算法(交换相邻的字符)来打乱和整理字符在CharBuffer: + +```java +// newio/UsingBuffers.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.nio.*; + +public class UsingBuffers { + private static + void symmetricScramble(CharBuffer buffer) { + while(buffer.hasRemaining()) { + buffer.mark(); + char c1 = buffer.get(); + char c2 = buffer.get(); + buffer.reset(); + buffer.put(c2).put(c1); + } + } + public static void main(String[] args) { + char[] data = "UsingBuffers".toCharArray(); + ByteBuffer bb = + ByteBuffer.allocate(data.length * 2); + CharBuffer cb = bb.asCharBuffer(); + cb.put(data); + System.out.println(cb.rewind()); + symmetricScramble(cb); + System.out.println(cb.rewind()); + symmetricScramble(cb); + System.out.println(cb.rewind()); + } +} +/* Output: +UsingBuffers +sUniBgfuefsr +UsingBuffers +*/ +``` + +虽然可以通过使用 **char** 数组调用 **wrap()** 直接生成 **CharBuffer**,但是底层的 **ByteBuffer** 将被分配,而 **CharBuffer** 将作为 **ByteBuffer** 上的视图生成。这强调了目标始终是操作 **ByteBuffer**,因为它与通道交互。 + +下面是程序在 **symmetricgrab()** 方法入口时缓冲区的样子: + +![image-20190324155153600](/Users/langdon/Library/Application Support/typora-user-images/image-20190324155153600.png) + +position 指向缓冲区中的第一个元素,capacity 和 limie 紧接在最后一个元素之后。在**symmetricgrab()** 中,while循环迭代到 position 等于 limit。当在缓冲区上调用相对位置的 get() 或 put() 函数时,缓冲区的位置会发生变化。您还可以调用绝对位置的 get() 和 put() 方法,它们包含索引参数 : get()或put()发生的位置。这些方法不修改缓冲区 position 的值。 + +当控件进入while循环时,使用 **mark()** 调用设置 mark 的值。缓冲区的状态为: + +两个相对 get() 调用将前两个字符的值保存在变量c1和c2中。在这两个调用之后,缓冲区看起来是这样的 : 为了执行交换,我们在位置0处编写c2,在位置1处编写c1。我们可以使用绝对put方法来实现这一点,或者用 reset() 方法,将 position 的值设置为 mark 。 + +两个put()方法分别编写c2和c1 : 在循环的下一次迭代中,将mark设置为position的当前值 : 该过程将继续,直到遍历整个缓冲区为止。在while循环的末尾,position位于缓冲区的末尾。如果显示缓冲区,则只显示位置和限制之间的字符。因此,要显示缓冲区的全部内容,必须使用 rewind() 将位置设置为缓冲区的开始位置。这是 rewind() 调用后 buffer 的状态(mark的值变成undefined): + +![image-20190324155528149](/Users/langdon/Library/Application Support/typora-user-images/image-20190324155528149.png) + +再次调用 **symmetricgrab()** 函数时,**CharBuffer** 将经历相同的过程并恢复到原始状态。 + + + +## 内存映射文件 + +内存映射文件允许您创建和修改太大而无法放入内存的文件。使用内存映射文件,您可以假装整个文件都在内存中,并将其视为一个非常大的数组来访问它。这种方法大大简化了您编写的修改文件的代码: + +```java +// newio/LargeMappedFiles.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Creating a very large file using mapping +import java.nio.*; +import java.nio.channels.*; +import java.io.*; + +public class LargeMappedFiles { + static int length = 0x8000000; // 128 MB + public static void + main(String[] args) throws Exception { + try( + RandomAccessFile tdat = + new RandomAccessFile("test.dat", "rw") + ) { + MappedByteBuffer out = tdat.getChannel().map( + FileChannel.MapMode.READ_WRITE, 0, length); + for(int i = 0; i < length; i++) + out.put((byte)'x'); + System.out.println("Finished writing"); + for(int i = length/2; i < length/2 + 6; i++) + System.out.print((char)out.get(i)); + } + } +} +/* Output: +Finished writing +xxxxxx +*/ +``` + +为了读写,我们从 **RandomAccessFile** 开始,获取该文件的通道,然后调用 **map()** 来生成**MappedByteBuffer** ,这是一种特殊的直接缓冲区。您必须指定要在文件中映射的区域的起始点和长度—这意味着您可以选择映射大文件的较小区域。**MappedByteBuffer** 继承了它的**ByteBuffer**,所以它有所有的 **ByteBuffer **方法。这里只展示了 **put()** 和 **get()** 的最简单用法,但是您也可以使用 **asCharBuffer()** 等方法。 + +使用前面的程序创建的文件有128mb长,可能比您的操作系统一次允许的内存要大。该文件似乎可以同时访问,因为它只有一部分被带进内存,而其他部分被交换出去。这样,一个非常大的文件(最多2gb)可以很容易地修改。注意,底层操作系统的文件映射工具用于最大化性能。 + +### 性能 + +虽然“旧”流I/O的性能通过使用 **nio** 实现得到了改进,但是映射文件访问往往要快得多。这个程序做一个简单的性能比较: + +```java +// newio/MappedIO.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; +import java.nio.*; +import java.nio.channels.*; +import java.io.*; + +public class MappedIO { + private static int numOfInts = 4_000_000; + private static int numOfUbuffInts = 100_000; + private abstract static class Tester { + private String name; + Tester(String name) { + this.name = name; + } + public void runTest() { + System.out.print(name + ": "); + long start = System.nanoTime(); + test(); + double duration = System.nanoTime() - start; + System.out.format("%.3f%n", duration/1.0e9); + } + public abstract void test(); + } + private static Tester[] tests = { + new Tester("Stream Write") { + @Override + public void test() { + try( + DataOutputStream dos = + new DataOutputStream( + new BufferedOutputStream( + new FileOutputStream( + new File("temp.tmp")))) + ) { + for(int i = 0; i < numOfInts; i++) + dos.writeInt(i); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + }, + new Tester("Mapped Write") { + @Override + public void test() { + try( + FileChannel fc = + new RandomAccessFile("temp.tmp", "rw") + .getChannel() + ) { + IntBuffer ib = + fc.map(FileChannel.MapMode.READ_WRITE, + 0, fc.size()).asIntBuffer(); + for(int i = 0; i < numOfInts; i++) + ib.put(i); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + }, + new Tester("Stream Read") { + @Override + public void test() { + try( + DataInputStream dis = + new DataInputStream( + new BufferedInputStream( + new FileInputStream("temp.tmp"))) + ) { + for(int i = 0; i < numOfInts; i++) + dis.readInt(); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + }, + new Tester("Mapped Read") { + @Override + public void test() { + try( + FileChannel fc = new FileInputStream( + new File("temp.tmp")).getChannel() + ) { + IntBuffer ib = + fc.map(FileChannel.MapMode.READ_ONLY, + 0, fc.size()).asIntBuffer(); + while(ib.hasRemaining()) + ib.get(); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + }, + new Tester("Stream Read/Write") { + @Override + public void test() { + try( + RandomAccessFile raf = + new RandomAccessFile( + new File("temp.tmp"), "rw") + ) { + raf.writeInt(1); + for(int i = 0; i < numOfUbuffInts; i++) { + raf.seek(raf.length() - 4); + raf.writeInt(raf.readInt()); + } + } catch(IOException e) { + throw new RuntimeException(e); + } + } + }, + new Tester("Mapped Read/Write") { + @Override + public void test() { + try( + FileChannel fc = new RandomAccessFile( + new File("temp.tmp"), "rw").getChannel() + ) { + IntBuffer ib = + fc.map(FileChannel.MapMode.READ_WRITE, + 0, fc.size()).asIntBuffer(); + ib.put(0); + for(int i = 1; i < numOfUbuffInts; i++) + ib.put(ib.get(i - 1)); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + } + }; + public static void main(String[] args) { + Arrays.stream(tests).forEach(Tester::runTest); + } +} +/* Output: +Stream Write: 0.615 +Mapped Write: 0.050 +Stream Read: 0.577 +Mapped Read: 0.015 +Stream Read/Write: 4.069 +Mapped Read/Write: 0.013 +*/ +``` + +**Tester** 是一个模板方法模式,它为匿名内部子类中定义的 **test()** 的各种实现创建一个测试框架。每个子类都执行一种测试,因此 test() 方法还为您提供了执行各种I/O活动的原型。 + +虽然映射的写似乎使用 **FileOutputStream**,但是文件映射中的所有输出必须使用 **RandomAccessFile**,就像前面代码中的读/写一样。 + +请注意,**test()** 方法包括初始化各种I/O对象的时间,因此,尽管映射文件的设置可能很昂贵,但是与流I/O相比,总体收益非常可观。 + + + +### 文件锁定 + +文件锁定同步访问,因此文件可以是共享资源。但是,争用同一个文件的两个线程可能位于不同的jvm 中,可能一个是 Java 线程,另一个是操作系统中的某个本机线程。文件锁定对其他操作系统进程是可见的,因为Java文件锁定直接映射到本机操作系统锁定工具。 + +```java +// newio/FileLocking.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.nio.channels.*; +import java.util.concurrent.*; +import java.io.*; + +public class FileLocking { + public static void main(String[] args) { + try( + FileOutputStream fos = + new FileOutputStream("file.txt"); + FileLock fl = fos.getChannel().tryLock() + ) { + if(fl != null) { + System.out.println("Locked File"); + TimeUnit.MILLISECONDS.sleep(100); + fl.release(); + System.out.println("Released Lock"); + } + } catch(IOException | InterruptedException e) { + throw new RuntimeException(e); + } + } +} +/* Output: +Locked File +Released Lock +*/ +``` + +通过调用 **FileChannel** 上的 **tryLock()** 或 **lock()**,可以获得整个文件的 **FileLock**。( **SocketChannel、DatagramChannel **和 **ServerSocketChannel **不需要锁定,因为它们本质上是单进程实体 ; 通常不会在两个进程之间共享一个网络套接字) **tryLock()** 是非阻塞的。它试图抓住锁,但如果它不能抓住了(当其他进程已经持有相同的锁,并且它不是共享的),它只是从方法调用返回。 + +**lock()** 会阻塞,直到获得锁,或者调用 **lock()** 的线程中断,或者调用 **lock()** 方法的通道关闭。使 用**FileLock.release()** 释放锁。还可以使用 **tryLock(long position, long size, boolean shared)** 或**lock(long position, long size, boolean shared)** 锁定文件的一部分,锁住该区域(size-position)。第三个参数指定是否共享此锁。 + +虽然零参数锁定方法适应文件大小的变化,但是如果文件大小发生变化,具有固定大小的锁不会发生变化。如果从一个位置到另一个位置获得一个锁,并且文件的增长超过了 position + size ,那么超出位置+大小的部分没有被锁定。零参数锁定方法锁定整个文件,即使它在增长。 + +底层操作系统必须提供对独占锁或共享锁的支持。如果操作系统不支持共享锁,并且请求共享锁,则使用独占锁。可以使用 **FileLock.isShared()** 查询锁的类型 (共享或独占)。 + + + +### 锁定映射文件的某些部分 + +文件映射通常用于非常大的文件。您可能需要锁定此类文件的某些部分,以便其他进程可以修改未锁定的部分。例如,数据库必须同时对许多用户可用。这里你可以看到两个线程,每个线程都锁定文件的不同部分: + +```java +// newio/LockingMappedFiles.java +// (c)2017 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Locking portions of a mapped file +import java.nio.*; +import java.nio.channels.*; +import java.io.*; + +public class LockingMappedFiles { + static final int LENGTH = 0x8FFFFFF; // 128 MB + static FileChannel fc; + public static void + main(String[] args) throws Exception { + fc = new RandomAccessFile("test.dat", "rw") + .getChannel(); + MappedByteBuffer out = fc.map( + FileChannel.MapMode.READ_WRITE, 0, LENGTH); + for(int i = 0; i < LENGTH; i++) + out.put((byte)'x'); + new LockAndModify(out, 0, 0 + LENGTH/3); + new LockAndModify( + out, LENGTH/2, LENGTH/2 + LENGTH/4); + } + private static class LockAndModify extends Thread { + private ByteBuffer buff; + private int start, end; + LockAndModify(ByteBuffer mbb, int start, int end) { + this.start = start; + this.end = end; + mbb.limit(end); + mbb.position(start); + buff = mbb.slice(); + start(); + } + @Override + public void run() { + try { + // Exclusive lock with no overlap: + FileLock fl = fc.lock(start, end, false); + System.out.println( + "Locked: "+ start +" to "+ end); + // Perform modification: + while(buff.position() < buff.limit() - 1) + buff.put((byte)(buff.get() + 1)); + fl.release(); + System.out.println( + "Released: " + start + " to " + end); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + } +} +/* Output: +Locked: 75497471 to 113246206 +Locked: 0 to 50331647 +Released: 75497471 to 113246206 +Released: 0 to 50331647 +*/ + +``` + +**LockAndModify** 线程类设置缓冲区并创建要修改的 **slice()**,在 **run()** 中,锁在文件通道上获取(不能在缓冲区上获取锁—只能在通道上获取锁)。**lock()** 的调用非常类似于获取对象上的线程锁——现在有了一个“临界区”,可以对文件的这部分进行独占访问。[^1] + +当 JVM 退出或关闭获取锁的通道时,锁会自动释放,但是您也可以显式地调用 **FileLock** 对象上的**release()**,如上所示。 + + + +1. 您可以在附录:低级并发中找到关于线程的更多细节。 \ No newline at end of file From c0f16c3c7d6d435310118fab140a4879b23bd1d9 Mon Sep 17 00:00:00 2001 From: nickchen Date: Sun, 24 Mar 2019 16:15:47 +0800 Subject: [PATCH 034/814] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E3=80=81=E4=BA=94?= =?UTF-8?q?=E7=AB=A0=E6=96=87=E5=AD=97=E6=A0=A1=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/03-Objects-Everywhere.md | 25 ++++++------- book/05-Control-Flow.md | 70 ++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index 5f0a8dbf..507a9c0a 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -469,10 +469,10 @@ Incrementable.increment(); // objects/HelloDate.java import java.util.*; - public class HelloDate { +public class HelloDate { public static void main(String[] args) { - System.out.println("Hello, it's: "); - System.out.println(new Date()); + System.out.println("Hello, it's: "); + System.out.println(new Date()); } } @@ -488,14 +488,14 @@ import java.util.*; 现在,我们可以找到 Java 附带的每个类。使用浏览器的“查找”功能查找 “Date”。搜索结果中将会列出 java.util.Date,显而易见,它在 util 库中,所以我们必须导入 java.util.* 才能使用 Date。 -如果你在文档中选择 java.lang,然后选择 System,你会看到 System 类中有几个字段,如果你选择 `out`,你会发现它是一个静态的 PrintStream 对象。 所以,即使我们没有使用 new 创建, `out` 对象就已经存在并可以使用。 `out` 对象可以执行的操作取决于 PrintStream 。 其在文档中的描述中显示为超链接,如果单击该链接,我们将可以看到 PrintStream 所对应的方法列表。(更多详情,将在本书后面介绍。) 现在我们重点说的是 println()这个方法。 它的作用是“j将信息输出到控制台,并以换行符结束。” 既然如此,我们可以这样编码来输出信息到控制带。 代码示例: +如果你在文档中选择 java.lang,然后选择 System,你会看到 System 类中有几个字段,如果你选择 `out`,你会发现它是一个静态的 PrintStream 对象。 所以,即使我们没有使用 new 创建, `out` 对象就已经存在并可以使用。 `out` 对象可以执行的操作取决于 PrintStream 。 其在文档中的描述中显示为超链接,如果单击该链接,我们将可以看到 PrintStream 所对应的方法列表。(更多详情,将在本书后面介绍。) 现在我们重点说的是 println() 这个方法。 它的作用是 “将信息输出到控制台,并以换行符结束。” 既然如此,我们可以这样编码来输出信息到控制台。 代码示例: ```JAVA System.out.println("A String of things"); ``` -每个 java 源文件中允许有多个类。与此同时,源文件的名称必须要和其中一个类名相同,否则编译器将会报错。每个独立的程序应该包含一个 mian 方法作为程序运行的入口。其方法签名和返回类型如下。代码示例: +每个 java 源文件中允许有多个类。与此同时,源文件的名称必须要和其中一个类名相同,否则编译器将会报错。每个独立的程序应该包含一个 main 方法作为程序运行的入口。其方法签名和返回类型如下。代码示例: ```JAVA public static void main(String[] args) { @@ -503,7 +503,7 @@ public static void main(String[] args) { } ``` -关键字 `public` 表示方法可以被外界锁访问到。( 更多详情将在 **隐藏实现** 章节讲到) +关键字 `public` 表示方法可以被外界访问到。( 更多详情将在 **隐藏实现** 章节讲到) main() 方法的参数是一个 字符串(String) 数组。 参数 `args` 并没有在当前的程序中使用到,但是 Java 虚拟机强制要求必须要有。 这是因为它们被用于保存命令行中的参数。 下面我们来看一段有趣的代码: @@ -520,12 +520,11 @@ System.out.println(new Date()); // objects/ShowProperties.java public class ShowProperties { -public static void main(String[] args) { -System.getProperties().list(System.out); -System.out.println(System.getProperty("user.name")); -System.out.println( -System.getProperty("java.library.path")); -} + public static void main(String[] args) { + System.getProperties().list(System.out); + System.out.println(System.getProperty("user.name")); + System.out.println(System.getProperty("java.library.path")); + } } /* Output:(前20行) @@ -597,7 +596,7 @@ class AllTheColorsOfTheRainbow { int anIntegerRepresentingColors; void changeTheHueOfTheColor(int newHue) { // ... - } + } // ... } diff --git a/book/05-Control-Flow.md b/book/05-Control-Flow.md index 6aac1b1d..3c7ee4f5 100644 --- a/book/05-Control-Flow.md +++ b/book/05-Control-Flow.md @@ -2,13 +2,13 @@ > 程序操纵它的世界并做出选择。 在Java中,您可以使用执行控制语句进行选择。 -Java 使用 C 的所有执行控制语句,因此如果您使用 C 或 C++ 进行编程,那么您所看到的大部分内容都是熟悉的。 大多数过程编程语言都有某种控制语句,并且语言之间经常存在重叠。在 Java 中,关键字包括 **if-else,while,do-while,for,return,break** 和名为 **switch** 的选择语句。 但是,Java并不支持备受诟病的**goto**(它仍然是解决某些类型问题的最有效方法)。 你仍然可以进行类似goto的跳转,但它比其他语言中的**goto**更受限制。 +Java 使用 C 的所有执行控制语句,因此如果您使用 C 或 C++ 进行编程,那么您所看到的大部分内容都是熟悉的。 大多数过程编程语言都有某种控制语句,并且语言之间经常存在重叠。在 Java 中,关键字包括 **if-else,while,do-while,for,return,break** 和名为 **switch** 的选择语句。 但是,Java 并不支持备受诟病的 **goto**(它仍然是解决某些类型问题的最有效方法)。 你仍然可以进行类似goto的跳转,但它比其他语言中的 **goto** 更受限制。 [TOC] ## true和flase -条件表达式的示例是 **a == b**。这里有一个条件表达式示例,它使用条件操作符**“==”**来查看 **a**的值是否等于 **b** 的值。 表达式返回 **true** 或 **false**。 如果显示条件表达式的结果,则会生成表示布尔值的字符串 **“true”** 和 **“false”**。 +条件表达式的示例是 **a == b**。这里有一个条件表达式示例,它使用条件操作符 **==** 来查看 **a** 的值是否等于 **b** 的值。 表达式返回 **true** 或 **false**。 如果显示条件表达式的结果,则会生成表示布尔值的字符串 **true** 和 **false**。 ```java // control/TrueFalse.java @@ -22,7 +22,7 @@ public class TrueFalse { true false */ ``` -您在上一章中看到的任何关系运算符都可以生成条件语句。 请注意,Java 不允许您使用数字作为布尔值,即使它在 C 和 C++ 中允许(在这些语言中,真"为非零,而”假“是零)。如果想在布尔测试中使用非布尔值,例如**if(a**),必须首先使用一个条件表达式将其转换为布尔值,例如 **if(a!= 0)**。 +您在上一章中看到的任何关系运算符都可以生成条件语句。 请注意,Java 不允许您使用数字作为布尔值,即使它在 C 和 C++ 中允许(在这些语言中,“真”为非零,而“假”是零)。如果想在布尔测试中使用非布尔值,例如**if (a)**,必须首先使用一个条件表达式将其转换为布尔值,例如 **if (a!= 0)**。 ## if-else @@ -74,15 +74,15 @@ public class IfElse { */ ``` -**[1]** “else if”不是新关键字,只是一个else后跟一个新的if语句。 +**[1]** “else if” 不是新关键字,只是一个 else 后跟一个新的 if 语句。 -尽管Java(如之前的C和C ++)是一种“自由格式”语言,但通常会缩进控件流语句的主体,以便读者可以轻松确定它的开始和结束位置。 +尽管 Java(如之前的 C 和 C++)是一种“自由格式”语言,但通常会缩进控件流语句的主体,以便读者可以轻松确定它的开始和结束位置。 ## 迭代语句 -循环由 **while**,**do-while** 和 **for** 控制,有时称为迭代语句。 语句会重复执行,直到起控制作用的 **布尔表达式** (Boolean expression)计算为"假"。 +循环由 **while**,**do-while** 和 **for** 控制,有时称为迭代语句。 语句会重复执行,直到起控制作用的 **布尔表达式** (Boolean expression)计算为“假”。 ### while @@ -128,7 +128,7 @@ false, Exited 'while' */ ``` -**condition()** 方法用到了 **Math** 库里的 **static** (静态)方法 **random()**,该方法的作用是产生 0 和 1 之间 (包括 0,但不包括 1) 的一个**double**值。**result** 的值是通过比较操作符<而得到它的,这个操作符产生 **boolean** 类型的结果。在打印 **boolean** 类型的值时,将自动地得到适合的字符串 **true** 或 **false**。while 的条件表达式意思是说:"只要 **condition()**返回 **true**,就重复执行循环体中的语句"。 +**condition()** 方法用到了 **Math** 库里的 **static** (静态)方法 **random()**,该方法的作用是产生 0 和 1 之间 (包括 0,但不包括 1) 的一个**double**值。**result** 的值是通过比较操作符<而得到它的,这个操作符产生 **boolean** 类型的结果。在打印 **boolean** 类型的值时,将自动地得到适合的字符串 **true** 或 **false**。while 的条件表达式意思是说:“只要 **condition()**返回 **true**,就重复执行循环体中的语句”。 ### do-while @@ -181,7 +181,7 @@ value: 106 character: j */ ``` -请注意,变量 **c** 在程序用到它的地方被定义的,也就是在for循环的控制表达式内,而不是在 **main()** 的开头。**c** 的范围是由 **for** 控制的语句。 +请注意,变量 **c** 在程序用到它的地方被定义的,也就是在for循环的控制表达式内,而不是在 **main()** 的开头。**c** 的范围是由 **for** 控制的语句。 像C这样的传统过程语言要求在块的开头定义所有变量。 当编译器创建块时,它可以为这些变量分配空间。 在Java和C ++中,您可以在整个块中传播变量声明,并在需要时定义它们。 这允许更自然的编码风格并使代码更容易理解。[1] @@ -217,9 +217,9 @@ i = 4 j = 8 ## for-in语法 -Java 5引入了更简洁的 **for** 语法,用于数组和集合(您将在“数组和集合”章节中了解更多有关这些内容的信息)。 这有时被称为 **增强版for循环**,并且您将看到的大部分文档称为 *for-each* 语法,但Java 8添加了大量使用的 **forEach()**。 这会混淆术语,所以我拿了一些许可证,而是称之为*for-in* (例如,在Python中,你实际上是 **for x in sequence**,所以有合理的先例)。 请记住,您可能会在其他地方看到它的不同叫法。 +Java 5引入了更简洁的 **for** 语法,用于数组和集合(您将在“数组和集合”章节中了解更多有关这些内容的信息)。 这有时被称为 **增强版for循环**,并且您将看到的大部分文档称为 *for-each* 语法,但Java 8添加了大量使用的 **forEach()**。 这会混淆术语,因此我称之为*for-in* (例如,在Python中,你实际上是 **for x in sequence**,所以有合理的先例)。 请记住,您可能会在其他地方看到它的不同叫法。 -**for-in** 会自动为您生成每个项,因此你不必创建 **int** 变量去对由访问项构成的序列进行奇数。 例如,假设您有一个 **float** 数组,并且您想要选取该数组中的每个元素: +**for-in** 会自动为您生成每个项,因此你不必创建 **int** 变量去对由访问项构成的序列进行计数。 例如,假设您有一个 **float** 数组,并且您想要选取该数组中的每个元素: ```java // control/ForInFloat.java @@ -317,9 +317,9 @@ public class ForInInt { **range()** 方法已经被重载,重载表示相同的方法名可以具有不同的参数列表(你将很快学习重载)。**range()** 的第一个种重载形式是从0开始产生值,直到范围的上限,但不包括该上限。第二种重载形式是从第一个值开始产生值,直至比第二值小1的值为止。第三种形式有一个步进值,因此它每次的增量为该值。第四种 **range()** 表明还可以递减。**range()**是所谓生成器的一个非常简单的版本,有关生成器的内容将在本书稍后进行介绍。 -**range()** 允许在更多地方使用for-in语法,因此可以说提高可读性。 +**range()** 允许在更多地方使用 for-in 语法,因此可以说提高可读性。 -请注意,**System.out.print()** 不会输出换行符,因此您可以分段输出一行。 +请注意,**System.out.print()** 不会输出换行符,因此您可以分段输出一行。 *for-in* 语法不仅可以节省编写代码的时间。 更重要的是,它更容易阅读并说明你要做什么(获取数组的每个元素)而不是详细说明你是如何做到的(“我正在创建这个索引,所以我可以使用它来选择每个数组元素。“)。 本书只要有可能就会使用 *for-in* 语法。 @@ -406,7 +406,7 @@ public class BreakAndContinue { **[2]** 使用 for-in 语法将产生相同的结果。 -**[3]** 最后,可以看到一个"无穷 **while** 循环"的情况。然而,循环内部有一个 **break** 语句,可中止循环。请注意,**continue** 语句将控制权移回循环的顶部,而不会执行 **continue** 之后的任何操作。 因此,只有当 i 的值可被 10 整除时才会显示。在输出中,显示值 0,因为 0%9 产生0。 +**[3]** 最后,可以看到一个“无穷 **while** 循环”的情况。然而,循环内部有一个 **break** 语句,可中止循环。请注意,**continue** 语句将控制权移回循环的顶部,而不会执行 **continue** 之后的任何操作。 因此,只有当 i 的值可被 10 整除时才会显示。在输出中,显示值 0,因为 0%9 产生0。 无限循环的另一种形式是 **for(;;)**。 编译器以同样的方式处理 **while(true)** 和 **for(;;)**,因此使用哪种取决于编程品味。 @@ -414,19 +414,19 @@ public class BreakAndContinue { ## 臭名昭著的goto -goto 关键字很早就在程序设计语言中出现。事实上,goto 是汇编语言的程序控制结构的始 祖:“若条件A,则跳到这里;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码,就 会发现程序控制里包含了许多跳转。然而,goto是在源码的级别跳转的,所以招致了不好的 声誉。若程序总是从一个地方跳到另一个地方,还有什么办法能识别代码的流程呢?随着 Edsger Dijkstra 著名的 “Goto 有害”论的问世,goto 便从此失宠。 +goto 关键字很早就在程序设计语言中出现。事实上,goto 是汇编语言的程序控制结构的始祖:“若条件A,则跳到这里;否则跳到那里”。若阅读由几乎所有编译器生成的汇编代码,就会发现程序控制里包含了许多跳转。然而,goto是在源码的级别跳转的,所以招致了不好的声誉。若程序总是从一个地方跳到另一个地方,还有什么办法能识别代码的流程呢?随着 Edsger Dijkstra 著名的 “Goto 有害” 论的问世,goto 便从此失宠。 事实上,真正的问题并不在于使用 goto,而在于 goto 的滥用。而且在一些少见的情况下,goto 是组织控制流程的最佳手段。 -尽管 goto 仍是 Java 的一个保留字,但并未在语言中得到正式使用;Java 没有 goto。然而,在 break和 continue 这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳 转,而是中断循环语句的一种方法。之所以把它们纳入 goto 问题中一起讨论,是由于它们使 用了相同的机制:标签。 +尽管 goto 仍是 Java 的一个保留字,但并未在语言中得到正式使用;Java 没有 goto。然而,在 break和 continue 这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳转,而是中断循环语句的一种方法。之所以把它们纳入 goto 问题中一起讨论,是由于它们使用了相同的机制:标签。 -“标签”是后面跟一个冒号的标识符,就象下面这样: +“标签”是后面跟一个冒号的标识符,就像下面这样: ```java label1: ``` -对 Java 来说,唯一用到标签的地方是在循环语句之前。进一步说,它实际需要紧靠在循环语 句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一 理由是:我们希望在其中嵌套另一个循环或者一个开关。这是由于 break 和 continue 关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。如下所示: +对 Java 来说,唯一用到标签的地方是在循环语句之前。进一步说,它实际需要紧靠在循环语句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环或者一个开关。这是由于 break 和 continue 关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。如下所示: ```java label1: @@ -446,13 +446,13 @@ outer-iteration { **[1]** **break** 中断内部循环,并在外部循环结束。 -**[2]**,**continue** 移回内部循环的 起始处。但在条件3中,**continue label1** 却同时中断内部循环以及外部循环,并移至 **label1** 处。 +**[2]** **continue** 移回内部循环的起始处。但在条件3中,**continue label1** 却同时中断内部循环以及外部循环,并移至 **label1** 处。 -**[3]**随后,它实际是继续循环,但却从外部循环开始。 +**[3]** 随后,它实际是继续循环,但却从外部循环开始。 -**[4]**,**break label1** 也会中断所有循环,并回到 **label1** 处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。 +**[4]** **break label1** 也会中断所有循环,并回到 **label1** 处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。 -下面是for循环的一个例子: +下面是 for 循环的一个例子: ```java // control/LabeledFor.java @@ -584,13 +584,13 @@ break outer (3) **break** 会中断当前循环,并移离当前标签的末尾。 -(4) 带标签的**break**会中断当前循环,并移离由那个标签指示的循环的末尾。 +(4) 带标签的 **break** 会中断当前循环,并移离由那个标签指示的循环的末尾。 -大家要记住的重点是:在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中 **break** 或 **continue**。 +大家要记住的重点是:在 Java 里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中 **break** 或 **continue**。 **break** 和 **continue** 标签已经成为相对少用的推测特征(在前面的语言中很少或没有先例),所以你很少在代码里看到它们。 -在 **Dijkstra** 的 **“ goto 有害”** 论中,他最反对的就是标签,而非 **goto**。随着标签在一个程序里数量 的增多,他发现产生错误的机会也越来越多。标签和 **goto** 使我们难于对程序作静态分析。但是,Java 标签不会造成这方面的问题,因为它们的应用场合已经收到了限制,没有特别的方式用于概念程序的控制。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。 +在 **Dijkstra** 的 **“goto 有害”** 论中,他最反对的就是标签,而非 **goto**。随着标签在一个程序里数量的增多,他发现产生错误的机会也越来越多。标签和 **goto** 使我们难于对程序作静态分析。但是,Java 标签不会造成这方面的问题,因为它们的应用场合已经收到了限制,没有特别的方式用于概念程序的控制。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。 ## switch @@ -608,11 +608,13 @@ switch(integral-selector) { } ``` -其中,integral-selector (整数选择因子)是一个能够产生整数值的表达式,**switch** 能够将这个表达式的结果与每个 integral-value (整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相 符的,就执行 default 语句。 +其中,integral-selector (整数选择因子)是一个能够产生整数值的表达式,**switch** 能够将这个表达式的结果与每个 integral-value (整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相符的,就执行 default 语句。 -在上面的定义中,大家会注意到每个 **case** 均以一个 **break** 结尾。这样可使执行流程跳转至 switch 主体的末尾。这是构建 **switch** 语句的一种传统方式,但 **break** 是可选的。若省略break, 会继续执行后面的 **case** 语句的代码,直到遇到一个 **break** 为止。尽管通常不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的 **default** 语句没有 **break**,因为执行流程已到了break的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在**default** 语句的末尾放置一个 **break**,尽管它并没有任何实际的用处。 +在上面的定义中,大家会注意到每个 **case** 均以一个 **break** 结尾。这样可使执行流程跳转至 switch 主体的末尾。这是构建 **switch** 语句的一种传统方式,但 **break** 是可选的。若省略 break, 会继续执行后面的 **case** 语句的代码,直到遇到一个 **break** 为止。尽管通常不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的 **default** 语句没有 **break**,因为执行流程已到了break的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在**default** 语句的末尾放置一个 **break**,尽管它并没有任何实际的用处。 -switch 语句是实现多路选择的一种干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是 int 或 char 那样的整数值。例如,假若将一个字串或者浮点数 作为选择因子使用,那么它们在 switch 语句里是不会工作的。对于非整数类型,则必须使用一 系列 if 语句。 下面这个例子可随机生成字母,并判断它们是元音还是辅音字母: +switch 语句是实现多路选择的一种干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是 int 或 char 那样的整数值。例如,假若将一个字串或者浮点数作为选择因子使用,那么它们在 switch 语句里是不会工作的。对于非整数类型,则必须使用一系列 if 语句。 + +下面这个例子可随机生成字母,并判断它们是元音还是辅音字母: ```java // control/VowelsAndConsonants.java @@ -659,7 +661,7 @@ z, 122: consonant */ ``` -由于 **Random.nextInt(26)** 会产生0到26之间的一个值,所以在其上加上一个偏移量 "a",即可产生小写字母。在 **case** 语句中,使用单引号引起的字符也会产生用于比较的整数值。 +由于 **Random.nextInt(26)** 会产生 0 到 26 之间的一个值,所以在其上加上一个偏移量 "a",即可产生小写字母。在 **case** 语句中,使用单引号引起的字符也会产生用于比较的整数值。 请注意 **case** 语句能够堆叠在一起,为一段代码形成多重匹配,即只要符合多种条件中的一种,就执行那段特别的代码。这时也应该注意将 **break** 语句置于特定 **case** 的末尾,否则控制流程会简单地下移,处理后面的 **case**。 @@ -669,13 +671,13 @@ z, 122: consonant int c = rand.nextInt(26) + 'a'; ``` -**Random.nextInt()**将产生0~25之间的一个随机 **int** 值,它将被加到 **"a"** 上。这表示 **"a"** 将自动被转换为 **int** 以执行假发。为了把 **c** 当作字符打印,必须将其转型为 **char**;否则,将产生整数输出。 +此处 **Random.nextInt()** 将产生 0~25 之间的一个随机 **int** 值,它将被加到 **a** 上。这表示 **a** 将自动被转换为 **int** 以执行假发。为了把 **c** 当作字符打印,必须将其转型为 **char**;否则,将产生整数输出。 ## switch字符串 -Java 7增加了在字符串上 **switch** 的用法。 此示例展示了您从一组String可能性中选择的旧方法,以及使用switch的新方法: +Java 7 增加了在字符串上 **switch** 的用法。 此示例展示了您从一组 String 可能性中选择的旧方法,以及使用 switch 的新方法: ```java // control/StringSwitch.java @@ -721,11 +723,11 @@ RED */ ``` -一旦理解了switch,这种语法就是一个逻辑扩展。 结果更清晰,更易于理解和维护。 +一旦理解了 switch,这种语法就是一个逻辑扩展。 结果更清晰,更易于理解和维护。 -作为 **switch** 字符串的第二个例子,我们重新访问 Math.random()。 它是否产生从 0 到 1 的值,包括还是不包括值“1”? 在数学术语中,是(0,1),还是[0,1],还是(0,1)还是[0,1]? (方括号表示“包括”,而括号表示“不包括”。) +作为 **switch** 字符串的第二个例子,我们重新访问 Math.random()。 它是否产生从 0 到 1 的值,包括还是不包括值 “1”? 在数学术语中,是(0,1),还是 [0,1],还是(0,1)还是 [0,1]? (方括号表示“包括”,而括号表示“不包括”。) -下面一个可能提供答案的测试程序。 所有命令行参数都作为 **String** 对象传递,因此我们可以 **switch** 参数来决定要做什么。 有一个问题:用户可能不提供任何参数,因此索引到args数组会导致程序失败。 要解决这个问题,我们检查数组的长度,如果它为零,我们使用一个空字符串,否则我们选择 **args** 数组中的第一个元素: +下面一个可能提供答案的测试程序。 所有命令行参数都作为 **String** 对象传递,因此我们可以 **switch** 参数来决定要做什么。 有一个问题:用户可能不提供任何参数,因此索引到 args 数组会导致程序失败。 要解决这个问题,我们检查数组的长度,如果它为零,我们使用一个空字符串,否则我们选择 **args** 数组中的第一个元素: ```java // control/RandomBounds.java @@ -766,7 +768,7 @@ or java RandomBounds upper ``` -使用 onjava 包中的 TimedAbort 类,程序在三秒后中止,因此看起来 Math.random()从不生成 0.0或 1.0。 但这就是这样一个实验可以欺骗的地方。 如果考虑0到1之间所有不同 **double** 类型的分数(double fractions)的数量,实验中达到任何一个值的可能性可能超过一台计算机甚至一个实验者的寿命。 结果是0.0包含在 **Math.random()**的输出中,而 1.0 则不包括在内。 在数学术语中,它是[0,1)。 您必须小心分析您的实验并了解它们的局限性。结果是 0.0 包含在 **Math.random()**的输出中,而 1.0 则不包括在内。 在数学术语中,它是 [0,1)。 您必须小心分析您的实验并了解它们的局限性。 +使用 onjava 包中的 TimedAbort 类,程序在三秒后中止,因此看起来 Math.random() 从不生成 0.0 或 1.0。 但这就是这样一个实验可以欺骗的地方。 如果考虑0到1之间所有不同 **double** 类型的分数(double fractions)的数量,实验中达到任何一个值的可能性可能超过一台计算机甚至一个实验者的寿命。 结果是 0.0 包含在 **Math.random()** 的输出中,而 1.0 则不包括在内。 在数学术语中,它是 [0,1)。 您必须小心分析您的实验并了解它们的局限性。结果是 0.0 包含在 **Math.random()** 的输出中,而 1.0 则不包括在内。 在数学术语中,它是 [0,1)。 您必须小心分析您的实验并了解它们的局限性。 From 2a7e04301972a2ebb60ead393604db98065f2c02 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 24 Mar 2019 17:12:24 +0800 Subject: [PATCH 035/814] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4,?= =?UTF-8?q?=E5=AD=90=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=88=B0=E7=AC=AC10=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - SUMMARY.md | 72 +++++++++--------- book/01-What-is-an-Object.md | 2 +- ...2-Installing-Java-and-the-Book-Examples.md | 2 + book/03-Objects-Everywhere.md | 2 + book/04-Operators.md | 76 ++++++++++++++----- book/05-Control-Flow.md | 2 + book/06-Housekeeping.md | 46 +++++++++++ book/07-Implementation-Hiding.md | 29 +++++++ book/08-Reuse.md | 47 ++++++++++++ book/09-Polymorphism.md | 30 ++++++++ book/10-Interfaces.md | 50 ++++++++++++ book/11-Inner-Classes.md | 5 ++ book/12-Collections.md | 5 ++ book/13-Functional-Programming.md | 12 ++- book/14-Streams.md | 5 ++ book/15-Exceptions.md | 5 ++ book/16-Validating-Your-Code.md | 5 ++ book/17-Files.md | 5 ++ book/18-Strings.md | 5 ++ book/19-Type-Information.md | 5 ++ book/20-Generics.md | 5 ++ book/21-Arrays.md | 5 ++ book/22-Enumerations.md | 5 ++ book/23-Annotations.md | 5 ++ book/24-Concurrent-Programming.md | 5 ++ book/25-Patterns.md | 5 ++ book/Appendix-Becoming-a-Programmer.md | 5 ++ ...efits-and-Costs-of-Static-Type-Checking.md | 5 ++ book/Appendix-Collection-Topics.md | 5 ++ book/Appendix-Data-Compression.md | 5 ++ book/Appendix-IO-Streams.md | 5 ++ book/Appendix-Javadoc.md | 5 ++ book/Appendix-Low-Level-Concurrency.md | 2 + book/Appendix-New-IO.md | 5 ++ book/Appendix-Object-Serialization.md | 5 ++ .../Appendix-Passing-and-Returning-Objects.md | 5 ++ book/Appendix-Programming-Guidelines.md | 5 ++ book/Appendix-Standard-IO.md | 5 ++ book/Appendix-Supplements.md | 5 ++ ...Positive-Legacy-of-C-plus-plus-and-Java.md | 6 ++ ...endix-Understanding-equals-and-hashCode.md | 5 ++ 42 files changed, 457 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index a9cbfd29..ebb4ee5c 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,6 @@ - [x] 第十三章 函数式编程 - [ ] 待续······ -- 最近公司项目赶着上线,等忙完继续! ## 一起交流 diff --git a/SUMMARY.md b/SUMMARY.md index 1a4691e8..f05d9979 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -85,49 +85,51 @@ * [switch字符串](book/05-Control-Flow.md#switch字符串) * [本章小结](book/05-Control-Flow.md#本章小结) * [第六章 初始化和清理](book/06-Housekeeping.md) - * [](book/06-Housekeeping.md#) - * [](book/06-Housekeeping.md#) - * [](book/06-Housekeeping.md#) - * [](book/06-Housekeeping.md#) - * [](book/06-Housekeeping.md#) - * [](book/06-Housekeeping.md#) - * [](book/06-Housekeeping.md#) - * [](book/06-Housekeeping.md#) - * [](book/06-Housekeeping.md#) + * [利用构造器保证初始化](book/06-Housekeeping.md#利用构造器保证初始化) + * [方法重载](book/06-Housekeeping.md#方法重载) + * [无参构造器](book/06-Housekeeping.md#无参构造器) + * [this关键字](book/06-Housekeeping.md#this关键字) + * [垃圾回收器](book/06-Housekeeping.md#垃圾回收器) + * [成员初始化](book/06-Housekeeping.md#成员初始化) + * [构造器初始化](book/06-Housekeeping.md#构造器初始化) + * [数组初始化](book/06-Housekeeping.md#数组初始化) + * [枚举类型](book/06-Housekeeping.md#枚举类型) * [本章小结](book/06-Housekeeping.md#本章小结) * [第七章 封装](book/07-Implementation-Hiding.md) - * [](book/07-Implementation-Hiding.md#) - * [](book/07-Implementation-Hiding.md#) - * [](book/07-Implementation-Hiding.md#) + * [包的概念](book/07-Implementation-Hiding.md#包的概念) + * [访问权限修饰符](book/07-Implementation-Hiding.md#访问权限修饰符) + * [接口和实现](book/07-Implementation-Hiding.md#接口和实现) + * [类访问权限](book/07-Implementation-Hiding.md#类访问权限) * [本章小结](book/07-Implementation-Hiding.md#本章小结) * [第八章 复用](book/08-Reuse.md) - * [](book/08-Reuse.md#) - * [](book/08-Reuse.md#) - * [](book/08-Reuse.md#) - * [](book/08-Reuse.md#) - * [](book/08-Reuse.md#) - * [](book/08-Reuse.md#) - * [](book/08-Reuse.md#) - * [](book/08-Reuse.md#) - * [](book/08-Reuse.md#) + * [组合语法](book/08-Reuse.md#组合语法) + * [继承语法](book/08-Reuse.md#继承语法) + * [委托](book/08-Reuse.md#委托) + * [结合组合与继承](book/08-Reuse.md#结合组合与继承) + * [组合与继承的选择](book/08-Reuse.md#组合与继承的选择) + * [protected](book/08-Reuse.md#protected) + * [向上转型](book/08-Reuse.md#向上转型) + * [final关键字](book/08-Reuse.md#final关键字) + * [类初始化和加载](book/08-Reuse.md#类初始化和加载) * [本章小结](book/08-Reuse.md#本章小结) * [第九章 多态](book/09-Polymorphism.md) - * [](book/09-Polymorphism.md#) - * [](book/09-Polymorphism.md#) - * [](book/09-Polymorphism.md#) - * [](book/09-Polymorphism.md#) + * [向上转型回溯](book/09-Polymorphism.md#向上转型回溯) + * [深入理解](book/09-Polymorphism.md#深入理解) + * [构造器和多态](book/09-Polymorphism.md#构造器和多态) + * [返回类型协变](book/09-Polymorphism.md#返回类型协变) + * [使用继承设计](book/09-Polymorphism.md#使用继承设计) * [本章小结](book/09-Polymorphism.md#本章小结) * [第十章 接口](book/10-Interfaces.md) - * [](book/10-Interfaces.md#) - * [](book/10-Interfaces.md#) - * [](book/10-Interfaces.md#) - * [](book/10-Interfaces.md#) - * [](book/10-Interfaces.md#) - * [](book/10-Interfaces.md#) - * [](book/10-Interfaces.md#) - * [](book/10-Interfaces.md#) - * [](book/10-Interfaces.md#) - * [](book/10-Interfaces.md#) + * [抽象类和方法](book/10-Interfaces.md#抽象类和方法) + * [接口创建](book/10-Interfaces.md#接口创建) + * [抽象类和接口](book/10-Interfaces.md#抽象类和接口) + * [完全解耦](book/10-Interfaces.md#完全解耦) + * [多接口结合](book/10-Interfaces.md#多接口结合) + * [使用继承扩展接口](book/10-Interfaces.md#使用继承扩展接口) + * [接口适配](book/10-Interfaces.md#接口适配) + * [接口字段](book/10-Interfaces.md#接口字段) + * [接口嵌套](book/10-Interfaces.md#接口嵌套) + * [接口和工厂方法模式](book/10-Interfaces.md#接口和工厂方法模式) * [本章小结](book/10-Interfaces.md#本章小结) * [第十一章 内部类](book/11-Inner-Classes.md) * [](book/11-Inner-Classes.md#) diff --git a/book/01-What-is-an-Object.md b/book/01-What-is-an-Object.md index 684cc3fa..03208fcb 100644 --- a/book/01-What-is-an-Object.md +++ b/book/01-What-is-an-Object.md @@ -1,5 +1,5 @@ - +[TOC] # 第一章 对象的概念 diff --git a/book/02-Installing-Java-and-the-Book-Examples.md b/book/02-Installing-Java-and-the-Book-Examples.md index 50034991..812ac1f2 100644 --- a/book/02-Installing-Java-and-the-Book-Examples.md +++ b/book/02-Installing-Java-and-the-Book-Examples.md @@ -1,3 +1,5 @@ +[TOC] + # 第二章 安装Java和本书用例 现在,我们来为这次阅读之旅做些准备吧! diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index 5f0a8dbf..bf1405e7 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -1,3 +1,5 @@ +[TOC] + # 第三章 万物皆对象 >如果我们说不同的语言,我们会感觉到一个不同的世界!— Ludwig Wittgenstein (1889-1951) diff --git a/book/04-Operators.md b/book/04-Operators.md index 5462fe11..d533b07a 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -1,35 +1,77 @@ +[TOC] + + # 第四章 运算符 -[TOC] -## [待初始化](#Using-Java-Operators) -## [待初始化](#Precedence) + +## 使用说明 + + + +## 优先级 + + + +## 赋值 + + + +## 算术运算符 + + + +## 自动递增和递减 + + + +## 关系运算符 + + + +## 逻辑运算符 + + + +## 字面值 + + + +## 按位运算符 + + + +## 移位运算符 + + + +## 三元运算符 -## [待初始化](#Assignment) -## [待初始化](#Mathematical-Operators) + +## 字符串运算符 -## [待初始化](#Auto-Increment-and-Decrement) -## [待初始化](#Relational-Operators) + +## 常见陷阱 -## [待初始化](#Logical-Operators) -## [待初始化](#Literals) + +## 类型转换 -## [待初始化](#Bitwise-Operators) -## [待初始化](#Ternary-if-else-Operator) + +## Java没有sizeof -## [待初始化](#String-Operator-+-and-+=) -## [待初始化](#Common-Pitfalls-When-Using-Operators) + +## 运算符总结 -## [待初始化](#Casting-Operators) -## [待初始化](#Java-Has-No-sizeof) + +## 本章小结 -## [待初始化](#A-Compendium-of-Operators) -## [待初始化](#Summary) \ No newline at end of file + +
\ No newline at end of file diff --git a/book/05-Control-Flow.md b/book/05-Control-Flow.md index 6aac1b1d..825afa60 100644 --- a/book/05-Control-Flow.md +++ b/book/05-Control-Flow.md @@ -1,3 +1,5 @@ +[TOC] + # 第五章 控制流 > 程序操纵它的世界并做出选择。 在Java中,您可以使用执行控制语句进行选择。 diff --git a/book/06-Housekeeping.md b/book/06-Housekeeping.md index 2fec7de7..7178d7c7 100644 --- a/book/06-Housekeeping.md +++ b/book/06-Housekeeping.md @@ -1,2 +1,48 @@ +[TOC] + + # 第六章 初始化和清理 + + +## 利用构造器保证初始化 + + + +## 方法重载 + + + +## 无参构造器 + + + +## this关键字 + + + +## 垃圾回收器 + + + +## 成员初始化 + + + +## 构造器初始化 + + + +## 数组初始化 + + + +## 枚举类型 + + + +## 本章小结 + + + +
\ No newline at end of file diff --git a/book/07-Implementation-Hiding.md b/book/07-Implementation-Hiding.md index 9bd7a5d8..2d13a1b2 100644 --- a/book/07-Implementation-Hiding.md +++ b/book/07-Implementation-Hiding.md @@ -1,2 +1,31 @@ +[TOC] + + # 第七章 封装 + + +## 包的概念 + + + +## 访问权限修饰符 + + + +## 接口和实现 + + + +## 类访问权限 + + + +## 本章小结 + + + + + +
+ diff --git a/book/08-Reuse.md b/book/08-Reuse.md index c0e94dea..d8b7a696 100644 --- a/book/08-Reuse.md +++ b/book/08-Reuse.md @@ -1,2 +1,49 @@ +[TOC] + + # 第八章 复用 + + +## 组合语法 + + + +## 继承语法 + + + +## 委托 + + + +## 结合组合与继承 + + + +## 组合与继承的选择 + + + +## protected + + + +## 向上转型 + + + +## final关键字 + + + +## 类初始化和加载 + + + +## 本章小结 + + + +
+ diff --git a/book/09-Polymorphism.md b/book/09-Polymorphism.md index c50bb408..8692dc8c 100644 --- a/book/09-Polymorphism.md +++ b/book/09-Polymorphism.md @@ -1,2 +1,32 @@ +[TOC] + + # 第九章 多态 + + +## 向上转型回溯 + + + +## 深入理解 + + + +## 构造器和多态 + + + +## 返回类型协变 + + + +## 使用继承设计 + + + +## 本章小结 + + + +
\ No newline at end of file diff --git a/book/10-Interfaces.md b/book/10-Interfaces.md index 9f270823..60f6bfc8 100644 --- a/book/10-Interfaces.md +++ b/book/10-Interfaces.md @@ -1,2 +1,52 @@ +[TOC] + + # 第十章 接口 + + +## 抽象类和方法 + + + +## 接口创建 + + + +## 抽象类和接口 + + + +## 完全解耦 + + + +## 多接口结合 + + + +## 使用继承扩展接口 + + + +## 接口适配 + + + +## 接口字段 + + + +## 接口嵌套 + + + +## 接口和工厂方法模式 + + + +## 本章小结 + + + +
\ No newline at end of file diff --git a/book/11-Inner-Classes.md b/book/11-Inner-Classes.md index 5e93392e..cd73576a 100644 --- a/book/11-Inner-Classes.md +++ b/book/11-Inner-Classes.md @@ -1,2 +1,7 @@ +[TOC] + # 第十一章 内部类 + + +
\ No newline at end of file diff --git a/book/12-Collections.md b/book/12-Collections.md index 5c5acf3a..6cbc671d 100644 --- a/book/12-Collections.md +++ b/book/12-Collections.md @@ -1,2 +1,7 @@ +[TOC] + # 第十二章 集合 + + +
\ No newline at end of file diff --git a/book/13-Functional-Programming.md b/book/13-Functional-Programming.md index 0d44f230..097bff55 100644 --- a/book/13-Functional-Programming.md +++ b/book/13-Functional-Programming.md @@ -1,7 +1,7 @@ -# 第十三章-函数式编程 - [TOC] +# 第十三章-函数式编程 + 函数式编程语言操纵代码片段就像操作数据一样容易。 虽然 Java 不是函数式语言,但 Java 8 Lambda 表达式和方法引用 (Method References) 允许您以函数式编程。在计算机时代的早期,内存是稀缺和珍贵的。几乎每个人都用汇编语言编程。 人们对编译器有所了解,但仅仅想到编译生成的代码肯定会比手工编码多了很多字节。 @@ -1432,4 +1432,10 @@ Lambda 表达式和方法引用并没有将 Java 转换成函数式语言,而 6. 在并发编程一章中,当您理解更改共享变量 “不是线程安全的” 时,这将更有意义。 7. 接口能够支持方法的原因是它们是 Java 8 默认方法,您将在下一章中了解到。 8. 一些语言,例如 Python,允许像调用其他函数一样调用组合函数。但这是 Java,所以我们取我们能得到的。 -9. 见,例如,不可变和可变性检测器。( Immutables and Mutability Detector) \ No newline at end of file +9. 见,例如,不可变和可变性检测器。( Immutables and Mutability Detector) + + + + + +
\ No newline at end of file diff --git a/book/14-Streams.md b/book/14-Streams.md index f9ec4063..3896ebb8 100644 --- a/book/14-Streams.md +++ b/book/14-Streams.md @@ -1,2 +1,7 @@ +[TOC] + # 第十四章 流式编程 + + +
\ No newline at end of file diff --git a/book/15-Exceptions.md b/book/15-Exceptions.md index b66472a9..2b192fda 100644 --- a/book/15-Exceptions.md +++ b/book/15-Exceptions.md @@ -1,2 +1,7 @@ +[TOC] + # 第十五章 异常 + + +
\ No newline at end of file diff --git a/book/16-Validating-Your-Code.md b/book/16-Validating-Your-Code.md index dfd2abaa..ad57fd05 100644 --- a/book/16-Validating-Your-Code.md +++ b/book/16-Validating-Your-Code.md @@ -1,2 +1,7 @@ +[TOC] + # 第十六章 代码校验 + + +
\ No newline at end of file diff --git a/book/17-Files.md b/book/17-Files.md index a1230cfa..b4ed539d 100644 --- a/book/17-Files.md +++ b/book/17-Files.md @@ -1,2 +1,7 @@ +[TOC] + # 第十七章 文件 + + +
\ No newline at end of file diff --git a/book/18-Strings.md b/book/18-Strings.md index 9252da21..bd07bf63 100644 --- a/book/18-Strings.md +++ b/book/18-Strings.md @@ -1,2 +1,7 @@ +[TOC] + # 第十八章 字符串 + + +
\ No newline at end of file diff --git a/book/19-Type-Information.md b/book/19-Type-Information.md index 5929f739..4c1627b9 100644 --- a/book/19-Type-Information.md +++ b/book/19-Type-Information.md @@ -1,2 +1,7 @@ +[TOC] + # 第十九章 类型信息 + + +
\ No newline at end of file diff --git a/book/20-Generics.md b/book/20-Generics.md index 4bb7980e..965b1dc7 100644 --- a/book/20-Generics.md +++ b/book/20-Generics.md @@ -1,2 +1,7 @@ +[TOC] + # 第二十章 泛型 + + +
\ No newline at end of file diff --git a/book/21-Arrays.md b/book/21-Arrays.md index 38e066ef..bea68dfe 100644 --- a/book/21-Arrays.md +++ b/book/21-Arrays.md @@ -1,2 +1,7 @@ +[TOC] + # 第二十一章 数组 + + +
\ No newline at end of file diff --git a/book/22-Enumerations.md b/book/22-Enumerations.md index 999ad7c1..34a90489 100644 --- a/book/22-Enumerations.md +++ b/book/22-Enumerations.md @@ -1,2 +1,7 @@ +[TOC] + # 第二十二章 枚举 + + +
\ No newline at end of file diff --git a/book/23-Annotations.md b/book/23-Annotations.md index d30be182..81e3a7ff 100644 --- a/book/23-Annotations.md +++ b/book/23-Annotations.md @@ -1,2 +1,7 @@ +[TOC] + # 第二十三章 注解 + + +
\ No newline at end of file diff --git a/book/24-Concurrent-Programming.md b/book/24-Concurrent-Programming.md index ab865daa..bc15d3fe 100644 --- a/book/24-Concurrent-Programming.md +++ b/book/24-Concurrent-Programming.md @@ -1,2 +1,7 @@ +[TOC] + # 第二十四章 并发编程 + + +
\ No newline at end of file diff --git a/book/25-Patterns.md b/book/25-Patterns.md index ea3ca325..713c00f0 100644 --- a/book/25-Patterns.md +++ b/book/25-Patterns.md @@ -1,2 +1,7 @@ +[TOC] + # 第二十五章 正则表达式 + + +
\ No newline at end of file diff --git a/book/Appendix-Becoming-a-Programmer.md b/book/Appendix-Becoming-a-Programmer.md index 79cc6c2b..4fe1fd12 100644 --- a/book/Appendix-Becoming-a-Programmer.md +++ b/book/Appendix-Becoming-a-Programmer.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:成为一名程序员 + + +
\ No newline at end of file diff --git a/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md b/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md index 64468e58..01c0cd8f 100644 --- a/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md +++ b/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:静态语言类型检查 + + +
\ No newline at end of file diff --git a/book/Appendix-Collection-Topics.md b/book/Appendix-Collection-Topics.md index f10136b5..57ea3429 100644 --- a/book/Appendix-Collection-Topics.md +++ b/book/Appendix-Collection-Topics.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:集合主题 + + +
\ No newline at end of file diff --git a/book/Appendix-Data-Compression.md b/book/Appendix-Data-Compression.md index e7f10154..d2640889 100644 --- a/book/Appendix-Data-Compression.md +++ b/book/Appendix-Data-Compression.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:数据压缩 + + +
\ No newline at end of file diff --git a/book/Appendix-IO-Streams.md b/book/Appendix-IO-Streams.md index bc03ea3d..51fd15c0 100644 --- a/book/Appendix-IO-Streams.md +++ b/book/Appendix-IO-Streams.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:流式IO + + +
\ No newline at end of file diff --git a/book/Appendix-Javadoc.md b/book/Appendix-Javadoc.md index 0c985fcf..3337039c 100644 --- a/book/Appendix-Javadoc.md +++ b/book/Appendix-Javadoc.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:文档注释 + + +
\ No newline at end of file diff --git a/book/Appendix-Low-Level-Concurrency.md b/book/Appendix-Low-Level-Concurrency.md index 9a8c3a7e..3441e7a8 100644 --- a/book/Appendix-Low-Level-Concurrency.md +++ b/book/Appendix-Low-Level-Concurrency.md @@ -1,2 +1,4 @@ +[TOC] + # 附录:并发底层原理 diff --git a/book/Appendix-New-IO.md b/book/Appendix-New-IO.md index d7804380..82575a54 100644 --- a/book/Appendix-New-IO.md +++ b/book/Appendix-New-IO.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:新IO + + +
\ No newline at end of file diff --git a/book/Appendix-Object-Serialization.md b/book/Appendix-Object-Serialization.md index d9699b91..3f60e3ce 100644 --- a/book/Appendix-Object-Serialization.md +++ b/book/Appendix-Object-Serialization.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:对象序列化 + + +
\ No newline at end of file diff --git a/book/Appendix-Passing-and-Returning-Objects.md b/book/Appendix-Passing-and-Returning-Objects.md index 8cff3e7b..b2a45a00 100644 --- a/book/Appendix-Passing-and-Returning-Objects.md +++ b/book/Appendix-Passing-and-Returning-Objects.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:对象传递和返回 + + +
\ No newline at end of file diff --git a/book/Appendix-Programming-Guidelines.md b/book/Appendix-Programming-Guidelines.md index ebbb6e8a..0bf46760 100644 --- a/book/Appendix-Programming-Guidelines.md +++ b/book/Appendix-Programming-Guidelines.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:编程指南 + + +
\ No newline at end of file diff --git a/book/Appendix-Standard-IO.md b/book/Appendix-Standard-IO.md index d92be155..96da9bc1 100644 --- a/book/Appendix-Standard-IO.md +++ b/book/Appendix-Standard-IO.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:标准IO + + +
\ No newline at end of file diff --git a/book/Appendix-Supplements.md b/book/Appendix-Supplements.md index e58d28de..ca98d3c6 100644 --- a/book/Appendix-Supplements.md +++ b/book/Appendix-Supplements.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:补充 + + +
\ No newline at end of file diff --git a/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md b/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md index 71ff1603..f35da00b 100644 --- a/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md +++ b/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md @@ -1,2 +1,8 @@ +[TOC] + # 附录:C++和Java的优良传统 + + +
+ diff --git a/book/Appendix-Understanding-equals-and-hashCode.md b/book/Appendix-Understanding-equals-and-hashCode.md index d3ee4cdc..15e2fa58 100644 --- a/book/Appendix-Understanding-equals-and-hashCode.md +++ b/book/Appendix-Understanding-equals-and-hashCode.md @@ -1,2 +1,7 @@ +[TOC] + # 附录:理解equals和hashCode方法 + + +
\ No newline at end of file From e16709b7353fa80437af1d6bf06728a3877ac2cf Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 24 Mar 2019 17:22:08 +0800 Subject: [PATCH 036/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0Readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ebb4ee5c..ad8956a2 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ - [ ] 第四章 运算符 - [x] 第五章 控制流 - [x] 第十三章 函数式编程 +- [x] 附录:新IO + - [ ] 待续······ @@ -51,7 +53,9 @@ - 2019-03-17 第五章 控制流翻译完成 -- 2019-03-20 第十三章 函数式编程完成 +- 2019-03-20 第十三章 函数式编程翻译完成 + +- 2019-03-24 附录:新IO翻译完成 ## 原书作者 @@ -64,8 +68,8 @@ ## 贡献者 -* 主译: LingCoder -* 参译: LortSir +* 主译: LingCoder,LortSir +* 参译: * 校对:nickChenyx From 24183a345beda8f81b2969cefc9ccacbd720ef2a Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 24 Mar 2019 22:55:22 +0800 Subject: [PATCH 037/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=85=E9=83=A8?= =?UTF-8?q?=E7=B1=BB=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 24 +++++++++--------- book/11-Inner-Classes.md | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index f05d9979..46859ade 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -132,18 +132,18 @@ * [接口和工厂方法模式](book/10-Interfaces.md#接口和工厂方法模式) * [本章小结](book/10-Interfaces.md#本章小结) * [第十一章 内部类](book/11-Inner-Classes.md) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) - * [](book/11-Inner-Classes.md#) + * [创建内部类](book/11-Inner-Classes.md#创建内部类) + * [链接外部类](book/11-Inner-Classes.md#链接外部类) + * [内部类this和new的使用](book/11-Inner-Classes.md#内部类this和new的使用) + * [内部类向上转型](book/11-Inner-Classes.md#内部类向上转型) + * [内部类方法和作用域](book/11-Inner-Classes.md#内部类方法和作用域) + * [匿名内部类](book/11-Inner-Classes.md#匿名内部类) + * [嵌套类](book/11-Inner-Classes.md#嵌套类) + * [内部类应用场景](book/11-Inner-Classes.md#内部类应用场景) + * [继承内部类](book/11-Inner-Classes.md#继承内部类) + * [重写内部类](book/11-Inner-Classes.md#重写内部类) + * [内部类局部变量](book/11-Inner-Classes.md#内部类局部变量) + * [内部类标识符](book/11-Inner-Classes.md#内部类标识符) * [本章小结](book/11-Inner-Classes.md#本章小结) * [第十二章 集合](book/12-Collections.md) * [](book/12-Collections.md#) diff --git a/book/11-Inner-Classes.md b/book/11-Inner-Classes.md index cd73576a..b2628a95 100644 --- a/book/11-Inner-Classes.md +++ b/book/11-Inner-Classes.md @@ -1,7 +1,60 @@ [TOC] + # 第十一章 内部类 + + +## 创建内部类 + + + +## 链接外部类 + + + +## 内部类this和new的使用 + + + +## 内部类向上转型 + + + +## 内部类方法和作用域 + + + +## 匿名内部类 + + + +## 嵌套类 + + + +## 内部类应用场景 + + + +## 继承内部类 + + + +## 重写内部类 + + + +## 内部类局部变量 + + + +## 内部类标识符 + + + +## 本章小结 +
\ No newline at end of file From f15da1385c3043616f81cf358995e207496873b5 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 24 Mar 2019 23:33:00 +0800 Subject: [PATCH 038/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E5=8D=81?= =?UTF-8?q?=E4=BA=8C=E7=AB=A0=E7=9B=AE=E5=BD=95=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 26 +++++++++---------- book/12-Collections.md | 57 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 46859ade..d4caa149 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -146,19 +146,19 @@ * [内部类标识符](book/11-Inner-Classes.md#内部类标识符) * [本章小结](book/11-Inner-Classes.md#本章小结) * [第十二章 集合](book/12-Collections.md) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) - * [](book/12-Collections.md#) + * [泛型和类型安全的集合](book/12-Collections.md#泛型和类型安全的集合) + * [基本概念](book/12-Collections.md#基本概念) + * [添加元素组](book/12-Collections.md#添加元素组) + * [集合的打印](book/12-Collections.md#集合的打印) + * [列表List](book/12-Collections.md#列表List) + * [迭代器Iterators](book/12-Collections.md#迭代器Iterators) + * [链表LinkedList](book/12-Collections.md#链表LinkedList) + * [堆栈Stack](book/12-Collections.md#堆栈Stack) + * [集合Set](book/12-Collections.md#集合Set) + * [映射Map](book/12-Collections.md#映射Map) + * [队列Queue](book/12-Collections.md#队列Queue) + * [集合与迭代器](book/12-Collections.md#集合与迭代器) + * [for-in和迭代器](book/12-Collections.md#for-in和迭代器) * [本章小结](book/12-Collections.md#本章小结) * [第十三章 函数式编程](book/13-Functional-Programming.md) * [](book/13-Functional-Programming.md#) diff --git a/book/12-Collections.md b/book/12-Collections.md index 6cbc671d..bf508501 100644 --- a/book/12-Collections.md +++ b/book/12-Collections.md @@ -1,7 +1,64 @@ [TOC] + # 第十二章 集合 + + +## 泛型和类型安全的集合 + + + +## 基本概念 + + + +## 添加元素组 + + + +## 集合的打印 + + + +## 列表List + + + +## 迭代器Iterators + + + +## 链表LinkedList + + + +## 堆栈Stack + + + +## 集合Set + + + +## 映射Map + + + +## 队列Queue + + + +## 集合与迭代器 + + + +## for-in和迭代器 + + + +## 本章小结 +
\ No newline at end of file From 01d74ec40b100d56ee9c2a23655d120b9b9e5835 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sun, 24 Mar 2019 23:45:09 +0800 Subject: [PATCH 039/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E5=8D=81?= =?UTF-8?q?=E4=B8=89=E7=AB=A0=E7=9B=AE=E5=BD=95=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 18 +++++++++--------- book/13-Functional-Programming.md | 29 ++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index d4caa149..1a6838e2 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -161,15 +161,15 @@ * [for-in和迭代器](book/12-Collections.md#for-in和迭代器) * [本章小结](book/12-Collections.md#本章小结) * [第十三章 函数式编程](book/13-Functional-Programming.md) - * [](book/13-Functional-Programming.md#) - * [](book/13-Functional-Programming.md#) - * [](book/13-Functional-Programming.md#) - * [](book/13-Functional-Programming.md#) - * [](book/13-Functional-Programming.md#) - * [](book/13-Functional-Programming.md#) - * [](book/13-Functional-Programming.md#) - * [](book/13-Functional-Programming.md#) - * [](book/13-Functional-Programming.md#) + * [旧vs新](book/13-Functional-Programming.md#旧vs新) + * [Lambda表达式](book/13-Functional-Programming.md#Lambda表达式) + * [方法引用](book/13-Functional-Programming.md#方法引用) + * [函数式接口](book/13-Functional-Programming.md#函数式接口) + * [高阶函数](book/13-Functional-Programming.md#高阶函数) + * [闭包](book/13-Functional-Programming.md#闭包) + * [函数组合](book/13-Functional-Programming.md#函数组合) + * [Currying和Partial-Evaluation](book/13-Functional-Programming.md#Currying和Partial-Evaluation) + * [纯函数式编程](book/13-Functional-Programming.md#纯函数式编程) * [本章小结](book/13-Functional-Programming.md#本章小结) * [第十四章 流式编程](book/14-Streams.md) * [](book/14-Streams.md#) diff --git a/book/13-Functional-Programming.md b/book/13-Functional-Programming.md index 097bff55..2eb5ea09 100644 --- a/book/13-Functional-Programming.md +++ b/book/13-Functional-Programming.md @@ -1,6 +1,7 @@ [TOC] -# 第十三章-函数式编程 + +# 第十三章 函数式编程 @@ -28,9 +29,10 @@ OO (object oriented) 是抽象数据,FP (functional programming) 是抽象行 FP的想法值得融入非FP语言。 例如,这种情况发生在Python语言中。 Java 8在FP中添加了自己的功能,我们将在此章探讨。 + +## 旧vs新 -## 旧 VS 新 通常,方法会根据我们传递的数据产生不同的结果。 如果您希望某个方法在从一个调用到下一个调用时表现不同,该怎么办? 如果我们将代码传递给方法,我们可以控制它的行为。 以前,我们通过在方法中创建包含所需行为的对象,然后将该对象传递给我们想要控制的方法来完成此操作。 以下示例显示了这一点,然后添加了 Java 8方法:方法引用和 lambda 表达式。 @@ -110,7 +112,10 @@ Hello there Hello there 在Java 8之前,我们已经能够通过[1]和[2]传递功能。但是,写入和读取的语法非常笨拙,我们只在强制时才这样做。 方法引用和lambda表达式可以在您需要时传递功能,而不是仅在必要时传递功能。 -## Lambda 表达式 + + +## Lambda表达式 + Lambda表达式是使用最小可能语法编写的函数定义: @@ -273,9 +278,9 @@ public class RecursiveFibonacci { 将Fibonacci 序列对中的最后两个元素求和来产生下一个元素。 - ## 方法引用 + Java 8 方法引用指的是没有以前版本的 Java 所需的额外包袱的方法。 方法引用是类名或对象名,后面跟 :: [^4],然后是方法的名称。 ```java @@ -523,8 +528,10 @@ public class CtorReference { 编译器可以看到调用函数方法( 在本例中为make())意味着调用构造函数。 + ## 函数式接口 + 方法引用和lambda表达式都是必须赋值的,并且这些赋值需要编译器的类型信息以确保类型正确性。 Lambda表达式特别引入了新的要求。 考虑: ```java @@ -889,9 +896,9 @@ public interface IntToDoubleFunction { 当然,如果由于缺少原始类型的函数而导致性能实际上成为问题,您可以轻松编写自己的接口( 使用Java库源进行参考 ) - 尽管这似乎不太可能是您的性能瓶颈。 - ## 高阶函数 + 这个名字听起来有点令人生畏,但是:高阶函数只是一个消耗或产生函数的函数。 我们先来看看产生一个函数: @@ -984,8 +991,10 @@ O 在这里,**transform()**生成一个与传入的函数具有相同签名的函数,但是您可以生成任何您想要的类型。这在 **Function** 接口中使用名为 **andThen()**的默认方法,该方法专门用于操作函数。 顾名思义,在调用in函数之后调用 **toThen()**(还有 **compose()**,它在 **in** 函数之前应用新函数)。 要附加一个**andThen()**函数,我们只需将该函数作为参数传递。 **transform()**产生的是一个新函数,它将 **in** 的动作与 **andThen()**参数的动作结合起来。 + ## 闭包 + 在上一节的 **ProduceFunction.java** 中,我们从方法返回了一个 lambda 函数。 这个例子让事情变得简单,但是我们必须在返回 lambdas 时探讨一些问题。 *闭包*一词概括了这些问题。 闭包非常重要,因为它们可以轻松生成函数。 @@ -1236,9 +1245,9 @@ public class AnonymousClosure { 事实证明,只要有内部类,就会有闭包(Java 8只 会使闭包变得更容易)。 在 Java 8 之前,要求是 **x** 和 **i** 被明确声明为 **final**。 使用 Java 8,内部类的规则已经放宽,包括 “effectively final”。 - ## 函数组合 + 函数组合基本上意味着“将函数粘贴在一起以创建新函数”,它通常被认为是函数编程的一部分。您在**TransformFunction.java** 中看到了一个使用 **andThen()** 的函数组合示例。一些 **java.util** 的函数接口包含支持函数组合的方法。 Compositional Supporting Method Interfaces Function BiFunction Consumer BiConsumer IntConsumer andThen(argument) Performs the original LongConsumer operation followed by DoubleConsumer the argument operation. @@ -1309,8 +1318,8 @@ foobaz 你可以从输出中看到 **p4** 是如何工作的:任何带有 “foo ”的东西都会存活,即使它的长度大于5。 “fongopuckey” 太长了,没有 “bar” 来保存它。 +## Currying和Partial-Evaluation -## Currying 和 Partial Evaluation *Currying* 以 Haskell Curry 命名,Haskell Curry 是其发明者之一,可能是唯一一个以他的名字命名的重要事物的计算机领域的人物(另一个是 Haskell 编程语言)。 Currying 意味着从一个函数开始,该函数接受多个参数,并将其转换为一系列函数,每个函数只接受一个参数。 @@ -1405,14 +1414,16 @@ public class CurriedIntAdd { 您可以在因特网上找到更多 currying 示例。 通常这些是 Java 以外的语言,但如果你理解它们的基本概念,它们应该很容易翻译。 - ## 纯函数式编程 + 在没有函数支持的情况下,即使用像C这样的原始语言,也可以按照一定的原则编写纯函数程序。Java使它比这更容易,但是您必须小心地使一切都成为 **final**,并确保您的所有方法和函数没有副作用。因为 Java 本质上不是一种不可变的语言,所以如果您犯了错误,编译器不会提供任何帮助。 有第三方工具可以帮助您[^9],但是使用 **Scala** 或 **Clojure** 这样的语言可能更容易,因为它们从一开始就是为保持不变性而设计的。这些语言使您可以用 Java 编写项目的一部分,如果您必须用纯函数式编写,则可以用**Scala** 编写其他部分 (这需要一些规则) 或 **Clojure** (这需要的少得多)。虽然您将在并发编程一章中看到 Java确实支持并发,但是如果这是您项目的核心部分,您可能会考虑至少在项目的一部分中使用 **Scala** 或 **Clojure**之类的语言。 -## 总结 + +## 本章小结 + Lambda 表达式和方法引用并没有将 Java 转换成函数式语言,而是提供了对函数式编程的支持。它们对 Java 是一个巨大的改进,因为它们允许您编写更简洁、更干净、更容易理解的代码。在下一章中,您将看到它们如何启用流。如果你像我一样,你会喜欢流媒体。 From febe7e12724a971d24d40ac17b3878e6d6cd4643 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 00:02:58 +0800 Subject: [PATCH 040/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E5=8D=81?= =?UTF-8?q?=E5=9B=9B=E7=AB=A0=E7=9B=AE=E5=BD=95=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 10 +++++----- book/14-Streams.md | 27 ++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 1a6838e2..89d2da2f 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -172,11 +172,11 @@ * [纯函数式编程](book/13-Functional-Programming.md#纯函数式编程) * [本章小结](book/13-Functional-Programming.md#本章小结) * [第十四章 流式编程](book/14-Streams.md) - * [](book/14-Streams.md#) - * [](book/14-Streams.md#) - * [](book/14-Streams.md#) - * [](book/14-Streams.md#) - * [](book/14-Streams.md#) + * [流支持](book/14-Streams.md#流支持) + * [流创建](book/14-Streams.md#流创建) + * [中级流操作](book/14-Streams.md#中级流操作) + * [Optional类](book/14-Streams.md#Optional类) + * [终端操作](book/14-Streams.md#终端操作) * [本章小结](book/14-Streams.md#本章小结) * [第十五章 异常](book/15-Exceptions.md) * [](book/15-Exceptions.md#) diff --git a/book/14-Streams.md b/book/14-Streams.md index 3896ebb8..5f8bd2fb 100644 --- a/book/14-Streams.md +++ b/book/14-Streams.md @@ -1,7 +1,32 @@ [TOC] + # 第十四章 流式编程 - + +## 流支持 + + + +## 流创建 + + + +## 中级流操作 + + + +## Optional类 + + + +## 终端操作 + + + +## 本章小结 + + +
\ No newline at end of file From 2a7c3db1d613fb1dfb80abcd87dde147710781c6 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 00:25:49 +0800 Subject: [PATCH 041/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E5=8D=81?= =?UTF-8?q?=E4=BA=94=E7=AB=A0=E7=9B=AE=E5=BD=95=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 30 ++++++++++--------- book/15-Exceptions.md | 67 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 14 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 89d2da2f..56f82a4e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -179,21 +179,23 @@ * [终端操作](book/14-Streams.md#终端操作) * [本章小结](book/14-Streams.md#本章小结) * [第十五章 异常](book/15-Exceptions.md) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) - * [](book/15-Exceptions.md#) + * [异常概念](book/15-Exceptions.md#异常概念) + * [基本异常](book/15-Exceptions.md#基本异常) + * [异常捕获](book/15-Exceptions.md#异常捕获) + * [自定义异常](book/15-Exceptions.md#自定义异常) + * [异常规范](book/15-Exceptions.md#异常规范) + * [任意异常捕获](book/15-Exceptions.md#任意异常捕获) + * [Java标准异常](book/15-Exceptions.md#Java标准异常) + * [finally关键字](book/15-Exceptions.md#finally关键字) + * [异常限制](book/15-Exceptions.md#异常限制) + * [异常构造](book/15-Exceptions.md#异常构造) + * [Try-With-Resources用法](book/15-Exceptions.md#Try-With-Resources用法) + * [异常匹配](book/15-Exceptions.md#异常匹配) + * [异常准则](book/15-Exceptions.md#异常准则) + * [异常指南](book/15-Exceptions.md#异常指南) * [本章小结](book/15-Exceptions.md#本章小结) + +## 本章小结 * [第十六章 代码校验](book/16-Validating-Your-Code.md) * [](book/16-Validating-Your-Code.md#) * [](book/16-Validating-Your-Code.md#) diff --git a/book/15-Exceptions.md b/book/15-Exceptions.md index 2b192fda..564856de 100644 --- a/book/15-Exceptions.md +++ b/book/15-Exceptions.md @@ -1,7 +1,74 @@ [TOC] + # 第十五章 异常 + + +## 异常概念 + + + +## 基本异常 + + + +## 异常捕获 + + + +## 自定义异常 + + + +## 异常规范 + + + +## 任意异常捕获 + + + +## Java标准异常 + + + +## finally关键字 + + + +## 异常限制 + + + +## 异常构造 + + + +## Try-With-Resources用法 + + + +## 异常匹配 + + + +## 异常准则 + + + +## 异常指南 + + + +## 本章小结 + + + + + + +
\ No newline at end of file From 30fefe13aeef081fb2b1f3c773a8f05570a33319 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 00:44:40 +0800 Subject: [PATCH 042/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E5=8D=81?= =?UTF-8?q?=E5=85=AD=E7=AB=A0=E7=9B=AE=E5=BD=95=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 26 +++++++-------- book/16-Validating-Your-Code.md | 57 +++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 56f82a4e..d9b22f8a 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -197,19 +197,19 @@ ## 本章小结 * [第十六章 代码校验](book/16-Validating-Your-Code.md) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) - * [](book/16-Validating-Your-Code.md#) + * [测试](book/16-Validating-Your-Code.md#测试) + * [前提条件](book/16-Validating-Your-Code.md#前提条件) + * [测试驱动开发](book/16-Validating-Your-Code.md#测试驱动开发) + * [日志](book/16-Validating-Your-Code.md#日志) + * [调试](book/16-Validating-Your-Code.md#调试) + * [基准测试](book/16-Validating-Your-Code.md#基准测试) + * [分析和优化](book/16-Validating-Your-Code.md#分析和优化) + * [风格检测](book/16-Validating-Your-Code.md#风格检测) + * [静态错误分析](book/16-Validating-Your-Code.md#静态错误分析) + * [代码重审](book/16-Validating-Your-Code.md#代码重审) + * [结对编程](book/16-Validating-Your-Code.md#结对编程) + * [重构](book/16-Validating-Your-Code.md#重构) + * [持续集成](book/16-Validating-Your-Code.md#持续集成) * [本章小结](book/16-Validating-Your-Code.md#本章小结) * [第十七章 文件](book/17-Files.md) * [](book/17-Files.md#) diff --git a/book/16-Validating-Your-Code.md b/book/16-Validating-Your-Code.md index ad57fd05..2b296acc 100644 --- a/book/16-Validating-Your-Code.md +++ b/book/16-Validating-Your-Code.md @@ -1,7 +1,64 @@ [TOC] + # 第十六章 代码校验 + + +## 测试 + + + +## 前提条件 + + + +## 测试驱动开发 + + + +## 日志 + + + +## 调试 + + + +## 基准测试 + + + +## 分析和优化 + + + +## 风格检测 + + + +## 静态错误分析 + + + +## 代码重审 + + + +## 结对编程 + + + +## 重构 + + + +## 持续集成 + + + +## 本章小结 +
\ No newline at end of file From 273e354a8996e5aa6b119c975bc827eeb6ac2ba1 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 00:50:05 +0800 Subject: [PATCH 043/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 12 ++++++------ book/17-Files.md | 32 +++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index d9b22f8a..681c2de5 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -212,12 +212,12 @@ * [持续集成](book/16-Validating-Your-Code.md#持续集成) * [本章小结](book/16-Validating-Your-Code.md#本章小结) * [第十七章 文件](book/17-Files.md) - * [](book/17-Files.md#) - * [](book/17-Files.md#) - * [](book/17-Files.md#) - * [](book/17-Files.md#) - * [](book/17-Files.md#) - * [](book/17-Files.md#) + * [文件和目录路径](book/17-Files.md#文件和目录路径) + * [目录](book/17-Files.md#目录) + * [文件系统](book/17-Files.md#文件系统) + * [路径监听](book/17-Files.md#路径监听) + * [文件查找](book/17-Files.md#文件查找) + * [文件读写](book/17-Files.md#文件读写) * [本章小结](book/17-Files.md#本章小结) * [第十八章 字符串](book/18-Strings.md) * [](book/18-Strings.md#) diff --git a/book/17-Files.md b/book/17-Files.md index b4ed539d..688d4bf8 100644 --- a/book/17-Files.md +++ b/book/17-Files.md @@ -1,7 +1,37 @@ [TOC] + # 第十七章 文件 - + +## 文件和目录路径 + + + +## 目录 + + + +## 文件系统 + + + +## 路径监听 + + + +## 文件查找 + + + +## 文件读写 + + + +## 本章小结 + + + +
\ No newline at end of file From 01b01c564f6e50c6d3cf6228c63808e7338a3edb Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 00:59:07 +0800 Subject: [PATCH 044/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 17 ++++++++--------- book/18-Strings.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 681c2de5..60afd317 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -220,15 +220,14 @@ * [文件读写](book/17-Files.md#文件读写) * [本章小结](book/17-Files.md#本章小结) * [第十八章 字符串](book/18-Strings.md) - * [](book/18-Strings.md#) - * [](book/18-Strings.md#) - * [](book/18-Strings.md#) - * [](book/18-Strings.md#) - * [](book/18-Strings.md#) - * [](book/18-Strings.md#) - * [](book/18-Strings.md#) - * [](book/18-Strings.md#) - * [](book/18-Strings.md#) + * [字符串的不可变](book/18-Strings.md#字符串的不可变) + * [重载和StringBuilder](book/18-Strings.md#重载和StringBuilder) + * [意外递归](book/18-Strings.md#意外递归) + * [字符串操作](book/18-Strings.md#字符串操作) + * [格式化输出](book/18-Strings.md#格式化输出) + * [常规表达式](book/18-Strings.md#常规表达式) + * [扫描输入](book/18-Strings.md#扫描输入) + * [StringTokenizer类](book/18-Strings.md#StringTokenizer类) * [本章小结](book/18-Strings.md#本章小结) * [第十九章 类型信息](book/19-Type-Information.md) * [](book/19-Type-Information.md#) diff --git a/book/18-Strings.md b/book/18-Strings.md index bd07bf63..fe2d7129 100644 --- a/book/18-Strings.md +++ b/book/18-Strings.md @@ -1,7 +1,50 @@ [TOC] + # 第十八章 字符串 + + +## 字符串的不可变 + + + +## 重载和StringBuilder + + + +## 意外递归 + + + +## 字符串操作 + + + +## 格式化输出 + + + +## 常规表达式 + + + +## 扫描输入 + + + +## StringTokenizer类 + + + +## 本章小结 + + + + + + +
\ No newline at end of file From 555ad84bd7751834edb61bd74d610c6c13b39ed3 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 01:43:22 +0800 Subject: [PATCH 045/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 18 ++++++++-------- book/19-Type-Information.md | 42 +++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 60afd317..7019f54a 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -230,15 +230,15 @@ * [StringTokenizer类](book/18-Strings.md#StringTokenizer类) * [本章小结](book/18-Strings.md#本章小结) * [第十九章 类型信息](book/19-Type-Information.md) - * [](book/19-Type-Information.md#) - * [](book/19-Type-Information.md#) - * [](book/19-Type-Information.md#) - * [](book/19-Type-Information.md#) - * [](book/19-Type-Information.md#) - * [](book/19-Type-Information.md#) - * [](book/19-Type-Information.md#) - * [](book/19-Type-Information.md#) - * [](book/19-Type-Information.md#) + * [运行时类型信息](book/19-Type-Information.md#运行时类型信息) + * [类的对象](book/19-Type-Information.md#类的对象) + * [类型转换检测](book/19-Type-Information.md#类型转换检测) + * [注册工厂](book/19-Type-Information.md#注册工厂) + * [类的等价比较](book/19-Type-Information.md#类的等价比较) + * [反射运行时类信息](book/19-Type-Information.md#反射运行时类信息) + * [动态代理](book/19-Type-Information.md#动态代理) + * [Optional类](book/19-Type-Information.md#Optional类) + * [接口和类型](book/19-Type-Information.md#接口和类型) * [本章小结](book/19-Type-Information.md#本章小结) * [第二十章 泛型](book/20-Generics.md) * [](book/20-Generics.md#) diff --git a/book/19-Type-Information.md b/book/19-Type-Information.md index 4c1627b9..8f38ac82 100644 --- a/book/19-Type-Information.md +++ b/book/19-Type-Information.md @@ -1,7 +1,49 @@ [TOC] + # 第十九章 类型信息 + + +## 运行时类型信息 + + + +## 类的对象 + + + +## 类型转换检测 + + + +## 注册工厂 + + + +## 类的等价比较 + + + +## 反射运行时类信息 + + + +## 动态代理 + + + +## Optional类 + + + +## 接口和类型 + + + +## 本章小结 + +
\ No newline at end of file From 3f06b8843cb36587d5ccc004f472da501fd55797 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 02:03:40 +0800 Subject: [PATCH 046/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B3=9B=E5=9E=8B?= =?UTF-8?q?=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 34 +++++++++---------- book/20-Generics.md | 79 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 17 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 7019f54a..cd8987c0 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -241,23 +241,23 @@ * [接口和类型](book/19-Type-Information.md#接口和类型) * [本章小结](book/19-Type-Information.md#本章小结) * [第二十章 泛型](book/20-Generics.md) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [](book/20-Generics.md#) - * [本章小结](book/20-Generics.md#本章小结) + * [简单泛型](book/20-Generics.md#简单泛型) + * [泛型接口](book/20-Generics.md#泛型接口) + * [泛型方法](book/20-Generics.md#泛型方法) + * [复杂模型构建](book/20-Generics.md#复杂模型构建) + * [泛型擦除](book/20-Generics.md#泛型擦除) + * [补偿擦除](book/20-Generics.md#补偿擦除) + * [边界](book/20-Generics.md#边界) + * [通配符](book/20-Generics.md#通配符) + * [问题](book/20-Generics.md#问题) + * [自我约束类型](book/20-Generics.md#自我约束类型) + * [动态类型安全](book/20-Generics.md#动态类型安全) + * [泛型异常](book/20-Generics.md#泛型异常) + * [混入](book/20-Generics.md#混入) + * [潜在类型](book/20-Generics.md#潜在类型) + * [补偿不足](book/20-Generics.md#补偿不足) + * [辅助潜在类型](book/20-Generics.md#辅助潜在类型) + * [泛型的优劣](book/20-Generics.md#泛型的优劣) * [第二十一章 数组](book/21-Arrays.md) * [](book/21-Arrays.md#) * [](book/21-Arrays.md#) diff --git a/book/20-Generics.md b/book/20-Generics.md index 965b1dc7..0ede2848 100644 --- a/book/20-Generics.md +++ b/book/20-Generics.md @@ -1,7 +1,86 @@ [TOC] + # 第二十章 泛型 + + +## 简单泛型 + + + +## 泛型接口 + + + +## 泛型方法 + + + +## 复杂模型构建 + + + +## 泛型擦除 + + + +## 补偿擦除 + + + +## 边界 + + + +## 通配符 + + + +## 问题 + + + +## 自我约束类型 + + + +## 动态类型安全 + + + +## 泛型异常 + + + +## 混入 + + + +## 潜在类型 + + + +## 补偿不足 + + + +## 辅助潜在类型 + + + +## 泛型的优劣 + + + + + + + + + + +
\ No newline at end of file From 5d097b4a0e9e6d26cd6bd72afdda9c6bcbd18c21 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 02:31:05 +0800 Subject: [PATCH 047/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 38 +++++++++++----------- book/21-Arrays.md | 83 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 19 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index cd8987c0..b6418a2e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -259,25 +259,25 @@ * [辅助潜在类型](book/20-Generics.md#辅助潜在类型) * [泛型的优劣](book/20-Generics.md#泛型的优劣) * [第二十一章 数组](book/21-Arrays.md) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) - * [](book/21-Arrays.md#) + * [数组特性](book/21-Arrays.md#数组特性) + * [一等对象](book/21-Arrays.md#一等对象) + * [返回数组](book/21-Arrays.md#返回数组) + * [多维数组](book/21-Arrays.md#多维数组) + * [泛型数组](book/21-Arrays.md#泛型数组) + * [Arrays的fill方法](book/21-Arrays.md#Arrays的fill方法) + * [Arrays的setAll方法](book/21-Arrays.md#Arrays的setAll方法) + * [增量生成](book/21-Arrays.md#增量生成) + * [随机生成](book/21-Arrays.md#随机生成) + * [泛型和基本数组](book/21-Arrays.md#泛型和基本数组) + * [数组元素修改](book/21-Arrays.md#数组元素修改) + * [数组并行](book/21-Arrays.md#数组并行) + * [Arrays工具类](book/21-Arrays.md#Arrays工具类) + * [数组拷贝](book/21-Arrays.md#数组拷贝) + * [数组比较](book/21-Arrays.md#数组比较) + * [流和数组](book/21-Arrays.md#流和数组) + * [数组排序](book/21-Arrays.md#数组排序) + * [binarySearch二分查找](book/21-Arrays.md#binarySearch二分查找) + * [parallelPrefix并行前缀](book/21-Arrays.md#parallelPrefix并行前缀) * [本章小结](book/21-Arrays.md#本章小结) * [第二十二章 枚举](book/22-Enumerations.md) * [](book/22-Enumerations.md#) diff --git a/book/21-Arrays.md b/book/21-Arrays.md index bea68dfe..a5abe15b 100644 --- a/book/21-Arrays.md +++ b/book/21-Arrays.md @@ -1,7 +1,90 @@ [TOC] + # 第二十一章 数组 + + +## 数组特性 + + + +## 一等对象 + + + +## 返回数组 + + + +## 多维数组 + + + +## 泛型数组 + + + +## Arrays的fill方法 + + + +## Arrays的setAll方法 + + + +## 增量生成 + + + +## 随机生成 + + + +## 泛型和基本数组 + + + +## 数组元素修改 + + + +## 数组并行 + + + +## Arrays工具类 + + + +## 数组拷贝 + + + +## 数组比较 + + + +## 流和数组 + + + +## 数组排序 + + + +## binarySearch二分查找 + + + +## parallelPrefix并行前缀 + + + +## 本章小结 + + +
\ No newline at end of file From 89bb1890d99be0ac648e3b763e1bb6e19b448200 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 02:46:30 +0800 Subject: [PATCH 048/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 22 +++++++++--------- book/22-Enumerations.md | 51 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index b6418a2e..9d9b3b47 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -280,17 +280,17 @@ * [parallelPrefix并行前缀](book/21-Arrays.md#parallelPrefix并行前缀) * [本章小结](book/21-Arrays.md#本章小结) * [第二十二章 枚举](book/22-Enumerations.md) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) - * [](book/22-Enumerations.md#) + * [基本功能](book/22-Enumerations.md#基本功能) + * [方法添加](book/22-Enumerations.md#方法添加) + * [switch语句](book/22-Enumerations.md#switch语句) + * [values方法](book/22-Enumerations.md#values方法) + * [实现而非继承](book/22-Enumerations.md#实现而非继承) + * [随机选择](book/22-Enumerations.md#随机选择) + * [使用接口组织](book/22-Enumerations.md#使用接口组织) + * [使用EnumSet替代Flags](book/22-Enumerations.md#使用EnumSet替代Flags) + * [使用EnumMap](book/22-Enumerations.md#使用EnumMap) + * [常量特定方法](book/22-Enumerations.md#常量特定方法) + * [多次调度](book/22-Enumerations.md#多次调度) * [本章小结](book/22-Enumerations.md#本章小结) * [第二十三章 注解](book/23-Annotations.md) * [](book/23-Annotations.md#) diff --git a/book/22-Enumerations.md b/book/22-Enumerations.md index 34a90489..1456550b 100644 --- a/book/22-Enumerations.md +++ b/book/22-Enumerations.md @@ -1,7 +1,58 @@ [TOC] + # 第二十二章 枚举 + + +## 基本功能 + + + +## 方法添加 + + + +## switch语句 + + + +## values方法 + + + +## 实现而非继承 + + + +## 随机选择 + + + +## 使用接口组织 + + + +## 使用EnumSet替代Flags + + + +## 使用EnumMap + + + +## 常量特定方法 + + + +## 多次调度 + + + +## 本章小结 + + +
\ No newline at end of file From 232364da555bea9f8edd8688c08504059adc6cb9 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 02:50:11 +0800 Subject: [PATCH 049/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 8 ++++---- book/23-Annotations.md | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 9d9b3b47..416fd84e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -293,10 +293,10 @@ * [多次调度](book/22-Enumerations.md#多次调度) * [本章小结](book/22-Enumerations.md#本章小结) * [第二十三章 注解](book/23-Annotations.md) - * [](book/23-Annotations.md#) - * [](book/23-Annotations.md#) - * [](book/23-Annotations.md#) - * [](book/23-Annotations.md#) + * [基本语法](book/23-Annotations.md#基本语法) + * [编写注解处理器](book/23-Annotations.md#编写注解处理器) + * [使用javac处理注解](book/23-Annotations.md#使用javac处理注解) + * [基于注解的单元测试](book/23-Annotations.md#基于注解的单元测试) * [本章小结](book/23-Annotations.md#本章小结) * [第二十四章 并发编程](book/24-Concurrent-Programming.md) * [](book/24-Concurrent-Programming.md#) diff --git a/book/23-Annotations.md b/book/23-Annotations.md index 81e3a7ff..1f386a5c 100644 --- a/book/23-Annotations.md +++ b/book/23-Annotations.md @@ -1,7 +1,30 @@ [TOC] + # 第二十三章 注解 + + +## 基本语法 + + + +## 编写注解处理器 + + + +## 使用javac处理注解 + + + +## 基于注解的单元测试 + + + +## 本章小结 + + +
\ No newline at end of file From 900f82132e8b1a8cf54781c0f6eef19c3b7eb5d1 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 03:18:22 +0800 Subject: [PATCH 050/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E7=BC=96=E7=A8=8B=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 26 +++++++------- book/24-Concurrent-Programming.md | 59 +++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 13 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 416fd84e..b0bc2b85 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -299,19 +299,19 @@ * [基于注解的单元测试](book/23-Annotations.md#基于注解的单元测试) * [本章小结](book/23-Annotations.md#本章小结) * [第二十四章 并发编程](book/24-Concurrent-Programming.md) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) - * [](book/24-Concurrent-Programming.md#) + * [术语问题](book/24-Concurrent-Programming.md#术语问题) + * [并发的超能力](book/24-Concurrent-Programming.md#并发的超能力) + * [针对速度](book/24-Concurrent-Programming.md#针对速度) + * [四句格言](book/24-Concurrent-Programming.md#四句格言) + * [残酷的真相](book/24-Concurrent-Programming.md#残酷的真相) + * [本章其余部分](book/24-Concurrent-Programming.md#本章其余部分) + * [并行流](book/24-Concurrent-Programming.md#并行流) + * [创建和运行任务](book/24-Concurrent-Programming.md#创建和运行任务) + * [终止耗时任务](book/24-Concurrent-Programming.md#终止耗时任务) + * [CompletableFuture类](book/24-Concurrent-Programming.md#CompletableFuture类) + * [死锁](book/24-Concurrent-Programming.md#死锁) + * [构造函数非线程安全](book/24-Concurrent-Programming.md#构造函数非线程安全) + * [复杂性和代价](book/24-Concurrent-Programming.md#复杂性和代价) * [本章小结](book/24-Concurrent-Programming.md#本章小结) * [第二十五章 正则表达式](book/25-Patterns.md) * [](book/25-Patterns.md#) diff --git a/book/24-Concurrent-Programming.md b/book/24-Concurrent-Programming.md index bc15d3fe..b52e5401 100644 --- a/book/24-Concurrent-Programming.md +++ b/book/24-Concurrent-Programming.md @@ -1,7 +1,66 @@ [TOC] + # 第二十四章 并发编程 + + +## 术语问题 + + + +## 并发的超能力 + + + +## 针对速度 + + + +## 四句格言 + + + +## 残酷的真相 + + + +## 本章其余部分 + + + +## 并行流 + + + +## 创建和运行任务 + + + +## 终止耗时任务 + + + +## CompletableFuture类 + + + +## 死锁 + + + +## 构造函数非线程安全 + + + +## 复杂性和代价 + + + +## 本章小结 + + +
\ No newline at end of file From 7f3a2bcd92dc61e5579896ecae341beb9f433a75 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 03:43:32 +0800 Subject: [PATCH 051/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 32 ++++++++++------------ book/25-Patterns.md | 67 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 18 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index b0bc2b85..5698a905 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -194,8 +194,6 @@ * [异常准则](book/15-Exceptions.md#异常准则) * [异常指南](book/15-Exceptions.md#异常指南) * [本章小结](book/15-Exceptions.md#本章小结) - -## 本章小结 * [第十六章 代码校验](book/16-Validating-Your-Code.md) * [测试](book/16-Validating-Your-Code.md#测试) * [前提条件](book/16-Validating-Your-Code.md#前提条件) @@ -313,21 +311,21 @@ * [构造函数非线程安全](book/24-Concurrent-Programming.md#构造函数非线程安全) * [复杂性和代价](book/24-Concurrent-Programming.md#复杂性和代价) * [本章小结](book/24-Concurrent-Programming.md#本章小结) -* [第二十五章 正则表达式](book/25-Patterns.md) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) - * [](book/25-Patterns.md#) +* [第二十五章 设计模式](book/25-Patterns.md) + * [概念](book/25-Patterns.md#概念) + * [构建型](book/25-Patterns.md#构建型) + * [面向实施](book/25-Patterns.md#面向实施) + * [工厂模式](book/25-Patterns.md#工厂模式) + * [函数对象](book/25-Patterns.md#函数对象) + * [接口改变](book/25-Patterns.md#接口改变) + * [解释器](book/25-Patterns.md#解释器) + * [回调](book/25-Patterns.md#回调) + * [多次调度](book/25-Patterns.md#多次调度) + * [模式重构](book/25-Patterns.md#模式重构) + * [抽象用法](book/25-Patterns.md#抽象用法) + * [多次派遣](book/25-Patterns.md#多次派遣) + * [访问者模式](book/25-Patterns.md#访问者模式) + * [RTTI的优劣](book/25-Patterns.md#RTTI的优劣) * [本章小结](book/25-Patterns.md#本章小结) ### 附录 diff --git a/book/25-Patterns.md b/book/25-Patterns.md index 713c00f0..9ae1f0d2 100644 --- a/book/25-Patterns.md +++ b/book/25-Patterns.md @@ -1,6 +1,71 @@ [TOC] -# 第二十五章 正则表达式 + +# 第二十五章 设计模式 + + + +## 概念 + + + +## 构建型 + + + +## 面向实施 + + + +## 工厂模式 + + + +## 函数对象 + + + +## 接口改变 + + + +## 解释器 + + + +## 回调 + + + +## 多次调度 + + + +## 模式重构 + + + +## 抽象用法 + + + +## 多次派遣 + + + +## 访问者模式 + + + +## RTTI的优劣 + + + +## 本章小结 + + + + From e3680ca08b3de398e0315855da0e5b8ccb380f17 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 03:57:28 +0800 Subject: [PATCH 052/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=99=84=E5=BD=95?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 6 +++--- book/Appendix-Supplements.md | 13 +++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 5698a905..e7d360ef 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -331,9 +331,9 @@ ### 附录 * [附录:补充](book/Appendix-Supplements.md) - * [](book/Appendix-Supplements.md#) - * [](book/Appendix-Supplements.md#) - * [](book/Appendix-Supplements.md#) + * [可下载的补充](book/Appendix-Supplements.md#可下载的补充) + * [通过Thinking-in-C来巩固Java基础](book/Appendix-Supplements.md#通过Thinking-in-C来巩固Java基础) + * [动手实践](book/Appendix-Supplements.md#动手实践) * [附录:编程指南](book/Appendix-Programming-Guidelines.md) * [](book/Appendix-Programming-Guidelines.md#) * [](book/Appendix-Programming-Guidelines.md#) diff --git a/book/Appendix-Supplements.md b/book/Appendix-Supplements.md index ca98d3c6..5afdb740 100644 --- a/book/Appendix-Supplements.md +++ b/book/Appendix-Supplements.md @@ -1,7 +1,20 @@ [TOC] + # 附录:补充 + + +## 可下载的补充 + + + +## 通过Thinking-in-C来巩固Java基础 + + + +## 动手实践 +
\ No newline at end of file From b8869607e02847b01dac832c3814be4d1a88cf1e Mon Sep 17 00:00:00 2001 From: LingCoder Date: Mon, 25 Mar 2019 04:56:56 +0800 Subject: [PATCH 053/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=99=84=E5=BD=95?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=AB=A0=E8=8A=82=E5=AD=90=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 126 +++++++++--------- book/Appendix-Becoming-a-Programmer.md | 25 ++++ ...efits-and-Costs-of-Static-Type-Checking.md | 22 +++ book/Appendix-Collection-Topics.md | 71 ++++++++++ book/Appendix-Data-Compression.md | 13 ++ book/Appendix-IO-Streams.md | 30 +++++ book/Appendix-Javadoc.md | 1 + book/Appendix-Low-Level-Concurrency.md | 38 ++++++ book/Appendix-New-IO.md | 19 ++- book/Appendix-Object-Serialization.md | 15 +++ .../Appendix-Passing-and-Returning-Objects.md | 23 ++++ book/Appendix-Programming-Guidelines.md | 11 ++ book/Appendix-Standard-IO.md | 4 + book/Appendix-Supplements.md | 2 +- ...Positive-Legacy-of-C-plus-plus-and-Java.md | 2 +- ...endix-Understanding-equals-and-hashCode.md | 14 +- 16 files changed, 343 insertions(+), 73 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index e7d360ef..8e845194 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -335,84 +335,84 @@ * [通过Thinking-in-C来巩固Java基础](book/Appendix-Supplements.md#通过Thinking-in-C来巩固Java基础) * [动手实践](book/Appendix-Supplements.md#动手实践) * [附录:编程指南](book/Appendix-Programming-Guidelines.md) - * [](book/Appendix-Programming-Guidelines.md#) - * [](book/Appendix-Programming-Guidelines.md#) + * [设计](book/Appendix-Programming-Guidelines.md#设计) + * [实现](book/Appendix-Programming-Guidelines.md#实现) * [附录:文档注释](book/Appendix-Javadoc.md) * [附录:对象传递和返回](book/Appendix-Passing-and-Returning-Objects.md) - * [](book/Appendix-Passing-and-Returning-Objects.md#) - * [](book/Appendix-Passing-and-Returning-Objects.md#) - * [](book/Appendix-Passing-and-Returning-Objects.md#) - * [](book/Appendix-Passing-and-Returning-Objects.md#) + * [传递引用](book/Appendix-Passing-and-Returning-Objects.md#传递引用) + * [本地拷贝](book/Appendix-Passing-and-Returning-Objects.md#本地拷贝) + * [控制克隆](book/Appendix-Passing-and-Returning-Objects.md#控制克隆) + * [不可变类](book/Appendix-Passing-and-Returning-Objects.md#不可变类) * [本章小结](book/Appendix-Passing-and-Returning-Objects.md#本章小结) * [附录:流式IO](book/Appendix-IO-Streams.md) - * [](book/Appendix-IO-Streams.md#) - * [](book/Appendix-IO-Streams.md#) - * [](book/Appendix-IO-Streams.md#) - * [](book/Appendix-IO-Streams.md#) - * [](book/Appendix-IO-Streams.md#) - * [](book/Appendix-IO-Streams.md#) + * [输入流类型](book/Appendix-IO-Streams.md#输入流类型) + * [输出流类型](book/Appendix-IO-Streams.md#输出流类型) + * [添加属性和有用的接口](book/Appendix-IO-Streams.md#添加属性和有用的接口) + * [Reader和Writer](book/Appendix-IO-Streams.md#Reader和Writer) + * [RandomAccessFile类](book/Appendix-IO-Streams.md#RandomAccessFile类) + * [IO流典型用途](book/Appendix-IO-Streams.md#IO流典型用途) * [本章小结](book/Appendix-IO-Streams.md#本章小结) * [附录:标准IO](book/Appendix-Standard-IO.md) - * [](book/Appendix-Standard-IO.md#) + * [执行控制](book/Appendix-Standard-IO.md#执行控制) * [附录:新IO](book/Appendix-New-IO.md) - * [](book/Appendix-New-IO.md#) - * [](book/Appendix-New-IO.md#) - * [](book/Appendix-New-IO.md#) - * [](book/Appendix-New-IO.md#) - * [](book/Appendix-New-IO.md#) - * [](book/Appendix-New-IO.md#) - * [](book/Appendix-New-IO.md#) + * [ByteBuffer](book/Appendix-New-IO.md#ByteBuffer) + * [转换数据](book/Appendix-New-IO.md#转换数据) + * [获取原始类型](book/Appendix-New-IO.md#获取原始类型) + * [视图缓冲区](book/Appendix-New-IO.md#视图缓冲区) + * [使用缓冲区进行数据操作](book/Appendix-New-IO.md#使用缓冲区进行数据操作) + * [内存映射文件](book/Appendix-New-IO.md#内存映射文件) + * [文件锁定](book/Appendix-New-IO.md#文件锁定) * [附录:理解equals和hashCode方法](book/Appendix-Understanding-equals-and-hashCode.md) - * [](book/Appendix-Understanding-equals-and-hashCode.md#) - * [](book/Appendix-Understanding-equals-and-hashCode.md#) - * [](book/Appendix-Understanding-equals-and-hashCode.md#) + * [equals典范](book/Appendix-Understanding-equals-and-hashCode.md#equals典范) + * [哈希和哈希码](book/Appendix-Understanding-equals-and-hashCode.md#哈希和哈希码) + * [调整HashMap](book/Appendix-Understanding-equals-and-hashCode.md#调整HashMap) * [附录:集合主题](book/Appendix-Collection-Topics.md) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) - * [](book/Appendix-Collection-Topics.md#) + * [示例数据](book/Appendix-Collection-Topics.md#示例数据) + * [List表现](book/Appendix-Collection-Topics.md#List表现) + * [Set表现](book/Appendix-Collection-Topics.md#Set表现) + * [在Map中使用函数式操作](book/Appendix-Collection-Topics.md#在Map中使用函数式操作) + * [选择Map的部分](book/Appendix-Collection-Topics.md#选择Map的部分) + * [集合的fill方法](book/Appendix-Collection-Topics.md#集合的fill方法) + * [使用Flyweight自定义集合和Map](book/Appendix-Collection-Topics.md#使用Flyweight自定义集合和Map) + * [集合功能](book/Appendix-Collection-Topics.md#集合功能) + * [可选操作](book/Appendix-Collection-Topics.md#可选操作) + * [Set和存储顺序](book/Appendix-Collection-Topics.md#Set和存储顺序) + * [队列](book/Appendix-Collection-Topics.md#队列) + * [理解Map](book/Appendix-Collection-Topics.md#理解Map) + * [集合工具类](book/Appendix-Collection-Topics.md#集合工具类) + * [持有引用](book/Appendix-Collection-Topics.md#持有引用) + * [避免旧式类库](book/Appendix-Collection-Topics.md#避免旧式类库) + * [本章小结](book/Appendix-Collection-Topics.md#本章小结) * [附录:并发底层原理](book/Appendix-Low-Level-Concurrency.md) - * [](book/Appendix-Low-Level-Concurrency.md#) - * [](book/Appendix-Low-Level-Concurrency.md#) - * [](book/Appendix-Low-Level-Concurrency.md#) - * [](book/Appendix-Low-Level-Concurrency.md#) - * [](book/Appendix-Low-Level-Concurrency.md#) - * [](book/Appendix-Low-Level-Concurrency.md#) - * [](book/Appendix-Low-Level-Concurrency.md#) + * [线程](book/Appendix-Low-Level-Concurrency.md#线程) + * [异常捕获](book/Appendix-Low-Level-Concurrency.md#异常捕获) + * [资源共享](book/Appendix-Low-Level-Concurrency.md#资源共享) + * [volatile关键字](book/Appendix-Low-Level-Concurrency.md#volatile关键字) + * [原子性](book/Appendix-Low-Level-Concurrency.md#原子性) + * [关键部分](book/Appendix-Low-Level-Concurrency.md#关键部分) + * [库组件](book/Appendix-Low-Level-Concurrency.md#库组件) * [本章小结](book/Appendix-Low-Level-Concurrency.md#本章小结) * [附录:数据压缩](book/Appendix-Data-Compression.md) - * [](book/Appendix-Data-Compression.md#) - * [](book/Appendix-Data-Compression.md#) - * [](book/Appendix-Data-Compression.md#) + * [使用Gzip简单压缩](book/Appendix-Data-Compression.md#使用Gzip简单压缩) + * [使用zip多文件存储](book/Appendix-Data-Compression.md#使用zip多文件存储) + * [Java的jar](book/Appendix-Data-Compression.md#Java的jar) * [附录:对象序列化](book/Appendix-Object-Serialization.md) - * [](book/Appendix-Object-Serialization.md#) - * [](book/Appendix-Object-Serialization.md#) - * [](book/Appendix-Object-Serialization.md#) + * [查找类](book/Appendix-Object-Serialization.md#查找类) + * [控制序列化](book/Appendix-Object-Serialization.md#控制序列化) + * [使用持久化](book/Appendix-Object-Serialization.md#使用持久化) * [附录:静态语言类型检查](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md) - * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) - * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) - * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) - * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) - * [](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#) + * [前言](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#前言) + * [静态类型检查和测试](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#静态类型检查和测试) + * [如何提升打字](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#如何提升打字) + * [生产力的成本](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#生产力的成本) + * [静态和动态](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#静态和动态) * [附录:C++和Java的优良传统](book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md) * [附录:成为一名程序员](book/Appendix-Becoming-a-Programmer.md) - * [](book/Appendix-Becoming-a-Programmer.md#) - * [](book/Appendix-Becoming-a-Programmer.md#) - * [](book/Appendix-Becoming-a-Programmer.md#) - * [](book/Appendix-Becoming-a-Programmer.md#) - * [](book/Appendix-Becoming-a-Programmer.md#) - * [](book/Appendix-Becoming-a-Programmer.md#) + * [如何开始](book/Appendix-Becoming-a-Programmer.md#如何开始) + * [码农生涯](book/Appendix-Becoming-a-Programmer.md#码农生涯) + * [百分之五的神话](book/Appendix-Becoming-a-Programmer.md#百分之五的神话) + * [重在动手](book/Appendix-Becoming-a-Programmer.md#重在动手) + * [像打字般编程](book/Appendix-Becoming-a-Programmer.md#像打字般编程) + * [做你喜欢的事](book/Appendix-Becoming-a-Programmer.md#做你喜欢的事) * [词汇表](GLOSSARY.md) diff --git a/book/Appendix-Becoming-a-Programmer.md b/book/Appendix-Becoming-a-Programmer.md index 4fe1fd12..5b7e4c21 100644 --- a/book/Appendix-Becoming-a-Programmer.md +++ b/book/Appendix-Becoming-a-Programmer.md @@ -1,7 +1,32 @@ [TOC] + # 附录:成为一名程序员 + + +## 如何开始 + + + +## 码农生涯 + + + +## 百分之五的神话 + + + +## 重在动手 + + + +## 像打字般编程 + + + +## 做你喜欢的事 +
\ No newline at end of file diff --git a/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md b/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md index 01c0cd8f..071a3c32 100644 --- a/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md +++ b/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md @@ -1,7 +1,29 @@ [TOC] + # 附录:静态语言类型检查 + + +## 前言 + + + +## 静态类型检查和测试 + + + +## 如何提升打字 + + + +## 生产力的成本 + + + +## 静态和动态 + +
\ No newline at end of file diff --git a/book/Appendix-Collection-Topics.md b/book/Appendix-Collection-Topics.md index 57ea3429..f479c555 100644 --- a/book/Appendix-Collection-Topics.md +++ b/book/Appendix-Collection-Topics.md @@ -1,7 +1,78 @@ [TOC] + # 附录:集合主题 + + +## 示例数据 + + + +## List表现 + + + +## Set表现 + + + +## 在Map中使用函数式操作 + + + +## 选择Map的部分 + + + +## 集合的fill方法 + + + +## 使用Flyweight自定义集合和Map + + + +## 集合功能 + + + +## 可选操作 + + + +## Set和存储顺序 + + + +## 队列 + + + +## 理解Map + + + +## 集合工具类 + + + +## 持有引用 + + + +## 避免旧式类库 + + + +## 本章小结 + + + + + + +
\ No newline at end of file diff --git a/book/Appendix-Data-Compression.md b/book/Appendix-Data-Compression.md index d2640889..10f4ea27 100644 --- a/book/Appendix-Data-Compression.md +++ b/book/Appendix-Data-Compression.md @@ -1,7 +1,20 @@ [TOC] + # 附录:数据压缩 + + +## 使用Gzip简单压缩 + + + +## 使用zip多文件存储 + + + +## Java的jar +
\ No newline at end of file diff --git a/book/Appendix-IO-Streams.md b/book/Appendix-IO-Streams.md index 51fd15c0..56c9342e 100644 --- a/book/Appendix-IO-Streams.md +++ b/book/Appendix-IO-Streams.md @@ -1,7 +1,37 @@ [TOC] + # 附录:流式IO + + +## 输入流类型 + + + +## 输出流类型 + + + +## 添加属性和有用的接口 + + + +## Reader和Writer + + + +## RandomAccessFile类 + + + +## IO流典型用途 + + + +## 本章小结 + +
\ No newline at end of file diff --git a/book/Appendix-Javadoc.md b/book/Appendix-Javadoc.md index 3337039c..5ea99544 100644 --- a/book/Appendix-Javadoc.md +++ b/book/Appendix-Javadoc.md @@ -1,5 +1,6 @@ [TOC] + # 附录:文档注释 diff --git a/book/Appendix-Low-Level-Concurrency.md b/book/Appendix-Low-Level-Concurrency.md index 3441e7a8..9de1eb6b 100644 --- a/book/Appendix-Low-Level-Concurrency.md +++ b/book/Appendix-Low-Level-Concurrency.md @@ -1,4 +1,42 @@ [TOC] + # 附录:并发底层原理 + + +## 线程 + + + +## 异常捕获 + + + +## 资源共享 + + + +## volatile关键字 + + + +## 原子性 + + + +## 关键部分 + + + +## 库组件 + + + +## 本章小结 + + + + +
+ diff --git a/book/Appendix-New-IO.md b/book/Appendix-New-IO.md index e4bcbace..da0dee11 100644 --- a/book/Appendix-New-IO.md +++ b/book/Appendix-New-IO.md @@ -1,5 +1,6 @@ [TOC] + # 附录:新IO @@ -11,7 +12,9 @@ Java “新” I/O 库,是在Java 1.4引入到 **Java .nio.* package** 中。 本附录将深入探讨 nio 包。像I/O streams 这样的高级库使用 **nio**,但是大多数时候您不需要在这个级别使用 I/O 。在Java 7和Java 8,您(理想情况下)除了特殊情况外,甚至不需要使用I/O流。理想情况下,您将经常使用的所有内容都包含在文件一章中。只有在处理性能问题 (例如,可能需要内存映射文件)或创建自己的 I/O 库时,才需要理解 **nio**。 -## ByteBuffers + +## ByteBuffer + 直接与通道通信的缓冲区只有一个类型,就是 bytebuffer 。也就是说,一个保存原始字节的缓冲区。如果您查看 **java.nio.ByteBuffer** 的JDK文档,你会发现它很基本 : 您可以通过告诉它要分配多少存储空间来创建一个方法,并且可以使用一些方法来放置和获取数据,这些方法可以是原始字节形式的数据,也可以是原始数据类型的数据。但是没有办法放置或获取对象,甚至字符串。它是相当低层次的,因为这使得大多数操作系统的映射更加有效。 @@ -162,10 +165,11 @@ public class TransferTo { 你不会经常这样做,但知道这一点很好。 - + ## 转换数据 + 在 **GetChannel** 中打印文件中的信息。在 java 中,我们每次提取一个字节的数据,并将每个字节转换为 char。这看起来很简单——如果您查看**java.nio.CharBuffer** 类,您将看到它有一个toString()方法,该方法说,“返回一个包含这个缓冲区中的字符的字符串。” 既然 **ByteBuffer** 可以用 **asCharBuffer()** 方法看作 **CharBuffer**,为什么不使用它呢? 从下面输出语句的第一行可以看出,这并不正确: @@ -322,10 +326,11 @@ gb2312-1980 由于每个字符需要两个字节,这对于12个字符已经足够了,但是“some text”只有9个字节。其余的零字节仍然出现在由其toString()生成的CharBuffer的表示中,如输出所示。 - + ## 获取原始类型 + 虽然 **ByteBuffer** 只包含字节,但它包含了一些方法,用于从它所包含的字节中生成每种不同类型的基元值。这个例子展示了使用以下方法插入和提取各种值: ```java @@ -395,9 +400,9 @@ H o w d y ! 这将对每个基本数据类型执行。其中唯一有点奇怪的是 **ShortBuffer** 的 **put()**,它需要强制转换 (强制转换并更改结果值)。所有其他视图缓冲区都不需要在它们的 **put()** 方法中强制转换。 - ## 视图缓冲区 + “视图缓冲区”通过特定原始类型的窗口来查看底层 **ByteBuffer**。**ByteBuffer** 仍然是“支持”视图的实际存储,因此对视图所做的任何更改都反映在对 **ByteBuffer** 中的数据的修改中。 如前面的示例所示,这方便地将基本类型插入 **ByteBuffer**。视图缓冲区还可以从 **ByteBuffer** 读取原始值,一次读取一个(ByteBuffer允许),或者批量读取(数组)。下面是一个通过 **IntBuffer**在**ByteBuffer** 中操作 int 的例子: @@ -569,9 +574,9 @@ public class Endians { **charArray** 通过 **CharBuffer** 视图插入到 **ByteBuffer **中。当显示底层字节时,默认顺序与随后的大端序相同,而小端序则交换字节。 - ## 使用缓冲区进行数据操作 + 下图说明了 nio 类之间的关系,展示了如何移动和转换数据。例如,要将字节数组写入文件,使用ByteBuffer.wrap() 方法包装字节数组,使用 **getChannel()** 在 **FileOutputStream** 上打开通道,然后从 **ByteBuffer** 将数据写入 **FileChannel**。 ![image-20190324153202297](/Users/langdon/Library/Application Support/typora-user-images/image-20190324153202297.png) @@ -663,9 +668,9 @@ position 指向缓冲区中的第一个元素,capacity 和 limie 紧接在最 再次调用 **symmetricgrab()** 函数时,**CharBuffer** 将经历相同的过程并恢复到原始状态。 - ## 内存映射文件 + 内存映射文件允许您创建和修改太大而无法放入内存的文件。使用内存映射文件,您可以假装整个文件都在内存中,并将其视为一个非常大的数组来访问它。这种方法大大简化了您编写的修改文件的代码: ```java @@ -864,8 +869,8 @@ Mapped Read/Write: 0.013 请注意,**test()** 方法包括初始化各种I/O对象的时间,因此,尽管映射文件的设置可能很昂贵,但是与流I/O相比,总体收益非常可观。 +## 文件锁定 -### 文件锁定 文件锁定同步访问,因此文件可以是共享资源。但是,争用同一个文件的两个线程可能位于不同的jvm 中,可能一个是 Java 线程,另一个是操作系统中的某个本机线程。文件锁定对其他操作系统进程是可见的,因为Java文件锁定直接映射到本机操作系统锁定工具。 diff --git a/book/Appendix-Object-Serialization.md b/book/Appendix-Object-Serialization.md index 3f60e3ce..646dd1b2 100644 --- a/book/Appendix-Object-Serialization.md +++ b/book/Appendix-Object-Serialization.md @@ -1,7 +1,22 @@ [TOC] + # 附录:对象序列化 + + +## 查找类 + + + +## 控制序列化 + + + +## 使用持久化 + + +
\ No newline at end of file diff --git a/book/Appendix-Passing-and-Returning-Objects.md b/book/Appendix-Passing-and-Returning-Objects.md index b2a45a00..de6d712e 100644 --- a/book/Appendix-Passing-and-Returning-Objects.md +++ b/book/Appendix-Passing-and-Returning-Objects.md @@ -1,7 +1,30 @@ [TOC] + # 附录:对象传递和返回 + + +## 传递引用 + + + +## 本地拷贝 + + + +## 控制克隆 + + + +## 不可变类 + + + +## 本章小结 + + +
\ No newline at end of file diff --git a/book/Appendix-Programming-Guidelines.md b/book/Appendix-Programming-Guidelines.md index 0bf46760..2d654a13 100644 --- a/book/Appendix-Programming-Guidelines.md +++ b/book/Appendix-Programming-Guidelines.md @@ -1,7 +1,18 @@ [TOC] + # 附录:编程指南 + + +## 设计 + + + +## 实现 + + +
\ No newline at end of file diff --git a/book/Appendix-Standard-IO.md b/book/Appendix-Standard-IO.md index 96da9bc1..eab20ad3 100644 --- a/book/Appendix-Standard-IO.md +++ b/book/Appendix-Standard-IO.md @@ -1,7 +1,11 @@ [TOC] + # 附录:标准IO + +## 执行控制 +
\ No newline at end of file diff --git a/book/Appendix-Supplements.md b/book/Appendix-Supplements.md index 5afdb740..e5cc7917 100644 --- a/book/Appendix-Supplements.md +++ b/book/Appendix-Supplements.md @@ -15,6 +15,6 @@ ## 动手实践 - +
\ No newline at end of file diff --git a/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md b/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md index f35da00b..fb26815b 100644 --- a/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md +++ b/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md @@ -1,8 +1,8 @@ [TOC] + # 附录:C++和Java的优良传统 -
diff --git a/book/Appendix-Understanding-equals-and-hashCode.md b/book/Appendix-Understanding-equals-and-hashCode.md index 15e2fa58..1dafbdcf 100644 --- a/book/Appendix-Understanding-equals-and-hashCode.md +++ b/book/Appendix-Understanding-equals-and-hashCode.md @@ -1,7 +1,19 @@ [TOC] + # 附录:理解equals和hashCode方法 - + +## equals典范 + + + +## 哈希和哈希码 + + + +## 调整HashMap + +
\ No newline at end of file From 5c272c15c84b48b05a668446a39e6422bf668d55 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Tue, 26 Mar 2019 00:31:39 +0800 Subject: [PATCH 054/814] =?UTF-8?q?=E8=BE=93=E5=87=BA=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/03-Objects-Everywhere.md | 8 ++++---- book/04-Operators.md | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/book/03-Objects-Everywhere.md b/book/03-Objects-Everywhere.md index 108ea35d..58ada688 100644 --- a/book/03-Objects-Everywhere.md +++ b/book/03-Objects-Everywhere.md @@ -528,9 +528,11 @@ public class ShowProperties { System.out.println(System.getProperty("java.library.path")); } } +``` + +输出结果(前20行): -/* Output:(前20行) --- listing properties -- +```text java.runtime.name=Java(TM) SE Runtime Environment sun.boot.library.path=C:\Program Files\Java\jdk1.8.0_112\jr... @@ -553,8 +555,6 @@ java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0_112\jr... os.arch=amd64 java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\ -... -*/ ``` 上例主方法中的第一行,会输出所有的系统属性,也就是环境信息。 **list()** 方法将结果发送给它的参数 **System.out** 在本书的后面,我们还会接触到将结果输出到其他地方,如文件中。另外,我们还可以请求特定的属性。该例中我们使用到了 **user.name** 和 **java.library.path**。 末尾的 “/* Output:”标记表示此文件生成的输出的开头。本书中产生输出的大多数示例将会以包含此注释形式的输出,因此我们可以看到输出并知道它是正确的。带有这个标签允许在使用编译器检查并执行后将输出自动更新到本书的文本中。 diff --git a/book/04-Operators.md b/book/04-Operators.md index d533b07a..8a114a73 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -4,11 +4,21 @@ # 第四章 运算符 +>运算符操纵数据。 + +Java 是从 C++ 的基础上发展而成的。因此,对于 C/C++ 程序员来说,Java 的运算符并不陌生。当然,Java 还做了一些改进和简化。如果你已了解 C 或 C++,大可以跳过本章和下一章,直接阅读 Java 和 C/++ 不同的地方。 + +当然,如果你认为自己理解这两章还有些艰难,那么可以先了解下 *Thinking in C* 再开始后面的工作。 这本书现在可以在 [www.OnJava8.com](http://www.OnJava8.com]) 上免费下载。它的内容包含音频讲座、幻灯片、练习和解决方案,专门用于帮助你快速掌握学习 Java 所需的基础知识。 + ## 使用说明 +运算符接受一个或多个参数并生成新值。这个参数与普通方法调用的形式是不同的,但效果是相同的。加法 `+`,减法 `-`,乘法 `*`,除法 `/` 以及赋值 `=` 在任何编程语言中的工作方式都相同。所有运算符都从其操作数中生成一个值。此外,一些运算符会更改操作数的值。 + +修改操作数的运算符最常见的用途是生成副作用,但请记住,生成的值可供你使用,就像在没有副作用的运算符中一样。几乎所有的操作符都只使用原语。例外是`=`、`==` 和 `!=`,用于所有对象(并且是对象的混淆点)。此外,String 类而也支持 `+` 和 `+=`。 + ## 优先级 From 093fa2ac6afff9c97d06e1224caa146af0b14d15 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Tue, 26 Mar 2019 09:27:01 +0800 Subject: [PATCH 055/814] =?UTF-8?q?=E8=BF=90=E7=AE=97=E7=AC=A6=E7=BF=BB?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/04-Operators.md | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/book/04-Operators.md b/book/04-Operators.md index 8a114a73..598f4001 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -6,23 +6,52 @@ >运算符操纵数据。 -Java 是从 C++ 的基础上发展而成的。因此,对于 C/C++ 程序员来说,Java 的运算符并不陌生。当然,Java 还做了一些改进和简化。如果你已了解 C 或 C++,大可以跳过本章和下一章,直接阅读 Java 和 C/++ 不同的地方。 +Java 是从 C++ 的基础上做了一些改进和简化发展而成的。对于 C/C++ 程序员来说,Java 的运算符并不陌生。如果你已了解 C 或 C++,大可以跳过本章和下一章,直接阅读 Java 与 C/C++ 不同的地方。 -当然,如果你认为自己理解这两章还有些艰难,那么可以先了解下 *Thinking in C* 再开始后面的工作。 这本书现在可以在 [www.OnJava8.com](http://www.OnJava8.com]) 上免费下载。它的内容包含音频讲座、幻灯片、练习和解决方案,专门用于帮助你快速掌握学习 Java 所需的基础知识。 +如果理解这两章的内容对你来说还有点困难,那么我推荐你先了解下 *Thinking in C* 再继续后面的学习。 这本书现在可以在 [www.OnJava8.com](http://www.OnJava8.com]) 上免费下载。它的内容包含音频讲座、幻灯片、练习和解决方案,专门用于帮助你快速掌握学习 Java 所需的基础知识。 ## 使用说明 -运算符接受一个或多个参数并生成新值。这个参数与普通方法调用的形式是不同的,但效果是相同的。加法 `+`,减法 `-`,乘法 `*`,除法 `/` 以及赋值 `=` 在任何编程语言中的工作方式都相同。所有运算符都从其操作数中生成一个值。此外,一些运算符会更改操作数的值。 +运算符接受一个或多个参数并生成新值。这个参数与普通方法调用的形式是不同的,但效果是相同的。加法 `+`,减法 `-`,乘法 `*`,除法 `/` 以及赋值 `=` 在任何编程语言中的工作方式都是类似的。所有运算符都能根据自己的运算对象生成一个值。除此以外,一个运算符可改变运算对象的值,这叫作“副作用”(**Side Effect**)。算符最常见的用途就是修改自己的运算对象,从而产生副作用。但要注意生成的值亦可由没有副作用的运算符生成。 + +几乎所有运算符都只能操作基本类型(*Primitives*)。唯一的例外是`=`、`==`和`!=`,它们能操作所有对象(这也是令人混淆的一个地方)。除此以外,**String** 类支持`+`和`+=`。 -修改操作数的运算符最常见的用途是生成副作用,但请记住,生成的值可供你使用,就像在没有副作用的运算符中一样。几乎所有的操作符都只使用原语。例外是`=`、`==` 和 `!=`,用于所有对象(并且是对象的混淆点)。此外,String 类而也支持 `+` 和 `+=`。 ## 优先级 +运算符的优先级决定了存在多个运算符时一个表达式各部分的计算顺序。Java 对计算顺序作出了特别的规定。其中,最简单的规则就是乘法和除法在加法和减法之前完成。程序员经常都会忘记其他优先级规则,所以应该用括号明确规定计算顺序。代码示例: + +```JAVA +// operators/Precedence.java +public class Precedence { + + public static void main(String[] args) { + int x = 1, y = 2, z = 3; + int a = x + y - 2/2 + z; // [1] + int b = x + (y - 2)/(2 + z); // [2] + System.out.println("a = " + a); + System.out.println("b = " + b); + } +} +``` + + 输出结果: + +``` + a = 5 + b = 1 +``` + +这些语句看起来大致相同,但从输出中我们可以看出它们具有非常不同的含义,具体取决于括号的使用。 + +我们注意到,在 `System.out.println() ` 语句中使用了`+`运算符。 但是在这里 `+`代表的意思是字符串连接符。当编译器看到字符串的后面连着一个非`+`连接的非字符串,那么其将会试图去转换这个非字符串成为字符串。上例中的输出结果说明了 a 和 b 都已经被转化成了字符串。 + + ## 赋值 From c08b2a880fe5dd4acbc69351d311b38bece339c3 Mon Sep 17 00:00:00 2001 From: LingCoder <34231795+LingCoder@users.noreply.github.com> Date: Tue, 26 Mar 2019 09:30:36 +0800 Subject: [PATCH 056/814] Update 04-Operators.md --- book/04-Operators.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/04-Operators.md b/book/04-Operators.md index 598f4001..af50929e 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -49,7 +49,7 @@ public class Precedence { 这些语句看起来大致相同,但从输出中我们可以看出它们具有非常不同的含义,具体取决于括号的使用。 -我们注意到,在 `System.out.println() ` 语句中使用了`+`运算符。 但是在这里 `+`代表的意思是字符串连接符。当编译器看到字符串的后面连着一个非`+`连接的非字符串,那么其将会试图去转换这个非字符串成为字符串。上例中的输出结果说明了 a 和 b 都已经被转化成了字符串。 +我们注意到,在 `System.out.println()` 语句中使用了`+`运算符。 但是在这里 `+`代表的意思是字符串连接符。编译器会将`+`连接的非字符串尝试转换为字符串。上例中的输出结果说明了 a 和 b 都已经被转化成了字符串。 @@ -113,4 +113,4 @@ public class Precedence { -
\ No newline at end of file +
From 8519214f31dde163414056230db22e034bb7f8fd Mon Sep 17 00:00:00 2001 From: LingCoder <34231795+LingCoder@users.noreply.github.com> Date: Tue, 26 Mar 2019 09:33:05 +0800 Subject: [PATCH 057/814] Update 04-Operators.md --- book/04-Operators.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/04-Operators.md b/book/04-Operators.md index af50929e..6114403c 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -15,7 +15,7 @@ Java 是从 C++ 的基础上做了一些改进和简化发展而成的。对于 ## 使用说明 -运算符接受一个或多个参数并生成新值。这个参数与普通方法调用的形式是不同的,但效果是相同的。加法 `+`,减法 `-`,乘法 `*`,除法 `/` 以及赋值 `=` 在任何编程语言中的工作方式都是类似的。所有运算符都能根据自己的运算对象生成一个值。除此以外,一个运算符可改变运算对象的值,这叫作“副作用”(**Side Effect**)。算符最常见的用途就是修改自己的运算对象,从而产生副作用。但要注意生成的值亦可由没有副作用的运算符生成。 +运算符接受一个或多个参数并生成新值。这个参数与普通方法调用的形式是不同的,但效果是相同的。加法 `+`,减法 `-`,乘法 `*`,除法 `/` 以及赋值 `=` 在任何编程语言中的工作方式都是类似的。所有运算符都能根据自己的运算对象生成一个值。除此以外,一个运算符可改变运算对象的值,这叫作“副作用”(**Side Effect**)。运算符最常见的用途就是修改自己的运算对象,从而产生副作用。但要注意生成的值亦可由没有副作用的运算符生成。 几乎所有运算符都只能操作基本类型(*Primitives*)。唯一的例外是`=`、`==`和`!=`,它们能操作所有对象(这也是令人混淆的一个地方)。除此以外,**String** 类支持`+`和`+=`。 From 92e14c60c2b95992af08d9a890f8918e6c11305e Mon Sep 17 00:00:00 2001 From: LingCoder Date: Tue, 26 Mar 2019 11:32:31 +0800 Subject: [PATCH 058/814] autocommit --- book/00-Introduction.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/book/00-Introduction.md b/book/00-Introduction.md index 985ca89a..2b793d95 100644 --- a/book/00-Introduction.md +++ b/book/00-Introduction.md @@ -3,7 +3,7 @@ > “我的语言极限,即是我的世界的极限。” ——路德维希·维特根斯坦(*Wittgenstein*) -这句话对于编程语言来说也一样。你所使用的编程语言会将你的思维模式固化并逐渐远离其他语言。Java 作为一门傲娇的派生语言尤其如此。最早的语言设计者为了不想在项目中使用 C++,而创造了这种看起来很像 C++,却比 C++ 有了改进的新语言(他们的原始项目从未实现过)。虚拟机和垃圾回收机制是其最核心的变化,这两个概念本书后面的章节都会有详细描述。 不仅如此,Java 还在其他方面推动行业了发展。例如,现在绝大多数编程语言都包含文档注释语法和 HTML 文档生成的工具。Java 最主要的概念之一“对象”来自 SmallTalk 语言。Java 定义了“对象”(在下一章中描述)为编程的基本单元。于是万物皆对象。 +这句话对于编程语言来说也一样。你所使用的编程语言会将你的思维模式固化并逐渐远离其他语言。Java 作为一门傲娇的派生语言尤其如此。早期语言设计者为了不想在项目中使用 C++ 而创造了这种看起来很像 C++,却比 C++ 有了改进的新语言。其最核心的变化就是包含虚拟机和垃圾回收机制。这两个概念在本书之后的章节会有详细描述。 此外,Java 还在其他方面推动行业了发展。例如,现在绝大多数编程语言都包含文档注释语法和 HTML 文档生成的工具。Java 最主要的概念之一“对象”来自 SmallTalk 语言。Java 定义了“对象”(在下一章中描述)为编程的基本单元。于是,万物皆对象。 时间已经检验了这种信念,并发现它太过狂热。有些人甚至认为“对象”是完全错误的概念,应该被丢弃。就我个人而言,把一切都当成一个对象不仅是一个不必要的负担,而且还会招致许多设计朝着不好的方向发展。尽管如此,“对象”的概念依然有其闪光点。固执地要求所有东西都是一个对象(特别是一直到最底层级别)是一个设计错误。相反,完全逃避“对象”的概念似乎同样太过苛刻。 @@ -11,7 +11,7 @@ 1. 遇到“已停用”的功能特性时不会疑惑。 -2. 了解 Java 语言界限,更好地设计和编码。 +2. 熟悉语言边界,更好地设计和编码。 编程有关管理复杂性;问题的复杂性依赖于机器的复杂性。由于这种复杂性,我们的大多数编程项目都失败了。许多语言设计决策时都考虑到了复杂性,但在某些时候,其他问题也势必不会少的,程序员不可避免地“碰壁”。例如,C++ 必须向后兼容 C(允许 C 程序员轻松迁移),并且效率很高。这些目标诚然很好,并且也解释了为什么 C++ 在编程界取得了成功。为了保证兼容性的代价会造成语言额外的复杂性。当然,你可以责怪程序员和管理人员,但如果一种语言可以通过捕捉异常来提供有用的信息,为什么不呢? @@ -38,12 +38,12 @@ ## C编程思想 -《Think in C 》已经可以在 www.OnJava8.com 免费下载。Java 的基础语法是基于 C 语言的。《Think in C 》中有更适合初学者的编程基础介绍。 我已经委托 Chuck Allison 将这本 C 基础的书籍作为独立产品附赠于本书的 CD 中。希望大家在阅读本书时,都已具备了学习 JAVA 的良好基础。 +*Thinking in C* 已经可以在 www.OnJava8.com 免费下载。Java 的基础语法是基于 C 语言的。*Thinking in C* 中有更适合初学者的编程基础介绍。 我已经委托 Chuck Allison 将这本 C 基础的书籍作为独立产品附赠于本书的 CD 中。希望大家在阅读本书时,都已具备了学习 JAVA 的良好基础。 ## 源码下载 -本书中所有源代码的示例都在版权保护的前提下通过 GITHUB 免费提供。您可以将这些代码用于教育。任何人不得在未经正确引用代码来源的情况下随意重新发布此代码示例。在每个代码文件中,您都可以找到以下版权声明文件作为参考: +本书中所有源代码的示例都在版权保护的前提下通过 GITHUB 免费提供。你可以将这些代码用于教育。任何人不得在未经正确引用代码来源的情况下随意重新发布此代码示例。在每个代码文件中,你都可以找到以下版权声明文件作为参考: **Copyright.txt** @@ -57,44 +57,44 @@ 4. 源代码和文档的版权归 MindView LLC 所有。提供的源代码没有任何明示或暗示的担保,包括任何适销性,适用于特定用途或不侵权的默示担保。MindView LLC 不保证任何包含源代码的程序的运行不会中断或没有错误。MindView LLC 不对任何目的的源代码或包含源代码的任何软件的适用性做出任何陈述。包含源代码的任何程序的质量和性能的全部风险来自源代码的用户。用户理解源代码是为研究和教学目的而开发的,建议不要仅仅因任何原因依赖源代码或任何包含源代码的程序。如果源代码或任何产生的软件证明有缺陷,则用户承担所有必要的维修,修理或更正的费用。 -5. 在任何情况下,MINDVIEW LLC 或其出版商均不对任何一方根据任何法律理论对直接,间接,特殊,偶发或后果性损害承担任何责任,包括利润损失,业务中断,商业信息丢失或任何其他保险公司。由于MINDVIEW LLC 或其出版商已被告知此类损害的可能性,因此使用本源代码及其文档或因无法使用任何结果程序而导致的个人受伤或者个人受伤。MINDVIEW LLC 特别声明不提供任何担保,包括但不限于对适销性和特定用途适用性的暗示担保。此处提供的源代码和文档基于“原样”基础,没有MINDVIEW LLC的任何随附服务,MINDVIEW LLC 没有义务提供维护,支持,更新,增强或修改。 +5. 在任何情况下,MINDVIEW LLC 或其出版商均不对任何一方根据任何法律理论对直接,间接,特殊,偶发或后果性损害承担任何责任,包括利润损失,业务中断,商业信息丢失或任何其他保险公司。由于 MINDVIEW LLC 或其出版商已被告知此类损害的可能性,因此使用本源代码及其文档或因无法使用任何结果程序而导致的个人受伤或者个人受伤。MINDVIEW LLC 特别声明不提供任何担保,包括但不限于对适销性和特定用途适用性的暗示担保。此处提供的源代码和文档基于“原样”基础,没有MINDVIEW LLC的任何随附服务,MINDVIEW LLC 没有义务提供维护,支持,更新,增强或修改。 -**请注意**,MindView LLC 仅提供以下唯一网址发布更新书中的代码示例,https://github.com/BruceEckel/OnJava8-examples 。您可在上述条款范围内将示例免费使用于项目和课堂中。 +**请注意**,MindView LLC 仅提供以下唯一网址发布更新书中的代码示例,https://github.com/BruceEckel/OnJava8-examples 。你可在上述条款范围内将示例免费使用于项目和课堂中。 -如果您在源代码中发现错误,请在下面的网址提交更正:https://github.com/BruceEckel/OnJava8-examples/issues +如果你在源代码中发现错误,请在下面的网址提交更正:https://github.com/BruceEckel/OnJava8-examples/issues ## 编码样式 -本书中代码标识符(关键字,方法,变量和类名)以粗体,固定宽度代码字体显示。像“**class**”这种在代码中高频率出现的关键字可能让你觉得粗体有点乏味。其他显示为正常字体。本书文本格式尽可能遵循 Oracle 常见样式,并保证在大多数 Java 开发环境中被支持。书中我使用了自己喜欢的字体风格。Java 是一种自由的编程语言,你也可以使用 IDE(集成开发环境)工具(如 IntelliJ IDEA,Eclipse或NetBeans)将格式更改为适合你的格式。 +本书中代码标识符(关键字,方法,变量和类名)以粗体,固定宽度代码字体显示。像“**class**”这种在代码中高频率出现的关键字可能让你觉得粗体有点乏味。其他显示为正常字体。本书文本格式尽可能遵循 Oracle 常见样式,并保证在大多数 Java 开发环境中被支持。书中我使用了自己喜欢的字体风格。Java 是一种自由的编程语言,你也可以使用 IDE(集成开发环境)工具(如 IntelliJ IDEA,Eclipse 或 NetBeans)将格式更改为适合你的格式。 -本书代码文件使用自动化工具进行测试,并在最新版本的 Java 编译通过(除了那些特别标记的错误之外)。本书重点介绍并使用 Java 8进行测试。如果您必须了解更早的语言版本,可以在 [www.OnJava8.com](http://www.OnJava8.com) 免费下载 *Thinking in Java*。 +本书代码文件使用自动化工具进行测试,并在最新版本的 Java 编译通过(除了那些特别标记的错误之外)。本书重点介绍并使用 Java 8 进行测试。如果你必须了解更早的语言版本,可以在 [www.OnJava8.com](http://www.OnJava8.com) 免费下载 *Thinking in Java*。 ## BUG提交 -本书经过多重校订,但还是难免有所遗漏被新读者发现。如果您在正文或示例中发现任何错误的内容,请在[此处](https://github.com/BruceEckel/OnJava8-examples/issues)提交错误以及建议更正,作者感激不尽。 +本书经过多重校订,但还是难免有所遗漏被新读者发现。如果你在正文或示例中发现任何错误的内容,请在[此处](https://github.com/BruceEckel/OnJava8-examples/issues)提交错误以及建议更正,作者感激不尽。 ## 邮箱订阅 -您可以在 [www.OnJava8.com上](http://www.OnJava8.com) 订阅邮件。邮件不含广告并尽量提供干货。 +你可以在 [www.OnJava8.com上](http://www.OnJava8.com) 订阅邮件。邮件不含广告并尽量提供干货。 ## Java图形界面 -Java 在图形用户界面和桌面程序方面的发展可以说是一段悲伤的历史。Java 1.0中图形用户界面(GUI)库的原始设计目标是让用户能在所有平台提供一个漂亮的界面。但遗憾的是这个理想没有实现。相反,Java 1.0抽象窗口工具包(AWT)在所有平台都表现平平,并且有诸多限制;您只能使用四种字体。另外, Java 1.0 AWT 编程模型也很笨拙且不面向对象。我的一个曾在 Java 设计期间工作过的学生道出了缘由:早期的 AWT 设计是在仅仅在一个月内构思,设计和实施的。不得不说这是一个“奇迹”,但同时更是“设计失败”的绝佳教材。 +Java 在图形用户界面和桌面程序方面的发展可以说是一段悲伤的历史。Java 1.0 中图形用户界面(GUI)库的原始设计目标是让用户能在所有平台提供一个漂亮的界面。但遗憾的是这个理想没有实现。相反,Java 1.0 抽象窗口工具包(AWT)在所有平台都表现平平,并且有诸多限制;你只能使用四种字体。另外, Java 1.0 AWT 编程模型也很笨拙且不面向对象。我的一个曾在 Java 设计期间工作过的学生道出了缘由:早期的 AWT 设计是在仅仅在一个月内构思,设计和实施的。不得不说这是一个“奇迹”,但同时更是“设计失败”的绝佳教材。 在 Java 1.1 版本的AWT中 情况有所改善,事件模型采用了更加清晰的面向对象方法,并添加了JavaBeans,致力于面向易于创建可视化编程环境的组件编程模型(已废弃)。 -Java 2(Java 1.2)通过基本上用 Java基类(JFC)替换所有内容来完成从旧Java 1.0 AWT的转换,其中GUI部分称为“Swing”。这是一组丰富的JavaBeans,它们创建了一个合理的GUI。修订版3(3之前都不好)比以往更适用于开发图形界面程序。 +Java 2(Java 1.2)通过基本上用 Java 基类(JFC)替换所有内容来完成从旧 Java 1.0 AWT的转换,其中 GUI 部分称为 “Swing”。这是一组丰富的JavaBeans,它们创建了一个合理的GUI。修订版 3(3之前都不好)比以往更适用于开发图形界面程序。 -Sun 在图形界面的最后一次尝试,称为 JavaFX。当 Oracle 收购 Sun 时,他们将原来雄心勃勃的项目(包括脚本语言)改为库,现在它似乎是Java官方唯一还在开发中的UI工具包(参见维基百科关于JavaFX的文章) - 但即使如此。JavaFX 似乎最终后也失败了。 +Sun 在图形界面的最后一次尝试,称为 JavaFX。当 Oracle 收购 Sun 时,他们将原来雄心勃勃的项目(包括脚本语言)改为库,现在它似乎是 Java 官方唯一还在开发中的UI工具包(参见维基百科关于JavaFX 的文章) - 但即使如此。JavaFX 似乎最终后也失败了。 -现今 Swing 依然是 Java 发行版的一部分(只接受维护,不再有新功能开发),而Java现在是一个开源项目,它应该始终可用。此外,Swing 和 JavaFX 有一些有限的交互性。这些可能是为了帮助开发者过渡到 JavaFX。 +现今 Swing 依然是 Java 发行版的一部分(只接受维护,不再有新功能开发),而 Java 现在是一个开源项目,它应该始终可用。此外,Swing 和 JavaFX 有一些有限的交互性。这些可能是为了帮助开发者过渡到 JavaFX。 -桌面程序领域似乎从没勾起 Java设计师的野心。最终,Java 没有在图形界面取得该有的一席之地。另外,曾被大肆吹嘘的 JavaBeans 也没有获得任何影响力。(许多不幸的作者花了很多精力在 Swing 上编写书籍,甚至只用 JavaBeans 编写书籍)。Java 图形界面程序大多数情况下仅用于 集成开发环境(IDE)和一些企业内部应用程序。您是可以使用 Java 开发图形界面,但这不是 Java 最擅长的领域。如果你必须学习 Swing,它可以在 *Thinking in Java*,第4版(可从 www.OnJava8.com 获得)和其他专门的书籍中学习。。 +桌面程序领域似乎从未尝勾起 Java 设计师的野心。Java 没有在图形界面取得该有的一席之地。另外,曾被大肆吹嘘的 JavaBeans 也没有获得任何影响力。(许多不幸的作者花了很多精力在 Swing 上编写书籍,甚至只用 JavaBeans 编写书籍)。Java 图形界面程序大多数情况下仅用于 集成开发环境(IDE)和一些企业内部应用程序。你是可以使用 Java 开发图形界面,但这不是 Java 最擅长的领域。如果你必须学习 Swing,它可以在 *Thinking in Java* 第4版(可从 www.OnJava8.com 获得)和其他专门的书籍中学习。。 From b4b16c34e0d70ee3c4f49a739caa63387fb13fd0 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Wed, 27 Mar 2019 00:27:48 +0800 Subject: [PATCH 059/814] =?UTF-8?q?update=E8=BF=90=E7=AE=97=E7=AC=A6-?= =?UTF-8?q?=E8=B5=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/04-Operators.md | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/book/04-Operators.md b/book/04-Operators.md index 6114403c..ce5566c5 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -56,6 +56,55 @@ public class Precedence { ## 赋值 +运算符的赋值是由符号 `=` 完成的。它代表着获取 `=` 右边的值并赋给左边的变量。右边可以是任何常量、变量或者是可产生一个返回值的表达式。但左边必须是一个明确的、已命名的变量。也就是说,必须要有一个物理的空间来存放右边的值。举个例子来说,可将一个常数赋给一个变量( A = 4 ),但不可将任何东西赋给一个常数(比如不能 4 = A)。 + +基本类型的赋值都是直接的,而不像对象,赋予的只是其内存的引用。举个例子,a = b ,如果 b 是基本类型,那么 赋值操作会将 b 的值复制一根给变量 a, 此后若 a 的值发生改变是不会影响到 b 的。作为一名程序员,着应该成为我们的常识。 + +如果是为对象赋值,那么结果就不一样了。对一个对象进行操作时,我们实际上操作的是它的引用。所以我们将右边的对象赋予给左边时,赋予的只是该对象的引用。此时,两者指向的堆中的对象还是同一个。代码示例: + +```JAVA +// operators/Assignment.java +// Assignment with objects is a bit tricky +class Tank { +int level; +}- +public class Assignment { +public static void main(String[] args) { + Tank t1 = new Tank(); + Tank t2 = new Tank(); + t1.level = 9; + t2.level = 47; + System.out.println("1: t1.level: " + t1.level + + ", t2.level: " + t2.level); + t1 = t2; + System.out.println("2: t1.level: " + t1.level + + ", t2.level: " + t2.level); + t1.level = 27; + System.out.println("3: t1.level: " + t1.level + + ", t2.level: " + t2.level); + } +} +``` + +输出结果: + +``` +1: t1.level: 9, t2.level: 47 +2: t1.level: 47, t2.level: 47 +3: t1.level: 27, t2.level: 27 +``` + +这是个简单的 `Tank` 类,通过 main 方法 `new` 出了 2 个实例对象。 两个对象的 `level` 属性分别被赋予了不同的值。 然后,t2 的值被赋予给 t1。在许多编程语言里,预期的结果是 t1 和 t2 的值会一直相对独立。但是,在 Java 中,由于赋予的只是对象的引用,改变 t1 也就改变了 t2。 这是因为 t1 和 t2 此时指向的是堆中同一个对象。(t1 原始对象的引用在 t2 赋值给其时被丢失,它就将会在垃圾回收时被清理)。 + +这种现象通常称为别名(*aliasing*),这是 Java 处理对象的一种基本方式。但是假若你不想这里出现这样的混淆的话,你可以这么做。代码示例: + +```JAVA +t1.level = t2.level; +``` + +较之前的做法,这样做保留了两个单独的对象,而不是丢弃一个并将 t1 和 t2 绑定到同一个对象。但是这样的操作有点违背 JAVA 的设计原则。对象的赋值是个需要重视的环节,否则你可能收获意外的“惊喜”。 + + ## 算术运算符 From 62c0df0a670199f58b8ac7edc12ee9e33ed2c202 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Wed, 27 Mar 2019 09:18:18 +0800 Subject: [PATCH 060/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AE=97=E6=9C=AF?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/04-Operators.md | 150 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 148 insertions(+), 2 deletions(-) diff --git a/book/04-Operators.md b/book/04-Operators.md index ce5566c5..1147a5a5 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -17,7 +17,7 @@ Java 是从 C++ 的基础上做了一些改进和简化发展而成的。对于 运算符接受一个或多个参数并生成新值。这个参数与普通方法调用的形式是不同的,但效果是相同的。加法 `+`,减法 `-`,乘法 `*`,除法 `/` 以及赋值 `=` 在任何编程语言中的工作方式都是类似的。所有运算符都能根据自己的运算对象生成一个值。除此以外,一个运算符可改变运算对象的值,这叫作“副作用”(**Side Effect**)。运算符最常见的用途就是修改自己的运算对象,从而产生副作用。但要注意生成的值亦可由没有副作用的运算符生成。 -几乎所有运算符都只能操作基本类型(*Primitives*)。唯一的例外是`=`、`==`和`!=`,它们能操作所有对象(这也是令人混淆的一个地方)。除此以外,**String** 类支持`+`和`+=`。 +几乎所有运算符都只能操作基本类型(*Primitives*)。唯一的例外是 `=`、`==` 和 `!=`,它们能操作所有对象(这也是令人混淆的一个地方)。除此以外,**String** 类支持 `+` 和 `+=`。 @@ -49,7 +49,7 @@ public class Precedence { 这些语句看起来大致相同,但从输出中我们可以看出它们具有非常不同的含义,具体取决于括号的使用。 -我们注意到,在 `System.out.println()` 语句中使用了`+`运算符。 但是在这里 `+`代表的意思是字符串连接符。编译器会将`+`连接的非字符串尝试转换为字符串。上例中的输出结果说明了 a 和 b 都已经被转化成了字符串。 +我们注意到,在 `System.out.println()` 语句中使用了 `+` 运算符。 但是在这里 `+` 代表的意思是字符串连接符。编译器会将 `+` 连接的非字符串尝试转换为字符串。上例中的输出结果说明了 a 和 b 都已经被转化成了字符串。 @@ -104,10 +104,156 @@ t1.level = t2.level; 较之前的做法,这样做保留了两个单独的对象,而不是丢弃一个并将 t1 和 t2 绑定到同一个对象。但是这样的操作有点违背 JAVA 的设计原则。对象的赋值是个需要重视的环节,否则你可能收获意外的“惊喜”。 + +### 方法调用中的别名现象 + +当我们把对象传递给方法时,会发生别名现象。 + +```JAVA +// operators/PassObject.java +// 正在传递的对象可能不是你之前使用的 +class Letter { + char c; + } + +public class PassObject { + static void f(Letter y) { + y.c = 'z'; + } + +public static void main(String[] args) { + Letter x = new Letter(); + x.c = 'a'; + System.out.println("1: x.c: " + x.c); + f(x); + System.out.println("2: x.c: " + x.c); + } +} +``` + +输出结果: + +``` +1: x.c: a +2: x.c: z +``` + +在许多编程语言中,方法 **f()** 似乎在内部复制其参数 **Letter y**。但是一旦传递了一个引用,那么实际上 `y.c ='z';` 是在方法 **f()** 之外改变对象。别名现象以及其解决方案是个复杂的问题,在附录中有包含:[对象传递和返回](./Appendix-Passing-and-Returning-Objects.md)。意识到这一点,我们可以警惕类似的陷阱。 + ## 算术运算符 +Java 的基本算术运算符与其他大多编程语言是相同的。其中包括加号 `+`、减号 `-`、除号 `/`、乘号 `*` 以及模数`%`(从整数除法中获得余数)。整数除法会直接砍掉小数,而不是进位。 + +Java 也用一种简写形式同时进行运算和赋值操作,由运算符后跟等号表示,并且与语言中的所有运算符一致(只要有意义)。为了将 4 的值赋予给变量 x 同时将结果赋予给 x , 可用 x += 4 来表示。下面带来代码更多代码示例: + + +```JAVA +// operators/MathOps.java +// The mathematical operators +import java.util.*; + +public class MathOps { + public static void main(String[] args) { + // Create a seeded random number generator: + Random rand = new Random(47); + int i, j, k; + // Choose value from 1 to 100: + j = rand.nextInt(100) + 1; + System.out.println("j : " + j); + k = rand.nextInt(100) + 1; + System.out.println("k : " + k); + i = j + k; + System.out.println("j + k : " + i); + i = j - k; + System.out.println("j - k : " + i); + i = k / j; + System.out.println("k / j : " + i); + i = k * j; + System.out.println("k * j : " + i); + i = k % j; + System.out.println("k % j : " + i); + j %= k; + System.out.println("j %= k : " + j); + // 浮点运算测试 + float u, v, w; // Applies to doubles, too + v = rand.nextFloat(); + System.out.println("v : " + v); + w = rand.nextFloat(); + System.out.println("w : " + w); + u = v + w; + System.out.println("v + w : " + u); + u = v - w; + System.out.println("v - w : " + u); + u = v * w; + System.out.println("v * w : " + u); + u = v / w; + System.out.println("v / w : " + u); + // 下面的操作同样适用于 char, + // byte, short, int, long, and double: + u += v; + System.out.println("u += v : " + u); + u -= v; + System.out.println("u -= v : " + u); + u *= v; + System.out.println("u *= v : " + u); + u /= v; + System.out.println("u /= v : " + u); + } +} + +``` + +输出结果: + +``` +j : 59 +k : 56 +j + k : 115 +j - k : 3 +k / j : 0 +k * j : 3304 +k % j : 56 +j %= k : 3 +v : 0.5309454 +w : 0.0534122 +v + w : 0.5843576 +v - w : 0.47753322 +v * w : 0.028358962 +v / w : 9.940527 +u += v : 10.471473 +u -= v : 9.940527 +u *= v : 5.2778773 +u /= v : 9.940527 +``` + +为了生成随机数字,程序首先创建一个 **Random** 对象。不带参数的 **Random** 对象会利用当前的时间用作随机数生成器的“种子”(*seed*),从而为程序的每次执行生成不同的输出。在本书的示例中,重要的是每个示例末尾的输出尽可能一致,以便可以使用外部工具进行验证。所以我们通过在创建 **Random** 对象时提供种子(随机数生成器的初始化值,其始终为特定种子值产生相同的序列),让程序每次执行都生成相同的随机数,如此以来输出结果就是可验证的 [^1]。 若需要生成随机值,可删除代码示例中的种子参数。该对象通过调用方法 **nextInt()** 和 **nextFloat()**(还可以调用 **nextLong()** 或 **nextDouble()**),使用 **Random** 对象生成许多不同类型的随机数。**nextInt()** 的参数设置生成的数字的上限,下限为零,为了避免零除的可能性,结果偏移1。 + + + +### 一元加减运算符 + +一元加 `+` 减 `-` 运算符的操作和二元是相同的。编译器可自动识别使用何种方式解析运算: + +```JAVA +x = -a; +``` + +上例的代码表意清晰,编译器可正确识别。下面再看一个示例: + +```JAVA +x = a * -b; +``` + +虽然编译器可以正确的识别,但是程序员可能会迷惑。为了避免混淆,推荐下面的写法: + +```JAVA +x = a * (-b); +``` + +一元减号可以得到数据的负值。一元加号的作用相反,不过它唯一能影响的就是把较小的数值类型自动转换为了 **int** 类型。 + ## 自动递增和递减 From 329602fe953abd60059c9ce685e51e9a106c118a Mon Sep 17 00:00:00 2001 From: LingCoder Date: Wed, 27 Mar 2019 09:22:16 +0800 Subject: [PATCH 061/814] =?UTF-8?q?=E8=A7=84=E8=8C=83=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E7=9A=84=E6=8B=AC=E5=8F=B7=E4=B8=BA=E8=8B=B1=E6=96=87=E5=8D=8A?= =?UTF-8?q?=E8=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/04-Operators.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/04-Operators.md b/book/04-Operators.md index 1147a5a5..824cbef6 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -228,7 +228,7 @@ u *= v : 5.2778773 u /= v : 9.940527 ``` -为了生成随机数字,程序首先创建一个 **Random** 对象。不带参数的 **Random** 对象会利用当前的时间用作随机数生成器的“种子”(*seed*),从而为程序的每次执行生成不同的输出。在本书的示例中,重要的是每个示例末尾的输出尽可能一致,以便可以使用外部工具进行验证。所以我们通过在创建 **Random** 对象时提供种子(随机数生成器的初始化值,其始终为特定种子值产生相同的序列),让程序每次执行都生成相同的随机数,如此以来输出结果就是可验证的 [^1]。 若需要生成随机值,可删除代码示例中的种子参数。该对象通过调用方法 **nextInt()** 和 **nextFloat()**(还可以调用 **nextLong()** 或 **nextDouble()**),使用 **Random** 对象生成许多不同类型的随机数。**nextInt()** 的参数设置生成的数字的上限,下限为零,为了避免零除的可能性,结果偏移1。 +为了生成随机数字,程序首先创建一个 **Random** 对象。不带参数的 **Random** 对象会利用当前的时间用作随机数生成器的“种子”(*seed*),从而为程序的每次执行生成不同的输出。在本书的示例中,重要的是每个示例末尾的输出尽可能一致,以便可以使用外部工具进行验证。所以我们通过在创建 **Random** 对象时提供种子(随机数生成器的初始化值,其始终为特定种子值产生相同的序列),让程序每次执行都生成相同的随机数,如此以来输出结果就是可验证的 [^1]。 若需要生成随机值,可删除代码示例中的种子参数。该对象通过调用方法 **nextInt()** 和 **nextFloat()**(还可以调用 **nextLong()** 或 **nextDouble()**),使用 **Random** 对象生成许多不同类型的随机数。**nextInt()** 的参数设置生成的数字的上限,下限为零,为了避免零除的可能性,结果偏移1。 From fbe7e2caba6c8fe77fc773145e4e138227795b41 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Wed, 27 Mar 2019 10:57:45 +0800 Subject: [PATCH 062/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=80=92=E5=A2=9E=E5=92=8C=E9=80=92=E5=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/04-Operators.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/book/04-Operators.md b/book/04-Operators.md index 824cbef6..dfa3de59 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -259,6 +259,44 @@ x = a * (-b); ## 自动递增和递减 +和 C 语言类似,Java 提供了许多快捷运算方式。快捷运算可使代码可读性,可写性都更强。其中包括递增 `++` 和递减 `--`,意为“增加或减少一个单位”。举个例子来说,假设 a 是一个 **int** 类型的值,则表达式 `++a` 就等价于 `a = a + 1`。 递增和递减运算符不仅可以修改变量,还可以生成变量的值。 + +每种类型的运算符,都有两个版本可供选用;通常将其称为“前缀版”和“后缀版”。“前递增”表示 `++` 运算符位于变量或表达式的前面;而“后递增”表示 `++` 运算符位于变量或表达式的后面。类似地,“前递减”意味着 `--` 运算符位于变量或表达式的前面;而“后递减”意味着 `--` 运算符位于变量或表达式的后面。对于前递增和前递减(如 `++a` 或 `--a`),会先执行递增/减运算,再返回值。而对于后递增和后递减(如 `a++` 或 `a--`),会先返回值,再执行递增/减运算。代码示例: + +```JAVA +// operators/AutoInc.java +// 演示 ++ 和 -- 运算符 +public class AutoInc { +public static void main(String[] args) { + int i = 1; + System.out.println("i: " + i); + System.out.println("++i: " + ++i); // 前递增 + System.out.println("i++: " + i++); // 后递增 + System.out.println("i: " + i); + System.out.println("--i: " + --i); // 前递减 + System.out.println("i--: " + i--); // 后递减 + System.out.println("i: " + i); + } +} +``` + +输出结果: + +``` +i: 1 +++i: 2 +i++: 2 +i: 3 +--i: 2 +i--: 2 +i: 1 +``` + +对于前缀形式,我们将在执行递增/减操作后获取值;使用后缀形式,我们将在执行递增/减操作之前获取值。它们是唯一具有“副作用”的运算符(除那些涉及赋值的以外) —— 它们既改变操作数又改变值。 + +C++ 名称来自于递增运算符,同时也代表着“比 C 更进一步”。在早期的 Java 演讲中,*Bill Joy*( Java 创建者之一)说“**Java = C ++ --**”(C++ 减减)。这意味着 Java 是在 C++ 的基础上减少了许多不必要的东西,因此语言更简单。随着进一步地学习,我们会发现 Java 的确有许多地方相对 C++ 来说更简便,但是在其他方面,难度并不会比 C++ 小多少。 + + ## 关系运算符 From c207e1feaaa5cb1b36dacd221dbaec5eb7c4ada3 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Wed, 27 Mar 2019 11:02:26 +0800 Subject: [PATCH 063/814] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/04-Operators.md | 152 ++++++++++++++++++++++--------------------- 1 file changed, 77 insertions(+), 75 deletions(-) diff --git a/book/04-Operators.md b/book/04-Operators.md index dfa3de59..d70954a3 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -66,22 +66,24 @@ public class Precedence { // operators/Assignment.java // Assignment with objects is a bit tricky class Tank { -int level; -}- + int level; +} + public class Assignment { -public static void main(String[] args) { - Tank t1 = new Tank(); - Tank t2 = new Tank(); - t1.level = 9; - t2.level = 47; - System.out.println("1: t1.level: " + t1.level + - ", t2.level: " + t2.level); - t1 = t2; - System.out.println("2: t1.level: " + t1.level + - ", t2.level: " + t2.level); - t1.level = 27; - System.out.println("3: t1.level: " + t1.level + - ", t2.level: " + t2.level); + + public static void main(String[] args) { + Tank t1 = new Tank(); + Tank t2 = new Tank(); + t1.level = 9; + t2.level = 47; + System.out.println("1: t1.level: " + t1.level + + ", t2.level: " + t2.level); + t1 = t2; + System.out.println("2: t1.level: " + t1.level + + ", t2.level: " + t2.level); + t1.level = 27; + System.out.println("3: t1.level: " + t1.level + + ", t2.level: " + t2.level); } } ``` @@ -121,13 +123,13 @@ public class PassObject { y.c = 'z'; } -public static void main(String[] args) { - Letter x = new Letter(); - x.c = 'a'; - System.out.println("1: x.c: " + x.c); - f(x); - System.out.println("2: x.c: " + x.c); - } + public static void main(String[] args) { + Letter x = new Letter(); + x.c = 'a'; + System.out.println("1: x.c: " + x.c); + f(x); + System.out.println("2: x.c: " + x.c); + } } ``` @@ -156,50 +158,50 @@ import java.util.*; public class MathOps { public static void main(String[] args) { - // Create a seeded random number generator: - Random rand = new Random(47); - int i, j, k; - // Choose value from 1 to 100: - j = rand.nextInt(100) + 1; - System.out.println("j : " + j); - k = rand.nextInt(100) + 1; - System.out.println("k : " + k); - i = j + k; - System.out.println("j + k : " + i); - i = j - k; - System.out.println("j - k : " + i); - i = k / j; - System.out.println("k / j : " + i); - i = k * j; - System.out.println("k * j : " + i); - i = k % j; - System.out.println("k % j : " + i); - j %= k; - System.out.println("j %= k : " + j); - // 浮点运算测试 - float u, v, w; // Applies to doubles, too - v = rand.nextFloat(); - System.out.println("v : " + v); - w = rand.nextFloat(); - System.out.println("w : " + w); - u = v + w; - System.out.println("v + w : " + u); - u = v - w; - System.out.println("v - w : " + u); - u = v * w; - System.out.println("v * w : " + u); - u = v / w; - System.out.println("v / w : " + u); - // 下面的操作同样适用于 char, - // byte, short, int, long, and double: - u += v; - System.out.println("u += v : " + u); - u -= v; - System.out.println("u -= v : " + u); - u *= v; - System.out.println("u *= v : " + u); - u /= v; - System.out.println("u /= v : " + u); + // Create a seeded random number generator: + Random rand = new Random(47); + int i, j, k; + // Choose value from 1 to 100: + j = rand.nextInt(100) + 1; + System.out.println("j : " + j); + k = rand.nextInt(100) + 1; + System.out.println("k : " + k); + i = j + k; + System.out.println("j + k : " + i); + i = j - k; + System.out.println("j - k : " + i); + i = k / j; + System.out.println("k / j : " + i); + i = k * j; + System.out.println("k * j : " + i); + i = k % j; + System.out.println("k % j : " + i); + j %= k; + System.out.println("j %= k : " + j); + // 浮点运算测试 + float u, v, w; // Applies to doubles, too + v = rand.nextFloat(); + System.out.println("v : " + v); + w = rand.nextFloat(); + System.out.println("w : " + w); + u = v + w; + System.out.println("v + w : " + u); + u = v - w; + System.out.println("v - w : " + u); + u = v * w; + System.out.println("v * w : " + u); + u = v / w; + System.out.println("v / w : " + u); + // 下面的操作同样适用于 char, + // byte, short, int, long, and double: + u += v; + System.out.println("u += v : " + u); + u -= v; + System.out.println("u -= v : " + u); + u *= v; + System.out.println("u *= v : " + u); + u /= v; + System.out.println("u /= v : " + u); } } @@ -267,15 +269,15 @@ x = a * (-b); // operators/AutoInc.java // 演示 ++ 和 -- 运算符 public class AutoInc { -public static void main(String[] args) { - int i = 1; - System.out.println("i: " + i); - System.out.println("++i: " + ++i); // 前递增 - System.out.println("i++: " + i++); // 后递增 - System.out.println("i: " + i); - System.out.println("--i: " + --i); // 前递减 - System.out.println("i--: " + i--); // 后递减 - System.out.println("i: " + i); + public static void main(String[] args) { + int i = 1; + System.out.println("i: " + i); + System.out.println("++i: " + ++i); // 前递增 + System.out.println("i++: " + i++); // 后递增 + System.out.println("i: " + i); + System.out.println("--i: " + --i); // 前递减 + System.out.println("i--: " + i--); // 后递减 + System.out.println("i: " + i); } } ``` From 0d03184e9ac10e5b87736805c5d08b1161b65cd1 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Wed, 27 Mar 2019 11:44:10 +0800 Subject: [PATCH 064/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=85=B3=E7=B3=BB?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/04-Operators.md | 55 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/book/04-Operators.md b/book/04-Operators.md index d70954a3..e03f35e2 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -303,6 +303,61 @@ C++ 名称来自于递增运算符,同时也代表着“比 C 更进一步” ## 关系运算符 +关系运算符会产生一个布尔(**boolean**)结果,指示操作数值之间的关系。如果关系为真,则关系表达式生成 **true**,如果关系非真,则生成 **false**。关系运算符包括小于 `<`,大于 `>`,小于或等于 `<=`,大于或等于 `>=`,等价 `==` 和不等价 `!=`。`==` 和 `!=` 可与所有基本类型搭配使用。但其他类型的比较就不太适合了,因为布尔值只能是 **true** 或 **false**,所以比较他们之间的“大于”或“小于”没有意义。 + + +### 测试对象等价 + +关系运算符 `==` 和 `=` 也适用于所有对象,但它们的含义常常会混淆初次使用 Java 的程序员。代码示例: + +```JAVA +// operators/Equivalence.java +public class Equivalence { + public static void main(String[] args) { + Integer n1 = 47; + Integer n2 = 47; + System.out.println(n1 == n2); + System.out.println(n1 != n2); + } +} +``` + +输出结果: + +``` +true +false +``` + +看起来结果是我们所期望的。但其实事情不是那么简单。下面我们来创建自己的类: + +```JAVA +// operators/EqualsMethod2.java +// 默认的 equals() 方法没有比较内容 +class Value { +int i; +} + +public class EqualsMethod2 { + public static void main(String[] args) { + Value v1 = new Value(); + Value v2 = new Value(); + v1.i = v2.i = 100; + System.out.println(v1.equals(v2)); + } +} +``` + +输出结果: + +``` +false +``` + +现在事情再次令人困惑:结果是错误的。这是因为 **equals()** 的默认行为是比较对象的引用。因此,除非你在新类中重写 **equals()** 方法,否则我们将获取不到想要的结果。不幸的是,在学习 [复用](./08-Reuse.md)(**Reuse**) 章节后我们才能接触到“覆盖”(**override**),并且直到 [附录:集合主题](./Appendix-Collection-Topics.md),才能知道定义 **equals()** 方法的正确方式,但是现在明白 **equals()** 行为方式也可能为你节省一些时间。 + +大多数 Java 库类通过覆写 **equals()** 方法比较对象的内容而不是其引用。 + ## 逻辑运算符 From b35e7fd41b395a5c5606456e0f7c935fcb30cace Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 28 Mar 2019 10:11:13 +0800 Subject: [PATCH 065/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/04-Operators.md | 116 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 4 deletions(-) diff --git a/book/04-Operators.md b/book/04-Operators.md index e03f35e2..1166f110 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -303,12 +303,12 @@ C++ 名称来自于递增运算符,同时也代表着“比 C 更进一步” ## 关系运算符 -关系运算符会产生一个布尔(**boolean**)结果,指示操作数值之间的关系。如果关系为真,则关系表达式生成 **true**,如果关系非真,则生成 **false**。关系运算符包括小于 `<`,大于 `>`,小于或等于 `<=`,大于或等于 `>=`,等价 `==` 和不等价 `!=`。`==` 和 `!=` 可与所有基本类型搭配使用。但其他类型的比较就不太适合了,因为布尔值只能是 **true** 或 **false**,所以比较他们之间的“大于”或“小于”没有意义。 +关系运算符会通过产生一个布尔(**boolean**)结果来表示被操作的数值之间的关系。如果关系为真,则结果为 **true**,如果关系非真,则结果为 **false**。关系运算符包括小于 `<`,大于 `>`,小于或等于 `<=`,大于或等于 `>=`,等价 `==` 和不等价 `!=`。`==` 和 `!=` 可与所有基本类型搭配使用。但与其他类型的比较就不太适合了,因为布尔值只能表示 **true** 或 **false**,所以比较它们之间的“大于”或“小于”没有意义。 ### 测试对象等价 -关系运算符 `==` 和 `=` 也适用于所有对象,但它们的含义常常会混淆初次使用 Java 的程序员。代码示例: +关系运算符 `==` 和 `!=` 同样适用于所有对象之间的比较运算,但产生的结果却经常混淆 Java 的初学者。下面是代码示例: ```JAVA // operators/Equivalence.java @@ -329,7 +329,7 @@ true false ``` -看起来结果是我们所期望的。但其实事情不是那么简单。下面我们来创建自己的类: +上例的结果看起来是我们所期望的。但其实事情并非那么简单。下面我们来创建自己的类: ```JAVA // operators/EqualsMethod2.java @@ -354,13 +354,121 @@ public class EqualsMethod2 { false ``` -现在事情再次令人困惑:结果是错误的。这是因为 **equals()** 的默认行为是比较对象的引用。因此,除非你在新类中重写 **equals()** 方法,否则我们将获取不到想要的结果。不幸的是,在学习 [复用](./08-Reuse.md)(**Reuse**) 章节后我们才能接触到“覆盖”(**override**),并且直到 [附录:集合主题](./Appendix-Collection-Topics.md),才能知道定义 **equals()** 方法的正确方式,但是现在明白 **equals()** 行为方式也可能为你节省一些时间。 +上例的结果再次令人困惑:结果是错误的。原因: **equals()** 的默认行为是比较对象的引用而非具体内容。因此,除非你在新类中重写 **equals()** 方法,否则我们将获取不到想要的结果。不幸的是,在学习 [复用](./08-Reuse.md)(**Reuse**) 章节后我们才能接触到“覆盖”(**override**),并且直到 [附录:集合主题](./Appendix-Collection-Topics.md),才能知道定义 **equals()** 方法的正确方式,但是现在明白 **equals()** 行为方式也可能为你节省一些时间。 大多数 Java 库类通过覆写 **equals()** 方法比较对象的内容而不是其引用。 ## 逻辑运算符 +每个逻辑运算符 `&&` (**AND**)、`||`(**OR**)和 `!`(**非**)根据参数的逻辑关系生成布尔值 `true` 或 `false`。下面的代码示例使用了关系运算符和逻辑运算符: + +```JAVA +// operators/Bool.java +// 关系运算符和逻辑运算符 +import java.util.*; +public class Bool { + public static void main(String[] args) { + Random rand = new Random(47); + int i = rand.nextInt(100); + int j = rand.nextInt(100); + System.out.println("i = " + i); + System.out.println("j = " + j); + System.out.println("i > j is " + (i > j)); + System.out.println("i < j is " + (i < j)); + System.out.println("i >= j is " + (i >= j)); + System.out.println("i <= j is " + (i <= j)); + System.out.println("i == j is " + (i == j)); + System.out.println("i != j is " + (i != j)); + // 将 int 作为布尔处理不是合法的 Java 写法 + //- System.out.println("i && j is " + (i && j)); + //- System.out.println("i || j is " + (i || j)); + //- System.out.println("!i is " + !i); + System.out.println("(i < 10) && (j < 10) is " + + ((i < 10) && (j < 10)) ); + System.out.println("(i < 10) || (j < 10) is " + + ((i < 10) || (j < 10)) ); + } +} +``` + +输出结果: + +``` +i = 58 +j = 55 +i > j is true +i < j is false +i >= j is true +i <= j is false +i == j is false +i != j is true +(i < 10) && (j < 10) is false +(i < 10) || (j < 10) is false +``` + +在 JAVA 逻辑运算中,我们不能像 C/C++ 那样使用非布尔值, 而仅能使用 **AND**、**OR**、**NOT**。 +下面是一次错误的尝试: ~~a || -~~。 但是,后续表达式使用关系比较生成布尔值,然后对结果使用逻辑运算结果。请注意,如果在预期为 **String** 类型的位置使用 **boolean**类型的值,则结果会自动转为适当的文本格式。 + +我们可以将前一个程序中 **int** 的定义替换为除 **boolean** 之外的任何其他基本数据类型。 +但请注意,**float** 类型的数值比较非常严格。只要最小位部分的数字不同则两个数值之间的比较仍然是“非等”的;只要数字最小位是大于 0 的,那么它就不等于 0。 + + + +### 短路 + +逻辑运算符支持一种称为“短路”(*short-circuiting*)的现象。整个表达式会在运算到可以明确结果时就停止并返回结果,这意味着该逻辑表达式的后半部分不会被执行到。代码示例: + +```JAVA +// operators / ShortCircuit.java +// 逻辑运算符的短路行为 +public class ShortCircuit { + + static boolean test1(int val) { + System.out.println("test1(" + val + ")"); + System.out.println("result: " + (val < 1)); + return val < 1; + } + + static boolean test2(int val) { + System.out.println("test2(" + val + ")"); + System.out.println("result: " + (val < 2)); + return val < 2; + } + + static boolean test3(int val) { + System.out.println("test3(" + val + ")"); + System.out.println("result: " + (val < 3)); + return val < 3; + } + + public static void main(String[] args) { + boolean b = test1(0) && test2(2) && test3(2); + System.out.println("expression is " + b); + } +} +``` + +输出结果: + +``` +test1(0) +result: true +test2(2) +result: false +expression is false +``` + +每个测试都对参数执行比较并返回 `true` 或 `false`。同时控制台也会在方法执行时打印他们的执行状态。 下面的表达式: + +```JAVA +test1(0)&& test2(2)&& test3(2) +``` + +可能你的预期是程序会执行 3 个 **test** 方法并返回。我们来分析一下:第一个方法的结果返回 `true`,因此表达式会继续走下去。紧接着,第二个方法的返回结果是 `false`。这就代表这整个表达式的结果肯定为 `false`,所以就没有必要再判断剩下的表达式部分了。 + +所以,运用“短路”可以节省部分不必要的运算,从而提高程序潜在的性能。 + ## 字面值 From 8616dd0ee3be2c75609cd236184828b11bcf11ea Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 28 Mar 2019 19:06:14 +0800 Subject: [PATCH 066/814] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=AE=A4=E9=A2=86issue=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/contribution.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/contribution.md diff --git a/.github/ISSUE_TEMPLATE/contribution.md b/.github/ISSUE_TEMPLATE/contribution.md new file mode 100644 index 00000000..23572478 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/contribution.md @@ -0,0 +1,18 @@ +--- +name: 贡献力量 +about: 请描述你需要贡献的具体方面 + +--- + +申请贡献一份力量! + +### 具体章节/标题 + + + +* 示例章节 + * 示例标题1 + * 示例标题2 + + + From c1e0f832b624dc89921390a92b1536565e19ae05 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Thu, 28 Mar 2019 19:21:54 +0800 Subject: [PATCH 067/814] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=AE=A4=E9=A2=86issue=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/contribution.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/contribution.md b/.github/ISSUE_TEMPLATE/contribution.md index 23572478..dae7fa0b 100644 --- a/.github/ISSUE_TEMPLATE/contribution.md +++ b/.github/ISSUE_TEMPLATE/contribution.md @@ -4,7 +4,13 @@ about: 请描述你需要贡献的具体方面 --- -申请贡献一份力量! +## 我愿成为一名开源贡献者! + +### 申请翻译/校对 + + + + * 翻译 ### 具体章节/标题 @@ -16,3 +22,5 @@ about: 请描述你需要贡献的具体方面 + + From 4838938a994559be34377bd48e5eea18ba2eb94c Mon Sep 17 00:00:00 2001 From: LingCoder <34231795+LingCoder@users.noreply.github.com> Date: Thu, 28 Mar 2019 19:23:20 +0800 Subject: [PATCH 068/814] Update contribution.md --- .github/ISSUE_TEMPLATE/contribution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/contribution.md b/.github/ISSUE_TEMPLATE/contribution.md index dae7fa0b..fdbf963e 100644 --- a/.github/ISSUE_TEMPLATE/contribution.md +++ b/.github/ISSUE_TEMPLATE/contribution.md @@ -10,7 +10,7 @@ about: 请描述你需要贡献的具体方面 - * 翻译 + * 翻译 ### 具体章节/标题 From b14da664d9fe838449bba7244e48d5bfdf2f4877 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Fri, 29 Mar 2019 11:47:11 +0800 Subject: [PATCH 069/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AD=97=E9=9D=A2?= =?UTF-8?q?=E5=80=BC=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 4 +- book/04-Operators.md | 171 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 171 insertions(+), 4 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 8e845194..4f3d69a0 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -60,10 +60,10 @@ * [优先级](book/04-Operators.md#优先级) * [赋值](book/04-Operators.md#赋值) * [算术运算符](book/04-Operators.md#算术运算符) - * [自动递增和递减](book/04-Operators.md#自动递增和递减) + * [递增和递减](book/04-Operators.md#递增和递减) * [关系运算符](book/04-Operators.md#关系运算符) * [逻辑运算符](book/04-Operators.md#逻辑运算符) - * [字面值](book/04-Operators.md#字面值) + * [字面值常量](book/04-Operators.md#字面值常量) * [按位运算符](book/04-Operators.md#按位运算符) * [移位运算符](book/04-Operators.md#移位运算符) * [三元运算符](book/04-Operators.md#三元运算符) diff --git a/book/04-Operators.md b/book/04-Operators.md index 1166f110..f43970af 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -258,7 +258,7 @@ x = a * (-b); -## 自动递增和递减 +## 递增和递减 和 C 语言类似,Java 提供了许多快捷运算方式。快捷运算可使代码可读性,可写性都更强。其中包括递增 `++` 和递减 `--`,意为“增加或减少一个单位”。举个例子来说,假设 a 是一个 **int** 类型的值,则表达式 `++a` 就等价于 `a = a + 1`。 递增和递减运算符不仅可以修改变量,还可以生成变量的值。 @@ -471,7 +471,174 @@ test1(0)&& test2(2)&& test3(2) -## 字面值 +## 字面值常量 + + +通常,当我们向程序中插入一个字面值常量(**Literal**)时,编译器会确切地识别它的类型。当类型不明确时,必须辅以字面值常量关联来帮助编译器识别。代码示例: + +```JAVA +// operators/Literals.java +public class Literals { + public static void main(String[] args) { + int i1 = 0x2f; // 16进制 (小写) + System.out.println( + "i1: " + Integer.toBinaryString(i1)); + int i2 = 0X2F; // 16进制 (大写) + System.out.println( + "i2: " + Integer.toBinaryString(i2)); + int i3 = 0177; // 8进制 (前导0) + System.out.println( + "i3: " + Integer.toBinaryString(i3)); + char c = 0xffff; // 最大 char 型16进制值 + System.out.println( + "c: " + Integer.toBinaryString(c)); + byte b = 0x7f; // 最大 byte 型16进制值 10101111; + System.out.println( + "b: " + Integer.toBinaryString(b)); + short s = 0x7fff; // 最大 short 型16进制值 + System.out.println( + "s: " + Integer.toBinaryString(s)); + long n1 = 200L; // long 型后缀 + long n2 = 200l; // long 型后缀 (容易与数值1混淆) + long n3 = 200; + + // Java 7 二进制字面值常量: + byte blb = (byte)0b00110101; + System.out.println( + "blb: " + Integer.toBinaryString(blb)); + short bls = (short)0B0010111110101111; + System.out.println( + "bls: " + Integer.toBinaryString(bls)); + int bli = 0b00101111101011111010111110101111; + System.out.println( + "bli: " + Integer.toBinaryString(bli)); + long bll = 0b00101111101011111010111110101111; + System.out.println( + "bll: " + Long.toBinaryString(bll)); + float f1 = 1; + float f2 = 1F; // float 型后缀 + float f3 = 1f; // float 型后缀 + double d1 = 1d; // double 型后缀 + double d2 = 1D; // double 型后缀 + // (long 型的字面值同样适用于十六进制和8进制 ) + } +} +``` + +输出结果: + +``` +i1: 101111 +i2: 101111 +i3: 1111111 +c: 1111111111111111 +b: 1111111 +s: 111111111111111 +blb: 110101 +bls: 10111110101111 +bli: 101111101011111010111110101111 +bll: 101111101011111010111110101111 +``` + +在文本值的后面添加字面值常量可以让编译器识别该文本值的类型。对于 **Long** 型数值,结尾使用大写 `L` 或小写 `l` 皆可(不推荐使用 `l`,因为容易与阿拉伯数值 1 混淆)。大写 `F` 或小写 `f` 表示 **float** 浮点数。大写 `D` 或小写 `d` 表示 **double** 双精度。 + + +十六进制(以 16 为基数),适用于所有整型数据类型,由前导 `0x` 或 `0x` 表示,后跟 0-9 或 a-f (大写或小写)。如果我们在初始化某个类型的数值时,赋值超出其范围,那么编译器会报错(不管值的数字形式如何)。在上例的代码中,**char**、**byte** 和 **short** 的值已经是最大了。如果超过这些值,编译器将自动转型为 **int**,并且我们需要声明强制转换(强制转换将在本章后面定义)。这告诉我们已越过该类型的范围界限。 + +八进制(以 8 为基数)由 0~7 之间的数字和前导零 `0` 表示。 + +Java 7 引入了二进制的字面值常量,由前导 `0B` 或 `0B` 表示,它可以初始化所有的整数类型。 + +使用整型数值类型时,显示其二进制形式会很有用。在 Long 型和 Integer 型中这很容易实现,调用其静态的 **toBinaryString()** 方法即可。 但是请注意,若将较小的类型传递给 **Integer.tobinarystring()** 时,类型将自动转换为 **int**。 + + +### 下划线 + + +Java 7 中有一个深思熟虑的补充:我们可以在数字文字中包含下划线 `_`,以使结果更清晰。这对于大数值的分组数字特别有用。代码示例: + + +```JAVA +// operators/Underscores.java +public class Underscores { + public static void main(String[] args) { + double d = 341_435_936.445_667; + System.out.println(d); + int bin = 0b0010_1111_1010_1111_1010_1111_1010_1111; + System.out.println(Integer.toBinaryString(bin)); + System.out.printf("%x%n", bin); // [1] + long hex = 0x7f_e9_b7_aa; + System.out.printf("%x%n", hex); + } +} +``` + +输出结果: + +``` +3.41435936445667E8 +101111101011111010111110101111 +2fafafaf +7fe9b7aa +``` + + +下面是合理使用的规则: + +1. 仅限单 `_`,不能多条相连。 +2. 数值开头和结尾不允许出现 `_`。 +3. `F`、`D` 和 `L`的前后禁止出现 `_`。 +4. 二进制前导 `b` 和 十六进制 `x` 前后禁止出现 `_`。 + + +[1] 注意 `%n`的使用。熟悉 C 风格的程序员可能习惯于看到 `\n` 来表示换行符。问题在于它给你的是一个“Unix风格”的换行符。此外,如果我们使用的是 Windows,则必须指定 `\r\n`。这种差异的包袱应该由编程语言来解决。这就是Java用 `%n` 实现的,忽略平台间差异生成适当的换行符。但当你使用 `System.out.printf()` 或 `System.out.format()` 时。对于 `System.out.println()`,我们仍然必须使用 `\n`;如果你使用 `%n`,`println()` 只会输出 `%n` 而不是换行符。 + + + +### 指数计数法 + + 指数总是采用一种我认为很不直观的记号方法: + +```JAVA +// operators/Exponents.java +// "e" 表示 10 的几次幂 +public class Exponents { + public static void main(String[] args) { + // 大写 E 和小写 e 的效果相同: + float expFloat = 1.39e-43f; + expFloat = 1.39E-43f; + System.out.println(expFloat); + double expDouble = 47e47d; // 'd' 是可选的 + double expDouble2 = 47e47; // 自动转换为 double + System.out.println(expDouble); + } +} +``` + +输出结果: + +``` +1.39E-43 +4.7E48 +``` + +在科学与工程学领域,“e”代表自然对数的基数,约等于 2.718 (Java 一种更精确的 **double** 值采用 **Math.E** 的形式)。它在类似 “1.39×e 的 -47 次方”这样的指数表达式中使用,意味着“1.39×2.718 的-47次方”。然而,自 FORTRAN 语言发明后,人们自然而然地觉得e 代表 “10几次幂”。这种做法显得颇为古怪,因为 FORTRAN 最初面向的是科学与工程设计领域。 + +理所当然,它的设计者应对这样的混淆概念持谨慎态度 [^2]。但不管怎样,这种特别的表达方法在 C,C++ 以及现在的 Java 中顽固地保留下来了。所以倘若习惯 e 作为自然对数的基数使用,那么在 Java 中看到类似“1.39e-47f”这样的表达式时,请转换你的思维,从程序设计的角度思考它;它真正的含义是“1.39×10 的-47次方”。 + +注意如果编译器能够正确地识别类型,就不必使用尾随字面值常量。对于下述语句: + +```JAVA +long n3 = 200; +``` + +它并不存在含糊不清的地方,所以 200 后面的 L 大可省去。然而,对于下述语句: + +``` +float f4 = 1e-47f; //10 的幂数 +``` + +编译器通常会将指数作为 **double** 类型来处理,所以假若没有这个尾随的 `f`,编辑器就会报错,提示我们应该将 **double** 型转换成 **float**型。 From 1883e9b6520ca2c9253420711dc9eb55c1f63efe Mon Sep 17 00:00:00 2001 From: LingCoder Date: Fri, 29 Mar 2019 14:17:28 +0800 Subject: [PATCH 070/814] autocommit --- .github/ISSUE_TEMPLATE/contribution.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/contribution.md b/.github/ISSUE_TEMPLATE/contribution.md index fdbf963e..eecca209 100644 --- a/.github/ISSUE_TEMPLATE/contribution.md +++ b/.github/ISSUE_TEMPLATE/contribution.md @@ -1,19 +1,16 @@ --- name: 贡献力量 about: 请描述你需要贡献的具体方面 - --- ## 我愿成为一名开源贡献者! ### 申请翻译/校对 - * 翻译 ### 具体章节/标题 - * 示例章节 @@ -21,6 +18,5 @@ about: 请描述你需要贡献的具体方面 * 示例标题2 - From d9b0d79a9d9324a56c863b374a0f4ee812540576 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Fri, 29 Mar 2019 14:22:22 +0800 Subject: [PATCH 071/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E8=BF=9B=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++-- book/04-Operators.md | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ad8956a2..d431fb16 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,10 @@ - [x] 第一章 对象的概念 - [x] 第二章 安装Java和本书用例 - [x] 第三章 万物皆对象 -- [ ] 第四章 运算符 +- [ ] 第四章 运算符 (正在翻译中……) - [x] 第五章 控制流 +- [ ] 第六章 初始化和清理 (正在翻译中……) +- [ ] 第七章 封装 (正在翻译中……) - [x] 第十三章 函数式编程 - [x] 附录:新IO @@ -92,7 +94,7 @@ 使用 MarkDown 编辑器,md 语法格式进行文档翻译及排版工作 完成之后 Pull Request 如没问题的话,我会合并到主分支 -如果不太明白 md 的排版,可以把翻译好的内容发送给我,我代为排版并提交 +如果不太明白 md 的排版,可以不必太过纠结,我会在合并提交时代为排版 如还有其它问题,欢迎发送 issue,谢谢~ diff --git a/book/04-Operators.md b/book/04-Operators.md index f43970af..8247c504 100644 --- a/book/04-Operators.md +++ b/book/04-Operators.md @@ -638,7 +638,7 @@ long n3 = 200; float f4 = 1e-47f; //10 的幂数 ``` -编译器通常会将指数作为 **double** 类型来处理,所以假若没有这个尾随的 `f`,编辑器就会报错,提示我们应该将 **double** 型转换成 **float**型。 +编译器通常会将指数作为 **double** 类型来处理,所以假若没有这个尾随的 `f`,编辑器就会报错,提示我们应该将 **double** 型转换成 **float** 型。 From 89227d33e598e27dff7eb7e73338b9567d990a5a Mon Sep 17 00:00:00 2001 From: KIDlty Date: Fri, 29 Mar 2019 20:17:25 +0800 Subject: [PATCH 072/814] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/00-Introduction.md | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/book/00-Introduction.md b/book/00-Introduction.md index 2b793d95..1590e104 100644 --- a/book/00-Introduction.md +++ b/book/00-Introduction.md @@ -3,19 +3,25 @@ > “我的语言极限,即是我的世界的极限。” ——路德维希·维特根斯坦(*Wittgenstein*) -这句话对于编程语言来说也一样。你所使用的编程语言会将你的思维模式固化并逐渐远离其他语言。Java 作为一门傲娇的派生语言尤其如此。早期语言设计者为了不想在项目中使用 C++ 而创造了这种看起来很像 C++,却比 C++ 有了改进的新语言。其最核心的变化就是包含虚拟机和垃圾回收机制。这两个概念在本书之后的章节会有详细描述。 此外,Java 还在其他方面推动行业了发展。例如,现在绝大多数编程语言都包含文档注释语法和 HTML 文档生成的工具。Java 最主要的概念之一“对象”来自 SmallTalk 语言。Java 定义了“对象”(在下一章中描述)为编程的基本单元。于是,万物皆对象。 +这句话无论对于自然语言还是编程语言来说都是一样的。你所使用的编程语言会将你的思维模式固化并逐渐远离其他语言,而且往往发生在不知不觉中。Java 作为一门傲娇的语言尤其如此。 -时间已经检验了这种信念,并发现它太过狂热。有些人甚至认为“对象”是完全错误的概念,应该被丢弃。就我个人而言,把一切都当成一个对象不仅是一个不必要的负担,而且还会招致许多设计朝着不好的方向发展。尽管如此,“对象”的概念依然有其闪光点。固执地要求所有东西都是一个对象(特别是一直到最底层级别)是一个设计错误。相反,完全逃避“对象”的概念似乎同样太过苛刻。 +Java是一门派生语言,早期语言设计者为了不想在项目中使用 C++ 而创造了这种看起来很像 C++,却比 C++ 有了改进的新语言(他们原始的项目到最后也没有实现)。Java最核心的变化就是加入了“虚拟机”和“垃圾回收机制”,这两个概念在本书之后的章节会有详细描述。 此外,Java 还在其他方面推动行业了发展,例如,现在绝大多数编程语言都包含文档注释语法和 HTML 文档生成的工具。 -其他 Java 语言决策并没有像承诺的那样完成。在本书中,我会尝试解释这些。你不仅了解这些功能,还要了解为什么他们可能对你不太适用。这无关 Java 是一种好语言或者坏语言。一旦你了解了该语言的缺陷和局限性,你就能够: +Java 最主要的概念之一“对象”来自 SmallTalk 语言。SmallTalk 语言坚定不移的认为“对象”(在下一章中描述)是编程的最基本单元,于是,万物皆对象。时间已经检验了这种信念,并发现它太过狂热,有些人甚至认为“对象”是完全错误的概念,应该被丢弃。就我个人而言,把一切都当成一个对象不仅是一项不必要的负担,而且还会招致许多设计朝着不好的方向发展。尽管如此,“对象”的概念依然有其闪光点。固执地要求所有东西都是一个对象(特别是一直到最底层级别)是一个设计错误,相反,完全逃避“对象”的概念似乎同样太过苛刻。 -1. 遇到“已停用”的功能特性时不会疑惑。 +很多 Java 语言规划设计的功能并没有像承诺的那样完成。在本书中,我会尝试解释这些原因。力争让读者知道这些功能,并知道为什么这些功能并不适用。这无关 Java 是一种好语言或者坏语言,一旦你了解了该语言的缺陷和局限性,你就能够: -2. 熟悉语言边界,更好地设计和编码。 +1. 遇到“被砍掉”的功能特性时不会疑惑。 -编程有关管理复杂性;问题的复杂性依赖于机器的复杂性。由于这种复杂性,我们的大多数编程项目都失败了。许多语言设计决策时都考虑到了复杂性,但在某些时候,其他问题也势必不会少的,程序员不可避免地“碰壁”。例如,C++ 必须向后兼容 C(允许 C 程序员轻松迁移),并且效率很高。这些目标诚然很好,并且也解释了为什么 C++ 在编程界取得了成功。为了保证兼容性的代价会造成语言额外的复杂性。当然,你可以责怪程序员和管理人员,但如果一种语言可以通过捕捉异常来提供有用的信息,为什么不呢? +2. 熟悉语言边界,以便更好地设计和编码。 -虽然 Visual BASIC(VB)绑定在 BASIC 上,但 BASIC 实际上并不是一种可扩展的语言。在 VB 上堆积的所有扩展造成大量无法维护的语法。Perl 向后兼容 awk,sed,grep 以及其它要替换的 Unix 工具,因此它经常被指责生成“只写代码”(也就是说,你看不懂自己的代码)。另一方面,C ++,VB,Perl 和其他语言(如 SmallTalk)的一些设计工作集中在复杂性问题上,因此在解决某些类型的问题方面非常成功。通信革命使我们所有人更容易地相互沟通:一对一,团体和行星。据说下一次革命会形成一种新全球性的思想,这种思想源于足量的人之间的相互联系。Java 可能会也可能不会成为这场革命的工具之一,但至少这种可能性让我觉得我现在正在做的传道授业是一件有意义的事情。 +编程的过程就是复杂性管理的过程:业务问题的复杂性,以及依赖的计算机的复杂性。由于这种复杂性,我们的大多数编程项目都失败了。 + +许多语言设计决策时都考虑到了复杂性,试图降低语言的复杂性,但在设计过程中遇到了一些更棘手的问题,最终导致语言设计不可避免地“碰壁”,复杂性增加。例如,C++ 必须向后兼容 C(允许 C 程序员轻松迁移),并且效率很高。这些目标非常实用,并且也是 C++ 在编程界取得了成功的原因之一,但同时也引入了额外的复杂性,导致某些用C++编写的项目开发失败。当然,你可以责怪程序员和管理人员手艺不精,但如果有一种编程语言可以帮助你在开发过程中发现错误,那岂不是更好? + +虽然 Visual BASIC(VB)绑定在 BASIC 上,但 BASIC 实际上并不是一种可扩展的语言,在 VB 上堆积的所有扩展造成大量无法维护的语法。Perl 向后兼容 awk,sed,grep 以及其它要替换的 Unix 工具,因此它经常被指责生产了一堆“只写代码”(写代码的人自己都看不懂的代码)。另一方面,C ++,VB,Perl 和其他语言(如 SmallTalk)在设计时关注点放在了一些复杂问题的处理上,因此在解决某些特定类型问题方面非常成功。 + +通信革命使我们所有人更容易地相互沟通:无论是一对一沟通,还是团队里的互相沟通,甚至是整个地球不同地区。据说下一次革命是一种新全球思维的形成,这种全球思维源于足量的人以及足量相互连接。Java 可能会也可能不会成为这场革命的工具之一,但至少这种可能性让我觉得我现在正在做的传道授业是一件有意义的事情。 @@ -24,11 +30,16 @@ 阅读本书需要读者对编程有基本的了解: -程序是由一系列代码块,子句或函数组成的控制语句的集合。比如 “if”,“while”判断语句等等。 +- 程序是一系列“陈述(语句、代码)”构成 + +- 子程序、方法、宏的概念 + +- 控制语句(例如 “if”),循环结构(例如“while”) + -你可能已经在学校、网络或其他书本上了熟悉了这样。只要你对自己的编程基础有自信,你就可以完成本书的学习。 +你可能已经在学校、书籍或网络上了学过这些。只要你对上述的编程基本概念觉得熟悉,你就可以完成本书的学习。 -你可以通过在 On Java 8的网站上免费下载 Think in C 来补充学习 Java 所需要的前置知识。 本书介绍了 Java 语言的基本控制机制以及面对对象编程的概念。在本书中我引述了一些 C/C ++ 语言中的一些特性来帮助读者更好的理解 Java。 毕竟 Java 是在它们的基础之上发明的。理解他们之间的区别,有助于读者更好的学习 Java。 +你可以通过在 On Java 8的网站上免费下载 Think in C 来补充学习 Java 所需要的前置知识。 本书介绍了 Java 语言的基本控制机制以及面对对象编程(OOP)的概念。在本书中我引述了一些 C/C ++ 语言中的一些特性来帮助读者更好的理解 Java,毕竟 Java 是在它们的基础之上发明的,理解他们之间的区别,有助于读者更好的学习 Java。 我试图去简化这些引述,以便让没有C/C++基础的人更好的理解。 ## JDK文档 From 7e202ca62e65e5a1b6480beae2f732fe134ad415 Mon Sep 17 00:00:00 2001 From: KIDlty Date: Fri, 29 Mar 2019 21:23:25 +0800 Subject: [PATCH 073/814] Update 08-Reuse.md --- book/08-Reuse.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/book/08-Reuse.md b/book/08-Reuse.md index d8b7a696..44e949a7 100644 --- a/book/08-Reuse.md +++ b/book/08-Reuse.md @@ -2,7 +2,15 @@ # 第八章 复用 +代码复用是使用面向对象编程(OOP)最令人信服的理由之一 +对于像C语言等面向过程语言来说,“复用”通常指的是“复制代码”,对于任何语言来说都可以这样简单来做,但实际效果并不会好。就像Java里的所有东西一样,解决问题要围绕“类(class)”展开。你可以通过创建新的class来重用代码,但并不是白手起家,而是使用别人已经构建或调试过的已经存在的class。 + +如何在不弄脏已经存在的代码的情况下来使用class,是需要技巧的,在本章,你将学到两种方式来达到这个目的。 +第一种方式相当直接了当:在新的class中创建已有class的对象。这种方式叫做“组合”(composition),因为新的class是已经存在的类的对象里一个组成部分,通过这种方式你可以重用代码的功能而不是它原本的形式。 +第二种方式就比较微妙了,通过已有的class的“样式”,创建一种新的class。照字面理解就是,你可以采用已有class的形式,但编程的时候不会改动已有的class。这种方式叫做“继承”,编译器会处理大量的工作。继承是面向对象编程(OOP)的基础之一,由此带来的附加功能将会在“多态”章节中介绍。 + +组合和继承在很多语法和行为上是相似的(这其实是有道理的,因为他们都是用已有的类型构建新的类型)。在本章中,你会学到这两种代码重用的方法。 ## 组合语法 From 36fb98f14c846c668b55e9106dc1bd4018e74fbe Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sat, 30 Mar 2019 07:17:12 +0800 Subject: [PATCH 074/814] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E7=AB=A0=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/01-What-is-an-Object.md | 46 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/book/01-What-is-an-Object.md b/book/01-What-is-an-Object.md index 03208fcb..4140e0cd 100644 --- a/book/01-What-is-an-Object.md +++ b/book/01-What-is-an-Object.md @@ -22,9 +22,9 @@ 处理图形符号设计的(后者被证明限制性太强)。每种方法都有自己特殊的用途,适合解决某一类的问题。只要超出了它们力所能及的范围,就会显得非常笨拙。 面向对象的程序设计在此基础上跨出了一大步,程序员可利用一些工具表达“问题空间”内的元素。由于这种 -表达非常具有普遍性,所以不必受限于特定类型的问题。我们将问题空间中的元素以及它们在解决方案空间的表示物称作“对象”(Object)。当然,还有一些在问题空间没有对应的对象体。通过添加新的对象类型,程序可进行灵活的调整,以便与特定的问题配合。所以在阅读方案的描述代码时,会读到对问题进行表达的话语。与我们以前见过的相比,这无疑是一种更加灵活、更加强大的语言抽象方法。总之,OOP 允许我们根据问题来描述问题,而不是根据方案。然而,仍有一个联系途径回到计算机。每个对象都类似一台小计算机;它们有自己的状态,而且可要求它们进行特定的操作。与现实世界的“对象”或者“物体”相比,编程“对象”与它们也存在共通的地方:它们都有自己的特征和行为。 +表达非常具有普遍性,所以不必受限于特定类型的问题。我们将问题空间中的元素以及它们在解决方案空间的表示物称作“对象”(**Object**)。当然,还有一些在问题空间没有对应的对象体。通过添加新的对象类型,程序可进行灵活的调整,以便与特定的问题配合。所以在阅读方案的描述代码时,会读到对问题进行表达的话语。与我们以前见过的相比,这无疑是一种更加灵活、更加强大的语言抽象方法。总之,OOP 允许我们根据问题来描述问题,而不是根据方案。然而,仍有一个联系途径回到计算机。每个对象都类似一台小计算机;它们有自己的状态,而且可要求它们进行特定的操作。与现实世界的“对象”或者“物体”相比,编程“对象”与它们也存在共通的地方:它们都有自己的特征和行为。 -Smalltalk 作为第一种成功的面向对象程序设计语言和 Java 的基础语言,Alan Kay 总结了其五大基本特征。通过这些特征,我们可理解“纯粹”的面向对象程序设计方法是什么样的: +Smalltalk 作为第一种成功的面向对象程序设计语言和 Java 的基础语言,*Alan Kay* 总结了其五大基本特征。通过这些特征,我们可理解“纯粹”的面向对象程序设计方法是什么样的: > 1. **万物皆对象**。你可以将对象想象成一种特殊的变量。它可以存储数据,可以在你对其“发出请求”时执行本身的操作。理论上讲,你可以从要解决的问题身上抽象出概念性的组件,然后在程序中将其表达为一个对象。 > 2. **程序是一组对象,通过信息传递来告知彼此该做什么**。要请求一个对象,你需要向该对象发送信息。 @@ -37,17 +37,17 @@ Grady Booch 提供了对对象更简洁的描述:一个对象具有自己的 ## 接口 -亚里士多德(*Aristotle*)或许是认真研究“类型”概念的第一人,他曾谈及“鱼类和鸟类”的问题。是世界首例面向对象语言Simula-67 中,第一次用到了这样的一个概念: -所有对象——尽管各有特色——都属于某一系列对象的一部分,这些对象具有通用的特征和行为。在Simula-67 中,首次用到了`class` 这个关键字,它为程序引入了一个全新的类型(`class` 和 type 通常可互换使用,有些人进行了进一步的区分,他们强调“类型”决定了接口,而“类”是那个接口的一种特殊实现方式)。 +亚里士多德(*Aristotle*)或许是认真研究“类型”概念的第一人,他曾谈及“鱼类和鸟类”的问题。是世界首例面向对象语言 Simula-67 中,第一次用到了这样的一个概念: +所有对象——尽管各有特色——都属于某一系列对象的一部分,这些对象具有通用的特征和行为。在Simula-67 中,首次用到了 `class` 这个关键字,它为程序引入了一个全新的类型(`class` 和 type 通常可互换使用,有些人进行了进一步的区分,他们强调“类型”决定了接口,而“类”是那个接口的一种特殊实现方式)。 -Simula 是一个很好的例子。正如这个名字所暗示的,它的作用是“模拟”(Simulate)象“银行出纳员”这 +Simula 是一个很好的例子。正如这个名字所暗示的,它的作用是“模拟”(*Simulate*)象“银行出纳员”这 样的经典问题。在这个例子里,我们有一系列出纳员、客户、帐号以及交易等。每类成员(元素)都具有一 些通用的特征:每个帐号都有一定的余额;每名出纳都能接收客户的存款;等等。与此同时,每个成员都有 自己的状态;每个帐号都有不同的余额;每名出纳都有一个名字。所以在计算机程序中,能用独一无二的实 体分别表示出纳员、客户、帐号以及交易。这个实体便是“对象”,而且每个对象都隶属一个特定的“类”,那个类具有自己的通用特征与行为。 -因此,在面向对象的程序设计中,尽管我们真正要做的是新建各种各样的数据“类型”(Type),但几乎所 -有面向对象的程序设计语言都采用了`class`关键字。当您看到“type”这个字的时候,请同时想到`class`;反之亦然。 +因此,在面向对象的程序设计中,尽管我们真正要做的是新建各种各样的数据“类型”(*Type*),但几乎所 +有面向对象的程序设计语言都采用了 `class` 关键字。当您看到“type”这个字的时候,请同时想到 `class`;反之亦然。 创建好一个类后,可根据情况生成许多对象。随后,可将那些对象作为要解决问题中存在的元素进行处理。事实上,当我们进行面向对象的程序设计时,面临的最大一项挑战性就是:如何在“问题空间”(问题实际存 在的地方)的元素与“方案空间”(对实际问题进行建模的地方,如计算机)的元素之间建立理想的“一对 @@ -65,11 +65,11 @@ Light lt = new Light(); lt.on(); ``` -在这个例子中,类型/类的名称是 Light,可向 Light 对象发出的请求包括包括打开(on)、关闭(off)、变得更明亮(brighten)或者变得更暗淡(dim)。通过简单地声明一个名字(lt),我们为 Light 对象创建了一个“句柄”。然后用new关键字新建类型为 Light 的一个对象。再用等号将其赋给句柄。 +在这个例子中,类型/类的名称是 **Light**,可向 **Light** 对象发出的请求包括包括打开(on)、关闭(*off*)、变得更明亮(*brighten*)或者变得更暗淡(*dim*)。通过简单地声明一个名字(lt),我们为 **Light** 对象创建了一个“句柄”。然后用new关键字新建类型为 **Light** 的一个对象。再用等号将其赋给句柄。 -为了向对象发送一条信息,我们列出句柄名(lt),再用一个句点符号(.)把它同信息名称(on)连接起来。从中可以看出,使用一些预先定义好的类时,我们在程序里采用的代码是非常简单和直观的。 +为了向对象发送一条信息,我们列出句柄名(*lt*),再用一个句点符号(`.`)把它同信息名称(*on*)连接起来。从中可以看出,使用一些预先定义好的类时,我们在程序里采用的代码是非常简单和直观的。 -上图遵循 UML(*Unified Modeling Language*,统一建模语言)的格式。每个类由一个框表示,框的顶部有类型名称,框中间部分要描述的任何数据成员,以及方法(属于此对象的方法,它们接收任何发送到该对象的信息)在框的底部。通常,只有类的名称和公共方法在 UML 设计图中显示,因此中间部分未显示,如本例所示。如果您只对类名感兴趣,则也不需要显示方法信息。 +上图遵循 **UML**(*Unified Modeling Language*,统一建模语言)的格式。每个类由一个框表示,框的顶部有类型名称,框中间部分要描述的任何数据成员,以及方法(属于此对象的方法,它们接收任何发送到该对象的信息)在框的底部。通常,只有类的名称和公共方法在 **UML** 设计图中显示,因此中间部分未显示,如本例所示。如果您只对类名感兴趣,则也不需要显示方法信息。 ## 服务提供 @@ -95,30 +95,30 @@ Java 有三个显式关键字来设置类中的访问权限:`public`(公开 1. `public` (公开) 表示任何人都可以访问和使用该元素; - 2. `private` (私有) 除了类本身,外界无法直接访问该元素和内部方法。`private`是你和调用者之间的屏障。任何试图访问私有成员的人都会收到编译时错误; + 2. `private` (私有) 除了类本身,外界无法直接访问该元素和内部方法。`private` 是你和调用者之间的屏障。任何试图访问私有成员的人都会收到编译时错误; - 3. `protected` (受保护) 类似于`private`,区别是继承类(下一节就会引入继承的概念)可以访问`protected`的成员,但不能访问`private`成员; + 3. `protected` (受保护) 类似于 `private`,区别是继承类(下一节就会引入继承的概念)可以访问 `protected` 的成员,但不能访问 `private` 成员; - 4. `default` (默认) 如果你不使用前面的三者,默认就是`default`访问权限。`default`被称之为包访问,因为该权限下的资源可以同一包(库组件)中其他类的成员访问。 + 4. `default` (默认) 如果你不使用前面的三者,默认就是 `default` 访问权限。`default` 被称之为包访问,因为该权限下的资源可以同一包(库组件)中其他类的成员访问。 ## 复用 一个类经创建和测试后,理应是可复用的。然而很多时候,由于程序员没有足够的编程经验和远见,我们的代码复用性并不强。 -代码和设计方案的复用性是面向对象的程序设计的优点之一。我们可以通过重复使用某个`class`来达到这种复用性。同时,我们也可以将这个`class`作为另一个`class`的成员变量来使用。新的对象可以是由任意数量、类型的其他对象构成。这里涉及到“组合”和“聚合”的概念: +代码和设计方案的复用性是面向对象的程序设计的优点之一。我们可以通过重复使用某个 `class` 来达到这种复用性。同时,我们也可以将这个 `class` 作为另一个 `class` 的成员变量来使用。新的对象可以是由任意数量、类型的其他对象构成。这里涉及到“组合”和“聚合”的概念: * **组合**(*Composition*) 经常用来表示“拥有”关系(*Has-a Relationship*)。例如,“汽车拥有了主机”。 -* **聚合**(*Aggregation*) 动态的**组合**。 +* **聚合**(*Aggregation*) 动态的 **组合**。 ![UML-example](../images/1545758268350.png) -上图中实心棱形指向“**Car**”表示**组合**的关系;如果是**聚合**关系,可以使用空心棱形。 +上图中实心棱形指向“ **Car** ”表示 **组合** 的关系;如果是 **聚合** 关系,可以使用空心棱形。 (**译者注**:组合和聚合都属于关联关系的一种,只是额外具有整体-部分的意义。至于是聚合还是组合,需要根据实际的业务需求来判断。可能相同超类和子类,在不同的业务场景,关联关系会发生变化。只看代码是无法区分聚合和组合的,具体是哪一种关系,只能从语义级别来区分。聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。这个区别可以用来区分某个关联关系到底是组合还是聚合。两个类生命周期不同步,则是聚合关系,生命周期同步就是组合关系。) -使用“组合”关系会为我们的程序带来极大的灵活性。通常新构建的`class`“成员对象”会使用`private`访问权限,这样应用程序员则无法对其直接访问。我们就可以在不干扰客户代码的前提下,从容地修改那些成员。也可以在“运行期”更改成员,这进一步增大了灵活性。下面一节要讲到的“继承”并不具备这种灵活性,因为编译器必须对通过继承创建的类加以限制。 +使用“组合”关系会为我们的程序带来极大的灵活性。通常新构建的 `class` “成员对象”会使用 `private` 访问权限,这样应用程序员则无法对其直接访问。我们就可以在不干扰客户代码的前提下,从容地修改那些成员。也可以在“运行期”更改成员,这进一步增大了灵活性。下面一节要讲到的“继承”并不具备这种灵活性,因为编译器必须对通过继承创建的类加以限制。 在面向对象编程中经常重点强调“继承”。在新程序员的印象里,或许早已先入为主地认为“继承应当随处可见”。沿着这种思路产生的程序设计通常拙劣又复杂。相反,在创建新类时首先要考虑“组合”,因为它更简单灵活,并且设计逻辑清晰。等我们有一些编程经验后,一旦需要用到继承,就会明显意识到这一点。 @@ -126,7 +126,7 @@ Java 有三个显式关键字来设置类中的访问权限:`public`(公开 “继承”给面向对象编程带来极大的便利。它在概念上允许我们将各式各样数据和功能封装到一起。这样便可恰当表达“问题空间”的概念,而不是强制使用底层机器的习惯用法。 -通过使用`class`关键字,这些概念在编程语言中表示为基本单元。但若能利用现成的数据类型,对其进行“克隆”,再根据情况进行添加和修改,情况就显得理想多了。“继承”正是针对这个目标而设计的。但继承并不完全等价于克隆。在继承过程中,若原始类(正式名称叫作基础类、超类或父类)发生了变化,修改过的“克隆”类(正式名称叫作继承类或者子类)也会反映出这种变化。 +通过使用 `class` 关键字,这些概念在编程语言中表示为基本单元。但若能利用现成的数据类型,对其进行“克隆”,再根据情况进行添加和修改,情况就显得理想多了。“继承”正是针对这个目标而设计的。但继承并不完全等价于克隆。在继承过程中,若原始类(正式名称叫作基础类、超类或父类)发生了变化,修改过的“克隆”类(正式名称叫作继承类或者子类)也会反映出这种变化。 如果我们可以采用现有的类,克隆它,然后对克隆进行添加和修改,那就更好了。这实际上是通过继承得到的,只是如果原始类(称为基类或超类或父类)发生了更改,修改的“克隆”(称为派生类或继承类或子类或子类)也反映了这些更改。 @@ -220,7 +220,7 @@ void doSomething(Shape shape) { ## 单继承 -自从 C++ 引入以来,OOP 问题变得尤为突出。是否所有的类都应该默认从一个基类继承呢?这个答案在 Java 中是肯定的。(实际上,除 C++ 以外的其他虚拟机语言也是这样。)在 Java 中这个最终的基类的名字就是`Object`。 +自从 C++ 引入以来,OOP 问题变得尤为突出。是否所有的类都应该默认从一个基类继承呢?这个答案在 Java 中是肯定的。(实际上,除 C++ 以外的其他虚拟机语言也是这样。)在 Java 中这个最终的基类的名字就是 `Object`。 Java 的单继承结构有很多好处。由于所有对象都有继承自一个公共接口,因此它们最终都属于同一个基本类型。相反的,对于 C++ 所使用的多继承的方案则是不保证所有的对象都属于同一个的基类。这种方案的限制更少一点。从向后兼容的角度看,多继承的方案更符合 C 的模型。 @@ -247,9 +247,9 @@ Java 的单继承结构有很多好处。由于所有对象都有继承自一个 2. 不同的集合种类对应着不同的用途。例如,List 的两种基本类型:ArrayList 和 LinkedList。虽然两者具有相同接口和外部行为,但是在某些操作中它们的效率差别很大。在 ArrayList 中随机查找元素是很高效的,而 LinkedList 随机查找效率低下。反之,在 LinkedList 中插入元素的效率要比在 ArrayList 中高。由于底层数据结构的不同,每种集合类型在执行相同的操作时会表现出效率上的差异。 -通过对 List 接口的抽象,我们可以很容易的将 LinkedList 改为 ArrayList。在 Java 5泛型出来之前,集合中保存的是通用类型`Object`。Java 单继承的结构意味着所有元素都基于`Object`类,所以在集合中可以保存任何类型的数据。这也使得集合易于重用。要使用这样的集合时,我们先要往集合添加元素。由于 Java 5版本前的集合只保存`Object`,当我们往集合中添加元素时,元素便向上转型成了`Object`,从而丢失自己原有的类型特性。这时我们再从对象中取出该元素时,元素的类型变成了`Object`。那么我们该怎么将其转回原先具体的类型的?这里,我们使用了强制类型转换将其转为更具体的类型。这个过程称之为对象的“向下转型”。通过“向上转型”,我们知道“圆形”也是一种“形状”,这个过程是安全的。可是我们不能从“Object”看出其就是“圆圈”或“形状”,所以除非我们能确定元素的具体类型信息,否则“向下转型”就是不安全的。也不能说这样的错误就时完全危险的,因为一旦我们转化了错误的类型,程序就会运行出错,抛出“运行时异常”(*RuntimeException*)。(后面的章节会提到) 无论如何,我们要寻找一种在取出集合元素时确定其具体类型的方法。另外,每次取出元素都要做额外的“向下转型”对程序和程序员都是一种开销。以某种方式创建集合,以确认保存元素的具体类型,减少集合元素“向下转型”中的开销和可能出现的错误难道不好吗?这种解决方案就是:参数化类型机制(*Parameterized Type Mechanism*)。 +通过对 List 接口的抽象,我们可以很容易的将 LinkedList 改为 ArrayList。在 Java 5泛型出来之前,集合中保存的是通用类型 `Object`。Java 单继承的结构意味着所有元素都基于 `Object` 类,所以在集合中可以保存任何类型的数据。这也使得集合易于重用。要使用这样的集合时,我们先要往集合添加元素。由于 Java 5版本前的集合只保存 `Object`,当我们往集合中添加元素时,元素便向上转型成了 `Object`,从而丢失自己原有的类型特性。这时我们再从对象中取出该元素时,元素的类型变成了 `Object`。那么我们该怎么将其转回原先具体的类型的?这里,我们使用了强制类型转换将其转为更具体的类型。这个过程称之为对象的“向下转型”。通过“向上转型”,我们知道“圆形”也是一种“形状”,这个过程是安全的。可是我们不能从“Object”看出其就是“圆圈”或“形状”,所以除非我们能确定元素的具体类型信息,否则“向下转型”就是不安全的。也不能说这样的错误就时完全危险的,因为一旦我们转化了错误的类型,程序就会运行出错,抛出“运行时异常”(*RuntimeException*)。(后面的章节会提到) 无论如何,我们要寻找一种在取出集合元素时确定其具体类型的方法。另外,每次取出元素都要做额外的“向下转型”对程序和程序员都是一种开销。以某种方式创建集合,以确认保存元素的具体类型,减少集合元素“向下转型”中的开销和可能出现的错误难道不好吗?这种解决方案就是:参数化类型机制(*Parameterized Type Mechanism*)。 -参数化类型机制可以使得编译器能够自动识别某个`class`的具体类型并正确地执行. 举个例子,对集合的参数化类型机制可以让其仅接受“形状”这种类型的元素,并以“形状”类型取出元素。Java 5版本支持了参数化类型机制,称之为“泛型”(*Generic*)。泛型是 Java 5的主要特性之一。举个例子,你可以按以下方式向 ArrayList 种添加 Shape(形状): +参数化类型机制可以使得编译器能够自动识别某个 `class` 的具体类型并正确地执行. 举个例子,对集合的参数化类型机制可以让其仅接受“形状”这种类型的元素,并以“形状”类型取出元素。Java 5版本支持了参数化类型机制,称之为“泛型”(*Generic*)。泛型是 Java 5的主要特性之一。举个例子,你可以按以下方式向 ArrayList 种添加 Shape(形状): ```java ArrayList shapes = new ArrayList<>(); @@ -276,7 +276,7 @@ Java 的单继承结构有很多好处。由于所有对象都有继承自一个 动态方法使一般的逻辑假设对象趋于复杂,因此额外的内存查找和释放的开销对对象的创建影响不大。(原文:*The dynamic approach makes the generally logical assumption that objects tend to be complicated, so the extra overhead of finding storage and releasing that storage will not have an important impact on the creation of an object.*)此外,更好的灵活性对于问题的解决至关重要。 -Java 使用动态内存分配。每次创建对象时,使用`new`关键字构建该对象的动态实例。这又带来另一个问题:对象的生存周期。较之堆内存,在栈内存中创建对象,编译器能够确定该对象的生命周期并自动销毁;然而如果你在堆内存创建对象的话,编译器是不知道它的生命周期的。在 C++ 中你必须以编程方式确定何时销毁对象,否则可能导致内存泄漏。Java 的内存管理是建立在垃圾收集器上的,它能自动发现对象不再被使用并释放内存。垃圾收集器的存在带来了极大的便利,它减少了我们之前必须要跟踪的问题和编写相关代码的数量。因此,垃圾收集器提供了更高级别的保险,以防止潜在的内存泄漏问题,这使得许多 C++ 项目没落。 +Java 使用动态内存分配。每次创建对象时,使用 `new` 关键字构建该对象的动态实例。这又带来另一个问题:对象的生存周期。较之堆内存,在栈内存中创建对象,编译器能够确定该对象的生命周期并自动销毁;然而如果你在堆内存创建对象的话,编译器是不知道它的生命周期的。在 C++ 中你必须以编程方式确定何时销毁对象,否则可能导致内存泄漏。Java 的内存管理是建立在垃圾收集器上的,它能自动发现对象不再被使用并释放内存。垃圾收集器的存在带来了极大的便利,它减少了我们之前必须要跟踪的问题和编写相关代码的数量。因此,垃圾收集器提供了更高级别的保险,以防止潜在的内存泄漏问题,这使得许多 C++ 项目没落。 Java 的垃圾收集器被设计用来解决内存释放的问题(虽然这不包括对象清理的其他方面)。垃圾收集器知道对象什么时候不再被使用并且自动释放内存。结合单继承和仅可在堆中创建对象的机制,Java 的编码过程较之 C++ 要简单得多。我们所要做的决定和要克服的障碍也会少很多! @@ -285,7 +285,7 @@ Java 的垃圾收集器被设计用来解决内存释放的问题(虽然这不 自编程语言被发明以来,程序的错误处理一直都是个难题,因为很难设计出一个好的错误处理方案。许多编程语言都忽略了这个问题,把这个问题丢给了程序类库的设计者。他们提出了在许多情况下都可以工作但很容易被规避的半途而废的措施,通常只需忽略错误。多数错误处理方案的主要问题是:它们依赖程序员之间的约定俗成而不是语言层面的限制。换句话说,如果程序员赶时间或没想起来,这些方案就很容易被忘记。 -异常处理机制将程序错误直接交给编程语言甚至是操作系统。“异常”(*Exception*)是一个从出错点“抛出”(*thrown*)后能被特定类型的异常处理程序捕获(*catch*)的一个对象。它不会干扰程序的正常运行,仅当程序出错的时候才被执行。这让我们的编码更简单:不用再反复检查错误了。另外,如果**throw**的异常类型和**catch**的不符,则不会触发该条件下的异常处理程序。异常的发生是不会被忽略的,它终究会在某一时刻被处理。 +异常处理机制将程序错误直接交给编程语言甚至是操作系统。“异常”(*Exception*)是一个从出错点“抛出”(*thrown*)后能被特定类型的异常处理程序捕获(*catch*)的一个对象。它不会干扰程序的正常运行,仅当程序出错的时候才被执行。这让我们的编码更简单:不用再反复检查错误了。另外,如果 **throw** 的异常类型和 **catch** 的不符,则不会触发该条件下的异常处理程序。异常的发生是不会被忽略的,它终究会在某一时刻被处理。 最后,“异常机制”提供了一种可靠地从意外情况中恢复的方法,使得我们可以编写出更健壮的程序。有时你只要处理好抛出的异常情况并恢复程序的运行即可,无需退出。 From ddfd2e2168f72ea2c55df6bc24ab3135c83d5dba Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sat, 30 Mar 2019 08:32:24 +0800 Subject: [PATCH 075/814] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E7=AC=AC8=E7=AB=A0?= =?UTF-8?q?=E5=BC=80=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/08-Reuse.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/book/08-Reuse.md b/book/08-Reuse.md index 44e949a7..ef9f224a 100644 --- a/book/08-Reuse.md +++ b/book/08-Reuse.md @@ -2,15 +2,19 @@ # 第八章 复用 -代码复用是使用面向对象编程(OOP)最令人信服的理由之一 -对于像C语言等面向过程语言来说,“复用”通常指的是“复制代码”,对于任何语言来说都可以这样简单来做,但实际效果并不会好。就像Java里的所有东西一样,解决问题要围绕“类(class)”展开。你可以通过创建新的class来重用代码,但并不是白手起家,而是使用别人已经构建或调试过的已经存在的class。 -如何在不弄脏已经存在的代码的情况下来使用class,是需要技巧的,在本章,你将学到两种方式来达到这个目的。 -第一种方式相当直接了当:在新的class中创建已有class的对象。这种方式叫做“组合”(composition),因为新的class是已经存在的类的对象里一个组成部分,通过这种方式你可以重用代码的功能而不是它原本的形式。 -第二种方式就比较微妙了,通过已有的class的“样式”,创建一种新的class。照字面理解就是,你可以采用已有class的形式,但编程的时候不会改动已有的class。这种方式叫做“继承”,编译器会处理大量的工作。继承是面向对象编程(OOP)的基础之一,由此带来的附加功能将会在“多态”章节中介绍。 +> 代码复用是面向对象编程(OOP)最具魅力的原因之一。 -组合和继承在很多语法和行为上是相似的(这其实是有道理的,因为他们都是用已有的类型构建新的类型)。在本章中,你会学到这两种代码重用的方法。 +对于像 C 语言等面向过程语言来说,“复用”通常指的就是“复制代码”。任何语言都可通过简单复制来达到代码复用的目的,但是这样做的效果并不好。Java 围绕“类”(**Class**)来解决问题。我们可以直接使用别人构建或调试过的代码,而非创建新类、重新开始。 + +如何在不污染源代码的前提下使用现存代码是需要技巧的。在本章里,你将学习到两种方式来达到这个目的: + +1. 第一种方式直接了当。在新类中创建现有类的对象。这种方式叫做“组合”(**Composition**),通过这种方式复用代码的功能,而非其形式。 + +2. 第二种方式更为微妙。通过现有类创建新类。照字面理解:采用现有类形式,又无需在编码时改动其代码,这种方式就叫做“继承”(**Inheritance**)。**继承**是面向对象编程(**OOP**)的重要基础之一。更多功能相关将在[多态](./09-Polymorphism.md)(**Polymorphism**)章节中介绍。 + +组合与继承的语法、行为上有许多相似的地方(这其实是有道理的,毕竟都是基于现有类型构建新的类型)。在本章中,你会学到这两种代码复用的方法。 ## 组合语法 From 9d522a98c63a657d63af9d5b69e98f5f1ac4ab26 Mon Sep 17 00:00:00 2001 From: LingCoder Date: Sat, 30 Mar 2019 20:31:44 +0800 Subject: [PATCH 076/814] =?UTF-8?q?=E6=9B=B4=E6=96=B0docsify=E9=98=85?= =?UTF-8?q?=E8=AF=BB=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +- SUMMARY.md | 820 +++--- book.json | 4 +- docs/.nojekyll | 0 Introduction.md => docs/README.md | 23 +- docs/_coverpage.md | 22 + docs/_sidebar.md | 411 +++ docs/_style/prism-master/.editorconfig | 14 + docs/_style/prism-master/.gitattributes | 4 + docs/_style/prism-master/.gitignore | 4 + docs/_style/prism-master/.npmignore | 27 + docs/_style/prism-master/.travis.yml | 23 + docs/_style/prism-master/CHANGELOG.md | 1334 +++++++++ docs/_style/prism-master/CNAME | 1 + docs/_style/prism-master/LICENSE | 21 + docs/_style/prism-master/README.md | 30 + docs/_style/prism-master/bower.json | 30 + docs/_style/prism-master/code.js | 213 ++ docs/_style/prism-master/components.js | 2 + docs/_style/prism-master/components.json | 913 ++++++ docs/_style/prism-master/components/index.js | 82 + .../prism-master/components/prism-abap.js | 48 + .../prism-master/components/prism-abap.min.js | 1 + .../components/prism-actionscript.js | 17 + .../components/prism-actionscript.min.js | 1 + .../prism-master/components/prism-ada.js | 19 + .../prism-master/components/prism-ada.min.js | 1 + .../components/prism-apacheconf.js | 47 + .../components/prism-apacheconf.min.js | 1 + .../prism-master/components/prism-apl.js | 32 + .../prism-master/components/prism-apl.min.js | 1 + .../components/prism-applescript.js | 20 + .../components/prism-applescript.min.js | 1 + .../prism-master/components/prism-arduino.js | 5 + .../components/prism-arduino.min.js | 1 + .../prism-master/components/prism-arff.js | 10 + .../prism-master/components/prism-arff.min.js | 1 + .../prism-master/components/prism-asciidoc.js | 271 ++ .../components/prism-asciidoc.min.js | 1 + .../prism-master/components/prism-asm6502.js | 28 + .../components/prism-asm6502.min.js | 1 + .../prism-master/components/prism-aspnet.js | 36 + .../components/prism-aspnet.min.js | 1 + .../components/prism-autohotkey.js | 27 + .../components/prism-autohotkey.min.js | 1 + .../prism-master/components/prism-autoit.js | 34 + .../components/prism-autoit.min.js | 1 + .../prism-master/components/prism-bash.js | 84 + .../prism-master/components/prism-bash.min.js | 1 + .../prism-master/components/prism-basic.js | 17 + .../components/prism-basic.min.js | 1 + .../prism-master/components/prism-batch.js | 99 + .../components/prism-batch.min.js | 1 + .../prism-master/components/prism-bison.js | 39 + .../components/prism-bison.min.js | 1 + .../components/prism-brainfuck.js | 20 + .../components/prism-brainfuck.min.js | 1 + .../prism-master/components/prism-bro.js | 48 + .../prism-master/components/prism-bro.min.js | 1 + .../_style/prism-master/components/prism-c.js | 33 + .../prism-master/components/prism-c.min.js | 1 + .../prism-master/components/prism-cil.js | 27 + .../prism-master/components/prism-cil.min.js | 1 + .../prism-master/components/prism-clike.js | 30 + .../components/prism-clike.min.js | 1 + .../prism-master/components/prism-clojure.js | 13 + .../components/prism-clojure.min.js | 1 + .../components/prism-coffeescript.js | 92 + .../components/prism-coffeescript.min.js | 1 + .../prism-master/components/prism-core.js | 548 ++++ .../prism-master/components/prism-core.min.js | 1 + .../prism-master/components/prism-cpp.js | 20 + .../prism-master/components/prism-cpp.min.js | 1 + .../prism-master/components/prism-crystal.js | 51 + .../components/prism-crystal.min.js | 1 + .../prism-master/components/prism-csharp.js | 81 + .../components/prism-csharp.min.js | 1 + .../prism-master/components/prism-csp.js | 25 + .../prism-master/components/prism-csp.min.js | 1 + .../components/prism-css-extras.js | 31 + .../components/prism-css-extras.min.js | 1 + .../prism-master/components/prism-css.js | 52 + .../prism-master/components/prism-css.min.js | 1 + .../_style/prism-master/components/prism-d.js | 64 + .../prism-master/components/prism-d.min.js | 1 + .../prism-master/components/prism-dart.js | 24 + .../prism-master/components/prism-dart.min.js | 1 + .../prism-master/components/prism-diff.js | 20 + .../prism-master/components/prism-diff.min.js | 1 + .../prism-master/components/prism-django.js | 41 + .../components/prism-django.min.js | 1 + .../prism-master/components/prism-docker.js | 11 + .../components/prism-docker.min.js | 1 + .../prism-master/components/prism-eiffel.js | 37 + .../components/prism-eiffel.min.js | 1 + .../prism-master/components/prism-elixir.js | 93 + .../components/prism-elixir.min.js | 1 + .../prism-master/components/prism-elm.js | 44 + .../prism-master/components/prism-elm.min.js | 1 + .../prism-master/components/prism-erb.js | 20 + .../prism-master/components/prism-erb.min.js | 1 + .../prism-master/components/prism-erlang.js | 44 + .../components/prism-erlang.min.js | 1 + .../prism-master/components/prism-flow.js | 35 + .../prism-master/components/prism-flow.min.js | 1 + .../prism-master/components/prism-fortran.js | 40 + .../components/prism-fortran.min.js | 1 + .../prism-master/components/prism-fsharp.js | 67 + .../components/prism-fsharp.min.js | 1 + .../prism-master/components/prism-gcode.js | 15 + .../components/prism-gcode.min.js | 1 + .../prism-master/components/prism-gedcom.js | 28 + .../components/prism-gedcom.min.js | 1 + .../prism-master/components/prism-gherkin.js | 79 + .../components/prism-gherkin.min.js | 1 + .../prism-master/components/prism-git.js | 68 + .../prism-master/components/prism-git.min.js | 1 + .../prism-master/components/prism-glsl.js | 16 + .../prism-master/components/prism-glsl.min.js | 1 + .../prism-master/components/prism-gml.js | 7 + .../prism-master/components/prism-gml.min.js | 1 + .../prism-master/components/prism-go.js | 12 + .../prism-master/components/prism-go.min.js | 1 + .../prism-master/components/prism-graphql.js | 24 + .../components/prism-graphql.min.js | 1 + .../prism-master/components/prism-groovy.js | 65 + .../components/prism-groovy.min.js | 1 + .../prism-master/components/prism-haml.js | 154 ++ .../prism-master/components/prism-haml.min.js | 1 + .../components/prism-handlebars.js | 37 + .../components/prism-handlebars.min.js | 1 + .../prism-master/components/prism-haskell.js | 36 + .../components/prism-haskell.min.js | 1 + .../prism-master/components/prism-haxe.js | 45 + .../prism-master/components/prism-haxe.min.js | 1 + .../prism-master/components/prism-hpkp.js | 20 + .../prism-master/components/prism-hpkp.min.js | 1 + .../prism-master/components/prism-hsts.js | 20 + .../prism-master/components/prism-hsts.min.js | 1 + .../prism-master/components/prism-http.js | 79 + .../prism-master/components/prism-http.min.js | 1 + .../components/prism-ichigojam.js | 15 + .../components/prism-ichigojam.min.js | 1 + .../prism-master/components/prism-icon.js | 20 + .../prism-master/components/prism-icon.min.js | 1 + .../prism-master/components/prism-inform7.js | 61 + .../components/prism-inform7.min.js | 1 + .../prism-master/components/prism-ini.js | 11 + .../prism-master/components/prism-ini.min.js | 1 + .../prism-master/components/prism-io.js | 31 + .../prism-master/components/prism-io.min.js | 1 + .../_style/prism-master/components/prism-j.js | 25 + .../prism-master/components/prism-j.min.js | 1 + .../prism-master/components/prism-java.js | 54 + .../prism-master/components/prism-java.min.js | 1 + .../components/prism-javascript.js | 91 + .../components/prism-javascript.min.js | 1 + .../components/prism-javastacktrace.js | 93 + .../components/prism-javastacktrace.min.js | 1 + .../prism-master/components/prism-jolie.js | 55 + .../components/prism-jolie.min.js | 1 + .../prism-master/components/prism-json.js | 18 + .../prism-master/components/prism-json.min.js | 1 + .../prism-master/components/prism-jsx.js | 126 + .../prism-master/components/prism-jsx.min.js | 1 + .../prism-master/components/prism-julia.js | 12 + .../components/prism-julia.min.js | 1 + .../prism-master/components/prism-keyman.js | 14 + .../components/prism-keyman.min.js | 1 + .../prism-master/components/prism-kotlin.js | 62 + .../components/prism-kotlin.min.js | 1 + .../prism-master/components/prism-latex.js | 61 + .../components/prism-latex.min.js | 1 + .../prism-master/components/prism-less.js | 54 + .../prism-master/components/prism-less.min.js | 1 + .../prism-master/components/prism-liquid.js | 12 + .../components/prism-liquid.min.js | 1 + .../prism-master/components/prism-lisp.js | 197 ++ .../prism-master/components/prism-lisp.min.js | 1 + .../components/prism-livescript.js | 119 + .../components/prism-livescript.min.js | 1 + .../prism-master/components/prism-lolcode.js | 55 + .../components/prism-lolcode.min.js | 1 + .../prism-master/components/prism-lua.js | 20 + .../prism-master/components/prism-lua.min.js | 1 + .../prism-master/components/prism-makefile.js | 34 + .../components/prism-makefile.min.js | 1 + .../prism-master/components/prism-markdown.js | 229 ++ .../components/prism-markdown.min.js | 1 + .../components/prism-markup-templating.js | 89 + .../components/prism-markup-templating.min.js | 1 + .../prism-master/components/prism-markup.js | 56 + .../components/prism-markup.min.js | 1 + .../prism-master/components/prism-matlab.js | 16 + .../components/prism-matlab.min.js | 1 + .../prism-master/components/prism-mel.js | 43 + .../prism-master/components/prism-mel.min.js | 1 + .../prism-master/components/prism-mizar.js | 12 + .../components/prism-mizar.min.js | 1 + .../prism-master/components/prism-monkey.js | 31 + .../components/prism-monkey.min.js | 1 + .../prism-master/components/prism-n4js.js | 14 + .../prism-master/components/prism-n4js.min.js | 1 + .../prism-master/components/prism-nasm.js | 24 + .../prism-master/components/prism-nasm.min.js | 1 + .../prism-master/components/prism-nginx.js | 11 + .../components/prism-nginx.min.js | 1 + .../prism-master/components/prism-nim.js | 33 + .../prism-master/components/prism-nim.min.js | 1 + .../prism-master/components/prism-nix.js | 40 + .../prism-master/components/prism-nix.min.js | 1 + .../prism-master/components/prism-nsis.js | 29 + .../prism-master/components/prism-nsis.min.js | 1 + .../components/prism-objectivec.js | 5 + .../components/prism-objectivec.min.js | 1 + .../prism-master/components/prism-ocaml.js | 27 + .../components/prism-ocaml.min.js | 1 + .../prism-master/components/prism-opencl.js | 49 + .../components/prism-opencl.min.js | 1 + .../prism-master/components/prism-oz.js | 25 + .../prism-master/components/prism-oz.min.js | 1 + .../prism-master/components/prism-parigp.js | 30 + .../components/prism-parigp.min.js | 1 + .../prism-master/components/prism-parser.js | 67 + .../components/prism-parser.min.js | 1 + .../prism-master/components/prism-pascal.js | 55 + .../components/prism-pascal.min.js | 1 + .../prism-master/components/prism-perl.js | 191 ++ .../prism-master/components/prism-perl.min.js | 1 + .../components/prism-php-extras.js | 11 + .../components/prism-php-extras.min.js | 1 + .../prism-master/components/prism-php.js | 122 + .../prism-master/components/prism-php.min.js | 1 + .../prism-master/components/prism-plsql.js | 20 + .../components/prism-plsql.min.js | 1 + .../components/prism-powershell.js | 55 + .../components/prism-powershell.min.js | 1 + .../components/prism-processing.js | 18 + .../components/prism-processing.min.js | 1 + .../prism-master/components/prism-prolog.js | 20 + .../components/prism-prolog.min.js | 1 + .../components/prism-properties.js | 9 + .../components/prism-properties.min.js | 1 + .../prism-master/components/prism-protobuf.js | 8 + .../components/prism-protobuf.min.js | 1 + .../prism-master/components/prism-pug.js | 198 ++ .../prism-master/components/prism-pug.min.js | 1 + .../prism-master/components/prism-puppet.js | 136 + .../components/prism-puppet.min.js | 1 + .../prism-master/components/prism-pure.js | 81 + .../prism-master/components/prism-pure.min.js | 1 + .../prism-master/components/prism-python.js | 64 + .../components/prism-python.min.js | 1 + .../_style/prism-master/components/prism-q.js | 51 + .../prism-master/components/prism-q.min.js | 1 + .../prism-master/components/prism-qore.js | 20 + .../prism-master/components/prism-qore.min.js | 1 + .../_style/prism-master/components/prism-r.js | 22 + .../prism-master/components/prism-r.min.js | 1 + .../prism-master/components/prism-reason.js | 32 + .../components/prism-reason.min.js | 1 + .../prism-master/components/prism-renpy.js | 29 + .../components/prism-renpy.min.js | 1 + .../prism-master/components/prism-rest.js | 205 ++ .../prism-master/components/prism-rest.min.js | 1 + .../prism-master/components/prism-rip.js | 32 + .../prism-master/components/prism-rip.min.js | 1 + .../prism-master/components/prism-roboconf.js | 27 + .../components/prism-roboconf.min.js | 1 + .../prism-master/components/prism-ruby.js | 143 + .../prism-master/components/prism-ruby.min.js | 1 + .../prism-master/components/prism-rust.js | 68 + .../prism-master/components/prism-rust.min.js | 1 + .../prism-master/components/prism-sas.js | 34 + .../prism-master/components/prism-sas.min.js | 1 + .../prism-master/components/prism-sass.js | 72 + .../prism-master/components/prism-sass.min.js | 1 + .../prism-master/components/prism-scala.js | 18 + .../components/prism-scala.min.js | 1 + .../prism-master/components/prism-scheme.js | 33 + .../components/prism-scheme.min.js | 1 + .../prism-master/components/prism-scss.js | 74 + .../prism-master/components/prism-scss.min.js | 1 + .../components/prism-smalltalk.js | 31 + .../components/prism-smalltalk.min.js | 1 + .../prism-master/components/prism-smarty.js | 96 + .../components/prism-smarty.min.js | 1 + .../prism-master/components/prism-soy.js | 96 + .../prism-master/components/prism-soy.min.js | 1 + .../prism-master/components/prism-sql.js | 24 + .../prism-master/components/prism-sql.min.js | 1 + .../prism-master/components/prism-stylus.js | 111 + .../components/prism-stylus.min.js | 1 + .../prism-master/components/prism-swift.js | 25 + .../components/prism-swift.min.js | 1 + .../prism-master/components/prism-tap.js | 20 + .../prism-master/components/prism-tap.min.js | 1 + .../prism-master/components/prism-tcl.js | 46 + .../prism-master/components/prism-tcl.min.js | 1 + .../prism-master/components/prism-textile.js | 257 ++ .../components/prism-textile.min.js | 1 + .../prism-master/components/prism-toml.js | 43 + .../prism-master/components/prism-toml.min.js | 1 + .../prism-master/components/prism-tsx.js | 2 + .../prism-master/components/prism-tsx.min.js | 1 + .../prism-master/components/prism-tt2.js | 56 + .../prism-master/components/prism-tt2.min.js | 1 + .../prism-master/components/prism-twig.js | 46 + .../prism-master/components/prism-twig.min.js | 1 + .../components/prism-typescript.js | 7 + .../components/prism-typescript.min.js | 1 + .../prism-master/components/prism-vala.js | 74 + .../prism-master/components/prism-vala.min.js | 1 + .../prism-master/components/prism-vbnet.js | 15 + .../components/prism-vbnet.min.js | 1 + .../prism-master/components/prism-velocity.js | 72 + .../components/prism-velocity.min.js | 1 + .../prism-master/components/prism-verilog.js | 20 + .../components/prism-verilog.min.js | 1 + .../prism-master/components/prism-vhdl.js | 23 + .../prism-master/components/prism-vhdl.min.js | 1 + .../prism-master/components/prism-vim.js | 10 + .../prism-master/components/prism-vim.min.js | 1 + .../components/prism-visual-basic.js | 34 + .../components/prism-visual-basic.min.js | 1 + .../prism-master/components/prism-wasm.js | 31 + .../prism-master/components/prism-wasm.min.js | 1 + .../prism-master/components/prism-wiki.js | 81 + .../prism-master/components/prism-wiki.min.js | 1 + .../prism-master/components/prism-xeora.js | 114 + .../components/prism-xeora.min.js | 1 + .../prism-master/components/prism-xojo.js | 20 + .../prism-master/components/prism-xojo.min.js | 1 + .../prism-master/components/prism-xquery.js | 164 ++ .../components/prism-xquery.min.js | 1 + .../prism-master/components/prism-yaml.js | 47 + .../prism-master/components/prism-yaml.min.js | 1 + docs/_style/prism-master/composer.json | 20 + docs/_style/prism-master/download.html | 193 ++ docs/_style/prism-master/download.js | 598 ++++ docs/_style/prism-master/examples.html | 110 + docs/_style/prism-master/examples.js | 217 ++ .../prism-master/examples/prism-abap.html | 65 + .../examples/prism-actionscript.html | 133 + .../prism-master/examples/prism-ada.html | 35 + .../examples/prism-apacheconf.html | 54 + .../prism-master/examples/prism-apl.html | 26 + .../examples/prism-applescript.html | 41 + .../prism-master/examples/prism-arduino.html | 63 + .../prism-master/examples/prism-arff.html | 46 + .../prism-master/examples/prism-asciidoc.html | 104 + .../prism-master/examples/prism-asm6502.html | 39 + .../prism-master/examples/prism-aspnet.html | 36 + .../examples/prism-autohotkey.html | 68 + .../prism-master/examples/prism-autoit.html | 52 + .../prism-master/examples/prism-bash.html | 49 + .../prism-master/examples/prism-basic.html | 69 + .../prism-master/examples/prism-batch.html | 17 + .../prism-master/examples/prism-bison.html | 104 + .../examples/prism-brainfuck.html | 37 + .../prism-master/examples/prism-bro.html | 645 +++++ .../_style/prism-master/examples/prism-c.html | 22 + .../prism-master/examples/prism-clike.html | 28 + .../prism-master/examples/prism-clojure.html | 386 +++ .../examples/prism-coffeescript.html | 61 + .../prism-master/examples/prism-cpp.html | 61 + .../prism-master/examples/prism-crystal.html | 16 + .../prism-master/examples/prism-csharp.html | 60 + .../prism-master/examples/prism-csp.html | 13 + .../prism-master/examples/prism-css.html | 34 + .../_style/prism-master/examples/prism-d.html | 267 ++ .../prism-master/examples/prism-dart.html | 59 + .../prism-master/examples/prism-diff.html | 33 + .../prism-master/examples/prism-django.html | 31 + .../prism-master/examples/prism-docker.html | 49 + .../prism-master/examples/prism-eiffel.html | 72 + .../prism-master/examples/prism-elixir.html | 462 ++++ .../prism-master/examples/prism-elm.html | 91 + .../prism-master/examples/prism-erb.html | 22 + .../prism-master/examples/prism-erlang.html | 47 + .../prism-master/examples/prism-flow.html | 18 + .../prism-master/examples/prism-fortran.html | 71 + .../prism-master/examples/prism-fsharp.html | 89 + .../prism-master/examples/prism-gcode.html | 22 + .../prism-master/examples/prism-gedcom.html | 50 + .../prism-master/examples/prism-gherkin.html | 74 + .../prism-master/examples/prism-git.html | 39 + .../prism-master/examples/prism-glsl.html | 65 + .../prism-master/examples/prism-gml.html | 29 + .../prism-master/examples/prism-go.html | 68 + .../prism-master/examples/prism-graphql.html | 31 + .../prism-master/examples/prism-groovy.html | 93 + .../prism-master/examples/prism-haml.html | 79 + .../examples/prism-handlebars.html | 41 + .../prism-master/examples/prism-haskell.html | 80 + .../prism-master/examples/prism-haxe.html | 37 + .../prism-master/examples/prism-hpkp.html | 11 + .../prism-master/examples/prism-hsts.html | 8 + .../prism-master/examples/prism-http.html | 33 + .../examples/prism-ichigojam.html | 29 + .../prism-master/examples/prism-icon.html | 172 ++ .../prism-master/examples/prism-inform7.html | 171 ++ .../prism-master/examples/prism-ini.html | 10 + .../prism-master/examples/prism-io.html | 31 + .../_style/prism-master/examples/prism-j.html | 59 + .../prism-master/examples/prism-java.html | 65 + .../examples/prism-javascript.html | 77 + .../examples/prism-javastacktrace.html | 63 + .../prism-master/examples/prism-jolie.html | 162 ++ .../prism-master/examples/prism-jsx.html | 18 + .../prism-master/examples/prism-julia.html | 29 + .../prism-master/examples/prism-keyman.html | 107 + .../prism-master/examples/prism-kotlin.html | 134 + .../prism-master/examples/prism-latex.html | 12 + .../prism-master/examples/prism-less.html | 70 + .../prism-master/examples/prism-liquid.html | 75 + .../prism-master/examples/prism-lisp.html | 46 + .../examples/prism-livescript.html | 84 + .../prism-master/examples/prism-lolcode.html | 62 + .../prism-master/examples/prism-lua.html | 89 + .../prism-master/examples/prism-makefile.html | 263 ++ .../prism-master/examples/prism-markdown.html | 86 + .../prism-master/examples/prism-markup.html | 77 + .../prism-master/examples/prism-matlab.html | 52 + .../prism-master/examples/prism-mel.html | 137 + .../prism-master/examples/prism-mizar.html | 45 + .../prism-master/examples/prism-monkey.html | 74 + .../prism-master/examples/prism-n4js.html | 114 + .../prism-master/examples/prism-nasm.html | 74 + .../prism-master/examples/prism-nginx.html | 25 + .../prism-master/examples/prism-nim.html | 222 ++ .../prism-master/examples/prism-nix.html | 46 + .../prism-master/examples/prism-nsis.html | 18 + .../examples/prism-objectivec.html | 44 + .../prism-master/examples/prism-ocaml.html | 59 + .../prism-master/examples/prism-opencl.html | 83 + .../prism-master/examples/prism-oz.html | 89 + .../prism-master/examples/prism-parigp.html | 20 + .../prism-master/examples/prism-parser.html | 88 + .../prism-master/examples/prism-pascal.html | 65 + .../prism-master/examples/prism-perl.html | 71 + .../prism-master/examples/prism-php.html | 67 + .../prism-master/examples/prism-plsql.html | 40 + .../examples/prism-powershell.html | 19 + .../examples/prism-processing.html | 173 ++ .../prism-master/examples/prism-prolog.html | 44 + .../examples/prism-properties.html | 9 + .../prism-master/examples/prism-pug.html | 85 + .../prism-master/examples/prism-puppet.html | 152 + .../prism-master/examples/prism-pure.html | 115 + .../prism-master/examples/prism-python.html | 61 + .../_style/prism-master/examples/prism-q.html | 112 + .../prism-master/examples/prism-qore.html | 962 +++++++ .../_style/prism-master/examples/prism-r.html | 38 + .../prism-master/examples/prism-reason.html | 35 + .../prism-master/examples/prism-renpy.html | 123 + .../prism-master/examples/prism-rest.html | 329 +++ .../prism-master/examples/prism-rip.html | 12 + .../prism-master/examples/prism-roboconf.html | 49 + .../prism-master/examples/prism-ruby.html | 30 + .../prism-master/examples/prism-rust.html | 68 + .../prism-master/examples/prism-sas.html | 158 ++ .../prism-master/examples/prism-sass.html | 47 + .../prism-master/examples/prism-scala.html | 100 + .../prism-master/examples/prism-scheme.html | 35 + .../prism-master/examples/prism-scss.html | 31 + .../examples/prism-smalltalk.html | 92 + .../prism-master/examples/prism-smarty.html | 81 + .../prism-master/examples/prism-soy.html | 36 + .../prism-master/examples/prism-sql.html | 34 + .../prism-master/examples/prism-stylus.html | 72 + .../prism-master/examples/prism-swift.html | 80 + .../prism-master/examples/prism-tcl.html | 26 + .../prism-master/examples/prism-textile.html | 178 ++ .../prism-master/examples/prism-tsx.html | 31 + .../prism-master/examples/prism-tt2.html | 61 + .../prism-master/examples/prism-twig.html | 35 + .../examples/prism-typescript.html | 28 + .../prism-master/examples/prism-vala.html | 33 + .../prism-master/examples/prism-vbnet.html | 16 + .../prism-master/examples/prism-velocity.html | 47 + .../prism-master/examples/prism-verilog.html | 103 + .../prism-master/examples/prism-vhdl.html | 92 + .../prism-master/examples/prism-vim.html | 25 + .../examples/prism-visual-basic.html | 36 + .../prism-master/examples/prism-wasm.html | 43 + .../prism-master/examples/prism-wiki.html | 165 ++ .../prism-master/examples/prism-xeora.html | 111 + .../prism-master/examples/prism-xojo.html | 63 + .../prism-master/examples/prism-xquery.html | 47 + .../prism-master/examples/prism-yaml.html | 107 + docs/_style/prism-master/extending.html | 247 ++ docs/_style/prism-master/faq.html | 182 ++ docs/_style/prism-master/favicon.png | Bin 0 -> 209 bytes docs/_style/prism-master/gulpfile.js | 143 + docs/_style/prism-master/img/logo-ala.png | Bin 0 -> 1745 bytes .../prism-master/img/logo-css-tricks.png | Bin 0 -> 1735 bytes docs/_style/prism-master/img/logo-drupal.png | Bin 0 -> 2371 bytes docs/_style/prism-master/img/logo-mdn.png | Bin 0 -> 6677 bytes docs/_style/prism-master/img/logo-react.png | Bin 0 -> 4705 bytes .../prism-master/img/logo-sitepoint.png | Bin 0 -> 2703 bytes .../_style/prism-master/img/logo-smashing.png | Bin 0 -> 14160 bytes docs/_style/prism-master/img/logo-stripe.png | Bin 0 -> 3377 bytes docs/_style/prism-master/img/spectrum.png | Bin 0 -> 359393 bytes docs/_style/prism-master/index.html | 321 +++ docs/_style/prism-master/logo.svg | 22 + docs/_style/prism-master/package.json | 47 + .../plugins/autolinker/index.html | 70 + .../plugins/autolinker/prism-autolinker.css | 3 + .../plugins/autolinker/prism-autolinker.js | 81 + .../autolinker/prism-autolinker.min.js | 1 + .../plugins/autoloader/index.html | 204 ++ .../plugins/autoloader/prism-autoloader.js | 209 ++ .../autoloader/prism-autoloader.min.js | 1 + .../plugins/command-line/index.html | 111 + .../command-line/prism-command-line.css | 33 + .../command-line/prism-command-line.js | 139 + .../command-line/prism-command-line.min.js | 1 + .../plugins/copy-to-clipboard/index.html | 48 + .../prism-copy-to-clipboard.js | 75 + .../prism-copy-to-clipboard.min.js | 1 + .../plugins/custom-class/index.html | 133 + .../custom-class/prism-custom-class.js | 31 + .../custom-class/prism-custom-class.min.js | 1 + .../plugins/data-uri-highlight/index.html | 60 + .../prism-data-uri-highlight.js | 98 + .../prism-data-uri-highlight.min.js | 1 + .../plugins/file-highlight/index.html | 75 + .../file-highlight/prism-file-highlight.js | 105 + .../prism-file-highlight.min.js | 1 + .../plugins/highlight-keywords/index.html | 51 + .../prism-highlight-keywords.js | 17 + .../prism-highlight-keywords.min.js | 1 + docs/_style/prism-master/plugins/index.html | 42 + .../plugins/jsonp-highlight/index.html | 174 ++ .../jsonp-highlight/prism-jsonp-highlight.js | 151 + .../prism-jsonp-highlight.min.js | 1 + .../plugins/keep-markup/index.html | 80 + .../plugins/keep-markup/prism-keep-markup.js | 99 + .../keep-markup/prism-keep-markup.min.js | 1 + .../plugins/line-highlight/index.html | 88 + .../line-highlight/prism-line-highlight.css | 49 + .../line-highlight/prism-line-highlight.js | 181 ++ .../prism-line-highlight.min.js | 1 + .../plugins/line-numbers/index.html | 69 + .../line-numbers/prism-line-numbers.css | 41 + .../line-numbers/prism-line-numbers.js | 159 ++ .../line-numbers/prism-line-numbers.min.js | 1 + .../plugins/normalize-whitespace/demo.html | 33 + .../plugins/normalize-whitespace/index.html | 180 ++ .../prism-normalize-whitespace.js | 190 ++ .../prism-normalize-whitespace.min.js | 1 + .../plugins/previewers/index.html | 233 ++ .../plugins/previewers/prism-previewers.css | 242 ++ .../plugins/previewers/prism-previewers.js | 708 +++++ .../previewers/prism-previewers.min.js | 1 + .../remove-initial-line-feed/index.html | 59 + .../prism-remove-initial-line-feed.js | 21 + .../prism-remove-initial-line-feed.min.js | 1 + .../plugins/show-invisibles/index.html | 46 + .../show-invisibles/prism-show-invisibles.css | 34 + .../show-invisibles/prism-show-invisibles.js | 21 + .../prism-show-invisibles.min.js | 1 + .../plugins/show-language/index.html | 54 + .../show-language/prism-show-language.js | 31 + .../show-language/prism-show-language.min.js | 1 + .../prism-master/plugins/toolbar/index.html | 134 + .../plugins/toolbar/prism-toolbar.css | 58 + .../plugins/toolbar/prism-toolbar.js | 137 + .../plugins/toolbar/prism-toolbar.min.js | 1 + .../plugins/unescaped-markup/index.html | 195 ++ .../prism-unescaped-markup.css | 10 + .../prism-unescaped-markup.js | 44 + .../prism-unescaped-markup.min.js | 1 + .../prism-master/plugins/wpd/index.html | 68 + .../prism-master/plugins/wpd/prism-wpd.css | 11 + .../prism-master/plugins/wpd/prism-wpd.js | 169 ++ .../prism-master/plugins/wpd/prism-wpd.min.js | 1 + docs/_style/prism-master/prefixfree.min.js | 5 + docs/_style/prism-master/prism.js | 917 ++++++ docs/_style/prism-master/style.css | 407 +++ .../_style/prism-master/templates/footer.html | 15 + .../templates/header-download.html | 2 + .../prism-master/templates/header-main.html | 12 + .../templates/header-plugins.html | 8 + docs/_style/prism-master/test-suite.html | 167 ++ docs/_style/prism-master/test.html | 203 ++ .../prism-master/tests/helper/prism-loader.js | 131 + .../prism-master/tests/helper/test-case.js | 196 ++ .../tests/helper/test-discovery.js | 115 + .../tests/helper/token-stream-transformer.js | 32 + .../tests/languages/abap/comment_feature.test | 13 + .../languages/abap/eol-comment_feature.test | 13 + .../tests/languages/abap/keyword_feature.test | 1801 ++++++++++++ .../tests/languages/abap/number_feature.test | 15 + .../languages/abap/operator_feature.test | 38 + .../abap/string-template_feature.test | 17 + .../tests/languages/abap/string_feature.test | 21 + .../actionscript/keyword_feature.test | 71 + .../actionscript/operator_feature.test | 29 + .../languages/ada/attr-name_feature.test | 13 + .../tests/languages/ada/boolean_feature.test | 13 + .../tests/languages/ada/char_feature.test | 13 + .../tests/languages/ada/comment_feature.test | 13 + .../tests/languages/ada/keyword_feature.test | 153 + .../tests/languages/ada/number_feature.test | 21 + .../tests/languages/ada/operator_feature.test | 23 + .../tests/languages/ada/string_feature.test | 13 + .../tests/languages/ada/variable_feature.test | 13 + .../languages/apacheconf/comment_feature.test | 15 + .../apacheconf/directive-block_feature.test | 469 ++++ .../apacheconf/directive-flags_feature.test | 13 + .../apacheconf/directive-inline_feature.test | 1163 ++++++++ .../languages/apacheconf/regex_feature.test | 15 + .../languages/apacheconf/string_feature.test | 24 + .../apacheconf/variable_feature.test | 15 + .../languages/apl/assignment_feature.test | 13 + .../tests/languages/apl/comment_feature.test | 15 + .../tests/languages/apl/constant_feature.test | 19 + .../tests/languages/apl/dfn_feature.test | 23 + .../apl/dyadic-operator_feature.test | 15 + .../tests/languages/apl/function_feature.test | 43 + .../apl/monadic-operator_feature.test | 15 + .../tests/languages/apl/number_feature.test | 27 + .../languages/apl/statement_feature.test | 13 + .../tests/languages/apl/string_feature.test | 15 + .../apl/system-function_feature.test | 17 + .../languages/applescript/class_feature.test | 39 + .../applescript/comment_feature.test | 21 + .../applescript/keyword_feature.test | 59 + .../languages/applescript/number_feature.test | 17 + .../applescript/operator_feature.test | 48 + .../languages/applescript/string_feature.test | 13 + .../tests/languages/arff/comment_feature.test | 15 + .../tests/languages/arff/keyword_feature.test | 17 + .../tests/languages/arff/number_feature.test | 13 + .../tests/languages/arff/string_feature.test | 13 + .../asciidoc/admonition_feature.test | 19 + .../asciidoc/attribute-entry_feature.test | 58 + .../asciidoc/attributes_feature.test | 403 +++ .../languages/asciidoc/callout_feature.test | 34 + .../asciidoc/comment-block_feature.test | 19 + .../languages/asciidoc/comment_feature.test | 41 + .../languages/asciidoc/entity_feature.js | 4 + .../languages/asciidoc/entity_feature.test | 48 + .../tests/languages/asciidoc/hr_feature.test | 14 + .../asciidoc/indented-block_feature.test | 28 + .../languages/asciidoc/inline_feature.test | 521 ++++ .../asciidoc/line-continuation_feature.test | 18 + .../asciidoc/list-label_feature.test | 73 + .../asciidoc/list-punctuation_feature.test | 77 + .../asciidoc/literal-block_feature.test | 46 + .../languages/asciidoc/macro_feature.test | 250 ++ .../asciidoc/other-block_feature.test | 45 + .../asciidoc/page-break_feature.test | 14 + .../asciidoc/passthrough-block_feature.test | 29 + .../asciidoc/replacement_feature.test | 48 + .../languages/asciidoc/table_feature.test | 61 + .../languages/asciidoc/title_feature.test | 80 + .../languages/asm6502/comment_feature.test | 13 + .../languages/asm6502/directive_feature.test | 12 + .../languages/asm6502/number_feature.test | 18 + .../languages/asm6502/opcode_feature.test | 17 + .../languages/asm6502/register_feature.test | 17 + .../languages/asm6502/string_feature.test | 12 + .../languages/aspnet/comment_feature.test | 16 + .../aspnet/page-directive_feature.test | 92 + .../languages/autohotkey/boolean_feature.test | 13 + .../languages/autohotkey/builtin_feature.test | 147 + .../languages/autohotkey/comment_feature.test | 13 + .../autohotkey/constant_feature.test | 275 ++ .../autohotkey/function_feature.test | 15 + .../autohotkey/important_feature.test | 67 + .../languages/autohotkey/keyword_feature.test | 537 ++++ .../languages/autohotkey/number_feature.test | 21 + .../autohotkey/operator_feature.test | 33 + .../autohotkey/selector_feature.test | 381 +++ .../languages/autohotkey/string_feature.test | 15 + .../languages/autohotkey/symbol_feature.test | 347 +++ .../languages/autohotkey/tag_feature.test | 15 + .../autohotkey/variable_feature.test | 13 + .../languages/autoit/boolean_feature.test | 13 + .../languages/autoit/comment_feature.test | 33 + .../languages/autoit/directive_feature.test | 13 + .../languages/autoit/function_feature.test | 15 + .../languages/autoit/keyword_feature.test | 83 + .../languages/autoit/number_feature.test | 21 + .../languages/autoit/operator_feature.test | 23 + .../languages/autoit/string_feature.test | 37 + .../tests/languages/autoit/url_feature.test | 15 + .../languages/autoit/variable_feature.test | 19 + .../bash/arithmetic_environment_feature.test | 53 + .../bash/command_substitution_feature.test | 45 + .../tests/languages/bash/comment_feature.test | 13 + .../languages/bash/function_feature.test | 101 + .../tests/languages/bash/keyword_feature.test | 20 + .../tests/languages/bash/shebang_feature.test | 11 + .../tests/languages/bash/string_feature.test | 67 + .../languages/bash/variable_feature.test | 15 + .../languages/basic/comment_feature.test | 13 + .../languages/basic/function_feature.test | 309 +++ .../languages/basic/keyword_feature.test | 213 ++ .../tests/languages/basic/number_feature.test | 19 + .../languages/basic/operator_feature.test | 21 + .../tests/languages/basic/string_feature.test | 13 + .../languages/batch/command_feature.test | 103 + .../languages/batch/comment_feature.test | 18 + .../tests/languages/batch/label_feature.test | 13 + .../tests/languages/bison/c_feature.test | 56 + .../languages/bison/comment_feature.test | 25 + .../languages/bison/keyword_feature.test | 22 + .../tests/languages/bison/number_feature.test | 15 + .../languages/bison/property_feature.test | 21 + .../tests/languages/bison/string_feature.test | 21 + .../languages/brainfuck/all_feature.test | 19 + .../tests/languages/bro/builtin_feature.test | 29 + .../tests/languages/bro/comment_feature.test | 17 + .../tests/languages/bro/function_feature.test | 21 + .../tests/languages/bro/keyword_feature.test | 87 + .../tests/languages/bro/string_feature.test | 23 + .../tests/languages/bro/variable_feature.test | 25 + .../tests/languages/c+pure/c_inclusion.test | 28 + .../tests/languages/c/constant_feature.test | 37 + .../tests/languages/c/keyword_feature.test | 29 + .../tests/languages/c/macro_feature.test | 45 + .../tests/languages/c/number_feature.test | 35 + .../tests/languages/c/operator_feature.test | 61 + .../tests/languages/cil/asm_reference.test | 11 + .../tests/languages/cil/boolean.test | 14 + .../tests/languages/cil/comment.test | 11 + .../tests/languages/cil/instructions.test | 457 +++ .../tests/languages/cil/keywords.test | 161 ++ .../tests/languages/cil/strings.test | 11 + .../languages/clike/boolean_feature.test | 12 + .../languages/clike/class-name_feature.test | 53 + .../languages/clike/comment_feature.test | 16 + .../languages/clike/function_feature.test | 23 + .../tests/languages/clike/issue1340.test | 13 + .../languages/clike/keyword_feature.test | 30 + .../tests/languages/clike/number_feature.test | 23 + .../languages/clike/operator_feature.test | 21 + .../tests/languages/clike/string_feature.test | 31 + .../languages/clojure/boolean_feature.test | 15 + .../languages/clojure/comment_feature.test | 13 + .../languages/clojure/keyword_feature.test | 175 ++ .../clojure/operator_and_punctuation.test | 20 + .../languages/clojure/string_feature.test | 13 + .../coffeescript_inclusion.test | 24 + .../coffeescript_inclusion.test | 19 + .../coffeescript/block-regex_feature.test | 33 + .../coffeescript/class-member_feature.test | 13 + .../coffeescript/comment_feature.test | 16 + .../inline-javascript_feature.test | 22 + .../coffeescript/keyword_feature.test | 41 + .../coffeescript/property_feature.test | 15 + .../coffeescript/string_feature.test | 64 + .../languages/cpp+pure/cpp_inclusion.test | 18 + .../tests/languages/cpp/boolean_feature.test | 13 + .../languages/cpp/class-name_feature.test | 13 + .../tests/languages/cpp/keyword_feature.test | 49 + .../tests/languages/cpp/operator_feature.test | 73 + .../languages/cpp/raw_string_feature.test | 18 + .../languages/crystal/attribute_feature.test | 21 + .../languages/crystal/expansion_feature.test | 37 + .../languages/crystal/keyword_feature.test | 37 + .../languages/crystal/number_feature.test | 23 + .../csharp+aspnet/directive_feature.test | 70 + .../languages/csharp/class-name_feature.test | 34 + .../languages/csharp/generic_feature.test | 34 + .../tests/languages/csharp/issue1091.test | 12 + .../tests/languages/csharp/issue1365.test | 39 + .../tests/languages/csharp/issue1371.test | 144 + .../tests/languages/csharp/issue806.test | 12 + .../languages/csharp/keyword_feature.test | 209 ++ .../languages/csharp/number_feature.test | 17 + .../languages/csharp/operator_feature.test | 60 + .../csharp/preprocessor_feature.test | 35 + .../languages/csharp/punctuation_feature.test | 27 + .../languages/csharp/string_feature.test | 32 + .../csp/directive_no_value_feature.test | 11 + ...ective_with_source_expression_feature.test | 12 + .../tests/languages/csp/safe_feature.test | 19 + .../tests/languages/csp/unsafe_feature.test | 15 + .../css!+css-extras/entity_feature.test | 13 + .../css!+css-extras/hexcode_feature.test | 17 + .../css!+css-extras/number_feature.test | 17 + .../css!+css-extras/operator_feature.test | 71 + .../css!+css-extras/selector_feature.test | 58 + .../css!+css-extras/unit_feature.test | 21 + .../css!+css-extras/variable_feature.test | 54 + .../languages/css+haml/css+haml_usage.test | 28 + .../languages/css+http/css_inclusion.test | 25 + .../languages/css+textile/css_inclusion.test | 117 + .../tests/languages/css/atrule_feature.test | 47 + .../tests/languages/css/comment_feature.test | 16 + .../tests/languages/css/function_feature.test | 41 + .../languages/css/important_feature.test | 27 + .../tests/languages/css/property_feature.test | 29 + .../tests/languages/css/selector_feature.test | 25 + .../tests/languages/css/string_feature.test | 22 + .../tests/languages/css/url_feature.test | 21 + .../tests/languages/d/comment_feature.test | 27 + .../tests/languages/d/keyword_feature.test | 251 ++ .../tests/languages/d/number_feature.test | 55 + .../tests/languages/d/operator_feature.test | 63 + .../tests/languages/d/property_feature.test | 17 + .../tests/languages/d/register_feature.test | 75 + .../tests/languages/d/string_feature.test | 56 + .../languages/d/token-string_feature.test | 13 + .../tests/languages/dart/keyword_feature.test | 49 + .../languages/dart/metadata_feature.test | 20 + .../languages/dart/operator_feature.test | 33 + .../tests/languages/dart/string_feature.test | 25 + .../tests/languages/diff/coord_feature.test | 21 + .../tests/languages/diff/diff_feature.test | 21 + .../languages/django/comment_feature.test | 16 + .../languages/django/property_feature.test | 64 + .../languages/docker/comment_feature.test | 13 + .../languages/docker/keyword_feature.test | 45 + .../languages/docker/string_feature.test | 23 + .../languages/eiffel/boolean_feature.test | 13 + .../tests/languages/eiffel/char_feature.test | 15 + .../languages/eiffel/class-name_feature.test | 15 + .../languages/eiffel/comment_feature.test | 15 + .../languages/eiffel/keyword_feature.test | 39 + .../languages/eiffel/number_feature.test | 29 + .../languages/eiffel/operator_feature.test | 19 + .../languages/eiffel/string_feature.test | 34 + .../tests/languages/elixir/atom_feature.test | 15 + .../languages/elixir/attr-name_feature.test | 24 + .../languages/elixir/attribute_feature.test | 19 + .../languages/elixir/boolean_feature.test | 15 + .../languages/elixir/capture_feature.test | 28 + .../languages/elixir/comment_feature.test | 15 + .../tests/languages/elixir/issue1392.test | 16 + .../tests/languages/elixir/issue775.test | 17 + .../languages/elixir/keyword_feature.test | 31 + .../languages/elixir/number_feature.test | 27 + .../languages/elixir/operator_feature.test | 41 + .../tests/languages/elixir/regex_feature.test | 29 + .../languages/elixir/string_feature.test | 115 + .../tests/languages/elm/builtin_feature.test | 25 + .../tests/languages/elm/char_feature.test | 19 + .../tests/languages/elm/comment_feature.test | 14 + .../tests/languages/elm/constant_feature.test | 15 + .../languages/elm/hvariable_feature.test | 15 + .../elm/import_statement_feature.test | 48 + .../tests/languages/elm/keyword_feature.test | 19 + .../tests/languages/elm/number_feature.test | 21 + .../tests/languages/elm/operator_feature.test | 33 + .../tests/languages/elm/string_feature.test | 21 + .../tests/languages/erb/erb_feature.test | 36 + .../languages/erb/erb_in_markup_feature.test | 48 + .../tests/languages/erlang/atom_feature.test | 17 + .../languages/erlang/boolean_feature.test | 13 + .../languages/erlang/comment_feature.test | 11 + .../languages/erlang/function_feature.test | 17 + .../languages/erlang/keyword_feature.test | 15 + .../languages/erlang/number_feature.test | 25 + .../languages/erlang/operator_feature.test | 27 + .../languages/erlang/string_feature.test | 13 + .../languages/erlang/variable_feature.test | 17 + .../flow/flow-punctuation_feature.test | 12 + .../flow/function-variable_feature.test | 20 + .../tests/languages/flow/keyword_feature.test | 39 + .../tests/languages/flow/type_feature.test | 31 + .../fortran+pure/fortran_inclusion.test | 18 + .../languages/fortran/boolean_feature.test | 13 + .../languages/fortran/comment_feature.test | 15 + .../languages/fortran/keyword_feature.test | 199 ++ .../languages/fortran/number_feature.test | 37 + .../languages/fortran/operator_feature.test | 25 + .../languages/fortran/string_feature.test | 31 + .../languages/fsharp/annotation_feature.test | 35 + .../languages/fsharp/class-name_feature.test | 86 + .../languages/fsharp/comment_feature.test | 16 + .../computation-expression_feature.test | 17 + .../tests/languages/fsharp/issue1480.test | 36 + .../languages/fsharp/keyword_feature.test | 73 + .../languages/fsharp/number_feature.test | 65 + .../languages/fsharp/operator_feature.test | 53 + .../fsharp/preprocessor_feature.test | 22 + .../languages/fsharp/string_feature.test | 47 + .../languages/gcode/checksum_feature.test | 12 + .../languages/gcode/comment_feature.test | 20 + .../languages/gcode/keyword_feature.test | 23 + .../languages/gcode/property_feature.test | 17 + .../tests/languages/gcode/string_feature.test | 17 + .../tests/languages/gedcom/level_feature.test | 20 + .../languages/gedcom/line-value_feature.test | 29 + .../languages/gedcom/pointer_feature.test | 23 + .../tests/languages/gedcom/tag_feature.test | 25 + .../languages/gherkin/atrule_feature.test | 1211 ++++++++ .../languages/gherkin/comment_feature.test | 15 + .../languages/gherkin/feature_feature.test | 196 ++ .../languages/gherkin/outline_feature.test | 11 + .../languages/gherkin/pystring_feature.test | 20 + .../languages/gherkin/scenario_feature.test | 581 ++++ .../languages/gherkin/string_feature.test | 29 + .../languages/gherkin/table_feature.test | 40 + .../tests/languages/gherkin/tag_feature.test | 17 + .../tests/languages/git/command_feature.test | 15 + .../tests/languages/git/comment_feature.test | 17 + .../languages/git/commit_sha1_feature.test | 15 + .../tests/languages/git/coord_feature.test | 13 + .../tests/languages/git/diff_feature.test | 31 + .../tests/languages/git/string_feature.test | 17 + .../tests/languages/glsl/comment_feature.test | 21 + .../tests/languages/glsl/keyword_feature.test | 263 ++ .../tests/languages/glsl/number_feature.test | 31 + .../languages/glsl/preprocessor_feature.test | 35 + .../tests/languages/go/boolean_feature.test | 19 + .../tests/languages/go/builtin_feature.test | 79 + .../tests/languages/go/keyword_feature.test | 59 + .../tests/languages/go/number_feature.test | 43 + .../tests/languages/go/operator_feature.test | 27 + .../tests/languages/go/string_feature.test | 37 + .../languages/graphql/attr-name_feature.test | 27 + .../languages/graphql/boolean_feature.test | 13 + .../languages/graphql/comment_feature.test | 13 + .../languages/graphql/directive_feature.test | 13 + .../languages/graphql/keyword_feature.test | 24 + .../languages/graphql/number_feature.test | 23 + .../languages/graphql/string_feature.test | 15 + .../languages/graphql/variable_feature.test | 13 + .../languages/groovy/annotation_feature.test | 17 + .../tests/languages/groovy/issue1049.js | 8 + .../languages/groovy/keyword_feature.test | 61 + .../languages/groovy/number_feature.test | 43 + .../languages/groovy/operator_feature.test | 45 + .../languages/groovy/shebang_feature.test | 13 + .../languages/groovy/spock-block_feature.test | 25 + .../groovy/string-interpolation_feature.js | 28 + .../languages/groovy/string_feature.test | 60 + .../tests/languages/haml/code_feature.test | 19 + .../tests/languages/haml/doctype_feature.test | 15 + .../languages/haml/interpolation_feature.test | 21 + .../haml/multiline-code_feature.test | 58 + .../haml/multiline-comment_feature.test | 46 + .../tests/languages/haml/tag_feature.test | 161 ++ .../handlebars+pug/handlebars_inclusion.test | 15 + .../languages/handlebars/block_feature.test | 23 + .../languages/handlebars/boolean_feature.test | 17 + .../languages/handlebars/comment_feature.test | 19 + .../handlebars_in_markup_feature.test | 59 + .../languages/handlebars/number_feature.test | 29 + .../languages/handlebars/string_feature.test | 25 + .../languages/haskell/builtin_feature.test | 137 + .../tests/languages/haskell/char_feature.test | 17 + .../languages/haskell/comment_feature.test | 14 + .../languages/haskell/constant_feature.test | 15 + .../languages/haskell/hvariable_feature.test | 15 + .../haskell/import_statement_feature.test | 35 + .../languages/haskell/keyword_feature.test | 19 + .../languages/haskell/number_feature.test | 23 + .../languages/haskell/operator_feature.test | 37 + .../languages/haskell/string_feature.test | 19 + .../tests/languages/haxe/keyword_feature.test | 93 + .../languages/haxe/metadata_feature.test | 15 + .../languages/haxe/operator_feature.test | 29 + .../languages/haxe/preprocessor_feature.test | 17 + .../tests/languages/haxe/regex_feature.test | 15 + .../languages/haxe/reification_feature.test | 16 + .../tests/languages/haxe/string_feature.test | 37 + .../languages/hpkp/safe_maxage_feature.test | 12 + .../languages/hpkp/sha256_pin_feature.test | 11 + .../languages/hpkp/unsafe_maxage_feature.test | 12 + .../hsts/include_subdomains_feature.test | 11 + .../tests/languages/hsts/preload_feature.test | 11 + .../languages/hsts/safe_maxage_feature.test | 12 + .../languages/hsts/unsafe_maxage_feature.test | 12 + .../languages/http/header-name_feature.test | 24 + .../languages/http/request-line_feature.test | 56 + .../http/response-status_feature.test | 29 + .../languages/ichigojam/comment_feature.test | 17 + .../languages/ichigojam/function_feature.test | 59 + .../languages/ichigojam/keyword_feature.test | 119 + .../languages/ichigojam/label_feature.test | 13 + .../languages/ichigojam/number_feature.test | 23 + .../languages/ichigojam/operator_feature.test | 36 + .../languages/ichigojam/string_feature.test | 13 + .../icon/builtin-keyword_feature.test | 91 + .../tests/languages/icon/comment_feature.test | 13 + .../languages/icon/directive_feature.test | 21 + .../languages/icon/function_feature.test | 15 + .../tests/languages/icon/keyword_feature.test | 67 + .../tests/languages/icon/number_feature.test | 33 + .../languages/icon/operator_feature.test | 69 + .../tests/languages/icon/string_feature.test | 22 + .../languages/inform7/comment_feature.test | 15 + .../languages/inform7/keyword_feature.test | 85 + .../languages/inform7/number_feature.test | 25 + .../languages/inform7/position_feature.test | 73 + .../languages/inform7/property_feature.test | 157 ++ .../languages/inform7/string_feature.test | 49 + .../languages/inform7/title_feature.test | 21 + .../languages/inform7/variable_feature.test | 141 + .../tests/languages/inform7/verb_feature.test | 213 ++ .../tests/languages/ini/comment_feature.test | 13 + .../languages/ini/key_value_feature.test | 21 + .../tests/languages/ini/selector_feature.test | 13 + .../tests/languages/io/comment_feature.test | 19 + .../tests/languages/io/number_feature.test | 23 + .../tests/languages/io/operator_feature.test | 26 + .../tests/languages/io/string_feature.test | 18 + .../tests/languages/j/adverb_feature.test | 19 + .../tests/languages/j/comment_feature.test | 13 + .../languages/j/conjunction_feature.test | 41 + .../tests/languages/j/keyword_feature.test | 77 + .../tests/languages/j/number_feature.test | 41 + .../tests/languages/j/string_feature.test | 13 + .../tests/languages/j/verb_feature.test | 93 + .../languages/java/function_featrue.test | 32 + .../languages/java/generics_feature.test | 67 + .../tests/languages/java/issue1351.test | 27 + .../tests/languages/java/keyword_feature.test | 59 + .../tests/languages/java/module_feature.test | 158 ++ .../tests/languages/java/number_feature.test | 60 + .../languages/java/operator_feature.test | 37 + .../tests/languages/java/package_feature.test | 80 + .../javascript+haml/javascript_inclusion.test | 24 + .../javascript+http/javascript_inclusion.test | 21 + .../languages/javascript/boolean_feature.test | 13 + .../javascript/class-method_feature.test | 59 + .../javascript/constant_feature.test | 21 + .../javascript/function-variable_feature.test | 104 + .../javascript/function_feature.test | 29 + .../tests/languages/javascript/issue1337.test | 11 + .../tests/languages/javascript/issue1340.test | 15 + .../tests/languages/javascript/issue1397.test | 21 + .../tests/languages/javascript/issue1526.test | 35 + .../languages/javascript/keyword_feature.test | 73 + .../languages/javascript/number_feature.test | 36 + .../javascript/operator_feature.test | 33 + .../languages/javascript/regex_feature.test | 29 + .../javascript/supposed-classes_feature.test | 30 + .../javascript/supposed-function_feature.test | 38 + .../javascript/template-string_feature.test | 49 + .../javascript/try-catch_feature.test | 22 + .../javastacktrace/more_feature.test | 22 + .../javastacktrace/stack-frame_feature.test | 71 + .../javastacktrace/summary_feature.test | 155 ++ .../languages/jolie/deployment_features.test | 43 + .../languages/jolie/keyword_feature.test | 129 + .../tests/languages/jolie/number_feature.test | 19 + .../languages/jolie/operator_feature.test | 42 + .../json+http/json-suffix_inclusion.test | 21 + .../languages/json+http/json_inclusion.test | 21 + .../tests/languages/json/boolean_feature.test | 13 + .../tests/languages/json/comment_feature.test | 27 + .../tests/languages/json/null_feature.test | 11 + .../tests/languages/json/number_feature.test | 27 + .../languages/json/operator_feature.test | 11 + .../languages/json/property_feature.test | 33 + .../languages/json/punctuation_feature.test | 20 + .../tests/languages/json/string_feature.test | 27 + .../tests/languages/jsx/issue1103.test | 29 + .../tests/languages/jsx/issue1235.test | 29 + .../tests/languages/jsx/issue1236.test | 26 + .../tests/languages/jsx/issue1294.test | 71 + .../tests/languages/jsx/issue1335.test | 126 + .../tests/languages/jsx/issue1342.test | 53 + .../tests/languages/jsx/issue1356.test | 32 + .../tests/languages/jsx/issue1364.test | 25 + .../tests/languages/jsx/issue1408.test | 36 + .../tests/languages/jsx/issue1421.test | 58 + .../languages/jsx/plain-text_feature.test | 57 + .../tests/languages/jsx/tag_feature.test | 83 + .../languages/julia/boolean_feature.test | 13 + .../languages/julia/comment_feature.test | 13 + .../languages/julia/keyword_feature.test | 31 + .../tests/languages/julia/number_feature.test | 33 + .../languages/julia/operator_feature.test | 41 + .../tests/languages/julia/string_feature.test | 29 + .../languages/keyman/atrule_feature.test | 15 + .../tests/languages/keyman/bold_feature.test | 59 + .../languages/keyman/comment_feature.test | 13 + .../languages/keyman/function_feature.test | 39 + .../languages/keyman/keyword_feature.test | 21 + .../languages/keyman/number_feature.test | 21 + .../languages/keyman/operator_feature.test | 15 + .../languages/keyman/string_feature.test | 17 + .../tests/languages/keyman/tag_feature.test | 19 + .../languages/kotlin/annotation_feature.test | 21 + .../languages/kotlin/function_feature.test | 16 + .../kotlin/interpolation_feature.test | 46 + .../languages/kotlin/keyword_feature.test | 137 + .../tests/languages/kotlin/label_feature.test | 15 + .../languages/kotlin/number_feature.test | 39 + .../languages/kotlin/operator_feature.test | 31 + .../languages/kotlin/raw-string_feature.test | 18 + .../tests/languages/latex/cdata_feature.test | 28 + .../languages/latex/comment_feature.test | 13 + .../languages/latex/equation_feature.test | 121 + .../languages/latex/headline_feature.test | 39 + .../languages/latex/keyword_feature.test | 32 + .../tests/languages/latex/url_feature.test | 12 + .../languages/less+haml/less_inclusion.test | 32 + .../languages/less+pug/less_inclusion.test | 20 + .../tests/languages/less/atrule_feature.test | 25 + .../tests/languages/less/comment_feature.test | 18 + .../languages/less/operator_feature.test | 14 + .../languages/less/property_feature.test | 19 + .../languages/less/selector_feature.test | 24 + .../languages/liquid/function_feature.test | 39 + .../languages/liquid/keyword_feature.test | 29 + .../languages/liquid/number_feature.test | 27 + .../languages/liquid/operator_feature.test | 33 + .../tests/languages/lisp/boolean_feature.test | 17 + .../tests/languages/lisp/car_feature.test | 13 + .../tests/languages/lisp/comment_feature.test | 11 + .../tests/languages/lisp/declare_feature.test | 16 + .../tests/languages/lisp/defun_feature.test | 27 + .../tests/languages/lisp/defvar_feature.test | 25 + .../tests/languages/lisp/heading_feature.test | 11 + .../languages/lisp/interactive_feature.test | 16 + .../tests/languages/lisp/keyword_feature.test | 73 + .../tests/languages/lisp/lambda-feature.test | 13 + .../languages/lisp/lisp-property_feature.test | 15 + .../tests/languages/lisp/number_boolean.test | 27 + .../languages/lisp/punctuation_feature.test | 16 + .../languages/lisp/quoted-symbol_feature.test | 17 + .../tests/languages/lisp/splice_feature.test | 17 + .../tests/languages/lisp/string_feature.test | 27 + .../livescript/argument_feature.test | 17 + .../languages/livescript/boolean_feature.test | 21 + .../languages/livescript/comment_feature.test | 18 + .../livescript/identifier_feature.test | 25 + .../livescript/interpolated-string.test | 57 + .../livescript/keyword-operator_feature.test | 57 + .../languages/livescript/keyword_feature.test | 87 + .../languages/livescript/number_feature.test | 21 + .../livescript/operator_feature.test | 55 + .../languages/livescript/regex_feature.test | 27 + .../languages/livescript/string_feature.test | 32 + .../languages/lolcode/boolean_feature.test | 13 + .../languages/lolcode/comment_feature.test | 14 + .../languages/lolcode/function_feature.test | 18 + .../languages/lolcode/keyword_feature.test | 93 + .../languages/lolcode/label_feature.test | 15 + .../languages/lolcode/number_feature.test | 13 + .../languages/lolcode/operator_feature.test | 39 + .../languages/lolcode/string_feature.test | 36 + .../languages/lolcode/symbol_feature.test | 27 + .../languages/lolcode/variable_feature.test | 11 + .../tests/languages/lua/comment_feature.test | 22 + .../tests/languages/lua/function_feature.test | 17 + .../tests/languages/lua/keyword_feature.test | 53 + .../tests/languages/lua/number_feature.test | 35 + .../tests/languages/lua/operator_feature.test | 25 + .../tests/languages/lua/string_feature.test | 36 + .../languages/makefile/builtin_feature.test | 15 + .../languages/makefile/comment_feature.test | 16 + .../languages/makefile/keyword_feature.test | 73 + .../languages/makefile/operator_feature.test | 15 + .../languages/makefile/string_feature.test | 23 + .../languages/makefile/symbol_feature.test | 18 + .../languages/makefile/variable_feature.test | 19 + .../markdown+haml/markdown_inclusion.test | 32 + .../markdown+pug/markdown_inclusion.test | 18 + .../markdown/blockquote_feature.test | 15 + .../languages/markdown/bold_feature.test | 82 + .../languages/markdown/code_feature.test | 33 + .../tests/languages/markdown/hr_feature.test | 17 + .../languages/markdown/italic_feature.test | 46 + .../languages/markdown/list_feature.test | 22 + .../languages/markdown/strike_feature.test | 70 + .../languages/markdown/title_feature.test | 42 + .../markdown/url-reference_feature.test | 56 + .../tests/languages/markdown/url_feature.test | 25 + .../markup!+css+javascript/issue1240.test | 38 + .../languages/markup!+css/css_inclusion.test | 71 + .../javascript_inclusion.test | 60 + .../markup+actionscript/xml_feature.test | 64 + .../markup+css+wiki/table-tag_feature.test | 147 + .../languages/markup+haml/markup_feature.test | 11 + .../languages/markup+http/html_inclusion.test | 30 + .../markup+http/xml-suffix_inclusion.test | 30 + .../languages/markup+http/xml_inclusion.test | 30 + .../script_feature.test | 57 + .../markup+php/php_in_markup_feature.test | 129 + .../languages/markup+pug/markup_feature.test | 29 + .../markup+tt2/tt2_in_markup_feature.test | 89 + .../tests/languages/markup/cdata_feature.test | 15 + .../languages/markup/comment_feature.test | 16 + .../languages/markup/doctype_feature.test | 16 + .../tests/languages/markup/entity_feature.js | 4 + .../languages/markup/entity_feature.test | 14 + .../tests/languages/markup/issue585.test | 63 + .../tests/languages/markup/issue888.test | 18 + .../languages/markup/prolog_feature.test | 16 + .../markup/tag_attribute_feature.test | 110 + .../tests/languages/markup/tag_feature.test | 81 + .../languages/matlab/comment_feature.test | 20 + .../languages/matlab/function_feature.test | 13 + .../languages/matlab/keyword_feature.test | 21 + .../languages/matlab/number_feature.test | 27 + .../languages/matlab/operator_feature.test | 29 + .../languages/matlab/string_feature.test | 15 + .../tests/languages/mel/code_feature.test | 16 + .../tests/languages/mel/comment_feature.test | 13 + .../tests/languages/mel/flag_feature.test | 15 + .../tests/languages/mel/function_feature.test | 2453 +++++++++++++++++ .../tests/languages/mel/keyword_feature.test | 47 + .../tests/languages/mel/number_feature.test | 15 + .../tests/languages/mel/operator_feature.test | 33 + .../tests/languages/mel/string_feature.test | 13 + .../tests/languages/mel/variable_feature.test | 15 + .../languages/mizar/comment_feature.test | 11 + .../languages/mizar/keyword_feature.test | 245 ++ .../tests/languages/mizar/number_feature.test | 15 + .../languages/mizar/operator_feature.test | 17 + .../languages/mizar/parameter_feature.test | 17 + .../languages/mizar/variable_feature.test | 17 + .../languages/monkey/comment_feature.test | 21 + .../languages/monkey/function_feature.test | 13 + .../languages/monkey/keyword_feature.test | 125 + .../languages/monkey/number_feature.test | 19 + .../languages/monkey/operator_feature.test | 41 + .../monkey/preprocessor_feature.test | 15 + .../languages/monkey/string_feature.test | 13 + .../languages/monkey/type-char_feature.test | 17 + .../languages/n4js/annotation_feature.test | 53 + .../tests/languages/n4js/keyword_feature.test | 121 + .../tests/languages/nasm/comment_feature.test | 13 + .../tests/languages/nasm/keyword_feature.test | 30 + .../tests/languages/nasm/label_feature.test | 15 + .../tests/languages/nasm/number_feature.test | 97 + .../languages/nasm/operator_feature.test | 17 + .../languages/nasm/register_feature.test | 43 + .../tests/languages/nasm/string_feature.test | 21 + .../languages/nginx/comment_feature.test | 13 + .../languages/nginx/keyword_feature.test | 719 +++++ .../languages/nginx/variable_feature.test | 13 + .../tests/languages/nim/comment_feature.test | 13 + .../tests/languages/nim/function_feature.test | 17 + .../tests/languages/nim/keyword_feature.test | 123 + .../tests/languages/nim/number_feature.test | 31 + .../tests/languages/nim/operator_feature.test | 39 + .../tests/languages/nim/string_feature.test | 38 + .../languages/nix/antiquotation_feature.test | 14 + .../tests/languages/nix/boolean_feature.test | 13 + .../tests/languages/nix/comment_feature.test | 18 + .../tests/languages/nix/function_feature.test | 133 + .../tests/languages/nix/keyword_feature.test | 15 + .../tests/languages/nix/number_feature.test | 15 + .../tests/languages/nix/operator_feature.test | 25 + .../tests/languages/nix/string_feature.test | 56 + .../tests/languages/nix/url_feature.test | 21 + .../tests/languages/nsis/comment_feature.test | 18 + .../languages/nsis/constant_feature.test | 23 + .../languages/nsis/important_feature.test | 75 + .../tests/languages/nsis/keyword_feature.test | 455 +++ .../tests/languages/nsis/number_feature.test | 19 + .../languages/nsis/operator_feature.test | 21 + .../languages/nsis/property_feature.test | 115 + .../tests/languages/nsis/string_feature.test | 17 + .../languages/nsis/variable_feature.test | 13 + .../languages/objectivec/keyword_feature.test | 59 + .../objectivec/operator_feature.test | 25 + .../languages/objectivec/string_feature.test | 34 + .../languages/ocaml/boolean_feature.test | 13 + .../languages/ocaml/comment_feature.test | 14 + .../languages/ocaml/directive_feature.test | 15 + .../languages/ocaml/keyword_feature.test | 101 + .../tests/languages/ocaml/number_feature.test | 25 + .../languages/ocaml/operator_feature.test | 31 + .../tests/languages/ocaml/string_feature.test | 25 + .../tests/languages/ocaml/type_feature.test | 17 + .../languages/opencl+c/boolean_feature.test | 13 + .../languages/opencl+c/constant_feature.test | 859 ++++++ .../languages/opencl+c/function_feature.test | 227 ++ .../languages/opencl+c/type_feature.test | 219 ++ .../languages/opencl+cpp/type_feature.test | 83 + .../languages/opencl/constant_feature.test | 185 ++ .../languages/opencl/function_feature.test | 601 ++++ .../languages/opencl/keyword_feature.test | 419 +++ .../tests/languages/oz/atom_feature.test | 16 + .../tests/languages/oz/attr-name_feature.test | 14 + .../tests/languages/oz/comment_feature.test | 18 + .../tests/languages/oz/function_feature.test | 13 + .../tests/languages/oz/keyword_feature.test | 103 + .../tests/languages/oz/number_feature.test | 35 + .../tests/languages/oz/operator_feature.test | 35 + .../tests/languages/oz/string_feature.test | 16 + .../tests/languages/oz/variable_feature.test | 15 + .../languages/parigp/comment_feature.test | 18 + .../languages/parigp/function_feature.test | 13 + .../languages/parigp/keyword_feature.test | 103 + .../languages/parigp/number_feature.test | 39 + .../languages/parigp/operator_feature.test | 155 ++ .../languages/parigp/string_feature.test | 13 + .../languages/parser/boolean_feature.test | 21 + .../languages/parser/escape_feature.test | 68 + .../languages/parser/expression_feature.test | 58 + .../languages/parser/function_feature.test | 48 + .../languages/parser/keyword_feature.test | 70 + .../languages/parser/number_feature.test | 51 + .../languages/parser/operator_feature.test | 257 ++ .../parser/parser-comment_feature.test | 17 + .../languages/parser/string_feature.test | 47 + .../languages/parser/variable_feature.test | 55 + .../languages/pascal/comment_feature.test | 23 + .../languages/pascal/keyword_feature.test | 143 + .../languages/pascal/number_feature.test | 25 + .../languages/pascal/operator_feature.test | 31 + .../languages/pascal/string_feature.test | 21 + .../tests/languages/perl/comment_feature.test | 17 + .../languages/perl/filehandle_feature.test | 17 + .../languages/perl/function_feature.test | 13 + .../tests/languages/perl/keyword_feature.test | 29 + .../tests/languages/perl/number_feature.test | 33 + .../languages/perl/operator_feature.test | 71 + .../tests/languages/perl/regex_feature.test | 129 + .../tests/languages/perl/string_feature.test | 130 + .../languages/perl/variable_feature.test | 47 + .../tests/languages/perl/vstring_feature.test | 13 + .../php!+php-extras/global_feature.test | 37 + .../php!+php-extras/scope_feature.test | 27 + .../php!+php-extras/this_feature.test | 11 + .../tests/languages/php/comment_feature.test | 20 + .../tests/languages/php/constant_feature.test | 15 + .../languages/php/delimiter_feature.test | 24 + .../tests/languages/php/keyword_feature.test | 76 + .../tests/languages/php/package_feature.test | 29 + .../tests/languages/php/property_feature.test | 19 + .../languages/php/shell-comment_feature.test | 13 + .../php/string-interpolation_feature.test | 140 + .../tests/languages/php/string_feature.test | 56 + .../tests/languages/php/variable_feature.test | 19 + .../languages/plsql/comment_feature.test | 18 + .../languages/plsql/keyword_feature.test | 415 +++ .../languages/plsql/operator_feature.test | 11 + .../languages/powershell/boolean_feature.test | 18 + .../languages/powershell/comment_feature.test | 21 + .../powershell/function_feature.test | 398 +++ .../tests/languages/powershell/issue1407.test | 43 + .../languages/powershell/keyword_feature.test | 46 + .../powershell/namespace_feature.test | 18 + .../powershell/operator_feature.test | 55 + .../languages/powershell/string_feature.test | 78 + .../powershell/variable_feature.test | 15 + .../processing/constant_feature.test | 13 + .../processing/function_feature.test | 13 + .../languages/processing/keyword_feature.test | 59 + .../processing/operator_feature.test | 31 + .../languages/processing/type_feature.test | 31 + .../languages/prolog/builtin_feature.test | 17 + .../languages/prolog/comment_feature.test | 16 + .../languages/prolog/function_feature.test | 17 + .../languages/prolog/number_feature.test | 15 + .../languages/prolog/operator_feature.test | 29 + .../languages/prolog/string_feature.test | 27 + .../languages/prolog/variable_feature.test | 15 + .../languages/properties/comment_feature.test | 17 + .../properties/key_value_feature.test | 36 + .../languages/protobuf/keyword_feature.test | 40 + .../languages/protobuf/string_feature.test | 23 + .../tests/languages/pug/code_feature.test | 36 + .../tests/languages/pug/comment_feature.test | 22 + .../tests/languages/pug/doctype_feature.test | 15 + .../languages/pug/flow-control_feature.test | 75 + .../tests/languages/pug/keyword_feature.test | 27 + .../tests/languages/pug/mixin_feature.test | 35 + .../pug/multiline-plain-text_feature.test | 30 + .../pug/multiline-script_feature.test | 58 + .../languages/pug/plain-text_feature.test | 19 + .../tests/languages/pug/script_feature.test | 38 + .../tests/languages/pug/tag_feature.test | 97 + .../languages/puppet/attr-name_feature.test | 19 + .../languages/puppet/boolean_feature.test | 13 + .../languages/puppet/comment_feature.test | 22 + .../languages/puppet/datatype_feature.test | 63 + .../languages/puppet/function_feature.test | 37 + .../languages/puppet/heredoc_feature.test | 51 + .../puppet/interpolation_feature.test | 54 + .../languages/puppet/keyword_feature.test | 47 + .../languages/puppet/number_feature.test | 25 + .../languages/puppet/operator_feature.test | 29 + .../tests/languages/puppet/regex_feature.test | 32 + .../languages/puppet/string_feature.test | 36 + .../languages/puppet/variable_feature.test | 15 + .../tests/languages/pure/comment_feature.test | 20 + .../languages/pure/function_feature.test | 619 +++++ .../tests/languages/pure/keyword_feature.test | 113 + .../tests/languages/pure/number_feature.test | 31 + .../languages/pure/operator_feature.test | 29 + .../tests/languages/pure/special_feature.test | 15 + .../tests/languages/pure/string_feature.test | 13 + .../languages/python/boolean_feature.test | 15 + .../languages/python/builtin_feature.test | 56 + .../languages/python/class-name_feature.test | 15 + .../languages/python/comment_feature.test | 13 + .../languages/python/decorator_feature.test | 28 + .../languages/python/function_feature.test | 17 + .../tests/languages/python/issue1355.test | 24 + .../languages/python/keyword_feature.test | 31 + .../languages/python/number_feature.test | 27 + .../languages/python/operator_feature.test | 29 + .../python/string-interpolation_feature.test | 147 + .../languages/python/string_feature.test | 29 + .../python/triple-quoted-string_feature.test | 21 + .../tests/languages/q/adverb_feature.test | 17 + .../tests/languages/q/comment_feature.test | 24 + .../tests/languages/q/datetime_feature.test | 39 + .../tests/languages/q/keyword_feature.test | 371 +++ .../tests/languages/q/number_feature.test | 33 + .../tests/languages/q/string_feature.test | 13 + .../tests/languages/q/symbol_feature.test | 17 + .../tests/languages/q/verb_feature.test | 35 + .../tests/languages/qore/boolean_feature.test | 13 + .../tests/languages/qore/comment_feature.test | 22 + .../languages/qore/function_feature.test | 15 + .../tests/languages/qore/keyword_feature.test | 63 + .../tests/languages/qore/number_feature.test | 21 + .../languages/qore/operator_feature.test | 37 + .../tests/languages/qore/string_feature.test | 19 + .../languages/qore/variable_feature.test | 15 + .../tests/languages/r/boolean_feature.test | 13 + .../tests/languages/r/comment_feature.test | 13 + .../tests/languages/r/ellipsis_feature.test | 15 + .../tests/languages/r/keyword_feature.test | 25 + .../tests/languages/r/number_feature.test | 39 + .../tests/languages/r/operator_feature.test | 29 + .../languages/r/percent-operator_feature.test | 15 + .../tests/languages/r/string_feature.test | 17 + .../languages/reason/character_feature.test | 19 + .../languages/reason/class-name_feature.test | 15 + .../languages/reason/comment_feature.test | 20 + .../languages/reason/constructor_feature.test | 15 + .../languages/reason/keyword_feature.test | 103 + .../tests/languages/reason/label_feature.test | 13 + .../languages/reason/operator_feature.test | 31 + .../languages/reason/string_feature.test | 13 + .../rest/command-line-option_feature.test | 37 + .../tests/languages/rest/comment_feature.test | 24 + .../languages/rest/directive_feature.test | 33 + .../languages/rest/doctest-block_feature.test | 22 + .../tests/languages/rest/field_feature.test | 19 + .../tests/languages/rest/hr_feature.test | 112 + .../tests/languages/rest/inline_feature.test | 55 + .../languages/rest/link-target_feature.test | 90 + .../tests/languages/rest/link_feature.test | 33 + .../languages/rest/list-bullet_feature.test | 45 + .../languages/rest/literal-block_feature.test | 27 + .../rest/quoted-literal-block_feature.test | 333 +++ .../rest/substitution-def_feature.test | 69 + .../tests/languages/rest/table_feature.test | 64 + .../tests/languages/rest/title_feature.test | 585 ++++ .../tests/languages/rip/boolean_feature.test | 13 + .../tests/languages/rip/builtin_feature.test | 13 + .../languages/rip/character_feature.test | 14 + .../tests/languages/rip/comment_feature.test | 13 + .../languages/rip/date_time_feature.test | 23 + .../tests/languages/rip/keyword_feature.test | 21 + .../tests/languages/rip/number_feature.test | 21 + .../languages/rip/reference_feature.test | 13 + .../tests/languages/rip/regex_feature.test | 17 + .../tests/languages/rip/string_feature.test | 17 + .../tests/languages/rip/symbol_feature.test | 15 + .../languages/roboconf/comment_feature.test | 13 + .../languages/roboconf/component_feature.test | 13 + .../languages/roboconf/keyword_feature.test | 19 + .../languages/roboconf/optional_feature.test | 11 + .../languages/roboconf/property_feature.test | 17 + .../languages/roboconf/value_feature.test | 20 + .../languages/roboconf/wildcard_feature.test | 12 + .../tests/languages/ruby/builtin_feature.test | 29 + .../tests/languages/ruby/comment_feature.test | 22 + .../languages/ruby/constant_feature.test | 21 + .../tests/languages/ruby/issue1336.test | 15 + .../tests/languages/ruby/keyword_feature.test | 103 + .../ruby/method_definition_feature.test | 82 + .../tests/languages/ruby/regex_feature.test | 45 + .../tests/languages/ruby/string_feature.test | 287 ++ .../tests/languages/ruby/symbol_feature.test | 17 + .../languages/ruby/variable_feature.test | 27 + .../languages/rust/attribute_feature.test | 13 + .../tests/languages/rust/char_feature.test | 13 + .../rust/closure-params_feature.test | 30 + .../tests/languages/rust/comment_feature.test | 18 + .../languages/rust/function_feature.test | 23 + .../tests/languages/rust/issue1339.test | 49 + .../tests/languages/rust/issue1353.test | 16 + .../tests/languages/rust/keyword_feature.test | 39 + .../rust/lifetime-annotation_feature.test | 15 + .../languages/rust/macro-rules_feature.test | 15 + .../tests/languages/rust/number_feature.test | 47 + .../languages/rust/operator_feature.test | 35 + .../tests/languages/rust/string_feature.test | 35 + .../tests/languages/sas/comment_feature.test | 17 + .../languages/sas/datalines_feature.test | 38 + .../tests/languages/sas/datetime_feature.test | 15 + .../tests/languages/sas/keyword_feature.test | 13 + .../tests/languages/sas/number_feature.test | 21 + .../tests/languages/sas/operator_feature.test | 37 + .../tests/languages/sas/string_feature.test | 23 + .../languages/sass/atrule-line_feature.test | 35 + .../tests/languages/sass/comment_feature.test | 23 + .../languages/sass/property-line_feature.test | 47 + .../languages/sass/selector_feature.test | 24 + .../languages/sass/variable-line_feature.test | 29 + .../languages/scala/builtin_feature.test | 17 + .../languages/scala/keyword_feature.test | 35 + .../tests/languages/scala/number_feature.test | 27 + .../tests/languages/scala/string_feature.test | 34 + .../tests/languages/scala/symbol_feature.test | 15 + .../languages/scheme/boolean_feature.test | 13 + .../languages/scheme/builtin_feature.test | 53 + .../languages/scheme/character_feature.test | 19 + .../languages/scheme/comment_feature.test | 13 + .../languages/scheme/function_feature.test | 21 + .../tests/languages/scheme/issue1331.test | 12 + .../languages/scheme/keyword_feature.test | 57 + .../languages/scheme/number_feature.test | 19 + .../languages/scheme/operator_feature.test | 31 + .../languages/scheme/string_feature.test | 17 + .../languages/scss+haml/scss_inclusion.test | 40 + .../languages/scss+pug/scss_inclusion.test | 17 + .../tests/languages/scss/atrule_feature.test | 20 + .../tests/languages/scss/boolean_feature.test | 13 + .../tests/languages/scss/comment_feature.test | 19 + .../tests/languages/scss/keyword_feature.test | 28 + .../tests/languages/scss/null_feature.test | 11 + .../languages/scss/operator_feature.test | 38 + .../languages/scss/placeholder_feature.test | 15 + .../languages/scss/property_feature.test | 23 + .../languages/scss/selector_feature.test | 23 + .../languages/scss/statement_feature.test | 21 + .../tests/languages/scss/url_feature.test | 19 + .../languages/scss/variable_feature.test | 21 + .../smalltalk/block-arguments_feature.test | 26 + .../smalltalk/character_feature.test | 17 + .../languages/smalltalk/comment_feature.test | 14 + .../languages/smalltalk/keyword_feature.test | 13 + .../languages/smalltalk/number_feature.test | 23 + .../languages/smalltalk/operator_feature.test | 29 + .../languages/smalltalk/string_feature.test | 14 + .../languages/smalltalk/symbol_feature.test | 21 + .../temporary-variables_feature.test | 25 + .../languages/smarty/attr-name_feature.test | 36 + .../languages/smarty/comment_feature.test | 14 + .../languages/smarty/function_feature.test | 41 + .../languages/smarty/keyword_feature.test | 51 + .../languages/smarty/number_feature.test | 45 + .../languages/smarty/operator_feature.test | 187 ++ .../smarty/smarty_in_markup_feature.test | 55 + .../languages/smarty/string_feature.test | 33 + .../languages/smarty/variable_feature.test | 56 + .../tests/languages/soy/boolean_feature.test | 27 + .../tests/languages/soy/command-arg.test | 84 + .../tests/languages/soy/comment_feature.test | 25 + .../tests/languages/soy/function_feature.test | 86 + .../tests/languages/soy/keyword_feature.test | 338 +++ .../tests/languages/soy/literal_feature.test | 73 + .../tests/languages/soy/number_feature.test | 63 + .../tests/languages/soy/operator_feature.test | 121 + .../languages/soy/parameter_feature.test | 72 + .../tests/languages/soy/property_feature.test | 54 + .../languages/soy/soy_in_markup_feature.test | 68 + .../tests/languages/soy/string_feature.test | 47 + .../tests/languages/soy/variable_feature.test | 86 + .../tests/languages/sql/boolean_feature.test | 15 + .../tests/languages/sql/comment_feature.test | 26 + .../tests/languages/sql/function_feature.test | 39 + .../tests/languages/sql/keyword_feature.test | 717 +++++ .../tests/languages/sql/number_feature.test | 15 + .../tests/languages/sql/operator_feature.test | 49 + .../tests/languages/sql/string_feature.test | 27 + .../tests/languages/sql/variable_feature.test | 26 + .../stylus+pug/stylus_inclusion.test | 20 + .../stylus/atrule-declaration_feature.test | 31 + .../languages/stylus/boolean_feature.test | 21 + .../languages/stylus/comment_feature.test | 18 + .../tests/languages/stylus/func_feature.test | 51 + .../languages/stylus/hexcode_feature.test | 29 + .../languages/stylus/important_feature.test | 22 + .../languages/stylus/keyword_feature.test | 44 + .../languages/stylus/number_feature.test | 32 + .../languages/stylus/operator_feature.test | 273 ++ .../stylus/property-declaration_feature.test | 52 + .../languages/stylus/selector_feature.test | 49 + .../languages/stylus/string_feature.test | 33 + .../tests/languages/stylus/url_feature.test | 21 + .../stylus/variable-declaration_feature.test | 33 + .../tests/languages/swift/atrule_feature.test | 33 + .../languages/swift/builtin_feature.test | 53 + .../languages/swift/constant_feature.test | 19 + .../languages/swift/keyword_feature.test | 165 ++ .../tests/languages/swift/number_feature.test | 25 + .../tests/languages/swift/string_feature.test | 47 + .../tests/languages/tap/bail_out_feature.test | 13 + .../languages/tap/directive_feature.test | 15 + .../languages/tap/pass_fail_feature.test | 17 + .../tests/languages/tap/plan_feature.test | 13 + .../tests/languages/tap/pragma_feature.test | 13 + .../tests/languages/tap/version_feature.test | 11 + .../tests/languages/tap/yamlish_feature.test | 50 + .../tests/languages/tcl/builtin_feature.test | 35 + .../tests/languages/tcl/comment_feature.test | 13 + .../tests/languages/tcl/function_feature.test | 15 + .../tests/languages/tcl/keyword_feature.test | 213 ++ .../tests/languages/tcl/operator_feature.test | 45 + .../tests/languages/tcl/scope_feature.test | 15 + .../tests/languages/tcl/string_feature.test | 16 + .../tests/languages/tcl/variable_feature.test | 31 + .../languages/textile/acronym_feature.test | 15 + .../languages/textile/block-tag_feature.test | 131 + .../languages/textile/footnote_feature.test | 15 + .../languages/textile/image_feature.test | 71 + .../languages/textile/inline_feature.test | 166 ++ .../languages/textile/link-ref_feature.test | 25 + .../tests/languages/textile/link_feature.test | 44 + .../tests/languages/textile/list_feature.test | 36 + .../tests/languages/textile/mark_feature.test | 17 + .../languages/textile/table_feature.test | 177 ++ .../tests/languages/toml/boolean_feature.test | 13 + .../tests/languages/toml/comment_feature.test | 11 + .../tests/languages/toml/date_feature.test | 33 + .../tests/languages/toml/key_feature.test | 42 + .../tests/languages/toml/number_feature.test | 79 + .../tests/languages/toml/string_feature.test | 29 + .../tests/languages/toml/table_feature.test | 20 + .../tests/languages/tsx/tag_feature.test | 105 + .../tests/languages/tt2/comment_feature.test | 36 + .../languages/tt2/delimiter_feature.test | 18 + .../tests/languages/tt2/keyword_feature.test | 130 + .../tests/languages/tt2/operator_feature.test | 69 + .../tt2/string-interpolation_feature.test | 21 + .../tests/languages/tt2/string_feature.test | 35 + .../tests/languages/tt2/variable_feature.test | 36 + .../languages/twig+pug/twig_inclusion.test | 19 + .../tests/languages/twig/boolean_feature.test | 27 + .../tests/languages/twig/comment_feature.test | 16 + .../tests/languages/twig/keyword_feature.test | 53 + .../tests/languages/twig/number_feature.test | 45 + .../languages/twig/operator_feature.test | 179 ++ .../tests/languages/twig/string_feature.test | 33 + .../languages/typescript/builtin_feature.test | 31 + .../languages/typescript/keyword_feature.test | 129 + .../languages/vala/class-name_feature.test | 37 + .../tests/languages/vala/keyword_feature.test | 189 ++ .../tests/languages/vala/number_feature.test | 27 + .../languages/vala/operator_feature.test | 63 + .../languages/vala/punctuation_feature.test | 22 + .../tests/languages/vala/string_feature.test | 64 + .../languages/vbnet/comment_feature.test | 18 + .../languages/vbnet/keyword_feature.test | 443 +++ .../languages/velocity/directive_feature.test | 417 +++ .../languages/velocity/unparsed_feature.test | 29 + .../languages/velocity/variable_feature.test | 147 + .../velocity/velocity-comment_feature.test | 18 + .../languages/verilog/comment_feature.test | 18 + .../languages/verilog/constant_feature.test | 13 + .../languages/verilog/function_feature.test | 15 + .../languages/verilog/important_feature.test | 27 + .../languages/verilog/keyword_feature.test | 443 +++ .../languages/verilog/number_feature.test | 39 + .../languages/verilog/operator_feature.test | 39 + .../languages/verilog/property_feature.test | 11 + .../languages/verilog/string_feature.test | 16 + .../tests/languages/vhdl/boolean_feature.test | 13 + .../tests/languages/vhdl/comment_feature.test | 13 + .../languages/vhdl/constant_feature.test | 13 + .../languages/vhdl/function_feature.test | 29 + .../tests/languages/vhdl/keyword_feature.test | 229 ++ .../tests/languages/vhdl/number_feature.test | 37 + .../languages/vhdl/operator_feature.test | 29 + .../tests/languages/vhdl/string_feature.test | 16 + .../languages/vhdl/vhdl-vectors_feature.test | 21 + .../tests/languages/vim/builtin_feature.test | 2289 +++++++++++++++ .../tests/languages/vim/comment_feature.test | 13 + .../tests/languages/vim/function_feature.test | 13 + .../tests/languages/vim/keyword_feature.test | 1661 +++++++++++ .../tests/languages/vim/number_feature.test | 15 + .../tests/languages/vim/operator_feature.test | 37 + .../tests/languages/vim/string_feature.test | 19 + .../visual-basic/boolean_feature.test | 15 + .../visual-basic/comment_feature.test | 25 + .../languages/visual-basic/date_feature.test | 23 + .../visual-basic/directive_feature.test | 23 + .../visual-basic/keyword_feature.test | 307 +++ .../visual-basic/number_feature.test | 37 + .../visual-basic/operator_feature.test | 37 + .../visual-basic/string_feature.test | 35 + .../tests/languages/wasm/comment_feature.test | 22 + .../tests/languages/wasm/keyword_feature.test | 407 +++ .../tests/languages/wasm/number_feature.test | 61 + .../tests/languages/wasm/string_feature.test | 22 + .../languages/wasm/variable_feature.test | 17 + .../languages/wiki/block-comment_feature.test | 16 + .../languages/wiki/emphasis_feature.test | 27 + .../tests/languages/wiki/heading_feature.test | 33 + .../tests/languages/wiki/hr_feature.test | 13 + .../tests/languages/wiki/nowiki_feature.test | 63 + .../tests/languages/wiki/symbol_feature.test | 17 + .../tests/languages/wiki/url_feature.test | 29 + .../languages/wiki/variable_feature.test | 19 + .../languages/xeora/constant_feature.test | 15 + .../xeora/directive-block-close_feature.test | 12 + .../xeora/directive-block-open_feature.test | 30 + .../directive-block-separator_feature.test | 17 + .../xeora/directive-inline_feature.test | 21 + .../xeora/function-block_feature.test | 43 + .../xeora/function-inline_feature.test | 31 + .../languages/xeora/variable_feature.test | 36 + .../tests/languages/xojo/comment_feature.test | 15 + .../tests/languages/xojo/keyword_feature.test | 125 + .../tests/languages/xojo/number_feature.test | 27 + .../languages/xojo/operator_feature.test | 27 + .../tests/languages/xojo/string_feature.test | 15 + .../tests/languages/xojo/symbol_feature.test | 19 + .../tests/languages/xquery/axis_feature.test | 33 + .../languages/xquery/builtin_feature.test | 122 + .../languages/xquery/extension_feature.test | 11 + .../languages/xquery/function_feature.test | 43 + .../xquery/keyword-operator_feature.test | 43 + .../languages/xquery/keyword_feature.test | 119 + .../languages/xquery/number_feature.test | 17 + .../languages/xquery/operator_feature.test | 21 + .../languages/xquery/plain-text_feature.test | 71 + .../languages/xquery/string_feature.test | 25 + .../tests/languages/xquery/tag_feature.test | 133 + .../languages/xquery/variable_feature.test | 15 + .../xquery/xquery-attribute_feature.test | 18 + .../xquery/xquery-comment_feature.test | 19 + .../xquery/xquery-element_feature.test | 18 + .../tests/languages/yaml/boolean_feature.test | 17 + .../tests/languages/yaml/comment_feature.test | 13 + .../languages/yaml/datetime_feature.test | 31 + .../languages/yaml/directive_feature.test | 13 + .../languages/yaml/important_feature.test | 19 + .../tests/languages/yaml/key_feature.test | 15 + .../tests/languages/yaml/null_feature.test | 17 + .../tests/languages/yaml/number_feature.test | 38 + .../tests/languages/yaml/scalar_feature.test | 23 + .../tests/languages/yaml/string_feature.test | 29 + .../tests/languages/yaml/tag_feature.test | 15 + docs/_style/prism-master/tests/run.js | 45 + .../prism-master/tests/testrunner-tests.js | 166 ++ docs/_style/prism-master/themes/prism-coy.css | 225 ++ .../_style/prism-master/themes/prism-dark.css | 128 + .../prism-master/themes/prism-funky.css | 116 + .../prism-master/themes/prism-okaidia.css | 122 + .../themes/prism-solarizedlight.css | 149 + .../prism-master/themes/prism-tomorrow.css | 121 + .../prism-master/themes/prism-twilight.css | 198 ++ docs/_style/prism-master/themes/prism.css | 138 + docs/_style/prism-master/utopia.js | 463 ++++ .../prism-master/vendor/FileSaver.min.js | 2 + docs/_style/prism-master/vendor/jszip.min.js | 15 + docs/_style/prism-master/vendor/promise.js | 5 + docs/_style/style.css | 81 + {book => docs/book}/00-Introduction.md | 0 {book => docs/book}/00-On-Java-8.md | 0 {book => docs/book}/00-Preface.md | 0 {book => docs/book}/01-What-is-an-Object.md | 0 ...2-Installing-Java-and-the-Book-Examples.md | 0 {book => docs/book}/03-Objects-Everywhere.md | 0 {book => docs/book}/04-Operators.md | 0 {book => docs/book}/05-Control-Flow.md | 0 {book => docs/book}/06-Housekeeping.md | 0 .../book}/07-Implementation-Hiding.md | 0 {book => docs/book}/08-Reuse.md | 0 {book => docs/book}/09-Polymorphism.md | 0 {book => docs/book}/10-Interfaces.md | 0 {book => docs/book}/11-Inner-Classes.md | 0 {book => docs/book}/12-Collections.md | 0 .../book}/13-Functional-Programming.md | 0 {book => docs/book}/14-Streams.md | 0 {book => docs/book}/15-Exceptions.md | 0 .../book}/16-Validating-Your-Code.md | 0 {book => docs/book}/17-Files.md | 0 {book => docs/book}/18-Strings.md | 0 {book => docs/book}/19-Type-Information.md | 0 {book => docs/book}/20-Generics.md | 0 {book => docs/book}/21-Arrays.md | 0 {book => docs/book}/22-Enumerations.md | 0 {book => docs/book}/23-Annotations.md | 0 .../book}/24-Concurrent-Programming.md | 0 {book => docs/book}/25-Patterns.md | 0 .../book}/Appendix-Becoming-a-Programmer.md | 0 ...efits-and-Costs-of-Static-Type-Checking.md | 0 .../book}/Appendix-Collection-Topics.md | 0 .../book}/Appendix-Data-Compression.md | 0 {book => docs/book}/Appendix-IO-Streams.md | 0 {book => docs/book}/Appendix-Javadoc.md | 0 .../book}/Appendix-Low-Level-Concurrency.md | 0 {book => docs/book}/Appendix-New-IO.md | 0 .../book}/Appendix-Object-Serialization.md | 0 .../Appendix-Passing-and-Returning-Objects.md | 0 .../book}/Appendix-Programming-Guidelines.md | 0 {book => docs/book}/Appendix-Standard-IO.md | 0 {book => docs/book}/Appendix-Supplements.md | 0 ...Positive-Legacy-of-C-plus-plus-and-Java.md | 0 ...endix-Understanding-equals-and-hashCode.md | 0 GLOSSARY.md => docs/book/GLOSSARY.md | 0 {images => docs/images}/1545758268350.png | Bin {images => docs/images}/1545763399825.png | Bin {images => docs/images}/1545764724202.png | Bin {images => docs/images}/1545764780795.png | Bin {images => docs/images}/1545764820176.png | Bin {images => docs/images}/1545839316314.png | Bin {images => docs/images}/1545841270997.png | Bin {images => docs/images}/QQGroupQRCode.png | Bin {images => docs/images}/cover.jpg | Bin {images => docs/images}/cover_small.jpg | Bin {images => docs/images}/level_1_title.png | Bin {images => docs/images}/level_2_title.png | Bin {images => docs/images}/qqgroup.png | Bin {images => docs/images}/reader.png | Bin docs/index.html | 365 +++ 1812 files changed, 101698 insertions(+), 435 deletions(-) create mode 100644 docs/.nojekyll rename Introduction.md => docs/README.md (79%) create mode 100644 docs/_coverpage.md create mode 100644 docs/_sidebar.md create mode 100644 docs/_style/prism-master/.editorconfig create mode 100644 docs/_style/prism-master/.gitattributes create mode 100644 docs/_style/prism-master/.gitignore create mode 100644 docs/_style/prism-master/.npmignore create mode 100644 docs/_style/prism-master/.travis.yml create mode 100644 docs/_style/prism-master/CHANGELOG.md create mode 100644 docs/_style/prism-master/CNAME create mode 100644 docs/_style/prism-master/LICENSE create mode 100644 docs/_style/prism-master/README.md create mode 100644 docs/_style/prism-master/bower.json create mode 100644 docs/_style/prism-master/code.js create mode 100644 docs/_style/prism-master/components.js create mode 100644 docs/_style/prism-master/components.json create mode 100644 docs/_style/prism-master/components/index.js create mode 100644 docs/_style/prism-master/components/prism-abap.js create mode 100644 docs/_style/prism-master/components/prism-abap.min.js create mode 100644 docs/_style/prism-master/components/prism-actionscript.js create mode 100644 docs/_style/prism-master/components/prism-actionscript.min.js create mode 100644 docs/_style/prism-master/components/prism-ada.js create mode 100644 docs/_style/prism-master/components/prism-ada.min.js create mode 100644 docs/_style/prism-master/components/prism-apacheconf.js create mode 100644 docs/_style/prism-master/components/prism-apacheconf.min.js create mode 100644 docs/_style/prism-master/components/prism-apl.js create mode 100644 docs/_style/prism-master/components/prism-apl.min.js create mode 100644 docs/_style/prism-master/components/prism-applescript.js create mode 100644 docs/_style/prism-master/components/prism-applescript.min.js create mode 100644 docs/_style/prism-master/components/prism-arduino.js create mode 100644 docs/_style/prism-master/components/prism-arduino.min.js create mode 100644 docs/_style/prism-master/components/prism-arff.js create mode 100644 docs/_style/prism-master/components/prism-arff.min.js create mode 100644 docs/_style/prism-master/components/prism-asciidoc.js create mode 100644 docs/_style/prism-master/components/prism-asciidoc.min.js create mode 100644 docs/_style/prism-master/components/prism-asm6502.js create mode 100644 docs/_style/prism-master/components/prism-asm6502.min.js create mode 100644 docs/_style/prism-master/components/prism-aspnet.js create mode 100644 docs/_style/prism-master/components/prism-aspnet.min.js create mode 100644 docs/_style/prism-master/components/prism-autohotkey.js create mode 100644 docs/_style/prism-master/components/prism-autohotkey.min.js create mode 100644 docs/_style/prism-master/components/prism-autoit.js create mode 100644 docs/_style/prism-master/components/prism-autoit.min.js create mode 100644 docs/_style/prism-master/components/prism-bash.js create mode 100644 docs/_style/prism-master/components/prism-bash.min.js create mode 100644 docs/_style/prism-master/components/prism-basic.js create mode 100644 docs/_style/prism-master/components/prism-basic.min.js create mode 100644 docs/_style/prism-master/components/prism-batch.js create mode 100644 docs/_style/prism-master/components/prism-batch.min.js create mode 100644 docs/_style/prism-master/components/prism-bison.js create mode 100644 docs/_style/prism-master/components/prism-bison.min.js create mode 100644 docs/_style/prism-master/components/prism-brainfuck.js create mode 100644 docs/_style/prism-master/components/prism-brainfuck.min.js create mode 100644 docs/_style/prism-master/components/prism-bro.js create mode 100644 docs/_style/prism-master/components/prism-bro.min.js create mode 100644 docs/_style/prism-master/components/prism-c.js create mode 100644 docs/_style/prism-master/components/prism-c.min.js create mode 100644 docs/_style/prism-master/components/prism-cil.js create mode 100644 docs/_style/prism-master/components/prism-cil.min.js create mode 100644 docs/_style/prism-master/components/prism-clike.js create mode 100644 docs/_style/prism-master/components/prism-clike.min.js create mode 100644 docs/_style/prism-master/components/prism-clojure.js create mode 100644 docs/_style/prism-master/components/prism-clojure.min.js create mode 100644 docs/_style/prism-master/components/prism-coffeescript.js create mode 100644 docs/_style/prism-master/components/prism-coffeescript.min.js create mode 100644 docs/_style/prism-master/components/prism-core.js create mode 100644 docs/_style/prism-master/components/prism-core.min.js create mode 100644 docs/_style/prism-master/components/prism-cpp.js create mode 100644 docs/_style/prism-master/components/prism-cpp.min.js create mode 100644 docs/_style/prism-master/components/prism-crystal.js create mode 100644 docs/_style/prism-master/components/prism-crystal.min.js create mode 100644 docs/_style/prism-master/components/prism-csharp.js create mode 100644 docs/_style/prism-master/components/prism-csharp.min.js create mode 100644 docs/_style/prism-master/components/prism-csp.js create mode 100644 docs/_style/prism-master/components/prism-csp.min.js create mode 100644 docs/_style/prism-master/components/prism-css-extras.js create mode 100644 docs/_style/prism-master/components/prism-css-extras.min.js create mode 100644 docs/_style/prism-master/components/prism-css.js create mode 100644 docs/_style/prism-master/components/prism-css.min.js create mode 100644 docs/_style/prism-master/components/prism-d.js create mode 100644 docs/_style/prism-master/components/prism-d.min.js create mode 100644 docs/_style/prism-master/components/prism-dart.js create mode 100644 docs/_style/prism-master/components/prism-dart.min.js create mode 100644 docs/_style/prism-master/components/prism-diff.js create mode 100644 docs/_style/prism-master/components/prism-diff.min.js create mode 100644 docs/_style/prism-master/components/prism-django.js create mode 100644 docs/_style/prism-master/components/prism-django.min.js create mode 100644 docs/_style/prism-master/components/prism-docker.js create mode 100644 docs/_style/prism-master/components/prism-docker.min.js create mode 100644 docs/_style/prism-master/components/prism-eiffel.js create mode 100644 docs/_style/prism-master/components/prism-eiffel.min.js create mode 100644 docs/_style/prism-master/components/prism-elixir.js create mode 100644 docs/_style/prism-master/components/prism-elixir.min.js create mode 100644 docs/_style/prism-master/components/prism-elm.js create mode 100644 docs/_style/prism-master/components/prism-elm.min.js create mode 100644 docs/_style/prism-master/components/prism-erb.js create mode 100644 docs/_style/prism-master/components/prism-erb.min.js create mode 100644 docs/_style/prism-master/components/prism-erlang.js create mode 100644 docs/_style/prism-master/components/prism-erlang.min.js create mode 100644 docs/_style/prism-master/components/prism-flow.js create mode 100644 docs/_style/prism-master/components/prism-flow.min.js create mode 100644 docs/_style/prism-master/components/prism-fortran.js create mode 100644 docs/_style/prism-master/components/prism-fortran.min.js create mode 100644 docs/_style/prism-master/components/prism-fsharp.js create mode 100644 docs/_style/prism-master/components/prism-fsharp.min.js create mode 100644 docs/_style/prism-master/components/prism-gcode.js create mode 100644 docs/_style/prism-master/components/prism-gcode.min.js create mode 100644 docs/_style/prism-master/components/prism-gedcom.js create mode 100644 docs/_style/prism-master/components/prism-gedcom.min.js create mode 100644 docs/_style/prism-master/components/prism-gherkin.js create mode 100644 docs/_style/prism-master/components/prism-gherkin.min.js create mode 100644 docs/_style/prism-master/components/prism-git.js create mode 100644 docs/_style/prism-master/components/prism-git.min.js create mode 100644 docs/_style/prism-master/components/prism-glsl.js create mode 100644 docs/_style/prism-master/components/prism-glsl.min.js create mode 100644 docs/_style/prism-master/components/prism-gml.js create mode 100644 docs/_style/prism-master/components/prism-gml.min.js create mode 100644 docs/_style/prism-master/components/prism-go.js create mode 100644 docs/_style/prism-master/components/prism-go.min.js create mode 100644 docs/_style/prism-master/components/prism-graphql.js create mode 100644 docs/_style/prism-master/components/prism-graphql.min.js create mode 100644 docs/_style/prism-master/components/prism-groovy.js create mode 100644 docs/_style/prism-master/components/prism-groovy.min.js create mode 100644 docs/_style/prism-master/components/prism-haml.js create mode 100644 docs/_style/prism-master/components/prism-haml.min.js create mode 100644 docs/_style/prism-master/components/prism-handlebars.js create mode 100644 docs/_style/prism-master/components/prism-handlebars.min.js create mode 100644 docs/_style/prism-master/components/prism-haskell.js create mode 100644 docs/_style/prism-master/components/prism-haskell.min.js create mode 100644 docs/_style/prism-master/components/prism-haxe.js create mode 100644 docs/_style/prism-master/components/prism-haxe.min.js create mode 100644 docs/_style/prism-master/components/prism-hpkp.js create mode 100644 docs/_style/prism-master/components/prism-hpkp.min.js create mode 100644 docs/_style/prism-master/components/prism-hsts.js create mode 100644 docs/_style/prism-master/components/prism-hsts.min.js create mode 100644 docs/_style/prism-master/components/prism-http.js create mode 100644 docs/_style/prism-master/components/prism-http.min.js create mode 100644 docs/_style/prism-master/components/prism-ichigojam.js create mode 100644 docs/_style/prism-master/components/prism-ichigojam.min.js create mode 100644 docs/_style/prism-master/components/prism-icon.js create mode 100644 docs/_style/prism-master/components/prism-icon.min.js create mode 100644 docs/_style/prism-master/components/prism-inform7.js create mode 100644 docs/_style/prism-master/components/prism-inform7.min.js create mode 100644 docs/_style/prism-master/components/prism-ini.js create mode 100644 docs/_style/prism-master/components/prism-ini.min.js create mode 100644 docs/_style/prism-master/components/prism-io.js create mode 100644 docs/_style/prism-master/components/prism-io.min.js create mode 100644 docs/_style/prism-master/components/prism-j.js create mode 100644 docs/_style/prism-master/components/prism-j.min.js create mode 100644 docs/_style/prism-master/components/prism-java.js create mode 100644 docs/_style/prism-master/components/prism-java.min.js create mode 100644 docs/_style/prism-master/components/prism-javascript.js create mode 100644 docs/_style/prism-master/components/prism-javascript.min.js create mode 100644 docs/_style/prism-master/components/prism-javastacktrace.js create mode 100644 docs/_style/prism-master/components/prism-javastacktrace.min.js create mode 100644 docs/_style/prism-master/components/prism-jolie.js create mode 100644 docs/_style/prism-master/components/prism-jolie.min.js create mode 100644 docs/_style/prism-master/components/prism-json.js create mode 100644 docs/_style/prism-master/components/prism-json.min.js create mode 100644 docs/_style/prism-master/components/prism-jsx.js create mode 100644 docs/_style/prism-master/components/prism-jsx.min.js create mode 100644 docs/_style/prism-master/components/prism-julia.js create mode 100644 docs/_style/prism-master/components/prism-julia.min.js create mode 100644 docs/_style/prism-master/components/prism-keyman.js create mode 100644 docs/_style/prism-master/components/prism-keyman.min.js create mode 100644 docs/_style/prism-master/components/prism-kotlin.js create mode 100644 docs/_style/prism-master/components/prism-kotlin.min.js create mode 100644 docs/_style/prism-master/components/prism-latex.js create mode 100644 docs/_style/prism-master/components/prism-latex.min.js create mode 100644 docs/_style/prism-master/components/prism-less.js create mode 100644 docs/_style/prism-master/components/prism-less.min.js create mode 100644 docs/_style/prism-master/components/prism-liquid.js create mode 100644 docs/_style/prism-master/components/prism-liquid.min.js create mode 100644 docs/_style/prism-master/components/prism-lisp.js create mode 100644 docs/_style/prism-master/components/prism-lisp.min.js create mode 100644 docs/_style/prism-master/components/prism-livescript.js create mode 100644 docs/_style/prism-master/components/prism-livescript.min.js create mode 100644 docs/_style/prism-master/components/prism-lolcode.js create mode 100644 docs/_style/prism-master/components/prism-lolcode.min.js create mode 100644 docs/_style/prism-master/components/prism-lua.js create mode 100644 docs/_style/prism-master/components/prism-lua.min.js create mode 100644 docs/_style/prism-master/components/prism-makefile.js create mode 100644 docs/_style/prism-master/components/prism-makefile.min.js create mode 100644 docs/_style/prism-master/components/prism-markdown.js create mode 100644 docs/_style/prism-master/components/prism-markdown.min.js create mode 100644 docs/_style/prism-master/components/prism-markup-templating.js create mode 100644 docs/_style/prism-master/components/prism-markup-templating.min.js create mode 100644 docs/_style/prism-master/components/prism-markup.js create mode 100644 docs/_style/prism-master/components/prism-markup.min.js create mode 100644 docs/_style/prism-master/components/prism-matlab.js create mode 100644 docs/_style/prism-master/components/prism-matlab.min.js create mode 100644 docs/_style/prism-master/components/prism-mel.js create mode 100644 docs/_style/prism-master/components/prism-mel.min.js create mode 100644 docs/_style/prism-master/components/prism-mizar.js create mode 100644 docs/_style/prism-master/components/prism-mizar.min.js create mode 100644 docs/_style/prism-master/components/prism-monkey.js create mode 100644 docs/_style/prism-master/components/prism-monkey.min.js create mode 100644 docs/_style/prism-master/components/prism-n4js.js create mode 100644 docs/_style/prism-master/components/prism-n4js.min.js create mode 100644 docs/_style/prism-master/components/prism-nasm.js create mode 100644 docs/_style/prism-master/components/prism-nasm.min.js create mode 100644 docs/_style/prism-master/components/prism-nginx.js create mode 100644 docs/_style/prism-master/components/prism-nginx.min.js create mode 100644 docs/_style/prism-master/components/prism-nim.js create mode 100644 docs/_style/prism-master/components/prism-nim.min.js create mode 100644 docs/_style/prism-master/components/prism-nix.js create mode 100644 docs/_style/prism-master/components/prism-nix.min.js create mode 100644 docs/_style/prism-master/components/prism-nsis.js create mode 100644 docs/_style/prism-master/components/prism-nsis.min.js create mode 100644 docs/_style/prism-master/components/prism-objectivec.js create mode 100644 docs/_style/prism-master/components/prism-objectivec.min.js create mode 100644 docs/_style/prism-master/components/prism-ocaml.js create mode 100644 docs/_style/prism-master/components/prism-ocaml.min.js create mode 100644 docs/_style/prism-master/components/prism-opencl.js create mode 100644 docs/_style/prism-master/components/prism-opencl.min.js create mode 100644 docs/_style/prism-master/components/prism-oz.js create mode 100644 docs/_style/prism-master/components/prism-oz.min.js create mode 100644 docs/_style/prism-master/components/prism-parigp.js create mode 100644 docs/_style/prism-master/components/prism-parigp.min.js create mode 100644 docs/_style/prism-master/components/prism-parser.js create mode 100644 docs/_style/prism-master/components/prism-parser.min.js create mode 100644 docs/_style/prism-master/components/prism-pascal.js create mode 100644 docs/_style/prism-master/components/prism-pascal.min.js create mode 100644 docs/_style/prism-master/components/prism-perl.js create mode 100644 docs/_style/prism-master/components/prism-perl.min.js create mode 100644 docs/_style/prism-master/components/prism-php-extras.js create mode 100644 docs/_style/prism-master/components/prism-php-extras.min.js create mode 100644 docs/_style/prism-master/components/prism-php.js create mode 100644 docs/_style/prism-master/components/prism-php.min.js create mode 100644 docs/_style/prism-master/components/prism-plsql.js create mode 100644 docs/_style/prism-master/components/prism-plsql.min.js create mode 100644 docs/_style/prism-master/components/prism-powershell.js create mode 100644 docs/_style/prism-master/components/prism-powershell.min.js create mode 100644 docs/_style/prism-master/components/prism-processing.js create mode 100644 docs/_style/prism-master/components/prism-processing.min.js create mode 100644 docs/_style/prism-master/components/prism-prolog.js create mode 100644 docs/_style/prism-master/components/prism-prolog.min.js create mode 100644 docs/_style/prism-master/components/prism-properties.js create mode 100644 docs/_style/prism-master/components/prism-properties.min.js create mode 100644 docs/_style/prism-master/components/prism-protobuf.js create mode 100644 docs/_style/prism-master/components/prism-protobuf.min.js create mode 100644 docs/_style/prism-master/components/prism-pug.js create mode 100644 docs/_style/prism-master/components/prism-pug.min.js create mode 100644 docs/_style/prism-master/components/prism-puppet.js create mode 100644 docs/_style/prism-master/components/prism-puppet.min.js create mode 100644 docs/_style/prism-master/components/prism-pure.js create mode 100644 docs/_style/prism-master/components/prism-pure.min.js create mode 100644 docs/_style/prism-master/components/prism-python.js create mode 100644 docs/_style/prism-master/components/prism-python.min.js create mode 100644 docs/_style/prism-master/components/prism-q.js create mode 100644 docs/_style/prism-master/components/prism-q.min.js create mode 100644 docs/_style/prism-master/components/prism-qore.js create mode 100644 docs/_style/prism-master/components/prism-qore.min.js create mode 100644 docs/_style/prism-master/components/prism-r.js create mode 100644 docs/_style/prism-master/components/prism-r.min.js create mode 100644 docs/_style/prism-master/components/prism-reason.js create mode 100644 docs/_style/prism-master/components/prism-reason.min.js create mode 100644 docs/_style/prism-master/components/prism-renpy.js create mode 100644 docs/_style/prism-master/components/prism-renpy.min.js create mode 100644 docs/_style/prism-master/components/prism-rest.js create mode 100644 docs/_style/prism-master/components/prism-rest.min.js create mode 100644 docs/_style/prism-master/components/prism-rip.js create mode 100644 docs/_style/prism-master/components/prism-rip.min.js create mode 100644 docs/_style/prism-master/components/prism-roboconf.js create mode 100644 docs/_style/prism-master/components/prism-roboconf.min.js create mode 100644 docs/_style/prism-master/components/prism-ruby.js create mode 100644 docs/_style/prism-master/components/prism-ruby.min.js create mode 100644 docs/_style/prism-master/components/prism-rust.js create mode 100644 docs/_style/prism-master/components/prism-rust.min.js create mode 100644 docs/_style/prism-master/components/prism-sas.js create mode 100644 docs/_style/prism-master/components/prism-sas.min.js create mode 100644 docs/_style/prism-master/components/prism-sass.js create mode 100644 docs/_style/prism-master/components/prism-sass.min.js create mode 100644 docs/_style/prism-master/components/prism-scala.js create mode 100644 docs/_style/prism-master/components/prism-scala.min.js create mode 100644 docs/_style/prism-master/components/prism-scheme.js create mode 100644 docs/_style/prism-master/components/prism-scheme.min.js create mode 100644 docs/_style/prism-master/components/prism-scss.js create mode 100644 docs/_style/prism-master/components/prism-scss.min.js create mode 100644 docs/_style/prism-master/components/prism-smalltalk.js create mode 100644 docs/_style/prism-master/components/prism-smalltalk.min.js create mode 100644 docs/_style/prism-master/components/prism-smarty.js create mode 100644 docs/_style/prism-master/components/prism-smarty.min.js create mode 100644 docs/_style/prism-master/components/prism-soy.js create mode 100644 docs/_style/prism-master/components/prism-soy.min.js create mode 100644 docs/_style/prism-master/components/prism-sql.js create mode 100644 docs/_style/prism-master/components/prism-sql.min.js create mode 100644 docs/_style/prism-master/components/prism-stylus.js create mode 100644 docs/_style/prism-master/components/prism-stylus.min.js create mode 100644 docs/_style/prism-master/components/prism-swift.js create mode 100644 docs/_style/prism-master/components/prism-swift.min.js create mode 100644 docs/_style/prism-master/components/prism-tap.js create mode 100644 docs/_style/prism-master/components/prism-tap.min.js create mode 100644 docs/_style/prism-master/components/prism-tcl.js create mode 100644 docs/_style/prism-master/components/prism-tcl.min.js create mode 100644 docs/_style/prism-master/components/prism-textile.js create mode 100644 docs/_style/prism-master/components/prism-textile.min.js create mode 100644 docs/_style/prism-master/components/prism-toml.js create mode 100644 docs/_style/prism-master/components/prism-toml.min.js create mode 100644 docs/_style/prism-master/components/prism-tsx.js create mode 100644 docs/_style/prism-master/components/prism-tsx.min.js create mode 100644 docs/_style/prism-master/components/prism-tt2.js create mode 100644 docs/_style/prism-master/components/prism-tt2.min.js create mode 100644 docs/_style/prism-master/components/prism-twig.js create mode 100644 docs/_style/prism-master/components/prism-twig.min.js create mode 100644 docs/_style/prism-master/components/prism-typescript.js create mode 100644 docs/_style/prism-master/components/prism-typescript.min.js create mode 100644 docs/_style/prism-master/components/prism-vala.js create mode 100644 docs/_style/prism-master/components/prism-vala.min.js create mode 100644 docs/_style/prism-master/components/prism-vbnet.js create mode 100644 docs/_style/prism-master/components/prism-vbnet.min.js create mode 100644 docs/_style/prism-master/components/prism-velocity.js create mode 100644 docs/_style/prism-master/components/prism-velocity.min.js create mode 100644 docs/_style/prism-master/components/prism-verilog.js create mode 100644 docs/_style/prism-master/components/prism-verilog.min.js create mode 100644 docs/_style/prism-master/components/prism-vhdl.js create mode 100644 docs/_style/prism-master/components/prism-vhdl.min.js create mode 100644 docs/_style/prism-master/components/prism-vim.js create mode 100644 docs/_style/prism-master/components/prism-vim.min.js create mode 100644 docs/_style/prism-master/components/prism-visual-basic.js create mode 100644 docs/_style/prism-master/components/prism-visual-basic.min.js create mode 100644 docs/_style/prism-master/components/prism-wasm.js create mode 100644 docs/_style/prism-master/components/prism-wasm.min.js create mode 100644 docs/_style/prism-master/components/prism-wiki.js create mode 100644 docs/_style/prism-master/components/prism-wiki.min.js create mode 100644 docs/_style/prism-master/components/prism-xeora.js create mode 100644 docs/_style/prism-master/components/prism-xeora.min.js create mode 100644 docs/_style/prism-master/components/prism-xojo.js create mode 100644 docs/_style/prism-master/components/prism-xojo.min.js create mode 100644 docs/_style/prism-master/components/prism-xquery.js create mode 100644 docs/_style/prism-master/components/prism-xquery.min.js create mode 100644 docs/_style/prism-master/components/prism-yaml.js create mode 100644 docs/_style/prism-master/components/prism-yaml.min.js create mode 100644 docs/_style/prism-master/composer.json create mode 100644 docs/_style/prism-master/download.html create mode 100644 docs/_style/prism-master/download.js create mode 100644 docs/_style/prism-master/examples.html create mode 100644 docs/_style/prism-master/examples.js create mode 100644 docs/_style/prism-master/examples/prism-abap.html create mode 100644 docs/_style/prism-master/examples/prism-actionscript.html create mode 100644 docs/_style/prism-master/examples/prism-ada.html create mode 100644 docs/_style/prism-master/examples/prism-apacheconf.html create mode 100644 docs/_style/prism-master/examples/prism-apl.html create mode 100644 docs/_style/prism-master/examples/prism-applescript.html create mode 100644 docs/_style/prism-master/examples/prism-arduino.html create mode 100644 docs/_style/prism-master/examples/prism-arff.html create mode 100644 docs/_style/prism-master/examples/prism-asciidoc.html create mode 100644 docs/_style/prism-master/examples/prism-asm6502.html create mode 100644 docs/_style/prism-master/examples/prism-aspnet.html create mode 100644 docs/_style/prism-master/examples/prism-autohotkey.html create mode 100644 docs/_style/prism-master/examples/prism-autoit.html create mode 100644 docs/_style/prism-master/examples/prism-bash.html create mode 100644 docs/_style/prism-master/examples/prism-basic.html create mode 100644 docs/_style/prism-master/examples/prism-batch.html create mode 100644 docs/_style/prism-master/examples/prism-bison.html create mode 100644 docs/_style/prism-master/examples/prism-brainfuck.html create mode 100644 docs/_style/prism-master/examples/prism-bro.html create mode 100644 docs/_style/prism-master/examples/prism-c.html create mode 100644 docs/_style/prism-master/examples/prism-clike.html create mode 100644 docs/_style/prism-master/examples/prism-clojure.html create mode 100644 docs/_style/prism-master/examples/prism-coffeescript.html create mode 100644 docs/_style/prism-master/examples/prism-cpp.html create mode 100644 docs/_style/prism-master/examples/prism-crystal.html create mode 100644 docs/_style/prism-master/examples/prism-csharp.html create mode 100644 docs/_style/prism-master/examples/prism-csp.html create mode 100644 docs/_style/prism-master/examples/prism-css.html create mode 100644 docs/_style/prism-master/examples/prism-d.html create mode 100644 docs/_style/prism-master/examples/prism-dart.html create mode 100644 docs/_style/prism-master/examples/prism-diff.html create mode 100644 docs/_style/prism-master/examples/prism-django.html create mode 100644 docs/_style/prism-master/examples/prism-docker.html create mode 100644 docs/_style/prism-master/examples/prism-eiffel.html create mode 100644 docs/_style/prism-master/examples/prism-elixir.html create mode 100644 docs/_style/prism-master/examples/prism-elm.html create mode 100644 docs/_style/prism-master/examples/prism-erb.html create mode 100644 docs/_style/prism-master/examples/prism-erlang.html create mode 100644 docs/_style/prism-master/examples/prism-flow.html create mode 100644 docs/_style/prism-master/examples/prism-fortran.html create mode 100644 docs/_style/prism-master/examples/prism-fsharp.html create mode 100644 docs/_style/prism-master/examples/prism-gcode.html create mode 100644 docs/_style/prism-master/examples/prism-gedcom.html create mode 100644 docs/_style/prism-master/examples/prism-gherkin.html create mode 100644 docs/_style/prism-master/examples/prism-git.html create mode 100644 docs/_style/prism-master/examples/prism-glsl.html create mode 100644 docs/_style/prism-master/examples/prism-gml.html create mode 100644 docs/_style/prism-master/examples/prism-go.html create mode 100644 docs/_style/prism-master/examples/prism-graphql.html create mode 100644 docs/_style/prism-master/examples/prism-groovy.html create mode 100644 docs/_style/prism-master/examples/prism-haml.html create mode 100644 docs/_style/prism-master/examples/prism-handlebars.html create mode 100644 docs/_style/prism-master/examples/prism-haskell.html create mode 100644 docs/_style/prism-master/examples/prism-haxe.html create mode 100644 docs/_style/prism-master/examples/prism-hpkp.html create mode 100644 docs/_style/prism-master/examples/prism-hsts.html create mode 100644 docs/_style/prism-master/examples/prism-http.html create mode 100644 docs/_style/prism-master/examples/prism-ichigojam.html create mode 100644 docs/_style/prism-master/examples/prism-icon.html create mode 100644 docs/_style/prism-master/examples/prism-inform7.html create mode 100644 docs/_style/prism-master/examples/prism-ini.html create mode 100644 docs/_style/prism-master/examples/prism-io.html create mode 100644 docs/_style/prism-master/examples/prism-j.html create mode 100644 docs/_style/prism-master/examples/prism-java.html create mode 100644 docs/_style/prism-master/examples/prism-javascript.html create mode 100644 docs/_style/prism-master/examples/prism-javastacktrace.html create mode 100644 docs/_style/prism-master/examples/prism-jolie.html create mode 100644 docs/_style/prism-master/examples/prism-jsx.html create mode 100644 docs/_style/prism-master/examples/prism-julia.html create mode 100644 docs/_style/prism-master/examples/prism-keyman.html create mode 100644 docs/_style/prism-master/examples/prism-kotlin.html create mode 100644 docs/_style/prism-master/examples/prism-latex.html create mode 100644 docs/_style/prism-master/examples/prism-less.html create mode 100644 docs/_style/prism-master/examples/prism-liquid.html create mode 100644 docs/_style/prism-master/examples/prism-lisp.html create mode 100644 docs/_style/prism-master/examples/prism-livescript.html create mode 100644 docs/_style/prism-master/examples/prism-lolcode.html create mode 100644 docs/_style/prism-master/examples/prism-lua.html create mode 100644 docs/_style/prism-master/examples/prism-makefile.html create mode 100644 docs/_style/prism-master/examples/prism-markdown.html create mode 100644 docs/_style/prism-master/examples/prism-markup.html create mode 100644 docs/_style/prism-master/examples/prism-matlab.html create mode 100644 docs/_style/prism-master/examples/prism-mel.html create mode 100644 docs/_style/prism-master/examples/prism-mizar.html create mode 100644 docs/_style/prism-master/examples/prism-monkey.html create mode 100644 docs/_style/prism-master/examples/prism-n4js.html create mode 100644 docs/_style/prism-master/examples/prism-nasm.html create mode 100644 docs/_style/prism-master/examples/prism-nginx.html create mode 100644 docs/_style/prism-master/examples/prism-nim.html create mode 100644 docs/_style/prism-master/examples/prism-nix.html create mode 100644 docs/_style/prism-master/examples/prism-nsis.html create mode 100644 docs/_style/prism-master/examples/prism-objectivec.html create mode 100644 docs/_style/prism-master/examples/prism-ocaml.html create mode 100644 docs/_style/prism-master/examples/prism-opencl.html create mode 100644 docs/_style/prism-master/examples/prism-oz.html create mode 100644 docs/_style/prism-master/examples/prism-parigp.html create mode 100644 docs/_style/prism-master/examples/prism-parser.html create mode 100644 docs/_style/prism-master/examples/prism-pascal.html create mode 100644 docs/_style/prism-master/examples/prism-perl.html create mode 100644 docs/_style/prism-master/examples/prism-php.html create mode 100644 docs/_style/prism-master/examples/prism-plsql.html create mode 100644 docs/_style/prism-master/examples/prism-powershell.html create mode 100644 docs/_style/prism-master/examples/prism-processing.html create mode 100644 docs/_style/prism-master/examples/prism-prolog.html create mode 100644 docs/_style/prism-master/examples/prism-properties.html create mode 100644 docs/_style/prism-master/examples/prism-pug.html create mode 100644 docs/_style/prism-master/examples/prism-puppet.html create mode 100644 docs/_style/prism-master/examples/prism-pure.html create mode 100644 docs/_style/prism-master/examples/prism-python.html create mode 100644 docs/_style/prism-master/examples/prism-q.html create mode 100644 docs/_style/prism-master/examples/prism-qore.html create mode 100644 docs/_style/prism-master/examples/prism-r.html create mode 100644 docs/_style/prism-master/examples/prism-reason.html create mode 100644 docs/_style/prism-master/examples/prism-renpy.html create mode 100644 docs/_style/prism-master/examples/prism-rest.html create mode 100644 docs/_style/prism-master/examples/prism-rip.html create mode 100644 docs/_style/prism-master/examples/prism-roboconf.html create mode 100644 docs/_style/prism-master/examples/prism-ruby.html create mode 100644 docs/_style/prism-master/examples/prism-rust.html create mode 100644 docs/_style/prism-master/examples/prism-sas.html create mode 100644 docs/_style/prism-master/examples/prism-sass.html create mode 100644 docs/_style/prism-master/examples/prism-scala.html create mode 100644 docs/_style/prism-master/examples/prism-scheme.html create mode 100644 docs/_style/prism-master/examples/prism-scss.html create mode 100644 docs/_style/prism-master/examples/prism-smalltalk.html create mode 100644 docs/_style/prism-master/examples/prism-smarty.html create mode 100644 docs/_style/prism-master/examples/prism-soy.html create mode 100644 docs/_style/prism-master/examples/prism-sql.html create mode 100644 docs/_style/prism-master/examples/prism-stylus.html create mode 100644 docs/_style/prism-master/examples/prism-swift.html create mode 100644 docs/_style/prism-master/examples/prism-tcl.html create mode 100644 docs/_style/prism-master/examples/prism-textile.html create mode 100644 docs/_style/prism-master/examples/prism-tsx.html create mode 100644 docs/_style/prism-master/examples/prism-tt2.html create mode 100644 docs/_style/prism-master/examples/prism-twig.html create mode 100644 docs/_style/prism-master/examples/prism-typescript.html create mode 100644 docs/_style/prism-master/examples/prism-vala.html create mode 100644 docs/_style/prism-master/examples/prism-vbnet.html create mode 100644 docs/_style/prism-master/examples/prism-velocity.html create mode 100644 docs/_style/prism-master/examples/prism-verilog.html create mode 100644 docs/_style/prism-master/examples/prism-vhdl.html create mode 100644 docs/_style/prism-master/examples/prism-vim.html create mode 100644 docs/_style/prism-master/examples/prism-visual-basic.html create mode 100644 docs/_style/prism-master/examples/prism-wasm.html create mode 100644 docs/_style/prism-master/examples/prism-wiki.html create mode 100644 docs/_style/prism-master/examples/prism-xeora.html create mode 100644 docs/_style/prism-master/examples/prism-xojo.html create mode 100644 docs/_style/prism-master/examples/prism-xquery.html create mode 100644 docs/_style/prism-master/examples/prism-yaml.html create mode 100644 docs/_style/prism-master/extending.html create mode 100644 docs/_style/prism-master/faq.html create mode 100644 docs/_style/prism-master/favicon.png create mode 100644 docs/_style/prism-master/gulpfile.js create mode 100644 docs/_style/prism-master/img/logo-ala.png create mode 100644 docs/_style/prism-master/img/logo-css-tricks.png create mode 100644 docs/_style/prism-master/img/logo-drupal.png create mode 100644 docs/_style/prism-master/img/logo-mdn.png create mode 100644 docs/_style/prism-master/img/logo-react.png create mode 100644 docs/_style/prism-master/img/logo-sitepoint.png create mode 100644 docs/_style/prism-master/img/logo-smashing.png create mode 100644 docs/_style/prism-master/img/logo-stripe.png create mode 100644 docs/_style/prism-master/img/spectrum.png create mode 100644 docs/_style/prism-master/index.html create mode 100644 docs/_style/prism-master/logo.svg create mode 100644 docs/_style/prism-master/package.json create mode 100644 docs/_style/prism-master/plugins/autolinker/index.html create mode 100644 docs/_style/prism-master/plugins/autolinker/prism-autolinker.css create mode 100644 docs/_style/prism-master/plugins/autolinker/prism-autolinker.js create mode 100644 docs/_style/prism-master/plugins/autolinker/prism-autolinker.min.js create mode 100644 docs/_style/prism-master/plugins/autoloader/index.html create mode 100644 docs/_style/prism-master/plugins/autoloader/prism-autoloader.js create mode 100644 docs/_style/prism-master/plugins/autoloader/prism-autoloader.min.js create mode 100644 docs/_style/prism-master/plugins/command-line/index.html create mode 100644 docs/_style/prism-master/plugins/command-line/prism-command-line.css create mode 100644 docs/_style/prism-master/plugins/command-line/prism-command-line.js create mode 100644 docs/_style/prism-master/plugins/command-line/prism-command-line.min.js create mode 100644 docs/_style/prism-master/plugins/copy-to-clipboard/index.html create mode 100644 docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.js create mode 100644 docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js create mode 100644 docs/_style/prism-master/plugins/custom-class/index.html create mode 100644 docs/_style/prism-master/plugins/custom-class/prism-custom-class.js create mode 100644 docs/_style/prism-master/plugins/custom-class/prism-custom-class.min.js create mode 100644 docs/_style/prism-master/plugins/data-uri-highlight/index.html create mode 100644 docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.js create mode 100644 docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.min.js create mode 100644 docs/_style/prism-master/plugins/file-highlight/index.html create mode 100644 docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.js create mode 100644 docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.min.js create mode 100644 docs/_style/prism-master/plugins/highlight-keywords/index.html create mode 100644 docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.js create mode 100644 docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.min.js create mode 100644 docs/_style/prism-master/plugins/index.html create mode 100644 docs/_style/prism-master/plugins/jsonp-highlight/index.html create mode 100644 docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.js create mode 100644 docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.min.js create mode 100644 docs/_style/prism-master/plugins/keep-markup/index.html create mode 100644 docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.js create mode 100644 docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.min.js create mode 100644 docs/_style/prism-master/plugins/line-highlight/index.html create mode 100644 docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.css create mode 100644 docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.js create mode 100644 docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.min.js create mode 100644 docs/_style/prism-master/plugins/line-numbers/index.html create mode 100644 docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.css create mode 100644 docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.js create mode 100644 docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.min.js create mode 100644 docs/_style/prism-master/plugins/normalize-whitespace/demo.html create mode 100644 docs/_style/prism-master/plugins/normalize-whitespace/index.html create mode 100644 docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.js create mode 100644 docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.min.js create mode 100644 docs/_style/prism-master/plugins/previewers/index.html create mode 100644 docs/_style/prism-master/plugins/previewers/prism-previewers.css create mode 100644 docs/_style/prism-master/plugins/previewers/prism-previewers.js create mode 100644 docs/_style/prism-master/plugins/previewers/prism-previewers.min.js create mode 100644 docs/_style/prism-master/plugins/remove-initial-line-feed/index.html create mode 100644 docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js create mode 100644 docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js create mode 100644 docs/_style/prism-master/plugins/show-invisibles/index.html create mode 100644 docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.css create mode 100644 docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.js create mode 100644 docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.min.js create mode 100644 docs/_style/prism-master/plugins/show-language/index.html create mode 100644 docs/_style/prism-master/plugins/show-language/prism-show-language.js create mode 100644 docs/_style/prism-master/plugins/show-language/prism-show-language.min.js create mode 100644 docs/_style/prism-master/plugins/toolbar/index.html create mode 100644 docs/_style/prism-master/plugins/toolbar/prism-toolbar.css create mode 100644 docs/_style/prism-master/plugins/toolbar/prism-toolbar.js create mode 100644 docs/_style/prism-master/plugins/toolbar/prism-toolbar.min.js create mode 100644 docs/_style/prism-master/plugins/unescaped-markup/index.html create mode 100644 docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.css create mode 100644 docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.js create mode 100644 docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.min.js create mode 100644 docs/_style/prism-master/plugins/wpd/index.html create mode 100644 docs/_style/prism-master/plugins/wpd/prism-wpd.css create mode 100644 docs/_style/prism-master/plugins/wpd/prism-wpd.js create mode 100644 docs/_style/prism-master/plugins/wpd/prism-wpd.min.js create mode 100644 docs/_style/prism-master/prefixfree.min.js create mode 100644 docs/_style/prism-master/prism.js create mode 100644 docs/_style/prism-master/style.css create mode 100644 docs/_style/prism-master/templates/footer.html create mode 100644 docs/_style/prism-master/templates/header-download.html create mode 100644 docs/_style/prism-master/templates/header-main.html create mode 100644 docs/_style/prism-master/templates/header-plugins.html create mode 100644 docs/_style/prism-master/test-suite.html create mode 100644 docs/_style/prism-master/test.html create mode 100644 docs/_style/prism-master/tests/helper/prism-loader.js create mode 100644 docs/_style/prism-master/tests/helper/test-case.js create mode 100644 docs/_style/prism-master/tests/helper/test-discovery.js create mode 100644 docs/_style/prism-master/tests/helper/token-stream-transformer.js create mode 100644 docs/_style/prism-master/tests/languages/abap/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/eol-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/string-template_feature.test create mode 100644 docs/_style/prism-master/tests/languages/abap/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/actionscript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/actionscript/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ada/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/directive-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/directive-flags_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/directive-inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apacheconf/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/assignment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/dfn_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/dyadic-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/monadic-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/statement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/apl/system-function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/class_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/applescript/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/arff/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/arff/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/arff/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/arff/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/admonition_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/attribute-entry_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/attributes_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/callout_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/comment-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/entity_feature.js create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/entity_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/hr_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/indented-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/line-continuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/list-label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/list-punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/literal-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/macro_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/other-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/page-break_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/passthrough-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/replacement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asciidoc/title_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/opcode_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/register_feature.test create mode 100644 docs/_style/prism-master/tests/languages/asm6502/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/aspnet/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/aspnet/page-directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autohotkey/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/autoit/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/arithmetic_environment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/command_substitution_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/shebang_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bash/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/basic/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/batch/command_feature.test create mode 100644 docs/_style/prism-master/tests/languages/batch/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/batch/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/c_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bison/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/brainfuck/all_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/bro/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c+pure/c_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/c/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c/macro_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/c/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cil/asm_reference.test create mode 100644 docs/_style/prism-master/tests/languages/cil/boolean.test create mode 100644 docs/_style/prism-master/tests/languages/cil/comment.test create mode 100644 docs/_style/prism-master/tests/languages/cil/instructions.test create mode 100644 docs/_style/prism-master/tests/languages/cil/keywords.test create mode 100644 docs/_style/prism-master/tests/languages/cil/strings.test create mode 100644 docs/_style/prism-master/tests/languages/clike/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/issue1340.test create mode 100644 docs/_style/prism-master/tests/languages/clike/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clike/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/operator_and_punctuation.test create mode 100644 docs/_style/prism-master/tests/languages/clojure/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript+haml/coffeescript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript+pug/coffeescript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/block-regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/class-member_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/inline-javascript_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/coffeescript/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp+pure/cpp_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/cpp/raw_string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/crystal/attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/crystal/expansion_feature.test create mode 100644 docs/_style/prism-master/tests/languages/crystal/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/crystal/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp+aspnet/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/generic_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/issue1091.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/issue1365.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/issue1371.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/issue806.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csharp/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csp/directive_no_value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csp/directive_with_source_expression_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csp/safe_feature.test create mode 100644 docs/_style/prism-master/tests/languages/csp/unsafe_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/entity_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/hexcode_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/unit_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css!+css-extras/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css+haml/css+haml_usage.test create mode 100644 docs/_style/prism-master/tests/languages/css+http/css_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/css+textile/css_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/css/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/css/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/register_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/d/token-string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/dart/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/dart/metadata_feature.test create mode 100644 docs/_style/prism-master/tests/languages/dart/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/dart/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/diff/coord_feature.test create mode 100644 docs/_style/prism-master/tests/languages/diff/diff_feature.test create mode 100644 docs/_style/prism-master/tests/languages/django/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/django/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/docker/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/docker/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/docker/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/eiffel/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/atom_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/capture_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/issue1392.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/issue775.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elixir/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/hvariable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/import_statement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/elm/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erb/erb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erb/erb_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/atom_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/erlang/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/flow/flow-punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/flow/function-variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/flow/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/flow/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran+pure/fortran_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fortran/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/computation-expression_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/issue1480.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/fsharp/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/checksum_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gcode/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gedcom/level_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gedcom/line-value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gedcom/pointer_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gedcom/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/feature_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/outline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/pystring_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/scenario_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/gherkin/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/command_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/commit_sha1_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/coord_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/diff_feature.test create mode 100644 docs/_style/prism-master/tests/languages/git/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/glsl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/glsl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/glsl/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/glsl/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/go/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/graphql/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/issue1049.js create mode 100644 docs/_style/prism-master/tests/languages/groovy/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/shebang_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/spock-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/groovy/string-interpolation_feature.js create mode 100644 docs/_style/prism-master/tests/languages/groovy/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/doctype_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/multiline-code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/multiline-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haml/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars+pug/handlebars_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/handlebars_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/handlebars/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/hvariable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/import_statement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haskell/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/metadata_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/reification_feature.test create mode 100644 docs/_style/prism-master/tests/languages/haxe/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hpkp/safe_maxage_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hpkp/sha256_pin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hpkp/unsafe_maxage_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hsts/include_subdomains_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hsts/preload_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hsts/safe_maxage_feature.test create mode 100644 docs/_style/prism-master/tests/languages/hsts/unsafe_maxage_feature.test create mode 100644 docs/_style/prism-master/tests/languages/http/header-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/http/request-line_feature.test create mode 100644 docs/_style/prism-master/tests/languages/http/response-status_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ichigojam/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/builtin-keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/icon/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/position_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/title_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/inform7/verb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ini/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ini/key_value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ini/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/io/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/io/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/io/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/io/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/adverb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/conjunction_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/j/verb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/function_featrue.test create mode 100644 docs/_style/prism-master/tests/languages/java/generics_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/issue1351.test create mode 100644 docs/_style/prism-master/tests/languages/java/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/module_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/java/package_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript+haml/javascript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/javascript+http/javascript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/class-method_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/function-variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/issue1337.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/issue1340.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/issue1397.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/issue1526.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/supposed-classes_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/supposed-function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/template-string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javascript/try-catch_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javastacktrace/more_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javastacktrace/stack-frame_feature.test create mode 100644 docs/_style/prism-master/tests/languages/javastacktrace/summary_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jolie/deployment_features.test create mode 100644 docs/_style/prism-master/tests/languages/jolie/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jolie/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jolie/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json+http/json-suffix_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/json+http/json_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/json/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/null_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/json/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1103.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1235.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1236.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1294.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1335.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1342.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1356.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1364.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1408.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/issue1421.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/plain-text_feature.test create mode 100644 docs/_style/prism-master/tests/languages/jsx/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/julia/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/bold_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/keyman/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/kotlin/raw-string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/cdata_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/equation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/headline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/latex/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less+haml/less_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/less+pug/less_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/less/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/less/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/liquid/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/liquid/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/liquid/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/liquid/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/car_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/declare_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/defun_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/defvar_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/heading_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/interactive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/lambda-feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/lisp-property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/number_boolean.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/quoted-symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/splice_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lisp/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/argument_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/identifier_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/interpolated-string.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/keyword-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/livescript/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lolcode/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/lua/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/makefile/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown+haml/markdown_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markdown+pug/markdown_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/blockquote_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/bold_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/hr_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/italic_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/list_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/strike_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/title_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/url-reference_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markdown/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup!+css+javascript/issue1240.test create mode 100644 docs/_style/prism-master/tests/languages/markup!+css/css_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup!+javascript/javascript_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup+actionscript/xml_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+css+wiki/table-tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+haml/markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+http/html_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup+http/xml-suffix_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup+http/xml_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/markup+javascript+csharp+aspnet/script_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+php/php_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+pug/markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup+tt2/tt2_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/cdata_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/doctype_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/entity_feature.js create mode 100644 docs/_style/prism-master/tests/languages/markup/entity_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/issue585.test create mode 100644 docs/_style/prism-master/tests/languages/markup/issue888.test create mode 100644 docs/_style/prism-master/tests/languages/markup/prolog_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/tag_attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/markup/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/matlab/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/flag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mel/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/parameter_feature.test create mode 100644 docs/_style/prism-master/tests/languages/mizar/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/preprocessor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/monkey/type-char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/n4js/annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/n4js/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/register_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nasm/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nginx/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nginx/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nginx/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nim/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/antiquotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nix/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/nsis/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/objectivec/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/objectivec/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/objectivec/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ocaml/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+c/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+c/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+c/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+c/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl+cpp/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/opencl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/atom_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/oz/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parigp/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/escape_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/expression_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/parser-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/parser/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pascal/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/filehandle_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/perl/vstring_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php!+php-extras/global_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php!+php-extras/scope_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php!+php-extras/this_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/delimiter_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/package_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/shell-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/string-interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/php/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/plsql/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/plsql/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/plsql/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/issue1407.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/namespace_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/powershell/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/processing/type_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/prolog/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/properties/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/properties/key_value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/protobuf/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/protobuf/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/code_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/doctype_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/flow-control_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/mixin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/multiline-plain-text_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/multiline-script_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/plain-text_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/script_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pug/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/datatype_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/heredoc_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/puppet/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/special_feature.test create mode 100644 docs/_style/prism-master/tests/languages/pure/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/decorator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/issue1355.test create mode 100644 docs/_style/prism-master/tests/languages/python/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/string-interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/python/triple-quoted-string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/adverb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/datetime_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/q/verb_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/qore/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/ellipsis_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/percent-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/r/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/character_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/constructor_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/label_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/reason/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/command-line-option_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/doctest-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/field_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/hr_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/link-target_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/link_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/list-bullet_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/literal-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/quoted-literal-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/substitution-def_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rest/title_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/character_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/date_time_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/reference_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rip/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/component_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/optional_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/value_feature.test create mode 100644 docs/_style/prism-master/tests/languages/roboconf/wildcard_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/issue1336.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/method_definition_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/regex_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/ruby/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/char_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/closure-params_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/issue1339.test create mode 100644 docs/_style/prism-master/tests/languages/rust/issue1353.test create mode 100644 docs/_style/prism-master/tests/languages/rust/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/lifetime-annotation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/macro-rules_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/rust/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/datalines_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/datetime_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sas/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/atrule-line_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/property-line_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sass/variable-line_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scala/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/character_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/issue1331.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scheme/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss+haml/scss_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/scss+pug/scss_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/scss/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/null_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/placeholder_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/statement_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/scss/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/block-arguments_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/character_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smalltalk/temporary-variables_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/attr-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/smarty_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/smarty/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/command-arg.test create mode 100644 docs/_style/prism-master/tests/languages/soy/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/literal_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/parameter_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/soy_in_markup_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/soy/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/sql/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus+pug/stylus_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/atrule-declaration_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/func_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/hexcode_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/property-declaration_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/selector_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/stylus/variable-declaration_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/atrule_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/swift/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/bail_out_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/pass_fail_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/plan_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/pragma_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/version_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tap/yamlish_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/scope_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tcl/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/acronym_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/block-tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/footnote_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/image_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/link-ref_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/link_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/list_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/mark_feature.test create mode 100644 docs/_style/prism-master/tests/languages/textile/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/date_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/key_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/toml/table_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tsx/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/delimiter_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/string-interpolation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/tt2/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig+pug/twig_inclusion.test create mode 100644 docs/_style/prism-master/tests/languages/twig/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/twig/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/typescript/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/typescript/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/class-name_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/punctuation_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vala/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vbnet/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vbnet/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/velocity/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/velocity/unparsed_feature.test create mode 100644 docs/_style/prism-master/tests/languages/velocity/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/velocity/velocity-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/property_feature.test create mode 100644 docs/_style/prism-master/tests/languages/verilog/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vhdl/vhdl-vectors_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/vim/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/date_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/visual-basic/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wasm/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/block-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/emphasis_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/heading_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/hr_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/nowiki_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/url_feature.test create mode 100644 docs/_style/prism-master/tests/languages/wiki/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/constant_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/directive-block-close_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/directive-block-open_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/directive-block-separator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/directive-inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/function-block_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/function-inline_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xeora/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xojo/symbol_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/axis_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/builtin_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/extension_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/function_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/keyword-operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/keyword_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/operator_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/plain-text_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/tag_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/variable_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/xquery-attribute_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/xquery-comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/xquery/xquery-element_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/boolean_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/comment_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/datetime_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/directive_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/important_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/key_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/null_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/number_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/scalar_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/string_feature.test create mode 100644 docs/_style/prism-master/tests/languages/yaml/tag_feature.test create mode 100644 docs/_style/prism-master/tests/run.js create mode 100644 docs/_style/prism-master/tests/testrunner-tests.js create mode 100644 docs/_style/prism-master/themes/prism-coy.css create mode 100644 docs/_style/prism-master/themes/prism-dark.css create mode 100644 docs/_style/prism-master/themes/prism-funky.css create mode 100644 docs/_style/prism-master/themes/prism-okaidia.css create mode 100644 docs/_style/prism-master/themes/prism-solarizedlight.css create mode 100644 docs/_style/prism-master/themes/prism-tomorrow.css create mode 100644 docs/_style/prism-master/themes/prism-twilight.css create mode 100644 docs/_style/prism-master/themes/prism.css create mode 100644 docs/_style/prism-master/utopia.js create mode 100644 docs/_style/prism-master/vendor/FileSaver.min.js create mode 100644 docs/_style/prism-master/vendor/jszip.min.js create mode 100644 docs/_style/prism-master/vendor/promise.js create mode 100644 docs/_style/style.css rename {book => docs/book}/00-Introduction.md (100%) rename {book => docs/book}/00-On-Java-8.md (100%) rename {book => docs/book}/00-Preface.md (100%) rename {book => docs/book}/01-What-is-an-Object.md (100%) rename {book => docs/book}/02-Installing-Java-and-the-Book-Examples.md (100%) rename {book => docs/book}/03-Objects-Everywhere.md (100%) rename {book => docs/book}/04-Operators.md (100%) rename {book => docs/book}/05-Control-Flow.md (100%) rename {book => docs/book}/06-Housekeeping.md (100%) rename {book => docs/book}/07-Implementation-Hiding.md (100%) rename {book => docs/book}/08-Reuse.md (100%) rename {book => docs/book}/09-Polymorphism.md (100%) rename {book => docs/book}/10-Interfaces.md (100%) rename {book => docs/book}/11-Inner-Classes.md (100%) rename {book => docs/book}/12-Collections.md (100%) rename {book => docs/book}/13-Functional-Programming.md (100%) rename {book => docs/book}/14-Streams.md (100%) rename {book => docs/book}/15-Exceptions.md (100%) rename {book => docs/book}/16-Validating-Your-Code.md (100%) rename {book => docs/book}/17-Files.md (100%) rename {book => docs/book}/18-Strings.md (100%) rename {book => docs/book}/19-Type-Information.md (100%) rename {book => docs/book}/20-Generics.md (100%) rename {book => docs/book}/21-Arrays.md (100%) rename {book => docs/book}/22-Enumerations.md (100%) rename {book => docs/book}/23-Annotations.md (100%) rename {book => docs/book}/24-Concurrent-Programming.md (100%) rename {book => docs/book}/25-Patterns.md (100%) rename {book => docs/book}/Appendix-Becoming-a-Programmer.md (100%) rename {book => docs/book}/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md (100%) rename {book => docs/book}/Appendix-Collection-Topics.md (100%) rename {book => docs/book}/Appendix-Data-Compression.md (100%) rename {book => docs/book}/Appendix-IO-Streams.md (100%) rename {book => docs/book}/Appendix-Javadoc.md (100%) rename {book => docs/book}/Appendix-Low-Level-Concurrency.md (100%) rename {book => docs/book}/Appendix-New-IO.md (100%) rename {book => docs/book}/Appendix-Object-Serialization.md (100%) rename {book => docs/book}/Appendix-Passing-and-Returning-Objects.md (100%) rename {book => docs/book}/Appendix-Programming-Guidelines.md (100%) rename {book => docs/book}/Appendix-Standard-IO.md (100%) rename {book => docs/book}/Appendix-Supplements.md (100%) rename {book => docs/book}/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md (100%) rename {book => docs/book}/Appendix-Understanding-equals-and-hashCode.md (100%) rename GLOSSARY.md => docs/book/GLOSSARY.md (100%) rename {images => docs/images}/1545758268350.png (100%) rename {images => docs/images}/1545763399825.png (100%) rename {images => docs/images}/1545764724202.png (100%) rename {images => docs/images}/1545764780795.png (100%) rename {images => docs/images}/1545764820176.png (100%) rename {images => docs/images}/1545839316314.png (100%) rename {images => docs/images}/1545841270997.png (100%) rename {images => docs/images}/QQGroupQRCode.png (100%) rename {images => docs/images}/cover.jpg (100%) rename {images => docs/images}/cover_small.jpg (100%) rename {images => docs/images}/level_1_title.png (100%) rename {images => docs/images}/level_2_title.png (100%) rename {images => docs/images}/qqgroup.png (100%) rename {images => docs/images}/reader.png (100%) create mode 100644 docs/index.html diff --git a/README.md b/README.md index d431fb16..ca5b4239 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,19 @@ ## 书籍简介 -* 本书原作者为 \[美\] [Bruce Eckel](https://github.com/BruceEckel),即(*Thinking in Java 4th Edition,2006*)的作者。 +* 本书原作者为 \[美\] *Bruce Eckel*,即(*Thinking in Java 4th Edition,2006*)的作者。 * 本书是事实上的 *Thinking in Java 5th Edition*(*On Java 8,2017*)。 -* *Thinking in Java 4th Edition*基于 **JAVA 5**版本;*On Java 8*基于**JAVA 8**版本。 +* *Thinking in Java 4th Edition* 基于 **JAVA 5** 版本;*On Java 8* 基于 **JAVA 8** 版本。 ## 快速阅读传送门 -- GitHub 快速阅读:[进入目录](https://github.com/LingCoder/OnJava8/blob/master/SUMMARY.md) +- 推荐阅读:[进入](https://lingcoder.github.io/OnJava8/) + +- GitHub 目录阅读:[进入目录](https://github.com/LingCoder/OnJava8/blob/master/SUMMARY.md) - Gitee 快速阅读:[进入目录](https://gitee.com/lingcoder/OnJava8/blob/master/SUMMARY.md) -- GitBook 完整阅读:[进入Gitbook](https://lingcoder.gitbook.io/onjava8) ## 翻译进度 diff --git a/SUMMARY.md b/SUMMARY.md index 4f3d69a0..88d9f6a2 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,418 +1,414 @@ # Summary * [Introduction](README.md) -* [译者的话](Introduction.md) -* [封面](book/00-On-Java-8.md) -* [前言](book/00-Preface.md) - * [教学目标](book/00-Preface.md#教学目标) - * [语言设计错误](book/00-Preface.md#语言设计错误) - * [测试用例](book/00-Preface.md#测试用例) - * [普及性](book/00-Preface.md#普及性) - * [关于安卓](book/00-Preface.md#关于安卓) - * [电子版权声明](book/00-Preface.md#电子版权声明) - * [版本说明](book/00-Preface.md#版本说明) - * [封面设计](book/00-Preface.md#封面设计) - * [感谢的人](book/00-Preface.md#感谢的人) - * [献礼](book/00-Preface.md#献礼) -* [简介](book/00-Introduction.md) - * [前提条件](book/00-Introduction.md#前提条件) - * [JDK文档](book/00-Introduction.md#JDK文档) - * [C编程思想](book/00-Introduction.md#C编程思想) - * [源码下载](book/00-Introduction.md#源码下载) - * [编码样式](book/00-Introduction.md#编码样式) - * [BUG提交](book/00-Introduction.md#BUG提交) - * [邮箱订阅](book/00-Introduction.md#邮箱订阅) - * [Java图形界面](book/00-Introduction.md#Java图形界面) +* [译者的话](docs/README.md) +* [封面](docs/book/00-On-Java-8.md) +* [前言](docs/book/00-Preface.md) + * [教学目标](docs/book/00-Preface.md#教学目标) + * [语言设计错误](docs/book/00-Preface.md#语言设计错误) + * [测试用例](docs/book/00-Preface.md#测试用例) + * [普及性](docs/book/00-Preface.md#普及性) + * [关于安卓](docs/book/00-Preface.md#关于安卓) + * [电子版权声明](docs/book/00-Preface.md#电子版权声明) + * [版本说明](docs/book/00-Preface.md#版本说明) + * [封面设计](docs/book/00-Preface.md#封面设计) + * [感谢的人](docs/book/00-Preface.md#感谢的人) + * [献礼](docs/book/00-Preface.md#献礼) +* [简介](docs/book/00-Introduction.md) + * [前提条件](docs/book/00-Introduction.md#前提条件) + * [JDK文档](docs/book/00-Introduction.md#JDK文档) + * [C编程思想](docs/book/00-Introduction.md#C编程思想) + * [源码下载](docs/book/00-Introduction.md#源码下载) + * [编码样式](docs/book/00-Introduction.md#编码样式) + * [BUG提交](docs/book/00-Introduction.md#BUG提交) + * [邮箱订阅](docs/book/00-Introduction.md#邮箱订阅) + * [Java图形界面](docs/book/00-Introduction.md#Java图形界面) -### 正文 +* [第一章 对象的概念](docs/book/01-What-is-an-Object.md) + * [抽象](docs/book/01-What-is-an-Object.md#抽象) + * [接口](docs/book/01-What-is-an-Object.md#接口) + * [服务提供](docs/book/01-What-is-an-Object.md#服务提供) + * [封装](docs/book/01-What-is-an-Object.md#封装) + * [复用](docs/book/01-What-is-an-Object.md#复用) + * [继承](docs/book/01-What-is-an-Object.md#继承) + * [多态](docs/book/01-What-is-an-Object.md#多态) + * [单继承](docs/book/01-What-is-an-Object.md#单继承) + * [集合](docs/book/01-What-is-an-Object.md#集合) + * [生命周期](docs/book/01-What-is-an-Object.md#生命周期) + * [异常处理](docs/book/01-What-is-an-Object.md#异常处理) + * [本章小结](docs/book/01-What-is-an-Object.md#本章小结) +* [第二章 安装Java和本书用例](docs/book/02-Installing-Java-and-the-Book-Examples.md) + * [编辑器](docs/book/02-Installing-Java-and-the-Book-Examples.md#编辑器) + * [Shell](docs/book/02-Installing-Java-and-the-Book-Examples.md#Shell) + * [Java安装](docs/book/02-Installing-Java-and-the-Book-Examples.md#Java安装) + * [校验安装](docs/book/02-Installing-Java-and-the-Book-Examples.md#校验安装) + * [安装和运行代码示例](docs/book/02-Installing-Java-and-the-Book-Examples.md#安装和运行代码示例) +* [第三章 万物皆对象](docs/book/03-Objects-Everywhere.md) + * [对象操纵](docs/book/03-Objects-Everywhere.md#对象操纵) + * [对象创建](docs/book/03-Objects-Everywhere.md#对象创建) + * [代码注释](docs/book/03-Objects-Everywhere.md#代码注释) + * [对象清理](docs/book/03-Objects-Everywhere.md#对象清理) + * [类的创建](docs/book/03-Objects-Everywhere.md#类的创建) + * [程序编写](docs/book/03-Objects-Everywhere.md#程序编写) + * [小试牛刀](docs/book/03-Objects-Everywhere.md#小试牛刀) + * [编码风格](docs/book/03-Objects-Everywhere.md#编码风格) + * [本章小结](docs/book/03-Objects-Everywhere.md#本章小结) +* [第四章 运算符](docs/book/04-Operators.md) + * [使用说明](docs/book/04-Operators.md#使用说明) + * [优先级](docs/book/04-Operators.md#优先级) + * [赋值](docs/book/04-Operators.md#赋值) + * [算术运算符](docs/book/04-Operators.md#算术运算符) + * [递增和递减](docs/book/04-Operators.md#递增和递减) + * [关系运算符](docs/book/04-Operators.md#关系运算符) + * [逻辑运算符](docs/book/04-Operators.md#逻辑运算符) + * [字面值常量](docs/book/04-Operators.md#字面值常量) + * [按位运算符](docs/book/04-Operators.md#按位运算符) + * [移位运算符](docs/book/04-Operators.md#移位运算符) + * [三元运算符](docs/book/04-Operators.md#三元运算符) + * [字符串运算符](docs/book/04-Operators.md#字符串运算符) + * [常见陷阱](docs/book/04-Operators.md#常见陷阱) + * [类型转换](docs/book/04-Operators.md#类型转换) + * [Java没有sizeof](docs/book/04-Operators.md#Java没有sizeof) + * [运算符总结](docs/book/04-Operators.md#运算符总结) + * [本章小结](docs/book/04-Operators.md#本章小结) +* [第五章 控制流](docs/book/05-Control-Flow.md) + * [true和flase](docs/book/05-Control-Flow.md#true和flase) + * [if-else](docs/book/05-Control-Flow.md#if-else) + * [迭代语句](docs/book/05-Control-Flow.md#迭代语句) + * [for-in语法](docs/book/05-Control-Flow.md#for-in语法) + * [return](docs/book/05-Control-Flow.md#return) + * [break和continue](docs/book/05-Control-Flow.md#break和continue) + * [臭名昭著的goto](docs/book/05-Control-Flow.md#臭名昭著的goto) + * [switch](docs/book/05-Control-Flow.md#switch) + * [switch字符串](docs/book/05-Control-Flow.md#switch字符串) + * [本章小结](docs/book/05-Control-Flow.md#本章小结) +* [第六章 初始化和清理](docs/book/06-Housekeeping.md) + * [利用构造器保证初始化](docs/book/06-Housekeeping.md#利用构造器保证初始化) + * [方法重载](docs/book/06-Housekeeping.md#方法重载) + * [无参构造器](docs/book/06-Housekeeping.md#无参构造器) + * [this关键字](docs/book/06-Housekeeping.md#this关键字) + * [垃圾回收器](docs/book/06-Housekeeping.md#垃圾回收器) + * [成员初始化](docs/book/06-Housekeeping.md#成员初始化) + * [构造器初始化](docs/book/06-Housekeeping.md#构造器初始化) + * [数组初始化](docs/book/06-Housekeeping.md#数组初始化) + * [枚举类型](docs/book/06-Housekeeping.md#枚举类型) + * [本章小结](docs/book/06-Housekeeping.md#本章小结) +* [第七章 封装](docs/book/07-Implementation-Hiding.md) + * [包的概念](docs/book/07-Implementation-Hiding.md#包的概念) + * [访问权限修饰符](docs/book/07-Implementation-Hiding.md#访问权限修饰符) + * [接口和实现](docs/book/07-Implementation-Hiding.md#接口和实现) + * [类访问权限](docs/book/07-Implementation-Hiding.md#类访问权限) + * [本章小结](docs/book/07-Implementation-Hiding.md#本章小结) +* [第八章 复用](docs/book/08-Reuse.md) + * [组合语法](docs/book/08-Reuse.md#组合语法) + * [继承语法](docs/book/08-Reuse.md#继承语法) + * [委托](docs/book/08-Reuse.md#委托) + * [结合组合与继承](docs/book/08-Reuse.md#结合组合与继承) + * [组合与继承的选择](docs/book/08-Reuse.md#组合与继承的选择) + * [protected](docs/book/08-Reuse.md#protected) + * [向上转型](docs/book/08-Reuse.md#向上转型) + * [final关键字](docs/book/08-Reuse.md#final关键字) + * [类初始化和加载](docs/book/08-Reuse.md#类初始化和加载) + * [本章小结](docs/book/08-Reuse.md#本章小结) +* [第九章 多态](docs/book/09-Polymorphism.md) + * [向上转型回溯](docs/book/09-Polymorphism.md#向上转型回溯) + * [深入理解](docs/book/09-Polymorphism.md#深入理解) + * [构造器和多态](docs/book/09-Polymorphism.md#构造器和多态) + * [返回类型协变](docs/book/09-Polymorphism.md#返回类型协变) + * [使用继承设计](docs/book/09-Polymorphism.md#使用继承设计) + * [本章小结](docs/book/09-Polymorphism.md#本章小结) +* [第十章 接口](docs/book/10-Interfaces.md) + * [抽象类和方法](docs/book/10-Interfaces.md#抽象类和方法) + * [接口创建](docs/book/10-Interfaces.md#接口创建) + * [抽象类和接口](docs/book/10-Interfaces.md#抽象类和接口) + * [完全解耦](docs/book/10-Interfaces.md#完全解耦) + * [多接口结合](docs/book/10-Interfaces.md#多接口结合) + * [使用继承扩展接口](docs/book/10-Interfaces.md#使用继承扩展接口) + * [接口适配](docs/book/10-Interfaces.md#接口适配) + * [接口字段](docs/book/10-Interfaces.md#接口字段) + * [接口嵌套](docs/book/10-Interfaces.md#接口嵌套) + * [接口和工厂方法模式](docs/book/10-Interfaces.md#接口和工厂方法模式) + * [本章小结](docs/book/10-Interfaces.md#本章小结) +* [第十一章 内部类](docs/book/11-Inner-Classes.md) + * [创建内部类](docs/book/11-Inner-Classes.md#创建内部类) + * [链接外部类](docs/book/11-Inner-Classes.md#链接外部类) + * [内部类this和new的使用](docs/book/11-Inner-Classes.md#内部类this和new的使用) + * [内部类向上转型](docs/book/11-Inner-Classes.md#内部类向上转型) + * [内部类方法和作用域](docs/book/11-Inner-Classes.md#内部类方法和作用域) + * [匿名内部类](docs/book/11-Inner-Classes.md#匿名内部类) + * [嵌套类](docs/book/11-Inner-Classes.md#嵌套类) + * [内部类应用场景](docs/book/11-Inner-Classes.md#内部类应用场景) + * [继承内部类](docs/book/11-Inner-Classes.md#继承内部类) + * [重写内部类](docs/book/11-Inner-Classes.md#重写内部类) + * [内部类局部变量](docs/book/11-Inner-Classes.md#内部类局部变量) + * [内部类标识符](docs/book/11-Inner-Classes.md#内部类标识符) + * [本章小结](docs/book/11-Inner-Classes.md#本章小结) +* [第十二章 集合](docs/book/12-Collections.md) + * [泛型和类型安全的集合](docs/book/12-Collections.md#泛型和类型安全的集合) + * [基本概念](docs/book/12-Collections.md#基本概念) + * [添加元素组](docs/book/12-Collections.md#添加元素组) + * [集合的打印](docs/book/12-Collections.md#集合的打印) + * [列表List](docs/book/12-Collections.md#列表List) + * [迭代器Iterators](docs/book/12-Collections.md#迭代器Iterators) + * [链表LinkedList](docs/book/12-Collections.md#链表LinkedList) + * [堆栈Stack](docs/book/12-Collections.md#堆栈Stack) + * [集合Set](docs/book/12-Collections.md#集合Set) + * [映射Map](docs/book/12-Collections.md#映射Map) + * [队列Queue](docs/book/12-Collections.md#队列Queue) + * [集合与迭代器](docs/book/12-Collections.md#集合与迭代器) + * [for-in和迭代器](docs/book/12-Collections.md#for-in和迭代器) + * [本章小结](docs/book/12-Collections.md#本章小结) +* [第十三章 函数式编程](docs/book/13-Functional-Programming.md) + * [旧vs新](docs/book/13-Functional-Programming.md#旧vs新) + * [Lambda表达式](docs/book/13-Functional-Programming.md#Lambda表达式) + * [方法引用](docs/book/13-Functional-Programming.md#方法引用) + * [函数式接口](docs/book/13-Functional-Programming.md#函数式接口) + * [高阶函数](docs/book/13-Functional-Programming.md#高阶函数) + * [闭包](docs/book/13-Functional-Programming.md#闭包) + * [函数组合](docs/book/13-Functional-Programming.md#函数组合) + * [Currying和Partial-Evaluation](docs/book/13-Functional-Programming.md#Currying和Partial-Evaluation) + * [纯函数式编程](docs/book/13-Functional-Programming.md#纯函数式编程) + * [本章小结](docs/book/13-Functional-Programming.md#本章小结) +* [第十四章 流式编程](docs/book/14-Streams.md) + * [流支持](docs/book/14-Streams.md#流支持) + * [流创建](docs/book/14-Streams.md#流创建) + * [中级流操作](docs/book/14-Streams.md#中级流操作) + * [Optional类](docs/book/14-Streams.md#Optional类) + * [终端操作](docs/book/14-Streams.md#终端操作) + * [本章小结](docs/book/14-Streams.md#本章小结) +* [第十五章 异常](docs/book/15-Exceptions.md) + * [异常概念](docs/book/15-Exceptions.md#异常概念) + * [基本异常](docs/book/15-Exceptions.md#基本异常) + * [异常捕获](docs/book/15-Exceptions.md#异常捕获) + * [自定义异常](docs/book/15-Exceptions.md#自定义异常) + * [异常规范](docs/book/15-Exceptions.md#异常规范) + * [任意异常捕获](docs/book/15-Exceptions.md#任意异常捕获) + * [Java标准异常](docs/book/15-Exceptions.md#Java标准异常) + * [finally关键字](docs/book/15-Exceptions.md#finally关键字) + * [异常限制](docs/book/15-Exceptions.md#异常限制) + * [异常构造](docs/book/15-Exceptions.md#异常构造) + * [Try-With-Resources用法](docs/book/15-Exceptions.md#Try-With-Resources用法) + * [异常匹配](docs/book/15-Exceptions.md#异常匹配) + * [异常准则](docs/book/15-Exceptions.md#异常准则) + * [异常指南](docs/book/15-Exceptions.md#异常指南) + * [本章小结](docs/book/15-Exceptions.md#本章小结) +* [第十六章 代码校验](docs/book/16-Validating-Your-Code.md) + * [测试](docs/book/16-Validating-Your-Code.md#测试) + * [前提条件](docs/book/16-Validating-Your-Code.md#前提条件) + * [测试驱动开发](docs/book/16-Validating-Your-Code.md#测试驱动开发) + * [日志](docs/book/16-Validating-Your-Code.md#日志) + * [调试](docs/book/16-Validating-Your-Code.md#调试) + * [基准测试](docs/book/16-Validating-Your-Code.md#基准测试) + * [分析和优化](docs/book/16-Validating-Your-Code.md#分析和优化) + * [风格检测](docs/book/16-Validating-Your-Code.md#风格检测) + * [静态错误分析](docs/book/16-Validating-Your-Code.md#静态错误分析) + * [代码重审](docs/book/16-Validating-Your-Code.md#代码重审) + * [结对编程](docs/book/16-Validating-Your-Code.md#结对编程) + * [重构](docs/book/16-Validating-Your-Code.md#重构) + * [持续集成](docs/book/16-Validating-Your-Code.md#持续集成) + * [本章小结](docs/book/16-Validating-Your-Code.md#本章小结) +* [第十七章 文件](docs/book/17-Files.md) + * [文件和目录路径](docs/book/17-Files.md#文件和目录路径) + * [目录](docs/book/17-Files.md#目录) + * [文件系统](docs/book/17-Files.md#文件系统) + * [路径监听](docs/book/17-Files.md#路径监听) + * [文件查找](docs/book/17-Files.md#文件查找) + * [文件读写](docs/book/17-Files.md#文件读写) + * [本章小结](docs/book/17-Files.md#本章小结) +* [第十八章 字符串](docs/book/18-Strings.md) + * [字符串的不可变](docs/book/18-Strings.md#字符串的不可变) + * [重载和StringBuilder](docs/book/18-Strings.md#重载和StringBuilder) + * [意外递归](docs/book/18-Strings.md#意外递归) + * [字符串操作](docs/book/18-Strings.md#字符串操作) + * [格式化输出](docs/book/18-Strings.md#格式化输出) + * [常规表达式](docs/book/18-Strings.md#常规表达式) + * [扫描输入](docs/book/18-Strings.md#扫描输入) + * [StringTokenizer类](docs/book/18-Strings.md#StringTokenizer类) + * [本章小结](docs/book/18-Strings.md#本章小结) +* [第十九章 类型信息](docs/book/19-Type-Information.md) + * [运行时类型信息](docs/book/19-Type-Information.md#运行时类型信息) + * [类的对象](docs/book/19-Type-Information.md#类的对象) + * [类型转换检测](docs/book/19-Type-Information.md#类型转换检测) + * [注册工厂](docs/book/19-Type-Information.md#注册工厂) + * [类的等价比较](docs/book/19-Type-Information.md#类的等价比较) + * [反射运行时类信息](docs/book/19-Type-Information.md#反射运行时类信息) + * [动态代理](docs/book/19-Type-Information.md#动态代理) + * [Optional类](docs/book/19-Type-Information.md#Optional类) + * [接口和类型](docs/book/19-Type-Information.md#接口和类型) + * [本章小结](docs/book/19-Type-Information.md#本章小结) +* [第二十章 泛型](docs/book/20-Generics.md) + * [简单泛型](docs/book/20-Generics.md#简单泛型) + * [泛型接口](docs/book/20-Generics.md#泛型接口) + * [泛型方法](docs/book/20-Generics.md#泛型方法) + * [复杂模型构建](docs/book/20-Generics.md#复杂模型构建) + * [泛型擦除](docs/book/20-Generics.md#泛型擦除) + * [补偿擦除](docs/book/20-Generics.md#补偿擦除) + * [边界](docs/book/20-Generics.md#边界) + * [通配符](docs/book/20-Generics.md#通配符) + * [问题](docs/book/20-Generics.md#问题) + * [自我约束类型](docs/book/20-Generics.md#自我约束类型) + * [动态类型安全](docs/book/20-Generics.md#动态类型安全) + * [泛型异常](docs/book/20-Generics.md#泛型异常) + * [混入](docs/book/20-Generics.md#混入) + * [潜在类型](docs/book/20-Generics.md#潜在类型) + * [补偿不足](docs/book/20-Generics.md#补偿不足) + * [辅助潜在类型](docs/book/20-Generics.md#辅助潜在类型) + * [泛型的优劣](docs/book/20-Generics.md#泛型的优劣) +* [第二十一章 数组](docs/book/21-Arrays.md) + * [数组特性](docs/book/21-Arrays.md#数组特性) + * [一等对象](docs/book/21-Arrays.md#一等对象) + * [返回数组](docs/book/21-Arrays.md#返回数组) + * [多维数组](docs/book/21-Arrays.md#多维数组) + * [泛型数组](docs/book/21-Arrays.md#泛型数组) + * [Arrays的fill方法](docs/book/21-Arrays.md#Arrays的fill方法) + * [Arrays的setAll方法](docs/book/21-Arrays.md#Arrays的setAll方法) + * [增量生成](docs/book/21-Arrays.md#增量生成) + * [随机生成](docs/book/21-Arrays.md#随机生成) + * [泛型和基本数组](docs/book/21-Arrays.md#泛型和基本数组) + * [数组元素修改](docs/book/21-Arrays.md#数组元素修改) + * [数组并行](docs/book/21-Arrays.md#数组并行) + * [Arrays工具类](docs/book/21-Arrays.md#Arrays工具类) + * [数组拷贝](docs/book/21-Arrays.md#数组拷贝) + * [数组比较](docs/book/21-Arrays.md#数组比较) + * [流和数组](docs/book/21-Arrays.md#流和数组) + * [数组排序](docs/book/21-Arrays.md#数组排序) + * [binarySearch二分查找](docs/book/21-Arrays.md#binarySearch二分查找) + * [parallelPrefix并行前缀](docs/book/21-Arrays.md#parallelPrefix并行前缀) + * [本章小结](docs/book/21-Arrays.md#本章小结) +* [第二十二章 枚举](docs/book/22-Enumerations.md) + * [基本功能](docs/book/22-Enumerations.md#基本功能) + * [方法添加](docs/book/22-Enumerations.md#方法添加) + * [switch语句](docs/book/22-Enumerations.md#switch语句) + * [values方法](docs/book/22-Enumerations.md#values方法) + * [实现而非继承](docs/book/22-Enumerations.md#实现而非继承) + * [随机选择](docs/book/22-Enumerations.md#随机选择) + * [使用接口组织](docs/book/22-Enumerations.md#使用接口组织) + * [使用EnumSet替代Flags](docs/book/22-Enumerations.md#使用EnumSet替代Flags) + * [使用EnumMap](docs/book/22-Enumerations.md#使用EnumMap) + * [常量特定方法](docs/book/22-Enumerations.md#常量特定方法) + * [多次调度](docs/book/22-Enumerations.md#多次调度) + * [本章小结](docs/book/22-Enumerations.md#本章小结) +* [第二十三章 注解](docs/book/23-Annotations.md) + * [基本语法](docs/book/23-Annotations.md#基本语法) + * [编写注解处理器](docs/book/23-Annotations.md#编写注解处理器) + * [使用javac处理注解](docs/book/23-Annotations.md#使用javac处理注解) + * [基于注解的单元测试](docs/book/23-Annotations.md#基于注解的单元测试) + * [本章小结](docs/book/23-Annotations.md#本章小结) +* [第二十四章 并发编程](docs/book/24-Concurrent-Programming.md) + * [术语问题](docs/book/24-Concurrent-Programming.md#术语问题) + * [并发的超能力](docs/book/24-Concurrent-Programming.md#并发的超能力) + * [针对速度](docs/book/24-Concurrent-Programming.md#针对速度) + * [四句格言](docs/book/24-Concurrent-Programming.md#四句格言) + * [残酷的真相](docs/book/24-Concurrent-Programming.md#残酷的真相) + * [本章其余部分](docs/book/24-Concurrent-Programming.md#本章其余部分) + * [并行流](docs/book/24-Concurrent-Programming.md#并行流) + * [创建和运行任务](docs/book/24-Concurrent-Programming.md#创建和运行任务) + * [终止耗时任务](docs/book/24-Concurrent-Programming.md#终止耗时任务) + * [CompletableFuture类](docs/book/24-Concurrent-Programming.md#CompletableFuture类) + * [死锁](docs/book/24-Concurrent-Programming.md#死锁) + * [构造函数非线程安全](docs/book/24-Concurrent-Programming.md#构造函数非线程安全) + * [复杂性和代价](docs/book/24-Concurrent-Programming.md#复杂性和代价) + * [本章小结](docs/book/24-Concurrent-Programming.md#本章小结) +* [第二十五章 设计模式](docs/book/25-Patterns.md) + * [概念](docs/book/25-Patterns.md#概念) + * [构建型](docs/book/25-Patterns.md#构建型) + * [面向实施](docs/book/25-Patterns.md#面向实施) + * [工厂模式](docs/book/25-Patterns.md#工厂模式) + * [函数对象](docs/book/25-Patterns.md#函数对象) + * [接口改变](docs/book/25-Patterns.md#接口改变) + * [解释器](docs/book/25-Patterns.md#解释器) + * [回调](docs/book/25-Patterns.md#回调) + * [多次调度](docs/book/25-Patterns.md#多次调度) + * [模式重构](docs/book/25-Patterns.md#模式重构) + * [抽象用法](docs/book/25-Patterns.md#抽象用法) + * [多次派遣](docs/book/25-Patterns.md#多次派遣) + * [访问者模式](docs/book/25-Patterns.md#访问者模式) + * [RTTI的优劣](docs/book/25-Patterns.md#RTTI的优劣) + * [本章小结](docs/book/25-Patterns.md#本章小结) -* [第一章 对象的概念](book/01-What-is-an-Object.md) - * [抽象](book/01-What-is-an-Object.md#抽象) - * [接口](book/01-What-is-an-Object.md#接口) - * [服务提供](book/01-What-is-an-Object.md#服务提供) - * [封装](book/01-What-is-an-Object.md#封装) - * [复用](book/01-What-is-an-Object.md#复用) - * [继承](book/01-What-is-an-Object.md#继承) - * [多态](book/01-What-is-an-Object.md#多态) - * [单继承](book/01-What-is-an-Object.md#单继承) - * [集合](book/01-What-is-an-Object.md#集合) - * [生命周期](book/01-What-is-an-Object.md#生命周期) - * [异常处理](book/01-What-is-an-Object.md#异常处理) - * [本章小结](book/01-What-is-an-Object.md#本章小结) -* [第二章 安装Java和本书用例](book/02-Installing-Java-and-the-Book-Examples.md) - * [编辑器](book/02-Installing-Java-and-the-Book-Examples.md#编辑器) - * [Shell](book/02-Installing-Java-and-the-Book-Examples.md#Shell) - * [Java安装](book/02-Installing-Java-and-the-Book-Examples.md#Java安装) - * [校验安装](book/02-Installing-Java-and-the-Book-Examples.md#校验安装) - * [安装和运行代码示例](book/02-Installing-Java-and-the-Book-Examples.md#安装和运行代码示例) -* [第三章 万物皆对象](book/03-Objects-Everywhere.md) - * [对象操纵](book/03-Objects-Everywhere.md#对象操纵) - * [对象创建](book/03-Objects-Everywhere.md#对象创建) - * [代码注释](book/03-Objects-Everywhere.md#代码注释) - * [对象清理](book/03-Objects-Everywhere.md#对象清理) - * [类的创建](book/03-Objects-Everywhere.md#类的创建) - * [程序编写](book/03-Objects-Everywhere.md#程序编写) - * [小试牛刀](book/03-Objects-Everywhere.md#小试牛刀) - * [编码风格](book/03-Objects-Everywhere.md#编码风格) - * [本章小结](book/03-Objects-Everywhere.md#本章小结) -* [第四章 运算符](book/04-Operators.md) - * [使用说明](book/04-Operators.md#使用说明) - * [优先级](book/04-Operators.md#优先级) - * [赋值](book/04-Operators.md#赋值) - * [算术运算符](book/04-Operators.md#算术运算符) - * [递增和递减](book/04-Operators.md#递增和递减) - * [关系运算符](book/04-Operators.md#关系运算符) - * [逻辑运算符](book/04-Operators.md#逻辑运算符) - * [字面值常量](book/04-Operators.md#字面值常量) - * [按位运算符](book/04-Operators.md#按位运算符) - * [移位运算符](book/04-Operators.md#移位运算符) - * [三元运算符](book/04-Operators.md#三元运算符) - * [字符串运算符](book/04-Operators.md#字符串运算符) - * [常见陷阱](book/04-Operators.md#常见陷阱) - * [类型转换](book/04-Operators.md#类型转换) - * [Java没有sizeof](book/04-Operators.md#Java没有sizeof) - * [运算符总结](book/04-Operators.md#运算符总结) - * [本章小结](book/04-Operators.md#本章小结) -* [第五章 控制流](book/05-Control-Flow.md) - * [true和flase](book/05-Control-Flow.md#true和flase) - * [if-else](book/05-Control-Flow.md#if-else) - * [迭代语句](book/05-Control-Flow.md#迭代语句) - * [for-in语法](book/05-Control-Flow.md#for-in语法) - * [return](book/05-Control-Flow.md#return) - * [break和continue](book/05-Control-Flow.md#break和continue) - * [臭名昭著的goto](book/05-Control-Flow.md#臭名昭著的goto) - * [switch](book/05-Control-Flow.md#switch) - * [switch字符串](book/05-Control-Flow.md#switch字符串) - * [本章小结](book/05-Control-Flow.md#本章小结) -* [第六章 初始化和清理](book/06-Housekeeping.md) - * [利用构造器保证初始化](book/06-Housekeeping.md#利用构造器保证初始化) - * [方法重载](book/06-Housekeeping.md#方法重载) - * [无参构造器](book/06-Housekeeping.md#无参构造器) - * [this关键字](book/06-Housekeeping.md#this关键字) - * [垃圾回收器](book/06-Housekeeping.md#垃圾回收器) - * [成员初始化](book/06-Housekeeping.md#成员初始化) - * [构造器初始化](book/06-Housekeeping.md#构造器初始化) - * [数组初始化](book/06-Housekeeping.md#数组初始化) - * [枚举类型](book/06-Housekeeping.md#枚举类型) - * [本章小结](book/06-Housekeeping.md#本章小结) -* [第七章 封装](book/07-Implementation-Hiding.md) - * [包的概念](book/07-Implementation-Hiding.md#包的概念) - * [访问权限修饰符](book/07-Implementation-Hiding.md#访问权限修饰符) - * [接口和实现](book/07-Implementation-Hiding.md#接口和实现) - * [类访问权限](book/07-Implementation-Hiding.md#类访问权限) - * [本章小结](book/07-Implementation-Hiding.md#本章小结) -* [第八章 复用](book/08-Reuse.md) - * [组合语法](book/08-Reuse.md#组合语法) - * [继承语法](book/08-Reuse.md#继承语法) - * [委托](book/08-Reuse.md#委托) - * [结合组合与继承](book/08-Reuse.md#结合组合与继承) - * [组合与继承的选择](book/08-Reuse.md#组合与继承的选择) - * [protected](book/08-Reuse.md#protected) - * [向上转型](book/08-Reuse.md#向上转型) - * [final关键字](book/08-Reuse.md#final关键字) - * [类初始化和加载](book/08-Reuse.md#类初始化和加载) - * [本章小结](book/08-Reuse.md#本章小结) -* [第九章 多态](book/09-Polymorphism.md) - * [向上转型回溯](book/09-Polymorphism.md#向上转型回溯) - * [深入理解](book/09-Polymorphism.md#深入理解) - * [构造器和多态](book/09-Polymorphism.md#构造器和多态) - * [返回类型协变](book/09-Polymorphism.md#返回类型协变) - * [使用继承设计](book/09-Polymorphism.md#使用继承设计) - * [本章小结](book/09-Polymorphism.md#本章小结) -* [第十章 接口](book/10-Interfaces.md) - * [抽象类和方法](book/10-Interfaces.md#抽象类和方法) - * [接口创建](book/10-Interfaces.md#接口创建) - * [抽象类和接口](book/10-Interfaces.md#抽象类和接口) - * [完全解耦](book/10-Interfaces.md#完全解耦) - * [多接口结合](book/10-Interfaces.md#多接口结合) - * [使用继承扩展接口](book/10-Interfaces.md#使用继承扩展接口) - * [接口适配](book/10-Interfaces.md#接口适配) - * [接口字段](book/10-Interfaces.md#接口字段) - * [接口嵌套](book/10-Interfaces.md#接口嵌套) - * [接口和工厂方法模式](book/10-Interfaces.md#接口和工厂方法模式) - * [本章小结](book/10-Interfaces.md#本章小结) -* [第十一章 内部类](book/11-Inner-Classes.md) - * [创建内部类](book/11-Inner-Classes.md#创建内部类) - * [链接外部类](book/11-Inner-Classes.md#链接外部类) - * [内部类this和new的使用](book/11-Inner-Classes.md#内部类this和new的使用) - * [内部类向上转型](book/11-Inner-Classes.md#内部类向上转型) - * [内部类方法和作用域](book/11-Inner-Classes.md#内部类方法和作用域) - * [匿名内部类](book/11-Inner-Classes.md#匿名内部类) - * [嵌套类](book/11-Inner-Classes.md#嵌套类) - * [内部类应用场景](book/11-Inner-Classes.md#内部类应用场景) - * [继承内部类](book/11-Inner-Classes.md#继承内部类) - * [重写内部类](book/11-Inner-Classes.md#重写内部类) - * [内部类局部变量](book/11-Inner-Classes.md#内部类局部变量) - * [内部类标识符](book/11-Inner-Classes.md#内部类标识符) - * [本章小结](book/11-Inner-Classes.md#本章小结) -* [第十二章 集合](book/12-Collections.md) - * [泛型和类型安全的集合](book/12-Collections.md#泛型和类型安全的集合) - * [基本概念](book/12-Collections.md#基本概念) - * [添加元素组](book/12-Collections.md#添加元素组) - * [集合的打印](book/12-Collections.md#集合的打印) - * [列表List](book/12-Collections.md#列表List) - * [迭代器Iterators](book/12-Collections.md#迭代器Iterators) - * [链表LinkedList](book/12-Collections.md#链表LinkedList) - * [堆栈Stack](book/12-Collections.md#堆栈Stack) - * [集合Set](book/12-Collections.md#集合Set) - * [映射Map](book/12-Collections.md#映射Map) - * [队列Queue](book/12-Collections.md#队列Queue) - * [集合与迭代器](book/12-Collections.md#集合与迭代器) - * [for-in和迭代器](book/12-Collections.md#for-in和迭代器) - * [本章小结](book/12-Collections.md#本章小结) -* [第十三章 函数式编程](book/13-Functional-Programming.md) - * [旧vs新](book/13-Functional-Programming.md#旧vs新) - * [Lambda表达式](book/13-Functional-Programming.md#Lambda表达式) - * [方法引用](book/13-Functional-Programming.md#方法引用) - * [函数式接口](book/13-Functional-Programming.md#函数式接口) - * [高阶函数](book/13-Functional-Programming.md#高阶函数) - * [闭包](book/13-Functional-Programming.md#闭包) - * [函数组合](book/13-Functional-Programming.md#函数组合) - * [Currying和Partial-Evaluation](book/13-Functional-Programming.md#Currying和Partial-Evaluation) - * [纯函数式编程](book/13-Functional-Programming.md#纯函数式编程) - * [本章小结](book/13-Functional-Programming.md#本章小结) -* [第十四章 流式编程](book/14-Streams.md) - * [流支持](book/14-Streams.md#流支持) - * [流创建](book/14-Streams.md#流创建) - * [中级流操作](book/14-Streams.md#中级流操作) - * [Optional类](book/14-Streams.md#Optional类) - * [终端操作](book/14-Streams.md#终端操作) - * [本章小结](book/14-Streams.md#本章小结) -* [第十五章 异常](book/15-Exceptions.md) - * [异常概念](book/15-Exceptions.md#异常概念) - * [基本异常](book/15-Exceptions.md#基本异常) - * [异常捕获](book/15-Exceptions.md#异常捕获) - * [自定义异常](book/15-Exceptions.md#自定义异常) - * [异常规范](book/15-Exceptions.md#异常规范) - * [任意异常捕获](book/15-Exceptions.md#任意异常捕获) - * [Java标准异常](book/15-Exceptions.md#Java标准异常) - * [finally关键字](book/15-Exceptions.md#finally关键字) - * [异常限制](book/15-Exceptions.md#异常限制) - * [异常构造](book/15-Exceptions.md#异常构造) - * [Try-With-Resources用法](book/15-Exceptions.md#Try-With-Resources用法) - * [异常匹配](book/15-Exceptions.md#异常匹配) - * [异常准则](book/15-Exceptions.md#异常准则) - * [异常指南](book/15-Exceptions.md#异常指南) - * [本章小结](book/15-Exceptions.md#本章小结) -* [第十六章 代码校验](book/16-Validating-Your-Code.md) - * [测试](book/16-Validating-Your-Code.md#测试) - * [前提条件](book/16-Validating-Your-Code.md#前提条件) - * [测试驱动开发](book/16-Validating-Your-Code.md#测试驱动开发) - * [日志](book/16-Validating-Your-Code.md#日志) - * [调试](book/16-Validating-Your-Code.md#调试) - * [基准测试](book/16-Validating-Your-Code.md#基准测试) - * [分析和优化](book/16-Validating-Your-Code.md#分析和优化) - * [风格检测](book/16-Validating-Your-Code.md#风格检测) - * [静态错误分析](book/16-Validating-Your-Code.md#静态错误分析) - * [代码重审](book/16-Validating-Your-Code.md#代码重审) - * [结对编程](book/16-Validating-Your-Code.md#结对编程) - * [重构](book/16-Validating-Your-Code.md#重构) - * [持续集成](book/16-Validating-Your-Code.md#持续集成) - * [本章小结](book/16-Validating-Your-Code.md#本章小结) -* [第十七章 文件](book/17-Files.md) - * [文件和目录路径](book/17-Files.md#文件和目录路径) - * [目录](book/17-Files.md#目录) - * [文件系统](book/17-Files.md#文件系统) - * [路径监听](book/17-Files.md#路径监听) - * [文件查找](book/17-Files.md#文件查找) - * [文件读写](book/17-Files.md#文件读写) - * [本章小结](book/17-Files.md#本章小结) -* [第十八章 字符串](book/18-Strings.md) - * [字符串的不可变](book/18-Strings.md#字符串的不可变) - * [重载和StringBuilder](book/18-Strings.md#重载和StringBuilder) - * [意外递归](book/18-Strings.md#意外递归) - * [字符串操作](book/18-Strings.md#字符串操作) - * [格式化输出](book/18-Strings.md#格式化输出) - * [常规表达式](book/18-Strings.md#常规表达式) - * [扫描输入](book/18-Strings.md#扫描输入) - * [StringTokenizer类](book/18-Strings.md#StringTokenizer类) - * [本章小结](book/18-Strings.md#本章小结) -* [第十九章 类型信息](book/19-Type-Information.md) - * [运行时类型信息](book/19-Type-Information.md#运行时类型信息) - * [类的对象](book/19-Type-Information.md#类的对象) - * [类型转换检测](book/19-Type-Information.md#类型转换检测) - * [注册工厂](book/19-Type-Information.md#注册工厂) - * [类的等价比较](book/19-Type-Information.md#类的等价比较) - * [反射运行时类信息](book/19-Type-Information.md#反射运行时类信息) - * [动态代理](book/19-Type-Information.md#动态代理) - * [Optional类](book/19-Type-Information.md#Optional类) - * [接口和类型](book/19-Type-Information.md#接口和类型) - * [本章小结](book/19-Type-Information.md#本章小结) -* [第二十章 泛型](book/20-Generics.md) - * [简单泛型](book/20-Generics.md#简单泛型) - * [泛型接口](book/20-Generics.md#泛型接口) - * [泛型方法](book/20-Generics.md#泛型方法) - * [复杂模型构建](book/20-Generics.md#复杂模型构建) - * [泛型擦除](book/20-Generics.md#泛型擦除) - * [补偿擦除](book/20-Generics.md#补偿擦除) - * [边界](book/20-Generics.md#边界) - * [通配符](book/20-Generics.md#通配符) - * [问题](book/20-Generics.md#问题) - * [自我约束类型](book/20-Generics.md#自我约束类型) - * [动态类型安全](book/20-Generics.md#动态类型安全) - * [泛型异常](book/20-Generics.md#泛型异常) - * [混入](book/20-Generics.md#混入) - * [潜在类型](book/20-Generics.md#潜在类型) - * [补偿不足](book/20-Generics.md#补偿不足) - * [辅助潜在类型](book/20-Generics.md#辅助潜在类型) - * [泛型的优劣](book/20-Generics.md#泛型的优劣) -* [第二十一章 数组](book/21-Arrays.md) - * [数组特性](book/21-Arrays.md#数组特性) - * [一等对象](book/21-Arrays.md#一等对象) - * [返回数组](book/21-Arrays.md#返回数组) - * [多维数组](book/21-Arrays.md#多维数组) - * [泛型数组](book/21-Arrays.md#泛型数组) - * [Arrays的fill方法](book/21-Arrays.md#Arrays的fill方法) - * [Arrays的setAll方法](book/21-Arrays.md#Arrays的setAll方法) - * [增量生成](book/21-Arrays.md#增量生成) - * [随机生成](book/21-Arrays.md#随机生成) - * [泛型和基本数组](book/21-Arrays.md#泛型和基本数组) - * [数组元素修改](book/21-Arrays.md#数组元素修改) - * [数组并行](book/21-Arrays.md#数组并行) - * [Arrays工具类](book/21-Arrays.md#Arrays工具类) - * [数组拷贝](book/21-Arrays.md#数组拷贝) - * [数组比较](book/21-Arrays.md#数组比较) - * [流和数组](book/21-Arrays.md#流和数组) - * [数组排序](book/21-Arrays.md#数组排序) - * [binarySearch二分查找](book/21-Arrays.md#binarySearch二分查找) - * [parallelPrefix并行前缀](book/21-Arrays.md#parallelPrefix并行前缀) - * [本章小结](book/21-Arrays.md#本章小结) -* [第二十二章 枚举](book/22-Enumerations.md) - * [基本功能](book/22-Enumerations.md#基本功能) - * [方法添加](book/22-Enumerations.md#方法添加) - * [switch语句](book/22-Enumerations.md#switch语句) - * [values方法](book/22-Enumerations.md#values方法) - * [实现而非继承](book/22-Enumerations.md#实现而非继承) - * [随机选择](book/22-Enumerations.md#随机选择) - * [使用接口组织](book/22-Enumerations.md#使用接口组织) - * [使用EnumSet替代Flags](book/22-Enumerations.md#使用EnumSet替代Flags) - * [使用EnumMap](book/22-Enumerations.md#使用EnumMap) - * [常量特定方法](book/22-Enumerations.md#常量特定方法) - * [多次调度](book/22-Enumerations.md#多次调度) - * [本章小结](book/22-Enumerations.md#本章小结) -* [第二十三章 注解](book/23-Annotations.md) - * [基本语法](book/23-Annotations.md#基本语法) - * [编写注解处理器](book/23-Annotations.md#编写注解处理器) - * [使用javac处理注解](book/23-Annotations.md#使用javac处理注解) - * [基于注解的单元测试](book/23-Annotations.md#基于注解的单元测试) - * [本章小结](book/23-Annotations.md#本章小结) -* [第二十四章 并发编程](book/24-Concurrent-Programming.md) - * [术语问题](book/24-Concurrent-Programming.md#术语问题) - * [并发的超能力](book/24-Concurrent-Programming.md#并发的超能力) - * [针对速度](book/24-Concurrent-Programming.md#针对速度) - * [四句格言](book/24-Concurrent-Programming.md#四句格言) - * [残酷的真相](book/24-Concurrent-Programming.md#残酷的真相) - * [本章其余部分](book/24-Concurrent-Programming.md#本章其余部分) - * [并行流](book/24-Concurrent-Programming.md#并行流) - * [创建和运行任务](book/24-Concurrent-Programming.md#创建和运行任务) - * [终止耗时任务](book/24-Concurrent-Programming.md#终止耗时任务) - * [CompletableFuture类](book/24-Concurrent-Programming.md#CompletableFuture类) - * [死锁](book/24-Concurrent-Programming.md#死锁) - * [构造函数非线程安全](book/24-Concurrent-Programming.md#构造函数非线程安全) - * [复杂性和代价](book/24-Concurrent-Programming.md#复杂性和代价) - * [本章小结](book/24-Concurrent-Programming.md#本章小结) -* [第二十五章 设计模式](book/25-Patterns.md) - * [概念](book/25-Patterns.md#概念) - * [构建型](book/25-Patterns.md#构建型) - * [面向实施](book/25-Patterns.md#面向实施) - * [工厂模式](book/25-Patterns.md#工厂模式) - * [函数对象](book/25-Patterns.md#函数对象) - * [接口改变](book/25-Patterns.md#接口改变) - * [解释器](book/25-Patterns.md#解释器) - * [回调](book/25-Patterns.md#回调) - * [多次调度](book/25-Patterns.md#多次调度) - * [模式重构](book/25-Patterns.md#模式重构) - * [抽象用法](book/25-Patterns.md#抽象用法) - * [多次派遣](book/25-Patterns.md#多次派遣) - * [访问者模式](book/25-Patterns.md#访问者模式) - * [RTTI的优劣](book/25-Patterns.md#RTTI的优劣) - * [本章小结](book/25-Patterns.md#本章小结) - -### 附录 - -* [附录:补充](book/Appendix-Supplements.md) - * [可下载的补充](book/Appendix-Supplements.md#可下载的补充) - * [通过Thinking-in-C来巩固Java基础](book/Appendix-Supplements.md#通过Thinking-in-C来巩固Java基础) - * [动手实践](book/Appendix-Supplements.md#动手实践) -* [附录:编程指南](book/Appendix-Programming-Guidelines.md) - * [设计](book/Appendix-Programming-Guidelines.md#设计) - * [实现](book/Appendix-Programming-Guidelines.md#实现) -* [附录:文档注释](book/Appendix-Javadoc.md) -* [附录:对象传递和返回](book/Appendix-Passing-and-Returning-Objects.md) - * [传递引用](book/Appendix-Passing-and-Returning-Objects.md#传递引用) - * [本地拷贝](book/Appendix-Passing-and-Returning-Objects.md#本地拷贝) - * [控制克隆](book/Appendix-Passing-and-Returning-Objects.md#控制克隆) - * [不可变类](book/Appendix-Passing-and-Returning-Objects.md#不可变类) - * [本章小结](book/Appendix-Passing-and-Returning-Objects.md#本章小结) -* [附录:流式IO](book/Appendix-IO-Streams.md) - * [输入流类型](book/Appendix-IO-Streams.md#输入流类型) - * [输出流类型](book/Appendix-IO-Streams.md#输出流类型) - * [添加属性和有用的接口](book/Appendix-IO-Streams.md#添加属性和有用的接口) - * [Reader和Writer](book/Appendix-IO-Streams.md#Reader和Writer) - * [RandomAccessFile类](book/Appendix-IO-Streams.md#RandomAccessFile类) - * [IO流典型用途](book/Appendix-IO-Streams.md#IO流典型用途) - * [本章小结](book/Appendix-IO-Streams.md#本章小结) -* [附录:标准IO](book/Appendix-Standard-IO.md) - * [执行控制](book/Appendix-Standard-IO.md#执行控制) -* [附录:新IO](book/Appendix-New-IO.md) - * [ByteBuffer](book/Appendix-New-IO.md#ByteBuffer) - * [转换数据](book/Appendix-New-IO.md#转换数据) - * [获取原始类型](book/Appendix-New-IO.md#获取原始类型) - * [视图缓冲区](book/Appendix-New-IO.md#视图缓冲区) - * [使用缓冲区进行数据操作](book/Appendix-New-IO.md#使用缓冲区进行数据操作) - * [内存映射文件](book/Appendix-New-IO.md#内存映射文件) - * [文件锁定](book/Appendix-New-IO.md#文件锁定) -* [附录:理解equals和hashCode方法](book/Appendix-Understanding-equals-and-hashCode.md) - * [equals典范](book/Appendix-Understanding-equals-and-hashCode.md#equals典范) - * [哈希和哈希码](book/Appendix-Understanding-equals-and-hashCode.md#哈希和哈希码) - * [调整HashMap](book/Appendix-Understanding-equals-and-hashCode.md#调整HashMap) -* [附录:集合主题](book/Appendix-Collection-Topics.md) - * [示例数据](book/Appendix-Collection-Topics.md#示例数据) - * [List表现](book/Appendix-Collection-Topics.md#List表现) - * [Set表现](book/Appendix-Collection-Topics.md#Set表现) - * [在Map中使用函数式操作](book/Appendix-Collection-Topics.md#在Map中使用函数式操作) - * [选择Map的部分](book/Appendix-Collection-Topics.md#选择Map的部分) - * [集合的fill方法](book/Appendix-Collection-Topics.md#集合的fill方法) - * [使用Flyweight自定义集合和Map](book/Appendix-Collection-Topics.md#使用Flyweight自定义集合和Map) - * [集合功能](book/Appendix-Collection-Topics.md#集合功能) - * [可选操作](book/Appendix-Collection-Topics.md#可选操作) - * [Set和存储顺序](book/Appendix-Collection-Topics.md#Set和存储顺序) - * [队列](book/Appendix-Collection-Topics.md#队列) - * [理解Map](book/Appendix-Collection-Topics.md#理解Map) - * [集合工具类](book/Appendix-Collection-Topics.md#集合工具类) - * [持有引用](book/Appendix-Collection-Topics.md#持有引用) - * [避免旧式类库](book/Appendix-Collection-Topics.md#避免旧式类库) - * [本章小结](book/Appendix-Collection-Topics.md#本章小结) -* [附录:并发底层原理](book/Appendix-Low-Level-Concurrency.md) - * [线程](book/Appendix-Low-Level-Concurrency.md#线程) - * [异常捕获](book/Appendix-Low-Level-Concurrency.md#异常捕获) - * [资源共享](book/Appendix-Low-Level-Concurrency.md#资源共享) - * [volatile关键字](book/Appendix-Low-Level-Concurrency.md#volatile关键字) - * [原子性](book/Appendix-Low-Level-Concurrency.md#原子性) - * [关键部分](book/Appendix-Low-Level-Concurrency.md#关键部分) - * [库组件](book/Appendix-Low-Level-Concurrency.md#库组件) - * [本章小结](book/Appendix-Low-Level-Concurrency.md#本章小结) -* [附录:数据压缩](book/Appendix-Data-Compression.md) - * [使用Gzip简单压缩](book/Appendix-Data-Compression.md#使用Gzip简单压缩) - * [使用zip多文件存储](book/Appendix-Data-Compression.md#使用zip多文件存储) - * [Java的jar](book/Appendix-Data-Compression.md#Java的jar) -* [附录:对象序列化](book/Appendix-Object-Serialization.md) - * [查找类](book/Appendix-Object-Serialization.md#查找类) - * [控制序列化](book/Appendix-Object-Serialization.md#控制序列化) - * [使用持久化](book/Appendix-Object-Serialization.md#使用持久化) -* [附录:静态语言类型检查](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md) - * [前言](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#前言) - * [静态类型检查和测试](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#静态类型检查和测试) - * [如何提升打字](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#如何提升打字) - * [生产力的成本](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#生产力的成本) - * [静态和动态](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#静态和动态) -* [附录:C++和Java的优良传统](book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md) -* [附录:成为一名程序员](book/Appendix-Becoming-a-Programmer.md) - * [如何开始](book/Appendix-Becoming-a-Programmer.md#如何开始) - * [码农生涯](book/Appendix-Becoming-a-Programmer.md#码农生涯) - * [百分之五的神话](book/Appendix-Becoming-a-Programmer.md#百分之五的神话) - * [重在动手](book/Appendix-Becoming-a-Programmer.md#重在动手) - * [像打字般编程](book/Appendix-Becoming-a-Programmer.md#像打字般编程) - * [做你喜欢的事](book/Appendix-Becoming-a-Programmer.md#做你喜欢的事) -* [词汇表](GLOSSARY.md) +* [附录:补充](docs/book/Appendix-Supplements.md) + * [可下载的补充](docs/book/Appendix-Supplements.md#可下载的补充) + * [通过Thinking-in-C来巩固Java基础](docs/book/Appendix-Supplements.md#通过Thinking-in-C来巩固Java基础) + * [动手实践](docs/book/Appendix-Supplements.md#动手实践) +* [附录:编程指南](docs/book/Appendix-Programming-Guidelines.md) + * [设计](docs/book/Appendix-Programming-Guidelines.md#设计) + * [实现](docs/book/Appendix-Programming-Guidelines.md#实现) +* [附录:文档注释](docs/book/Appendix-Javadoc.md) +* [附录:对象传递和返回](docs/book/Appendix-Passing-and-Returning-Objects.md) + * [传递引用](docs/book/Appendix-Passing-and-Returning-Objects.md#传递引用) + * [本地拷贝](docs/book/Appendix-Passing-and-Returning-Objects.md#本地拷贝) + * [控制克隆](docs/book/Appendix-Passing-and-Returning-Objects.md#控制克隆) + * [不可变类](docs/book/Appendix-Passing-and-Returning-Objects.md#不可变类) + * [本章小结](docs/book/Appendix-Passing-and-Returning-Objects.md#本章小结) +* [附录:流式IO](docs/book/Appendix-IO-Streams.md) + * [输入流类型](docs/book/Appendix-IO-Streams.md#输入流类型) + * [输出流类型](docs/book/Appendix-IO-Streams.md#输出流类型) + * [添加属性和有用的接口](docs/book/Appendix-IO-Streams.md#添加属性和有用的接口) + * [Reader和Writer](docs/book/Appendix-IO-Streams.md#Reader和Writer) + * [RandomAccessFile类](docs/book/Appendix-IO-Streams.md#RandomAccessFile类) + * [IO流典型用途](docs/book/Appendix-IO-Streams.md#IO流典型用途) + * [本章小结](docs/book/Appendix-IO-Streams.md#本章小结) +* [附录:标准IO](docs/book/Appendix-Standard-IO.md) + * [执行控制](docs/book/Appendix-Standard-IO.md#执行控制) +* [附录:新IO](docs/book/Appendix-New-IO.md) + * [ByteBuffer](docs/book/Appendix-New-IO.md#ByteBuffer) + * [转换数据](docs/book/Appendix-New-IO.md#转换数据) + * [获取原始类型](docs/book/Appendix-New-IO.md#获取原始类型) + * [视图缓冲区](docs/book/Appendix-New-IO.md#视图缓冲区) + * [使用缓冲区进行数据操作](docs/book/Appendix-New-IO.md#使用缓冲区进行数据操作) + * [内存映射文件](docs/book/Appendix-New-IO.md#内存映射文件) + * [文件锁定](docs/book/Appendix-New-IO.md#文件锁定) +* [附录:理解equals和hashCode方法](docs/book/Appendix-Understanding-equals-and-hashCode.md) + * [equals典范](docs/book/Appendix-Understanding-equals-and-hashCode.md#equals典范) + * [哈希和哈希码](docs/book/Appendix-Understanding-equals-and-hashCode.md#哈希和哈希码) + * [调整HashMap](docs/book/Appendix-Understanding-equals-and-hashCode.md#调整HashMap) +* [附录:集合主题](docs/book/Appendix-Collection-Topics.md) + * [示例数据](docs/book/Appendix-Collection-Topics.md#示例数据) + * [List表现](docs/book/Appendix-Collection-Topics.md#List表现) + * [Set表现](docs/book/Appendix-Collection-Topics.md#Set表现) + * [在Map中使用函数式操作](docs/book/Appendix-Collection-Topics.md#在Map中使用函数式操作) + * [选择Map的部分](docs/book/Appendix-Collection-Topics.md#选择Map的部分) + * [集合的fill方法](docs/book/Appendix-Collection-Topics.md#集合的fill方法) + * [使用Flyweight自定义集合和Map](docs/book/Appendix-Collection-Topics.md#使用Flyweight自定义集合和Map) + * [集合功能](docs/book/Appendix-Collection-Topics.md#集合功能) + * [可选操作](docs/book/Appendix-Collection-Topics.md#可选操作) + * [Set和存储顺序](docs/book/Appendix-Collection-Topics.md#Set和存储顺序) + * [队列](docs/book/Appendix-Collection-Topics.md#队列) + * [理解Map](docs/book/Appendix-Collection-Topics.md#理解Map) + * [集合工具类](docs/book/Appendix-Collection-Topics.md#集合工具类) + * [持有引用](docs/book/Appendix-Collection-Topics.md#持有引用) + * [避免旧式类库](docs/book/Appendix-Collection-Topics.md#避免旧式类库) + * [本章小结](docs/book/Appendix-Collection-Topics.md#本章小结) +* [附录:并发底层原理](docs/book/Appendix-Low-Level-Concurrency.md) + * [线程](docs/book/Appendix-Low-Level-Concurrency.md#线程) + * [异常捕获](docs/book/Appendix-Low-Level-Concurrency.md#异常捕获) + * [资源共享](docs/book/Appendix-Low-Level-Concurrency.md#资源共享) + * [volatile关键字](docs/book/Appendix-Low-Level-Concurrency.md#volatile关键字) + * [原子性](docs/book/Appendix-Low-Level-Concurrency.md#原子性) + * [关键部分](docs/book/Appendix-Low-Level-Concurrency.md#关键部分) + * [库组件](docs/book/Appendix-Low-Level-Concurrency.md#库组件) + * [本章小结](docs/book/Appendix-Low-Level-Concurrency.md#本章小结) +* [附录:数据压缩](docs/book/Appendix-Data-Compression.md) + * [使用Gzip简单压缩](docs/book/Appendix-Data-Compression.md#使用Gzip简单压缩) + * [使用zip多文件存储](docs/book/Appendix-Data-Compression.md#使用zip多文件存储) + * [Java的jar](docs/book/Appendix-Data-Compression.md#Java的jar) +* [附录:对象序列化](docs/book/Appendix-Object-Serialization.md) + * [查找类](docs/book/Appendix-Object-Serialization.md#查找类) + * [控制序列化](docs/book/Appendix-Object-Serialization.md#控制序列化) + * [使用持久化](docs/book/Appendix-Object-Serialization.md#使用持久化) +* [附录:静态语言类型检查](docs/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md) + * [前言](docs/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#前言) + * [静态类型检查和测试](docs/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#静态类型检查和测试) + * [如何提升打字](docs/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#如何提升打字) + * [生产力的成本](docs/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#生产力的成本) + * [静态和动态](docs/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#静态和动态) +* [附录:C++和Java的优良传统](docs/book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md) +* [附录:成为一名程序员](docs/book/Appendix-Becoming-a-Programmer.md) + * [如何开始](docs/book/Appendix-Becoming-a-Programmer.md#如何开始) + * [码农生涯](docs/book/Appendix-Becoming-a-Programmer.md#码农生涯) + * [百分之五的神话](docs/book/Appendix-Becoming-a-Programmer.md#百分之五的神话) + * [重在动手](docs/book/Appendix-Becoming-a-Programmer.md#重在动手) + * [像打字般编程](docs/book/Appendix-Becoming-a-Programmer.md#像打字般编程) + * [做你喜欢的事](docs/book/Appendix-Becoming-a-Programmer.md#做你喜欢的事) +* [词汇表](docs/book/GLOSSARY.md) diff --git a/book.json b/book.json index f99031f5..d7ee6496 100644 --- a/book.json +++ b/book.json @@ -1,7 +1,7 @@ { "title": "《On Java 8》中文版", "author": "LingCoder", - "description": "根据Bruce Eckel大神的新书On Java 8翻译,可以说是事实上的Thinking in Java 5th", + "description": "根据 Bruce Eckel 大神的新书 On Java 8 翻译,可以说是事实上的 Thinking in Java 5th", "language": "zh-hans", "gitbook": "3.2.3", "styles": { @@ -12,7 +12,7 @@ "epub": "styles/epub.css" }, "structure": { - "readme": "Introduction.md" + "readme": "README.md" }, "plugins": [ "splitter", diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/Introduction.md b/docs/README.md similarity index 79% rename from Introduction.md rename to docs/README.md index af91d14f..60ea383e 100644 --- a/Introduction.md +++ b/docs/README.md @@ -2,22 +2,15 @@ [![GitHub stars](https://img.shields.io/github/stars/lingcoder/OnJava8.svg?style=social&label=Star&)](https://github.com/lingcoder/OnJava8/stargazers)[![GitHub forks](https://img.shields.io/github/forks/lingcoder/OnJava8.svg?style=social&label=Fork&)](https://github.com/lingcoder/OnJava8/fork) -本翻译项目的 Git 开源地址:[https://github.com/LingCoder/OnJava8](https://github.com/LingCoder/OnJava8) +本翻译项目的 GITHUB 开源地址:[https://github.com/LingCoder/OnJava8](https://github.com/LingCoder/OnJava8) 如果您在阅读本书的过程中有发现不明白或者错误的地方,请随时到项目地址发布issue或者fork项目后发布pr帮助译者改善!不胜感激! - ## 书籍简介 -* 本书原作者为 \[美\] [Bruce Eckel](https://github.com/BruceEckel),即(*Thinking in Java 4th Edition,2006*)的作者。 -* 本书是事实上的 *Thinking in Java 5th Edition*(*On Java 8,2017*)。 -* *Thinking in Java 4th Edition*基于 **JAVA 5**版本;*On Java 8*基于**JAVA 8**版本。 - - -## 贡献者 - -- 主译: LingCoder -- 参译: +- 本书原作者为 \[美\] *Bruce Eckel*,即(*Thinking in Java 4th Edition,2006*)的作者。 +- 本书是事实上的 *Thinking in Java 5th Edition*(*On Java 8,2017*)。 +- *Thinking in Java 4th Edition* 基于 **JAVA 5** 版本;*On Java 8* 基于 **JAVA 8** 版本。 ## 翻译说明 @@ -28,10 +21,8 @@ 4. 译者在翻译中同时参考了谷歌、百度、有道翻译的译文以及《Java编程思想》第四版中文版的部分内容(对其翻译死板,生造名词,语言精炼度差问题进行规避和改正)。最后结合译者自己的理解进行本地化,尽量做到专业和言简意赅,方便大家更好的理解学习。 5. 由于译者个人能力、时间有限,如有翻译错误和笔误的地方,还请大家批评指正! - ## 如何参与 - 如果你想对本书做出一些贡献的话 可以在阅读本书过程中帮忙校对,找 bug 错别字等等 可以提出专业方面的修改建议 @@ -43,14 +34,12 @@ 如果不太明白 md 的排版,可以把翻译好的内容发送给我,我代为排版并提交 如还有其它问题,欢迎发送 issue,谢谢~ - ## 开源协议 本项目基于 MIT 协议开源。 - ## 联系方式 -* E-mail : +- E-mail : -
+
\ No newline at end of file diff --git a/docs/_coverpage.md b/docs/_coverpage.md new file mode 100644 index 00000000..3ba1549f --- /dev/null +++ b/docs/_coverpage.md @@ -0,0 +1,22 @@ + + +# On Java 8 + +- 《On Java 8》中文版,是事实上的《Java 编程思想》第5版。 + + +[![stars](https://badgen.net/github/stars/lingcoder/OnJava8?icon=github&color=4ab8a1)](https://github.com/lingcoder/OnJava8) [![forks](https://badgen.net/github/forks/lingcoder/OnJava8?icon=github&color=4ab8a1)](https://github.com/lingcoder/OnJava8) + + + 本页总访问次数: + + +[GitHub](https://github.com/lingcoder/onJava8/) +[Get Started](README.md) + + + + + + + diff --git a/docs/_sidebar.md b/docs/_sidebar.md new file mode 100644 index 00000000..72d0ddeb --- /dev/null +++ b/docs/_sidebar.md @@ -0,0 +1,411 @@ + +* [译者的话](README.md) +* [封面](book/00-On-Java-8.md) +* [前言](book/00-Preface.md) + * [教学目标](book/00-Preface.md#教学目标) + * [语言设计错误](book/00-Preface.md#语言设计错误) + * [测试用例](book/00-Preface.md#测试用例) + * [普及性](book/00-Preface.md#普及性) + * [关于安卓](book/00-Preface.md#关于安卓) + * [电子版权声明](book/00-Preface.md#电子版权声明) + * [版本说明](book/00-Preface.md#版本说明) + * [封面设计](book/00-Preface.md#封面设计) + * [感谢的人](book/00-Preface.md#感谢的人) + * [献礼](book/00-Preface.md#献礼) +* [简介](book/00-Introduction.md) + * [前提条件](book/00-Introduction.md#前提条件) + * [JDK文档](book/00-Introduction.md#JDK文档) + * [C编程思想](book/00-Introduction.md#C编程思想) + * [源码下载](book/00-Introduction.md#源码下载) + * [编码样式](book/00-Introduction.md#编码样式) + * [BUG提交](book/00-Introduction.md#BUG提交) + * [邮箱订阅](book/00-Introduction.md#邮箱订阅) + * [Java图形界面](book/00-Introduction.md#Java图形界面) + +* [第一章 对象的概念](book/01-What-is-an-Object.md) + * [抽象](book/01-What-is-an-Object.md#抽象) + * [接口](book/01-What-is-an-Object.md#接口) + * [服务提供](book/01-What-is-an-Object.md#服务提供) + * [封装](book/01-What-is-an-Object.md#封装) + * [复用](book/01-What-is-an-Object.md#复用) + * [继承](book/01-What-is-an-Object.md#继承) + * [多态](book/01-What-is-an-Object.md#多态) + * [单继承](book/01-What-is-an-Object.md#单继承) + * [集合](book/01-What-is-an-Object.md#集合) + * [生命周期](book/01-What-is-an-Object.md#生命周期) + * [异常处理](book/01-What-is-an-Object.md#异常处理) + * [本章小结](book/01-What-is-an-Object.md#本章小结) +* [第二章 安装Java和本书用例](book/02-Installing-Java-and-the-Book-Examples.md) + * [编辑器](book/02-Installing-Java-and-the-Book-Examples.md#编辑器) + * [Shell](book/02-Installing-Java-and-the-Book-Examples.md#Shell) + * [Java安装](book/02-Installing-Java-and-the-Book-Examples.md#Java安装) + * [校验安装](book/02-Installing-Java-and-the-Book-Examples.md#校验安装) + * [安装和运行代码示例](book/02-Installing-Java-and-the-Book-Examples.md#安装和运行代码示例) +* [第三章 万物皆对象](book/03-Objects-Everywhere.md) + * [对象操纵](book/03-Objects-Everywhere.md#对象操纵) + * [对象创建](book/03-Objects-Everywhere.md#对象创建) + * [代码注释](book/03-Objects-Everywhere.md#代码注释) + * [对象清理](book/03-Objects-Everywhere.md#对象清理) + * [类的创建](book/03-Objects-Everywhere.md#类的创建) + * [程序编写](book/03-Objects-Everywhere.md#程序编写) + * [小试牛刀](book/03-Objects-Everywhere.md#小试牛刀) + * [编码风格](book/03-Objects-Everywhere.md#编码风格) + * [本章小结](book/03-Objects-Everywhere.md#本章小结) +* [第四章 运算符](book/04-Operators.md) + * [使用说明](book/04-Operators.md#使用说明) + * [优先级](book/04-Operators.md#优先级) + * [赋值](book/04-Operators.md#赋值) + * [算术运算符](book/04-Operators.md#算术运算符) + * [递增和递减](book/04-Operators.md#递增和递减) + * [关系运算符](book/04-Operators.md#关系运算符) + * [逻辑运算符](book/04-Operators.md#逻辑运算符) + * [字面值常量](book/04-Operators.md#字面值常量) + * [按位运算符](book/04-Operators.md#按位运算符) + * [移位运算符](book/04-Operators.md#移位运算符) + * [三元运算符](book/04-Operators.md#三元运算符) + * [字符串运算符](book/04-Operators.md#字符串运算符) + * [常见陷阱](book/04-Operators.md#常见陷阱) + * [类型转换](book/04-Operators.md#类型转换) + * [Java没有sizeof](book/04-Operators.md#Java没有sizeof) + * [运算符总结](book/04-Operators.md#运算符总结) + * [本章小结](book/04-Operators.md#本章小结) +* [第五章 控制流](book/05-Control-Flow.md) + * [true和flase](book/05-Control-Flow.md#true和flase) + * [if-else](book/05-Control-Flow.md#if-else) + * [迭代语句](book/05-Control-Flow.md#迭代语句) + * [for-in语法](book/05-Control-Flow.md#for-in语法) + * [return](book/05-Control-Flow.md#return) + * [break和continue](book/05-Control-Flow.md#break和continue) + * [臭名昭著的goto](book/05-Control-Flow.md#臭名昭著的goto) + * [switch](book/05-Control-Flow.md#switch) + * [switch字符串](book/05-Control-Flow.md#switch字符串) + * [本章小结](book/05-Control-Flow.md#本章小结) +* [第六章 初始化和清理](book/06-Housekeeping.md) + * [利用构造器保证初始化](book/06-Housekeeping.md#利用构造器保证初始化) + * [方法重载](book/06-Housekeeping.md#方法重载) + * [无参构造器](book/06-Housekeeping.md#无参构造器) + * [this关键字](book/06-Housekeeping.md#this关键字) + * [垃圾回收器](book/06-Housekeeping.md#垃圾回收器) + * [成员初始化](book/06-Housekeeping.md#成员初始化) + * [构造器初始化](book/06-Housekeeping.md#构造器初始化) + * [数组初始化](book/06-Housekeeping.md#数组初始化) + * [枚举类型](book/06-Housekeeping.md#枚举类型) + * [本章小结](book/06-Housekeeping.md#本章小结) +* [第七章 封装](book/07-Implementation-Hiding.md) + * [包的概念](book/07-Implementation-Hiding.md#包的概念) + * [访问权限修饰符](book/07-Implementation-Hiding.md#访问权限修饰符) + * [接口和实现](book/07-Implementation-Hiding.md#接口和实现) + * [类访问权限](book/07-Implementation-Hiding.md#类访问权限) + * [本章小结](book/07-Implementation-Hiding.md#本章小结) +* [第八章 复用](book/08-Reuse.md) + * [组合语法](book/08-Reuse.md#组合语法) + * [继承语法](book/08-Reuse.md#继承语法) + * [委托](book/08-Reuse.md#委托) + * [结合组合与继承](book/08-Reuse.md#结合组合与继承) + * [组合与继承的选择](book/08-Reuse.md#组合与继承的选择) + * [protected](book/08-Reuse.md#protected) + * [向上转型](book/08-Reuse.md#向上转型) + * [final关键字](book/08-Reuse.md#final关键字) + * [类初始化和加载](book/08-Reuse.md#类初始化和加载) + * [本章小结](book/08-Reuse.md#本章小结) +* [第九章 多态](book/09-Polymorphism.md) + * [向上转型回溯](book/09-Polymorphism.md#向上转型回溯) + * [深入理解](book/09-Polymorphism.md#深入理解) + * [构造器和多态](book/09-Polymorphism.md#构造器和多态) + * [返回类型协变](book/09-Polymorphism.md#返回类型协变) + * [使用继承设计](book/09-Polymorphism.md#使用继承设计) + * [本章小结](book/09-Polymorphism.md#本章小结) +* [第十章 接口](book/10-Interfaces.md) + * [抽象类和方法](book/10-Interfaces.md#抽象类和方法) + * [接口创建](book/10-Interfaces.md#接口创建) + * [抽象类和接口](book/10-Interfaces.md#抽象类和接口) + * [完全解耦](book/10-Interfaces.md#完全解耦) + * [多接口结合](book/10-Interfaces.md#多接口结合) + * [使用继承扩展接口](book/10-Interfaces.md#使用继承扩展接口) + * [接口适配](book/10-Interfaces.md#接口适配) + * [接口字段](book/10-Interfaces.md#接口字段) + * [接口嵌套](book/10-Interfaces.md#接口嵌套) + * [接口和工厂方法模式](book/10-Interfaces.md#接口和工厂方法模式) + * [本章小结](book/10-Interfaces.md#本章小结) +* [第十一章 内部类](book/11-Inner-Classes.md) + * [创建内部类](book/11-Inner-Classes.md#创建内部类) + * [链接外部类](book/11-Inner-Classes.md#链接外部类) + * [内部类this和new的使用](book/11-Inner-Classes.md#内部类this和new的使用) + * [内部类向上转型](book/11-Inner-Classes.md#内部类向上转型) + * [内部类方法和作用域](book/11-Inner-Classes.md#内部类方法和作用域) + * [匿名内部类](book/11-Inner-Classes.md#匿名内部类) + * [嵌套类](book/11-Inner-Classes.md#嵌套类) + * [内部类应用场景](book/11-Inner-Classes.md#内部类应用场景) + * [继承内部类](book/11-Inner-Classes.md#继承内部类) + * [重写内部类](book/11-Inner-Classes.md#重写内部类) + * [内部类局部变量](book/11-Inner-Classes.md#内部类局部变量) + * [内部类标识符](book/11-Inner-Classes.md#内部类标识符) + * [本章小结](book/11-Inner-Classes.md#本章小结) +* [第十二章 集合](book/12-Collections.md) + * [泛型和类型安全的集合](book/12-Collections.md#泛型和类型安全的集合) + * [基本概念](book/12-Collections.md#基本概念) + * [添加元素组](book/12-Collections.md#添加元素组) + * [集合的打印](book/12-Collections.md#集合的打印) + * [列表List](book/12-Collections.md#列表List) + * [迭代器Iterators](book/12-Collections.md#迭代器Iterators) + * [链表LinkedList](book/12-Collections.md#链表LinkedList) + * [堆栈Stack](book/12-Collections.md#堆栈Stack) + * [集合Set](book/12-Collections.md#集合Set) + * [映射Map](book/12-Collections.md#映射Map) + * [队列Queue](book/12-Collections.md#队列Queue) + * [集合与迭代器](book/12-Collections.md#集合与迭代器) + * [for-in和迭代器](book/12-Collections.md#for-in和迭代器) + * [本章小结](book/12-Collections.md#本章小结) +* [第十三章 函数式编程](book/13-Functional-Programming.md) + * [旧vs新](book/13-Functional-Programming.md#旧vs新) + * [Lambda表达式](book/13-Functional-Programming.md#Lambda表达式) + * [方法引用](book/13-Functional-Programming.md#方法引用) + * [函数式接口](book/13-Functional-Programming.md#函数式接口) + * [高阶函数](book/13-Functional-Programming.md#高阶函数) + * [闭包](book/13-Functional-Programming.md#闭包) + * [函数组合](book/13-Functional-Programming.md#函数组合) + * [Currying和Partial-Evaluation](book/13-Functional-Programming.md#Currying和Partial-Evaluation) + * [纯函数式编程](book/13-Functional-Programming.md#纯函数式编程) + * [本章小结](book/13-Functional-Programming.md#本章小结) +* [第十四章 流式编程](book/14-Streams.md) + * [流支持](book/14-Streams.md#流支持) + * [流创建](book/14-Streams.md#流创建) + * [中级流操作](book/14-Streams.md#中级流操作) + * [Optional类](book/14-Streams.md#Optional类) + * [终端操作](book/14-Streams.md#终端操作) + * [本章小结](book/14-Streams.md#本章小结) +* [第十五章 异常](book/15-Exceptions.md) + * [异常概念](book/15-Exceptions.md#异常概念) + * [基本异常](book/15-Exceptions.md#基本异常) + * [异常捕获](book/15-Exceptions.md#异常捕获) + * [自定义异常](book/15-Exceptions.md#自定义异常) + * [异常规范](book/15-Exceptions.md#异常规范) + * [任意异常捕获](book/15-Exceptions.md#任意异常捕获) + * [Java标准异常](book/15-Exceptions.md#Java标准异常) + * [finally关键字](book/15-Exceptions.md#finally关键字) + * [异常限制](book/15-Exceptions.md#异常限制) + * [异常构造](book/15-Exceptions.md#异常构造) + * [Try-With-Resources用法](book/15-Exceptions.md#Try-With-Resources用法) + * [异常匹配](book/15-Exceptions.md#异常匹配) + * [异常准则](book/15-Exceptions.md#异常准则) + * [异常指南](book/15-Exceptions.md#异常指南) + * [本章小结](book/15-Exceptions.md#本章小结) +* [第十六章 代码校验](book/16-Validating-Your-Code.md) + * [测试](book/16-Validating-Your-Code.md#测试) + * [前提条件](book/16-Validating-Your-Code.md#前提条件) + * [测试驱动开发](book/16-Validating-Your-Code.md#测试驱动开发) + * [日志](book/16-Validating-Your-Code.md#日志) + * [调试](book/16-Validating-Your-Code.md#调试) + * [基准测试](book/16-Validating-Your-Code.md#基准测试) + * [分析和优化](book/16-Validating-Your-Code.md#分析和优化) + * [风格检测](book/16-Validating-Your-Code.md#风格检测) + * [静态错误分析](book/16-Validating-Your-Code.md#静态错误分析) + * [代码重审](book/16-Validating-Your-Code.md#代码重审) + * [结对编程](book/16-Validating-Your-Code.md#结对编程) + * [重构](book/16-Validating-Your-Code.md#重构) + * [持续集成](book/16-Validating-Your-Code.md#持续集成) + * [本章小结](book/16-Validating-Your-Code.md#本章小结) +* [第十七章 文件](book/17-Files.md) + * [文件和目录路径](book/17-Files.md#文件和目录路径) + * [目录](book/17-Files.md#目录) + * [文件系统](book/17-Files.md#文件系统) + * [路径监听](book/17-Files.md#路径监听) + * [文件查找](book/17-Files.md#文件查找) + * [文件读写](book/17-Files.md#文件读写) + * [本章小结](book/17-Files.md#本章小结) +* [第十八章 字符串](book/18-Strings.md) + * [字符串的不可变](book/18-Strings.md#字符串的不可变) + * [重载和StringBuilder](book/18-Strings.md#重载和StringBuilder) + * [意外递归](book/18-Strings.md#意外递归) + * [字符串操作](book/18-Strings.md#字符串操作) + * [格式化输出](book/18-Strings.md#格式化输出) + * [常规表达式](book/18-Strings.md#常规表达式) + * [扫描输入](book/18-Strings.md#扫描输入) + * [StringTokenizer类](book/18-Strings.md#StringTokenizer类) + * [本章小结](book/18-Strings.md#本章小结) +* [第十九章 类型信息](book/19-Type-Information.md) + * [运行时类型信息](book/19-Type-Information.md#运行时类型信息) + * [类的对象](book/19-Type-Information.md#类的对象) + * [类型转换检测](book/19-Type-Information.md#类型转换检测) + * [注册工厂](book/19-Type-Information.md#注册工厂) + * [类的等价比较](book/19-Type-Information.md#类的等价比较) + * [反射运行时类信息](book/19-Type-Information.md#反射运行时类信息) + * [动态代理](book/19-Type-Information.md#动态代理) + * [Optional类](book/19-Type-Information.md#Optional类) + * [接口和类型](book/19-Type-Information.md#接口和类型) + * [本章小结](book/19-Type-Information.md#本章小结) +* [第二十章 泛型](book/20-Generics.md) + * [简单泛型](book/20-Generics.md#简单泛型) + * [泛型接口](book/20-Generics.md#泛型接口) + * [泛型方法](book/20-Generics.md#泛型方法) + * [复杂模型构建](book/20-Generics.md#复杂模型构建) + * [泛型擦除](book/20-Generics.md#泛型擦除) + * [补偿擦除](book/20-Generics.md#补偿擦除) + * [边界](book/20-Generics.md#边界) + * [通配符](book/20-Generics.md#通配符) + * [问题](book/20-Generics.md#问题) + * [自我约束类型](book/20-Generics.md#自我约束类型) + * [动态类型安全](book/20-Generics.md#动态类型安全) + * [泛型异常](book/20-Generics.md#泛型异常) + * [混入](book/20-Generics.md#混入) + * [潜在类型](book/20-Generics.md#潜在类型) + * [补偿不足](book/20-Generics.md#补偿不足) + * [辅助潜在类型](book/20-Generics.md#辅助潜在类型) + * [泛型的优劣](book/20-Generics.md#泛型的优劣) +* [第二十一章 数组](book/21-Arrays.md) + * [数组特性](book/21-Arrays.md#数组特性) + * [一等对象](book/21-Arrays.md#一等对象) + * [返回数组](book/21-Arrays.md#返回数组) + * [多维数组](book/21-Arrays.md#多维数组) + * [泛型数组](book/21-Arrays.md#泛型数组) + * [Arrays的fill方法](book/21-Arrays.md#Arrays的fill方法) + * [Arrays的setAll方法](book/21-Arrays.md#Arrays的setAll方法) + * [增量生成](book/21-Arrays.md#增量生成) + * [随机生成](book/21-Arrays.md#随机生成) + * [泛型和基本数组](book/21-Arrays.md#泛型和基本数组) + * [数组元素修改](book/21-Arrays.md#数组元素修改) + * [数组并行](book/21-Arrays.md#数组并行) + * [Arrays工具类](book/21-Arrays.md#Arrays工具类) + * [数组拷贝](book/21-Arrays.md#数组拷贝) + * [数组比较](book/21-Arrays.md#数组比较) + * [流和数组](book/21-Arrays.md#流和数组) + * [数组排序](book/21-Arrays.md#数组排序) + * [binarySearch二分查找](book/21-Arrays.md#binarySearch二分查找) + * [parallelPrefix并行前缀](book/21-Arrays.md#parallelPrefix并行前缀) + * [本章小结](book/21-Arrays.md#本章小结) +* [第二十二章 枚举](book/22-Enumerations.md) + * [基本功能](book/22-Enumerations.md#基本功能) + * [方法添加](book/22-Enumerations.md#方法添加) + * [switch语句](book/22-Enumerations.md#switch语句) + * [values方法](book/22-Enumerations.md#values方法) + * [实现而非继承](book/22-Enumerations.md#实现而非继承) + * [随机选择](book/22-Enumerations.md#随机选择) + * [使用接口组织](book/22-Enumerations.md#使用接口组织) + * [使用EnumSet替代Flags](book/22-Enumerations.md#使用EnumSet替代Flags) + * [使用EnumMap](book/22-Enumerations.md#使用EnumMap) + * [常量特定方法](book/22-Enumerations.md#常量特定方法) + * [多次调度](book/22-Enumerations.md#多次调度) + * [本章小结](book/22-Enumerations.md#本章小结) +* [第二十三章 注解](book/23-Annotations.md) + * [基本语法](book/23-Annotations.md#基本语法) + * [编写注解处理器](book/23-Annotations.md#编写注解处理器) + * [使用javac处理注解](book/23-Annotations.md#使用javac处理注解) + * [基于注解的单元测试](book/23-Annotations.md#基于注解的单元测试) + * [本章小结](book/23-Annotations.md#本章小结) +* [第二十四章 并发编程](book/24-Concurrent-Programming.md) + * [术语问题](book/24-Concurrent-Programming.md#术语问题) + * [并发的超能力](book/24-Concurrent-Programming.md#并发的超能力) + * [针对速度](book/24-Concurrent-Programming.md#针对速度) + * [四句格言](book/24-Concurrent-Programming.md#四句格言) + * [残酷的真相](book/24-Concurrent-Programming.md#残酷的真相) + * [本章其余部分](book/24-Concurrent-Programming.md#本章其余部分) + * [并行流](book/24-Concurrent-Programming.md#并行流) + * [创建和运行任务](book/24-Concurrent-Programming.md#创建和运行任务) + * [终止耗时任务](book/24-Concurrent-Programming.md#终止耗时任务) + * [CompletableFuture类](book/24-Concurrent-Programming.md#CompletableFuture类) + * [死锁](book/24-Concurrent-Programming.md#死锁) + * [构造函数非线程安全](book/24-Concurrent-Programming.md#构造函数非线程安全) + * [复杂性和代价](book/24-Concurrent-Programming.md#复杂性和代价) + * [本章小结](book/24-Concurrent-Programming.md#本章小结) +* [第二十五章 设计模式](book/25-Patterns.md) + * [概念](book/25-Patterns.md#概念) + * [构建型](book/25-Patterns.md#构建型) + * [面向实施](book/25-Patterns.md#面向实施) + * [工厂模式](book/25-Patterns.md#工厂模式) + * [函数对象](book/25-Patterns.md#函数对象) + * [接口改变](book/25-Patterns.md#接口改变) + * [解释器](book/25-Patterns.md#解释器) + * [回调](book/25-Patterns.md#回调) + * [多次调度](book/25-Patterns.md#多次调度) + * [模式重构](book/25-Patterns.md#模式重构) + * [抽象用法](book/25-Patterns.md#抽象用法) + * [多次派遣](book/25-Patterns.md#多次派遣) + * [访问者模式](book/25-Patterns.md#访问者模式) + * [RTTI的优劣](book/25-Patterns.md#RTTI的优劣) + * [本章小结](book/25-Patterns.md#本章小结) + +* [附录:补充](book/Appendix-Supplements.md) + * [可下载的补充](book/Appendix-Supplements.md#可下载的补充) + * [通过Thinking-in-C来巩固Java基础](book/Appendix-Supplements.md#通过Thinking-in-C来巩固Java基础) + * [动手实践](book/Appendix-Supplements.md#动手实践) +* [附录:编程指南](book/Appendix-Programming-Guidelines.md) + * [设计](book/Appendix-Programming-Guidelines.md#设计) + * [实现](book/Appendix-Programming-Guidelines.md#实现) +* [附录:文档注释](book/Appendix-Javadoc.md) +* [附录:对象传递和返回](book/Appendix-Passing-and-Returning-Objects.md) + * [传递引用](book/Appendix-Passing-and-Returning-Objects.md#传递引用) + * [本地拷贝](book/Appendix-Passing-and-Returning-Objects.md#本地拷贝) + * [控制克隆](book/Appendix-Passing-and-Returning-Objects.md#控制克隆) + * [不可变类](book/Appendix-Passing-and-Returning-Objects.md#不可变类) + * [本章小结](book/Appendix-Passing-and-Returning-Objects.md#本章小结) +* [附录:流式IO](book/Appendix-IO-Streams.md) + * [输入流类型](book/Appendix-IO-Streams.md#输入流类型) + * [输出流类型](book/Appendix-IO-Streams.md#输出流类型) + * [添加属性和有用的接口](book/Appendix-IO-Streams.md#添加属性和有用的接口) + * [Reader和Writer](book/Appendix-IO-Streams.md#Reader和Writer) + * [RandomAccessFile类](book/Appendix-IO-Streams.md#RandomAccessFile类) + * [IO流典型用途](book/Appendix-IO-Streams.md#IO流典型用途) + * [本章小结](book/Appendix-IO-Streams.md#本章小结) +* [附录:标准IO](book/Appendix-Standard-IO.md) + * [执行控制](book/Appendix-Standard-IO.md#执行控制) +* [附录:新IO](book/Appendix-New-IO.md) + * [ByteBuffer](book/Appendix-New-IO.md#ByteBuffer) + * [转换数据](book/Appendix-New-IO.md#转换数据) + * [获取原始类型](book/Appendix-New-IO.md#获取原始类型) + * [视图缓冲区](book/Appendix-New-IO.md#视图缓冲区) + * [使用缓冲区进行数据操作](book/Appendix-New-IO.md#使用缓冲区进行数据操作) + * [内存映射文件](book/Appendix-New-IO.md#内存映射文件) + * [文件锁定](book/Appendix-New-IO.md#文件锁定) +* [附录:理解equals和hashCode方法](book/Appendix-Understanding-equals-and-hashCode.md) + * [equals典范](book/Appendix-Understanding-equals-and-hashCode.md#equals典范) + * [哈希和哈希码](book/Appendix-Understanding-equals-and-hashCode.md#哈希和哈希码) + * [调整HashMap](book/Appendix-Understanding-equals-and-hashCode.md#调整HashMap) +* [附录:集合主题](book/Appendix-Collection-Topics.md) + * [示例数据](book/Appendix-Collection-Topics.md#示例数据) + * [List表现](book/Appendix-Collection-Topics.md#List表现) + * [Set表现](book/Appendix-Collection-Topics.md#Set表现) + * [在Map中使用函数式操作](book/Appendix-Collection-Topics.md#在Map中使用函数式操作) + * [选择Map的部分](book/Appendix-Collection-Topics.md#选择Map的部分) + * [集合的fill方法](book/Appendix-Collection-Topics.md#集合的fill方法) + * [使用Flyweight自定义集合和Map](book/Appendix-Collection-Topics.md#使用Flyweight自定义集合和Map) + * [集合功能](book/Appendix-Collection-Topics.md#集合功能) + * [可选操作](book/Appendix-Collection-Topics.md#可选操作) + * [Set和存储顺序](book/Appendix-Collection-Topics.md#Set和存储顺序) + * [队列](book/Appendix-Collection-Topics.md#队列) + * [理解Map](book/Appendix-Collection-Topics.md#理解Map) + * [集合工具类](book/Appendix-Collection-Topics.md#集合工具类) + * [持有引用](book/Appendix-Collection-Topics.md#持有引用) + * [避免旧式类库](book/Appendix-Collection-Topics.md#避免旧式类库) + * [本章小结](book/Appendix-Collection-Topics.md#本章小结) +* [附录:并发底层原理](book/Appendix-Low-Level-Concurrency.md) + * [线程](book/Appendix-Low-Level-Concurrency.md#线程) + * [异常捕获](book/Appendix-Low-Level-Concurrency.md#异常捕获) + * [资源共享](book/Appendix-Low-Level-Concurrency.md#资源共享) + * [volatile关键字](book/Appendix-Low-Level-Concurrency.md#volatile关键字) + * [原子性](book/Appendix-Low-Level-Concurrency.md#原子性) + * [关键部分](book/Appendix-Low-Level-Concurrency.md#关键部分) + * [库组件](book/Appendix-Low-Level-Concurrency.md#库组件) + * [本章小结](book/Appendix-Low-Level-Concurrency.md#本章小结) +* [附录:数据压缩](book/Appendix-Data-Compression.md) + * [使用Gzip简单压缩](book/Appendix-Data-Compression.md#使用Gzip简单压缩) + * [使用zip多文件存储](book/Appendix-Data-Compression.md#使用zip多文件存储) + * [Java的jar](book/Appendix-Data-Compression.md#Java的jar) +* [附录:对象序列化](book/Appendix-Object-Serialization.md) + * [查找类](book/Appendix-Object-Serialization.md#查找类) + * [控制序列化](book/Appendix-Object-Serialization.md#控制序列化) + * [使用持久化](book/Appendix-Object-Serialization.md#使用持久化) +* [附录:静态语言类型检查](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md) + * [前言](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#前言) + * [静态类型检查和测试](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#静态类型检查和测试) + * [如何提升打字](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#如何提升打字) + * [生产力的成本](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#生产力的成本) + * [静态和动态](book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md#静态和动态) +* [附录:C++和Java的优良传统](book/Appendix-The-Positive-Legacy-of-C-plus-plus-and-Java.md) +* [附录:成为一名程序员](book/Appendix-Becoming-a-Programmer.md) + * [如何开始](book/Appendix-Becoming-a-Programmer.md#如何开始) + * [码农生涯](book/Appendix-Becoming-a-Programmer.md#码农生涯) + * [百分之五的神话](book/Appendix-Becoming-a-Programmer.md#百分之五的神话) + * [重在动手](book/Appendix-Becoming-a-Programmer.md#重在动手) + * [像打字般编程](book/Appendix-Becoming-a-Programmer.md#像打字般编程) + * [做你喜欢的事](book/Appendix-Becoming-a-Programmer.md#做你喜欢的事) +* [词汇表](book/GLOSSARY.md) diff --git a/docs/_style/prism-master/.editorconfig b/docs/_style/prism-master/.editorconfig new file mode 100644 index 00000000..b2e4603b --- /dev/null +++ b/docs/_style/prism-master/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[*] +insert_final_newline = false +charset = utf-8 +indent_style = tab +indent_size = 4 + +[tests/languages/**.test] +end_of_line = crlf + +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/docs/_style/prism-master/.gitattributes b/docs/_style/prism-master/.gitattributes new file mode 100644 index 00000000..1d598bdc --- /dev/null +++ b/docs/_style/prism-master/.gitattributes @@ -0,0 +1,4 @@ +* text=auto + +# Test files should not have their line endings modified by git +/tests/languages/**/*.test binary \ No newline at end of file diff --git a/docs/_style/prism-master/.gitignore b/docs/_style/prism-master/.gitignore new file mode 100644 index 00000000..3b16b7d3 --- /dev/null +++ b/docs/_style/prism-master/.gitignore @@ -0,0 +1,4 @@ +hide-*.js +node_modules +.idea/ +.DS_Store diff --git a/docs/_style/prism-master/.npmignore b/docs/_style/prism-master/.npmignore new file mode 100644 index 00000000..2ff075c9 --- /dev/null +++ b/docs/_style/prism-master/.npmignore @@ -0,0 +1,27 @@ +.idea +*.iml + +hide-*.js + +CNAME +examples/ +img/ +templates/ +tests/ +vendor/ +*.tgz +*.html +style.css +favicon.png +logo.svg +bower.json +composer.json +download.js +examples.js +gulpfile.js +prefixfree.min.js +utopia.js +code.js +.editorconfig +.gitattributes +.travis.yml \ No newline at end of file diff --git a/docs/_style/prism-master/.travis.yml b/docs/_style/prism-master/.travis.yml new file mode 100644 index 00000000..3d0c7d16 --- /dev/null +++ b/docs/_style/prism-master/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +node_js: +- '4' +- '6' +- '8' +- '9' +# Build all branches +branches: + only: + - gh-pages + - /.*/ +before_script: +- npm install -g gulp +- gulp +script: npm test +deploy: + provider: npm + email: lea@verou.me + api_key: + secure: TjRcXEr7Y/9KRJ4EOEQbd2Ij8hxKj8c/yOpEROy2lTYv6QH9x46nFDgZEE3VHfp/nnBUYpC47dRaSxiUj8H5rtkMNCZrREZu1n1zahmzP6dI6kCj+H3GiY7yw/Jhdx3uvQZHwknW2TJ/YRsLeQsmMSG2HnJobY9Zn4REX5ccP2E= + on: + tags: true + repo: PrismJS/prism diff --git a/docs/_style/prism-master/CHANGELOG.md b/docs/_style/prism-master/CHANGELOG.md new file mode 100644 index 00000000..14c64052 --- /dev/null +++ b/docs/_style/prism-master/CHANGELOG.md @@ -0,0 +1,1334 @@ +# Prism Changelog + +## 1.15.0 (2018-06-16) + +### New components + +* __Template Tookit 2__ ([#1418](https://github.com/PrismJS/prism/issues/1418)) [[`e063992`](https://github.com/PrismJS/prism/commit/e063992)] +* __XQuery__ ([#1411](https://github.com/PrismJS/prism/issues/1411)) [[`e326cb0`](https://github.com/PrismJS/prism/commit/e326cb0)] +* __TAP__ ([#1430](https://github.com/PrismJS/prism/issues/1430)) [[`8c2b71f`](https://github.com/PrismJS/prism/commit/8c2b71f)] + +### Updated components + +* __HTTP__ + * Absolute path is a valid request uri ([#1388](https://github.com/PrismJS/prism/issues/1388)) [[`f6e81cb`](https://github.com/PrismJS/prism/commit/f6e81cb)] +* __Kotlin__ + * Add keywords of Kotlin and modify it's number pattern. ([#1389](https://github.com/PrismJS/prism/issues/1389)) [[`1bf73b0`](https://github.com/PrismJS/prism/commit/1bf73b0)] + * Add `typealias` keyword ([#1437](https://github.com/PrismJS/prism/issues/1437)) [[`a21fdee`](https://github.com/PrismJS/prism/commit/a21fdee)] +* __JavaScript + * Improve Regexp pattern [[`5b043cf`](https://github.com/PrismJS/prism/commit/5b043cf)] + * Add support for one level of nesting inside template strings. Fix [#1397](https://github.com/PrismJS/prism/issues/1397) [[`db2d0eb`](https://github.com/PrismJS/prism/commit/db2d0eb)] +* __Elixir__ + * Elixir: Fix attributes consuming punctuation. Fix [#1392](https://github.com/PrismJS/prism/issues/1392) [[`dac0485`](https://github.com/PrismJS/prism/commit/dac0485)] +* __Bash__ + * Change reserved keyword reference ([#1396](https://github.com/PrismJS/prism/issues/1396)) [[`b94f01f`](https://github.com/PrismJS/prism/commit/b94f01f)] +* __PowerShell__ + * Allow for one level of nesting in expressions inside strings. Fix [#1407](https://github.com/PrismJS/prism/issues/1407) [[`9272d6f`](https://github.com/PrismJS/prism/commit/9272d6f)] +* __JSX__ + * Allow for two levels of nesting inside JSX tags. Fix [#1408](https://github.com/PrismJS/prism/issues/1408) [[`f1cd7c5`](https://github.com/PrismJS/prism/commit/f1cd7c5)] + * Add support for fragments short syntax. Fix [#1421](https://github.com/PrismJS/prism/issues/1421) [[`38ce121`](https://github.com/PrismJS/prism/commit/38ce121)] +* __Pascal__ + * Add `objectpascal` as an alias to `pascal` ([#1426](https://github.com/PrismJS/prism/issues/1426)) [[`a0bfc84`](https://github.com/PrismJS/prism/commit/a0bfc84)] +* __Swift__ + * Fix Swift 'protocol' keyword ([#1440](https://github.com/PrismJS/prism/issues/1440)) [[`081e318`](https://github.com/PrismJS/prism/commit/081e318)] + +### Updated plugins + +* __File Highlight__ + * Fix issue causing the Download button to show up on every code blocks. [[`cd22499`](https://github.com/PrismJS/prism/commit/cd22499)] + * Simplify lang regex on File Highlight plugin ([#1399](https://github.com/PrismJS/prism/issues/1399)) [[`7bc9a4a`](https://github.com/PrismJS/prism/commit/7bc9a4a)] +* __Show Language__ + * Don't process language if block language not set ([#1410](https://github.com/PrismJS/prism/issues/1410)) [[`c111869`](https://github.com/PrismJS/prism/commit/c111869)] +* __Autoloader__ + * ASP.NET should require C# [[`fa328bb`](https://github.com/PrismJS/prism/commit/fa328bb)] +* __Line Numbers__ + * Make line-numbers styles more specific ([#1434](https://github.com/PrismJS/prism/issues/1434), [#1435](https://github.com/PrismJS/prism/issues/1435)) [[`9ee4f54`](https://github.com/PrismJS/prism/commit/9ee4f54)] + +### Updated themes + +* Add .token.class-name to rest of themes ([#1360](https://github.com/PrismJS/prism/issues/1360)) [[`f356dfe`](https://github.com/PrismJS/prism/commit/f356dfe)] + +### Other changes + +* __Website__ + * Site now loads over HTTPS! + * Use HTTPS / canonical URLs ([#1390](https://github.com/PrismJS/prism/issues/1390)) [[`95146c8`](https://github.com/PrismJS/prism/commit/95146c8)] + * Added Angular tutorial link [[`c436a7c`](https://github.com/PrismJS/prism/commit/c436a7c)] + * Use rel="icon" instead of rel="shortcut icon" ([#1398](https://github.com/PrismJS/prism/issues/1398)) [[`d95f8fb`](https://github.com/PrismJS/prism/commit/d95f8fb)] + * Fix Download page not handling multiple dependencies when from Redownload URL [[`c2ff248`](https://github.com/PrismJS/prism/commit/c2ff248)] + * Update documentation for node & webpack usage [[`1e99e96`](https://github.com/PrismJS/prism/commit/1e99e96)] +* Handle optional dependencies in `loadLanguages()` ([#1417](https://github.com/PrismJS/prism/issues/1417)) [[`84935ac`](https://github.com/PrismJS/prism/commit/84935ac)] +* Add Chinese translation [[`f2b1964`](https://github.com/PrismJS/prism/commit/f2b1964)] + +## 1.14.0 (2018-04-11) + +### New components +* __GEDCOM__ ([#1385](https://github.com/PrismJS/prism/issues/1385)) [[`6e0b20a`](https://github.com/PrismJS/prism/commit/6e0b20a)] +* __Lisp__ ([#1297](https://github.com/PrismJS/prism/issues/1297)) [[`46468f8`](https://github.com/PrismJS/prism/commit/46468f8)] +* __Markup Templating__ ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)] +* __Soy__ ([#1387](https://github.com/PrismJS/prism/issues/1387)) [[`b4509bf`](https://github.com/PrismJS/prism/commit/b4509bf)] +* __Velocity__ ([#1378](https://github.com/PrismJS/prism/issues/1378)) [[`5a524f7`](https://github.com/PrismJS/prism/commit/5a524f7)] +* __Visual Basic__ ([#1382](https://github.com/PrismJS/prism/issues/1382)) [[`c673ec2`](https://github.com/PrismJS/prism/commit/c673ec2)] +* __WebAssembly__ ([#1386](https://github.com/PrismJS/prism/issues/1386)) [[`c28d8c5`](https://github.com/PrismJS/prism/commit/c28d8c5)] + +### Updated components +* __Bash__: + * Add curl to the list of common functions. Close [#1160](https://github.com/PrismJS/prism/issues/1160) [[`1bfc084`](https://github.com/PrismJS/prism/commit/1bfc084)] +* __C-like__: + * Make single-line comments greedy. Fix [#1337](https://github.com/PrismJS/prism/issues/1337). Make sure [#1340](https://github.com/PrismJS/prism/issues/1340) stays fixed. [[`571f2c5`](https://github.com/PrismJS/prism/commit/571f2c5)] +* __C#__: + * More generic class-name highlighting. Fix [#1365](https://github.com/PrismJS/prism/issues/1365) [[`a6837d2`](https://github.com/PrismJS/prism/commit/a6837d2)] + * More specific class-name highlighting. Fix [#1371](https://github.com/PrismJS/prism/issues/1371) [[`0a95f69`](https://github.com/PrismJS/prism/commit/0a95f69)] +* __Eiffel__: + * Fix verbatim strings. Fix [#1379](https://github.com/PrismJS/prism/issues/1379) [[`04df41b`](https://github.com/PrismJS/prism/commit/04df41b)] +* __Elixir__ + * Make regexps greedy, remove comment hacks. Update known failures and tests. [[`e93d61f`](https://github.com/PrismJS/prism/commit/e93d61f)] +* __ERB__: + * Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)] +* __Fortran__: + * Make single-line comments greedy. Update known failures and tests. [[`c083b78`](https://github.com/PrismJS/prism/commit/c083b78)] +* __Handlebars__: + * Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)] +* __Java__: + * Add support for generics. Fix [#1351](https://github.com/PrismJS/prism/issues/1351) [[`a5cf302`](https://github.com/PrismJS/prism/commit/a5cf302)] +* __JavaScript__: + * Add support for constants. Fix [#1348](https://github.com/PrismJS/prism/issues/1348) [[`9084481`](https://github.com/PrismJS/prism/commit/9084481)] + * Improve Regex matching [[`172d351`](https://github.com/PrismJS/prism/commit/172d351)] +* __JSX__: + * Fix highlighting of empty objects. Fix [#1364](https://github.com/PrismJS/prism/issues/1364) [[`b26bbb8`](https://github.com/PrismJS/prism/commit/b26bbb8)] +* __Monkey__: + * Make comments greedy. Update known failures and tests. [[`d7b2b43`](https://github.com/PrismJS/prism/commit/d7b2b43)] +* __PHP__: + * Make highlighting work properly in NodeJS ([#1367](https://github.com/PrismJS/prism/issues/1367)) [[`5f9c078`](https://github.com/PrismJS/prism/commit/5f9c078)] +* __Puppet__: + * Make heredoc, comments, regexps and strings greedy. Update known failures and tests. [[`0c139d1`](https://github.com/PrismJS/prism/commit/0c139d1)] +* __Q__: + * Make comments greedy. Update known failures and tests. [[`a0f5081`](https://github.com/PrismJS/prism/commit/a0f5081)] +* __Ruby__: + * Make multi-line comments greedy, remove single-line comment hack. Update known failures and tests. [[`b0e34fb`](https://github.com/PrismJS/prism/commit/b0e34fb)] +* __SQL__: + * Add missing keywords. Fix [#1374](https://github.com/PrismJS/prism/issues/1374) [[`238b195`](https://github.com/PrismJS/prism/commit/238b195)] + +### Updated plugins +* __Command Line__: + * Command Line: Allow specifying output prefix using data-filter-output attribute. ([#856](https://github.com/PrismJS/prism/issues/856)) [[`094d546`](https://github.com/PrismJS/prism/commit/094d546)] +* __File Highlight__: + * Add option to provide a download button, when used with the Toolbar plugin. Fix [#1030](https://github.com/PrismJS/prism/issues/1030) [[`9f22952`](https://github.com/PrismJS/prism/commit/9f22952)] + +### Updated themes +* __Default__: + * Reach AA contrast ratio level ([#1296](https://github.com/PrismJS/prism/issues/1296)) [[`8aea939`](https://github.com/PrismJS/prism/commit/8aea939)] + +### Other changes +* Website: Remove broken third-party tutorials from homepage [[`0efd6e1`](https://github.com/PrismJS/prism/commit/0efd6e1)] +* Docs: Mention `loadLanguages()` function on homepage in the nodeJS section. Close [#972](https://github.com/PrismJS/prism/issues/972), close [#593](https://github.com/PrismJS/prism/issues/593) [[`4a14d20`](https://github.com/PrismJS/prism/commit/4a14d20)] +* Core: Greedy patterns should always be matched against the full string. Fix [#1355](https://github.com/PrismJS/prism/issues/1355) [[`294efaa`](https://github.com/PrismJS/prism/commit/294efaa)] +* Crystal: Update known failures. [[`e1d2d42`](https://github.com/PrismJS/prism/commit/e1d2d42)] +* D: Update known failures and tests. [[`13d9991`](https://github.com/PrismJS/prism/commit/13d9991)] +* Markdown: Update known failures. [[`5b6c76d`](https://github.com/PrismJS/prism/commit/5b6c76d)] +* Matlab: Update known failures. [[`259b6fc`](https://github.com/PrismJS/prism/commit/259b6fc)] +* Website: Remove non-existent anchor to failures. Reword on homepage to make is less misleading. [[`8c0911a`](https://github.com/PrismJS/prism/commit/8c0911a)] +* Website: Add link to Keep Markup plugin in FAQ [[`e8cb6d4`](https://github.com/PrismJS/prism/commit/e8cb6d4)] +* Test suite: Memory leak in vm.runInNewContext() seems fixed. Revert [[`9a4b6fa`](https://github.com/PrismJS/prism/commit/9a4b6fa)] to drastically improve tests execution time. [[`9bceece`](https://github.com/PrismJS/prism/commit/9bceece), [`7c7602b`](https://github.com/PrismJS/prism/commit/7c7602b)] +* Gulp: Don't minify `components/index.js` [[`689227b`](https://github.com/PrismJS/prism/commit/689227b)] +* Website: Fix theme selection on Download page, when theme is in query string or hash. [[`b4d3063`](https://github.com/PrismJS/prism/commit/b4d3063)] +* Update JSPM config to also include unminified components. Close [#995](https://github.com/PrismJS/prism/issues/995) [[`218f160`](https://github.com/PrismJS/prism/commit/218f160)] +* Core: Fix support for language alias containing dash `-` [[`659ea31`](https://github.com/PrismJS/prism/commit/659ea31)] + +## 1.13.0 (2018-03-21) + +### New components +* __ERB__ [[`e6213ac`](https://github.com/PrismJS/prism/commit/e6213ac)] +* __PL/SQL__ ([#1338](https://github.com/PrismJS/prism/issues/1338)) [[`3599e6a`](https://github.com/PrismJS/prism/commit/3599e6a)] + +### Updated components +* __JSX__: + * Add support for plain text inside tags ([#1357](https://github.com/PrismJS/prism/issues/1357)) [[`2b8321d`](https://github.com/PrismJS/prism/commit/2b8321d)] +* __Markup__: + * Make tags greedy. Fix [#1356](https://github.com/PrismJS/prism/issues/1356) [[`af834be`](https://github.com/PrismJS/prism/commit/af834be)] +* __Powershell__: + * Add lookbehind to fix function interpolation inside strings. Fix [#1361](https://github.com/PrismJS/prism/issues/1361) [[`d2c026e`](https://github.com/PrismJS/prism/commit/d2c026e)] +* __Rust__: + * Improve char pattern so that lifetime annotations are matched better. Fix [#1353](https://github.com/PrismJS/prism/issues/1353) [[`efdccbf`](https://github.com/PrismJS/prism/commit/efdccbf)] + +### Updated themes +* __Default__: + * Add color for class names [[`8572474`](https://github.com/PrismJS/prism/commit/8572474)] +* __Coy__: + * Inherit pre's height on code, so it does not break on Download page. [[`c6c7fd1`](https://github.com/PrismJS/prism/commit/c6c7fd1)] + +### Other changes +* Website: Auto-generate example headers [[`c3ed5b5`](https://github.com/PrismJS/prism/commit/c3ed5b5)] +* Core: Allow cloning of circular structures. ([#1345](https://github.com/PrismJS/prism/issues/1345)) [[`f90d555`](https://github.com/PrismJS/prism/commit/f90d555)] +* Core: Generate components.js from components.json and make it exportable to nodeJS. ([#1354](https://github.com/PrismJS/prism/issues/1354)) [[`ba60df0`](https://github.com/PrismJS/prism/commit/ba60df0)] +* Website: Improve appearance of theme selector [[`0460cad`](https://github.com/PrismJS/prism/commit/0460cad)] +* Website: Check stored theme by default + link both theme selectors together. Close [#1038](https://github.com/PrismJS/prism/issues/1038) [[`212dd4e`](https://github.com/PrismJS/prism/commit/212dd4e)] +* Tests: Use the new components.js file directly [[`0e1a8b7`](https://github.com/PrismJS/prism/commit/0e1a8b7)] +* Update .npmignore Close [#1274](https://github.com/PrismJS/prism/issues/1274) [[`a52319a`](https://github.com/PrismJS/prism/commit/a52319a)] +* Add a loadLanguages() function for easy component loading on NodeJS ([#1359](https://github.com/PrismJS/prism/issues/1359)) [[`a5331a6`](https://github.com/PrismJS/prism/commit/a5331a6)] + +## 1.12.2 (2018-03-08) + +### Other changes +* Test against NodeJS 4, 6, 8 and 9 ([#1329](https://github.com/PrismJS/prism/issues/1329)) [[`97b7d0a`](https://github.com/PrismJS/prism/commit/97b7d0a)] +* Stop testing against NodeJS 0.10 and 0.12 [[`df01b1b`](https://github.com/PrismJS/prism/commit/df01b1b)] + +## 1.12.1 (2018-03-08) + +### Updated components +* __C-like__: + * Revert [[`b98e5b9`](https://github.com/PrismJS/prism/commit/b98e5b9)] to fix [#1340](https://github.com/PrismJS/prism/issues/1340). Reopened [#1337](https://github.com/PrismJS/prism/issues/1337). [[`cebacdf`](https://github.com/PrismJS/prism/commit/cebacdf)] +* __JSX__: + * Allow for one level of nested curly braces inside tag attribute value. Fix [#1335](https://github.com/PrismJS/prism/issues/1335) [[`05bf67d`](https://github.com/PrismJS/prism/commit/05bf67d)] +* __Ruby__: + * Ensure module syntax is not confused with symbols. Fix [#1336](https://github.com/PrismJS/prism/issues/1336) [[`31a2a69`](https://github.com/PrismJS/prism/commit/31a2a69)] + +## 1.12.0 (2018-03-07) + +### New components +* __ARFF__ ([#1327](https://github.com/PrismJS/prism/issues/1327)) [[`0bc98ac`](https://github.com/PrismJS/prism/commit/0bc98ac)] +* __Clojure__ ([#1311](https://github.com/PrismJS/prism/issues/1311)) [[`8b4d3bd`](https://github.com/PrismJS/prism/commit/8b4d3bd)] +* __Liquid__ ([#1326](https://github.com/PrismJS/prism/issues/1326)) [[`f0b2c9e`](https://github.com/PrismJS/prism/commit/f0b2c9e)] + +### Updated components +* __Bash__: + * Add shell as an alias ([#1321](https://github.com/PrismJS/prism/issues/1321)) [[`67e16a2`](https://github.com/PrismJS/prism/commit/67e16a2)] + * Add support for quoted command substitution. Fix [#1287](https://github.com/PrismJS/prism/issues/1287) [[`63fc215`](https://github.com/PrismJS/prism/commit/63fc215)] +* __C#__: + * Add "dotnet" alias. [[`405867c`](https://github.com/PrismJS/prism/commit/405867c)] +* __C-like__: + * Change order of comment patterns and make multi-line one greedy. Fix [#1337](https://github.com/PrismJS/prism/issues/1337) [[`b98e5b9`](https://github.com/PrismJS/prism/commit/b98e5b9)] +* __NSIS__: + * Add support for NSIS 3.03 ([#1288](https://github.com/PrismJS/prism/issues/1288)) [[`bd1e98b`](https://github.com/PrismJS/prism/commit/bd1e98b)] + * Add missing NSIS commands ([#1289](https://github.com/PrismJS/prism/issues/1289)) [[`ad2948f`](https://github.com/PrismJS/prism/commit/ad2948f)] +* __PHP__: + * Add support for string interpolation inside double-quoted strings. Fix [#1146](https://github.com/PrismJS/prism/issues/1146) [[`9f1f8d6`](https://github.com/PrismJS/prism/commit/9f1f8d6)] + * Add support for Heredoc and Nowdoc strings [[`5d7223c`](https://github.com/PrismJS/prism/commit/5d7223c)] + * Fix shell-comment failure now that strings are greedy [[`ad25d22`](https://github.com/PrismJS/prism/commit/ad25d22)] +* __PowerShell__: + * Add support for two levels of nested brackets inside namespace pattern. Fixes [#1317](https://github.com/PrismJS/prism/issues/1317) [[`3bc3e9c`](https://github.com/PrismJS/prism/commit/3bc3e9c)] +* __Ruby__: + * Add keywords "protected", "private" and "public" [[`4593837`](https://github.com/PrismJS/prism/commit/4593837)] +* __Rust__: + * Add support for lifetime-annotation and => operator. Fix [#1339](https://github.com/PrismJS/prism/issues/1339) [[`926f6f8`](https://github.com/PrismJS/prism/commit/926f6f8)] +* __Scheme__: + * Don't highlight first number of a list as a function. Fix [#1331](https://github.com/PrismJS/prism/issues/1331) [[`51bff80`](https://github.com/PrismJS/prism/commit/51bff80)] +* __SQL__: + * Add missing keywords and functions, fix numbers [[`de29d4a`](https://github.com/PrismJS/prism/commit/de29d4a)] + +### Updated plugins +* __Autolinker__: + * Allow more chars in query string and hash to match more URLs. Fix [#1142](https://github.com/PrismJS/prism/issues/1142) [[`109bd6f`](https://github.com/PrismJS/prism/commit/109bd6f)] +* __Copy to Clipboard__: + * Bump ClipboardJS to 2.0.0 and remove hack ([#1314](https://github.com/PrismJS/prism/issues/1314)) [[`e9f410e`](https://github.com/PrismJS/prism/commit/e9f410e)] +* __Toolbar__: + * Prevent scrolling toolbar with content ([#1305](https://github.com/PrismJS/prism/issues/1305), [#1314](https://github.com/PrismJS/prism/issues/1314)) [[`84eeb89`](https://github.com/PrismJS/prism/commit/84eeb89)] +* __Unescaped Markup__: + * Use msMatchesSelector for IE11 and below. Fix [#1302](https://github.com/PrismJS/prism/issues/1302) [[`c246c1a`](https://github.com/PrismJS/prism/commit/c246c1a)] +* __WebPlatform Docs__: + * WebPlatform Docs plugin: Fix links. Fixes [#1290](https://github.com/PrismJS/prism/issues/1290) [[`7a9dbe0`](https://github.com/PrismJS/prism/commit/7a9dbe0)] + +### Other changes +* Fix Autoloader's demo page [[`3dddac9`](https://github.com/PrismJS/prism/commit/3dddac9)] +* Download page: Use hash instead of query-string for redownload URL. Fix [#1263](https://github.com/PrismJS/prism/issues/1263) [[`b03c02a`](https://github.com/PrismJS/prism/commit/b03c02a)] +* Core: Don't thow an error if lookbehing is used without anything matching. [[`e0cd47f`](https://github.com/PrismJS/prism/commit/e0cd47f)] +* Docs: Fix link to the `` element specification in HTML5 [[`a84263f`](https://github.com/PrismJS/prism/commit/a84263f)] +* Docs: Mention support for `lang-xxxx` class. Close [#1312](https://github.com/PrismJS/prism/issues/1312) [[`a9e76db`](https://github.com/PrismJS/prism/commit/a9e76db)] +* Docs: Add note on `async` parameter to clarify the requirement of using a single bundled file. Closes [#1249](https://github.com/PrismJS/prism/issues/1249) [[`eba0235`](https://github.com/PrismJS/prism/commit/eba0235)] + +## 1.11.0 (2018-02-05) + +### New components +* __Content-Security-Policy (CSP)__ ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)] +* __HTTP Public-Key-Pins (HPKP)__ ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)] +* __HTTP String-Transport-Security (HSTS)__ ([#1275](https://github.com/PrismJS/prism/issues/1275)) [[`b08cae5`](https://github.com/PrismJS/prism/commit/b08cae5)] +* __React TSX__ ([#1280](https://github.com/PrismJS/prism/issues/1280)) [[`fbe82b8`](https://github.com/PrismJS/prism/commit/fbe82b8)] + +### Updated components +* __C++__: + * Add C++ platform-independent types ([#1271](https://github.com/PrismJS/prism/issues/1271)) [[`3da238f`](https://github.com/PrismJS/prism/commit/3da238f)] +* __TypeScript__: + * Improve typescript with builtins ([#1277](https://github.com/PrismJS/prism/issues/1277)) [[`5de1b1f`](https://github.com/PrismJS/prism/commit/5de1b1f)] + +### Other changes +* Fix passing of non-enumerable Error properties from the child test runner ([#1276](https://github.com/PrismJS/prism/issues/1276)) [[`38df653`](https://github.com/PrismJS/prism/commit/38df653)] + +## 1.10.0 (2018-01-17) + +### New components +* __6502 Assembly__ ([#1245](https://github.com/PrismJS/prism/issues/1245)) [[`2ece18b`](https://github.com/PrismJS/prism/commit/2ece18b)] +* __Elm__ ([#1174](https://github.com/PrismJS/prism/issues/1174)) [[`d6da70e`](https://github.com/PrismJS/prism/commit/d6da70e)] +* __IchigoJam BASIC__ ([#1246](https://github.com/PrismJS/prism/issues/1246)) [[`cf840be`](https://github.com/PrismJS/prism/commit/cf840be)] +* __Io__ ([#1251](https://github.com/PrismJS/prism/issues/1251)) [[`84ed3ed`](https://github.com/PrismJS/prism/commit/84ed3ed)] + +### Updated components +* __BASIC__: + * Make strings greedy [[`60114d0`](https://github.com/PrismJS/prism/commit/60114d0)] +* __C++__: + * Add C++11 raw string feature ([#1254](https://github.com/PrismJS/prism/issues/1254)) [[`71595be`](https://github.com/PrismJS/prism/commit/71595be)] + +### Updated plugins +* __Autoloader__: + * Add support for `data-autoloader-path` ([#1242](https://github.com/PrismJS/prism/issues/1242)) [[`39360d6`](https://github.com/PrismJS/prism/commit/39360d6)] +* __Previewers__: + * New plugin combining previous plugins Previewer: Base, Previewer: Angle, Previewer: Color, Previewer: Easing, Previewer: Gradient and Previewer: Time. ([#1244](https://github.com/PrismJS/prism/issues/1244)) [[`28e4b4c`](https://github.com/PrismJS/prism/commit/28e4b4c)] +* __Unescaped Markup__: + * Make it work with any language ([#1265](https://github.com/PrismJS/prism/issues/1265)) [[`7bcdae7`](https://github.com/PrismJS/prism/commit/7bcdae7)] + +### Other changes +* Add attribute `style` in `package.json` ([#1256](https://github.com/PrismJS/prism/issues/1256)) [[`a9b6785`](https://github.com/PrismJS/prism/commit/a9b6785)] + +## 1.9.0 (2017-12-06) + +### New components +* __Flow__ [[`d27b70d`](https://github.com/PrismJS/prism/commit/d27b70d)] + +### Updated components +* __CSS__: + * Unicode characters in CSS properties ([#1227](https://github.com/PrismJS/prism/issues/1227)) [[`f234ea4`](https://github.com/PrismJS/prism/commit/f234ea4)] +* __JSX__: + * JSX: Improve highlighting support. Fix [#1235](https://github.com/PrismJS/prism/issues/1235) and [#1236](https://github.com/PrismJS/prism/issues/1236) [[`f41c5cd`](https://github.com/PrismJS/prism/commit/f41c5cd)] +* __Markup__: + * Make CSS and JS inclusions in Markup greedy. Fix [#1240](https://github.com/PrismJS/prism/issues/1240) [[`7dc1e45`](https://github.com/PrismJS/prism/commit/7dc1e45)] +* __PHP__: + * Add support for multi-line strings. Fix [#1233](https://github.com/PrismJS/prism/issues/1233) [[`9a542a0`](https://github.com/PrismJS/prism/commit/9a542a0)] + +### Updated plugins +* __Copy to clipboard__: + * Fix test for native Clipboard. Fix [#1241](https://github.com/PrismJS/prism/issues/1241) [[`e7b5e82`](https://github.com/PrismJS/prism/commit/e7b5e82)] + * Copy to clipboard: Update to v1.7.1. Fix [#1220](https://github.com/PrismJS/prism/issues/1220) [[`a1b85e3`](https://github.com/PrismJS/prism/commit/a1b85e3), [`af50e44`](https://github.com/PrismJS/prism/commit/af50e44)] +* __Line highlight__: + * Fixes to compatibility of line number and line higlight plugins ([#1194](https://github.com/PrismJS/prism/issues/1194)) [[`e63058f`](https://github.com/PrismJS/prism/commit/e63058f), [`3842a91`](https://github.com/PrismJS/prism/commit/3842a91)] +* __Unescaped Markup__: + * Fix ambiguity in documentation by improving examples. Fix [#1197](https://github.com/PrismJS/prism/issues/1197) [[`924784a`](https://github.com/PrismJS/prism/commit/924784a)] + +### Other changes +* Allow any element being root instead of document. ([#1230](https://github.com/PrismJS/prism/issues/1230)) [[`69f2e2c`](https://github.com/PrismJS/prism/commit/69f2e2c), [`6e50d44`](https://github.com/PrismJS/prism/commit/6e50d44)] +* Coy Theme: The 'height' element makes code blocks the height of the browser canvas. ([#1224](https://github.com/PrismJS/prism/issues/1224)) [[`ac219d7`](https://github.com/PrismJS/prism/commit/ac219d7)] +* Download page: Fix implicitly declared variable [[`f986551`](https://github.com/PrismJS/prism/commit/f986551)] +* Download page: Add version number at the beginning of the generated files. Fix [#788](https://github.com/PrismJS/prism/issues/788) [[`928790d`](https://github.com/PrismJS/prism/commit/928790d)] + +## 1.8.4 (2017-11-05) + +### Updated components + +* __ABAP__: + * Regexp optimisation [[`7547f83`](https://github.com/PrismJS/prism/commit/7547f83)] +* __ActionScript__: + * Fix XML regex + optimise [[`75d00d7`](https://github.com/PrismJS/prism/commit/75d00d7)] +* __Ada__: + * Regexp simplification [[`e881fe3`](https://github.com/PrismJS/prism/commit/e881fe3)] +* __Apacheconf__: + * Regexp optimisation [[`a065e61`](https://github.com/PrismJS/prism/commit/a065e61)] +* __APL__: + * Regexp simplification [[`33297c4`](https://github.com/PrismJS/prism/commit/33297c4)] +* __AppleScript__: + * Regexp optimisation [[`d879f36`](https://github.com/PrismJS/prism/commit/d879f36)] +* __Arduino__: + * Don't use captures if not needed [[`16b338f`](https://github.com/PrismJS/prism/commit/16b338f)] +* __ASP.NET__: + * Regexp optimisation [[`438926c`](https://github.com/PrismJS/prism/commit/438926c)] +* __AutoHotkey__: + * Regexp simplification + don't use captures if not needed [[`5edfd2f`](https://github.com/PrismJS/prism/commit/5edfd2f)] +* __Bash__: + * Regexp optimisation and simplification [[`75b9b29`](https://github.com/PrismJS/prism/commit/75b9b29)] +* __Bro__: + * Regexp simplification + don't use captures if not needed [[`d4b9003`](https://github.com/PrismJS/prism/commit/d4b9003)] +* __C__: + * Regexp optimisation + don't use captures if not needed [[`f61d487`](https://github.com/PrismJS/prism/commit/f61d487)] +* __C++__: + * Fix operator regexp + regexp simplification + don't use captures if not needed [[`ffeb26e`](https://github.com/PrismJS/prism/commit/ffeb26e)] +* __C#__: + * Remove duplicates in keywords + regexp optimisation + don't use captures if not needed [[`d28d178`](https://github.com/PrismJS/prism/commit/d28d178)] +* __C-like__: + * Regexp simplification + don't use captures if not needed [[`918e0ff`](https://github.com/PrismJS/prism/commit/918e0ff)] +* __CoffeeScript__: + * Regexp optimisation + don't use captures if not needed [[`5895978`](https://github.com/PrismJS/prism/commit/5895978)] +* __Crystal__: + * Remove trailing comma [[`16979a3`](https://github.com/PrismJS/prism/commit/16979a3)] +* __CSS__: + * Regexp simplification + don't use captures if not needed + handle multi-line style attributes [[`43d9f36`](https://github.com/PrismJS/prism/commit/43d9f36)] +* __CSS Extras__: + * Regexp simplification [[`134ed70`](https://github.com/PrismJS/prism/commit/134ed70)] +* __D__: + * Regexp optimisation [[`fbe39c9`](https://github.com/PrismJS/prism/commit/fbe39c9)] +* __Dart__: + * Regexp optimisation [[`f24e919`](https://github.com/PrismJS/prism/commit/f24e919)] +* __Django__: + * Regexp optimisation [[`a95c51d`](https://github.com/PrismJS/prism/commit/a95c51d)] +* __Docker__: + * Regexp optimisation [[`27f99ff`](https://github.com/PrismJS/prism/commit/27f99ff)] +* __Eiffel__: + * Regexp optimisation [[`b7cdea2`](https://github.com/PrismJS/prism/commit/b7cdea2)] +* __Elixir__: + * Regexp optimisation + uniform behavior between ~r and ~s [[`5d12e80`](https://github.com/PrismJS/prism/commit/5d12e80)] +* __Erlang__: + * Regexp optimisation [[`e7b411e`](https://github.com/PrismJS/prism/commit/e7b411e)] +* __F#__: + * Regexp optimisation + don't use captures if not needed [[`7753fc4`](https://github.com/PrismJS/prism/commit/7753fc4)] +* __Gherkin__: + * Regexp optimisation + don't use captures if not needed + added explanation comment on table-body regexp [[`f26197a`](https://github.com/PrismJS/prism/commit/f26197a)] +* __Git__: + * Regexp optimisation [[`b9483b9`](https://github.com/PrismJS/prism/commit/b9483b9)] +* __GLSL__: + * Regexp optimisation [[`e66d21b`](https://github.com/PrismJS/prism/commit/e66d21b)] +* __Go__: + * Regexp optimisation + don't use captures if not needed [[`88caabb`](https://github.com/PrismJS/prism/commit/88caabb)] +* __GraphQL__: + * Regexp optimisation and simplification [[`2474f06`](https://github.com/PrismJS/prism/commit/2474f06)] +* __Groovy__: + * Regexp optimisation + don't use captures if not needed [[`e74e00c`](https://github.com/PrismJS/prism/commit/e74e00c)] +* __Haml__: + * Regexp optimisation + don't use captures if not needed + fix typo in comment [[`23e3b43`](https://github.com/PrismJS/prism/commit/23e3b43)] +* __Handlebars__: + * Regexp optimisation + don't use captures if not needed [[`09dbfce`](https://github.com/PrismJS/prism/commit/09dbfce)] +* __Haskell__: + * Regexp simplification + don't use captures if not needed [[`f11390a`](https://github.com/PrismJS/prism/commit/f11390a)] +* __HTTP__: + * Regexp simplification + don't use captures if not needed [[`37ef24e`](https://github.com/PrismJS/prism/commit/37ef24e)] +* __Icon__: + * Regexp optimisation [[`9cf64a0`](https://github.com/PrismJS/prism/commit/9cf64a0)] +* __J__: + * Regexp simplification [[`de15150`](https://github.com/PrismJS/prism/commit/de15150)] +* __Java__: + * Don't use captures if not needed [[`96b35c8`](https://github.com/PrismJS/prism/commit/96b35c8)] +* __JavaScript__: + * Regexp optimisation + don't use captures if not needed [[`93d4002`](https://github.com/PrismJS/prism/commit/93d4002)] +* __Jolie__: + * Regexp optimisation + don't use captures if not needed + remove duplicates in keywords [[`a491f9e`](https://github.com/PrismJS/prism/commit/a491f9e)] +* __JSON__: + * Make strings greedy, remove negative look-ahead for ":". Fix [#1204](https://github.com/PrismJS/prism/issues/1204) [[`98acd2d`](https://github.com/PrismJS/prism/commit/98acd2d)] + * Regexp optimisation + don't use captures if not needed [[`8fc1b03`](https://github.com/PrismJS/prism/commit/8fc1b03)] +* __JSX__: + * Regexp optimisation + handle spread operator as a whole [[`28de4e2`](https://github.com/PrismJS/prism/commit/28de4e2)] +* __Julia__: + * Regexp optimisation and simplification [[`12684c0`](https://github.com/PrismJS/prism/commit/12684c0)] +* __Keyman__: + * Regexp optimisation + don't use captures if not needed [[`9726087`](https://github.com/PrismJS/prism/commit/9726087)] +* __Kotlin__: + * Regexp simplification [[`12ff8dc`](https://github.com/PrismJS/prism/commit/12ff8dc)] +* __LaTeX__: + * Regexp optimisation and simplification [[`aa426b0`](https://github.com/PrismJS/prism/commit/aa426b0)] +* __LiveScript__: + * Make interpolated strings greedy + fix variable and identifier regexps [[`c581049`](https://github.com/PrismJS/prism/commit/c581049)] +* __LOLCODE__: + * Don't use captures if not needed [[`52903af`](https://github.com/PrismJS/prism/commit/52903af)] +* __Makefile__: + * Regexp optimisation [[`20ae2e5`](https://github.com/PrismJS/prism/commit/20ae2e5)] +* __Markdown__: + * Don't use captures if not needed [[`f489a1e`](https://github.com/PrismJS/prism/commit/f489a1e)] +* __Markup__: + * Regexp optimisation + fix punctuation inside attr-value [[`ea380c6`](https://github.com/PrismJS/prism/commit/ea380c6)] +* __MATLAB__: + * Make strings greedy + handle line feeds better [[`4cd4f01`](https://github.com/PrismJS/prism/commit/4cd4f01)] +* __Monkey__: + * Don't use captures if not needed [[`7f47140`](https://github.com/PrismJS/prism/commit/7f47140)] +* __N4JS__: + * Don't use captures if not needed [[`2d3f9df`](https://github.com/PrismJS/prism/commit/2d3f9df)] +* __NASM__: + * Regexp optimisation and simplification + don't use captures if not needed [[`9937428`](https://github.com/PrismJS/prism/commit/9937428)] +* __nginx__: + * Remove trailing comma + remove duplicates in keywords [[`c6e7195`](https://github.com/PrismJS/prism/commit/c6e7195)] +* __NSIS__: + * Regexp optimisation + don't use captures if not needed [[`beeb107`](https://github.com/PrismJS/prism/commit/beeb107)] +* __Objective-C__: + * Don't use captures if not needed [[`9be0f88`](https://github.com/PrismJS/prism/commit/9be0f88)] +* __OCaml__: + * Regexp simplification [[`5f5f38c`](https://github.com/PrismJS/prism/commit/5f5f38c)] +* __OpenCL__: + * Don't use captures if not needed [[`5e70f1d`](https://github.com/PrismJS/prism/commit/5e70f1d)] +* __Oz__: + * Fix atom regexp [[`9320e92`](https://github.com/PrismJS/prism/commit/9320e92)] +* __PARI/GP__: + * Regexp optimisation [[`2c7b59b`](https://github.com/PrismJS/prism/commit/2c7b59b)] +* __Parser__: + * Regexp simplification [[`569d511`](https://github.com/PrismJS/prism/commit/569d511)] +* __Perl__: + * Regexp optimisation and simplification + don't use captures if not needed [[`0fe4cf6`](https://github.com/PrismJS/prism/commit/0fe4cf6)] +* __PHP__: + * Don't use captures if not needed Golmote [[`5235f18`](https://github.com/PrismJS/prism/commit/5235f18)] +* __PHP Extras__: + * Add word boundary after global keywords + don't use captures if not needed [[`9049a2a`](https://github.com/PrismJS/prism/commit/9049a2a)] +* __PowerShell__: + * Regexp optimisation + don't use captures if not needed [[`0d05957`](https://github.com/PrismJS/prism/commit/0d05957)] +* __Processing__: + * Regexp simplification [[`8110d38`](https://github.com/PrismJS/prism/commit/8110d38)] +* __.properties__: + * Regexp optimisation [[`678b621`](https://github.com/PrismJS/prism/commit/678b621)] +* __Protocol Buffers__: + * Don't use captures if not needed [[`3e256d8`](https://github.com/PrismJS/prism/commit/3e256d8)] +* __Pug__: + * Don't use captures if not needed [[`76dc925`](https://github.com/PrismJS/prism/commit/76dc925)] +* __Pure__: + * Make inline-lang greedy [[`92318b0`](https://github.com/PrismJS/prism/commit/92318b0)] +* __Python__: + * Add Python builtin function highlighting ([#1205](https://github.com/PrismJS/prism/issues/1205)) [[`2169c99`](https://github.com/PrismJS/prism/commit/2169c99)] + * Python: Add highlighting to functions with space between name and parentheses ([#1207](https://github.com/PrismJS/prism/issues/1207)) [[`3badd8a`](https://github.com/PrismJS/prism/commit/3badd8a)] + * Make triple-quoted strings greedy + regexp optimisation and simplification [[`f09f9f5`](https://github.com/PrismJS/prism/commit/f09f9f5)] +* __Qore__: + * Regexp simplification [[`69459f0`](https://github.com/PrismJS/prism/commit/69459f0)] +* __R__: + * Regexp optimisation [[`06a9da4`](https://github.com/PrismJS/prism/commit/06a9da4)] +* __Reason__: + * Regexp optimisation + don't use capture if not needed [[`19d79b4`](https://github.com/PrismJS/prism/commit/19d79b4)] +* __Ren'py__: + * Make strings greedy + don't use captures if not needed [[`91d84d9`](https://github.com/PrismJS/prism/commit/91d84d9)] +* __reST__: + * Regexp simplification + don't use captures if not needed [[`1a8b3e9`](https://github.com/PrismJS/prism/commit/1a8b3e9)] +* __Rip__: + * Regexp optimisation [[`d7f0ee8`](https://github.com/PrismJS/prism/commit/d7f0ee8)] +* __Ruby__: + * Regexp optimisation and simplification + don't use captures if not needed [[`4902ed4`](https://github.com/PrismJS/prism/commit/4902ed4)] +* __Rust__: + * Regexp optimisation and simplification + don't use captures if not needed [[`cc9d874`](https://github.com/PrismJS/prism/commit/cc9d874)] +* __Sass__: + * Regexp simplification Golmote [[`165d957`](https://github.com/PrismJS/prism/commit/165d957)] +* __Scala__: + * Regexp optimisation Golmote [[`5f50c12`](https://github.com/PrismJS/prism/commit/5f50c12)] +* __Scheme__: + * Regexp optimisation [[`bd19b04`](https://github.com/PrismJS/prism/commit/bd19b04)] +* __SCSS__: + * Regexp simplification [[`c60b7d4`](https://github.com/PrismJS/prism/commit/c60b7d4)] +* __Smalltalk__: + * Regexp simplification [[`41a2c76`](https://github.com/PrismJS/prism/commit/41a2c76)] +* __Smarty__: + * Regexp optimisation and simplification [[`e169be9`](https://github.com/PrismJS/prism/commit/e169be9)] +* __SQL__: + * Regexp optimisation [[`a6244a4`](https://github.com/PrismJS/prism/commit/a6244a4)] +* __Stylus__: + * Regexp optimisation [[`df9506c`](https://github.com/PrismJS/prism/commit/df9506c)] +* __Swift__: + * Don't use captures if not needed [[`a2d737a`](https://github.com/PrismJS/prism/commit/a2d737a)] +* __Tcl__: + * Regexp simplification + don't use captures if not needed [[`f0b8a33`](https://github.com/PrismJS/prism/commit/f0b8a33)] +* __Textile__: + * Regexp optimisation + don't use captures if not needed [[`08139ad`](https://github.com/PrismJS/prism/commit/08139ad)] +* __Twig__: + * Regexp optimisation and simplification + don't use captures if not needed [[`0b10fd0`](https://github.com/PrismJS/prism/commit/0b10fd0)] +* __TypeScript__: + * Don't use captures if not needed [[`e296caf`](https://github.com/PrismJS/prism/commit/e296caf)] +* __Verilog__: + * Regexp simplification [[`1b24b34`](https://github.com/PrismJS/prism/commit/1b24b34)] +* __VHDL__: + * Regexp optimisation and simplification [[`7af36df`](https://github.com/PrismJS/prism/commit/7af36df)] +* __vim__: + * Remove duplicates in keywords [[`700505e`](https://github.com/PrismJS/prism/commit/700505e)] +* __Wiki markup__: + * Fix escaping consistency [[`1fd690d`](https://github.com/PrismJS/prism/commit/1fd690d)] +* __YAML__: + * Regexp optimisation + don't use captures if not needed [[`1fd690d`](https://github.com/PrismJS/prism/commit/1fd690d)] + +### Other changes +* Remove comments spellcheck for AMP validation ([#1106](https://github.com/PrismJS/prism/issues/1106)) [[`de996d7`](https://github.com/PrismJS/prism/commit/de996d7)] +* Prevent error from throwing when element does not have a parentNode in highlightElement. [[`c33be19`](https://github.com/PrismJS/prism/commit/c33be19)] +* Provide a way to load Prism from inside a Worker without listening to messages. ([#1188](https://github.com/PrismJS/prism/issues/1188)) [[`d09982d`](https://github.com/PrismJS/prism/commit/d09982d)] + +## 1.8.3 (2017-10-19) + +### Other changes + +* Fix inclusion tests for Pug [[`955c2ab`](https://github.com/PrismJS/prism/commit/955c2ab)] + +## 1.8.2 (2017-10-19) + +### Updated components +* __Jade__: + * Jade has been renamed to __Pug__ ([#1201](https://github.com/PrismJS/prism/issues/1201)) [[`bcfef7c`](https://github.com/PrismJS/prism/commit/bcfef7c)] +* __JavaScript__: + * Better highlighting of functions ([#1190](https://github.com/PrismJS/prism/issues/1190)) [[`8ee2cd3`](https://github.com/PrismJS/prism/commit/8ee2cd3)] + +### Update plugins +* __Copy to clipboard__: + * Fix error occurring when using in Chrome 61+ ([#1206](https://github.com/PrismJS/prism/issues/1206)) [[`b41d571`](https://github.com/PrismJS/prism/commit/b41d571)] +* __Show invisibles__: + * Prevent error when using with Autoloader plugin ([#1195](https://github.com/PrismJS/prism/issues/1195)) [[`ed8bdb5`](https://github.com/PrismJS/prism/commit/ed8bdb5)] + +## 1.8.1 (2017-09-16) + +### Other changes + +* Add Arduino to components.js [[`290a3c6`](https://github.com/PrismJS/prism/commit/290a3c6)] + +## 1.8.0 (2017-09-16) + +### New components + +* __Arduino__ ([#1184](https://github.com/PrismJS/prism/issues/1184)) [[`edf2454`](https://github.com/PrismJS/prism/commit/edf2454)] +* __OpenCL__ ([#1175](https://github.com/PrismJS/prism/issues/1175)) [[`131e8fa`](https://github.com/PrismJS/prism/commit/131e8fa)] + +### Updated plugins + +* __Autolinker__: + * Silently catch any error thrown by decodeURIComponent. Fixes [#1186](https://github.com/PrismJS/prism/issues/1186) [[`2e43fcf`](https://github.com/PrismJS/prism/commit/2e43fcf)] + +## 1.7.0 (2017-09-09) + +### New components + +* __Django/Jinja2__ ([#1085](https://github.com/PrismJS/prism/issues/1085)) [[`345b1b2`](https://github.com/PrismJS/prism/commit/345b1b2)] +* __N4JS__ ([#1141](https://github.com/PrismJS/prism/issues/1141)) [[`eaa8ebb`](https://github.com/PrismJS/prism/commit/eaa8ebb)] +* __Ren'py__ ([#658](https://github.com/PrismJS/prism/issues/658)) [[`7ab4013`](https://github.com/PrismJS/prism/commit/7ab4013)] +* __VB.Net__ ([#1122](https://github.com/PrismJS/prism/issues/1122)) [[`5400651`](https://github.com/PrismJS/prism/commit/5400651)] + +### Updated components + +* __APL__: + * Add left shoe underbar and right shoe underbar ([#1072](https://github.com/PrismJS/prism/issues/1072)) [[`12238c5`](https://github.com/PrismJS/prism/commit/12238c5)] + * Update prism-apl.js ([#1126](https://github.com/PrismJS/prism/issues/1126)) [[`a5f3cdb`](https://github.com/PrismJS/prism/commit/a5f3cdb)] +* __C__: + * Add more keywords and constants for C. ([#1029](https://github.com/PrismJS/prism/issues/1029)) [[`43a388e`](https://github.com/PrismJS/prism/commit/43a388e)] +* __C#__: + * Fix wrong highlighting when three slashes appear inside string. Fix [#1091](https://github.com/PrismJS/prism/issues/1091) [[`dfb6f17`](https://github.com/PrismJS/prism/commit/dfb6f17)] +* __C-like__: + * Add support for unclosed block comments. Close [#828](https://github.com/PrismJS/prism/issues/828) [[`3426ed1`](https://github.com/PrismJS/prism/commit/3426ed1)] +* __Crystal__: + * Update Crystal keywords ([#1092](https://github.com/PrismJS/prism/issues/1092)) [[`125bff1`](https://github.com/PrismJS/prism/commit/125bff1)] +* __CSS Extras__: + * Support CSS #RRGGBBAA ([#1139](https://github.com/PrismJS/prism/issues/1139)) [[`07a6806`](https://github.com/PrismJS/prism/commit/07a6806)] +* __Docker__: + * Add dockerfile alias for docker language ([#1164](https://github.com/PrismJS/prism/issues/1164)) [[`601c47f`](https://github.com/PrismJS/prism/commit/601c47f)] + * Update the list of keywords for dockerfiles ([#1180](https://github.com/PrismJS/prism/issues/1180)) [[`f0d73e0`](https://github.com/PrismJS/prism/commit/f0d73e0)] +* __Eiffel__: + * Add class-name highlighting for Eiffel ([#471](https://github.com/PrismJS/prism/issues/471)) [[`cd03587`](https://github.com/PrismJS/prism/commit/cd03587)] +* __Handlebars__: + * Check for possible pre-existing marker strings in Handlebars [[`7a1a404`](https://github.com/PrismJS/prism/commit/7a1a404)] +* __JavaScript__: + * Properly match every operator as a whole token. Fix [#1133](https://github.com/PrismJS/prism/issues/1133) [[`9f649fb`](https://github.com/PrismJS/prism/commit/9f649fb)] + * Allows uppercase prefixes in JS number literals ([#1151](https://github.com/PrismJS/prism/issues/1151)) [[`d4ee904`](https://github.com/PrismJS/prism/commit/d4ee904)] + * Reduced backtracking in regex pattern. Fix [#1159](https://github.com/PrismJS/prism/issues/1159) [[`ac09e97`](https://github.com/PrismJS/prism/commit/ac09e97)] +* __JSON__: + * Fix property and string patterns performance. Fix [#1080](https://github.com/PrismJS/prism/issues/1080) [[`0ca1353`](https://github.com/PrismJS/prism/commit/0ca1353)] +* __JSX__: + * JSX spread operator break. Fixes [#1061](https://github.com/PrismJS/prism/issues/1061) ([#1094](https://github.com/PrismJS/prism/issues/1094)) [[`561bceb`](https://github.com/PrismJS/prism/commit/561bceb)] + * Fix highlighting of attributes containing spaces [[`867ea42`](https://github.com/PrismJS/prism/commit/867ea42)] + * Improved performance for tags (when not matching) Fix [#1152](https://github.com/PrismJS/prism/issues/1152) [[`b0fe103`](https://github.com/PrismJS/prism/commit/b0fe103)] +* __LOLCODE__: + * Make strings greedy Golmote [[`1a5e7a4`](https://github.com/PrismJS/prism/commit/1a5e7a4)] +* __Markup__: + * Support HTML entities in attribute values ([#1143](https://github.com/PrismJS/prism/issues/1143)) [[`1d5047d`](https://github.com/PrismJS/prism/commit/1d5047d)] +* __NSIS__: + * Update patterns ([#1033](https://github.com/PrismJS/prism/issues/1033)) [[`01a59d8`](https://github.com/PrismJS/prism/commit/01a59d8)] + * Add support for NSIS 3.02 ([#1169](https://github.com/PrismJS/prism/issues/1169)) [[`393b5f7`](https://github.com/PrismJS/prism/commit/393b5f7)] +* __PHP__: + * Fix the PHP language ([#1100](https://github.com/PrismJS/prism/issues/1100)) [[`1453fa7`](https://github.com/PrismJS/prism/commit/1453fa7)] + * Check for possible pre-existing marker strings in PHP [[`36bc560`](https://github.com/PrismJS/prism/commit/36bc560)] +* __Ruby__: + * Fix slash regex performance. Fix [#1083](https://github.com/PrismJS/prism/issues/1083) [[`a708730`](https://github.com/PrismJS/prism/commit/a708730)] + * Add support for =begin =end comments. Manual merge of [#1121](https://github.com/PrismJS/prism/issues/1121). [[`62cdaf8`](https://github.com/PrismJS/prism/commit/62cdaf8)] +* __Smarty__: + * Check for possible pre-existing marker strings in Smarty [[`5df26e2`](https://github.com/PrismJS/prism/commit/5df26e2)] +* __TypeScript__: + * Update typescript keywords ([#1064](https://github.com/PrismJS/prism/issues/1064)) [[`52020a0`](https://github.com/PrismJS/prism/commit/52020a0)] + * Chmod -x prism-typescript component ([#1145](https://github.com/PrismJS/prism/issues/1145)) [[`afe0542`](https://github.com/PrismJS/prism/commit/afe0542)] +* __YAML__: + * Make strings greedy (partial fix for [#1075](https://github.com/PrismJS/prism/issues/1075)) [[`565a2cc`](https://github.com/PrismJS/prism/commit/565a2cc)] + +### Updated plugins + +* __Autolinker__: + * Fixed an rendering issue for encoded urls ([#1173](https://github.com/PrismJS/prism/issues/1173)) [[`abc007f`](https://github.com/PrismJS/prism/commit/abc007f)] +* __Custom Class__: + * Add missing noCSS property for the Custom Class plugin [[`ba64f8d`](https://github.com/PrismJS/prism/commit/ba64f8d)] + * Added a default for classMap. Fixes [#1137](https://github.com/PrismJS/prism/issues/1137). ([#1157](https://github.com/PrismJS/prism/issues/1157)) [[`5400af9`](https://github.com/PrismJS/prism/commit/5400af9)] +* __Keep Markup__: + * Store highlightedCode after reinserting markup. Fix [#1127](https://github.com/PrismJS/prism/issues/1127) [[`6df2ceb`](https://github.com/PrismJS/prism/commit/6df2ceb)] +* __Line Highlight__: + * Cleanup left-over line-highlight tags before other plugins run [[`79b723d`](https://github.com/PrismJS/prism/commit/79b723d)] + * Avoid conflict between line-highlight and other plugins [[`224fdb8`](https://github.com/PrismJS/prism/commit/224fdb8)] +* __Line Numbers__: + * Support soft wrap for line numbers plugin ([#584](https://github.com/PrismJS/prism/issues/584)) [[`849f1d6`](https://github.com/PrismJS/prism/commit/849f1d6)] + * Plugins fixes (unescaped-markup, line-numbers) ([#1012](https://github.com/PrismJS/prism/issues/1012)) [[`3fb7cf8`](https://github.com/PrismJS/prism/commit/3fb7cf8)] +* __Normalize Whitespace__: + * Add Node.js support for the normalize-whitespace plugin [[`6c7dae2`](https://github.com/PrismJS/prism/commit/6c7dae2)] +* __Unescaped Markup__: + * Plugins fixes (unescaped-markup, line-numbers) ([#1012](https://github.com/PrismJS/prism/issues/1012)) [[`3fb7cf8`](https://github.com/PrismJS/prism/commit/3fb7cf8)] + +### Updated themes +* __Coy__: + * Scroll 'Coy' background with contents ([#1163](https://github.com/PrismJS/prism/issues/1163)) [[`310990b`](https://github.com/PrismJS/prism/commit/310990b)] + +### Other changes + +* Initial implementation of manual highlighting ([#1087](https://github.com/PrismJS/prism/issues/1087)) [[`bafc4cb`](https://github.com/PrismJS/prism/commit/bafc4cb)] +* Remove dead link in Third-party tutorials section. Fixes [#1028](https://github.com/PrismJS/prism/issues/1028) [[`dffadc6`](https://github.com/PrismJS/prism/commit/dffadc6)] +* Most languages now use the greedy flag for better highlighting [[`7549ecc`](https://github.com/PrismJS/prism/commit/7549ecc)] +* .npmignore: Unignore components.js ([#1108](https://github.com/PrismJS/prism/issues/1108)) [[`1f699e7`](https://github.com/PrismJS/prism/commit/1f699e7)] +* Run before-highlight and after-highlight hooks even when no grammar is found. Fix [#1134](https://github.com/PrismJS/prism/issues/1134) [[`70cb472`](https://github.com/PrismJS/prism/commit/70cb472)] +* Replace [\w\W] with [\s\S] and [0-9] with \d in regexes ([#1107](https://github.com/PrismJS/prism/issues/1107)) [[`8aa2cc4`](https://github.com/PrismJS/prism/commit/8aa2cc4)] +* Fix corner cases for the greedy flag ([#1095](https://github.com/PrismJS/prism/issues/1095)) [[`6530709`](https://github.com/PrismJS/prism/commit/6530709)] +* Add Third Party Tutorial ([#1156](https://github.com/PrismJS/prism/issues/1156)) [[`c34e57b`](https://github.com/PrismJS/prism/commit/c34e57b)] +* Add Composer support ([#648](https://github.com/PrismJS/prism/issues/648)) [[`2989633`](https://github.com/PrismJS/prism/commit/2989633)] +* Remove IE8 plugin ([#992](https://github.com/PrismJS/prism/issues/992)) [[`25788eb`](https://github.com/PrismJS/prism/commit/25788eb)] +* Website: remove width and height on logo.svg, so it becomes scalable. Close [#1005](https://github.com/PrismJS/prism/issues/1005) [[`0621ff7`](https://github.com/PrismJS/prism/commit/0621ff7)] +* Remove yarn.lock ([#1098](https://github.com/PrismJS/prism/issues/1098)) [[`11eed25`](https://github.com/PrismJS/prism/commit/11eed25)] + +## 1.6.0 (2016-12-03) + +### New components + +* __.properties__ ([#980](https://github.com/PrismJS/prism/issues/980)) [[`be6219a`](https://github.com/PrismJS/prism/commit/be6219a)] +* __Ada__ ([#949](https://github.com/PrismJS/prism/issues/949)) [[`65619f7`](https://github.com/PrismJS/prism/commit/65619f7)] +* __GraphQL__ ([#971](https://github.com/PrismJS/prism/issues/971)) [[`e018087`](https://github.com/PrismJS/prism/commit/e018087)] +* __Jolie__ ([#1014](https://github.com/PrismJS/prism/issues/1014)) [[`dfc1941`](https://github.com/PrismJS/prism/commit/dfc1941)] +* __LiveScript__ ([#982](https://github.com/PrismJS/prism/issues/982)) [[`62e258c`](https://github.com/PrismJS/prism/commit/62e258c)] +* __Reason__ (Fixes [#1046](https://github.com/PrismJS/prism/issues/1046)) [[`3cae6ce`](https://github.com/PrismJS/prism/commit/3cae6ce)] +* __Xojo__ ([#994](https://github.com/PrismJS/prism/issues/994)) [[`0224b7c`](https://github.com/PrismJS/prism/commit/0224b7c)] + +### Updated components + +* __APL__: + * Add iota underbar ([#1024](https://github.com/PrismJS/prism/issues/1024)) [[`3c5c89a`](https://github.com/PrismJS/prism/commit/3c5c89a), [`ac21d33`](https://github.com/PrismJS/prism/commit/ac21d33)] +* __AsciiDoc__: + * Optimized block regexps to prevent struggling on large files. Fixes [#1001](https://github.com/PrismJS/prism/issues/1001). [[`1a86d34`](https://github.com/PrismJS/prism/commit/1a86d34)] +* __Bash__: + * Add `npm` to function list ([#969](https://github.com/PrismJS/prism/issues/969)) [[`912bdfe`](https://github.com/PrismJS/prism/commit/912bdfe)] +* __CSS__: + * Make CSS strings greedy. Fix [#1013](https://github.com/PrismJS/prism/issues/1013). [[`e57e26d`](https://github.com/PrismJS/prism/commit/e57e26d)] +* __CSS Extras__: + * Match attribute inside selectors [[`13fed76`](https://github.com/PrismJS/prism/commit/13fed76)] +* _Groovy__: + * Fix order of decoding entities in groovy. Fixes [#1049](https://github.com/PrismJS/prism/issues/1049) ([#1050](https://github.com/PrismJS/prism/issues/1050)) [[`d75da8e`](https://github.com/PrismJS/prism/commit/d75da8e)] +* __Ini__: + * Remove important token in ini definition ([#1047](https://github.com/PrismJS/prism/issues/1047)) [[`fe8ad8b`](https://github.com/PrismJS/prism/commit/fe8ad8b)] +* __JavaScript__: + * Add exponentiation & spread/rest operator ([#991](https://github.com/PrismJS/prism/issues/991)) [[`b2de65a`](https://github.com/PrismJS/prism/commit/b2de65a), [`268d01e`](https://github.com/PrismJS/prism/commit/268d01e)] +* __JSON_: + * JSON: Fixed issues with properties and strings + added tests. Fix [#1025](https://github.com/PrismJS/prism/issues/1025) [[`25a541d`](https://github.com/PrismJS/prism/commit/25a541d)] +* __Markup__: + * Allow for dots in Markup tag names, but not in HTML tags included in Textile. Fixes [#888](https://github.com/PrismJS/prism/issues/888). [[`31ea66b`](https://github.com/PrismJS/prism/commit/31ea66b)] + * Make doctype case-insensitive ([#1009](https://github.com/PrismJS/prism/issues/1009)) [[`3dd7219`](https://github.com/PrismJS/prism/commit/3dd7219)] +* __NSIS__: + * Updated patterns ([#1032](https://github.com/PrismJS/prism/issues/1032)) [[`76ba1b8`](https://github.com/PrismJS/prism/commit/76ba1b8)] +* __PHP__: + * Make comments greedy. Fix [#197](https://github.com/PrismJS/prism/issues/197) [[`318aab3`](https://github.com/PrismJS/prism/commit/318aab3)] +* __PowerShell__: + * Fix highlighting of empty comments ([#977](https://github.com/PrismJS/prism/issues/977)) [[`4fda477`](https://github.com/PrismJS/prism/commit/4fda477)] +* __Puppet__: + * Fix over-greedy regexp detection ([#978](https://github.com/PrismJS/prism/issues/978)) [[`105be25`](https://github.com/PrismJS/prism/commit/105be25)] +* __Ruby__: + * Fix typo `Fload` to `Float` in prism-ruby.js ([#1023](https://github.com/PrismJS/prism/issues/1023)) [[`22cb018`](https://github.com/PrismJS/prism/commit/22cb018)] + * Make strings greedy. Fixes [#1048](https://github.com/PrismJS/prism/issues/1048) [[`8b0520a`](https://github.com/PrismJS/prism/commit/8b0520a)] +* __SCSS__: + * Alias statement as keyword. Fix [#246](https://github.com/PrismJS/prism/issues/246) [[`fd09391`](https://github.com/PrismJS/prism/commit/fd09391)] + * Highlight variables inside selectors and properties. [[`d6b5c2f`](https://github.com/PrismJS/prism/commit/d6b5c2f)] + * Highlight parent selector [[`8f5f1fa`](https://github.com/PrismJS/prism/commit/8f5f1fa)] +* __TypeScript__: + * Add missing `from` keyword to typescript & set `ts` as alias. ([#1042](https://github.com/PrismJS/prism/issues/1042)) [[`cba78f3`](https://github.com/PrismJS/prism/commit/cba78f3)] + +### New plugins + +* __Copy to Clipboard__ ([#891](https://github.com/PrismJS/prism/issues/891)) [[`07b81ac`](https://github.com/PrismJS/prism/commit/07b81ac)] +* __Custom Class__ ([#950](https://github.com/PrismJS/prism/issues/950)) [[`a0bd686`](https://github.com/PrismJS/prism/commit/a0bd686)] +* __Data-URI Highlight__ ([#996](https://github.com/PrismJS/prism/issues/996)) [[`bdca61b`](https://github.com/PrismJS/prism/commit/bdca61b)] +* __Toolbar__ ([#891](https://github.com/PrismJS/prism/issues/891)) [[`07b81ac`](https://github.com/PrismJS/prism/commit/07b81ac)] + +### Updated plugins + +* __Autoloader__: + * Updated documentation for Autoloader plugin [[`b4f3423`](https://github.com/PrismJS/prism/commit/b4f3423)] + * Download all grammars as a zip from Autoloader plugin page ([#981](https://github.com/PrismJS/prism/issues/981)) [[`0d0a007`](https://github.com/PrismJS/prism/commit/0d0a007), [`5c815d3`](https://github.com/PrismJS/prism/commit/5c815d3)] + * Removed duplicated script on Autoloader plugin page [[`9671996`](https://github.com/PrismJS/prism/commit/9671996)] + * Don't try to load "none" component. Fix [#1000](https://github.com/PrismJS/prism/issues/1000) [[`f89b0b9`](https://github.com/PrismJS/prism/commit/f89b0b9)] +* __WPD__: + * Fix at-rule detection + don't process if language is not handled [[`2626728`](https://github.com/PrismJS/prism/commit/2626728)] + +### Other changes + +* Improvement to greedy-flag ([#967](https://github.com/PrismJS/prism/issues/967)) [[`500121b`](https://github.com/PrismJS/prism/commit/500121b), [`9893489`](https://github.com/PrismJS/prism/commit/9893489)] +* Add setTimeout fallback for requestAnimationFrame. Fixes [#987](https://github.com/PrismJS/prism/issues/987). ([#988](https://github.com/PrismJS/prism/issues/988)) [[`c9bdcd3`](https://github.com/PrismJS/prism/commit/c9bdcd3)] +* Added aria-hidden attributes on elements created by the Line Highlight and Line Numbers plugins. Fixes [#574](https://github.com/PrismJS/prism/issues/574). [[`e5587a7`](https://github.com/PrismJS/prism/commit/e5587a7)] +* Don't insert space before ">" when there is no attributes [[`3dc8c9e`](https://github.com/PrismJS/prism/commit/3dc8c9e)] +* Added missing hooks-related tests for AsciiDoc, Groovy, Handlebars, Markup, PHP and Smarty [[`c1a0c1b`](https://github.com/PrismJS/prism/commit/c1a0c1b)] +* Fix issue when using Line numbers plugin and Normalise whitespace plugin together with Handlebars, PHP or Smarty. Fix [#1018](https://github.com/PrismJS/prism/issues/1018), [#997](https://github.com/PrismJS/prism/issues/997), [#935](https://github.com/PrismJS/prism/issues/935). Revert [#998](https://github.com/PrismJS/prism/issues/998). [[`86aa3d2`](https://github.com/PrismJS/prism/commit/86aa3d2)] +* Optimized logo ([#990](https://github.com/PrismJS/prism/issues/990)) ([#1002](https://github.com/PrismJS/prism/issues/1002)) [[`f69e570`](https://github.com/PrismJS/prism/commit/f69e570), [`218fd25`](https://github.com/PrismJS/prism/commit/218fd25)] +* Remove unneeded prefixed CSS ([#989](https://github.com/PrismJS/prism/issues/989)) [[`5e56833`](https://github.com/PrismJS/prism/commit/5e56833)] +* Optimize images ([#1007](https://github.com/PrismJS/prism/issues/1007)) [[`b2fa6d5`](https://github.com/PrismJS/prism/commit/b2fa6d5)] +* Add yarn.lock to .gitignore ([#1035](https://github.com/PrismJS/prism/issues/1035)) [[`03ecf74`](https://github.com/PrismJS/prism/commit/03ecf74)] +* Fix greedy flag bug. Fixes [#1039](https://github.com/PrismJS/prism/issues/1039) [[`32cd99f`](https://github.com/PrismJS/prism/commit/32cd99f)] +* Ruby: Fix test after [#1023](https://github.com/PrismJS/prism/issues/1023) [[`b15d43b`](https://github.com/PrismJS/prism/commit/b15d43b)] +* Ini: Fix test after [#1047](https://github.com/PrismJS/prism/issues/1047) [[`25cdd3f`](https://github.com/PrismJS/prism/commit/25cdd3f)] +* Reduce risk of XSS ([#1051](https://github.com/PrismJS/prism/issues/1051)) [[`17e33bc`](https://github.com/PrismJS/prism/commit/17e33bc)] +* env.code can be modified by before-sanity-check hook even when using language-none. Fix [#1066](https://github.com/PrismJS/prism/issues/1066) [[`83bafbd`](https://github.com/PrismJS/prism/commit/83bafbd)] + + +## 1.5.1 (2016-06-05) + +### Updated components + +* __Normalize Whitespace__: + * Add class that disables the normalize whitespace plugin [[`9385c54`](https://github.com/PrismJS/prism/commit/9385c54)] +* __JavaScript Language__: + * Rearrange the `string` and `template-string` token in JavaScript [[`1158e46`](https://github.com/PrismJS/prism/commit/1158e46)] +* __SQL Language__: + * add delimeter and delimeters keywords to sql ([#958](https://github.com/PrismJS/prism/pull/958)) [[`a9ef24e`](https://github.com/PrismJS/prism/commit/a9ef24e)] + * add AUTO_INCREMENT and DATE keywords to sql ([#954](https://github.com/PrismJS/prism/pull/954)) [[`caea2af`](https://github.com/PrismJS/prism/commit/caea2af)] +* __Diff Language__: + * Highlight diff lines with only + or - ([#952](https://github.com/PrismJS/prism/pull/952)) [[`4d0526f`](https://github.com/PrismJS/prism/commit/4d0526f)] + +### Other changes + +* Allow for asynchronous loading of prism.js ([#959](https://github.com/PrismJS/prism/pull/959)) +* Use toLowerCase on language names ([#957](https://github.com/PrismJS/prism/pull/957)) [[`acd9508`](https://github.com/PrismJS/prism/commit/acd9508)] +* link to index for basic usage - fixes [#945](https://github.com/PrismJS/prism/issues/945) ([#946](https://github.com/PrismJS/prism/pull/946)) [[`6c772d8`](https://github.com/PrismJS/prism/commit/6c772d8)] +* Fixed monospace typo ([#953](https://github.com/PrismJS/prism/pull/953)) [[`e6c3498`](https://github.com/PrismJS/prism/commit/e6c3498)] + +## 1.5.0 (2016-05-01) + +### New components + +* __Bro Language__ ([#925](https://github.com/PrismJS/prism/pull/925)) +* __Protocol Buffers Language__ ([#938](https://github.com/PrismJS/prism/pull/938)) [[`ae4a4f2`](https://github.com/PrismJS/prism/commit/ae4a4f2)] + +### Updated components + +* __Keep Markup__: + * Fix Keep Markup plugin incorrect highlighting ([#880](https://github.com/PrismJS/prism/pull/880)) [[`24841ef`](https://github.com/PrismJS/prism/commit/24841ef)] +* __Groovy Language__: + * Fix double HTML-encoding bug in Groovy language [[`24a0936`](https://github.com/PrismJS/prism/commit/24a0936)] +* __Java Language__: + * Adding annotation token for Java ([#905](https://github.com/PrismJS/prism/pull/905)) [[`367ace6`](https://github.com/PrismJS/prism/commit/367ace6)] +* __SAS Language__: + * Add missing keywords for SAS ([#922](https://github.com/PrismJS/prism/pull/922)) +* __YAML Language__: + * fix hilighting of YAML keys on first line of code block ([#943](https://github.com/PrismJS/prism/pull/943)) [[`f19db81`](https://github.com/PrismJS/prism/commit/f19db81)] +* __C# Language__: + * Support for generic methods in csharp [[`6f75735`](https://github.com/PrismJS/prism/commit/6f75735)] + +### New plugins + +* __Unescaped Markup__ [[`07d77e5`](https://github.com/PrismJS/prism/commit/07d77e5)] +* __Normalize Whitespace__ ([#847](https://github.com/PrismJS/prism/pull/847)) [[`e86ec01`](https://github.com/PrismJS/prism/commit/e86ec01)] + +### Other changes + +* Add JSPM support [[`ad048ab`](https://github.com/PrismJS/prism/commit/ad048ab)] +* update linear-gradient syntax from `left` to `to right` [[`cd234dc`](https://github.com/PrismJS/prism/commit/cd234dc)] +* Add after-property to allow ordering of plugins [[`224b7a1`](https://github.com/PrismJS/prism/commit/224b7a1)] +* Partial solution for the "Comment-like substrings"-problem [[`2705c50`](https://github.com/PrismJS/prism/commit/2705c50)] +* Add property 'aliasTitles' to components.js [[`54400fb`](https://github.com/PrismJS/prism/commit/54400fb)] +* Add before-highlightall hook [[`70a8602`](https://github.com/PrismJS/prism/commit/70a8602)] +* Fix catastrophic backtracking regex issues in JavaScript [[`ab65be2`](https://github.com/PrismJS/prism/commit/ab65be2)] + +## 1.4.1 (2016-02-03) + +### Other changes + +* Fix DFS bug in Prism core [[`b86c727`](https://github.com/PrismJS/prism/commit/b86c727)] + +## 1.4.0 (2016-02-03) + +### New components + +* __Solarized Light__ ([#855](https://github.com/PrismJS/prism/pull/855)) [[`70846ba`](https://github.com/PrismJS/prism/commit/70846ba)] +* __JSON__ ([#370](https://github.com/PrismJS/prism/pull/370)) [[`ad2fcd0`](https://github.com/PrismJS/prism/commit/ad2fcd0)] + +### Updated components + +* __Show Language__: + * Remove data-language attribute ([#840](https://github.com/PrismJS/prism/pull/840)) [[`eb9a83c`](https://github.com/PrismJS/prism/commit/eb9a83c)] + * Allow custom label without a language mapping ([#837](https://github.com/PrismJS/prism/pull/837)) [[`7e74aef`](https://github.com/PrismJS/prism/commit/7e74aef)] +* __JSX__: + * Better Nesting in JSX attributes ([#842](https://github.com/PrismJS/prism/pull/842)) [[`971dda7`](https://github.com/PrismJS/prism/commit/971dda7)] +* __File Highlight__: + * Defer File Highlight until the full DOM has loaded. ([#844](https://github.com/PrismJS/prism/pull/844)) [[`6f995ef`](https://github.com/PrismJS/prism/commit/6f995ef)] +* __Coy Theme__: + * Fix coy theme shadows ([#865](https://github.com/PrismJS/prism/pull/865)) [[`58d2337`](https://github.com/PrismJS/prism/commit/58d2337)] +* __Show Invisibles__: + * Ensure show-invisibles compat with autoloader ([#874](https://github.com/PrismJS/prism/pull/874)) [[`c3cfb1f`](https://github.com/PrismJS/prism/commit/c3cfb1f)] + * Add support for the space character for the show-invisibles plugin ([#876](https://github.com/PrismJS/prism/pull/876)) [[`05442d3`](https://github.com/PrismJS/prism/commit/05442d3)] + +### New plugins + +* __Command Line__ ([#831](https://github.com/PrismJS/prism/pull/831)) [[`8378906`](https://github.com/PrismJS/prism/commit/8378906)] + +### Other changes + +* Use document.currentScript instead of document.getElementsByTagName() [[`fa98743`](https://github.com/PrismJS/prism/commit/fa98743)] +* Add prefix for Firefox selection and move prefixed rule first [[`6d54717`](https://github.com/PrismJS/prism/commit/6d54717)] +* No background for `` in `
` [[`8c310bc`](https://github.com/PrismJS/prism/commit/8c310bc)]
+* Fixing to initial copyright year [[`69cbf7a`](https://github.com/PrismJS/prism/commit/69cbf7a)]
+* Simplify the “lang” regex [[`417f54a`](https://github.com/PrismJS/prism/commit/417f54a)]
+* Fix broken heading links [[`a7f9e62`](https://github.com/PrismJS/prism/commit/a7f9e62)]
+* Prevent infinite recursion in DFS [[`02894e1`](https://github.com/PrismJS/prism/commit/02894e1)]
+* Fix incorrect page title [[`544b56f`](https://github.com/PrismJS/prism/commit/544b56f)]
+* Link scss to webplatform wiki [[`08d979a`](https://github.com/PrismJS/prism/commit/08d979a)]
+* Revert white-space to normal when code is inline instead of in a pre [[`1a971b5`](https://github.com/PrismJS/prism/commit/1a971b5)]
+
+## 1.3.0 (2015-10-26)
+
+### New components
+
+* __AsciiDoc__ ([#800](https://github.com/PrismJS/prism/issues/800)) [[`6803ca0`](https://github.com/PrismJS/prism/commit/6803ca0)]
+* __Haxe__ ([#811](https://github.com/PrismJS/prism/issues/811)) [[`bd44341`](https://github.com/PrismJS/prism/commit/bd44341)]
+* __Icon__ ([#803](https://github.com/PrismJS/prism/issues/803)) [[`b43c5f3`](https://github.com/PrismJS/prism/commit/b43c5f3)]
+* __Kotlin ([#814](https://github.com/PrismJS/prism/issues/814)) [[`e8a31a5`](https://github.com/PrismJS/prism/commit/e8a31a5)]
+* __Lua__ ([#804](https://github.com/PrismJS/prism/issues/804)) [[`a36bc4a`](https://github.com/PrismJS/prism/commit/a36bc4a)]
+* __Nix__ ([#795](https://github.com/PrismJS/prism/issues/795)) [[`9b275c8`](https://github.com/PrismJS/prism/commit/9b275c8)]
+* __Oz__ ([#805](https://github.com/PrismJS/prism/issues/805)) [[`388c53f`](https://github.com/PrismJS/prism/commit/388c53f)]
+* __PARI/GP__ ([#802](https://github.com/PrismJS/prism/issues/802)) [[`253c035`](https://github.com/PrismJS/prism/commit/253c035)]
+* __Parser__ ([#808](https://github.com/PrismJS/prism/issues/808)) [[`a953b3a`](https://github.com/PrismJS/prism/commit/a953b3a)]
+* __Puppet__ ([#813](https://github.com/PrismJS/prism/issues/813)) [[`81933ee`](https://github.com/PrismJS/prism/commit/81933ee)]
+* __Roboconf__ ([#812](https://github.com/PrismJS/prism/issues/812)) [[`f5db346`](https://github.com/PrismJS/prism/commit/f5db346)]
+
+### Updated components
+
+* __C__:
+	* Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
+* __C#__:
+	* Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
+	* Fix detection of float numbers ([#806](https://github.com/PrismJS/prism/issues/806)) [[`1dae72b`](https://github.com/PrismJS/prism/commit/1dae72b)]
+* __F#__:
+	* Highlight directives in preprocessor lines ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
+* __JavaScript__:
+	* Highlight true and false as booleans ([#801](https://github.com/PrismJS/prism/issues/801)) [[`ad316a3`](https://github.com/PrismJS/prism/commit/ad316a3)]
+* __Python__:
+	* Highlight triple-quoted strings before comments. Fix [#815](https://github.com/PrismJS/prism/issues/815) [[`90fbf0b`](https://github.com/PrismJS/prism/commit/90fbf0b)]
+
+### New plugins
+
+* __Previewer: Time__ ([#790](https://github.com/PrismJS/prism/issues/790)) [[`88173de`](https://github.com/PrismJS/prism/commit/88173de)]
+* __Previewer: Angle__ ([#791](https://github.com/PrismJS/prism/issues/791)) [[`a434c86`](https://github.com/PrismJS/prism/commit/a434c86)]
+
+### Other changes
+
+* Increase mocha's timeout [[`f1c41db`](https://github.com/PrismJS/prism/commit/f1c41db)]
+* Prevent most errors in IE8. Fix [#9](https://github.com/PrismJS/prism/issues/9) [[`9652d75`](https://github.com/PrismJS/prism/commit/9652d75)]
+* Add U.S. Web Design Standards on homepage. Fix [#785](https://github.com/PrismJS/prism/issues/785) [[`e10d48b`](https://github.com/PrismJS/prism/commit/e10d48b), [`79ebbf8`](https://github.com/PrismJS/prism/commit/79ebbf8), [`2f7088d`](https://github.com/PrismJS/prism/commit/2f7088d)]
+* Added gulp task to autolink PRs and commits in changelog [[`5ec4e4d`](https://github.com/PrismJS/prism/commit/5ec4e4d)]
+* Use child processes to run each set of tests, in order to deal with the memory leak in vm.runInNewContext() [[`9a4b6fa`](https://github.com/PrismJS/prism/commit/9a4b6fa)]
+
+## 1.2.0 (2015-10-07)
+
+### New components
+
+* __Batch__ ([#781](https://github.com/PrismJS/prism/issues/781)) [[`eab5b06`](https://github.com/PrismJS/prism/commit/eab5b06)]
+
+### Updated components
+
+* __ASP.NET__:
+	* Simplified pattern for `
+
+
+
+
+
+
+
+
+ +

Customize your download

+

Select your compression level, as well as the languages and plugins you need.

+
+ +
+
+

+ Compression level: + + +

+ +
+ +

+ Total filesize: ( JavaScript + CSS) +

+

Note: The filesizes displayed refer to non-gizipped files and include any CSS code required. The CSS code is not minified.

+ +
+
+
+
+ Download JS +
+ +
+
+ Download CSS +
+
+ +
+ +
+ +
+ + + + + + + + + + diff --git a/docs/_style/prism-master/download.js b/docs/_style/prism-master/download.js new file mode 100644 index 00000000..054da79d --- /dev/null +++ b/docs/_style/prism-master/download.js @@ -0,0 +1,598 @@ +/** + * Manage downloads + */ + +(function() { + +var cache = {}; +var form = $('form'); +var minified = true; + +var dependencies = {}; + +var treeURL = 'https://api.github.com/repos/PrismJS/prism/git/trees/gh-pages?recursive=1'; +var treePromise = new Promise(function(resolve) { + $u.xhr({ + url: treeURL, + callback: function(xhr) { + if (xhr.status < 400) { + resolve(JSON.parse(xhr.responseText).tree); + } + } + }); +}); + +var hstr = window.location.hash.match(/(?:languages|plugins)=[-+\w]+|themes=[-\w]+/g); +if (hstr) { + hstr.forEach(function(str) { + var kv = str.split('=', 2), + category = kv[0], + ids = kv[1].split('+'); + if (category !== 'meta' && category !== 'core' && components[category]) { + for (var id in components[category]) { + if (components[category][id].option) { + delete components[category][id].option; + } + } + if (category === 'themes' && ids.length) { + var themeInput = $('#theme input[value="' + ids[0] + '"]'); + if (themeInput) { + themeInput.checked = true; + } + setTheme(ids[0]); + } + var makeDefault = function (id) { + if (id !== 'meta') { + if (components[category][id]) { + if (components[category][id].option !== 'default') { + if (typeof components[category][id] === 'string') { + components[category][id] = { title: components[category][id] } + } + components[category][id].option = 'default'; + } + if (components[category][id].require) { + var deps = components[category][id].require; + if ($u.type(deps) !== 'array') { + deps = [deps]; + } + deps.forEach(makeDefault); + } + } + } + }; + ids.forEach(makeDefault); + } + }); +} + +// Stay compatible with old querystring feature +var qstr = window.location.search.match(/(?:languages|plugins)=[-+\w]+|themes=[-\w]+/g); +if (qstr && !hstr) { + window.location.hash = window.location.search.replace(/^\?/, ''); + window.location.search = ''; +} + +var storedTheme = localStorage.getItem('theme'); + +for (var category in components) { + var all = components[category]; + + all.meta.section = $u.element.create('section', { + className: 'options', + id: 'category-' + category, + contents: { + tag: 'h1', + contents: category.charAt(0).toUpperCase() + category.slice(1) + }, + inside: '#components' + }); + + if (all.meta.addCheckAll) { + $u.element.create('label', { + attributes: { + 'data-id': 'check-all-' + category + }, + contents: [ + { + tag: 'input', + properties: { + type: 'checkbox', + name: 'check-all-' + category, + value: '', + checked: false, + onclick: (function(category, all){ + return function () { + var checkAll = this; + $$('input[name="download-' + category + '"]').forEach(function(input) { + all[input.value].enabled = input.checked = checkAll.checked; + }); + + update(category); + }; + })(category, all) + } + }, + 'Select/unselect all' + ], + inside: all.meta.section + }); + } + + for (var id in all) { + if(id === 'meta') { + continue; + } + + var checked = false, disabled = false; + var option = all[id].option || all.meta.option; + + switch (option) { + case 'mandatory': disabled = true; // fallthrough + case 'default': checked = true; + } + if (category === 'themes' && storedTheme) { + checked = id === storedTheme; + } + + var filepath = all.meta.path.replace(/\{id}/g, id); + + var info = all[id] = { + title: all[id].title || all[id], + aliasTitles: all[id].aliasTitles, + noCSS: all[id].noCSS || all.meta.noCSS, + noJS: all[id].noJS || all.meta.noJS, + enabled: checked, + require: $u.type(all[id].require) === 'string' ? [all[id].require] : all[id].require, + after: $u.type(all[id].after) === 'string' ? [all[id].after] : all[id].after, + peerDependencies: $u.type(all[id].peerDependencies) === 'string' ? [all[id].peerDependencies] : all[id].peerDependencies, + owner: all[id].owner, + files: { + minified: { + paths: [], + size: 0 + }, + dev: { + paths: [], + size: 0 + } + } + }; + + if (info.require) { + info.require.forEach(function (v) { + dependencies[v] = (dependencies[v] || []).concat(id); + }); + } + + if (!all[id].noJS && !/\.css$/.test(filepath)) { + info.files.minified.paths.push(filepath.replace(/(\.js)?$/, '.min.js')); + info.files.dev.paths.push(filepath.replace(/(\.js)?$/, '.js')); + } + + + if ((!all[id].noCSS && !/\.js$/.test(filepath)) || /\.css$/.test(filepath)) { + var cssFile = filepath.replace(/(\.css)?$/, '.css'); + + info.files.minified.paths.push(cssFile); + info.files.dev.paths.push(cssFile); + } + + function getLanguageTitle(lang) { + if (!lang.aliasTitles) + return lang.title; + + var titles = [lang.title]; + for (var alias in lang.aliasTitles) + if (lang.aliasTitles.hasOwnProperty(alias)) + titles.push(lang.aliasTitles[alias]); + return titles.join(" + "); + } + + var label = $u.element.create('label', { + attributes: { + 'data-id': id + }, + contents: [ + { + tag: 'input', + properties: { + type: all.meta.exclusive? 'radio' : 'checkbox', + name: 'download-' + category, + value: id, + checked: checked, + disabled: disabled, + onclick: (function(id, category, all){ + return function () { + $$('input[name="' + this.name + '"]').forEach(function(input) { + all[input.value].enabled = input.checked; + }); + + if (all[id].require && this.checked) { + all[id].require.forEach(function(v) { + var input = $('label[data-id="' + v + '"] > input'); + input.checked = true; + + input.onclick(); + }); + } + + if (dependencies[id] && !this.checked) { // It’s required by others + dependencies[id].forEach(function(dependent) { + var input = $('label[data-id="' + dependent + '"] > input'); + input.checked = false; + + input.onclick(); + }); + } + + update(category, id); + }; + })(id, category, all) + } + }, + all.meta.link? { + tag: 'a', + properties: { + href: all.meta.link.replace(/\{id}/g, id), + className: 'name' + }, + contents: info.title + } : { + tag: 'span', + properties: { + className: 'name' + }, + contents: getLanguageTitle(info) + }, + ' ', + all[id].owner? { + tag: 'a', + properties: { + href: 'https://github.com/' + all[id].owner, + className: 'owner', + target: '_blank' + }, + contents: all[id].owner + } : ' ', + { + tag: 'strong', + className: 'filesize' + } + ], + inside: all.meta.section + }); + + // Add click events on main theme selector too. + (function (label) { + if (category === 'themes') { + var themeInput = $('#theme input[value="' + id + '"]'); + var input = $('input', label); + if (themeInput) { + var themeInputOnclick = themeInput.onclick; + themeInput.onclick = function () { + input.checked = true; + input.onclick(); + themeInputOnclick && themeInputOnclick.call(themeInput); + }; + } + } + }(label)); + } +} + +form.elements.compression[0].onclick = +form.elements.compression[1].onclick = function() { + minified = !!+this.value; + + getFilesSizes(); +}; + +function getFileSize(filepath) { + return treePromise.then(function(tree) { + for(var i=0, l=tree.length; i i) { + notNow = true; + break; + } + } + if (notNow) { + var tmp = sorted[i]; + sorted[i] = sorted[indexOfRequirement]; + sorted[indexOfRequirement] = tmp; + } + else { + i++; + } + } + return sorted; +} + +function getSortedComponentsByRequirements(components, afterName) { + var sorted = getSortedComponents(components, afterName); + return getSortedComponents(components, "require", sorted); +} + +function generateCode(){ + var promises = []; + var redownload = {}; + + for (var category in components) { + var all = components[category]; + + // In case if one component requires other, required component should go first. + var sorted = getSortedComponentsByRequirements(all, category === 'languages' ? 'peerDependencies' : 'after'); + + for (var i = 0; i < sorted.length; i++) { + var id = sorted[i]; + + if(id === 'meta') { + continue; + } + + var info = all[id]; + if (info.enabled) { + if (category !== 'core') { + redownload[category] = redownload[category] || []; + redownload[category].push(id); + } + info.files[minified? 'minified' : 'dev'].paths.forEach(function (path) { + if (cache[path]) { + var type = path.match(/\.(\w+)$/)[1]; + + promises.push({ + contentsPromise: cache[path].contentsPromise, + path: path, + type: type + }); + } + }); + } + } + } + + // Hide error message if visible + var error = $('#download .error'); + error.style.display = ''; + + Promise.all([buildCode(promises), getVersion()]).then(function(arr) { + var res = arr[0]; + var version = arr[1]; + var code = res.code; + var errors = res.errors; + + if(errors.length) { + error.style.display = 'block'; + error.innerHTML = ''; + $u.element.contents(error, errors); + } + + var redownloadUrl = window.location.href.split("#")[0] + "#"; + for (var category in redownload) { + redownloadUrl += category + "=" + redownload[category].join('+') + "&"; + } + redownloadUrl = redownloadUrl.replace(/&$/,""); + window.location.replace(redownloadUrl); + + var versionComment = "/* PrismJS " + version + "\n" + redownloadUrl + " */"; + + for (var type in code) { + var codeElement = $('#download-' + type + ' code'); + + codeElement.textContent = versionComment + "\n" + code[type]; + Prism.highlightElement(codeElement, true); + + $('#download-' + type + ' .download-button').href = 'data:application/octet-stream;charset=utf-8,' + encodeURIComponent(versionComment + "\n" + code[type]); + } + }); +} + +function buildCode(promises) { + var i = 0, + l = promises.length; + var code = {js: '', css: ''}; + var errors = []; + + var f = function(resolve) { + if(i < l) { + var p = promises[i]; + p.contentsPromise.then(function(contents) { + code[p.type] += contents + (p.type === 'js' && !/;\s*$/.test(contents) ? ';' : '') + '\n'; + i++; + f(resolve); + }); + p.contentsPromise['catch'](function() { + errors.push($u.element.create({ + tag: 'p', + prop: { + textContent: 'An error occurred while fetching the file "' + p.path + '".' + } + })); + i++; + f(resolve); + }); + } else { + resolve({code: code, errors: errors}); + } + }; + + return new Promise(f); +} + +function getVersion() { + return getFileContents('./package.json').then(function (jsonStr) { + return JSON.parse(jsonStr).version; + }); +} + +})(); diff --git a/docs/_style/prism-master/examples.html b/docs/_style/prism-master/examples.html new file mode 100644 index 00000000..b7dce551 --- /dev/null +++ b/docs/_style/prism-master/examples.html @@ -0,0 +1,110 @@ + + + + + + +Examples ▲ Prism + + + + + + + + + + +
+
+ +

Examples

+

The examples in this page serve a dual purpose: They act as unit tests, making it easy to spot bugs, and at the same time demonstrate what Prism can do, on simple and on edge cases.

+
+ +
+

Different markup

+ +

code.language-css

+ p { color: red; } + +

pre.language-css > code

+
p { color: red; }
+ +

pre > code.language-css

+
p { color: red; }
+ +

pre.language-css > code.language-*

+
p { color: red; }
+ +

code.lang-css

+ p { color: red; } + +

pre.lang-css > code

+
p { color: red; }
+ +

pre > code

+

No language, should inherit .language-markup

+
<p>hi!</p>
+ +

code.language-*

+

No language, should inherit .language-markup

+ <p>hi!</p> + +

code.language-none

+

Should not be highlighted.

+ <p>hi!</p> +
+ +
+

Per language examples

+
+
+
+ +
+ + + + + + + + + + diff --git a/docs/_style/prism-master/examples.js b/docs/_style/prism-master/examples.js new file mode 100644 index 00000000..ba275c55 --- /dev/null +++ b/docs/_style/prism-master/examples.js @@ -0,0 +1,217 @@ +/** + * Manage examples + */ + +(function() { + +var examples = {}; + +var treeURL = 'https://api.github.com/repos/PrismJS/prism/git/trees/gh-pages?recursive=1'; +var treePromise = new Promise(function (resolve) { + $u.xhr({ + url: treeURL, + callback: function (xhr) { + if (xhr.status < 400) { + resolve(JSON.parse(xhr.responseText).tree); + } + } + }); +}); + +var languages = components.languages; + +for (var id in languages) { + if (id === 'meta') { + continue; + } + + (function (id) { + var language = languages[id]; + var checked = false; + + if (language.option === 'default') { + checked = true; + } + + language.enabled = checked; + language.path = languages.meta.path.replace(/\{id}/g, id) + '.js'; + language.examplesPath = languages.meta.examplesPath.replace(/\{id}/g, id) + '.html'; + + fileExists(language.examplesPath).then(function (exists) { + $u.element.create('label', { + attributes: { + 'data-id': id, + 'title': !exists ? 'No examples are available for this language.' : '' + }, + className: !exists ? 'unavailable' : '', + contents: [ + { + tag: 'input', + properties: { + type: 'checkbox', + name: 'language', + value: id, + checked: checked && exists, + disabled: !exists, + onclick: function () { + $$('input[name="' + this.name + '"]').forEach(function (input) { + languages[input.value].enabled = input.checked; + }); + + update(id); + } + } + }, + language.title + ], + inside: '#languages' + }); + examples[id] = $u.element.create('section', { + 'id': 'language-' + id, + 'className': 'language-' + id, + inside: '#examples' + }); + if (checked) { + update(id); + } + }); + }(id)); +} + +function fileExists(filepath) { + return treePromise.then(function (tree) { + for (var i = 0, l = tree.length; i < l; i++) { + if (tree[i].path === filepath) { + return true; + } + } + return false; + }); +} + +function getFileContents(filepath) { + return new Promise(function (resolve, reject) { + $u.xhr({ + url: filepath, + callback: function (xhr) { + if (xhr.status < 400 && xhr.responseText) { + resolve(xhr.responseText); + } else { + reject(); + } + } + }); + }); +} + +function buildContentsHeader(id) { + var language = languages[id]; + var header = '

' + language.title + '

'; + if (language.overrideExampleHeader) { + return header; + } + if (language.alias) { + var alias = language.alias; + if (Prism.util.type(alias) !== 'Array') { + alias = [alias]; + } + + header += '

To use this language, use one of the following classes:

'; + header += '
  • "language-' + id + '"
  • '; + alias.forEach(function (alias) { + header += '
  • "language-' + alias + '"
  • '; + }); + header += '
'; + } else { + header += '

To use this language, use the class "language-' + id + '".

'; + } + if (language.require) { + var require = language.require; + if (Prism.util.type(require) !== 'Array') { + require = [require]; + } + + header += '

Dependencies: The following dependencies need to be loaded before this component: '; + header += require.map(function (dep) { + return '' + dep + ''; + }).join(', '); + header += '.

'; + } + return header; +} + +function update(id) { + var language = languages[id]; + if (language.enabled) { + if (!language.examplesPromise) { + language.examplesPromise = getFileContents(language.examplesPath); + } + language.examplesPromise.then(function (contents) { + examples[id].innerHTML = buildContentsHeader(id) + contents; + + loadLanguage(id).then(function () { + var elements = examples[id].querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'); + + for (var i=0, element; element = elements[i++];) { + Prism.highlightElement(element); + } + }); + }); + } else { + examples[id].innerHTML = ''; + } +} + +/** + * Loads a language, including all dependencies + * + * @param {string} lang the language to load + * @type {Promise} the promise which resolves as soon as everything is loaded + */ +function loadLanguage (lang) +{ + // at first we need to fetch all dependencies for the main language + // Note: we need to do this, even if the main language already is loaded (just to be sure..) + // + // We load an array of all dependencies and call recursively this function on each entry + // + // dependencies is now an (possibly empty) array of loading-promises + var dependencies = getDependenciesOfLanguage(lang).map(loadLanguage); + + // We create a promise, which will resolve, as soon as all dependencies are loaded. + // They need to be fully loaded because the main language may extend them. + return Promise.all(dependencies) + .then(function () { + + // If the main language itself isn't already loaded, load it now + // and return the newly created promise (we chain the promises). + // If the language is already loaded, just do nothing - the next .then() + // will immediately be called + if (!Prism.languages[lang]) { + return new Promise(function (resolve) { + $u.script('components/prism-' + lang + '.js', resolve); + }); + } + }); +} + + +/** + * Returns all dependencies (as identifiers) of a specific language + * + * @param {string} lang + * @returns {Array.} the list of dependencies. Empty if the language has none. + */ +function getDependenciesOfLanguage (lang) +{ + if (!components.languages[lang] || !components.languages[lang].require) + { + return []; + } + + return ($u.type(components.languages[lang].require) === "array") + ? components.languages[lang].require + : [components.languages[lang].require]; +} + +}()); diff --git a/docs/_style/prism-master/examples/prism-abap.html b/docs/_style/prism-master/examples/prism-abap.html new file mode 100644 index 00000000..dfda1f7f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-abap.html @@ -0,0 +1,65 @@ +

Comments

+

+* Line Comments
+" End of line comment used as line comment.
+value = 1. " End of line comment
+
+DATA:
+  "! ABAPDoc comment
+  value TYPE i.
+
+ +

Strings

+ +

+my_string = 'Simple string'.
+my_string = 'String with an escaped '' inside'.
+my_string = |A string template: { nvalue } times|.
+my_string = |A string template: { nvalue } times|.
+my_string = |Characters \|, \{, and \} have to be escaped by \\ in literal text.|. 
+
+ +

Numbers and Operators

+ +

+value = 001 + 2 - 3 * 4 / 5 ** 6.
+
+IF value < 1 OR
+   value = 2 OR
+   value > 3 OR
+   value <> 4 OR
+   value <= 5 OR
+   value >= 6.
+ENDIF.
+
+" Dynamic object assignment (with type cast check)
+lo_interface ?= lo_class.
+
+ +

Structures and Classes

+ +

+DATA:
+  BEGIN OF my_structure,
+    scomponent TYPE i,
+  END OF my_structure.
+
+CLASS lcl_my_class DEFINITION.
+  PUBLIC SECTION.
+    METHODS my_method
+      RETURNING
+        VALUE(ret_value) TYPE i.
+ENDCLASS.
+
+CLASS lcl_my_class IMPLEMENTATION.
+  METHOD my_method.
+    ret_value = 1.
+  ENDMETHOD
+ENDCLASS.
+
+DATA lo_instace TYPE REF TO lcl_my_class.
+
+CREATE OBJECT lo_instace.
+
+my_structure-component = lo_instace->my_method( ).
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-actionscript.html b/docs/_style/prism-master/examples/prism-actionscript.html new file mode 100644 index 00000000..abb5804d --- /dev/null +++ b/docs/_style/prism-master/examples/prism-actionscript.html @@ -0,0 +1,133 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Literal values

+
17
+"hello"
+-3
+9.4
+null
+true
+false
+ +

Classes

+
class A {}
+class B extends A {}
+ +

Inline XML

+
var employees:XML =
+    <employees>
+        <employee ssn="123-123-1234">
+            <name first="John" last="Doe"/>
+            <address>
+                <city>San Francisco</city>
+                <state>CA</state>
+                <zip>98765</zip>
+            </address>
+        </employee>
+        <employee ssn="789-789-7890">
+            <name first="Mary" last="Roe"/>
+            <address>
+                <city>Newton</city>
+                <state>MA</state>
+                <zip>01234</zip>
+            </address>
+        </employee>
+    </employees>;
+ +

Full example

+
package {
+  import flash.display.*;
+  import flash.events.*;
+  import flash.filters.BlurFilter;
+  import flash.geom.*;
+  import flash.ui.*;
+  public class ch23ex2 extends Sprite {
+    protected const BMP_SCALE:Number = 1/2;
+    protected const D:Number = 1.015;
+    protected const DIM_EFFECT:ColorTransform = new ColorTransform(D, D, D);
+    protected const B:int = 16;
+    protected const BLUR_EFFECT:BlurFilter = new BlurFilter(B, B, 1);
+    protected var RLUT:Array, GLUT:Array, BLUT:Array;
+    protected var sourceBmp:BitmapData;
+    protected var colorBmp:BitmapData;
+    protected var touches:Array = new Array();
+    protected var fingerShape:Shape = new Shape();
+    public function ch23ex2() {
+      try {
+        var test:Class = Multitouch;
+        if (Multitouch.supportsTouchEvents) {
+          Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
+          init();
+        } else {
+          trace("Sorry, this example requires multitouch.");
+        }
+      } catch (error:ReferenceError) {
+        trace("Sorry, but multitouch is not supported in this runtime.");
+      }
+    }
+    protected function init():void {
+      //create a black-and-white bitmap and a color bitmap, only show the color
+      sourceBmp = new BitmapData(
+        stage.stageWidth*BMP_SCALE, stage.stageHeight*BMP_SCALE, false, 0);
+      colorBmp = sourceBmp.clone();
+      var bitmap:Bitmap = new Bitmap(colorBmp, PixelSnapping.ALWAYS, true);
+      bitmap.width = stage.stageWidth; bitmap.height = stage.stageHeight;
+      addChild(bitmap);
+
+      //create finger shape to paste onto the bitmap under your touches
+      fingerShape.graphics.beginFill(0xffffff, 0.1);
+      fingerShape.graphics.drawEllipse(-15, -20, 30, 40);
+      fingerShape.graphics.endFill();
+
+      //create the palette map from a gradient
+      var gradient:Shape = new Shape();
+      var m:Matrix = new Matrix();
+      m.createGradientBox(256, 10);
+      gradient.graphics.beginGradientFill(GradientType.LINEAR,
+        [0x313ad8, 0x2dce4a, 0xdae234, 0x7a1c1c, 0x0f0303],
+        [1, 1, 1, 1, 1], [0, 0.4*256, 0.75*256, 0.9*256, 255], m);
+      gradient.graphics.drawRect(0, 0, 256, 10);
+      var gradientBmp:BitmapData = new BitmapData(256, 10, false, 0);
+      gradientBmp.draw(gradient);
+      RLUT = new Array(); GLUT = new Array(); BLUT = new Array();
+      for (var i:int = 0; i < 256; i++) {
+        var pixelColor:uint = gradientBmp.getPixel(i, 0);
+        //I drew the gradient backwards, so sue me
+        RLUT[256-i] = pixelColor & 0xff0000;
+        GLUT[256-i] = pixelColor & 0x00ff00;
+        BLUT[256-i] = pixelColor & 0x0000ff;
+      }
+
+      stage.addEventListener(TouchEvent.TOUCH_BEGIN, assignTouch);
+      stage.addEventListener(TouchEvent.TOUCH_MOVE, assignTouch);
+      stage.addEventListener(TouchEvent.TOUCH_END, removeTouch);
+      stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
+    }
+    protected function assignTouch(event:TouchEvent):void {
+      touches[event.touchPointID] = event;
+    }
+    protected function removeTouch(event:TouchEvent):void {
+      delete touches[event.touchPointID];
+    }
+    protected function onEnterFrame(event:Event):void {
+      for (var key:String in touches) {
+        var touch:TouchEvent = touches[key] as TouchEvent;
+        if (touch) {
+          //plaster the finger image under your finger
+          var m:Matrix = new Matrix();
+          m.translate(touch.stageX*BMP_SCALE, touch.stageY*BMP_SCALE);
+          sourceBmp.draw(fingerShape, m, null, BlendMode.ADD);
+        }
+      }
+      var O:Point = new Point(0, 0);
+      //blur and ever-so-slightly brighten the image to make the color last
+      sourceBmp.applyFilter(sourceBmp, sourceBmp.rect, O, BLUR_EFFECT);
+      sourceBmp.colorTransform(sourceBmp.rect, DIM_EFFECT);
+      //we've calculated the image in grayscale brightnesses, now make it color
+      colorBmp.paletteMap(sourceBmp, sourceBmp.rect, O, RLUT, GLUT, BLUT, null);
+    }
+  }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-ada.html b/docs/_style/prism-master/examples/prism-ada.html new file mode 100644 index 00000000..1783027e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ada.html @@ -0,0 +1,35 @@ +

Strings

+
"foo ""bar"" baz"
+"Multi-line strings are appended with a " &
+"ampersand symbole."
+ +

Ada83 example

+
WITH ADA.TEXT_IO;
+
+--  Comments look like this.
+
+PROCEDURE TEST IS
+BEGIN
+   ADA.TEXT_IO.PUT_LINE ("Hello");   --  Comments look like this.
+END TEST;
+ +

Ada 2012 full example

+
with Ada.Text_IO; Use Ada.Text_IO;
+
+--  Comments look like this.
+procedure Test is
+   procedure Bah with
+    Import        => True,   --  Shows the new aspect feature of the language.
+    Convention    => C,
+    External_Name => "bah";
+
+   type Things is range 1 .. 10;
+begin
+   Put_Line ("Hello");   --  Comments look like this.
+
+   Bah;  -- Call C function.
+
+   for Index in Things'Range loop
+      null;
+   end loop;
+end Test;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-apacheconf.html b/docs/_style/prism-master/examples/prism-apacheconf.html new file mode 100644 index 00000000..f6953e1b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-apacheconf.html @@ -0,0 +1,54 @@ +

Comments

+
# This is a comment
+# <VirtualHost *:80>
+
+ +

Directives

+
<Files .htaccess>
+	Order allow,deny
+	Deny from all
+</Files>
+
+ +

Variables

+
RewriteCond %{REQUEST_FILENAME}.php -f
+ +

Regex

+
^(.*)$
+!^www\.
+ +

Directive flags

+
[NC]
+[RC=301,L]
+ +

Strings

+
AuthName "Fichiers réservés"
+ +

Full example

+
## BASIC PASSWORD PROTECTION
+AuthType basic
+AuthName "prompt"
+AuthUserFile /.htpasswd
+AuthGroupFile /dev/null
+Require valid-user
+
+## ALLOW FROM IP OR VALID PASSWORD
+Require valid-user
+Allow from 192.168.1.23
+Satisfy Any
+
+## PROTECT FILES
+Order Allow,Deny
+Deny from all
+
+## REQUIRE SUBDOMAIN
+RewriteCond %{HTTP_HOST} !^$
+RewriteCond %{HTTP_HOST} !^subdomain\.domain\.tld$ [NC]
+RewriteRule ^/(.*)$ http://subdomain.domain.tld/$1 [L,R=301]
+
+ErrorDocument 403 http://www.example.com/logo.gif
+ErrorDocument 403 /images/you_bad_hotlinker.gif
+
+## REDIRECT UPLOADS
+RewriteCond %{REQUEST_METHOD} ^(PUT|POST)$ [NC]
+RewriteRule ^(.*)$ /cgi-bin/form-upload-processor.cgi?p=$1 [L,QSA]
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-apl.html b/docs/_style/prism-master/examples/prism-apl.html new file mode 100644 index 00000000..61a7e469 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-apl.html @@ -0,0 +1,26 @@ +

Comments

+
#!/usr/bin/env runapl
+a←1 2 3 ⍝ this is a comment
+ +

Strings

+
''
+'foobar'
+'foo''bar''baz'
+ +

Numbers

+
42
+3.14159
+¯2
+∞
+2.8e¯4
+2j3
+¯4.3e2J1.9e¯4
+ +

Primitive functions

+
a+b×c⍴⍳10
+ +

Operators

+
+/ f⍣2
+ +

Dfns

+
{0=⍴⍴⍺:'hello' ⋄ ∇¨⍵}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-applescript.html b/docs/_style/prism-master/examples/prism-applescript.html new file mode 100644 index 00000000..c88390e8 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-applescript.html @@ -0,0 +1,41 @@ +

Comments

+
-- Single line comment
+#!/usr/bin/osascript
+(* Here is
+a block
+comment *)
+ +

Strings

+
"foo \"bar\" baz"
+ +

Operators

+
a ≠ b
+12 + 2 * 5
+"DUMPtruck" is equal to "dumptruck"
+"zebra" comes after "aardvark"
+{ "this", "is", 2, "cool" } starts with "this"
+{ "is", 2} is contained by { "this", "is", 2, "cool" }
+set docRef to a reference to the first document
+
+ +

Classes and units

+
tell application "Finder"
+text 1 thru 5 of "Bring me the mouse."
+set averageTemp to 63 as degrees Fahrenheit
+set circleArea to (pi * 7 * 7) as square yards
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Comments only support one level of nesting

+
(* Nested block
+	(* comments
+		(* on more than
+		2 levels *)
+	are *)
+not supported *)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-arduino.html b/docs/_style/prism-master/examples/prism-arduino.html new file mode 100644 index 00000000..915f700f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-arduino.html @@ -0,0 +1,63 @@ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+"Multi-line strings ending with a \
+are supported too."
+ +

Macro statements

+
#include <Bridge.h>
+#define SOME_PIN 11
+
+ +

Booleans

+
true;
+false;
+ +

Operators

+
a < b;
+c && d;
+ +

Full example

+
#include <Bridge.h>
+
+// pin of the piezo speaker
+int piezo = 8;
+
+/**
+ * setups
+ * runs once before everyhing else
+ */
+void setup() {
+    pinMode(piezo, OUTPUT);     
+}
+
+/**
+ * loop
+ * this will run forever and do what we want
+ */
+void loop() {
+    playMelody(1);
+    delay(1000);
+}
+
+/**
+ * playMelody
+ * will play a simple melody on piezo speaker
+ */
+void playMelody(int times) {
+    int melody[] = { 4699, 4699, 3520, 4699 };
+    int duration = 6;
+
+    for( int t = 0; t < times; t++ ) {
+        for( int i = 0; i < 4; i++ ) {
+            // pass tone to selected pin
+            tone(piezoPin, melody[i], 1000/duration);
+
+            // get a bit of time between the tones
+            delay(1000 / duration * 1.30 + 80);
+
+            // and don't forget to switch of the tone afterwards
+            noTone(piezoPin);
+        }
+    }
+}
diff --git a/docs/_style/prism-master/examples/prism-arff.html b/docs/_style/prism-master/examples/prism-arff.html new file mode 100644 index 00000000..41812099 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-arff.html @@ -0,0 +1,46 @@ +

Comments

+
%
+% Some comments
+%
+%
+ +

Keywords

+
@attribute
+@data
+@relation
+ +

Numbers

+
42
+0.14
+ +

Strings

+
'Single \'quoted\' string'
+"Double \"quoted\" string"
+ +

Full example

+
% 1. Title: Iris Plants Database
+%
+% 2. Sources:
+%      (a) Creator: R.A. Fisher
+%      (b) Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
+%      (c) Date: July, 1988
+%
+@RELATION iris
+
+@ATTRIBUTE sepallength  NUMERIC
+@ATTRIBUTE sepalwidth   NUMERIC
+@ATTRIBUTE petallength  NUMERIC
+@ATTRIBUTE petalwidth   NUMERIC
+@ATTRIBUTE class        {Iris-setosa,Iris-versicolor,Iris-virginica}
+
+@DATA
+5.1,3.5,1.4,0.2,Iris-setosa
+4.9,3.0,1.4,0.2,Iris-setosa
+4.7,3.2,1.3,0.2,Iris-setosa
+4.6,3.1,1.5,0.2,Iris-setosa
+5.0,3.6,1.4,0.2,Iris-setosa
+5.4,3.9,1.7,0.4,Iris-setosa
+4.6,3.4,1.4,0.3,Iris-setosa
+5.0,3.4,1.5,0.2,Iris-setosa
+4.4,2.9,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
diff --git a/docs/_style/prism-master/examples/prism-asciidoc.html b/docs/_style/prism-master/examples/prism-asciidoc.html new file mode 100644 index 00000000..d6df3021 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-asciidoc.html @@ -0,0 +1,104 @@ +

Comments

+
/////
+Comment block
+/////
+
+// Comment line
+ +

Titles

+
Level 0
+========
+Level 1
+--------
+Level 2
+~~~~~~~~
+Level 3
+^^^^^^^^
+Level 4
+++++++++
+
+= Document Title (level 0) =
+== Section title (level 1) ==
+=== Section title (level 2) ===
+==== Section title (level 3) ====
+===== Section title (level 4) =====
+
+.Notes
+ +

Blocks

+
++++++++++++++++++++++++++
+Passthrough block
+++++++++++++++++++++++++++
+
+--------------------------
+Listing block
+--------------------------
+
+..........................
+Literal block
+No *highlighting* _here_
+..........................
+
+**************************
+Sidebar block
+**************************
+
+[quote,'http://en.wikipedia.org/wiki/Samuel_Johnson[Samuel Johnson]']
+_____________________________________________________________________
+Sir, a woman's preaching is like a dog's walking on his hind legs. It
+is not done well; but you are surprised to find it done at all.
+_____________________________________________________________________
+
+==========================
+Example block
+==========================
+ +

Lists

+
- List item.
+* List item.
+** List item.
+*** List item.
+**** List item.
+***** List item.
+
+1.   Arabic (decimal) numbered list item.
+a.   Lower case alpha (letter) numbered list item.
+F.   Upper case alpha (letter) numbered list item.
+iii) Lower case roman numbered list item.
+IX)  Upper case roman numbered list item.
+
+. Arabic (decimal) numbered list item.
+.. Lower case alpha (letter) numbered list item.
+... Lower case roman numbered list item.
+.... Upper case alpha (letter) numbered list item.
+..... Upper case roman numbered list item.
+
+Dolor::
+  Donec eget arcu bibendum nunc consequat lobortis.
+  Suspendisse;;
+    A massa id sem aliquam auctor.
+  Morbi;;
+    Pretium nulla vel lorem.
+  In;;
+    Dictum mauris in urna.
+    Vivamus::: Fringilla mi eu lacus.
+    Donec:::   Eget arcu bibendum nunc consequat lobortis.
+ +

Tables

+
[cols="e,m,^,>s",width="25%"]
+|============================
+|1 >s|2 |3 |4
+^|5 2.2+^.^|6 .3+<.>m|7
+^|8
+|9 2+>|10
+|============================
+ +

Inline styles

+
*Some bold text*
+This is an _emphasis_
+[[[walsh-muellner]]]
+ +

Attribute entries

+
:Author Initials: JB
+{authorinitials}
+:Author Initials!:
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-asm6502.html b/docs/_style/prism-master/examples/prism-asm6502.html new file mode 100644 index 00000000..21f4b687 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-asm6502.html @@ -0,0 +1,39 @@ +

Comments

+
; This is a comment
+ +

Labels

+
label1:   ; a label
+ +

Opcodes

+

+SEI
+CLC
+
+; lowercase
+inx
+bne label1
+
+ +

Assembler directives

+

+.segment CODE
+.word $07d3
+
+ +

Registers

+

+ASL A  ; "A"
+LDA label1,x  ; "x"
+
+ +

Strings

+

+.include "header.asm"
+
+ +

Numbers

+

+LDA #127
+STA $80f0
+LDY #%01011000
+
diff --git a/docs/_style/prism-master/examples/prism-aspnet.html b/docs/_style/prism-master/examples/prism-aspnet.html new file mode 100644 index 00000000..d9c30fcf --- /dev/null +++ b/docs/_style/prism-master/examples/prism-aspnet.html @@ -0,0 +1,36 @@ +

Comments

+
<%-- This is a comment --%>
+<%-- This is a
+multi-line comment --%>
+ +

Page directives

+
<%@ Page Title="Products" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"  CodeBehind="ProductList.aspx.cs" Inherits="WingtipToys.ProductList" %>
+
+ +

Directive tag

+
<%: Page.Title %>
+<a href="ProductDetails.aspx?productID=<%#:Item.ProductID%>">
+<span>
+    <%#:Item.ProductName%>
+</span>
+ +

Highlighted C# inside scripts

+

This requires the C# component to be loaded. + On this page, check C# before checking ASP.NET should make + the example below work properly.

+
<script runat="server">
+    // The following variables are visible to all procedures
+    // within the script block.
+    String str;
+    int i;
+    int i2;
+
+    int DoubleIt(int inpt)
+    {
+        // The following variable is visible only within
+        // the DoubleIt procedure.
+        int factor = 2;
+
+        return inpt * factor;
+    }
+</script>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-autohotkey.html b/docs/_style/prism-master/examples/prism-autohotkey.html new file mode 100644 index 00000000..620edb2e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-autohotkey.html @@ -0,0 +1,68 @@ +

Comments

+
; This is a comment
+ +

Strings

+
"foo ""bar"" baz"
+ +

Numbers

+
123
+123.456
+123.456e789
+0xAF
+ +

Full example

+
;----Open the selected favorite
+f_OpenFavorite:
+; Fetch the array element that corresponds to the selected menu item:
+StringTrimLeft, f_path, f_path%A_ThisMenuItemPos%, 0
+if f_path =
+    return
+if f_class = #32770    ; It's a dialog.
+{
+    if f_Edit1Pos <>   ; And it has an Edit1 control.
+    {
+        ; Activate the window so that if the user is middle-clicking
+        ; outside the dialog, subsequent clicks will also work:
+        WinActivate ahk_id %f_window_id%
+        ; Retrieve any filename that might already be in the field so
+        ; that it can be restored after the switch to the new folder:
+        ControlGetText, f_text, Edit1, ahk_id %f_window_id%
+        ControlSetText, Edit1, %f_path%, ahk_id %f_window_id%
+        ControlSend, Edit1, {Enter}, ahk_id %f_window_id%
+        Sleep, 100  ; It needs extra time on some dialogs or in some cases.
+        ControlSetText, Edit1, %f_text%, ahk_id %f_window_id%
+        return
+    }
+    ; else fall through to the bottom of the subroutine to take standard action.
+}
+else if f_class in ExploreWClass,CabinetWClass  ; In Explorer, switch folders.
+{
+    if f_Edit1Pos <>   ; And it has an Edit1 control.
+    {
+        ControlSetText, Edit1, %f_path%, ahk_id %f_window_id%
+        ; Tekl reported the following: "If I want to change to Folder L:\folder
+        ; then the addressbar shows http://www.L:\folder.com. To solve this,
+        ; I added a {right} before {Enter}":
+        ControlSend, Edit1, {Right}{Enter}, ahk_id %f_window_id%
+        return
+    }
+    ; else fall through to the bottom of the subroutine to take standard action.
+}
+else if f_class = ConsoleWindowClass ; In a console window, CD to that directory
+{
+    WinActivate, ahk_id %f_window_id% ; Because sometimes the mclick deactivates it.
+    SetKeyDelay, 0  ; This will be in effect only for the duration of this thread.
+    IfInString, f_path, :  ; It contains a drive letter
+    {
+        StringLeft, f_path_drive, f_path, 1
+        Send %f_path_drive%:{enter}
+    }
+    Send, cd %f_path%{Enter}
+    return
+}
+; Since the above didn't return, one of the following is true:
+; 1) It's an unsupported window type but f_AlwaysShowMenu is y (yes).
+; 2) It's a supported type but it lacks an Edit1 control to facilitate the custom
+;    action, so instead do the default action below.
+Run, Explorer %f_path%  ; Might work on more systems without double quotes.
+return
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-autoit.html b/docs/_style/prism-master/examples/prism-autoit.html new file mode 100644 index 00000000..51220b42 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-autoit.html @@ -0,0 +1,52 @@ +

Comments

+
; Single-line comment
+#comments-start
+	Multi-line
+	comment
+#comments-end
+#cs
+	Multi-line
+	comment
+#ce
+;#comments-start
+	foo()
+;#comments-end
+ +

Strings

+
"foo'bar'baz"
+"foo""bar""baz"
+'foo"bar"baz'
+'foo''bar''baz'
+ +

Numbers

+
2
+4.566
+1.5e3
+0x4fff
+ +

Booleans

+
True
+False
+ +

Keywords and variables

+
; Display all the numbers for 1 to 10 but skip displaying  7.
+For $i = 1 To 10
+    If $i = 7 Then
+        ContinueLoop ; Skip displaying the message box when $i is equal to 7.
+    EndIf
+    MsgBox($MB_SYSTEMMODAL, "", "The value of $i is: " & $i)
+Next
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Nested block comments

+
#cs
+	#cs
+		foo()
+	#ce
+#ce
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-bash.html b/docs/_style/prism-master/examples/prism-bash.html new file mode 100644 index 00000000..3e0febfa --- /dev/null +++ b/docs/_style/prism-master/examples/prism-bash.html @@ -0,0 +1,49 @@ +

Shebang

+
#!/bin/bash
+ +

Comments

+
# This is a comment
+ +

Strings

+
STRING="Hello World"
+'Single and
+multi-line strings are supported.'
+"Single and
+multi-line strings are supported."
+cat << EOF
+Here-Documents
+are also supported
+EOF
+ +

Variables

+
echo $STRING
+args=("$@")
+echo ${args[0]} ${args[1]} ${args[2]}
+ +

Keywords

+
for (( i=0;i<$ELEMENTS;i++)); do
+	echo ${ARRAY[${i}]}
+done
+while read LINE; do
+    ARRAY[$count]=$LINE
+    ((count++))
+done
+if [ -d $directory ]; then
+	echo "Directory exists"
+else
+	echo "Directory does not exists"
+fi
+
+ +

Some well-known commands

+
crontab -l -u USER | grep -v 'YOUR JOB COMMAND or PATTERN' | crontab -u USER -
+
+groups user1 user2|cut -d: -f2|xargs -n1|sort|uniq -d
+
+wget -q -O - http://www.example.com/automation/remotescript.sh | bash /dev/stdin parameter1 parameter2
+
+sudo dpkg -i vagrant_1.7.2_x86_64.deb
+
+git pull origin master
+
+sudo gpg --refresh-keys; sudo apt-key update; sudo rm -rf /var/lib/apt/{lists,lists.old}; sudo mkdir -p /var/lib/apt/lists/partial; sudo apt-get clean all; sudo apt-get update
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-basic.html b/docs/_style/prism-master/examples/prism-basic.html new file mode 100644 index 00000000..3630a8a2 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-basic.html @@ -0,0 +1,69 @@ +

Note: this component focuses on first and second-generation BASICs (such as MSX BASIC, GW-BASIC, SuperBASIC, QuickBASIC, PowerBASIC...).

+ +

Comments

+
! This is a comment
+REM This is a remark
+ +

Strings

+
"This a string."
+"This is a string with ""quotes"" in it."
+ +

Numbers

+
42
+3.14159
+-42
+-3.14159
+.5
+10.
+2E10
+4.2E-14
+-3E+2
+ +

Dartmouth Basic example

+
5 LET S = 0
+10 MAT INPUT V
+20 LET N = NUM
+30 IF N = 0 THEN 99
+40 FOR I = 1 TO N
+45 LET S = S + V(I)
+50 NEXT I
+60 PRINT S/N
+70 GO TO 5
+99 END
+ +

GW-BASIC example

+
10 INPUT "What is your name: ", U$
+20 PRINT "Hello "; U$
+30 INPUT "How many stars do you want: ", N
+40 S$ = ""
+50 FOR I = 1 TO N
+60 S$ = S$ + "*"
+70 NEXT I
+80 PRINT S$
+90 INPUT "Do you want more stars? ", A$
+100 IF LEN(A$) = 0 THEN GOTO 90
+110 A$ = LEFT$(A$, 1)
+120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30
+130 PRINT "Goodbye "; U$
+140 END
+ +

QuickBASIC example

+
DECLARE SUB PrintSomeStars (StarCount!)
+REM QuickBASIC example
+INPUT "What is your name: ", UserName$
+PRINT "Hello "; UserName$
+DO
+   INPUT "How many stars do you want: ", NumStars
+   CALL PrintSomeStars(NumStars)
+   DO
+      INPUT "Do you want more stars? ", Answer$
+   LOOP UNTIL Answer$ <> ""
+   Answer$ = LEFT$(Answer$, 1)
+LOOP WHILE UCASE$(Answer$) = "Y"
+PRINT "Goodbye "; UserName$
+
+SUB PrintSomeStars (StarCount)
+   REM This procedure uses a local variable called Stars$
+   Stars$ = STRING$(StarCount, "*")
+   PRINT Stars$
+END SUB
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-batch.html b/docs/_style/prism-master/examples/prism-batch.html new file mode 100644 index 00000000..13f9018c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-batch.html @@ -0,0 +1,17 @@ +

Comments

+
::
+:: Foo bar
+REM This is a comment too
+REM Multi-line ^
+comment
+ +

Labels

+
:foobar
+GOTO :EOF
+ +

Commands

+
@ECHO OFF
+FOR /l %%a in (5,-1,1) do (TITLE %title% -- closing in %%as)
+SET title=%~n0
+if /i "%InstSize:~0,1%"=="M" set maxcnt=3
+ping -n 2 -w 1 127.0.0.1
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-bison.html b/docs/_style/prism-master/examples/prism-bison.html new file mode 100644 index 00000000..9c7edeb8 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-bison.html @@ -0,0 +1,104 @@ +

Comments

+
// Single-line comment
+/* Multi-line
+comment */
+ +

C prologue and Bison declarations

+
%{
+  #include <stdio.h>
+  #include <math.h>
+  int yylex (void);
+  void yyerror (char const *);
+%}
+
+%define api.value.type {double}
+%token NUM
+%union { char *string; }
+%%
+%%
+ +

Grammar rules

+
%%
+exp:
+  NUM           { $$ = $1;           }
+| exp exp '+'   { $$ = $1 + $2;      }
+| exp exp '-'   { $$ = $1 - $2;      }
+| exp exp '*'   { $$ = $1 * $2;      }
+| exp exp '/'   { $$ = $1 / $2;      }
+| exp exp '^'   { $$ = pow($1, $2);  }  /* Exponentiation */
+| exp 'n'       { $$ = -$1;          }  /* Unary minus    */
+;
+
+$@1: %empty { a(); };
+$@2: %empty { c(); };
+$@3: %empty { d(); };
+exp: $@1 "b" $@2 $@3 "e" { f(); };
+%%
+ +

Full example

+
/* Mini Calculator */
+/* calc.y */
+
+%{
+#include "heading.h"
+int yyerror(char *s);
+int yylex(void);
+%}
+
+%union{
+  int		int_val;
+  string*	op_val;
+}
+
+%start	input 
+
+%token	<int_val>	INTEGER_LITERAL
+%type	<int_val>	exp
+%left	PLUS
+%left	MULT
+
+%%
+
+input:		/* empty */
+		| exp	{ cout << "Result: " << $1 << endl; }
+		;
+
+exp:		INTEGER_LITERAL	{ $$ = $1; }
+		| exp PLUS exp	{ $$ = $1 + $3; }
+		| exp MULT exp	{ $$ = $1 * $3; }
+		;
+
+%%
+
+int yyerror(string s)
+{
+  extern int yylineno;	// defined and maintained in lex.c
+  extern char *yytext;	// defined and maintained in lex.c
+  
+  cerr << "ERROR: " << s << " at symbol \"" << yytext;
+  cerr << "\" on line " << yylineno << endl;
+  exit(1);
+}
+
+int yyerror(char *s)
+{
+  return yyerror(string(s));
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Two levels of nesting inside C section

+
{
+	if($1) {
+		if($2) {
+
+		}
+	}
+} // <- Broken
+%%
+%%
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-brainfuck.html b/docs/_style/prism-master/examples/prism-brainfuck.html new file mode 100644 index 00000000..89a435c9 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-brainfuck.html @@ -0,0 +1,37 @@ +

Full example

+
+++++ +++               Set Cell #0 to 8
+[
+    >++++               Add 4 to Cell #1; this will always set Cell #1 to 4
+    [                   as the cell will be cleared by the loop
+        >++             Add 2 to Cell #2
+        >+++            Add 3 to Cell #3
+        >+++            Add 3 to Cell #4
+        >+              Add 1 to Cell #5
+        <<<<-           Decrement the loop counter in Cell #1
+    ]                   Loop till Cell #1 is zero; number of iterations is 4
+    >+                  Add 1 to Cell #2
+    >+                  Add 1 to Cell #3
+    >-                  Subtract 1 from Cell #4
+    >>+                 Add 1 to Cell #6
+    [<]                 Move back to the first zero cell you find; this will
+                        be Cell #1 which was cleared by the previous loop
+    <-                  Decrement the loop Counter in Cell #0
+]                       Loop till Cell #0 is zero; number of iterations is 8
+
+The result of this is:
+Cell No :   0   1   2   3   4   5   6
+Contents:   0   0  72 104  88  32   8
+Pointer :   ^
+
+>>.                     Cell #2 has value 72 which is 'H'
+>---.                   Subtract 3 from Cell #3 to get 101 which is 'e'
++++++++..+++.           Likewise for 'llo' from Cell #3
+>>.                     Cell #5 is 32 for the space
+<-.                     Subtract 1 from Cell #4 for 87 to give a 'W'
+<.                      Cell #3 was set to 'o' from the end of 'Hello'
++++.------.--------.    Cell #3 for 'rl' and 'd'
+>>+.                    Add 1 to Cell #5 gives us an exclamation point
+>++.                    And finally a newline from Cell #6
+ +

One-line example

+
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
diff --git a/docs/_style/prism-master/examples/prism-bro.html b/docs/_style/prism-master/examples/prism-bro.html new file mode 100644 index 00000000..83d6374e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-bro.html @@ -0,0 +1,645 @@ +

Comments

+
# Single line comment
+
+ +

Strings

+

+"a", "b"
+
+ +

Numbers

+
123
+123.456
+-123.456
+
+ +

Misc

+

+@ifndef ourexp
+@load-sigs somesigs
+
+ +

Full example

+

+##! Scan detector ported from Bro 1.x.
+##!
+##! This script has evolved over many years and is quite a mess right now. We
+##! have adapted it to work with Bro 2.x, but eventually Bro 2.x will
+##! get its own rewritten and generalized scan detector.
+
+@load base/frameworks/notice/main
+
+module Scan;
+
+export {
+	redef enum Notice::Type += {
+		## The source has scanned a number of ports.
+		PortScan,
+		## The source has scanned a number of addresses.
+		AddressScan,
+		## Apparent flooding backscatter seen from source.
+		BackscatterSeen,
+
+		## Summary of scanning activity.
+		ScanSummary,
+		## Summary of distinct ports per scanner.
+		PortScanSummary,
+		## Summary of distinct low ports per scanner.
+		LowPortScanSummary,
+
+		## Source reached :bro:id:`Scan::shut_down_thresh`
+		ShutdownThresh,
+		## Source touched privileged ports.
+		LowPortTrolling,
+	};
+
+	# Whether to consider UDP "connections" for scan detection.
+	# Can lead to false positives due to UDP fanout from some P2P apps.
+	const suppress_UDP_scan_checks = F &redef;
+
+	const activate_priv_port_check = T &redef;
+	const activate_landmine_check = F &redef;
+	const landmine_thresh_trigger = 5 &redef;
+
+	const landmine_address: set[addr] &redef;
+
+	const scan_summary_trigger = 25 &redef;
+	const port_summary_trigger = 20 &redef;
+	const lowport_summary_trigger = 10 &redef;
+
+	# Raise ShutdownThresh after this many failed attempts
+	const shut_down_thresh = 100 &redef;
+
+	# Which services should be analyzed when detecting scanning
+	# (not consulted if analyze_all_services is set).
+	const analyze_services: set[port] &redef;
+	const analyze_all_services = T &redef;
+
+	# Track address scaners only if at least these many hosts contacted.
+	const addr_scan_trigger = 0 &redef;
+
+	# Ignore address scanners for further scan detection after
+	# scanning this many hosts.
+	# 0 disables.
+	const ignore_scanners_threshold = 0 &redef;
+
+	# Report a scan of peers at each of these points.
+	const report_peer_scan: vector of count = {
+		20, 100, 1000, 10000, 50000, 100000, 250000, 500000, 1000000,
+	} &redef;
+
+	const report_outbound_peer_scan: vector of count = {
+		100, 1000, 10000,
+	} &redef;
+
+	# Report a scan of ports at each of these points.
+	const report_port_scan: vector of count = {
+		50, 250, 1000, 5000, 10000, 25000, 65000,
+	} &redef;
+
+	# Once a source has scanned this many different ports (to however many
+	# different remote hosts), start tracking its per-destination access.
+	const possible_port_scan_thresh = 20 &redef;
+
+	# Threshold for scanning privileged ports.
+	const priv_scan_trigger = 5 &redef;
+	const troll_skip_service = {
+		25/tcp, 21/tcp, 22/tcp, 20/tcp, 80/tcp,
+	} &redef;
+
+	const report_accounts_tried: vector of count = {
+		20, 100, 1000, 10000, 100000, 1000000,
+	} &redef;
+
+	const report_remote_accounts_tried: vector of count = {
+		100, 500,
+	} &redef;
+
+	# Report a successful password guessing if the source attempted
+	# at least this many.
+	const password_guessing_success_threshhold = 20 &redef;
+
+	const skip_accounts_tried: set[addr] &redef;
+
+	const addl_web = {
+		81/tcp, 443/tcp, 8000/tcp, 8001/tcp, 8080/tcp, }
+	&redef;
+
+	const skip_services = { 113/tcp, } &redef;
+	const skip_outbound_services = { 21/tcp, addl_web, }
+		&redef;
+
+	const skip_scan_sources = {
+		255.255.255.255,	# who knows why we see these, but we do
+	} &redef;
+
+	const skip_scan_nets: set[subnet] = {} &redef;
+
+	# List of well known local server/ports to exclude for scanning
+	# purposes.
+	const skip_dest_server_ports: set[addr, port] = {} &redef;
+
+	# Reverse (SYN-ack) scans seen from these ports are considered
+	# to reflect possible SYN-flooding backscatter, and not true
+	# (stealth) scans.
+	const backscatter_ports = {
+		80/tcp, 8080/tcp, 53/tcp, 53/udp, 179/tcp, 6666/tcp, 6667/tcp,
+	} &redef;
+
+	const report_backscatter: vector of count = {
+		20,
+	} &redef;
+
+	global check_scan:
+		function(c: connection, established: bool, reverse: bool): bool;
+
+	# The following tables are defined here so that we can redef
+	# the expire timeouts.
+	# FIXME: should we allow redef of attributes on IDs which
+	# are not exported?
+
+	# How many different hosts connected to with a possible
+	# backscatter signature.
+	global distinct_backscatter_peers: table[addr] of table[addr] of count
+		&read_expire = 15 min;
+
+	# Expire functions that trigger summaries.
+	global scan_summary:
+		function(t: table[addr] of set[addr], orig: addr): interval;
+	global port_summary:
+		function(t: table[addr] of set[port], orig: addr): interval;
+	global lowport_summary:
+		function(t: table[addr] of set[port], orig: addr): interval;
+
+	# Indexed by scanner address, yields # distinct peers scanned.
+	# pre_distinct_peers tracks until addr_scan_trigger hosts first.
+	global pre_distinct_peers: table[addr] of set[addr]
+		&read_expire = 15 mins &redef;
+
+	global distinct_peers: table[addr] of set[addr]
+		&read_expire = 15 mins &expire_func=scan_summary &redef;
+	global distinct_ports: table[addr] of set[port]
+		&read_expire = 15 mins &expire_func=port_summary &redef;
+	global distinct_low_ports: table[addr] of set[port]
+		&read_expire = 15 mins &expire_func=lowport_summary &redef;
+
+	# Indexed by scanner address, yields a table with scanned hosts
+	# (and ports).
+	global scan_triples: table[addr] of table[addr] of set[port];
+
+	global remove_possible_source:
+		function(s: set[addr], idx: addr): interval;
+	global possible_scan_sources: set[addr]
+		&expire_func=remove_possible_source &read_expire = 15 mins;
+
+	# Indexed by source address, yields user name & password tried.
+	global accounts_tried: table[addr] of set[string, string]
+		&read_expire = 1 days;
+
+	global ignored_scanners: set[addr] &create_expire = 1 day &redef;
+
+	# These tables track whether a threshold has been reached.
+	# More precisely, the counter is the next index of threshold vector.
+	global shut_down_thresh_reached: table[addr] of bool &default=F;
+	global rb_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rps_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rops_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rpts_idx: table[addr,addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rat_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+	global rrat_idx: table[addr] of count
+			&default=1 &read_expire = 1 days &redef;
+}
+
+global thresh_check: function(v: vector of count, idx: table[addr] of count,
+				orig: addr, n: count): bool;
+global thresh_check_2: function(v: vector of count,
+				idx: table[addr,addr] of count, orig: addr,
+				resp: addr, n: count): bool;
+
+function scan_summary(t: table[addr] of set[addr], orig: addr): interval
+	{
+	local num_distinct_peers = orig in t ? |t[orig]| : 0;
+
+	if ( num_distinct_peers >= scan_summary_trigger )
+		NOTICE([$note=ScanSummary, $src=orig, $n=num_distinct_peers,
+			$identifier=fmt("%s", orig),
+			$msg=fmt("%s scanned a total of %d hosts",
+					orig, num_distinct_peers)]);
+
+	return 0 secs;
+	}
+
+function port_summary(t: table[addr] of set[port], orig: addr): interval
+	{
+	local num_distinct_ports = orig in t ? |t[orig]| : 0;
+
+	if ( num_distinct_ports >= port_summary_trigger )
+		NOTICE([$note=PortScanSummary, $src=orig, $n=num_distinct_ports,
+			$identifier=fmt("%s", orig),
+			$msg=fmt("%s scanned a total of %d ports",
+					orig, num_distinct_ports)]);
+
+	return 0 secs;
+	}
+
+function lowport_summary(t: table[addr] of set[port], orig: addr): interval
+	{
+	local num_distinct_lowports = orig in t ? |t[orig]| : 0;
+
+	if ( num_distinct_lowports >= lowport_summary_trigger )
+		NOTICE([$note=LowPortScanSummary, $src=orig,
+			$n=num_distinct_lowports,
+			$identifier=fmt("%s", orig),
+			$msg=fmt("%s scanned a total of %d low ports",
+					orig, num_distinct_lowports)]);
+
+	return 0 secs;
+	}
+
+function clear_addr(a: addr)
+	{
+	delete distinct_peers[a];
+	delete distinct_ports[a];
+	delete distinct_low_ports[a];
+	delete scan_triples[a];
+	delete possible_scan_sources[a];
+	delete distinct_backscatter_peers[a];
+	delete pre_distinct_peers[a];
+	delete rb_idx[a];
+	delete rps_idx[a];
+	delete rops_idx[a];
+	delete rat_idx[a];
+	delete rrat_idx[a];
+	delete shut_down_thresh_reached[a];
+	delete ignored_scanners[a];
+	}
+
+function ignore_addr(a: addr)
+	{
+	clear_addr(a);
+	add ignored_scanners[a];
+	}
+
+function check_scan(c: connection, established: bool, reverse: bool): bool
+	{
+	local id = c$id;
+
+	local service = "ftp-data" in c$service ? 20/tcp
+			: (reverse ? id$orig_p : id$resp_p);
+	local rev_service = reverse ? id$resp_p : id$orig_p;
+	local orig = reverse ? id$resp_h : id$orig_h;
+	local resp = reverse ? id$orig_h : id$resp_h;
+	local outbound = Site::is_local_addr(orig);
+
+	# The following works better than using get_conn_transport_proto()
+	# because c might not correspond to an active connection (which
+	# causes the function to fail).
+	if ( suppress_UDP_scan_checks &&
+	     service >= 0/udp && service <= 65535/udp )
+		return F;
+
+	if ( service in skip_services && ! outbound )
+		return F;
+
+	if ( outbound && service in skip_outbound_services )
+		return F;
+
+	if ( orig in skip_scan_sources )
+		return F;
+
+	if ( orig in skip_scan_nets )
+		return F;
+
+	# Don't include well known server/ports for scanning purposes.
+	if ( ! outbound && [resp, service] in skip_dest_server_ports )
+		return F;
+
+	if ( orig in ignored_scanners)
+		return F;
+
+	if ( ! established &&
+		# not established, service not expressly allowed
+
+		# not known peer set
+		(orig !in distinct_peers || resp !in distinct_peers[orig]) &&
+
+		# want to consider service for scan detection
+		(analyze_all_services || service in analyze_services) )
+		{
+		if ( reverse && rev_service in backscatter_ports &&
+		     # reverse, non-priv backscatter port
+		     service >= 1024/tcp )
+			{
+			if ( orig !in distinct_backscatter_peers )
+				{
+				local empty_bs_table:
+					table[addr] of count &default=0;
+				distinct_backscatter_peers[orig] =
+					empty_bs_table;
+				}
+
+			if ( ++distinct_backscatter_peers[orig][resp] <= 2 &&
+			     # The test is <= 2 because we get two check_scan()
+			     # calls, once on connection attempt and once on
+			     # tear-down.
+
+			     distinct_backscatter_peers[orig][resp] == 1 &&
+
+			     # Looks like backscatter, and it's not scanning
+			     # a privileged port.
+
+			     thresh_check(report_backscatter, rb_idx, orig,
+					|distinct_backscatter_peers[orig]|)
+			   )
+				{
+				NOTICE([$note=BackscatterSeen, $src=orig,
+					$p=rev_service,
+					$identifier=fmt("%s", orig),
+					$msg=fmt("backscatter seen from %s (%d hosts; %s)",
+						orig, |distinct_backscatter_peers[orig]|, rev_service)]);
+				}
+
+			if ( ignore_scanners_threshold > 0 &&
+			     |distinct_backscatter_peers[orig]| >
+					ignore_scanners_threshold )
+				ignore_addr(orig);
+			}
+
+		else
+			{ # done with backscatter check
+			local ignore = F;
+
+			if ( orig !in distinct_peers && addr_scan_trigger > 0 )
+				{
+				if ( orig !in pre_distinct_peers )
+					pre_distinct_peers[orig] = set();
+
+				add pre_distinct_peers[orig][resp];
+				if ( |pre_distinct_peers[orig]| < addr_scan_trigger )
+					ignore = T;
+				}
+
+			if ( ! ignore )
+				{ # XXXXX
+
+				if ( orig !in distinct_peers )
+					distinct_peers[orig] = set() &mergeable;
+
+				if ( resp !in distinct_peers[orig] )
+					add distinct_peers[orig][resp];
+
+				local n = |distinct_peers[orig]|;
+
+				# Check for threshold if not outbound.
+				if ( ! shut_down_thresh_reached[orig] &&
+				     n >= shut_down_thresh &&
+				     ! outbound && orig !in Site::neighbor_nets )
+					{
+					shut_down_thresh_reached[orig] = T;
+					local msg = fmt("shutdown threshold reached for %s", orig);
+					NOTICE([$note=ShutdownThresh, $src=orig,
+						$identifier=fmt("%s", orig),
+						$p=service, $msg=msg]);
+					}
+
+				else
+					{
+					local address_scan = F;
+					if ( outbound &&
+					     # inside host scanning out?
+					     thresh_check(report_outbound_peer_scan, rops_idx, orig, n) )
+						address_scan = T;
+
+					if ( ! outbound &&
+					     thresh_check(report_peer_scan, rps_idx, orig, n) )
+						address_scan = T;
+
+					if ( address_scan )
+						NOTICE([$note=AddressScan,
+							$src=orig, $p=service,
+							$n=n,
+							$identifier=fmt("%s-%d", orig, n),
+							$msg=fmt("%s has scanned %d hosts (%s)",
+								orig, n, service)]);
+
+					if ( address_scan &&
+					     ignore_scanners_threshold > 0 &&
+					     n > ignore_scanners_threshold )
+						ignore_addr(orig);
+					}
+				}
+			} # XXXX
+		}
+
+	if ( established )
+		# Don't consider established connections for port scanning,
+		# it's too easy to be mislead by FTP-like applications that
+		# legitimately gobble their way through the port space.
+		return F;
+
+	# Coarse search for port-scanning candidates: those that have made
+	# connections (attempts) to possible_port_scan_thresh or more
+	# distinct ports.
+	if ( orig !in distinct_ports || service !in distinct_ports[orig] )
+		{
+		if ( orig !in distinct_ports )
+			distinct_ports[orig] = set() &mergeable;
+
+		if ( service !in distinct_ports[orig] )
+			add distinct_ports[orig][service];
+
+		if ( |distinct_ports[orig]| >= possible_port_scan_thresh &&
+			orig !in scan_triples )
+			{
+			scan_triples[orig] = table() &mergeable;
+			add possible_scan_sources[orig];
+			}
+		}
+
+	# Check for low ports.
+	if ( activate_priv_port_check && ! outbound && service < 1024/tcp &&
+	     service !in troll_skip_service )
+		{
+		if ( orig !in distinct_low_ports ||
+		     service !in distinct_low_ports[orig] )
+			{
+			if ( orig !in distinct_low_ports )
+				distinct_low_ports[orig] = set() &mergeable;
+
+			add distinct_low_ports[orig][service];
+
+			if ( |distinct_low_ports[orig]| == priv_scan_trigger &&
+			     orig !in Site::neighbor_nets )
+				{
+				local svrc_msg = fmt("low port trolling %s %s", orig, service);
+				NOTICE([$note=LowPortTrolling, $src=orig,
+					$identifier=fmt("%s", orig),
+					$p=service, $msg=svrc_msg]);
+				}
+
+			if ( ignore_scanners_threshold > 0 &&
+			     |distinct_low_ports[orig]| >
+					ignore_scanners_threshold )
+				ignore_addr(orig);
+			}
+		}
+
+	# For sources that have been identified as possible scan sources,
+	# keep track of per-host scanning.
+	if ( orig in possible_scan_sources )
+		{
+		if ( orig !in scan_triples )
+			scan_triples[orig] = table() &mergeable;
+
+		if ( resp !in scan_triples[orig] )
+			scan_triples[orig][resp] = set() &mergeable;
+
+		if ( service !in scan_triples[orig][resp] )
+			{
+			add scan_triples[orig][resp][service];
+
+			if ( thresh_check_2(report_port_scan, rpts_idx,
+					    orig, resp,
+					    |scan_triples[orig][resp]|) )
+				{
+				local m = |scan_triples[orig][resp]|;
+				NOTICE([$note=PortScan, $n=m, $src=orig,
+					$p=service,
+					$identifier=fmt("%s-%d", orig, n),
+					$msg=fmt("%s has scanned %d ports of %s",
+					orig, m, resp)]);
+				}
+			}
+		}
+
+	return T;
+	}
+
+
+# Hook into the catch&release dropping. When an address gets restored, we reset
+# the source to allow dropping it again.
+event Drop::address_restored(a: addr)
+	{
+	clear_addr(a);
+	}
+
+event Drop::address_cleared(a: addr)
+	{
+	clear_addr(a);
+	}
+
+# When removing a possible scan source, we automatically delete its scanned
+# hosts and ports.  But we do not want the deletion propagated, because every
+# peer calls the expire_function on its own (and thus applies the delete
+# operation on its own table).
+function remove_possible_source(s: set[addr], idx: addr): interval
+	{
+	suspend_state_updates();
+	delete scan_triples[idx];
+	resume_state_updates();
+
+	return 0 secs;
+	}
+
+# To recognize whether a certain threshhold vector (e.g. report_peer_scans)
+# has been transgressed, a global variable containing the next vector index
+# (idx) must be incremented.  This cumbersome mechanism is necessary because
+# values naturally don't increment by one (e.g. replayed table merges).
+function thresh_check(v: vector of count, idx: table[addr] of count,
+			orig: addr, n: count): bool
+	{
+	if ( ignore_scanners_threshold > 0 && n > ignore_scanners_threshold )
+		{
+		ignore_addr(orig);
+		return F;
+		}
+
+	if ( idx[orig] <= |v| && n >= v[idx[orig]] )
+		{
+		++idx[orig];
+		return T;
+		}
+	else
+		return F;
+	}
+
+# Same as above, except the index has a different type signature.
+function thresh_check_2(v: vector of count, idx: table[addr, addr] of count,
+			orig: addr, resp: addr, n: count): bool
+	{
+	if ( ignore_scanners_threshold > 0 && n > ignore_scanners_threshold )
+		{
+		ignore_addr(orig);
+		return F;
+		}
+
+	if ( idx[orig,resp] <= |v| && n >= v[idx[orig, resp]] )
+		{
+		++idx[orig,resp];
+		return T;
+		}
+	else
+		return F;
+	}
+
+event connection_established(c: connection)
+	{
+	local is_reverse_scan = (c$orig$state == TCP_INACTIVE);
+	Scan::check_scan(c, T, is_reverse_scan);
+	}
+
+event partial_connection(c: connection)
+	{
+	Scan::check_scan(c, T, F);
+	}
+
+event connection_attempt(c: connection)
+	{
+	Scan::check_scan(c, F, c$orig$state == TCP_INACTIVE);
+	}
+
+event connection_half_finished(c: connection)
+	{
+	# Half connections never were "established", so do scan-checking here.
+	Scan::check_scan(c, F, F);
+	}
+
+event connection_rejected(c: connection)
+	{
+	local is_reverse_scan = c$orig$state == TCP_RESET;
+
+	Scan::check_scan(c, F, is_reverse_scan);
+	}
+
+event connection_reset(c: connection)
+	{
+	if ( c$orig$state == TCP_INACTIVE || c$resp$state == TCP_INACTIVE )
+		# We never heard from one side - that looks like a scan.
+		Scan::check_scan(c, c$orig$size + c$resp$size > 0,
+				c$orig$state == TCP_INACTIVE);
+	}
+
+event connection_pending(c: connection)
+	{
+	if ( c$orig$state == TCP_PARTIAL && c$resp$state == TCP_INACTIVE )
+		Scan::check_scan(c, F, F);
+	}
+
+# Report the remaining entries in the tables.
+event bro_done()
+	{
+	for ( orig in distinct_peers )
+		scan_summary(distinct_peers, orig);
+
+	for ( orig in distinct_ports )
+		port_summary(distinct_ports, orig);
+
+	for ( orig in distinct_low_ports )
+		lowport_summary(distinct_low_ports, orig);
+	}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-c.html b/docs/_style/prism-master/examples/prism-c.html new file mode 100644 index 00000000..aee1c06a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-c.html @@ -0,0 +1,22 @@ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+"Multi-line strings ending with a \
+are supported too."
+ +

Macro statements

+
# include <stdio.h>
+#define PG_locked   0
+#define PG_error    1
+
+ +

Full example

+
#include <stdio.h>
+main(int argc, char *argv[])
+{
+   int c;
+   printf("Number of command line arguments passed: %d\n", argc);
+   for ( c = 0 ; c < argc ; c++)
+      printf("%d. Command line argument passed is %s\n", c+1, argv[c]);
+   return 0;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-clike.html b/docs/_style/prism-master/examples/prism-clike.html new file mode 100644 index 00000000..79a80764 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-clike.html @@ -0,0 +1,28 @@ +

The C-like component is not really a language on its own, + it is the basis of many other components. To use it directly, however, + use the class "language-clike".

+ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz";
+'foo \'bar\' baz';
+ +

Numbers

+
123
+123.456
+-123.456
+1e-23
+123.456E789
+0xaf
+0xAF
+
+ +

Functions

+
foo();
+Bar();
+_456();
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-clojure.html b/docs/_style/prism-master/examples/prism-clojure.html new file mode 100644 index 00000000..abc50194 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-clojure.html @@ -0,0 +1,386 @@ +

Full example

+

+; This code is copied from https://learnxinyminutes.com/docs/clojure/
+
+; Comments start with semicolons.
+
+; Clojure is written in "forms", which are just
+; lists of things inside parentheses, separated by whitespace.
+;
+; The clojure reader assumes that the first thing is a
+; function or macro to call, and the rest are arguments.
+
+; The first call in a file should be ns, to set the namespace
+(ns learnclojure)
+
+; More basic examples:
+
+; str will create a string out of all its arguments
+(str "Hello" " " "World") ; => "Hello World"
+
+; Math is straightforward
+(+ 1 1) ; => 2
+(- 2 1) ; => 1
+(* 1 2) ; => 2
+(/ 2 1) ; => 2
+
+; Equality is =
+(= 1 1) ; => true
+(= 2 1) ; => false
+
+; You need not for logic, too
+(not true) ; => false
+
+; Nesting forms works as you expect
+(+ 1 (- 3 2)) ; = 1 + (3 - 2) => 2
+
+; Types
+;;;;;;;;;;;;;
+
+; Clojure uses Java's object types for booleans, strings and numbers.
+; Use `class` to inspect them.
+(class 1) ; Integer literals are java.lang.Long by default
+(class 1.); Float literals are java.lang.Double
+(class ""); Strings always double-quoted, and are java.lang.String
+(class false) ; Booleans are java.lang.Boolean
+(class nil); The "null" value is called nil
+
+; If you want to create a literal list of data, use ' to stop it from
+; being evaluated
+'(+ 1 2) ; => (+ 1 2)
+; (shorthand for (quote (+ 1 2)))
+
+; You can eval a quoted list
+(eval '(+ 1 2)) ; => 3
+
+; Collections & Sequences
+;;;;;;;;;;;;;;;;;;;
+
+; Lists are linked-list data structures, while Vectors are array-backed.
+; Vectors and Lists are java classes too!
+(class [1 2 3]); => clojure.lang.PersistentVector
+(class '(1 2 3)); => clojure.lang.PersistentList
+
+; A list would be written as just (1 2 3), but we have to quote
+; it to stop the reader thinking it's a function.
+; Also, (list 1 2 3) is the same as '(1 2 3)
+
+; "Collections" are just groups of data
+; Both lists and vectors are collections:
+(coll? '(1 2 3)) ; => true
+(coll? [1 2 3]) ; => true
+
+; "Sequences" (seqs) are abstract descriptions of lists of data.
+; Only lists are seqs.
+(seq? '(1 2 3)) ; => true
+(seq? [1 2 3]) ; => false
+
+; A seq need only provide an entry when it is accessed.
+; So, seqs which can be lazy -- they can define infinite series:
+(range 4) ; => (0 1 2 3)
+(range) ; => (0 1 2 3 4 ...) (an infinite series)
+(take 4 (range)) ;  (0 1 2 3)
+
+; Use cons to add an item to the beginning of a list or vector
+(cons 4 [1 2 3]) ; => (4 1 2 3)
+(cons 4 '(1 2 3)) ; => (4 1 2 3)
+
+; Conj will add an item to a collection in the most efficient way.
+; For lists, they insert at the beginning. For vectors, they insert at the end.
+(conj [1 2 3] 4) ; => [1 2 3 4]
+(conj '(1 2 3) 4) ; => (4 1 2 3)
+
+; Use concat to add lists or vectors together
+(concat [1 2] '(3 4)) ; => (1 2 3 4)
+
+; Use filter, map to interact with collections
+(map inc [1 2 3]) ; => (2 3 4)
+(filter even? [1 2 3]) ; => (2)
+
+; Use reduce to reduce them
+(reduce + [1 2 3 4])
+; = (+ (+ (+ 1 2) 3) 4)
+; => 10
+
+; Reduce can take an initial-value argument too
+(reduce conj [] '(3 2 1))
+; = (conj (conj (conj [] 3) 2) 1)
+; => [3 2 1]
+
+; Functions
+;;;;;;;;;;;;;;;;;;;;;
+
+; Use fn to create new functions. A function always returns
+; its last statement.
+(fn [] "Hello World") ; => fn
+
+; (You need extra parens to call it)
+((fn [] "Hello World")) ; => "Hello World"
+
+; You can create a var using def
+(def x 1)
+x ; => 1
+
+; Assign a function to a var
+(def hello-world (fn [] "Hello World"))
+(hello-world) ; => "Hello World"
+
+; You can shorten this process by using defn
+(defn hello-world [] "Hello World")
+
+; The [] is the list of arguments for the function.
+(defn hello [name]
+  (str "Hello " name))
+(hello "Steve") ; => "Hello Steve"
+
+; You can also use this shorthand to create functions:
+(def hello2 #(str "Hello " %1))
+(hello2 "Fanny") ; => "Hello Fanny"
+
+; You can have multi-variadic functions, too
+(defn hello3
+  ([] "Hello World")
+  ([name] (str "Hello " name)))
+(hello3 "Jake") ; => "Hello Jake"
+(hello3) ; => "Hello World"
+
+; Functions can pack extra arguments up in a seq for you
+(defn count-args [& args]
+  (str "You passed " (count args) " args: " args))
+(count-args 1 2 3) ; => "You passed 3 args: (1 2 3)"
+
+; You can mix regular and packed arguments
+(defn hello-count [name & args]
+  (str "Hello " name ", you passed " (count args) " extra args"))
+(hello-count "Finn" 1 2 3)
+; => "Hello Finn, you passed 3 extra args"
+
+
+; Maps
+;;;;;;;;;;
+
+; Hash maps and array maps share an interface. Hash maps have faster lookups
+; but don't retain key order.
+(class {:a 1 :b 2 :c 3}) ; => clojure.lang.PersistentArrayMap
+(class (hash-map :a 1 :b 2 :c 3)) ; => clojure.lang.PersistentHashMap
+
+; Arraymaps will automatically become hashmaps through most operations
+; if they get big enough, so you don't need to worry.
+
+; Maps can use any hashable type as a key, but usually keywords are best
+; Keywords are like strings with some efficiency bonuses
+(class :a) ; => clojure.lang.Keyword
+
+(def stringmap {"a" 1, "b" 2, "c" 3})
+stringmap  ; => {"a" 1, "b" 2, "c" 3}
+
+(def keymap {:a 1, :b 2, :c 3})
+keymap ; => {:a 1, :c 3, :b 2}
+
+; By the way, commas are always treated as whitespace and do nothing.
+
+; Retrieve a value from a map by calling it as a function
+(stringmap "a") ; => 1
+(keymap :a) ; => 1
+
+; Keywords can be used to retrieve their value from a map, too!
+(:b keymap) ; => 2
+
+; Don't try this with strings.
+;("a" stringmap)
+; => Exception: java.lang.String cannot be cast to clojure.lang.IFn
+
+; Retrieving a non-present key returns nil
+(stringmap "d") ; => nil
+
+; Use assoc to add new keys to hash-maps
+(def newkeymap (assoc keymap :d 4))
+newkeymap ; => {:a 1, :b 2, :c 3, :d 4}
+
+; But remember, clojure types are immutable!
+keymap ; => {:a 1, :b 2, :c 3}
+
+; Use dissoc to remove keys
+(dissoc keymap :a :b) ; => {:c 3}
+
+; Sets
+;;;;;;
+
+(class #{1 2 3}) ; => clojure.lang.PersistentHashSet
+(set [1 2 3 1 2 3 3 2 1 3 2 1]) ; => #{1 2 3}
+
+; Add a member with conj
+(conj #{1 2 3} 4) ; => #{1 2 3 4}
+
+; Remove one with disj
+(disj #{1 2 3} 1) ; => #{2 3}
+
+; Test for existence by using the set as a function:
+(#{1 2 3} 1) ; => 1
+(#{1 2 3} 4) ; => nil
+
+; There are more functions in the clojure.sets namespace.
+
+; Useful forms
+;;;;;;;;;;;;;;;;;
+
+; Logic constructs in clojure are just macros, and look like
+; everything else
+(if false "a" "b") ; => "b"
+(if false "a") ; => nil
+
+; Use let to create temporary bindings
+(let [a 1 b 2]
+  (> a b)) ; => false
+
+; Group statements together with do
+(do
+  (print "Hello")
+  "World") ; => "World" (prints "Hello")
+
+; Functions have an implicit do
+(defn print-and-say-hello [name]
+  (print "Saying hello to " name)
+  (str "Hello " name))
+(print-and-say-hello "Jeff") ;=> "Hello Jeff" (prints "Saying hello to Jeff")
+
+; So does let
+(let [name "Urkel"]
+  (print "Saying hello to " name)
+  (str "Hello " name)) ; => "Hello Urkel" (prints "Saying hello to Urkel")
+
+
+; Use the threading macros (-> and ->>) to express transformations of
+; data more clearly.
+
+; The "Thread-first" macro (->) inserts into each form the result of
+; the previous, as the first argument (second item)
+(->  
+   {:a 1 :b 2} 
+   (assoc :c 3) ;=> (assoc {:a 1 :b 2} :c 3)
+   (dissoc :b)) ;=> (dissoc (assoc {:a 1 :b 2} :c 3) :b)
+
+; This expression could be written as:
+; (dissoc (assoc {:a 1 :b 2} :c 3) :b)
+; and evaluates to {:a 1 :c 3}
+
+; The double arrow does the same thing, but inserts the result of
+; each line at the *end* of the form. This is useful for collection
+; operations in particular:
+(->>
+   (range 10)
+   (map inc)     ;=> (map inc (range 10)
+   (filter odd?) ;=> (filter odd? (map inc (range 10))
+   (into []))    ;=> (into [] (filter odd? (map inc (range 10)))
+                 ; Result: [1 3 5 7 9]
+
+; When you are in a situation where you want more freedom as where to
+; put the result of previous data transformations in an 
+; expression, you can use the as-> macro. With it, you can assign a
+; specific name to transformations' output and use it as a
+; placeholder in your chained expressions:
+
+(as-> [1 2 3] input
+  (map inc input);=> You can use last transform's output at the last position
+  (nth input 2) ;=>  and at the second position, in the same expression
+  (conj [4 5 6] input [8 9 10])) ;=> or in the middle !
+
+
+
+; Modules
+;;;;;;;;;;;;;;;
+
+; Use "use" to get all functions from the module
+(use 'clojure.set)
+
+; Now we can use set operations
+(intersection #{1 2 3} #{2 3 4}) ; => #{2 3}
+(difference #{1 2 3} #{2 3 4}) ; => #{1}
+
+; You can choose a subset of functions to import, too
+(use '[clojure.set :only [intersection]])
+
+; Use require to import a module
+(require 'clojure.string)
+
+; Use / to call functions from a module
+; Here, the module is clojure.string and the function is blank?
+(clojure.string/blank? "") ; => true
+
+; You can give a module a shorter name on import
+(require '[clojure.string :as str])
+(str/replace "This is a test." #"[a-o]" str/upper-case) ; => "THIs Is A tEst."
+; (#"" denotes a regular expression literal)
+
+; You can use require (and use, but don't) from a namespace using :require.
+; You don't need to quote your modules if you do it this way.
+(ns test
+  (:require
+    [clojure.string :as str]
+    [clojure.set :as set]))
+
+; Java
+;;;;;;;;;;;;;;;;;
+
+; Java has a huge and useful standard library, so
+; you'll want to learn how to get at it.
+
+; Use import to load a java module
+(import java.util.Date)
+
+; You can import from an ns too.
+(ns test
+  (:import java.util.Date
+           java.util.Calendar))
+
+; Use the class name with a "." at the end to make a new instance
+(Date.) ; 
+
+; Use . to call methods. Or, use the ".method" shortcut
+(. (Date.) getTime) ; 
+(.getTime (Date.)) ; exactly the same thing.
+
+; Use / to call static methods
+(System/currentTimeMillis) ;  (system is always present)
+
+; Use doto to make dealing with (mutable) classes more tolerable
+(import java.util.Calendar)
+(doto (Calendar/getInstance)
+  (.set 2000 1 1 0 0 0)
+  .getTime) ; => A Date. set to 2000-01-01 00:00:00
+
+; STM
+;;;;;;;;;;;;;;;;;
+
+; Software Transactional Memory is the mechanism clojure uses to handle
+; persistent state. There are a few constructs in clojure that use this.
+
+; An atom is the simplest. Pass it an initial value
+(def my-atom (atom {}))
+
+; Update an atom with swap!.
+; swap! takes a function and calls it with the current value of the atom
+; as the first argument, and any trailing arguments as the second
+(swap! my-atom assoc :a 1) ; Sets my-atom to the result of (assoc {} :a 1)
+(swap! my-atom assoc :b 2) ; Sets my-atom to the result of (assoc {:a 1} :b 2)
+
+; Use '@' to dereference the atom and get the value
+my-atom  ;=> Atom<#...> (Returns the Atom object)
+@my-atom ; => {:a 1 :b 2}
+
+; Here's a simple counter using an atom
+(def counter (atom 0))
+(defn inc-counter []
+  (swap! counter inc))
+
+(inc-counter)
+(inc-counter)
+(inc-counter)
+(inc-counter)
+(inc-counter)
+
+@counter ; => 5
+
+; Other STM constructs are refs and agents.
+; Refs: http://clojure.org/refs
+; Agents: http://clojure.org/agents
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-coffeescript.html b/docs/_style/prism-master/examples/prism-coffeescript.html new file mode 100644 index 00000000..a710aa99 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-coffeescript.html @@ -0,0 +1,61 @@ +

Comments

+
# This is a comment
+### This is a
+multi-line comment###
+ +

Strings

+
'foo \'bar\' baz'
+"foo \"bar\" baz"
+'Multi-line
+strings are supported'
+"Multi-line
+strings are supported"
+''' 'Block strings'
+are supported too'''
+""" "Block strings"
+are supported too"""
+ +

String interpolation

+
"String #{interpolation} is supported"
+'This works #{only} between double-quoted strings'
+ +

Object properties

+
kids =
+  brother:
+    name: "Max"
+    age:  11
+  sister:
+    name: "Ida"
+    age:  9
+ +

Regexps

+
/normal [r]egexp?/;
+/// ^(
+  mul\t[i-l]ine
+  regexp          # with embedded comment
+) ///
+ +

Classes

+
class Animal
+  constructor: (@name) ->
+  move: (meters) ->
+    alert @name + " moved #{meters}m."
+
+class Snake extends Animal
+  move: ->
+    alert "Slithering..."
+    super 5
+
+class Horse extends Animal
+  move: ->
+    alert "Galloping..."
+    super 45
+
+sam = new Snake "Sammy the Python"
+tom = new Horse "Tommy the Palomino"
+
+sam.move()
+tom.move()
+ +

Inline JavaScript

+
`alert("foo")`
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-cpp.html b/docs/_style/prism-master/examples/prism-cpp.html new file mode 100644 index 00000000..32bdcbda --- /dev/null +++ b/docs/_style/prism-master/examples/prism-cpp.html @@ -0,0 +1,61 @@ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+"Multi-line strings ending with a \
+are supported too."
+ +

Macro statements

+
# include <stdio.h>
+#define PG_locked   0
+#define PG_error    1
+
+ +

Booleans

+
true;
+false;
+ +

Operators

+
a and b;
+c bitand d;
+ +

Full example

+
/*
+David Cary 2010-09-14
+quick demo for wikibooks
+public domain
+*/
+#include <iostream>
+#include <vector>
+using namespace std;
+
+vector<int> pick_vector_with_biggest_fifth_element(
+    vector<int> left,
+    vector<int> right
+){
+    if( (left[5]) < (right[5]) ){
+        return( right );
+    };
+    // else
+    return( left );
+}
+
+int vector_demo(void){
+    cout << "vector demo" << endl;
+    vector<int> left(7);
+    vector<int> right(7);
+
+    left[5] = 7;
+    right[5] = 8;
+    cout << left[5] << endl;
+    cout << right[5] << endl;
+    vector<int> biggest(
+        pick_vector_with_biggest_fifth_element( left, right )
+    );
+    cout << biggest[5] << endl;
+
+    return 0;
+}
+
+int main(void){
+    vector_demo();
+}
diff --git a/docs/_style/prism-master/examples/prism-crystal.html b/docs/_style/prism-master/examples/prism-crystal.html new file mode 100644 index 00000000..c3cad166 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-crystal.html @@ -0,0 +1,16 @@ +

Number literals with underscores and postfix

+
1_u32
+123_456.789e-10_f64
+ +

Attributes

+
@[AlwaysInline]
+def foo
+	1
+end
+ +

Macro expansions

+
{% for key, value in {foo: 100, bar: 20} %}
+	def {{ key.id }}
+		{{ value }}
+	end
+{% end %}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-csharp.html b/docs/_style/prism-master/examples/prism-csharp.html new file mode 100644 index 00000000..c6d76c2b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-csharp.html @@ -0,0 +1,60 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+@"Verbatim strings"
+@"Luis: ""Patrick, where did you get that overnight bag?""
+    Patrick: ""Jean Paul Gaultier.""";
+@'Luis: ''Patrick, where did you get that overnight bag?''
+    Patrick: ''Jean Paul Gaultier.''';
+
+ +

Full example

+
using System.Windows.Forms;
+using System.Drawing;
+
+public static DialogResult InputBox(string title, string promptText, ref string value)
+{
+  Form form = new Form();
+  Label label = new Label();
+  TextBox textBox = new TextBox();
+  Button buttonOk = new Button();
+  Button buttonCancel = new Button();
+
+  form.Text = title;
+  label.Text = promptText;
+  textBox.Text = value;
+
+  buttonOk.Text = "OK";
+  buttonCancel.Text = "Cancel";
+  buttonOk.DialogResult = DialogResult.OK;
+  buttonCancel.DialogResult = DialogResult.Cancel;
+
+  label.SetBounds(9, 20, 372, 13);
+  textBox.SetBounds(12, 36, 372, 20);
+  buttonOk.SetBounds(228, 72, 75, 23);
+  buttonCancel.SetBounds(309, 72, 75, 23);
+
+  label.AutoSize = true;
+  textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
+  buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
+  buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
+
+  form.ClientSize = new Size(396, 107);
+  form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
+  form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
+  form.FormBorderStyle = FormBorderStyle.FixedDialog;
+  form.StartPosition = FormStartPosition.CenterScreen;
+  form.MinimizeBox = false;
+  form.MaximizeBox = false;
+  form.AcceptButton = buttonOk;
+  form.CancelButton = buttonCancel;
+
+  DialogResult dialogResult = form.ShowDialog();
+  value = textBox.Text;
+  return dialogResult;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-csp.html b/docs/_style/prism-master/examples/prism-csp.html new file mode 100644 index 00000000..e10a416b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-csp.html @@ -0,0 +1,13 @@ +

A complete policy

+
default-src 'none';
+script-src my.cdn.com;
+img-src 'self' data:;
+child-src 'self' data: ms-appx-web:;
+block-all-mixed-content;
+report-uri https://my-reports.com/submit;
+
+ +

An policy with unsafe source expressions

+
script-src 'self' 'unsafe-eval' 'unsafe-inline';
+style-src 'unsafe-inline' 'unsafe-hashed-attributes' 'self';
+
diff --git a/docs/_style/prism-master/examples/prism-css.html b/docs/_style/prism-master/examples/prism-css.html new file mode 100644 index 00000000..a36f1966 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-css.html @@ -0,0 +1,34 @@ +

Empty rule

+
*{} * {} p {}
+
ul,
+ol {}
+ +

Simple rule

+
p { color: red; }
+ +

Important rule

+

+p {
+    color: red !important;
+    line-height: normal!important;
+}
+p{position:absolute!important}
+
+ +

@ rule

+
@media screen and (min-width: 100px) {}
+ +

LESS variable

+
@main-color: red;
+.foo {
+	background: @main-color;
+}
+ +

Comment

+
/* Simple comment here */
+ +

String

+
content: 'foo';
+ +

URL

+
content: url(foo.png);
diff --git a/docs/_style/prism-master/examples/prism-d.html b/docs/_style/prism-master/examples/prism-d.html new file mode 100644 index 00000000..d4bf34cc --- /dev/null +++ b/docs/_style/prism-master/examples/prism-d.html @@ -0,0 +1,267 @@ +

Comments

+
// Single line comment
+/* Multi-line
+	comment */
+/+ Mutli-line
+	/+ nestable +/
+	comment +/
+ +

Numbers

+
0 .. 2_147_483_647
+2_147_483_648 .. 9_223_372_036_854_775_807
+0L .. 9_223_372_036_854_775_807L
+0U .. 4_294_967_296U
+4_294_967_296U .. 18_446_744_073_709_551_615U
+0UL .. 18_446_744_073_709_551_615UL
+0x0 .. 0x7FFF_FFFF
+0x8000_0000 .. 0xFFFF_FFFF
+0x1_0000_0000 .. 0x7FFF_FFFF_FFFF_FFFF
+0x8000_0000_0000_0000 .. 0xFFFF_FFFF_FFFF_FFFF
+0x0L .. 0x7FFF_FFFF_FFFF_FFFFL
+0x8000_0000_0000_0000L .. 0xFFFF_FFFF_FFFF_FFFFL
+0x0U .. 0xFFFF_FFFFU
+0x1_0000_0000U .. 0xFFFF_FFFF_FFFF_FFFFU
+0x0UL .. 0xFFFF_FFFF_FFFF_FFFFUL
+
+123_456.567_8          // 123456.5678
+1_2_3_4_5_6_.5_6_7_8   // 123456.5678
+1_2_3_4_5_6_.5e-6_     // 123456.5e-6
+0x1.FFFFFFFFFFFFFp1023 // double.max
+0x1p-52                // double.epsilon
+1.175494351e-38F       // float.min
+6.3i                   // idouble 6.3
+6.3fi                  // ifloat 6.3
+6.3Li                  // ireal 6.3
+4.5 + 6.2i             // complex number (phased out)
+ +

Strings

+
// WYSIWYG strings
+r"hello"
+r"c:\root\foo.exe"
+r"ab\n"
+`hello`
+`c:\root\foo.exe`
+`ab\n`
+
+// Double-quoted strings
+"hello"
+"c:\\root\\foo.exe"
+"ab\n"
+"ab
+"
+
+// Hex strings
+x"0A"
+x"00 FBCD 32FD 0A"
+
+// String postfix characters
+"hello"c  // string
+"hello"w  // wstring
+"hello"d  // dstring
+
+// Delimited strings
+q"(foo(xxx))"
+q"[foo{]"
+q"EOS
+This
+is a multi-line
+heredoc string
+EOS"
+q"/foo]/"
+
+// Token strings
+q{foo}
+q{/*}*/ }
+q{ foo(q{hello}); }
+q{ __TIME__ }
+
+// Character literals
+'a'
+'\u000A'
+ +

Iasm registers

+
AL AH AX EAX
+BL BH BX EBX
+CL CH CX ECX
+DL DH DX EDX
+BP EBP
+SP ESP
+DI EDI
+SI ESI
+ES CS SS DS GS FS
+CR0 CR2 CR3 CR4
+DR0 DR1 DR2 DR3 DR6 DR7
+TR3 TR4 TR5 TR6 TR7
+ST
+ST(0) ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
+MM0  MM1  MM2  MM3  MM4  MM5  MM6  MM7
+XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7
+
+RAX  RBX  RCX  RDX
+BPL  RBP
+SPL  RSP
+DIL  RDI
+SIL  RSI
+R8B  R8W  R8D  R8
+R9B  R9W  R9D  R9
+R10B R10W R10D R10
+R11B R11W R11D R11
+R12B R12W R12D R12
+R13B R13W R13D R13
+R14B R14W R14D R14
+R15B R15W R15D R15
+XMM8 XMM9 XMM10 XMM11 XMM12 XMM13 XMM14 XMM15
+YMM0 YMM1 YMM2  YMM3  YMM4  YMM5  YMM6  YMM7
+YMM8 YMM9 YMM10 YMM11 YMM12 YMM13 YMM14 YMM15
+ +

Full example

+
#!/usr/bin/dmd -run
+/* sh style script syntax is supported! */
+/* Hello World in D
+   To compile:
+     dmd hello.d
+   or to optimize:
+     dmd -O -inline -release hello.d
+   or to get generated documentation:
+     dmd hello.d -D
+  */
+import std.stdio;  // References to  commonly used I/O routines.
+void main(char[][] args)   // 'void' here means return 0 by default.
+{
+    // Write-Formatted-Line
+     writefln("Hello World, "   // automatic concatenation of string literals
+              "Reloaded");
+     // Strings are denoted as a dynamic array of chars 'char[]'
+     // auto type inference and built-in foreach
+     foreach(argc, argv; args)
+    {
+        // OOP is supported, of course! And automatic type inference.
+         auto cl = new CmdLin(argc, argv);
+
+        // 'writefln' is the improved 'printf' !!
+         // user-defined class properties.
+         writefln(cl.argnum, cl.suffix, " arg: %s", cl.argv);
+        // Garbage Collection or explicit memory management - your choice!!!
+         delete cl;
+    }
+     // Nested structs, classes and functions!
+     struct specs
+    {
+        // all vars. automatically initialized
+         int count, allocated;
+    }
+
+    // Note that declarations read right-to-left.
+    // So that 'char[][]' reads as an array of an array of chars.
+
+    specs argspecs(char[][] args)
+    // Optional (built-in) function contracts.
+     in{
+        assert (args.length > 0); // assert built in
+     }
+    out(result){
+        assert(result.count == CmdLin.total);
+        assert(result.allocated > 0);
+    }
+    body{
+        specs* s = new specs;
+        // no need for '->'
+         s.count = args.length;  // The 'length' property is number of elements.
+         s.allocated = typeof(args).sizeof; // built-in properties for native types
+         foreach(argv; args)
+            s.allocated += argv.length * typeof(argv[0]).sizeof;
+        return *s;
+    }
+
+    // built-in string and common string operations, e.g. '~' is concatenate.
+     char[] argcmsg  = "argc = %d";
+    char[] allocmsg = "allocated = %d";
+    writefln(argcmsg ~ ", " ~ allocmsg,
+         argspecs(args).count,argspecs(args).allocated);
+}
+/**
+   Stores a single command line argument.
+ */
+ class CmdLin
+{
+    private {
+     int _argc;
+     char[] _argv;
+     static uint _totalc;
+    }
+
+ public:
+/************
+      Object constructor.
+      params:
+        argc = ordinal count of this argument.
+        argv = text of the parameter
+  *********/
+     this(int argc, char[] argv)
+    {
+        _argc = argc + 1;
+        _argv = argv;
+        _totalc++;
+    }
+
+    ~this() /// Object destructor
+     {
+        // Doesn't actually do anything for this example.
+     }
+
+     int argnum() /// A property that returns arg number
+     {
+        return _argc;
+    }
+     char[] argv() /// A property  that returns arg text
+     {
+        return _argv;
+    }
+     wchar[] suffix() /// A property  that returns ordinal suffix
+     {
+        wchar[] suffix;  // Built in  Unicode strings (utf8,utf16, utf32)
+         switch(_argc)
+        {
+        case 1:
+            suffix = "st";
+            break;
+        case 2:
+            suffix = "nd";
+            break;
+        case 3:
+            suffix = "rd";
+            break;
+        default:  // 'default' is mandatory with "-w" compile switch.
+             suffix = "th";
+        }
+        return suffix;
+    }
+
+/* **************
+      * A property of the whole class, not just an instance.
+      * returns: The total number of commandline args added.
+      *************/
+     static typeof(_totalc) total()
+    {
+        return _totalc;
+    }
+     // Class invariant, things that must be true after any method is run.
+     invariant
+     {
+         assert(_argc > 0);
+         assert(_totalc >= _argc);
+     }
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Comments only support one level of nesting

+
/+ /+ /+ this does not work +/ +/ +/
+ +

Token strings only support one level of nesting

+
q{ q{ q{ this does not work } } }
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-dart.html b/docs/_style/prism-master/examples/prism-dart.html new file mode 100644 index 00000000..e38d85ea --- /dev/null +++ b/docs/_style/prism-master/examples/prism-dart.html @@ -0,0 +1,59 @@ +

Comments

+
// Single line comment
+/// Documentation single line comment
+/* Block comment
+on several lines */
+/** Multi-line
+doc comment */
+ +

Annotations

+
@todo('seth', 'make this do something')
+@deprecated // Metadata; makes Dart Editor warn about using activate().
+ +

Numbers

+
var x = 1;
+var hex = 0xDEADBEEF;
+var bigInt = 346534658346524376592384765923749587398457294759347029438709349347;
+var y = 1.1;
+var exponents = 1.42e5;
+
+ +

Strings

+
var s1 = 'Single quotes work well for string literals.';
+var s2 = "Double quotes work just as well.";
+var s3 = 'It\'s easy to escape the string delimiter.';
+var s4 = "It's even easier to just use the other string delimiter.";
+var s1 = '''
+You can create
+multi-line strings like this one.
+''';
+var s2 = """This is also a
+multi-line string.""";
+var s = r"In a raw string, even \n isn't special.";
+ +

Full example

+
class Logger {
+  final String name;
+  bool mute = false;
+
+  // _cache is library-private, thanks to the _ in front of its name.
+  static final Map<String, Logger> _cache = <String, Logger>{};
+
+  factory Logger(String name) {
+    if (_cache.containsKey(name)) {
+      return _cache[name];
+    } else {
+      final logger = new Logger._internal(name);
+      _cache[name] = logger;
+      return logger;
+    }
+  }
+
+  Logger._internal(this.name);
+
+  void log(String msg) {
+    if (!mute) {
+      print(msg);
+    }
+  }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-diff.html b/docs/_style/prism-master/examples/prism-diff.html new file mode 100644 index 00000000..b9229a17 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-diff.html @@ -0,0 +1,33 @@ +

Normal Diff

+
7c7
+< qt: core
+---
+> qt: core quick
+ +

Context Diff

+
*** qcli.yml	2014-12-16 11:43:41.000000000 +0800
+--- /Users/uranusjr/Desktop/qcli.yml	2014-12-31 11:28:08.000000000 +0800
+***************
+*** 4,8 ****
+  project:
+      sources: "src/*.cpp"
+      headers: "src/*.h"
+!     qt: core
+  public_headers: "src/*.h"
+--- 4,8 ----
+  project:
+      sources: "src/*.cpp"
+      headers: "src/*.h"
+!     qt: core gui
+  public_headers: "src/*.h"
+ +

Unified Diff

+
--- qcli.yml	2014-12-16 11:43:41.000000000 +0800
++++ /Users/uranusjr/Desktop/qcli.yml	2014-12-31 11:28:08.000000000 +0800
+@@ -4,5 +4,5 @@
+ project:
+     sources: "src/*.cpp"
+     headers: "src/*.h"
+-    qt: core
++    qt: core gui
+ public_headers: "src/*.h"
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-django.html b/docs/_style/prism-master/examples/prism-django.html new file mode 100644 index 00000000..ac9cf0df --- /dev/null +++ b/docs/_style/prism-master/examples/prism-django.html @@ -0,0 +1,31 @@ +

Comment

+
{# This is a comment #}
+ +

Variable

+
{{ some_variable }}
+ +

Template Tag

+
{% if some_condition %}
+Conditional block
+{% endif %}
+
+ +

Full Example

+
{# This a Django template example #}
+{% extends "base_generic.html" %}
+
+{% block title %}{{ section.title }}{% endblock %}
+
+{% block content %}
+<h1>{{ section.title }}</h1>
+
+{% for story in story_list %}
+<h2>
+  <a href="{{ story.get_absolute_url }}">
+    {{ story.headline|upper }}
+  </a>
+</h2>
+<p>{{ story.tease|truncatewords:"100" }}</p>
+{% endfor %}
+{% endblock %}
+
diff --git a/docs/_style/prism-master/examples/prism-docker.html b/docs/_style/prism-master/examples/prism-docker.html new file mode 100644 index 00000000..86511b38 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-docker.html @@ -0,0 +1,49 @@ +

Comments

+
# These are the comments for a dockerfile.
+# I want to make sure $(variables) don't break out,
+# and we shouldn't see keywords like ADD or ENTRYPOINT
+
+ +

Full example

+
# Nginx
+#
+# VERSION               0.0.1
+
+FROM      ubuntu
+MAINTAINER Victor Vieux 
+
+LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0"
+RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
+
+# Firefox over VNC
+#
+# VERSION               0.3
+
+FROM ubuntu
+
+# Install vnc, xvfb in order to create a 'fake' display and firefox
+RUN apt-get update && apt-get install -y x11vnc xvfb firefox
+RUN mkdir ~/.vnc
+# Setup a password
+RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
+# Autostart firefox (might not be the best way, but it does the trick)
+RUN bash -c 'echo "firefox" >> /.bashrc'
+
+EXPOSE 5900
+CMD    ["x11vnc", "-forever", "-usepw", "-create"]
+
+# Multiple images example
+#
+# VERSION               0.1
+
+FROM ubuntu
+RUN echo foo > bar
+# Will output something like ===> 907ad6c2736f
+
+FROM ubuntu
+RUN echo moo > oink
+# Will output something like ===> 695d7793cbe4
+
+# You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
+# /oink.
+
diff --git a/docs/_style/prism-master/examples/prism-eiffel.html b/docs/_style/prism-master/examples/prism-eiffel.html new file mode 100644 index 00000000..94c18b22 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-eiffel.html @@ -0,0 +1,72 @@ +

Comments

+
-- A comment
+
+ +

Simple string and character

+
"A simple string with %"double quotes%""
+'a'
+
+ +

Verbatim-strings

+
"[
+  A aligned verbatim string
+]"
+"{
+  A non-aligned verbatim string
+}"
+
+ +

Numbers

+
1_000
+1_000.
+1_000.e+1_000
+1_000.1_000e-1_000
+.1
+0b1010_0001
+0xAF_5B
+0c75_22
+
+ +

Class names

+
deferred class
+    A [G]
+
+feature
+    items: G
+        deferred  end
+
+end
+
+ +

Full example

+
note
+  description: "Represents a person."
+
+class
+  PERSON
+
+create
+  make, make_unknown
+
+feature {NONE} -- Creation
+
+  make (a_name: like name)
+      -- Create a person with `a_name' as `name'.
+    do
+      name := a_name
+    ensure
+      name = a_name
+    end
+
+    make_unknown
+    do ensure
+      name = Void
+      end
+
+feature -- Access
+
+  name: detachable STRING
+      -- Full name or Void if unknown.
+
+end
+
diff --git a/docs/_style/prism-master/examples/prism-elixir.html b/docs/_style/prism-master/examples/prism-elixir.html new file mode 100644 index 00000000..7112fbca --- /dev/null +++ b/docs/_style/prism-master/examples/prism-elixir.html @@ -0,0 +1,462 @@ +

Comments

+
# This is a comment
+ +

Atoms

+
:foo
+:bar
+ +

Numbers

+
42
+0b1010
+0o777
+0x1F
+3.14159
+5.2e10
+100_000
+ +

Strings and heredoc

+
'A string with \'quotes\'!'
+"A string with \"quotes\"!"
+"Multi-line
+strings are supported"
+""" "Heredoc" strings are
+also supported.
+"""
+ +

Sigils

+
~s"""This is a sigil
+using heredoc delimiters"""
+~r/a [reg]exp/
+~r(another|regexp)
+~w[some words]s
+~c<a char list>
+ +

Interpolation

+
"This is an #{:atom}"
+~s/#{40+2} is the answer/
+ +

Function capturing

+
fun = &Math.zero?/1
+(&is_function/1).(fun)
+fun = &(&1 + 1)
+fun.(1)
+fun = &List.flatten(&1, &2)
+fun.([1, [[2], 3]], [4, 5])
+ +

Module attributes

+
defmodule MyServer do
+  @vsn 2
+end
+
+defmodule Math do
+  @moduledoc """
+  Provides math-related functions.
+
+      iex> Math.sum(1, 2)
+      3
+
+  """
+
+  @doc """
+  Calculates the sum of two numbers.
+  """
+  def sum(a, b), do: a + b
+end
+ +

Full example

+
# Example from http://learnxinyminutes.com/docs/elixir/
+
+# Single line comments start with a number symbol.
+
+# There's no multi-line comment,
+# but you can stack multiple comments.
+
+# To use the elixir shell use the `iex` command.
+# Compile your modules with the `elixirc` command.
+
+# Both should be in your path if you installed elixir correctly.
+
+## ---------------------------
+## -- Basic types
+## ---------------------------
+
+# There are numbers
+3    # integer
+0x1F # integer
+3.0  # float
+
+# Atoms, that are literals, a constant with name. They start with `:`.
+:hello # atom
+
+# Tuples that are stored contiguously in memory.
+{1,2,3} # tuple
+
+# We can access a tuple element with the `elem` function:
+elem({1, 2, 3}, 0) #=> 1
+
+# Lists that are implemented as linked lists.
+[1,2,3] # list
+
+# We can access the head and tail of a list as follows:
+[head | tail] = [1,2,3]
+head #=> 1
+tail #=> [2,3]
+
+# In elixir, just like in Erlang, the `=` denotes pattern matching and
+# not an assignment.
+#
+# This means that the left-hand side (pattern) is matched against a
+# right-hand side.
+#
+# This is how the above example of accessing the head and tail of a list works.
+
+# A pattern match will error when the sides don't match, in this example
+# the tuples have different sizes.
+# {a, b, c} = {1, 2} #=> ** (MatchError) no match of right hand side value: {1,2}
+
+# There are also binaries
+<<1,2,3>> # binary
+
+# Strings and char lists
+"hello" # string
+'hello' # char list
+
+# Multi-line strings
+"""
+I'm a multi-line
+string.
+"""
+#=> "I'm a multi-line\nstring.\n"
+
+# Strings are all encoded in UTF-8:
+"héllò" #=> "héllò"
+
+# Strings are really just binaries, and char lists are just lists.
+<<?a, ?b, ?c>> #=> "abc"
+[?a, ?b, ?c]   #=> 'abc'
+
+# `?a` in elixir returns the ASCII integer for the letter `a`
+?a #=> 97
+
+# To concatenate lists use `++`, for binaries use `<>`
+[1,2,3] ++ [4,5]     #=> [1,2,3,4,5]
+'hello ' ++ 'world'  #=> 'hello world'
+
+<<1,2,3>> <> <<4,5>> #=> <<1,2,3,4,5>>
+"hello " <> "world"  #=> "hello world"
+
+# Ranges are represented as `start..end` (both inclusive)
+1..10 #=> 1..10
+lower..upper = 1..10 # Can use pattern matching on ranges as well
+[lower, upper] #=> [1, 10]
+
+## ---------------------------
+## -- Operators
+## ---------------------------
+
+# Some math
+1 + 1  #=> 2
+10 - 5 #=> 5
+5 * 2  #=> 10
+10 / 2 #=> 5.0
+
+# In elixir the operator `/` always returns a float.
+
+# To do integer division use `div`
+div(10, 2) #=> 5
+
+# To get the division remainder use `rem`
+rem(10, 3) #=> 1
+
+# There are also boolean operators: `or`, `and` and `not`.
+# These operators expect a boolean as their first argument.
+true and true #=> true
+false or true #=> true
+# 1 and true    #=> ** (ArgumentError) argument error
+
+# Elixir also provides `||`, `&&` and `!` which accept arguments of any type.
+# All values except `false` and `nil` will evaluate to true.
+1 || true  #=> 1
+false && 1 #=> false
+nil && 20  #=> nil
+!true #=> false
+
+# For comparisons we have: `==`, `!=`, `===`, `!==`, `<=`, `>=`, `<` and `>`
+1 == 1 #=> true
+1 != 1 #=> false
+1 < 2  #=> true
+
+# `===` and `!==` are more strict when comparing integers and floats:
+1 == 1.0  #=> true
+1 === 1.0 #=> false
+
+# We can also compare two different data types:
+1 < :hello #=> true
+
+# The overall sorting order is defined below:
+# number < atom < reference < functions < port < pid < tuple < list < bit string
+
+# To quote Joe Armstrong on this: "The actual order is not important,
+# but that a total ordering is well defined is important."
+
+## ---------------------------
+## -- Control Flow
+## ---------------------------
+
+# `if` expression
+if false do
+  "This will never be seen"
+else
+  "This will"
+end
+
+# There's also `unless`
+unless true do
+  "This will never be seen"
+else
+  "This will"
+end
+
+# Remember pattern matching? Many control-flow structures in elixir rely on it.
+
+# `case` allows us to compare a value against many patterns:
+case {:one, :two} do
+  {:four, :five} ->
+    "This won't match"
+  {:one, x} ->
+    "This will match and bind `x` to `:two`"
+  _ ->
+    "This will match any value"
+end
+
+# It's common to bind the value to `_` if we don't need it.
+# For example, if only the head of a list matters to us:
+[head | _] = [1,2,3]
+head #=> 1
+
+# For better readability we can do the following:
+[head | _tail] = [:a, :b, :c]
+head #=> :a
+
+# `cond` lets us check for many conditions at the same time.
+# Use `cond` instead of nesting many `if` expressions.
+cond do
+  1 + 1 == 3 ->
+    "I will never be seen"
+  2 * 5 == 12 ->
+    "Me neither"
+  1 + 2 == 3 ->
+    "But I will"
+end
+
+# It is common to set the last condition equal to `true`, which will always match.
+cond do
+  1 + 1 == 3 ->
+    "I will never be seen"
+  2 * 5 == 12 ->
+    "Me neither"
+  true ->
+    "But I will (this is essentially an else)"
+end
+
+# `try/catch` is used to catch values that are thrown, it also supports an
+# `after` clause that is invoked whether or not a value is caught.
+try do
+  throw(:hello)
+catch
+  message -> "Got #{message}."
+after
+  IO.puts("I'm the after clause.")
+end
+#=> I'm the after clause
+# "Got :hello"
+
+## ---------------------------
+## -- Modules and Functions
+## ---------------------------
+
+# Anonymous functions (notice the dot)
+square = fn(x) -> x * x end
+square.(5) #=> 25
+
+# They also accept many clauses and guards.
+# Guards let you fine tune pattern matching,
+# they are indicated by the `when` keyword:
+f = fn
+  x, y when x > 0 -> x + y
+  x, y -> x * y
+end
+
+f.(1, 3)  #=> 4
+f.(-1, 3) #=> -3
+
+# Elixir also provides many built-in functions.
+# These are available in the current scope.
+is_number(10)    #=> true
+is_list("hello") #=> false
+elem({1,2,3}, 0) #=> 1
+
+# You can group several functions into a module. Inside a module use `def`
+# to define your functions.
+defmodule Math do
+  def sum(a, b) do
+    a + b
+  end
+
+  def square(x) do
+    x * x
+  end
+end
+
+Math.sum(1, 2)  #=> 3
+Math.square(3) #=> 9
+
+# To compile our simple Math module save it as `math.ex` and use `elixirc`
+# in your terminal: elixirc math.ex
+
+# Inside a module we can define functions with `def` and private functions with `defp`.
+# A function defined with `def` is available to be invoked from other modules,
+# a private function can only be invoked locally.
+defmodule PrivateMath do
+  def sum(a, b) do
+    do_sum(a, b)
+  end
+
+  defp do_sum(a, b) do
+    a + b
+  end
+end
+
+PrivateMath.sum(1, 2)    #=> 3
+# PrivateMath.do_sum(1, 2) #=> ** (UndefinedFunctionError)
+
+# Function declarations also support guards and multiple clauses:
+defmodule Geometry do
+  def area({:rectangle, w, h}) do
+    w * h
+  end
+
+  def area({:circle, r}) when is_number(r) do
+    3.14 * r * r
+  end
+end
+
+Geometry.area({:rectangle, 2, 3}) #=> 6
+Geometry.area({:circle, 3})       #=> 28.25999999999999801048
+# Geometry.area({:circle, "not_a_number"})
+#=> ** (FunctionClauseError) no function clause matching in Geometry.area/1
+
+# Due to immutability, recursion is a big part of elixir
+defmodule Recursion do
+  def sum_list([head | tail], acc) do
+    sum_list(tail, acc + head)
+  end
+
+  def sum_list([], acc) do
+    acc
+  end
+end
+
+Recursion.sum_list([1,2,3], 0) #=> 6
+
+# Elixir modules support attributes, there are built-in attributes and you
+# may also add custom ones.
+defmodule MyMod do
+  @moduledoc """
+  This is a built-in attribute on a example module.
+  """
+
+  @my_data 100 # This is a custom attribute.
+  IO.inspect(@my_data) #=> 100
+end
+
+## ---------------------------
+## -- Structs and Exceptions
+## ---------------------------
+
+# Structs are extensions on top of maps that bring default values,
+# compile-time guarantees and polymorphism into Elixir.
+defmodule Person do
+  defstruct name: nil, age: 0, height: 0
+end
+
+joe_info = %Person{ name: "Joe", age: 30, height: 180 }
+#=> %Person{age: 30, height: 180, name: "Joe"}
+
+# Access the value of name
+joe_info.name #=> "Joe"
+
+# Update the value of age
+older_joe_info = %{ joe_info | age: 31 }
+#=> %Person{age: 31, height: 180, name: "Joe"}
+
+# The `try` block with the `rescue` keyword is used to handle exceptions
+try do
+  raise "some error"
+rescue
+  RuntimeError -> "rescued a runtime error"
+  _error -> "this will rescue any error"
+end
+
+# All exceptions have a message
+try do
+  raise "some error"
+rescue
+  x in [RuntimeError] ->
+    x.message
+end
+
+## ---------------------------
+## -- Concurrency
+## ---------------------------
+
+# Elixir relies on the actor model for concurrency. All we need to write
+# concurrent programs in elixir are three primitives: spawning processes,
+# sending messages and receiving messages.
+
+# To start a new process we use the `spawn` function, which takes a function
+# as argument.
+f = fn -> 2 * 2 end #=> #Function<erl_eval.20.80484245>
+spawn(f) #=> #PID<0.40.0>
+
+# `spawn` returns a pid (process identifier), you can use this pid to send
+# messages to the process. To do message passing we use the `send` operator.
+# For all of this to be useful we need to be able to receive messages. This is
+# achieved with the `receive` mechanism:
+defmodule Geometry do
+  def area_loop do
+    receive do
+      {:rectangle, w, h} ->
+        IO.puts("Area = #{w * h}")
+        area_loop()
+      {:circle, r} ->
+        IO.puts("Area = #{3.14 * r * r}")
+        area_loop()
+    end
+  end
+end
+
+# Compile the module and create a process that evaluates `area_loop` in the shell
+pid = spawn(fn -> Geometry.area_loop() end) #=> #PID<0.40.0>
+
+# Send a message to `pid` that will match a pattern in the receive statement
+send pid, {:rectangle, 2, 3}
+#=> Area = 6
+#   {:rectangle,2,3}
+
+send pid, {:circle, 2}
+#=> Area = 12.56000000000000049738
+#   {:circle,2}
+
+# The shell is also a process, you can use `self` to get the current pid
+self() #=> #PID<0.27.0>
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

String interpolation in single-quoted strings

+
'#{:atom} <- this should not be highligted'
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-elm.html b/docs/_style/prism-master/examples/prism-elm.html new file mode 100644 index 00000000..00d0e333 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-elm.html @@ -0,0 +1,91 @@ +

Comments

+
-- Single line comment
+{- Multi-line
+comment -}
+ +

Strings and characters

+
'a'
+'\n'
+'\x03'
+"foo \" bar"
+"""
+"multiline strings" are also
+supported!
+"""
+ +

Full example

+
module Main exposing (..)
+
+import Html exposing (Html)
+import Svg exposing (..)
+import Svg.Attributes exposing (..)
+import Time exposing (Time, second)
+
+
+main =
+    Html.program
+        { init = init
+        , view = view
+        , update = update
+        , subscriptions = subscriptions
+        }
+
+
+
+-- MODEL
+
+
+type alias Model =
+    Time
+
+
+init : ( Model, Cmd Msg )
+init =
+    ( 0, Cmd.none )
+
+
+
+-- UPDATE
+
+
+type Msg
+    = Tick Time
+
+
+update : Msg -> Model -> ( Model, Cmd Msg )
+update msg model =
+    case msg of
+        Tick newTime ->
+            ( newTime, Cmd.none )
+
+
+
+-- SUBSCRIPTIONS
+
+
+subscriptions : Model -> Sub Msg
+subscriptions model =
+    Time.every second (\time -> Tick time)
+
+
+
+-- VIEW
+
+
+view : Model -> Html Msg
+view model =
+    let
+        angle =
+            turns (Time.inMinutes model)
+
+        handX =
+            toString (50 + 40 * cos angle)
+
+        handY =
+            toString (50 + 40 * sin angle)
+    in
+    svg [ viewBox "0 0 100 100", width "300px" ]
+        [ circle [ cx "50", cy "50", r "45", fill "#0B79CE" ] []
+        , line [ x1 "50", y1 "50", x2 handX, y2 handY, stroke "#023963" ] []
+        ]
+
diff --git a/docs/_style/prism-master/examples/prism-erb.html b/docs/_style/prism-master/examples/prism-erb.html new file mode 100644 index 00000000..46c0143f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-erb.html @@ -0,0 +1,22 @@ +

Full example

+
<%# index.erb %>
+<h1>Listing Books</h1>
+<table>
+  <tr>
+    <th>Title</th>
+    <th>Summary</th>
+    <th></th>
+    <th></th>
+    <th></th>
+  </tr>
+
+<% @books.each do |book| %>
+  <tr>
+    <td><%= book.title %></td>
+    <td><%= book.content %></td>
+    <td><%= link_to "Show", book %></td>
+    <td><%= link_to "Edit", edit_book_path(book) %></td>
+    <td><%= link_to "Remove", book, method: :delete, data: { confirm: "Are you sure?" } %></td>
+  </tr>
+<% end %>
+</table>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-erlang.html b/docs/_style/prism-master/examples/prism-erlang.html new file mode 100644 index 00000000..05445adf --- /dev/null +++ b/docs/_style/prism-master/examples/prism-erlang.html @@ -0,0 +1,47 @@ +

Comments

+
% This is a comment
+%% coding: utf-8
+ +

Strings

+
"foo \"bar\" baz"
+ +

Numbers

+
42.
+$A.
+$\n.
+2#101.
+16#1f.
+2.3.
+2.3e3.
+2.3e-3.
+ +

Functions

+
P = spawn(m, loop, []).
+io:format("I am ~p~n", [self()]).
+'weird function'().
+
+ +

Variables

+
P = {adam,24,{july,29}}.
+M1 = #{name=>adam,age=>24,date=>{july,29}}.
+M2 = maps:update(age,25,M1).
+io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X]).
+ +

Operators

+
1==1.0.
+1=:=1.0.
+1 > a.
++1.
+-1.
+1+1.
+4/2.
+5 div 2.
+5 rem 2.
+2#10 band 2#01.
+2#10 bor 2#01.
+a + 10.
+1 bsl (1 bsl 64).
+not true.
+true and false.
+true xor false.
+true or garbage.
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-flow.html b/docs/_style/prism-master/examples/prism-flow.html new file mode 100644 index 00000000..76f3e14a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-flow.html @@ -0,0 +1,18 @@ +

Primitive types

+
function method(x: number, y: string, z: boolean) {}
+function stringifyBasicValue(value: string | number) {}
+function add(one: any, two: any): number {
+  return one + two;
+}
+
+const bar: number = 2;
+var barVar: number = 2;
+let barLet: number = 2;
+let isOneOf: number | boolean | string = foo;
+ +

Keywords

+
type UnionAlias = 1 | 2 | 3;
+opaque type ID = string;
+declare opaque type PositiveNumber: number;
+type Country = $Keys<typeof countries>;
+type RequiredProps = $Diff<Props, DefaultProps>;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-fortran.html b/docs/_style/prism-master/examples/prism-fortran.html new file mode 100644 index 00000000..00b23f5a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-fortran.html @@ -0,0 +1,71 @@ +

Comments

+
! This is a comment
+ +

Strings

+
"foo 'bar' baz"
+'foo ''bar'' baz'
+''
+ITALICS_'This is in italics'
+"test &
+	! Some "tricky comment" here
+	&test"
+ +

Numbers

+
473
++56
+-101
+21_2
+21_SHORT
+1976354279568241_8
+B'01110'
+B"010"
+O'047'
+O"642"
+Z'F41A'
+Z"00BC"
+-12.78
++1.6E3
+2.1
+-16.E4_8
+0.45E-4
+10.93E7_QUAD
+.123
+3E4
+ +

Full example

+
MODULE MOD1
+TYPE INITIALIZED_TYPE
+	INTEGER :: I = 1 ! Default initialization
+END TYPE INITIALIZED_TYPE
+SAVE :: SAVED1, SAVED2
+INTEGER :: SAVED1, UNSAVED1
+TYPE(INITIALIZED_TYPE) :: SAVED2, UNSAVED2
+ALLOCATABLE :: SAVED1(:), SAVED2(:), UNSAVED1(:), UNSAVED2(:)
+END MODULE MOD1
+
+PROGRAM MAIN
+CALL SUB1 ! The values returned by the ALLOCATED intrinsic calls
+          ! in the PRINT statement are:
+          ! .FALSE., .FALSE., .FALSE., and .FALSE.
+          ! Module MOD1 is used, and its variables are allocated.
+          ! After return from the subroutine, whether the variables
+          ! which were not specified with the SAVE attribute
+          ! retain their allocation status is processor dependent.
+CALL SUB1 ! The values returned by the first two ALLOCATED intrinsic
+	      ! calls in the PRINT statement are:
+	      ! .TRUE., .TRUE.
+	      ! The values returned by the second two ALLOCATED
+	      ! intrinsic calls in the PRINT statement are
+	      ! processor dependent and each could be either
+	      ! .TRUE. or .FALSE.
+CONTAINS
+	SUBROUTINE SUB1
+	USE MOD1 ! Brings in saved and not saved variables.
+	PRINT *, ALLOCATED(SAVED1), ALLOCATED(SAVED2), &
+	         ALLOCATED(UNSAVED1), ALLOCATED(UNSAVED2)
+	IF (.NOT. ALLOCATED(SAVED1)) ALLOCATE(SAVED1(10))
+	IF (.NOT. ALLOCATED(SAVED2)) ALLOCATE(SAVED2(10))
+	IF (.NOT. ALLOCATED(UNSAVED1)) ALLOCATE(UNSAVED1(10))
+	IF (.NOT. ALLOCATED(UNSAVED2)) ALLOCATE(UNSAVED2(10))
+	END SUBROUTINE SUB1
+END PROGRAM MAIN
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-fsharp.html b/docs/_style/prism-master/examples/prism-fsharp.html new file mode 100644 index 00000000..6a4330b6 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-fsharp.html @@ -0,0 +1,89 @@ +

Comments

+
// Single line comment
+(* Multi-line
+comment *)
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+@"Verbatim strings"
+"""Alternate "verbatim" strings"""
+
+ +

Numbers

+
//8 bit Int
+86y
+0b00000101y
+//Unsigned 8 bit Int
+86uy
+0b00000101uy
+//16 bit Int
+86s
+//Unsigned 16 bit Int
+86us
+//Int
+86
+86l
+0b10000
+0x2A6
+//Unsigned Int
+86u
+86ul
+//unativeint
+0x00002D3Fun
+//Long
+86L
+//Unsigned Long
+86UL
+//Float
+4.14F
+4.14f
+4.f
+4.F
+0x0000000000000000lf
+//Double
+4.14
+2.3E+32
+2.3e+32
+2.3e-32
+2.3e32
+0x0000000000000000LF
+//BigInt
+9999999999999999999999999999I
+//Decimal
+0.7833M
+0.7833m
+3.m
+3.M
+
+ +

Full example

+
// The declaration creates a constructor that takes two values, name and age. 
+type Person(name:string, age:int) =
+    // A Person object's age can be changed. The mutable keyword in the 
+    // declaration makes that possible. 
+    let mutable internalAge = age
+
+    // Declare a second constructor that takes only one argument, a name. 
+    // This constructor calls the constructor that requires two arguments, 
+    // sending 0 as the value for age. 
+    new(name:string) = Person(name, 0)
+
+    // A read-only property. 
+    member this.Name = name
+    // A read/write property. 
+    member this.Age
+        with get() = internalAge
+        and set(value) = internalAge <- value
+
+    // Instance methods. 
+    // Increment the person's age. 
+    member this.HasABirthday () = internalAge <- internalAge + 1
+
+    // Check current age against some threshold. 
+    member this.IsOfAge targetAge = internalAge >= targetAge
+
+    // Display the person's name and age. 
+    override this.ToString () = 
+        "Name:  " + name + "\n" + "Age:   " + (string)internalAge
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-gcode.html b/docs/_style/prism-master/examples/prism-gcode.html new file mode 100644 index 00000000..ebc15615 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-gcode.html @@ -0,0 +1,22 @@ +

Comments

+
; comment
+(some more comments)
+G28 (even in here) X0
+
+ +

Quoted strings

+
"foo""bar"
+ +

Full example

+
M190 S60 ; Heat bed to 60°C
+G21 ; Set units to millimeters
+G28 ; Move to Origin (Homing)
+G29 ; Auto Bed Leveling
+G28 X0 Y0 ; Home X and Y to min endstops
+M107 ; Fan off
+M109 S200 ; Heat hotend to 200°C
+G92 E0 ; Set current extruder position as zero
+G1 F200 E15 ; Extrude 15mm filament with 200mm/min
+G92 E0 ; Set current extruder position as zero
+G1 F500
+
diff --git a/docs/_style/prism-master/examples/prism-gedcom.html b/docs/_style/prism-master/examples/prism-gedcom.html new file mode 100644 index 00000000..3fee6ab0 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-gedcom.html @@ -0,0 +1,50 @@ +

Full example

+
0 HEAD
+1 CHAR ASCII
+1 SOUR ID_OF_CREATING_FILE
+1 GEDC
+2 VERS 5.5
+2 FORM Lineage-Linked
+1 SUBM @SUBMITTER@
+0 @SUBMITTER@ SUBM
+1 NAME /Submitter/
+1 ADDR Submitters address
+2 CONT address continued here
+0 @FATHER@ INDI
+1 NAME /Father/
+1 SEX M
+1 BIRT
+2 PLAC birth place
+2 DATE 1 JAN 1899
+1 DEAT
+2 PLAC death place
+2 DATE 31 DEC 1990
+1 FAMS @FAMILY@
+0 @MOTHER@ INDI
+1 NAME /Mother/
+1 SEX F
+1 BIRT
+2 PLAC birth place
+2 DATE 1 JAN 1899
+1 DEAT
+2 PLAC death place
+2 DATE 31 DEC 1990
+1 FAMS @FAMILY@
+0 @CHILD@ INDI
+1 NAME /Child/
+1 BIRT
+2 PLAC birth place
+2 DATE 31 JUL 1950
+1 DEAT
+2 PLAC death place
+2 DATE 29 FEB 2000
+1 FAMC @FAMILY@
+0 @FAMILY@ FAM
+1 MARR
+2 PLAC marriage place
+2 DATE 1 APR 1950
+1 HUSB @FATHER@
+1 WIFE @MOTHER@
+1 CHIL @CHILD@
+0 TRLR
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-gherkin.html b/docs/_style/prism-master/examples/prism-gherkin.html new file mode 100644 index 00000000..f38446e7 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-gherkin.html @@ -0,0 +1,74 @@ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+
+"""
+Some Title, Eh?
+===============
+Here is the first paragraph of my blog post.
+Lorem ipsum dolor sit amet, consectetur adipiscing
+elit.
+"""
+
+ +

Keywords

+
Feature: Some terse yet descriptive text of what is desired
+    In order to realize a named business value
+    As an explicit system actor
+    I want to gain some beneficial outcome which furthers the goal
+
+    Additional text...
+
+    Scenario: Some determinable business situation
+    Given some precondition
+    And some other precondition
+    When some action by the actor
+    And some other action
+    And yet another action
+    Then some testable outcome is achieved
+    And something else we can check happens too
+
+    Scenario: A different situation
+    ...
+ +

Comments and tags

+
# user.feature
+@users
+Feature: Sign in to the store
+  In order to view my orders list
+  As a visitor
+  I need to be able to log in to the store
+
+  @javascript @login
+  Scenario: Trying to login without credentials
+      Given I am on the store homepage
+        And I follow "Login"
+       When I press "Login"
+       Then I should be on login page
+       # And I should see "Invalid credentials"
+
+ +

Tables and parameters

+
Scenario Outline: Eating
+  Given there are <start> cucumbers
+  When I eat <eat> cucumbers
+  Then I should have <left> cucumbers
+
+  Examples:
+    | start | eat | left |
+    |  12   |  5  |  7   |
+    |  20   |  5  |  15  |
+ +

Localized keywords

+
#language: fr
+Fonctionnalité: Contrôle le format de la valeur saisie d'un champ d'une révision
+  En tant qu'expert ou analyste
+  Je ne dois pas pouvoir soumettre des données au mauvais format
+
+  Contexte:
+    Etant donné que je suis connecté avec le pseudo "p_flore" et le mot de passe "p4flore"
+    Et que la gamme du contrat 27156 supporte les révisions
+    Etant donné que le contrat ayant l'id "27156" a une révision
+    Et je suis sur "/contrat/27156/revision/1"
+    Et que j'attends quelques secondes
+    ...
diff --git a/docs/_style/prism-master/examples/prism-git.html b/docs/_style/prism-master/examples/prism-git.html new file mode 100644 index 00000000..cd5668d1 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-git.html @@ -0,0 +1,39 @@ +

Comments

+
# On branch prism-examples
+# Changes to be committed:
+#   (use "git reset HEAD <file>..." to unstage)
+#
+#       new file:   examples/prism-git.html
+ +

Inserted and deleted lines

+
- Some deleted line
++ Some added line
+ +

Diff

+
$ git diff
+diff --git file.txt file.txt
+index 6214953..1d54a52 100644
+--- file.txt
++++ file.txt
+@@ -1 +1,2 @@
+-Here's my tetx file
++Here's my text file
++And this is the second line
+ +

Logs

+
$ git log
+commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09
+Author: lgiraudel
+Date:   Mon Feb 17 11:18:34 2014 +0100
+
+    Add of a new line
+
+commit 87edc4ad8c71b95f6e46f736eb98b742859abd95
+Author: lgiraudel
+Date:   Mon Feb 17 11:18:15 2014 +0100
+
+    Typo fix
+
+commit 3102416a90c431400d2e2a14e707fb7fd6d9e06d
+Author: lgiraudel
+Date:   Mon Feb 17 10:58:11 2014 +0100
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-glsl.html b/docs/_style/prism-master/examples/prism-glsl.html new file mode 100644 index 00000000..7492a422 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-glsl.html @@ -0,0 +1,65 @@ +

Vertex shader example

+
attribute vec3 vertex;
+attribute vec3 normal;
+
+uniform mat4 _mvProj;
+uniform mat3 _norm;
+
+varying vec3 vColor;
+varying vec3 localPos;
+
+#pragma include "light.glsl"
+
+// constants
+vec3 materialColor = vec3(1.0,0.7,0.8);
+vec3 specularColor = vec3(1.0,1.0,1.0);
+
+void main(void) {
+    // compute position
+    gl_Position = _mvProj * vec4(vertex, 1.0);
+    
+    localPos = vertex;
+    
+    // compute light info
+    vec3 n = normalize(_norm * normal);
+    vec3 diffuse;
+    float specular;
+    float glowingSpecular = 50.0;
+    getDirectionalLight(n, _dLight, glowingSpecular, diffuse, specular);
+    vColor = max(diffuse,_ambient.xyz)*materialColor+specular*specularColor+_ambient;
+}
+ +

Fragment shader example

+
#ifdef GL_ES
+precision highp float;
+#endif
+
+uniform vec3 BrickColor, MortarColor;
+uniform vec3 BrickSize;
+uniform vec3 BrickPct;
+
+varying vec3 vColor;
+varying vec3 localPos;
+void main()
+{
+    vec3 color;
+	vec3 position, useBrick;
+	
+
+	position = localPos / BrickSize.xyz;
+
+	if (fract(position.y * 0.5) > 0.5){
+		position.x += 0.5;
+        position.z += 0.5;
+	}
+    
+	position = fract(position);
+
+	useBrick = step(position, BrickPct.xyz);
+
+	color = mix(MortarColor, BrickColor, useBrick.x * useBrick.y * useBrick.z);
+	color *= vColor;
+
+	gl_FragColor = vec4(color, 1.0);
+}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-gml.html b/docs/_style/prism-master/examples/prism-gml.html new file mode 100644 index 00000000..a1649f6b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-gml.html @@ -0,0 +1,29 @@ +

Comments

+
// This is a comment
+/* This is a comment
+on multiple lines */
+ +

Functions

+
variable_instance_set(_inst,_var_name,_start+_change);
+ +

Full example

+
if(instance_exists(_inst) || _inst==global){
+	if(_delay<=0){
+		_time+=1;
+		if(_time<_duration){
+			event_user(0);
+		}else{
+			if(_inst!=global){
+				variable_instance_set(_inst,_var_name,_start+_change);
+			}else{
+				variable_global_set(_var_name,_start+_change);
+			}
+			instance_destroy();
+		}
+	}else{
+		_delay-=1;
+	}
+}else{
+	instance_destroy();
+}
+
diff --git a/docs/_style/prism-master/examples/prism-go.html b/docs/_style/prism-master/examples/prism-go.html new file mode 100644 index 00000000..205a1a7e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-go.html @@ -0,0 +1,68 @@ +

Comments

+
// This is a comment
+/* This is a comment
+on multiple lines */
+ +

Numbers

+
42
+0600
+0xBadFace
+170141183460469231731687303715884105727
+0.
+72.40
+072.40
+2.71828
+1.e+0
+6.67428e-11
+1E6
+.25
+.12345E+5
+0i
+011i
+0.i
+2.71828i
+1.e+0i
+6.67428e-11i
+1E6i
+.25i
+.12345E+5i
+ +

Runes and strings

+
'\t'
+'\000'
+'\x07'
+'\u12e4'
+'\U00101234'
+`abc`
+`multi-line
+string`
+"Hello, world!"
+"multi-line
+string"
+ +

Functions

+
func(a, b int, z float64) bool { return a*b < int(z) }
+ +

Full example

+
package main
+import "fmt"
+
+func sum(a []int, c chan int) {
+	sum := 0
+	for _, v := range a {
+		sum += v
+	}
+	c <- sum // send sum to c
+}
+
+func main() {
+	a := []int{7, 2, 8, -9, 4, 0}
+
+	c := make(chan int)
+	go sum(a[:len(a)/2], c)
+	go sum(a[len(a)/2:], c)
+	x, y := <-c, <-c // receive from c
+
+	fmt.Println(x, y, x+y)
+}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-graphql.html b/docs/_style/prism-master/examples/prism-graphql.html new file mode 100644 index 00000000..12113a9d --- /dev/null +++ b/docs/_style/prism-master/examples/prism-graphql.html @@ -0,0 +1,31 @@ +

Comments

+
# This is a comment
+ +

Strings

+
""
+"foo \"bar\" baz"
+ +

Numbers

+
0
+42
+3.14159
+-9e-5
+0.9E+7
+ +

Keywords

+
query withFragments {
+  user(id: 4) {
+    friends(first: 10) {
+      ...friendFields
+    }
+    mutualFriends(first: 10) {
+      ...friendFields
+    }
+  }
+}
+
+fragment friendFields on User {
+  id
+  name
+  profilePic(size: 50)
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-groovy.html b/docs/_style/prism-master/examples/prism-groovy.html new file mode 100644 index 00000000..3ec1d6d3 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-groovy.html @@ -0,0 +1,93 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo 'bar' baz"
+'foo "bar" baz'
+"""Multi-line
+string"""
+'''Multi-line
+string'''
+"String /containing/ slashes"
+
+ +

Slashy strings (regex)

+
/.*foo.*/
+/regex"containing quotes"/
+$/.*"(.*)".*/(.*)/$
+ +

Interpolation inside GStrings and regex

+
"The answer is ${21*2}"
+"The $foxtype ${foxcolor.join()} fox"
+/foo${21*2}baz/
+'No interpolation here : ${21*2}'
+ +

Full example

+
#!/usr/bin/env groovy
+package model
+
+import groovy.transform.CompileStatic
+import java.util.List as MyList
+
+trait Distributable {
+    void distribute(String version) {}
+}
+
+@CompileStatic
+class Distribution implements Distributable {
+    double number = 1234.234 / 567
+    def otherNumber = 3 / 4
+    boolean archivable = condition ?: true
+    def ternary = a ? b : c
+    String name = "Guillaume"
+    Closure description = null
+    List<DownloadPackage> packages = []
+    String regex = ~/.*foo.*/
+    String multi = '''
+        multi line string
+    ''' + """
+        now with double quotes and ${gstring}
+    """ + $/
+        even with dollar slashy strings
+    /$
+
+    /**
+     * description method
+     * @param cl the closure
+     */
+    void description(Closure cl) { this.description = cl }
+
+    void version(String name, Closure versionSpec) {
+        def closure = { println "hi" } as Runnable
+
+        MyList ml = [1, 2, [a: 1, b:2,c :3]]
+        for (ch in "name") {}
+
+        // single line comment
+        DownloadPackage pkg = new DownloadPackage(version: name)
+
+        check that: true
+
+        label:
+        def clone = versionSpec.rehydrate(pkg, pkg, pkg)
+        /*
+            now clone() in a multiline comment
+        */
+        clone()
+        packages.add(pkg)
+
+        assert 4 / 2 == 2
+    }
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Two divisions on the same line

+
2 / 3 / 4
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-haml.html b/docs/_style/prism-master/examples/prism-haml.html new file mode 100644 index 00000000..c2cc670c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-haml.html @@ -0,0 +1,79 @@ +

Comments

+

+/ This is comment
+    on multiple lines
+/ This is a comment
+but this is not
+-# This is another comment
+    on multiple lines
+ +

Doctype

+
!!! XML
+!!!
+!!! 5
+ +

Tags

+
%div
+	%span
+%span(class="widget_#{@widget.number}")
+%div{:id => [@item.type, @item.number], :class => [@item.type, @item.urgency]}
+%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
+%html{html_attrs('fr-fr')}
+%div[@user, :greeting]
+%img
+%pre><
+  foo
+  bar
+%img
+
+ +

Markup

+
%div
+  <p id="blah">Blah!</p>
+ +

Inline Ruby

+
= ['hi', 'there', 'reader!'].join " "
+- foo = "hello"
+= link_to_remote "Add to cart",
+    :url => { :action => "add", :id => product.id },
+    :update => { :success => "cart", :failure => "error" }
+~ "Foo\n<pre>Bar\nBaz</pre>"
+%p
+  - case 2
+  - when 1
+    = "1!"
+  - when 2
+    = "2?"
+  - when 3
+    = "3."
+- (42...47).each do |i|
+  %p= i
+%p See, I can count!
+
+ +

Filters

+ +
%head
+	:css
+		#content: {
+			background: url('img/background.jpg');
+		}
+		div {
+			color: #333;
+		}
+	:javascript
+		(function() {
+			var test = "Do you like Prism?";
+			if(confirm(test)) {
+				do_something_great();
+			}
+		}());
+%body
+
+ +

Filters require the desired language to be loaded. +On this page, check CoffeeScript before checking Haml should make +the example below work properly.

+
%script
+  :coffee
+    console.log 'This is coffee script'
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-handlebars.html b/docs/_style/prism-master/examples/prism-handlebars.html new file mode 100644 index 00000000..c39c8b74 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-handlebars.html @@ -0,0 +1,41 @@ +

Comments

+
{{! This is a comment with <p>some markup</p> in it }}
+{{! This is a comment }} {{ this_is_not }}
+ +

Variables

+
<p>{{ text }}</p>
+<h1>{{article.title}}</h1>
+{{{ triple_stash_is_supported }}}
+{{articles.[10].[#comments]}}
+ +

Strings, numbers and booleans

+
{{{link "See more..." story.url}}}
+{{ true }}
+{{ custom_helper 42 href="somepage.html" false }}
+ +

Block helpers

+
<div class="body">
+	{{#bold}}{{body}}{{/bold}}
+</div>
+{{#with story}}
+	<div class="intro">{{{intro}}}</div>
+	<div class="body">{{{body}}}</div>
+{{/with}}
+<div class="{{#if test}}foo{{else}}bar{{/if}}"></div>
+{{#list array}}
+	{{@index}}. {{title}}
+{{/list}}
+{{#block-with-hyphens args=yep}}
+	This should probably work...
+{{/block-with-hyphens}}
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Handlebars tag in the middle of an HTML tag

+
<div{{#if test}} class="test"{{/if}}></div>
diff --git a/docs/_style/prism-master/examples/prism-haskell.html b/docs/_style/prism-master/examples/prism-haskell.html new file mode 100644 index 00000000..de58eb79 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-haskell.html @@ -0,0 +1,80 @@ +

Comments

+
-- Single line comment
+{- Multi-line
+comment -}
+ +

Strings and characters

+
'a'
+'\n'
+'\^A'
+'\^]'
+'\NUL'
+'\23'
+'\o75'
+'\xFE'
+"Here is a backslant \\ as well as \137, \
+    \a numeric escape character, and \^X, a control character."
+ +

Numbers

+
42
+123.456
+123.456e-789
+1e+3
+0o74
+0XAF
+ +

Full example

+
hGetLine h =
+  wantReadableHandle_ "Data.ByteString.hGetLine" h $
+    \ h_@Handle__{haByteBuffer} -> do
+      flushCharReadBuffer h_
+      buf <- readIORef haByteBuffer
+      if isEmptyBuffer buf
+         then fill h_ buf 0 []
+         else haveBuf h_ buf 0 []
+ where
+
+  fill h_@Handle__{haByteBuffer,haDevice} buf len xss =
+    len `seq` do
+    (r,buf') <- Buffered.fillReadBuffer haDevice buf
+    if r == 0
+       then do writeIORef haByteBuffer buf{ bufR=0, bufL=0 }
+               if len > 0
+                  then mkBigPS len xss
+                  else ioe_EOF
+       else haveBuf h_ buf' len xss
+
+  haveBuf h_@Handle__{haByteBuffer}
+          buf@Buffer{ bufRaw=raw, bufR=w, bufL=r }
+          len xss =
+    do
+        off <- findEOL r w raw
+        let new_len = len + off - r
+        xs <- mkPS raw r off
+
+      -- if eol == True, then off is the offset of the '\n'
+      -- otherwise off == w and the buffer is now empty.
+        if off /= w
+            then do if (w == off + 1)
+                            then writeIORef haByteBuffer buf{ bufL=0, bufR=0 }
+                            else writeIORef haByteBuffer buf{ bufL = off + 1 }
+                    mkBigPS new_len (xs:xss)
+            else do
+                 fill h_ buf{ bufL=0, bufR=0 } new_len (xs:xss)
+
+  -- find the end-of-line character, if there is one
+  findEOL r w raw
+        | r == w = return w
+        | otherwise =  do
+            c <- readWord8Buf raw r
+            if c == fromIntegral (ord '\n')
+                then return r -- NB. not r+1: don't include the '\n'
+                else findEOL (r+1) w raw
+
+mkPS :: RawBuffer Word8 -> Int -> Int -> IO ByteString
+mkPS buf start end =
+ create len $ \p ->
+   withRawBuffer buf $ \pbuf -> do
+   copyBytes p (pbuf `plusPtr` start) len
+ where
+   len = end - start
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-haxe.html b/docs/_style/prism-master/examples/prism-haxe.html new file mode 100644 index 00000000..61fbf0e4 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-haxe.html @@ -0,0 +1,37 @@ +

Strings and string interpolation

+
"Foo
+bar $baz"
+'Foo
+bar'
+"${4 + 2}"
+ +

Regular expressions

+
~/haxe/i
+~/[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z][A-Z][A-Z]?/i
+~/(dog|fox)/g
+ +

Conditional compilation

+
#if !debug
+  trace("ok");
+#elseif (debug_level > 3)
+  trace(3);
+#else
+  trace("debug level too low");
+#end
+ +

Metadata

+
@author("Nicolas")
+@debug
+class MyClass {
+  @range(1, 8)
+  var value:Int;
+
+  @broken
+  @:noCompletion
+  static function method() { }
+}
+ +

Reification

+
macro static function add(e:Expr) {
+  return macro $e + $e;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-hpkp.html b/docs/_style/prism-master/examples/prism-hpkp.html new file mode 100644 index 00000000..ced16eb7 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-hpkp.html @@ -0,0 +1,11 @@ +

Pin for one year with report-uri

+
pin-sha256="EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4=";
+max-age=31536000;
+includeSubDomains;
+report-uri="https://my-reports.com/submit"
+
+ +

Pin for a short time (considered unsafe)

+
pin-sha256="EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4=";
+max-age=123
+
diff --git a/docs/_style/prism-master/examples/prism-hsts.html b/docs/_style/prism-master/examples/prism-hsts.html new file mode 100644 index 00000000..f7d0e451 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-hsts.html @@ -0,0 +1,8 @@ +

Policy with far-future max-age

+
max-age=31536000
+ +

Policy with near-future max-age, considered unsafe

+
max-age=123
+ +

Policy with extra directives

+
max-age=31536000; includeSubdomains; preload
diff --git a/docs/_style/prism-master/examples/prism-http.html b/docs/_style/prism-master/examples/prism-http.html new file mode 100644 index 00000000..a2091768 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-http.html @@ -0,0 +1,33 @@ +

Request header

+
GET http://localhost:9999/foo.html HTTP/1.1
+Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
+Accept-Encoding: gzip, deflate
+ +

Response header

+
HTTP/1.1 200 OK
+Server: GitHub.com
+Date: Mon, 22 Dec 2014 18:25:30 GMT
+Content-Type: text/html; charset=utf-8
+ +

Response body highlighted based on Content-Type

+

This currently supports the following content types : + "application/json", + "application/xml", + "text/xml" and + "text/html".

+
HTTP/1.1 200 OK
+Server: GitHub.com
+Date: Mon, 22 Dec 2014 18:25:30 GMT
+Content-Type: text/html; charset=utf-8
+Last-Modified: Sun, 21 Dec 2014 20:29:48 GMT
+Transfer-Encoding: chunked
+Expires: Mon, 22 Dec 2014 18:35:30 GMT
+Cache-Control: max-age=600
+Vary: Accept-Encoding
+Content-Encoding: gzip
+
+<!DOCTYPE html>
+<html lang="en">
+<head></head>
+<body></body>
+</html>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-ichigojam.html b/docs/_style/prism-master/examples/prism-ichigojam.html new file mode 100644 index 00000000..24bcbf22 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ichigojam.html @@ -0,0 +1,29 @@ +

Note: this component focuses on IchigoJam, which uses a small subset of basic and introduces its own markers.

+ +

Comments

+
' This is a comment
+REM This is a remark
+'NoSpaceIsOK
+REMNOSPACE
+ +

Strings

+
"This a string."
+"This is a string with ""quotes"" in it."
+ +

Numbers

+
42
+3.14159
+-42
+-3.14159
+.5
+10.
+2E10
+4.2E-14
+-3E+2
+#496F726953756B69
+`11100010
+ +

IchigoJam Basic example

+
A=0
+FOR I=1 TO 100 : A=A+I : NEXT
+PRINT A
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-icon.html b/docs/_style/prism-master/examples/prism-icon.html new file mode 100644 index 00000000..1dce690c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-icon.html @@ -0,0 +1,172 @@ +

Comments

+
#
+# Foobar
+ +

Strings and csets

+
""
+"Foo\"bar"
+''
+'a\'bcdefg'
+ +

Numbers

+
42
+3.14159
+5.2E+8
+16rface
+2r1101
+ +

Full example

+
# Author: Robert J. Alexander
+global GameObject, Tree, Learn
+record Question(question, yes, no)
+procedure main()
+   GameObject := "animal"
+   Tree := Question("Does it live in water", "goldfish", "canary")
+   Get()                                  # Recall prior knowledge
+   Game()                                 # Play a game
+   return
+end
+#  Game() -- Conducts a game.
+#
+procedure Game()
+   while Confirm("Are you thinking of ", Article(GameObject), " ",
+      GameObject) do Ask(Tree)
+   write("Thanks for a great game.")
+   if \Learn &Confirm("Want to save knowledge learned this session")
+   then Save()
+   return
+end
+#  Confirm() -- Handles yes/no questions and answers.
+#
+procedure Confirm(q[])
+   local answer, s
+   static ok
+   initial {
+      ok := table()
+      every ok["y" | "yes" | "yeah" | "uh huh"] := "yes"
+      every ok["n" | "no"  | "nope" | "uh uh" ] := "no"
+      }
+   while /answer do {
+      every writes(!q)
+      write("?")
+      case s := read() | exit(1) of {
+         #  Commands recognized at a yes/no prompt.
+         #
+         "save":    Save()
+         "get":     Get()
+         "list":    List()
+         "dump":    Output(Tree)
+         default:   {
+            (answer := \ok[map(s, &ucase, &lcase)]) |
+               write("This is a \"yes\" or \"no\" question.")
+            }
+         }
+      }
+   return answer == "yes"
+end
+#  Ask() -- Navigates through the barrage of questions leading to a
+#  guess.
+#
+procedure Ask(node)
+   local guess, question
+   case type(node) of {
+      "string":        {
+         if not Confirm("It must be ", Article(node), " ", node, ", right") then {
+            Learn := "yes"
+            write("What were you thinking of?")
+            guess := read() | exit(1)
+            write("What question would distinguish ", Article(guess), " ",
+               guess, " from ", Article(node), " ", node, "?")
+            question := read() | exit(1)
+            if question[-1] == "?" then question[-1] := ""
+            question[1] := map(question[1], &lcase, &ucase)
+            if Confirm("For ", Article(guess), " ", guess, ", what would the answer be")
+            then return Question(question, guess, node)
+         else return Question(question, node, guess)
+         }
+      }
+      "Question":  {
+         if Confirm(node.question) then node.yes := Ask(node.yes)
+         else node.no := Ask(node.no)
+         }
+      }
+end
+#  Article() -- Come up with the appropriate indefinite article.
+#
+procedure Article(word)
+   return if any('aeiouAEIOU', word) then "an" else "a"
+end
+#  Save() -- Store our acquired knowledge in a disk file name
+#  based on the GameObject.
+#
+procedure Save()
+   local f
+   f := open(GameObject || "s", "w")
+   Output(Tree, f)
+   close(f)
+   return
+end
+#  Output() -- Recursive procedure used to output the knowledge tree.
+#
+procedure Output(node, f, sense)
+   static indent
+   initial indent := 0
+   /f := &output
+   /sense := " "
+   case type(node) of {
+      "string":        write(f, repl(" ", indent), sense, "A: ", node)
+      "Question":  {
+         write(f, repl(" ", indent), sense, "Q: ", node.question)
+         indent +:= 1
+         Output(node.yes, f, "y")
+         Output(node.no, f, "n")
+         indent -:= 1
+         }
+      }
+   return
+end
+#  Get() -- Read in a knowledge base from a file.
+#
+procedure Get()
+   local f
+   f := open(GameObject || "s", "r") | fail
+   Tree := Input(f)
+   close(f)
+   return
+end
+#  Input() -- Recursive procedure used to input the knowledge tree.
+#
+procedure Input(f)
+   local nodetype, s
+   read(f) ? (tab(upto(~' \t')) & =("y" | "n" | "") &
+      nodetype := move(1) & move(2) & s := tab(0))
+   return if nodetype == "Q" then Question(s, Input(f), Input(f)) else s
+end
+#  List() -- Lists the objects in the knowledge base.
+#
+$define Length           78
+procedure List()
+   local lst, line, item
+   lst := Show(Tree, [ ])
+   line := ""
+   every item := !sort(lst) do {
+      if *line + *item > Length then {
+         write(trim(line))
+         line := ""
+         }
+      line ||:= item || ", "
+      }
+   write(line[1:-2])
+   return
+end
+#
+#  Show() -- Recursive procedure used to navigate the knowledge tree.
+#
+procedure Show(node, lst)
+   if type(node) == "Question" then {
+      lst := Show(node.yes, lst)
+      lst := Show(node.no, lst)
+      }
+   else put(lst, node)
+   return lst
+end
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-inform7.html b/docs/_style/prism-master/examples/prism-inform7.html new file mode 100644 index 00000000..9e2214f0 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-inform7.html @@ -0,0 +1,171 @@ +

Comments

+
[This is a comment]
+[This is a
+multi-line comment]
+ +

Texts

+
"This is a string"
+"This is a
+multi-line string"
+ +

Numbers

+
42
+3.14159
+50kg
+100m
+one
+three
+twelve
+ +

Titles

+
Section 2 - Flamsteed's Balloon
+
+Part SR1 - The Physical World Model
+
+Table of Floors
+ +

Standard kinds, verbs and keywords

+
In the Treehouse is a container called the cardboard box.
+The cardboard box is a closed container. The glass bottle is a transparent open container. The box is fixed in place and openable.
+
+Check photographing:
+    if the noun is the camera, say "Sadly impossible." instead.
+ +

Text substitution

+
"[if the player is in Center Ring]A magician's booth stands in the corner, painted dark blue with glittering gold stars.[otherwise if the magician's booth is closed]A crack of light indicates the way back out to the center ring.[otherwise]The door stands open to the outside.[end if]".
+ +

Full example

+
"Lakeside Living"
+
+A volume is a kind of value. 15.9 fl oz specifies a volume with parts ounces and tenths (optional, preamble optional).
+
+A fluid container is a kind of container. A fluid container has a volume called a fluid capacity. A fluid container has a volume called current volume.
+
+The fluid capacity of a fluid container is usually 12.0 fl oz. The current volume of a fluid container is usually 0.0 fl oz.
+
+Liquid is a kind of value. The liquids are water, absinthe, and iced tea. A fluid container has a liquid.
+
+Instead of examining a fluid container:
+    if the noun is empty,
+        say "You catch just a hint of [the liquid of the noun] at the bottom.";
+    otherwise
+        say "[The noun] contains [current volume of the noun in rough terms] of [liquid of the noun]."
+
+To say (amount - a volume) in rough terms:
+    if the amount is less than 0.5 fl oz:
+        say "a swallow or two";
+    otherwise if tenths part of amount is greater than 3 and tenths part of amount is less than 7:
+        let estimate be ounces part of amount;
+        say "[estimate in words] or [estimate plus 1 in words] fluid ounces";
+    otherwise:
+        if tenths part of amount is greater than 6, increase amount by 1.0 fl oz;
+        say "about [ounces part of amount in words] fluid ounce[s]".
+
+Before printing the name of a fluid container (called the target) while not drinking or pouring:
+    if the target is empty:
+        say "empty ";
+    otherwise:
+        do nothing.
+
+After printing the name of a fluid container (called the target) while not examining or pouring:
+    unless the target is empty:
+        say " of [liquid of the target]";
+        omit contents in listing.
+
+Instead of inserting something into a fluid container:
+    say "[The second noun] has too narrow a mouth to accept anything but liquids."
+
+Definition: a fluid container is empty if the current volume of it is 0.0 fl oz. Definition: a fluid container is full if the current volume of it is the fluid capacity of it.
+
+Understand "drink from [fluid container]" as drinking.
+
+Instead of drinking a fluid container:
+    if the noun is empty:
+        say "There is no more [liquid of the noun] within." instead;
+    otherwise:
+        decrease the current volume of the noun by 0.2 fl oz;
+        if the current volume of the noun is less than 0.0 fl oz, now the current volume of the noun is 0.0 fl oz;
+        say "You take a sip of [the liquid of the noun][if the noun is empty], leaving [the noun] empty[end if]."
+
+Part 2 - Filling
+
+Understand the command "fill" as something new.
+
+Understand "fill [fluid container] with/from [full liquid source]" as filling it with. Understand "fill [fluid container] with/from [fluid container]" as filling it with.
+
+Understand "fill [something] with/from [something]" as filling it with.
+
+Filling it with is an action applying to two things. Carry out filling it with: try pouring the second noun into the noun instead.
+
+Understand "pour [fluid container] in/into/on/onto [fluid container]" as pouring it into. Understand "empty [fluid container] into [fluid container]" as pouring it into.
+
+Understand "pour [something] in/into/on/onto [something]" as pouring it into. Understand "empty [something] into [something]" as pouring it into.
+
+Pouring it into is an action applying to two things.
+
+Check pouring it into:
+    if the noun is not a fluid container, say "You can't pour [the noun]." instead;
+    if the second noun is not a fluid container, say "You can't pour liquids into [the second noun]." instead;
+    if the noun is the second noun, say "You can hardly pour [the noun] into itself." instead;
+    if the liquid of the noun is not the liquid of the second noun:
+        if the second noun is empty, now the liquid of the second noun is the liquid of the noun;
+        otherwise say "Mixing [the liquid of the noun] with [the liquid of the second noun] would give unsavory results." instead;
+    if the noun is empty, say "No more [liquid of the noun] remains in [the noun]." instead;
+    if the second noun is full, say "[The second noun] cannot contain any more than it already holds." instead.
+
+Carry out pouring it into:
+    let available capacity be the fluid capacity of the second noun minus the current volume of the second noun;
+    if the available capacity is greater than the current volume of the noun, now the available capacity is the current volume of the noun;
+    increase the current volume of the second noun by available capacity;
+    decrease the current volume of the noun by available capacity.
+
+Report pouring it into:
+    say "[if the noun is empty][The noun] is now empty;[otherwise][The noun] now contains [current volume of the noun in rough terms] of [liquid of the noun]; [end if]";
+    say "[the second noun] contains [current volume of the second noun in rough terms] of [liquid of the second noun][if the second noun is full], and is now full[end if]."
+
+Understand the liquid property as describing a fluid container. Understand "of" as a fluid container.
+
+A liquid source is a kind of fluid container. A liquid source has a liquid. A liquid source is usually scenery. The fluid capacity of a liquid source is usually 3276.7 fl oz. The current volume of a liquid source is usually 3276.7 fl oz. Instead of examining a liquid source: say "[The noun] is full of [liquid of the noun]."
+
+Carry out pouring a liquid source into something: now the current volume of the noun is 3276.7 fl oz.
+
+After pouring a liquid source into a fluid container:
+    say "You fill [the second noun] up with [liquid of the noun] from [the noun]."
+
+Instead of pouring a fluid container into a liquid source:
+    if the noun is empty, say "[The noun] is already empty." instead;
+    now the current volume of the noun is 0.0 fl oz;
+    say "You dump out [the noun] into [the second noun]."
+
+Swimming is an action applying to nothing. Understand "swim" or "dive" as swimming.
+
+Instead of swimming in the presence of a liquid source:
+    say "You don't feel like a dip just now."
+
+Before inserting something into a liquid source: say "[The noun] would get lost and never be seen again." instead.
+
+Part 3 - Scenario
+
+The Lakeside is a room. The Lakeside swing is an enterable supporter in the Lakeside. "Here you are by the lake, enjoying a summery view."
+
+The glass is a fluid container carried by the player. The liquid of the glass is absinthe. The current volume of the glass is 0.8 fl oz.
+
+The pitcher is a fluid container in the Lakeside. The fluid capacity of the pitcher is 32.0 fl oz. The current volume of the pitcher is 20.0 fl oz. The liquid of the pitcher is absinthe.
+
+The lake is a liquid source. It is in the Lakeside.
+
+The player wears a bathing outfit. The description of the bathing outfit is "Stylishly striped in blue and white, and daringly cut to reveal almost all of your calves, and quite a bit of upper arm, as well. You had a moral struggle, purchasing it; but mercifully the lakeshore is sufficiently secluded that no one can see you in this immodest apparel."
+
+Instead of taking off the outfit: say "What odd ideas come into your head sometimes!"
+
+Test me with "fill glass / empty absinthe into lake / fill glass / swim / drink lake / drink / x water / x lake". 
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Names starting with a number

+
The box 1A is a container
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-ini.html b/docs/_style/prism-master/examples/prism-ini.html new file mode 100644 index 00000000..284fbe44 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ini.html @@ -0,0 +1,10 @@ +

Comments

+
; This is a comment
+ +

Section title

+
[owner]
+[database]
+ +

Properties

+
name=prism
+file="somefile.txt"
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-io.html b/docs/_style/prism-master/examples/prism-io.html new file mode 100644 index 00000000..ff5160a4 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-io.html @@ -0,0 +1,31 @@ +

Comments

+
//
+// Foobar
+#!/usr/bin/env io
+/* multiline
+comment
+*/
+ +

Strings

+
"this is a \"test\".\nThis is only a test."
+"""this is a "test".
+This is only a test."""
+ +

Numbers

+
123
+123.456
+0.456
+123e-4
+123e4
+123.456e-7
+123.456e2
+
+ +

Full example

+
"Hello, world!" println
+A := Object clone    // creates a new, empty object named "A"
+factorial := method(n,
+    if(n == 0, return 1)
+    res := 1
+    Range 1 to(n) foreach(i, res = res * i)
+)
diff --git a/docs/_style/prism-master/examples/prism-j.html b/docs/_style/prism-master/examples/prism-j.html new file mode 100644 index 00000000..cf4c109a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-j.html @@ -0,0 +1,59 @@ +

Comments

+
NB. This is a comment
+ +

Strings

+
'This is a string.'
+'This is a string with ''quotes'' in it.'
+ +

Numbers

+
2.3e2 2.3e_2 2j3
+2p1 1p_1
+1x2 2x1 1x_1
+2e2j_2e2 2e2j2p1 2ad45 2ar0.785398
+16b1f 10b23 _10b23 1e2b23 2b111.111
+ +

Verbs

+
%4
+3%4
+,b
+'I';'was';'here'
+3 5$'wake read lamp '
+ +

Adverbs

+
1 2 3 */ 4 5 6 7
+'%*'(1 3;2 _1)} y
+ +

Conjunctions

+
10&^. 2 3 10 100 200
++`*
++:@*: +/ -:@%:
+ +

Examples

+
NB. The following functions E1, E2 and E3
+NB. interchange two rows of a matrix,
+NB. multiply a row by a constant,
+NB. and add a multiple of one row to another:
+
+E1=: <@] C. [
+E2=: f`g`[}
+E3=: F`g`[}
+f=: {:@] * {.@] { [
+F=: [: +/ (1:,{:@]) * (}:@] { [)
+g=: {.@]
+M=: i. 4 5
+M;(M E1 1 3);(M E2 1 10);(M E3 1 3 10)
+ +
NB. Implementation of quicksort
+
+sel=: adverb def 'u # ['
+
+quicksort=: verb define
+  if. 1 >: #y do. y
+  else.
+    (quicksort y <sel e),(y =sel e),quicksort y >sel e=.y{~?#y
+  end.
+)
+ +
NB. Implementation of quicksort (tacit programming)
+
+quicksort=: (($:@(<#[), (=#[), $:@(>#[)) ({~ ?@#)) ^: (1<#)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-java.html b/docs/_style/prism-master/examples/prism-java.html new file mode 100644 index 00000000..691a6b10 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-java.html @@ -0,0 +1,65 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz";
+'foo \'bar\' baz';
+ +

Numbers

+
123
+123.456
+-123.456
+.3f
+1.3e9d
+0xaf
+0xAF
+0xFF.AEP-4
+
+ +

Full example

+
import java.util.Scanner;
+
+public class Life {
+
+    @Override @Bind("One")
+    public void show(boolean[][] grid){
+        String s = "";
+        for(boolean[] row : grid){
+            for(boolean val : row)
+                if(val)
+                    s += "*";
+                else
+                    s += ".";
+            s += "\n";
+        }
+        System.out.println(s);
+    }
+
+    public static boolean[][] gen(){
+        boolean[][] grid = new boolean[10][10];
+        for(int r = 0; r < 10; r++)
+            for(int c = 0; c < 10; c++)
+                if( Math.random() > 0.7 )
+                    grid[r][c] = true;
+        return grid;
+    }
+
+    public static void main(String[] args){
+        boolean[][] world = gen();
+        show(world);
+        System.out.println();
+        world = nextGen(world);
+        show(world);
+        Scanner s = new Scanner(System.in);
+        while(s.nextLine().length() == 0){
+            System.out.println();
+            world = nextGen(world);
+            show(world);
+
+        }
+    }
+
+	// [...]
+}
diff --git a/docs/_style/prism-master/examples/prism-javascript.html b/docs/_style/prism-master/examples/prism-javascript.html new file mode 100644 index 00000000..51fe4835 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-javascript.html @@ -0,0 +1,77 @@ +

Variable assignment

+
var foo = "bar", baz = 5;
+ +

Operators

+
(1 + 2 * 3)/4 >= 3 && 4 < 5 || 6 > 7
+ +

Indented code

+
if (true) {
+	while (true) {
+		doSomething();
+	}
+}
+ +

Regex with slashes

+
var foo = /([^/])\/(\\?.|\[.+?])+?\/[gim]{0,3}/g;
+ +

Regex that ends with double slash

+
var bar = /\/\*[\w\W]*?\*\//g;
+ +

Single line comments & regexes

+
// http://lea.verou.me
+var comment = /\/\*[\w\W]*?\*\//g;
+ +

Link in comment

+
// http://lea.verou.me
+/* http://lea.verou.me */
+ +

Nested strings

+
var foo = "foo", bar = "He \"said\" 'hi'!"
+ +

Strings inside comments

+
// "foo"
+/* "foo" */
+ +

Strings with slashes

+
env.content + '</' + env.tag + '>'
+var foo = "/" + "/";
+var foo = "http://prismjs.com"; // Strings are strings and comments are comments ;)
+ +

Regex inside single line comment

+
// hey, /this doesn’t fail!/ :D
+ +

Two or more division operators on the same line

+
var foo = 5 / 6 / 7;
+ +

A division operator on the same line as a regex

+
var foo = 1/2, bar = /a/g;
+var foo = /a/, bar = 3/4;
+ +

ES6 features

+
// Regex "y" and "u" flags
+var a = /[a-zA-Z]+/gimyu;
+
+// for..of loops
+for(let x of y) { }
+
+// Modules: import
+import { foo as bar } from "file.js"
+
+// Template strings
+`Only on ${y} one line`
+`This template string ${x} is on
+
+multiple lines.`
+`40 + 2 = ${ 40 + 2 }`
+`The squares of the first 3 natural integers are ${[for (x of [1,2,3]) x*x].join(', ')}`
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

String interpolation containing a closing brace

+
`${ {foo:'bar'}.foo }`
+`${ '}' }`
diff --git a/docs/_style/prism-master/examples/prism-javastacktrace.html b/docs/_style/prism-master/examples/prism-javastacktrace.html new file mode 100644 index 00000000..3511aa6a --- /dev/null +++ b/docs/_style/prism-master/examples/prism-javastacktrace.html @@ -0,0 +1,63 @@ +

Full example

+
javax.servlet.ServletException: Something bad happened
+    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60)
+    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
+    at com.example.myproject.ExceptionHandlerFilter.doFilter(ExceptionHandlerFilter.java:28)
+    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
+    at com.example.myproject.OutputBufferFilter.doFilter(OutputBufferFilter.java:33)
+    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
+    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
+    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
+    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
+    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
+    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
+    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
+    at org.mortbay.jetty.Server.handle(Server.java:326)
+    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
+    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
+    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
+    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
+    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
+    at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
+    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
+Caused by: com.example.myproject.MyProjectServletException
+    at com.example.myproject.MyServlet.doPost(MyServlet.java:169)
+    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
+    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
+    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
+    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
+    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:30)
+    ... 27 more
+Suppressed: org.hibernate.exception.ConstraintViolationException: could not insert: [com.example.myproject.MyEntity]
+    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
+    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
+    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:64)
+    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
+    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822)
+    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
+    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
+    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
+    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
+    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
+    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
+    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
+    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
+    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
+    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
+    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
+    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
+    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
+    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
+    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+    at java.lang.reflect.Method.invoke(Method.java:597)
+    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
+    at $Proxy19.save(Unknown Source)
+    at com.example.myproject.MyEntityService.save(MyEntityService.java:59) <-- relevant call (see notes below)
+    at com.example.myproject.MyServlet.doPost(MyServlet.java:164)
+    ... 32 more
+Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
+    at org.hsqldb.jdbc.Util.throwError(Unknown Source)
+    at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
+    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
+    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
+    ... 54 more
diff --git a/docs/_style/prism-master/examples/prism-jolie.html b/docs/_style/prism-master/examples/prism-jolie.html new file mode 100644 index 00000000..8d23d995 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-jolie.html @@ -0,0 +1,162 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz";
+'foo \'bar\' baz'
+ +

Numbers

+
42
+42L
+1.2e3
+0.1E-4
+0.2e+1
+
+ +

Full example

+
include "console.iol"
+
+type HubType: void {
+  .sid: undefined
+  .nodes[1,*] : NodeType
+}
+
+type NodeType: void {
+  .sid: string
+  .node: string
+  .load?: int
+}
+
+type NetType: HubType | NodeType
+
+interface NetInterface {
+  OneWay: start( string ), addElement( NetType ), removeElement( NetType ), quit( void )
+  RequestResponse: showElements( void )( NetType ) throws SomeFault
+}
+
+type LogType: void {
+  .message: string
+}
+
+interface LoggerInterface {
+  RequestResponse: log( LogType )( void )
+}
+
+outputPort LoggerService {
+    Interfaces: LoggerInterface
+}
+
+embedded {
+  Jolie: "logger.ol" in LoggerService
+}
+
+type AuthenticationData: void {
+    .key:string
+}
+
+interface extender AuthInterfaceExtender {
+    OneWay: *(AuthenticationData)
+}
+
+service SubService 
+{
+  Interfaces: NetInterface
+
+  main
+  {
+     println@Console( "I do nothing" )()
+  }
+}
+
+inputPort ExtLogger {
+  Location: "socket://localhost:9000"
+  Protocol: sodep
+  Interfaces: LoggerInterface
+  Aggregates: LoggerService with AuthInterfaceExtender
+}
+
+courier ExtLogger {
+  [interface LoggerInterface( request )] {
+    if ( key == "secret" ){
+      forward ( request )
+    }
+  }
+}
+
+inputPort In {
+  Location: "socket://localhost:8000"
+  Protocol: http {
+    .debug = true;
+    .debug.showContent = true
+  }
+  Interfaces: NetInterface
+  Aggregates: SubService, 
+              LoggerService
+  Redirects: A => SubService, 
+             B => SubService
+}
+
+cset {
+  sid: HubType.sid NodeType.sid
+}
+
+execution{ concurrent }
+
+define netmodule {
+  if( request.load == 0 || request.load < 1 && 
+      request.load <= 2 || request.load >= 3 && 
+      request.load > 4  || request.load%4 == 2
+  ) {
+    scope( scopeName ) {   
+      // inline comment
+      install( MyFault => println@Console( "Something \"Went\" Wrong" + ' but it\'s ok' )() );
+      /*
+      * Multi-line
+      * Comment
+      */
+      install( this => cH; println@Console( "Something went wrong: " + ^load )() );
+      install( default => comp( scopeName ); println@Console( "Something went wrong" )() );
+      load -> request.( "load" );
+      { ++load | load++ | --load | load-- };
+      throw( MyFault )
+    }
+  } else {
+    foreach ( node -> request.nodes ) {
+      with( node ){
+        while( .load != 100 ) {
+          .load++
+        }   
+      }
+    } 
+  }
+}
+
+main
+{
+  start( sid );
+  synchronized( unneededSync ){
+    csets.sid = sid;
+    undef( sid )
+  };
+  provide
+    [ addElement( request ) ]{
+      if( request instanceof NodeType ) {
+        netmodule
+      }
+    }
+    [ removeElement() ]
+    [ showElements()( response ){
+       /*
+       * assemble response
+       */
+       nullProcess
+     }]{
+       // log the request
+       log@LoggerService( new )();
+       log @ LoggerService( new )()
+     }
+  until
+   [ quit() ]{ exit }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-jsx.html b/docs/_style/prism-master/examples/prism-jsx.html new file mode 100644 index 00000000..faff4920 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-jsx.html @@ -0,0 +1,18 @@ +

Full example

+
var ExampleApplication = React.createClass({
+    render: function() {
+      var elapsed = Math.round(this.props.elapsed  / 100);
+      var seconds = elapsed / 10 + (elapsed % 10 ? '' : '.0' );
+      var message =
+        'React has been successfully running for ' + seconds + ' seconds.';
+
+      return <p>{message}</p>;
+    }
+  });
+  var start = new Date().getTime();
+  setInterval(function() {
+    React.render(
+      <ExampleApplication elapsed={new Date().getTime() - start} />,
+      document.getElementById('container')
+    );
+  }, 50);
diff --git a/docs/_style/prism-master/examples/prism-julia.html b/docs/_style/prism-master/examples/prism-julia.html new file mode 100644 index 00000000..b69d0454 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-julia.html @@ -0,0 +1,29 @@ +

Full example

+
function mandel(z)
+    c = z
+    maxiter = 80
+    for n = 1:maxiter
+        if abs(z) > 2
+            return n-1
+        end
+        z = z^2 + c
+    end
+    return maxiter
+end
+
+function randmatstat(t)
+    n = 5
+    v = zeros(t)
+    w = zeros(t)
+    for i = 1:t
+        a = randn(n,n)
+        b = randn(n,n)
+        c = randn(n,n)
+        d = randn(n,n)
+        P = [a b c d]
+        Q = [a b; c d]
+        v[i] = trace((P.'*P)^4)
+        w[i] = trace((Q.'*Q)^4)
+    end
+    std(v)/mean(v), std(w)/mean(w)
+end
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-keyman.html b/docs/_style/prism-master/examples/prism-keyman.html new file mode 100644 index 00000000..770827d5 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-keyman.html @@ -0,0 +1,107 @@ +

Comments

+
c This is a comment
+ +

Strings, numbers and characters

+
"'this' is a string"
+'and so is "this"'
+U+0041 d65 x41   c these are all the letter A
+
+ +

Prefixes and Virtual Keys

+ +

+c Match RAlt+E on desktops, Ctrl+Alt+E on web because L/R Alt not consistently supported in browsers.
+$KeymanOnly: + [RALT K_E] > "€"
+$KeymanWeb: + [CTRL ALT K_E] > "€"
+
+ +

Example Code

+ +
c =====================Begin Identity Section===================================================
+c 
+c Mnemonic input method for Amharic script on US-QWERTY
+c keyboards for Keyman version 7.1, compliant with Unicode 4.1 and later.
+c 
+
+store(&VERSION) '9.0'
+store(&Name) "Amharic"
+c store(&MnemonicLayout) "1"
+store(&CapsAlwaysOff) "1"
+store(&Copyright) "Creative Commons Attribution 3.0"
+store(&Message) "This is an Amharic language mnemonic input method for Ethiopic script that requires Unicode 4.1 support."
+store(&WINDOWSLANGUAGES) 'x045E x045E'
+store(&LANGUAGE) 'x045E'
+store(&EthnologueCode) "amh"
+store(&VISUALKEYBOARD) 'gff-amh-7.kvk'
+store(&KMW_EMBEDCSS) 'gff-amh-7.css'
+HOTKEY "^%A"
+c 
+c =====================End Identity Section=====================================================
+
+c =====================Begin Data Section=======================================================
+
+c ---------------------Maps for Numbers---------------------------------------------------------
+store(ArabOnes) '23456789'
+store(ones)     '፪፫፬፭፮፯፰፱'
+store(tens)     '፳፴፵፶፷፸፹፺'
+store(arabNumbers) '123456789'
+store(ethNumbers) '፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼'
+store(arabNumbersWithZero) '0123456789'
+store(ColonOrComma) ':,'
+store(ethWordspaceOrComma) '፡፣'
+c ---------------------End Numbers--------------------------------------------------------------
+
+c =====================End Data Section=========================================================
+
+c =====================Begin Functional Section=================================================
+c 
+store(&LAYOUTFILE) 'gff-amh-7_layout.js'
+store(&BITMAP) 'amharic.bmp'
+store(&TARGETS) 'any windows'
+begin Unicode > use(main)
+group(main) using keys    
+
+c ---------------------Input of Numbers---------------------------------------------------------
+
+c Special Rule for Arabic Numerals
+c 
+c The following attempts to auto-correct the use of Ethiopic wordspace and
+c Ethiopic comma within an Arabic numeral context.  Ethiopic wordspace gets
+c used erroneously in time formats and Ethiopic commas as an order of thousands
+c delimiter. The correction context is not known until numerals appear on _both_
+c sides of the punctuation.
+c 
+  any(arabNumbersWithZero) any(ethWordspaceOrComma) + any(arabNumbers) > index(arabNumbersWithZero,1) index(ColonOrComma,2) index(arabNumbers,3)
+
+c Ethiopic Numerals
+
+  "'" + '1' > '፩'
+  "'" + any(ArabOnes) > index(ones,2)
+
+c special cases for multiples of one
+  '፩'  + '0' > '፲'
+  '፲'  + '0' > '፻'
+  '፻'  + '0' > '፲፻'
+  '፲፻' + '0' > '፼'
+  '፼'  + '0' > '፲፼'    
+  '፲፼' + '0' > '፻፼' 
+  '፻፼'  + '0' > '፲፻፼'
+  '፲፻፼' + '0' > '፼፼'
+  '፼፼' + '0' > context beep  c do not go any higher, we could beep here
+
+c upto the order of 100 million
+  any(ones)     + '0' > index(tens,1)
+  any(tens)     + '0' > index(ones,1) '፻'  c Hundreds
+  any(ones)  '፻ '+ '0' > index(tens,1) '፻'  c Thousands
+  any(tens)  '፻' + '0' > index(ones,1) '፼'  c Ten Thousands
+  any(ones)  '፼' + '0' > index(tens,1) '፼'  c Hundred Thousands
+  any(tens)  '፼' + '0' > index(ones,1) '፻፼' c Millions
+  any(ones) '፻፼' + '0' > index(tens,1) '፻፼' c Ten Millions
+  any(tens) '፻፼' + '0' > index(ones,1) '፼፼' c Hundred Millions
+
+c enhance this later, look for something that can copy a match over
+  any(ethNumbers) + any(arabNumbers) > index(ethNumbers,1)  index(ethNumbers,2)
+c ---------------------End Input of Numbers-----------------------------------------------------
+                                            
+c =====================End Functional Section===================================================
+
diff --git a/docs/_style/prism-master/examples/prism-kotlin.html b/docs/_style/prism-master/examples/prism-kotlin.html new file mode 100644 index 00000000..7c8f7b4e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-kotlin.html @@ -0,0 +1,134 @@ +

Numbers

+
123
+123L
+0x0F
+0b00001011
+123.5
+123.5e10
+123.5f
+123.5F
+ +

Strings and interpolation

+
'2'
+'\uFF00'
+'\''
+
+"foo $bar \"baz"
+"""
+foo ${40 + 2}
+baz${bar()}
+"""
+ +

Labels

+
loop@ for (i in 1..100) {
+  for (j in 1..100) {
+    if (...)
+      break@loop
+  }
+}
+ +

Annotations

+
public class MyTest {
+    lateinit var subject: TestSubject
+
+    @SetUp fun setup() {
+        subject = TestSubject()
+    }
+
+    @Test fun test() {
+        subject.method()  // dereference directly
+    }
+}
+ +

Full example

+
package com.example.html
+
+interface Element {
+    fun render(builder: StringBuilder, indent: String)
+
+    override fun toString(): String {
+        val builder = StringBuilder()
+        render(builder, "")
+        return builder.toString()
+    }
+}
+
+class TextElement(val text: String): Element {
+    override fun render(builder: StringBuilder, indent: String) {
+        builder.append("$indent$text\n")
+    }
+}
+
+abstract class Tag(val name: String): Element {
+    val children = arrayListOf<Element>()
+    val attributes = hashMapOf<String, String>()
+
+    protected fun initTag<T: Element>(tag: T, init: T.() -> Unit): T {
+        tag.init()
+        children.add(tag)
+        return tag
+    }
+
+    override fun render(builder: StringBuilder, indent: String) {
+        builder.append("$indent<$name${renderAttributes()}>\n")
+        for (c in children) {
+            c.render(builder, indent + "  ")
+        }
+        builder.append("$indent</$name>\n")
+    }
+
+    private fun renderAttributes(): String? {
+        val builder = StringBuilder()
+        for (a in attributes.keySet()) {
+            builder.append(" $a=\"${attributes[a]}\"")
+        }
+        return builder.toString()
+    }
+}
+
+abstract class TagWithText(name: String): Tag(name) {
+    operator fun String.plus() {
+        children.add(TextElement(this))
+    }
+}
+
+class HTML(): TagWithText("html") {
+    fun head(init: Head.() -> Unit) = initTag(Head(), init)
+
+    fun body(init: Body.() -> Unit) = initTag(Body(), init)
+}
+
+class Head(): TagWithText("head") {
+    fun title(init: Title.() -> Unit) = initTag(Title(), init)
+}
+
+class Title(): TagWithText("title")
+
+abstract class BodyTag(name: String): TagWithText(name) {
+    fun b(init: B.() -> Unit) = initTag(B(), init)
+    fun p(init: P.() -> Unit) = initTag(P(), init)
+    fun h1(init: H1.() -> Unit) = initTag(H1(), init)
+    fun a(href: String, init: A.() -> Unit) {
+        val a = initTag(A(), init)
+        a.href = href
+    }
+}
+
+class Body(): BodyTag("body")
+
+class B(): BodyTag("b")
+class P(): BodyTag("p")
+class H1(): BodyTag("h1")
+class A(): BodyTag("a") {
+    public var href: String
+        get() = attributes["href"]!!
+        set(value) {
+            attributes["href"] = value
+        }
+}
+
+fun html(init: HTML.() -> Unit): HTML {
+    val html = HTML()
+    html.init()
+    return html
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-latex.html b/docs/_style/prism-master/examples/prism-latex.html new file mode 100644 index 00000000..137df360 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-latex.html @@ -0,0 +1,12 @@ +

Comments

+
% This is a comment
+ +

Commands

+
\begin{document}
+\documentstyle[twoside,epsfig]{article}
+\usepackage{epsfig,multicol}
+ +

Math mode

+
$\alpha$
+H$_{2}$O
+45$^{\circ}$C
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-less.html b/docs/_style/prism-master/examples/prism-less.html new file mode 100644 index 00000000..db8a5e64 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-less.html @@ -0,0 +1,70 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

Variables

+
@nice-blue: #5B83AD;
+@light-blue: @nice-blue + #111;
+ +

At-rules

+
@media screen and (min-width: 320px) {}
+ +

Mixins

+
.bordered {
+  border-top: dotted 1px black;
+  border-bottom: solid 2px black;
+}
+#menu a {
+  .bordered;
+}
+#header a {
+  color: orange;
+  #bundle > .button;
+}
+ +

Mixins with parameters

+
.foo (@bg: #f5f5f5, @color: #900) {
+  background: @bg;
+  color: @color;
+}
+.bar {
+  .foo();
+}
+.class1 {
+  .mixin(@margin: 20px; @color: #33acfe);
+}
+.class2 {
+  .mixin(#efca44; @padding: 40px);
+}
+ +

Interpolation

+
@mySelector: banner;
+.@{mySelector} {
+  font-weight: bold;
+}
+@property: color;
+.widget {
+  @{property}: #0ee;
+  background-@{property}: #999;
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

At-rules looking like variables

+
@import "some file.less";
+ +

At-rules containing interpolation

+
@import "@{themes}/tidal-wave.less";
+ +

extend is not highlighted consistently

+
nav ul {
+  &:extend(.inline);
+  background: blue;
+}
+.a:extend(.b) {}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-liquid.html b/docs/_style/prism-master/examples/prism-liquid.html new file mode 100644 index 00000000..74971975 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-liquid.html @@ -0,0 +1,75 @@ +

Comments

+
{% comment %}This is a comment{% endcomment %}
+ +

Control Flow

+ +Liquid provides multiple control flow statements. + +

if

+

+{% if customer.name == 'kevin' %}
+  Hey Kevin!
+{% elsif customer.name == 'anonymous' %}
+  Hey Anonymous!
+{% else %}
+  Hi Stranger!
+{% endif %}
+
+ +

unless

+ +The opposite of if – executes a block of code only if a certain condition is not met. + +

+{% unless product.title == 'Awesome Shoes' %}
+These shoes are not awesome.
+{% endunless %}
+
+ +

case

+ +Creates a switch statement to compare a variable with different values. case initializes the switch statement, and when compares its values. + +

+{% assign handle = 'cake' %}
+{% case handle %}
+  {% when 'cake' %}
+    This is a cake
+  {% when 'cookie' %}
+    This is a cookie
+  {% else %}
+    This is not a cake nor a cookie
+{% endcase %}
+
+ +

for

+ +Repeatedly executes a block of code. + +break = Causes the loop to stop iterating when it encounters the break tag. +continue = Causes the loop to skip the current iteration when it encounters the continue tag. + +

+{% for i in (1..10) %}
+  {% if i == 4 %}
+    {% break %}
+  {% elsif i == 6 %}
+    {% continue %}
+  {% else %}
+    {{ i }}
+  {% endif %}
+{% endfor %}
+
+ +

range

+ +

+{% for i in (3..5) %}
+  {{ i }}
+{% endfor %}
+
+{% assign num = 4 %}
+{% for i in (1..num) %}
+  {{ i }}
+{% endfor %}
+
diff --git a/docs/_style/prism-master/examples/prism-lisp.html b/docs/_style/prism-master/examples/prism-lisp.html new file mode 100644 index 00000000..436d5c9c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-lisp.html @@ -0,0 +1,46 @@ +

Comments

+
;; (foo bar)
+ +

Strings

+
(foo "bar")
+ +

With nested symbols

+
(foo "A string with a `symbol ")
+ +

With nested arguments

+
(foo "A string with an ARGUMENT ")
+ +

Quoted symbols

+
(foo #'bar)
+ +

Lisp properties

+
(foo :bar)
+ +

Splices

+
(foo ,bar ,@bar)
+ +

Keywords

+
(let foo (bar arg))
+ +

Declarations

+
(declare foo)
+ +

Booleans

+
(foo t)
+
(foo nil)
+ +

Numbers

+
(foo 1)
+
(foo -1.5)
+ +

Definitions

+
(defvar bar 23)
+
(defcustom bar 23)
+ +

Function definitions

+
(defun multiply-by-seven (number)
+       "Multiply NUMBER by seven."
+       (* 7 number))
+ +

Lambda expressions

+
(lambda (number) (* 7 number))
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-livescript.html b/docs/_style/prism-master/examples/prism-livescript.html new file mode 100644 index 00000000..e9194d36 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-livescript.html @@ -0,0 +1,84 @@ +

Comments

+
# This is a single line comment
+/* This is a
+multi line comment */
+ +

Numbers

+
42
+42km
+3.754km_2
+16~BadFace
+36~azertyuiop0123456789
+ +

Strings and interpolation

+
''
+''''''
+""
+""""""
+'Foo \' bar
+	baz'
+'''Foo \''' bar
+	bar'''
+"Foo #bar \"
+	#{2 + 2}\""
+"""#foobar \""" #{ if /test/ == 'test' then 3 else 4}
+	baz"""
+ +

Regex

+
/foobar/ig
+//
+^foo # foo
+[bar]*bA?z # barbaz
+//m
+ +

Full example

+
# example from Str.ls
+
+split = (sep, str) -->
+  str.split sep
+
+join = (sep, xs) -->
+  xs.join sep
+
+lines = (str) ->
+  return [] unless str.length
+  str.split '\n'
+
+unlines = (.join '\n')
+
+words = (str) ->
+  return [] unless str.length
+  str.split /[ ]+/
+
+unwords = (.join ' ')
+
+chars = (.split '')
+
+unchars = (.join '')
+
+reverse = (str) ->
+  str.split '' .reverse!.join ''
+
+repeat = (n, str) -->
+  result = ''
+  for til n
+    result += str
+  result
+
+capitalize = (str) ->
+  (str.char-at 0).to-upper-case! + str.slice 1
+
+camelize = (.replace /[-_]+(.)?/g, (, c) -> (c ? '').to-upper-case!)
+
+# convert camelCase to camel-case, and setJSON to set-JSON
+dasherize = (str) ->
+    str
+      .replace /([^-A-Z])([A-Z]+)/g, (, lower, upper) ->
+         "#{lower}-#{if upper.length > 1 then upper else upper.to-lower-case!}"
+      .replace /^([A-Z]+)/, (, upper) ->
+         if upper.length > 1 then "#upper-" else upper.to-lower-case!
+
+module.exports = {
+  split, join, lines, unlines, words, unwords, chars, unchars, reverse,
+  repeat, capitalize, camelize, dasherize,
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-lolcode.html b/docs/_style/prism-master/examples/prism-lolcode.html new file mode 100644 index 00000000..38308328 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-lolcode.html @@ -0,0 +1,62 @@ +

Comments

+
BTW Single line comment
+OBTW Multi-line
+comment TLDR
+ +

Strings and special characters

+
"foo :"bar:" baz"
+"foo:)bar:>baz"
+"Interpolation :{works} too!"
+ +

Numbers

+
42
+-42
+123.456
+ +

Variable declaration

+
I HAS A var
+var R "THREE"
+var R 3
+ +

Types

+
MAEK some_expr A YARN
+some_var IS NOW A NUMBR
+ +

Full example

+
OBTW Convert a number to hexadecimal. This
+     is returned as a string.
+TLDR
+HOW IZ I decimal_to_hex YR num
+    I HAS A i ITZ 0
+    I HAS A rem
+    I HAS A hex_num ITZ A BUKKIT
+    I HAS A decimal_num ITZ num
+    IM IN YR num_loop
+        rem R MOD OF decimal_num AN 16
+        I HAS A hex_digit
+        rem, WTF?
+            OMG 10, hex_digit R "A", GTFO
+            OMG 11, hex_digit R "B", GTFO
+            OMG 12, hex_digit R "C", GTFO
+            OMG 13, hex_digit R "D", GTFO
+            OMG 14, hex_digit R "E", GTFO
+            OMG 15, hex_digit R "F", GTFO
+            OMGWTF, hex_digit R rem
+        OIC
+        hex_num HAS A SRS i ITZ hex_digit
+        decimal_num R QUOSHUNT OF decimal_num AN 16
+        BOTH SAEM decimal_num AN 0, O RLY?
+            YA RLY, GTFO
+            NO WAI, i R SUM OF i AN 1
+        OIC
+    IM OUTTA YR num_loop
+    I HAS A hex_string ITZ A YARN
+    IM IN YR string_reverse
+        DIFFRINT i AN BIGGR OF i AN 0, O RLY?
+            YA RLY, GTFO
+        OIC
+        hex_string R SMOOSH hex_string AN hex_num'Z SRS i MKAY
+        i R DIFF OF i AN 1
+    IM OUTTA YR string_reverse
+    FOUND YR hex_string
+IF U SAY SO
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-lua.html b/docs/_style/prism-master/examples/prism-lua.html new file mode 100644 index 00000000..288b7675 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-lua.html @@ -0,0 +1,89 @@ +

Comments

+
#!/usr/local/bin/lua
+--
+-- Single line comment
+--[[ Multi line
+comment ]]
+--[====[ Multi line
+comment ]====]
+ +

Strings

+
""
+"Foo\"bar"
+"Foo\
+bar \z
+baz"
+''
+'Foo\'bar'
+'Foo\
+bar \z
+baz'
+[[Multi "line"
+string]]
+[==[Multi [["line"]]
+string]==]
+ +

Numbers

+
3
+345
+0xff
+0xBEBADA
+3, 3., 3.1, .3,
+3e12, 3.e-41, 3.1E+1, .3e1
+0x0.1E
+0xA23p-4
+0X1.921FB54442D18P+1
+ +

Full example

+
function To_Functable(t, fn)
+  return setmetatable(t,
+    {
+     __index = function(t, k) return fn(k) end,
+     __call = function(t, k) return t[k] end
+    })
+end
+
+-- Functable bottles of beer implementation
+
+spell_out = {
+  "One", "Two", "Three", "Four", "Five",
+  "Six", "Seven", "Eight", "Nine", "Ten",
+  [0] = "No more",
+  [-1] = "Lots more"
+}
+
+spell_out = To_Functable(spell_out, function(i) return i end)
+
+bottles = To_Functable({"Just one bottle of beer"},
+                       function(i)
+                         return spell_out(i) .. " bottles of beer"
+                       end)
+
+function line1(i)
+  return bottles(i) .. " on the wall, " .. bottles(i) .. "\n"
+end
+
+line2 = To_Functable({[0] = "Go to the store, Buy some more,\n"},
+                     function(i)
+                       return "Take one down and pass it around,\n"
+                     end)
+
+function line3(i)
+  return bottles(i) .. " on the wall.\n"
+end
+
+function song(n)
+  for i = n, 0, -1 do
+    io.write(line1(i), line2(i), line3(i - 1), "\n")
+  end
+end
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Functions with a single string parameter not using parentheses are not highlighted

+
foobar"param";
diff --git a/docs/_style/prism-master/examples/prism-makefile.html b/docs/_style/prism-master/examples/prism-makefile.html new file mode 100644 index 00000000..45f6f420 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-makefile.html @@ -0,0 +1,263 @@ +

Comments

+
# This is a comment
+include foo # This is another comment
+ +

Targets

+
kbd.o command.o files.o : command.h
+display.o insert.o search.o files.o : buffer.h
+
+.PHONY: clean
+clean:
+        rm *.o temp
+ +

Variables

+
objects = main.o kbd.o command.o display.o \
+          insert.o search.o files.o utils.o
+
+edit : $(objects)
+        cc -o edit $(objects)
+
+$(objects) : defs.h
+
+%oo: $$< $$^ $$+ $$*
+
+foo : bar/lose
+        cd $(@D) && gobble $(@F) > ../$@
+ +

Strings

+
STR = 'A string!'
+
+HELLO = 'hello \
+world'
+
+HELLO2 = "hello \
+world"
+ +

Directives

+
include foo *.mk $(bar)
+
+vpath %.c foo
+
+override define two-lines =
+foo
+$(bar)
+endef
+
+ifeq ($(CC),gcc)
+  libs=$(libs_for_gcc)
+else
+  libs=$(normal_libs)
+endif
+ +

Functions

+
whoami    := $(shell whoami)
+host-type := $(shell arch)
+
+y = $(subst 1,2,$(x))
+
+dirs := a b c d
+files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))
+
+reverse = $(2) $(1)
+foo = $(call reverse,a,b)
+
+$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
+ +

Complete example

+
#!/usr/bin/make -f
+# Generated automatically from Makefile.in by configure.
+# Un*x Makefile for GNU tar program.
+# Copyright (C) 1991 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute
+# it and/or modify it under the terms of the GNU
+# General Public License …
+…
+…
+
+SHELL = /bin/sh
+
+#### Start of system configuration section. ####
+
+srcdir = .
+
+# If you use gcc, you should either run the
+# fixincludes script that comes with it or else use
+# gcc with the -traditional option.  Otherwise ioctl
+# calls will be compiled incorrectly on some systems.
+CC = gcc -O
+YACC = bison -y
+INSTALL = /usr/local/bin/install -c
+INSTALLDATA = /usr/local/bin/install -c -m 644
+
+# Things you might add to DEFS:
+# -DSTDC_HEADERS        If you have ANSI C headers and
+#                       libraries.
+# -DPOSIX               If you have POSIX.1 headers and
+#                       libraries.
+# -DBSD42               If you have sys/dir.h (unless
+#                       you use -DPOSIX), sys/file.h,
+#                       and st_blocks in `struct stat'.
+# -DUSG                 If you have System V/ANSI C
+#                       string and memory functions
+#                       and headers, sys/sysmacros.h,
+#                       fcntl.h, getcwd, no valloc,
+#                       and ndir.h (unless
+#                       you use -DDIRENT).
+# -DNO_MEMORY_H         If USG or STDC_HEADERS but do not
+#                       include memory.h.
+# -DDIRENT              If USG and you have dirent.h
+#                       instead of ndir.h.
+# -DSIGTYPE=int         If your signal handlers
+#                       return int, not void.
+# -DNO_MTIO             If you lack sys/mtio.h
+#                       (magtape ioctls).
+# -DNO_REMOTE           If you do not have a remote shell
+#                       or rexec.
+# -DUSE_REXEC           To use rexec for remote tape
+#                       operations instead of
+#                       forking rsh or remsh.
+# -DVPRINTF_MISSING     If you lack vprintf function
+#                       (but have _doprnt).
+# -DDOPRNT_MISSING      If you lack _doprnt function.
+#                       Also need to define
+#                       -DVPRINTF_MISSING.
+# -DFTIME_MISSING       If you lack ftime system call.
+# -DSTRSTR_MISSING      If you lack strstr function.
+# -DVALLOC_MISSING      If you lack valloc function.
+# -DMKDIR_MISSING       If you lack mkdir and
+#                       rmdir system calls.
+# -DRENAME_MISSING      If you lack rename system call.
+# -DFTRUNCATE_MISSING   If you lack ftruncate
+#                       system call.
+# -DV7                  On Version 7 Unix (not
+#                       tested in a long time).
+# -DEMUL_OPEN3          If you lack a 3-argument version
+#                       of open, and want to emulate it
+#                       with system calls you do have.
+# -DNO_OPEN3            If you lack the 3-argument open
+#                       and want to disable the tar -k
+#                       option instead of emulating open.
+# -DXENIX               If you have sys/inode.h
+#                       and need it 94 to be included.
+
+DEFS =  -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
+        -DVPRINTF_MISSING -DBSD42
+# Set this to rtapelib.o unless you defined NO_REMOTE,
+# in which case make it empty.
+RTAPELIB = rtapelib.o
+LIBS =
+DEF_AR_FILE = /dev/rmt8
+DEFBLOCKING = 20
+
+CDEBUG = -g
+CFLAGS = $(CDEBUG) -I. -I$(srcdir) $(DEFS) \
+        -DDEF_AR_FILE=\"$(DEF_AR_FILE)\" \
+        -DDEFBLOCKING=$(DEFBLOCKING)
+LDFLAGS = -g
+
+prefix = /usr/local
+# Prefix for each installed program,
+# normally empty or `g'.
+binprefix =
+
+# The directory to install tar in.
+bindir = $(prefix)/bin
+
+# The directory to install the info files in.
+infodir = $(prefix)/info
+
+#### End of system configuration section. ####
+
+SRCS_C  = tar.c create.c extract.c buffer.c   \
+          getoldopt.c update.c gnu.c mangle.c \
+          version.c list.c names.c diffarch.c \
+          port.c wildmat.c getopt.c getopt1.c \
+          regex.c
+SRCS_Y  = getdate.y
+SRCS    = $(SRCS_C) $(SRCS_Y)
+OBJS    = $(SRCS_C:.c=.o) $(SRCS_Y:.y=.o) $(RTAPELIB)
+
+AUX =   README COPYING ChangeLog Makefile.in  \
+        makefile.pc configure configure.in \
+        tar.texinfo tar.info* texinfo.tex \
+        tar.h port.h open3.h getopt.h regex.h \
+        rmt.h rmt.c rtapelib.c alloca.c \
+        msd_dir.h msd_dir.c tcexparg.c \
+        level-0 level-1 backup-specs testpad.c
+
+.PHONY: all
+all:    tar rmt tar.info
+
+tar:    $(OBJS)
+        $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
+
+rmt:    rmt.c
+        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ rmt.c
+
+tar.info: tar.texinfo
+        makeinfo tar.texinfo
+
+.PHONY: install
+install: all
+        $(INSTALL) tar $(bindir)/$(binprefix)tar
+        -test ! -f rmt || $(INSTALL) rmt /etc/rmt
+        $(INSTALLDATA) $(srcdir)/tar.info* $(infodir)
+
+$(OBJS): tar.h port.h testpad.h
+regex.o buffer.o tar.o: regex.h
+# getdate.y has 8 shift/reduce conflicts.
+
+testpad.h: testpad
+        ./testpad
+
+testpad: testpad.o
+        $(CC) -o $@ testpad.o
+
+TAGS:   $(SRCS)
+        etags $(SRCS)
+
+.PHONY: clean
+clean:
+        rm -f *.o tar rmt testpad testpad.h core
+
+.PHONY: distclean
+distclean: clean
+        rm -f TAGS Makefile config.status
+
+.PHONY: realclean
+realclean: distclean
+        rm -f tar.info*
+
+.PHONY: shar
+shar: $(SRCS) $(AUX)
+        shar $(SRCS) $(AUX) | compress \
+          > tar-`sed -e '/version_string/!d' \
+                     -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
+                     -e q
+                     version.c`.shar.Z
+
+.PHONY: dist
+dist: $(SRCS) $(AUX)
+        echo tar-`sed \
+             -e '/version_string/!d' \
+             -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
+             -e q
+             version.c` > .fname
+        -rm -rf `cat .fname`
+        mkdir `cat .fname`
+        ln $(SRCS) $(AUX) `cat .fname`
+        tar chZf `cat .fname`.tar.Z `cat .fname`
+        -rm -rf `cat .fname` .fname
+
+tar.zoo: $(SRCS) $(AUX)
+        -rm -rf tmp.dir
+        -mkdir tmp.dir
+        -rm tar.zoo
+        for X in $(SRCS) $(AUX) ; do \
+            echo $$X ; \
+            sed 's/$$/^M/' $$X \
+            > tmp.dir/$$X ; done
+        cd tmp.dir ; zoo aM ../tar.zoo *
+        -rm -rf tmp.dir
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-markdown.html b/docs/_style/prism-master/examples/prism-markdown.html new file mode 100644 index 00000000..a57eaeaf --- /dev/null +++ b/docs/_style/prism-master/examples/prism-markdown.html @@ -0,0 +1,86 @@ +

Titles

+
Title 1
+==
+
+Title 2
+-------
+
+# Title 1
+## Title 2
+### Title 3
+#### Title 4
+##### Title 5
+###### Title 6
+
+ +

Bold and italic

+
*Italic*
+**Bold on
+multiple lines**
+*Italic on
+multiple lines too*
+__It also works with underscores__
+_It also works with underscores_
+
+__An empty line
+
+is not allowed__
+
+ +

Links

+
[Prism](http://www.prismjs.com)
+[Prism](http://www.prismjs.com "Prism")
+
+[prism link]: http://www.prismjs.com (Prism)
+[Prism] [prism link]
+
+ +

Lists and quotes

+
* This is
+* an unordered list
+
+1. This is an
+2. ordered list
+
+* *List item in italic*
+* **List item in bold**
+* [List item as a link](http://example.com "This is an example")
+
+> This is a quotation
+>> With another quotation inside
+> _italic here_, __bold there__
+> And a [link](http://example.com)
+
+ +

Code

+
Inline code between backticks `<p>Paragraph</p>`
+
+    some_code(); /* Indented
+    with four spaces */
+
+	some_code(); /* Indented
+	with a tab */
+
+ +

Raw HTML

+
> This is a quotation
+> Containing <strong>raw HTML</strong>
+
+<p>*Italic text inside HTML tag*</p>
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Nesting of elements is not fully supported

+
_ **bold** inside italic DOESN'T work _
+__ but *italic* inside bold DOES work __
+
+[Link partially *italic* DOESN'T work](http://example.com)
+_ [But link inside italic DOES work](http://example.com) _
+
+[Link partially **bold** DOESN'T work](http://example.com)
+__ [But link inside bold DOES work](http://example.com) __
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-markup.html b/docs/_style/prism-master/examples/prism-markup.html new file mode 100644 index 00000000..ac00e7f6 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-markup.html @@ -0,0 +1,77 @@ +

Empty tag

+
<p></p>
+ +

Tag that spans multiple lines

+
<p
+>hello!
+</p>
+ +

Name-attribute pair

+
<p></p>
+ +

Name-attribute pair without quotes

+
<p class=prism></p>
+ +

Attribute without value

+
<p data-foo></p>
+<p data-foo ></p>
+
+ +

Namespaces

+
<html:p foo:bar="baz" foo:weee></html:p>
+ +

XML prolog

+
<?xml version="1.0" encoding="utf-8"?>
+<svg></svg>
+ +

DOCTYPE

+
<!DOCTYPE html>
+<html></html>
+ +

CDATA section

+
<ns1:description><![CDATA[
+  CDATA is <not> magical.
+]]></ns1:description>
+ +

Comment

+
<!-- I'm a comment -->
+And i'm not
+ +

Entities

+
&amp; &#x2665; &#160; &#x152;
+ +

Embedded JS and CSS

+
<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8" />
+	<title>I can haz embedded CSS and JS</title>
+	<style>
+		@media print {
+			p { color: red !important; }
+		}
+	</style>
+</head>
+<body>
+	<h1>I can haz embedded CSS and JS</h1>
+	<script>
+	if (true) {
+		console.log('foo');
+	}
+	</script>
+
+</body>
+</html>
+ +

Invalid HTML

+
<l </ul>
+ +

Multi-line attribute values

+
<p title="foo
+bar
+baz">
+ +

XML tags with non-ASCII characters

+
<Läufer>foo</Läufer>
+<tag läufer="läufer">bar</tag>
+<läufer:tag>baz</läufer:tag>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-matlab.html b/docs/_style/prism-master/examples/prism-matlab.html new file mode 100644 index 00000000..e78abe36 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-matlab.html @@ -0,0 +1,52 @@ +

Strings

+
myString = 'Hello, world';
+otherString = 'You''re right';
+ +

Comments

+
% Single line comment
+%{ Multi-line
+comment }%
+ +

Numbers

+
x = 325.499
+realmax + .0001e+308
+e = 1 - 3*(4/3 - 1)
+b = 1e-16 + 1 - 1e-16;
+x = 2 + 3i;
+z =
+   4.7842 -1.0921i   0.8648 -1.5931i   1.2616 -2.2753i
+   2.6130 -0.0941i   4.8987 -2.3898i   4.3787 -3.7538i
+   4.4007 -7.1512i   1.3572 -5.2915i   3.6865 -0.5182i
+
+ +

Control flow

+
if rem(a, 2) == 0
+    disp('a is even')
+    b = a/2;
+end
+switch dayString
+   case 'Monday'
+      disp('Start of the work week')
+   case 'Tuesday'
+      disp('Day 2')
+   case 'Wednesday'
+      disp('Day 3')
+   case 'Thursday'
+      disp('Day 4')
+   case 'Friday'
+      disp('Last day of the work week')
+   otherwise
+      disp('Weekend!')
+end
+n = 1;
+nFactorial = 1;
+while nFactorial < 1e100
+    n = n + 1;
+    nFactorial = nFactorial * n;
+end
+ +

Functions

+
q = integral(sqr,0,1);
+y = parabola(x)
+mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y));
+[x,y] = mygrid(pi,2*pi);
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-mel.html b/docs/_style/prism-master/examples/prism-mel.html new file mode 100644 index 00000000..e8879756 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-mel.html @@ -0,0 +1,137 @@ +

Comments

+
// This is a comment
+ +

Strings

+
"This is a string"
+"foo \"bar\" baz"
+ +

Numbers

+
42
+3.14159
+0xA2F
+ +

Variables

+
$x
+$floaty5000
+$longDescriptiveName
+$name_with_underscores
+$_line
+
+float $param;
+int $counter;
+string $name;
+vector $position;
+ +

Arrays, vectors and matrices

+
string $array[3] = {"first\n", "second\n", "third\n"};
+print($array[0]); // Prints "first\n"
+print($array[1]); // Prints "second\n"
+print($array[2]); // Prints "third\n"
+
+vector $roger = <<3.0, 7.7, 9.1>>;
+vector $more = <<4.5, 6.789, 9.12356>>;
+// Assign a vector to variable $test:
+vector $test = <<3.0, 7.7, 9.1>>;
+$test = <<$test.x, 5.5, $test.z>>
+// $test is now <<3.0, 5.5, 9.1>>
+
+matrix $a3[3][4] = <<2.5, 4.5, 3.25, 8.05;
+ 1.12, 1.3, 9.5, 5.2;
+ 7.23, 6.006, 2.34, 4.67>>
+ +

Commands

+
pickWalk -d down;
+string $mySelection[] = `ls -selection`;
+
+setAttr ($mySelection[0]+".particleRenderType") 5;
+
+addAttr -is true -ln "spriteTwist" -at "float" -min -180 -max 180 -dv 0.0 blue_nParticleShape;
+ +

Full example

+
// From http://help.autodesk.com/view/MAYAUL/2015/ENU/?guid=Example_scripts_Dynamics_Time_Playback
+// Alias Script File
+// MODIFY THIS AT YOUR OWN RISK
+//
+// Creation Date: 8 May 1996
+// Author: rh
+//
+// Description:
+// Playback from frame 0 to frame <n> and return the
+// 		the playback rate in frames/sec. If a negative frame
+// count is given, this indicates silent mode. In silent
+// mode, no output is printed.
+//
+// This version is intended for use in batch tests of dynamics.
+// It requests particle and rigid body positions every frame.
+//
+// RETURN
+// Frame rate in frames/sec
+//
+global proc float dynTimePlayback( float $frames )
+{
+ int $silent;
+ // Get the list of particle shapes.
+ //
+ string $particleObjects[] = `ls -type particle`;
+ int $particleCount = size( $particleObjects );
+ // Get the list of transforms.
+ // This will include rigid bodies.
+ //
+ string $transforms[] = `ls -tr`;
+ int $trCount = size( $transforms );
+ 	// Check for negative $frames. This indicates
+ // $silent mode.
+ //
+ if ($frames < 0)
+ {
+ $silent = 1;
+ $frames = -$frames;
+ }
+ else
+ {
+ $silent = 0;
+ }
+ // Setup the playback options.
+ //
+ playbackOptions -min 1 -max $frames -loop "once";
+ currentTime -edit 0;
+ // Playback the animation using the timerX command
+ // to compute the $elapsed time.
+ //
+ float $startTime, $elapsed;
+ $startTime = `timerX`;
+// play -wait;
+ int $i;
+ for ($i = 1; $i < $frames; $i++ )
+ {
+ // Set time
+ //
+ currentTime -e $i;
+ int $obj;
+ // Request count for every particle object.
+ //
+ for ($obj = 0; $obj < $particleCount; $obj++)
+ {
+			string $cmd = "getAttr " + $particleObjects[$obj]+".count";
+ eval( $cmd );
+ }
+ // Request position for every transform
+		// (includes every rigid body).
+ //
+ for ($obj = 0; $obj < $trCount; $obj++)
+ {
+ string $cmd = "getAttr " + $transforms[$obj]+".translate";
+ eval ($cmd);
+ }
+ }
+ $elapsed = `timerX -st $startTime`;
+ // Compute the playback frame $rate. Print results.
+ //
+ float $rate = ($elapsed == 0 ? 0.0 : $frames / $elapsed) ;
+ if ( ! $silent)
+ {
+ print( "Playback time: " + $elapsed + " secs\n" );
+ print( "Playback $rate: " + $rate + " $frames/sec\n" );
+ }
+ return ( $rate );
+} // timePlayback //
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-mizar.html b/docs/_style/prism-master/examples/prism-mizar.html new file mode 100644 index 00000000..98d626c0 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-mizar.html @@ -0,0 +1,45 @@ +

Full example

+ +
:: Example from http://webdocs.cs.ualberta.ca/~piotr/Mizar/Dagstuhl97/
+environ
+vocabulary SCM;
+constructors ARYTHM, PRE_FF, NAT_1, REAL_1;
+notation ARYTHM, PRE_FF, NAT_1;
+requirements ARYTHM;
+theorems REAL_1, PRE_FF, NAT_1, AXIOMS, CQC_THE1;
+schemes NAT_1;
+begin
+
+P: for k being Nat
+	st for n being Nat st n < k holds Fib (n+1) ≥ n
+		holds Fib (k+1) ≥ k
+proof let k be Nat; assume
+IH: for n being Nat st n < k holds Fib (n+1) ≥ n;
+	per cases;
+		suppose k ≤ 1; then k = 0 or k = 0+1 by CQC_THE1:2;
+			hence Fib (k+1) ≥ k by PRE_FF:1;
+		suppose 1 < k; then
+			1+1 ≤ k by NAT_1:38; then
+			consider m being Nat such that
+		A: k = 1+1+m by NAT_1:28;
+			thus Fib (k+1) ≥ k proof
+				per cases by NAT_1:19;
+				suppose S1: m = 0;
+					Fib (0+1+1+1) = Fib(0+1) + Fib(0+1+1) by PRE_FF:1
+					              = 1 + 1 by PRE_FF:1;
+					hence Fib (k+1) ≥ k by A, S1;
+				suppose m > 0; then
+					m+1 > 0+1 by REAL_1:59; then
+					m ≥ 1 by NAT_1:38; then
+				B: m+(m+1) ≥ m+1+1 by REAL_1:49;
+				C: k = m+1+1 by A, AXIOMS:13;
+				   m < m+1 & m+1 < m+1+1 by REAL_1:69; then
+				   m < k & m+1 < k by C, AXIOMS:22; then
+				D: Fib (m+1) ≥ m & Fib (m+1+1) ≥ m+1 by IH;
+				   Fib (m+1+1+1) = Fib (m+1) + Fib (m+1+1) by PRE_FF:1; then
+				   Fib (m+1+1+1) ≥ m+(m+1) by D, REAL_1:55;
+		hence Fib(k+1) ≥ k by C, B, AXIOMS:22;
+	end;
+end;
+
+for n being Nat holds Fib(n+1) ≥ n from Comp_Ind(P);
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-monkey.html b/docs/_style/prism-master/examples/prism-monkey.html new file mode 100644 index 00000000..6716a9a4 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-monkey.html @@ -0,0 +1,74 @@ +

Comments

+
' This is a comment
+
+#Rem            ' This is the start of a comment block
+Some comment    ' We are inside the comment block
+#End
+ +

Strings

+
"Hello World"
+"~qHello World~q"
+"~tIndented~n"
+ +

Numbers

+
0
+1234
+$3D0DEAD
+$CAFEBABE
+
+.0
+0.0
+.5
+0.5
+1.0
+1.5
+1.00001
+3.14159265
+ +

Variable types

+
Local myVariable:Bool = True
+Local myVariable? = True
+Local myVariable:Int = 1024
+Local myVariable% = 1024
+Local myVariable:Float = 3.141516
+Local myVariable# = 3.141516
+Local myVariable:String = "Hello world"
+Local myVariable$ = "Hello world"
+ +

Full example

+
Import mojo
+
+Class MyApp Extends App
+
+    Method OnCreate()
+
+        SetUpdateRate 60
+
+    End
+
+    Method OnRender()
+
+        Local date:=GetDate()
+
+        Local months:=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
+
+        Local day:=("0"+date[2])[-2..]
+        Local month:=months[date[1]-1]
+        Local year:=date[0]
+        Local hour:=("0"+date[3])[-2..]
+        Local min:=("0"+date[4])[-2..]
+        Local sec:=("0"+date[5])[-2..] + "." + ("00"+date[6])[-3..]
+
+        Local now:=hour+":"+min+":"+sec+"  "+day+" "+month+" "+year
+
+        Cls
+        DrawText now,DeviceWidth/2,DeviceHeight/2,.5,.5
+    End
+
+End
+
+Function Main()
+
+    New MyApp
+
+End
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-n4js.html b/docs/_style/prism-master/examples/prism-n4js.html new file mode 100644 index 00000000..19e5a6d5 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-n4js.html @@ -0,0 +1,114 @@ +

Keywords

+

+class C {..}
+interface I {..}
+
+foo(c: C, i: I) {
+    c instanceof C; // ok
+    c instanceof I; // ok
+}
+
+ +

Annotations

+

+// Final Methods
+@Final
+private tasks = new Map<string,Task>();
+
+// Redefinition of Members
+@Override
+public async size(): int {
+  …
+}
+
+// Dependency Injection
+@Binder
+@Bind(Storage,StorageInMemory)
+class InMemoryBinder {}
+
+@GenerateInjector @UseBinder(InMemoryBinder)
+export public class TaskManagerTest {
+  …
+}
+
+ +

Full example

+

+// A Web User Interface in HTML
+// NOTE: requires full example project bundled with N4JS IDE to run.
+
+import { TaskManager } from "TaskManager";
+import {Application, Response } from "express";
+import express from "express";
+import { Todo } from "model";
+
+
+export class WebUI {
+
+     private app: Application;
+
+     @Inject
+     private manager: TaskManager;
+
+     public start() {
+
+          this.app = express();
+
+          this.app.get('/', async (req, res) => {
+               let page = await this.renderHomePage();
+               res.send(page);
+          });
+
+          this.app.get("/clear", async (req, res) => {
+               await this.manager.clear();
+               redirect(res, '/');
+          });
+
+          this.app.get("/create", async (req, res) => {
+               let values = req.query as ~Object with {type: string, label: string};
+               if (values && values.type === 'Todo' && values.label && values.label.length > 0) {
+                    await this.manager.createTodo(values.label);
+               }
+               redirect(res, '/');
+          });
+
+          this.app.listen(4000, '0.0.0.0', 511, function() {
+               console.log("HTML server listening on http://localhost:4000/");
+          });
+     }
+
+     protected async renderHomePage(): string {
+          let tasks = await this.manager.getTasks();
+          let todos = tasks.filter((task) => task instanceof Todo);
+          return `
+
+<html>
+<body>
+     Your to-do's:
+     <ul>
+     ${
+          todos.length === 0 ? '<li><em>none</em></li>\n'
+          : todos.map((task) =>
+               '<li>' + task.label + ' <small>(id: ' + task.id + ')</small></li>'
+          ).join('\n')
+     }
+     </ul>
+     <hr/>
+     <form action="/create" method="get">
+     <input type="hidden" name="type" value="Todo">
+     Label: <input type="text" name="label"><br>
+     <input type="submit" value="Create Todo">
+     </form>
+     <hr/>
+     <a href="/clear">[Clear All]</a>
+</body>
+</html>
+`;
+     }
+}
+
+function redirect(res: Response, url: string) {
+     res.header('Cache-Control', 'no-cache');
+     res.redirect(301, url);
+}
+
diff --git a/docs/_style/prism-master/examples/prism-nasm.html b/docs/_style/prism-master/examples/prism-nasm.html new file mode 100644 index 00000000..c1b7c926 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nasm.html @@ -0,0 +1,74 @@ +

Comments

+
; This is a comment
+ +

Labels

+
label1:     ; a non-local label
+.local:     ; this is really label1.local
+..@foo:     ; this is a special symbol
+label2:     ; another non-local label
+.local:     ; this is really label2.local
+
+ +

Registers

+
st0
+st1
+ax
+rax
+zmm4
+ +

Strings

+

+mov eax,'abcd'
+
+db    'hello'               ; string constant
+db    'h','e','l','l','o'   ; equivalent character constants
+dd    'ninechars'           ; doubleword string constant
+dd    'nine','char','s'     ; becomes three doublewords
+db    'ninechars',0,0,0     ; and really looks like this
+
+db `\u263a`            ; UTF-8 smiley face
+db `\xe2\x98\xba`      ; UTF-8 smiley face
+db 0E2h, 098h, 0BAh    ; UTF-8 smiley face
+
+ +

Numbers

+
mov     ax,200          ; decimal
+mov     ax,0200         ; still decimal
+mov     ax,0200d        ; explicitly decimal
+mov     ax,0d200        ; also decimal
+mov     ax,0c8h         ; hex
+mov     ax,$0c8         ; hex again: the 0 is required
+mov     ax,0xc8         ; hex yet again
+mov     ax,0hc8         ; still hex
+mov     ax,310q         ; octal
+mov     ax,310o         ; octal again
+mov     ax,0o310        ; octal yet again
+mov     ax,0q310        ; octal yet again
+mov     ax,11001000b    ; binary
+
+db    -0.2                    ; "Quarter precision"
+dw    -0.5                    ; IEEE 754r/SSE5 half precision
+dd    1.2                     ; an easy one
+dd    0x1p+2                  ; 1.0x2^2 = 4.0
+dq    0x1p+32                 ; 1.0x2^32 = 4 294 967 296.0
+dq    1.e10                   ; 10 000 000 000.0
+dq    1.e+10                  ; synonymous with 1.e10
+dq    1.e-10                  ; 0.000 000 000 1
+dt    3.141592653589793238462 ; pi
+do    1.e+4000                ; IEEE 754r quad precision
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Numbers with underscores

+
mov     ax,1100_1000b
+mov     ax,1100_1000y
+mov     ax,0b1100_1000
+mov     ax,0y1100_1000
+
+dd    1.222_222_222
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-nginx.html b/docs/_style/prism-master/examples/prism-nginx.html new file mode 100644 index 00000000..49d14664 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nginx.html @@ -0,0 +1,25 @@ +

Comments

+
# This is a comment
+ +

Variables

+
fastcgi_param SERVER_NAME $server_name;
+ +

Server Block

+

+server { # simple reverse-proxy
+  listen       80;
+  server_name  domain2.com www.domain2.com;
+  access_log   logs/domain2.access.log  main;
+  
+  # serve static files
+  
+  location ~ ^/(images|javascript|js|css|flash|media|static)/  {
+    root    /var/www/virtual/big.server.com/htdocs;
+    expires 30d;
+  }
+
+  # pass requests for dynamic content to rails/turbogears/zope, et al
+  location / {
+    proxy_pass      http://127.0.0.1:8080;
+  }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-nim.html b/docs/_style/prism-master/examples/prism-nim.html new file mode 100644 index 00000000..c6611259 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nim.html @@ -0,0 +1,222 @@ +

Comments

+
# This is a comment
+ +

Strings

+
"This is a string."
+"This is a string with \"quotes\" in it."
+"""This is
+a "multi-line"
+string."""
+""""A long string within quotes.""""
+R"This is a raw string."
+r"Some ""quotes"" inside a raw string."
+r"""Raw strings
+can also be multi-line."""
+foo"This is a generalized raw string literal."
+bar"""This is also
+a generalized raw string literal."""
+ +

Characters

+
'a'
+'\''
+'\t'
+'\15'
+'\xFC'
+ +

Numbers

+
42
+0xaf
+0xf_2_c
+0o07
+0b1111_0000
+0B0_10001110100_0000101001000111101011101111111011000101001101001001'f64
+9_000'u
+32.
+32.1f32
+32.e-5
+32.2e+2
+2'i16
+2i16
+0xfe'f32
+ +

Full example

+
# Example from http://nim-by-example.github.io/oop_macro/
+import macros
+
+macro class*(head: expr, body: stmt): stmt {.immediate.} =
+  # The macro is immediate so that it doesn't
+  # resolve identifiers passed to it
+
+  var typeName, baseName: NimNode
+
+  if head.kind == nnkIdent:
+    # `head` is expression `typeName`
+    # echo head.treeRepr
+    # --------------------
+    # Ident !"Animal"
+    typeName = head
+
+  elif head.kind == nnkInfix and $head[0] == "of":
+    # `head` is expression `typeName of baseClass`
+    # echo head.treeRepr
+    # --------------------
+    # Infix
+    #   Ident !"of"
+    #   Ident !"Animal"
+    #   Ident !"RootObj"
+    typeName = head[1]
+    baseName = head[2]
+
+  else:
+    quit "Invalid node: " & head.lispRepr
+
+  # echo treeRepr(body)
+  # --------------------
+  # StmtList
+  #   VarSection
+  #     IdentDefs
+  #       Ident !"name"
+  #       Ident !"string"
+  #       Empty
+  #     IdentDefs
+  #       Ident !"age"
+  #       Ident !"int"
+  #       Empty
+  #   MethodDef
+  #     Ident !"vocalize"
+  #     Empty
+  #     Empty
+  #     FormalParams
+  #       Ident !"string"
+  #     Empty
+  #     Empty
+  #     StmtList
+  #       StrLit ...
+  #   MethodDef
+  #     Ident !"age_human_yrs"
+  #     Empty
+  #     Empty
+  #     FormalParams
+  #       Ident !"int"
+  #     Empty
+  #     Empty
+  #     StmtList
+  #       DotExpr
+  #         Ident !"this"
+  #         Ident !"age"
+
+  # create a new stmtList for the result
+  result = newStmtList()
+
+  # var declarations will be turned into object fields
+  var recList = newNimNode(nnkRecList)
+
+  # Iterate over the statements, adding `this: T`
+  # to the parameters of functions
+  for node in body.children:
+    case node.kind:
+
+      of nnkMethodDef, nnkProcDef:
+        # inject `this: T` into the arguments
+        let p = copyNimTree(node.params)
+        p.insert(1, newIdentDefs(ident"this", typeName))
+        node.params = p
+        result.add(node)
+
+      of nnkVarSection:
+        # variables get turned into fields of the type.
+        for n in node.children:
+          recList.add(n)
+
+      else:
+        result.add(node)
+
+  # The following prints out the AST structure:
+  #
+  # import macros
+  # dumptree:
+  #   type X = ref object of Y
+  #     z: int
+  # --------------------
+  # TypeSection
+  #   TypeDef
+  #     Ident !"X"
+  #     Empty
+  #     RefTy
+  #       ObjectTy
+  #         Empty
+  #         OfInherit
+  #           Ident !"Y"
+  #         RecList
+  #           IdentDefs
+  #             Ident !"z"
+  #             Ident !"int"
+  #             Empty
+
+  result.insert(0,
+    if baseName == nil:
+      quote do:
+        type `typeName` = ref object of RootObj
+    else:
+      quote do:
+        type `typeName` = ref object of `baseName`
+  )
+  # Inspect the tree structure:
+  #
+  # echo result.treeRepr
+  # --------------------
+  # StmtList
+  #   StmtList
+  #     TypeSection
+  #       TypeDef
+  #         Ident !"Animal"
+  #         Empty
+  #         RefTy
+  #           ObjectTy
+  #             Empty
+  #             OfInherit
+  #               Ident !"RootObj"
+  #             Empty   <= We want to replace this
+  #   MethodDef
+  #   ...
+
+  result[0][0][0][2][0][2] = recList
+
+  # Lets inspect the human-readable version of the output
+  # echo repr(result)
+  # Output:
+  #  type
+  #    Animal = ref object of RootObj
+  #      name: string
+  #      age: int
+  #
+  #  method vocalize(this: Animal): string =
+  #    "..."
+  #
+  #  method age_human_yrs(this: Animal): int =
+  #    this.age
+
+# ---
+
+class Animal of RootObj:
+  var name: string
+  var age: int
+  method vocalize: string = "..."
+  method age_human_yrs: int = this.age # `this` is injected
+
+class Dog of Animal:
+  method vocalize: string = "woof"
+  method age_human_yrs: int = this.age * 7
+
+class Cat of Animal:
+  method vocalize: string = "meow"
+
+# ---
+
+var animals: seq[Animal] = @[]
+animals.add(Dog(name: "Sparky", age: 10))
+animals.add(Cat(name: "Mitten", age: 10))
+
+for a in animals:
+  echo a.vocalize()
+  echo a.age_human_yrs()
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-nix.html b/docs/_style/prism-master/examples/prism-nix.html new file mode 100644 index 00000000..90157769 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nix.html @@ -0,0 +1,46 @@ +

Comments

+
#
+# Single line comment
+/* Multi-line
+comment */
+ +

String

+
""
+"foo\"bar"
+"foo
+bar"
+
+''''
+''foo'''bar''
+''
+foo
+bar
+''
+ +

String interpolation

+
"foo${42}bar"
+"foo\${42}bar" # This is not interpolated
+''foo${42}bar''
+''foo''${42}bar'' # This is not interpolated
+ +

URLs and paths

+
ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz
+http://example.org/foo.tar.bz2
+/bin/sh
+./builder.sh
+~/foo.bar
+ +

Integers, booleans and null

+
0
+42
+
+true
+false
+
+null
+ +

Builtin functions

+
name = baseNameOf (toString url);
+imap =
+	if builtins ? genList then
+		f: list: genList (n: f (n + 1) (elemAt list n)) (length list)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-nsis.html b/docs/_style/prism-master/examples/prism-nsis.html new file mode 100644 index 00000000..193791bb --- /dev/null +++ b/docs/_style/prism-master/examples/prism-nsis.html @@ -0,0 +1,18 @@ +

Comments

+
; Single line comment
+# Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+ +

Variables

+
LicenseLangString myLicenseData ${LANG_ENGLISH} "bigtest.nsi"
+LicenseData $(myLicenseData)
+StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2
+ +

Compiler commands

+
!define VERSION "1.0.3"
+!insertmacro MyFunc ""
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-objectivec.html b/docs/_style/prism-master/examples/prism-objectivec.html new file mode 100644 index 00000000..025a8d71 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-objectivec.html @@ -0,0 +1,44 @@ +

Full example

+
#import <UIKit/UIKit.h>
+#import "Dependency.h"
+
+@protocol WorldDataSource
+@optional
+- (NSString*)worldName;
+@required
+- (BOOL)allowsToLive;
+@end
+
+@interface Test : NSObject <HelloDelegate, WorldDataSource> {
+  NSString *_greeting;
+}
+
+@property (nonatomic, readonly) NSString *greeting;
+- (IBAction) show;
+@end
+
+@implementation Test
+
+@synthesize test=_test;
+
++ (id) test {
+  return [self testWithGreeting:@"Hello, world!\nFoo bar!"];
+}
+
++ (id) testWithGreeting:(NSString*)greeting {
+  return [[[self alloc] initWithGreeting:greeting] autorelease];
+}
+
+- (id) initWithGreeting:(NSString*)greeting {
+  if ( (self = [super init]) ) {
+    _greeting = [greeting retain];
+  }
+  return self;
+}
+
+- (void) dealloc {
+  [_greeting release];
+  [super dealloc];
+}
+
+@end
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-ocaml.html b/docs/_style/prism-master/examples/prism-ocaml.html new file mode 100644 index 00000000..0534b1d1 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ocaml.html @@ -0,0 +1,59 @@ +

Comments

+
(* Simple comment *)
+(* Multi-line
+comment *)
+ +

Numbers

+
42
+3.14159
+42.
+2.4E+2
+10_452_102
+0xf4 0xff_10_41
+0o427
+0b1100_1111_0000
+ +

Strings and characters

+
"Simple string."
+"String with \"quotes\" in it."
+'c' `c`
+'\'' `\``
+'\123' `\123`
+'\xf4'
+ +

Full example

+
module Make_interval(Endpoint : Comparable) = struct
+
+    type t = | Interval of Endpoint.t * Endpoint.t
+             | Empty
+
+    (** [create low high] creates a new interval from [low] to
+        [high].  If [low > high], then the interval is empty *)
+    let create low high =
+      if Endpoint.compare low high > 0 then Empty
+      else Interval (low,high)
+
+    (** Returns true iff the interval is empty *)
+    let is_empty = function
+      | Empty -> true
+      | Interval _ -> false
+
+    (** [contains t x] returns true iff [x] is contained in the
+        interval [t] *)
+    let contains t x =
+      match t with
+      | Empty -> false
+      | Interval (l,h) ->
+        Endpoint.compare x l >= 0 && Endpoint.compare x h <= 0
+
+    (** [intersect t1 t2] returns the intersection of the two input
+        intervals *)
+    let intersect t1 t2 =
+      let min x y = if Endpoint.compare x y <= 0 then x else y in
+      let max x y = if Endpoint.compare x y >= 0 then x else y in
+      match t1,t2 with
+      | Empty, _ | _, Empty -> Empty
+      | Interval (l1,h1), Interval (l2,h2) ->
+        create (max l1 l2) (min h1 h2)
+
+  end ;;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-opencl.html b/docs/_style/prism-master/examples/prism-opencl.html new file mode 100644 index 00000000..f901230b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-opencl.html @@ -0,0 +1,83 @@ +

+ To use this language, use the class "language-opencl" for OpenCL kernel code. + Host code is automatically highlighted in "language-c" + respectively "language-cpp" classes. +

+ +

OpenCL host code

+
// OpenCL functions, constants, etc. are also highlighted in OpenCL host code in the c or cpp language
+cl::Event KernelFilterImages::runSingle(const cl::Image2D& imgSrc, SPImage2D& imgDst)
+{
+	const size_t rows = imgSrc.getImageInfo();
+	const size_t cols = imgSrc.getImageInfo();
+
+	ASSERT(rows > 0 && cols > 0, "The image object seems to be invalid, no rows/cols set");
+	ASSERT(imgSrc.getImageInfo().image_channel_data_type == CL_FLOAT, "Only float type images are supported");
+	ASSERT(imgSrc.getInfo() == CL_MEM_READ_ONLY || imgSrc.getInfo() == CL_MEM_READ_WRITE, "Can't read the input image");
+
+	imgDst = std::make_shared(*context, CL_MEM_READ_WRITE, cl::ImageFormat(CL_R, CL_FLOAT), cols, rows);
+
+	cl::Kernel kernel(*program, "filter_single");
+	kernel.setArg(0, imgSrc);
+	kernel.setArg(1, *imgDst);
+	kernel.setArg(2, bufferKernel1);
+	kernel.setArg(3, kernel1.rows);
+	kernel.setArg(4, kernel1.rows / 2);
+	kernel.setArg(5, kernel1.cols);
+	kernel.setArg(6, kernel1.cols / 2);
+	kernel.setArg(7, border);
+
+	cl::Event eventFilter;
+	const cl::NDRange global(cols, rows);
+	queue->enqueueNDRangeKernel(kernel, cl::NullRange, global, cl::NullRange, &events, &eventFilter);
+}
+ +

OpenCL kernel code

+
// CLK_ADDRESS_CLAMP_TO_EDGE = aaa|abcd|ddd
+constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
+typedef float type_single;
+
+type_single filter_sum_single_3x3(read_only image2d_t imgIn,
+                                  constant float* filterKernel,
+                                  const int2 coordBase,
+                                  const int border)
+{
+    type_single sum = (type_single)(0.0f);
+    const int rows = get_image_height(imgIn);
+    const int cols = get_image_width(imgIn);
+    int2 coordCurrent;
+    int2 coordBorder;
+    float color;
+
+    // Image patch is row-wise accessed
+    // Filter kernel is centred in the middle
+    #pragma unroll
+    for (int y = -ROWS_HALF_3x3; y <= ROWS_HALF_3x3; ++y)       // Start at the top left corner of the filter
+    {
+        coordCurrent.y = coordBase.y + y;
+        #pragma unroll
+        for (int x = -COLS_HALF_3x3; x <= COLS_HALF_3x3; ++x)   // And end at the bottom right corner
+        {
+            coordCurrent.x = coordBase.x + x;
+            coordBorder = borderCoordinate(coordCurrent, rows, cols, border);
+            color = read_imagef(imgIn, sampler, coordBorder).x;
+
+            const int idx = (y + ROWS_HALF_3x3) * COLS_3x3 + x + COLS_HALF_3x3;
+            sum += color * filterKernel[idx];
+        }
+    }
+
+    return sum;
+}
+
+kernel void filter_single_3x3(read_only image2d_t imgIn,
+                              write_only image2d_t imgOut,
+                              constant float* filterKernel,
+                              const int border)
+{
+    int2 coordBase = (int2)(get_global_id(0), get_global_id(1));
+
+    type_single sum = filter_sum_single_3x3(imgIn, filterKernel, coordBase, border);
+
+    write_imagef(imgOut, coordBase, sum);
+}
diff --git a/docs/_style/prism-master/examples/prism-oz.html b/docs/_style/prism-master/examples/prism-oz.html new file mode 100644 index 00000000..d70ec2ed --- /dev/null +++ b/docs/_style/prism-master/examples/prism-oz.html @@ -0,0 +1,89 @@ +

Comments

+
%
+% Foobar
+
+/* Foo
+bar */
+ +

Strings

+
""
+"Foo \"bar\" baz"
+ +

Numbers

+
0
+42
+0154
+0xBadFace
+0B0101
+3.14159
+2e8
+3.E~7
+4.8E12
+&0
+&a
+&\n
+&\124
+ +

Functions and procedures

+
proc {Max X Y Z}
+{Browse Z}
+f(M Y)
+ +

Full example

+
proc {DisMember X Ys}
+   dis Ys = X|_ [] Yr in Ys = _|Yr {DisMember X Yr} end
+end
+
+class DataBase from BaseObject
+   attr d
+   meth init
+      d := {NewDictionary}
+   end
+   meth dic($) @d end
+   meth tell(I)
+      case {IsFree I.1} then
+         raise database(nonground(I)) end
+      else
+         Is = {Dictionary.condGet @d I.1 nil} in
+         {Dictionary.put @d I.1 {Append Is [I]}}
+      end
+   end
+   meth ask(I)
+      case {IsFree I} orelse {IsFree I.1} then
+         {DisMember I {Flatten {Dictionary.items @d}}}
+      else
+         {DisMember I {Dictionary.condGet @d I.1 nil}}
+      end
+   end
+   meth entries($)
+      {Dictionary.entries @d}
+   end
+end
+
+declare
+proc {Dynamic ?Pred}
+   Pred = {New DataBase init}
+end
+proc {Assert P I}
+   {P tell(I)}
+end
+proc {Query P I}
+   {P ask(I)}
+end
+
+EdgeP = {Dynamic}
+{ForAll
+[edge(1 2)
+ edge(2 1)   % Cycle
+ edge(2 3)
+ edge(3 4)
+ edge(2 5)
+ edge(5 6)
+ edge(4 6)
+ edge(6 7)
+ edge(6 8)
+ edge(1 5)
+ edge(5 1)  % Cycle
+]
+proc {$ I} {Assert EdgeP I} end
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-parigp.html b/docs/_style/prism-master/examples/prism-parigp.html new file mode 100644 index 00000000..029302bc --- /dev/null +++ b/docs/_style/prism-master/examples/prism-parigp.html @@ -0,0 +1,20 @@ +

Comments

+
\\ Single line comment
+/* Multi line
+comment */
+ +

Strings

+
""
+"Foo \"bar\" baz"
+ +

Numbers

+
0.
+42
+3 . 14 15 9
+5.2 E +12
+.89
+ +

Ignored whitespaces

+
p r i n t ("hello")
+if err(1/i, E, print (E))
+a + = b \ / c
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-parser.html b/docs/_style/prism-master/examples/prism-parser.html new file mode 100644 index 00000000..4b4e9c0d --- /dev/null +++ b/docs/_style/prism-master/examples/prism-parser.html @@ -0,0 +1,88 @@ +

Comments

+
$foo[bar] # Some comment
+ +

Variables and functions

+
@navigation[]
+$sections[^table::load[sections.cfg]]
+$sections.uri
+ +

Literals

+
$foo(3+$bar)
+^switch[$sMode]{
+	^case[def]{$result(true)}
+}
+^if(in "/news/"){}
+ +

Escape sequences

+
^^
+^"
+^;
+ +

Embedded in markup

+
<nav>
+	<ul>
+	^sections.menu{
+		<li>
+			<a href="$sections.uri">$sections.name</a>
+		</li>
+	}
+	</ul>
+</nav>
+ +

Full example

+
@CLASS
+MyTable
+
+@create[uParam]
+^switch[$uParam.CLASS_NAME]{
+   ^case[string;void]{$t[^table::create{$uParam}]}
+   ^case[table;MyTable]{$t[^table::create[$uParam]]}
+   ^case[DEFAULT]{^throw[MyTable;Unsupported type $uParam.CLASS_NAME]}
+}
+
+# method will return value in different calling contexts
+@GET[sMode]
+^switch[$sMode]{
+   ^case[table]{$result[$t]}
+   ^case[bool]{$result($t!=0)}
+   ^case[def]{$result(true)}
+   ^case[expression;double]{$result($t)}
+   ^case[DEFAULT]{^throw[MyTable;Unsupported mode '$sMode']}
+}
+
+
+# method will handle access to the "columns"
+@GET_DEFAULT[sName]
+$result[$t.$sName]
+
+
+# wrappers for all existing methods are required
+@count[]
+^t.count[]
+
+@menu[jCode;sSeparator]
+^t.menu{$jCode}[$sSeparator]
+
+
+# new functionality
+@remove[iOffset;iLimit]
+$iLimit(^iLimit.int(0))
+$t[^t.select(^t.offset[]<$iOffset || ^t.offset[]>=$iOffset+$iLimit)]
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Code block starting with a comment

+
# Doesn't work
+# Does work
+
 # Does work when prefixed with a space
+ +

Comments inside expressions break literals and operators

+
^if(
+    $age>=4  # not too young
+    && $age<=80  # and not too old
+)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-pascal.html b/docs/_style/prism-master/examples/prism-pascal.html new file mode 100644 index 00000000..dfea11a6 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-pascal.html @@ -0,0 +1,65 @@ +

Comments

+
(* This is an
+old style comment *)
+{ This is a
+Turbo Pascal comment }
+// This is a Delphi comment.
+ +

Strings and characters

+
'This is a pascal string'
+''
+'a'
+^G
+#7
+#$f4
+'A tabulator character: '#9' is easy to embed'
+ +

Numbers

+
123
+123.456
+132.456e-789
+132.456e+789
+$7aff
+&17
+%11110101
+ +

Full example

+
Type
+    Str25    = String[25];
+    TBookRec = Record
+                Title, Author,
+                ISBN  : Str25;
+                Price : Real;
+               End;
+
+Procedure EnterNewBook(var newBook : TBookRec);
+Begin
+ Writeln('Please enter the book details: ');
+ Write('Book Name: ');
+ Readln(newBook.Title);
+ Write('Author: ');
+ Readln(newBook.Author);
+ Write('ISBN: ');
+ Readln(newBook.ISBN);
+ Write('Price: ');
+ Readln(newBook.Price);
+End;
+
+Var
+    bookRecArray : Array[1..10] of TBookRec;
+    i            : 1..10;
+
+Begin
+ For i := 1 to 10 do
+  EnterNewBook(bookRecArray[i]);
+ Writeln('Thanks for entering the book details');
+ Write('Now choose a record to display from 1 to 10: ');
+ Readln(i);
+ Writeln('Here are the book details of record #',i,':');
+ Writeln;
+ Writeln('Title:  ', bookRecArray[i].Title);
+ Writeln('Author: ', bookRecArray[i].Author);
+ Writeln('ISBN:   ', bookRecArray[i].ISBN);
+ Writeln('Price:  ', bookRecArray[i].Price);
+ Readln;
+End.
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-perl.html b/docs/_style/prism-master/examples/prism-perl.html new file mode 100644 index 00000000..85c36815 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-perl.html @@ -0,0 +1,71 @@ +

Comments

+
# Single line comment
+=head1 Here There
+	Be Pods!
+=cut
+ +

Strings

+
q/foo bar baz/;
+q awhy not ?a;
+qw(foo bar baz) q{foo bar baz}
+q[foo bar baz] qq<foo bar baz>
+"foo bar baz" 'foo bar baz' `foo bar baz`
+ +

Regex

+
m/foo/ s/foo/bar/
+m zfooz s zfoozbarz
+qr(foo) m{foo} s(foo)(bar) s{foo}{bar}
+m[foo] m<foo> tr[foo][bar] s<foo><bar>
+/foo/i
+
+ +

Variables

+
${^POSTMATCH}
+$^V
+$element_count = scalar(@whatever);
+keys(%users) = 1000;
+$1, $_, %!;
+ +

Numbers

+
12345
+12345.67
+.23E-10 # a very small number
+3.14_15_92 # a very important number
+4_294_967_296 # underscore for legibility
+0xff # hex
+0xdead_beef # more hex
+0377 # octal (only numbers, begins with 0)
+0b011011 # binary
+ +

Full example

+
sub read_config_file {
+  my ($class, $filename) = @_;
+
+  unless (defined $filename) {
+    my $home  = File::HomeDir->my_home || '.';
+    $filename = File::Spec->catfile($home, '.pause');
+
+    return {} unless -e $filename and -r _;
+  }
+
+  my %conf;
+  if ( eval { require Config::Identity } ) {
+    %conf = Config::Identity->load($filename);
+    $conf{user} = delete $conf{username} unless $conf{user};
+  }
+  else { # Process .pause manually
+    open my $pauserc, '<', $filename
+      or die "can't open $filename for reading: $!";
+
+    while (<$pauserc>) {
+      chomp;
+      next unless $_ and $_ !~ /^\s*#/;
+
+      my ($k, $v) = /^\s*(\w+)\s+(.+)$/;
+      Carp::croak "multiple enties for $k" if $conf{$k};
+      $conf{$k} = $v;
+    }
+  }
+
+  return \%conf;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-php.html b/docs/_style/prism-master/examples/prism-php.html new file mode 100644 index 00000000..1a25589c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-php.html @@ -0,0 +1,67 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+# Shell-like comment
+ +

Strings

+
'foo \'bar\' baz'
+"foo \"bar\" baz"
+"a string # containing an hash"
+$foo = <<<FOO
+    Heredoc strings are supported too!
+FOO;
+$bar = <<<'BAR'
+    And also Nowdoc strings
+BAR;
+ +

Variables

+
$some_var = 5;
+$otherVar = "Some text";
+$null = null;
+$false = false;
+ +

Functions

+
$json = json_encode($my_object);
+$array1 = array("a" => "green", "red", "blue", "red");
+$array2 = array("b" => "green", "yellow", "red");
+$result = array_diff($array1, $array2);
+ +

Constants

+
define('MAXSIZE', 42);
+echo MAXSIZE;
+json_decode($json, false, 512, JSON_BIGINT_AS_STRING)
+ +

PHP 5.3+ support

+
namespace my\name;
+$c = new \my\name\MyClass;
+$arr = [1,2,3];
+trait ezcReflectionReturnInfo {
+    function getReturnType() { /*1*/ }
+    function getReturnDescription() { /*2*/ }
+}
+function gen_one_to_three() {
+    for ($i = 1; $i <= 3; $i++) {
+        // Note that $i is preserved between yields.
+        yield $i;
+    }
+}
+ +

PHP embedded in HTML

+
<div class="<?php echo $a ? 'foo' : 'bar'; ?>">
+<?php if($var < 42) {
+    echo "Something";
+} else {
+    echo "Something else";
+} ?>
+</div>
+ +

String interpolation

+
$str = "This is $great!";
+$foobar = "Another example: {${$foo->bar()}}";
+$a = <<<FOO
+    Hello $world!
+FOO;
+$b = <<<"FOOBAR"
+    Interpolation inside Heredoc strings {$obj->values[3]->name}
+FOOBAR;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-plsql.html b/docs/_style/prism-master/examples/prism-plsql.html new file mode 100644 index 00000000..2212b14e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-plsql.html @@ -0,0 +1,40 @@ +

Comments

+
-- Single line comment
+/* Multi-line
+comment */
+ +

Operators

+
l_message  := 'Hello ' || place_in;
+ +

Keywords

+
CREATE OR REPLACE PROCEDURE
+hello_place (place_in IN VARCHAR2)
+IS
+  l_message  VARCHAR2 (100);
+BEGIN
+  l_message  := 'Hello ' || place_in;
+  DBMS_OUTPUT.put_line (l_message);
+END hello_place;
+
+DECLARE
+  l_dept_id
+  employees.department_id%TYPE := 10;
+BEGIN
+  DELETE FROM employees
+       WHERE department_id = l_dept_id;
+
+  DBMS_OUTPUT.put_line (SQL%ROWCOUNT);
+END;
+
+DECLARE
+  l_message   VARCHAR2 (100) := 'Hello';
+  l_message2  VARCHAR2 (100) := ' World!';
+BEGIN
+  IF SYSDATE >= TO_DATE ('01-JAN-2011')
+  THEN
+    l_message2 := l_message || l_message2;
+    DBMS_OUTPUT.put_line (l_message2);
+  ELSE
+    DBMS_OUTPUT.put_line (l_message);
+  END IF;
+END;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-powershell.html b/docs/_style/prism-master/examples/prism-powershell.html new file mode 100644 index 00000000..e5dba2e0 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-powershell.html @@ -0,0 +1,19 @@ +

Comments

+
# This is a comment
+<# This is a
+multi-line comment #>
+ +

Variable Interpolation

+
$Name = "Alice"
+Write-Host "Hello, my name is $Name."
+ +

Full Example

+
Function SayHello([string]$name) {
+    Write-Host "Hello, $name."
+}
+$Names = @("Bob", "Alice")
+
+$Names | ForEach {
+    SayHello $_
+}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-processing.html b/docs/_style/prism-master/examples/prism-processing.html new file mode 100644 index 00000000..3c74ba3b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-processing.html @@ -0,0 +1,173 @@ +

Full example

+
// Processing implementation of Game of Life by Joan Soler-Adillon
+// from https://processing.org/examples/gameoflife.html
+
+// Size of cells
+int cellSize = 5;
+
+// How likely for a cell to be alive at start (in percentage)
+float probabilityOfAliveAtStart = 15;
+
+// Variables for timer
+int interval = 100;
+int lastRecordedTime = 0;
+
+// Colors for active/inactive cells
+color alive = color(0, 200, 0);
+color dead = color(0);
+
+// Array of cells
+int[][] cells; 
+// Buffer to record the state of the cells and use this while changing the others in the interations
+int[][] cellsBuffer; 
+
+// Pause
+boolean pause = false;
+
+void setup() {
+  size (640, 360);
+
+  // Instantiate arrays 
+  cells = new int[width/cellSize][height/cellSize];
+  cellsBuffer = new int[width/cellSize][height/cellSize];
+
+  // This stroke will draw the background grid
+  stroke(48);
+
+  noSmooth();
+
+  // Initialization of cells
+  for (int x=0; x<width/cellSize; x++) {
+    for (int y=0; y<height/cellSize; y++) {
+      float state = random (100);
+      if (state > probabilityOfAliveAtStart) { 
+        state = 0;
+      }
+      else {
+        state = 1;
+      }
+      cells[x][y] = int(state); // Save state of each cell
+    }
+  }
+  background(0); // Fill in black in case cells don't cover all the windows
+}
+
+
+void draw() {
+
+  //Draw grid
+  for (int x=0; x<width/cellSize; x++) {
+    for (int y=0; y<height/cellSize; y++) {
+      if (cells[x][y]==1) {
+        fill(alive); // If alive
+      }
+      else {
+        fill(dead); // If dead
+      }
+      rect (x*cellSize, y*cellSize, cellSize, cellSize);
+    }
+  }
+  // Iterate if timer ticks
+  if (millis()-lastRecordedTime>interval) {
+    if (!pause) {
+      iteration();
+      lastRecordedTime = millis();
+    }
+  }
+
+  // Create  new cells manually on pause
+  if (pause && mousePressed) {
+    // Map and avoid out of bound errors
+    int xCellOver = int(map(mouseX, 0, width, 0, width/cellSize));
+    xCellOver = constrain(xCellOver, 0, width/cellSize-1);
+    int yCellOver = int(map(mouseY, 0, height, 0, height/cellSize));
+    yCellOver = constrain(yCellOver, 0, height/cellSize-1);
+
+    // Check against cells in buffer
+    if (cellsBuffer[xCellOver][yCellOver]==1) { // Cell is alive
+      cells[xCellOver][yCellOver]=0; // Kill
+      fill(dead); // Fill with kill color
+    }
+    else { // Cell is dead
+      cells[xCellOver][yCellOver]=1; // Make alive
+      fill(alive); // Fill alive color
+    }
+  } 
+  else if (pause && !mousePressed) { // And then save to buffer once mouse goes up
+    // Save cells to buffer (so we opeate with one array keeping the other intact)
+    for (int x=0; x<width/cellSize; x++) {
+      for (int y=0; y<height/cellSize; y++) {
+        cellsBuffer[x][y] = cells[x][y];
+      }
+    }
+  }
+}
+
+
+
+void iteration() { // When the clock ticks
+  // Save cells to buffer (so we opeate with one array keeping the other intact)
+  for (int x=0; x<width/cellSize; x++) {
+    for (int y=0; y<height/cellSize; y++) {
+      cellsBuffer[x][y] = cells[x][y];
+    }
+  }
+
+  // Visit each cell:
+  for (int x=0; x<width/cellSize; x++) {
+    for (int y=0; y<height/cellSize; y++) {
+      // And visit all the neighbours of each cell
+      int neighbours = 0; // We'll count the neighbours
+      for (int xx=x-1; xx<=x+1;xx++) {
+        for (int yy=y-1; yy<=y+1;yy++) {  
+          if (((xx>=0)&&(xx<width/cellSize))&&((yy>=0)&&(yy<height/cellSize))) { // Make sure you are not out of bounds
+            if (!((xx==x)&&(yy==y))) { // Make sure to to check against self
+              if (cellsBuffer[xx][yy]==1){
+                neighbours ++; // Check alive neighbours and count them
+              }
+            } // End of if
+          } // End of if
+        } // End of yy loop
+      } //End of xx loop
+      // We've checked the neigbours: apply rules!
+      if (cellsBuffer[x][y]==1) { // The cell is alive: kill it if necessary
+        if (neighbours < 2 || neighbours > 3) {
+          cells[x][y] = 0; // Die unless it has 2 or 3 neighbours
+        }
+      } 
+      else { // The cell is dead: make it live if necessary      
+        if (neighbours == 3 ) {
+          cells[x][y] = 1; // Only if it has 3 neighbours
+        }
+      } // End of if
+    } // End of y loop
+  } // End of x loop
+} // End of function
+
+void keyPressed() {
+  if (key=='r' || key == 'R') {
+    // Restart: reinitialization of cells
+    for (int x=0; x<width/cellSize; x++) {
+      for (int y=0; y<height/cellSize; y++) {
+        float state = random (100);
+        if (state > probabilityOfAliveAtStart) {
+          state = 0;
+        }
+        else {
+          state = 1;
+        }
+        cells[x][y] = int(state); // Save state of each cell
+      }
+    }
+  }
+  if (key==' ') { // On/off of pause
+    pause = !pause;
+  }
+  if (key=='c' || key == 'C') { // Clear all
+    for (int x=0; x<width/cellSize; x++) {
+      for (int y=0; y<height/cellSize; y++) {
+        cells[x][y] = 0; // Save all to zero
+      }
+    }
+  }
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-prolog.html b/docs/_style/prism-master/examples/prism-prolog.html new file mode 100644 index 00000000..b231bcae --- /dev/null +++ b/docs/_style/prism-master/examples/prism-prolog.html @@ -0,0 +1,44 @@ +

Comments

+
% This is a comment
+/* This is a
+multi-line comment */
+ +

Numbers

+
42
+3.1415
+ +

Strings

+
"This is a string."
+"This is a string \
+on multiple lines."
+"A string with \"quotes\" in it."
+"Another string with ""quotes"" in it."
+ +

Example

+
:- dynamic fibo/2.
+fibo(0, 1). fibo(1, 1).
+fibo(N, F) :-
+N >= 2, N1 is N - 1, N2 is N - 2,
+fibo(N1, F1), fibo(N2, F2), F is F1 + F2,
+assert(fibo(N,F):-!). % assert as first clause
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Null-ary predicates are not highlighted

+
halt.
+trace.
+
+:- if(test1).
+section_1.
+:- elif(test2).
+section_2.
+:- elif(test3).
+section_3.
+:- else.
+section_else.
+:- endif.
diff --git a/docs/_style/prism-master/examples/prism-properties.html b/docs/_style/prism-master/examples/prism-properties.html new file mode 100644 index 00000000..bbc81f99 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-properties.html @@ -0,0 +1,9 @@ +

Comments

+
# This is a comment
+! This is a comment too
+ +

Properties

+
some_key some_value
+some\ key\ with\ spaces : some value
+some_key = some \
+multiline value
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-pug.html b/docs/_style/prism-master/examples/prism-pug.html new file mode 100644 index 00000000..d37de5ca --- /dev/null +++ b/docs/_style/prism-master/examples/prism-pug.html @@ -0,0 +1,85 @@ +

Comments

+
// Some
+  multiline
+  comment !
+
+// This is a comment
+But this is not
+ +

Doctype

+
doctype html
+doctype 1.1
+doctype html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN"
+ +

Tags

+
ul
+  li Item A
+  li Item B
+  li Item C
+foo(bar='baz')/
+input(type='checkbox', checked=true.toString())
+#content
+div#foo(data-bar="foo")&attributes({'data-foo': 'bar'})
+ +

Markup

+
<div class="foo bar"></div>
+ +

Control flow

+
#user
+  if user.description
+    p.description= user.description
+  else if authorised
+    p.description.
+      User has no description,
+      why not add one...
+  else
+    p.description User has no description
+ul
+  each val in [1, 2, 3, 4, 5]
+    li= val
+case friends
+  when 0
+    p you have no friends
+  when 1
+    p you have a friend
+  default
+    p you have #{friends} friends
+
+ +

Inline JavaScript

+
script alert('test');
+script(type="text/javascript").
+  alert('foo');
+  alert('bar');
+- var classes = ['foo', 'bar', 'baz']
+- for (var x = 0; x < 3; x++)
+  li item
+
+ +

Keywords

+
include ./includes/head.pug
+extends ./layout.pug
+block content
+append head
+ +

Mixins

+
mixin list
+  ul
+    li foo
+    li bar
+    li baz
++list
+mixin pet(name)
+  li.pet= name
+ul
+  +pet('cat')
+  +pet('dog')
+
+ +

Filters

+

Filters require the desired language to be loaded. +On this page, check CoffeeScript before checking Pug should make +the example below work properly.

+
script
+  :coffee
+    console.log 'This is coffee script'
diff --git a/docs/_style/prism-master/examples/prism-puppet.html b/docs/_style/prism-master/examples/prism-puppet.html new file mode 100644 index 00000000..4892ab89 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-puppet.html @@ -0,0 +1,152 @@ +

Comments

+
#
+# Foobar
+/* Foo
+bar */
+ +

Strings and interpolation

+
'foo \'bar\' baz'
+"$foo \"bar\" ${baz}"
+
+@(FOOBAR) # Unquoted heredoc string
+Foo bar baz
+FOOBAR
+
+@("BARBAZ"/$L) # Quoted heredoc string
+	$foo bar ${baz}
+	|-BARBAZ
+ +

Regular expressions

+
if $host =~ /^www(\d+)\./ {}
+$foo = /foo
+	bar # Extended regexes can include comments
+baz/x
+ +

Variables

+
$foo
+$::foobar
+$foo::bar::baz
+ +

Functions

+
require apache
+template('apache/vhost-default.conf.erb')
+[1,20,3].filter |$value| { $value < 10 }
+ +

All-in-one example

+
file {'ntp.conf':
+  path    => '/etc/ntp.conf',
+  ensure  => file,
+  content => template('ntp/ntp.conf'),
+  owner   => 'root',
+  mode    => '0644',
+}
+package {'ntp':
+  ensure => installed,
+  before => File['ntp.conf'],
+}
+service {'ntpd':
+  ensure    => running,
+  subscribe => File['ntp.conf'],
+}
+Package['ntp'] -> File['ntp.conf'] ~> Service['ntpd']
+
+$package_list = ['ntp', 'apache2', 'vim-nox', 'wget']
+$myhash = { key => { subkey => 'b' }}
+
+include ntp
+require ntp
+class {'ntp':}
+
+define apache::vhost ($port, $docroot, $servername = $title, $vhost_name = '*') {
+  include apache
+  include apache::params
+  $vhost_dir = $apache::params::vhost_dir
+  file { "${vhost_dir}/${servername}.conf":
+      content => template('apache/vhost-default.conf.erb'),
+      owner   => 'www',
+      group   => 'www',
+      mode    => '644',
+      require => Package['httpd'],
+      notify  => Service['httpd'],
+  }
+}
+
+apache::vhost {'homepages':
+  port    => 8081,
+  docroot => '/var/www-testhost',
+}
+Apache::Vhost['homepages']
+
+node 'www1.example.com' {
+  include common
+  include apache
+  include squid
+}
+node /^www\d+$/ {
+  include common
+}
+
+# comment
+/* comment */
+
+if $is_virtual {
+  warning( 'Tried to include class ntp on virtual machine; this node may be misclassified.' )
+}
+elsif $operatingsystem == 'Darwin' {
+  warning( 'This NTP module does not yet work on our Mac laptops.' )
+else {
+  include ntp
+}
+
+if $hostname =~ /^www(\d+)\./ {
+  notify { "Welcome web server $1": }
+}
+
+case $operatingsystem {
+  'Solaris':          { include role::solaris }
+  'RedHat', 'CentOS': { include role::redhat  }
+  /^(Debian|Ubuntu)$/:{ include role::debian  }
+  default:            { include role::generic }
+}
+$rootgroup = $osfamily ? {
+    'Solaris'          => 'wheel',
+    /(Darwin|FreeBSD)/ => 'wheel',
+    default            => 'root',
+}
+
+User <| groups == 'admin' |>
+Concat::Fragment <<| tag == "bacula-storage-dir-${bacula_director}" |>>
+
+Exec <| title == 'update_migrations' |> {
+  environment => 'RUBYLIB=/usr/lib/ruby/site_ruby/1.8/',
+}
+
+@user {'deploy':
+  uid     => 2004,
+  comment => 'Deployment User',
+  group   => www-data,
+  groups  => ["enterprise"],
+  tag     => [deploy, web],
+}
+
+@@nagios_service { "check_zfs${hostname}":
+  use                 => 'generic-service',
+  host_name           => "$fqdn",
+  check_command       => 'check_nrpe_1arg!check_zfs',
+  service_description => "check_zfs${hostname}",
+  target              => '/etc/nagios3/conf.d/nagios_service.cfg',
+  notify              => Service[$nagios::params::nagios_service],
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

More than one level of nested braces inside interpolation

+
"Foobar ${foo({
+    bar => {baz => 42}
+    baz => 42
+})} <- broken"
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-pure.html b/docs/_style/prism-master/examples/prism-pure.html new file mode 100644 index 00000000..d7a0129b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-pure.html @@ -0,0 +1,115 @@ +

Comments

+
#! shebang
+// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"This is a string."
+"This is a string with \"quotes\" in it."
+ +

Numbers

+
4711
+4711L
+1.2e-3
+.14
+1000
+0x3e8
+01750
+0b1111101000
+inf
+nan
+ +

Inline code

+

Inline code requires the desired language to be loaded. +On this page, check C, C++ and Fortran before checking Pure should make +the examples below work properly.

+
%<
+int mygcd(int x, int y)
+{
+  if (y == 0)
+    return x;
+  else
+    return mygcd(y, x%y);
+}
+%>
+
+%< -*- Fortran90 -*-
+function fact(n) result(p)
+  integer n, p
+  p = 1
+  do i = 1, n
+     p = p*i
+  end do
+end function fact
+%>
+
+%< -*- C++ -*-
+
+#include <pure/runtime.h>
+#include <string>
+#include <map>
+
+// An STL map mapping strings to Pure expressions.
+
+using namespace std;
+typedef map<string,pure_expr*> exprmap;
+
+// Since we can't directly deal with C++ classes in Pure, provide some C
+// functions to create, destroy and manipulate these objects.
+
+extern "C" exprmap *map_create()
+{
+  return new exprmap;
+}
+
+extern "C" void map_add(exprmap *m, const char *key, pure_expr *x)
+{
+  exprmap::iterator it = m->find(string(key));
+  if (it != m->end()) pure_free(it->second);
+  (*m)[key] = pure_new(x);
+}
+
+extern "C" void map_del(exprmap *m, const char *key)
+{
+  exprmap::iterator it = m->find(key);
+  if (it != m->end()) {
+    pure_free(it->second);
+    m->erase(it);
+  }
+}
+
+extern "C" pure_expr *map_get(exprmap *m, const char *key)
+{
+  exprmap::iterator it = m->find(key);
+  return (it != m->end())?it->second:0;
+}
+
+extern "C" pure_expr *map_keys(exprmap *m)
+{
+  size_t i = 0, n = m->size();
+  pure_expr **xs = new pure_expr*[n];
+  for (exprmap::iterator it = m->begin(); it != m->end(); ++it)
+    xs[i++] = pure_string_dup(it->first.c_str());
+  pure_expr *x = pure_listv(n, xs);
+  delete[] xs;
+  return x;
+}
+
+extern "C" void map_destroy(exprmap *m)
+{
+  for (exprmap::iterator it = m->begin(); it != m->end(); ++it)
+    pure_free(it->second);
+  delete m;
+}
+
+%>
+ +

Example

+
queens n       = catch reverse (search n 1 []) with
+  search n i p = throw p if i>n;
+               = void [search n (i+1) ((i,j):p) | j = 1..n; safe (i,j) p];
+  safe (i,j) p = ~any (check (i,j)) p;
+  check (i1,j1) (i2,j2)
+               = i1==i2 || j1==j2 || i1+j1==i2+j2 || i1-j1==i2-j2;
+end;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-python.html b/docs/_style/prism-master/examples/prism-python.html new file mode 100644 index 00000000..ce6efc00 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-python.html @@ -0,0 +1,61 @@ +

Comments

+
# This is a comment
+# -*- coding: <encoding-name> -*-
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+""" "Multi-line" strings
+are supported."""
+''' 'Multi-line' strings
+are supported.'''
+ +

Numbers

+
7
+2147483647
+0o177
+0b100110111
+3
+79228162514264337593543950336
+0o377
+0x100000000
+0xdeadbeef
+3.14
+10.
+.001
+1e100
+3.14e-10
+0e0
+3.14j
+10.j
+10j
+.001j
+1e100j
+3.14e-10j
+
+ +

Full example

+
def median(pool):
+    '''Statistical median to demonstrate doctest.
+    >>> median([2, 9, 9, 7, 9, 2, 4, 5, 8])
+    7
+    '''
+    copy = sorted(pool)
+    size = len(copy)
+    if size % 2 == 1:
+        return copy[(size - 1) / 2]
+    else:
+        return (copy[size/2 - 1] + copy[size/2]) / 2
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Interpolation expressions containing strings with { or }

+
f"{'}'}"
diff --git a/docs/_style/prism-master/examples/prism-q.html b/docs/_style/prism-master/examples/prism-q.html new file mode 100644 index 00000000..58d674f4 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-q.html @@ -0,0 +1,112 @@ +

Comments

+
foo / This is a comment
+/ This is a comment too
+
+/
+Some multi-line
+comment here
+\
+
+\
+This comment will
+continue until the
+end of code
+ +

Character data and strings

+
"q"
+"\""
+"\\"
+"\142"
+"foo bar baz"
+ +

Symbols

+
`
+`q
+`zaphod
+`:198.162.0.2:5042
+`:www.yourco.com:5042
+`.new
+ +

Numbers

+
42
+b:-123h
+c:1234567890j
+pi:3.14159265
+float1:1f
+r:1.4142e
+2.0
+4.00e
+f:1.23456789e-10
+r:1.2345678e-10e
+bit:0b
+byte:0x2a
+a:42
+bit:1b
+
+0w 0n 0W 0Wh 0Wj
+ +

Dates

+
d:2006.07.04
+t:09:04:59.000
+dt:2006.07.04T09:04:59.000
+mon:2006.07m
+mm:09:04
+sec:09:04:59
+d:2006.07.04
+
+0Nm 0Nd 0Nz 0Nu 0Nv 0Wd 0Wt 0Wz
+ +

Verbs

+
99+L
+x<42|x>98
+(x<42)|x>98
+42~(4 2;(1 0))
+(4 2)~(4; 2*1)
+ +

Adverbs

+
" ," ,/: ("Now";"is";"the";"time")
+L1,/:\:L2
+0+/10 20 30
+(1#) each 1001 1002 1004 1003
+ +

Built-in functions and q-sql

+
string 42
+L1 cross L2
+type c
+select from t where price=(max;price) fby ([]sym;ex)
+ungroup `p xgroup sp
+`instrument insert (`g; `$"Google"; `$"Internet")
+ +

Example

+
/ Example from http://code.kx.com/wiki/Cookbook/CorporateActions
+getCAs:{[caTypes]
+    / handles multiplie corporate actions on one date
+    t:0!select factor:prd factor by date-1,sym from ca where caType in caTypes;
+    t,:update date:1901.01.01,factor:1.0 from ([]sym:distinct t`sym);
+    t:`date xasc t;
+    t:update factor:reverse prds reverse 1 rotate factor by sym from t;
+    :update `g#sym from 0!t;
+  };
+
+adjust:{[t;caTypes]
+    t:0!t;
+    factors:enlist 1.0^aj[`sym`date;([] date:t`date;sym:t`sym);getCAs caTypes]`factor;
+    mc:c where (lower c:cols t) like "*price"; / find columns to multiply
+    dc:c where lower[c] like "*size"; / find columns to divide
+    :![t;();0b;(mc,dc)!((*),/:mc,\:factors),((%),/:dc,\:factors)]; / multiply or divide out the columns
+  };
+
+/ get the adjustment factors considering all corporate actions
+getCAs exec distinct caType from ca
+
+adjust[t;`dividend] / adjust trades for dividends only
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

The global context is highlighted as a verb

+
\d .
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-qore.html b/docs/_style/prism-master/examples/prism-qore.html new file mode 100644 index 00000000..710e1614 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-qore.html @@ -0,0 +1,962 @@ +

Full example

+
#!/usr/bin/env qore
+
+# database test script
+# databases users must be able to create and destroy tables and procedures, etc
+# in order to execute all tests
+
+%require-our
+%enable-all-warnings
+
+our ($o, $errors, $test_count);
+
+const opts =
+	( "help"    : "h,help",
+	  "host"    : "H,host=s",
+	  "pass"    : "p,pass=s",
+	  "db"      : "d,db=s",
+	  "user"    : "u,user=s",
+	  "type"    : "t,type=s",
+	  "enc"     : "e,encoding=s",
+	  "verbose" : "v,verbose:i+",
+	  "leave"   : "l,leave"
+ );
+
+sub usage()
+{
+	printf("usage: %s [options]
+ -h,--help          this help text
+ -u,--user=ARG      set username
+ -p,--pass=ARG      set password
+ -d,--db=ARG        set database name
+ -e,--encoding=ARG  set database character set encoding (i.e. \"utf8\")
+ -H,--host=ARG      set hostname (for MySQL and PostgreSQL connections)
+ -t,--type          set database driver (default mysql)
+ -v,--verbose       more v's = more information
+ -l,--leave         leave test tables in schema at end\n",
+	   basename($ENV."_"));
+	exit();
+}
+
+const object_map =
+ ( "oracle" :
+   ( "tables" : ora_tables ),
+   "mysql"  :
+   ( "tables" : mysql_tables ),
+   "pgsql"  :
+   ( "tables" : pgsql_tables ),
+   "sybase" :
+   ( "tables" : syb_tables,
+	 "procs"  : sybase_procs ),
+   "freetds"  :
+   ( "tables" : freetds_sybase_tables,
+	 "procs"  : sybase_procs ) );
+
+const ora_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar2(80) not null
+)",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar2(250) not null,
+   dob date not null
+)",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar2(80) not null,
+   value varchar2(160) not null
+)" );
+
+const mysql_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null
+) type = innodb",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob date not null
+) type = innodb",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null
+) type = innodb" );
+
+const pgsql_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null )",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob date not null )",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null)",
+	"data_test" : "create table data_test (
+		int2_f smallint not null,
+		int4_f integer not null,
+		int8_f int8 not null,
+		bool_f boolean not null,
+
+		float4_f real not null,
+		float8_f double precision not null,
+
+		number_f numeric(16,3) not null,
+		money_f money not null,
+
+		text_f text not null,
+		varchar_f varchar(40) not null,
+		char_f char(40) not null,
+		name_f name not null,
+
+		date_f date not null,
+		abstime_f abstime not null,
+		reltime_f reltime not null,
+		interval_f interval not null,
+		time_f time not null,
+		timetz_f time with time zone not null,
+		timestamp_f timestamp not null,
+		timestamptz_f timestamp with time zone not null,
+		tinterval_f tinterval not null,
+
+		bytea_f bytea not null
+		--bit_f bit(11) not null,
+		--varbit_f bit varying(11) not null
+)" );
+
+const syb_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null
+)",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob date not null
+)",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null
+)",
+	"data_test" : "create table data_test (
+	null_f char(1) null,
+
+	varchar_f varchar(40) not null,
+	char_f char(40) not null,
+	unichar_f unichar(40) not null,
+	univarchar_f univarchar(40) not null,
+	text_f text not null,
+	unitext_f unitext not null, -- note that unitext is stored as 'image'
+
+		bit_f bit not null,
+	tinyint_f tinyint not null,
+	smallint_f smallint not null,
+	int_f int not null,
+		int_f2 int not null,
+
+	decimal_f decimal(10,4) not null,
+
+	float_f float not null,     -- 8-bytes
+	real_f real not null,       -- 4-bytes
+	money_f money not null,
+	smallmoney_f smallmoney not null,
+
+	date_f date not null,
+	time_f time not null,
+	datetime_f datetime not null,
+	smalldatetime_f smalldatetime not null,
+
+	binary_f binary(4) not null,
+	varbinary_f varbinary(4) not null,
+	image_f image not null
+)" );
+
+const sybase_procs = (
+	"find_family" :
+"create procedure find_family @name varchar(80)
+as
+select * from family where name = @name
+commit -- to maintain transaction count
+",
+	"get_values" :
+"create procedure get_values @string varchar(80) output, @int int output
+as
+select @string = 'hello there'
+select @int = 150
+commit -- to maintain transaction count
+",
+	"get_values_and_select" :
+"create procedure get_values_and_select @string varchar(80) output, @int int output
+as
+select @string = 'hello there'
+select @int = 150
+select * from family where family_id = 1
+commit -- to maintain transaction count
+",
+	"get_values_and_multiple_select" :
+"create procedure get_values_and_multiple_select @string varchar(80) output, @int int output
+as
+select @string = 'hello there'
+select @int = 150
+select * from family where family_id = 1
+select * from people where person_id = 1
+commit -- to maintain transaction count
+",
+	"just_select" :
+"create procedure just_select
+as
+select * from family where family_id = 1
+commit -- to maintain transaction count
+",
+	"multiple_select" :
+"create procedure multiple_select
+as
+select * from family where family_id = 1
+select * from people where person_id = 1
+commit -- to maintain transaction count
+"
+ );
+
+const freetds_sybase_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null
+)",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob date not null
+)",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null
+)",
+	"data_test" : "create table data_test (
+	null_f char(1) null,
+
+	varchar_f varchar(40) not null,
+	char_f char(40) not null,
+	text_f text not null,
+	unitext_f unitext not null, -- note that unitext is stored as 'image'
+
+		bit_f bit not null,
+	tinyint_f tinyint not null,
+	smallint_f smallint not null,
+	int_f int not null,
+		int_f2 int not null,
+
+	decimal_f decimal(10,4) not null,
+
+	float_f float not null,     -- 8-bytes
+	real_f real not null,       -- 4-bytes
+	money_f money not null,
+	smallmoney_f smallmoney not null,
+
+	date_f date not null,
+	time_f time not null,
+	datetime_f datetime not null,
+	smalldatetime_f smalldatetime not null,
+
+	binary_f binary(4) not null,
+	varbinary_f varbinary(4) not null,
+	image_f image not null
+)" );
+
+const freetds_mssql_tables = (
+	"family" : "create table family (
+   family_id int not null,
+   name varchar(80) not null
+)",
+	"people" : "create table people (
+   person_id int not null,
+   family_id int not null,
+   name varchar(250) not null,
+   dob datetime not null
+)",
+	"attributes" : "create table attributes (
+   person_id int not null,
+   attribute varchar(80) not null,
+   value varchar(160) not null
+)",
+	"data_test" : "create table data_test (
+	null_f char(1) null,
+
+	varchar_f varchar(40) not null,
+	char_f char(40) not null,
+	text_f text not null,
+
+		bit_f bit not null,
+	tinyint_f tinyint not null,
+	smallint_f smallint not null,
+	int_f int not null,
+		int_f2 int not null,
+
+	decimal_f decimal(10,4) not null,
+
+	float_f float not null,     -- 8-bytes
+	real_f real not null,       -- 4-bytes
+	money_f money not null,
+	smallmoney_f smallmoney not null,
+
+	datetime_f datetime not null,
+	smalldatetime_f smalldatetime not null,
+
+	binary_f binary(4) not null,
+	varbinary_f varbinary(4) not null,
+	image_f image not null
+)" );
+
+sub parse_command_line()
+{
+	my $g = new GetOpt(opts);
+	$o = $g.parse(\$ARGV);
+	if ($o.help)
+	usage();
+
+	if (!strlen($o.db))
+	{
+	stderr.printf("set the login parameters with -u,-p,-d, etc (-h for help)\n");
+	exit(1);
+	}
+	if (elements $ARGV)
+	{
+	stderr.printf("excess arguments on command-line (%n): -h for help\n", $ARGV);
+	exit(1);
+	}
+	if (!strlen($o.type))
+	$o.type = "mysql";
+}
+
+sub create_datamodel($db)
+{
+	drop_test_datamodel($db);
+
+	my $driver = $db.getDriverName();
+	# create tables
+	my $tables = object_map.$driver.tables;
+	if ($driver == "freetds")
+	if ($db.is_sybase)
+		$tables = freetds_sybase_tables;
+		else
+		$tables = freetds_mssql_tables;
+
+	foreach my $table in (keys $tables)
+	{
+	tprintf(2, "creating table %n\n", $table);
+	$db.exec($tables.$table);
+	}
+
+	# create procedures if any
+	foreach my $proc in (keys object_map.$driver.procs)
+	{
+	tprintf(2, "creating procedure %n\n", $proc);
+	$db.exec(object_map.$driver.procs.$proc);
+	}
+
+	# create functions if any
+	foreach my $func in (keys object_map.$driver.funcs)
+	{
+	tprintf(2, "creating function %n\n", $func);
+	$db.exec(object_map.$driver.funcs.$func);
+	}
+
+	$db.exec("insert into family values ( 1, 'Smith' )");
+	$db.exec("insert into family values ( 2, 'Jones' )");
+
+	# we insert the dates here using binding by value so we don't have
+	# to worry about each database's specific date format
+	$db.exec("insert into people values ( 1, 1, 'Arnie', %v)", 1983-05-13);
+	$db.exec("insert into people values ( 2, 1, 'Sylvia', %v)", 1994-11-10);
+	$db.exec("insert into people values ( 3, 1, 'Carol', %v)", 2003-07-23);
+	$db.exec("insert into people values ( 4, 1, 'Bernard', %v)", 1979-02-27);
+	$db.exec("insert into people values ( 5, 1, 'Isaac', %v)", 2000-04-04);
+	$db.exec("insert into people values ( 6, 2, 'Alan', %v)", 1992-06-04);
+	$db.exec("insert into people values ( 7, 2, 'John', %v)", 1995-03-23);
+
+	$db.exec("insert into attributes values ( 1, 'hair', 'blond' )");
+	$db.exec("insert into attributes values ( 1, 'eyes', 'hazel' )");
+	$db.exec("insert into attributes values ( 2, 'hair', 'blond' )");
+	$db.exec("insert into attributes values ( 2, 'eyes', 'blue' )");
+	$db.exec("insert into attributes values ( 3, 'hair', 'brown' )");
+	$db.exec("insert into attributes values ( 3, 'eyes', 'grey')");
+	$db.exec("insert into attributes values ( 4, 'hair', 'brown' )");
+	$db.exec("insert into attributes values ( 4, 'eyes', 'brown' )");
+	$db.exec("insert into attributes values ( 5, 'hair', 'red' )");
+	$db.exec("insert into attributes values ( 5, 'eyes', 'green' )");
+	$db.exec("insert into attributes values ( 6, 'hair', 'black' )");
+	$db.exec("insert into attributes values ( 6, 'eyes', 'blue' )");
+	$db.exec("insert into attributes values ( 7, 'hair', 'brown' )");
+	$db.exec("insert into attributes values ( 7, 'eyes', 'brown' )");
+	$db.commit();
+}
+
+sub drop_test_datamodel($db)
+{
+	my $driver = $db.getDriverName();
+	# drop the tables and ignore exceptions
+	# the commits are needed for databases like postgresql, where errors will prohibit and further
+	# actions from being taken on the Datasource
+	foreach my $table in (keys object_map.$driver.tables)
+	try {
+		$db.exec("drop table " + $table);
+		$db.commit();
+		tprintf(2, "dropped table %n\n", $table);
+	}
+		catch ()
+	{
+		$db.commit();
+	}
+
+	# drop procedures and ignore exceptions
+	foreach my $proc in (keys object_map.$driver.procs)
+	{
+	my $cmd = object_map.$driver.drop_proc_cmd;
+	if (!exists $cmd)
+		$cmd = "drop procedure";
+	try {
+		$db.exec($cmd + " " + $proc);
+		$db.commit();
+		tprintf(2, "dropped procedure %n\n", $proc);
+	}
+	catch ()
+	{
+		$db.commit();
+	}
+	}
+
+	# drop functions and ignore exceptions
+	foreach my $func in (keys object_map.$driver.funcs)
+	{
+	my $cmd = object_map.$driver.drop_func_cmd;
+	if (!exists $cmd)
+		$cmd = "drop function";
+	try {
+		$db.exec($cmd + " " + $func);
+		$db.commit();
+		tprintf(2, "dropped function %n\n", $func);
+	}
+	catch ()
+	{
+		$db.commit();
+	}
+	}
+}
+
+sub getDS()
+{
+	my $ds = new Datasource($o.type, $o.user, $o.pass, $o.db, $o.enc);
+	if (strlen($o.host))
+	$ds.setHostName($o.host);
+	return $ds;
+}
+
+sub tprintf($v, $msg)
+{
+	if ($v <= $o.verbose)
+	vprintf($msg, $argv);
+}
+
+sub test_value($v1, $v2, $msg)
+{
+	++$test_count;
+	if ($v1 == $v2)
+	tprintf(1, "OK: %s test\n", $msg);
+	else
+	{
+		tprintf(0, "ERROR: %s test failed! (%n != %n)\n", $msg, $v1, $v2);
+		$errors++;
+	}
+}
+
+const family_hash = (
+  "Jones" : (
+	  "people" : (
+	  "John" : (
+		  "dob" : 1995-03-23,
+		  "eyes" : "brown",
+		  "hair" : "brown" ),
+	  "Alan" : (
+		  "dob" : 1992-06-04,
+		  "eyes" : "blue",
+		  "hair" : "black" ) ) ),
+	"Smith" : (
+	"people" : (
+		"Arnie" : (
+		"dob" : 1983-05-13,
+		"eyes" : "hazel",
+		"hair" : "blond" ),
+		"Carol" : (
+		"dob" : 2003-07-23,
+		"eyes" : "grey",
+		"hair" : "brown" ),
+		"Isaac" : (
+		"dob" : 2000-04-04,
+		"eyes" : "green",
+		"hair" : "red" ),
+		"Bernard" : (
+		"dob" : 1979-02-27,
+		"eyes" : "brown",
+		"hair" : "brown" ),
+		"Sylvia" : (
+		"dob" : 1994-11-10,
+		"eyes" : "blue",
+		"hair" : "blond" ) ) ) );
+
+sub context_test($db)
+{
+	# first we select all the data from the tables and then use
+	# context statements to order the output hierarchically
+
+	# context statements are most useful when a set of queries can be executed once
+	# and the results processed many times by creating "views" with context statements
+
+	my $people = $db.select("select * from people");
+	my $attributes = $db.select("select * from attributes");
+
+	my $today = format_date("YYYYMMDD", now());
+
+	# in this test, we create a big hash structure out of the queries executed above
+	# and compare it at the end to the expected result
+
+	# display each family sorted by family name
+	my $fl;
+	context family ($db.select("select * from family")) sortBy (%name)
+	{
+	my $pl;
+	tprintf(2, "Family %d: %s\n", %family_id, %name);
+
+	# display people, sorted by eye color, descending
+	context people ($people)
+		sortDescendingBy (find %value in $attributes
+				  where (%attribute == "eyes"
+					 && %person_id == %people:person_id))
+		where (%family_id == %family:family_id)
+	{
+		my $al;
+		tprintf(2, "  %s, born %s\n", %name, format_date("Month DD, YYYY", %dob));
+		context ($attributes) sortBy (%attribute) where (%person_id == %people:person_id)
+		{
+		$al.%attribute = %value;
+		tprintf(2, "    has %s %s\n", %value, %attribute);
+		}
+		# leave out the ID fields and name from hash under name; subtracting a
+		# string from a hash removes that key from the result
+		# this is "doing it the hard way", there is only one key left,
+		# "dob", then attributes are added directly into the person hash
+		$pl.%name = %% - "family_id" - "person_id" - "name" + $al;
+	}
+	# leave out family_id and name fields (leaving an empty hash)
+	$fl.%name = %% - "family_id" - "name" + ( "people" : $pl );
+	}
+
+	# test context ordering
+	test_value(keys $fl, ("Jones", "Smith"), "first context");
+	test_value(keys $fl.Smith.people, ("Arnie", "Carol", "Isaac", "Bernard", "Sylvia"), "second context");
+	# test entire context value
+	test_value($fl, family_hash, "third context");
+}
+
+
+sub test_timeout($db, $c)
+{
+	$db.setTransactionLockTimeout(1ms);
+	try {
+	# this should cause a TRANSACTION-LOCK-TIMEOUT exception to be thrown
+	$db.exec("insert into family values (3, 'Test')\n");
+	test_value(True, False, "transaction timeout");
+	$db.exec("delete from family where name = 'Test'");
+	}
+	catch ($ex)
+	{
+	test_value(True, True, "transaction timeout");
+	}
+	# signal parent thread to continue
+	$c.dec();
+}
+
+sub transaction_test($db)
+{
+	my $ndb = getDS();
+	my $r;
+	tprintf(2, "db.autocommit=%N, ndb.autocommit=%N\n", $db.getAutoCommit(), $ndb.getAutoCommit());
+
+	# first, we insert a new row into "family" but do not commit it
+	my $rows = $db.exec("insert into family values (3, 'Test')\n");
+	if ($rows !== 1)
+	printf("FAILED INSERT, rows=%N\n", $rows);
+
+	# now we verify that the new row is not visible to the other datasource
+	# unless it's a sybase/ms sql server datasource, in which case this would deadlock :-(
+	if ($o.type != "sybase" && $o.type != "freetds")
+	{
+	$r = $ndb.selectRow("select name from family where family_id = 3").name;
+	test_value($r, NOTHING, "first transaction");
+	}
+
+	# now we verify that the new row is visible to the inserting datasource
+	$r = $db.selectRow("select name from family where family_id = 3").name;
+	test_value($r, "Test", "second transaction");
+
+	# test datasource timeout
+	# this Counter variable will allow the parent thread to sleep
+	# until the child thread times out
+	my $c = new Counter(1);
+	background test_timeout($db, $c);
+
+	# wait for child thread to time out
+	$c.waitForZero();
+
+	# now, we commit the transaction
+	$db.commit();
+
+	# now we verify that the new row is visible in the other datasource
+	$r = $ndb.selectRow("select name from family where family_id = 3").name;
+	test_value($r, "Test", "third transaction");
+
+	# now we delete the row we inserted (so we can repeat the test)
+	$r = $ndb.exec("delete from family where family_id = 3");
+	test_value($r, 1, "delete row count");
+	$ndb.commit();
+}
+
+sub oracle_test()
+{
+}
+
+# here we use a little workaround for modules that provide functions,
+# namespace additions (constants, classes, etc) needed by test functions
+# at parse time.  To avoid parse errors (as database modules are loaded
+# in this script at run-time when the Datasource class is instantiated)
+# we use a Program object that we parse and run on demand to return the
+# value required
+sub get_val($code)
+{
+	my $p = new Program();
+
+	my $str = sprintf("return %s;", $code);
+	$p.parse($str, "code");
+	return $p.run();
+}
+
+sub pgsql_test($db)
+{
+	my $args = ( "int2_f"          : 258,
+		 "int4_f"          : 233932,
+		 "int8_f"          : 239392939458,
+		 "bool_f"          : True,
+		 "float4_f"        : 21.3444,
+		 "float8_f"        : 49394.23423491,
+		 "number_f"        : get_val("pgsql_bind(PG_TYPE_NUMERIC, '7235634215.3250')"),
+		 "money_f"         : get_val("pgsql_bind(PG_TYPE_CASH, \"400.56\")"),
+		 "text_f"          : 'some text  ',
+		 "varchar_f"       : 'varchar ',
+		 "char_f"          : 'char text',
+		 "name_f"          : 'name',
+		 "date_f"          : 2004-01-05,
+		 "abstime_f"       : 2005-12-03T10:00:01,
+		 "reltime_f"       : 5M + 71D + 19h + 245m + 51s,
+		 "interval_f"      : 6M + 3D + 2h + 45m + 15s,
+		 "time_f"          : 11:35:00,
+		 "timetz_f"        : get_val("pgsql_bind(PG_TYPE_TIMETZ, \"11:38:21 CST\")"),
+		 "timestamp_f"     : 2005-04-01T11:35:26,
+		 "timestamptz_f"   : 2005-04-01T11:35:26.259,
+		 "tinterval_f"     : get_val("pgsql_bind(PG_TYPE_TINTERVAL, '[\"May 10, 1947 23:59:12\" \"Jan 14, 1973 03:14:21\"]')"),
+		 "bytea_f"         : <bead>
+		 #bit_f             :
+		 #varbit_f          :
+	);
+
+	$db.vexec("insert into data_test values (%v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v)", hash_values($args));
+
+	my $q = $db.selectRow("select * from data_test");
+	if ($o.verbose > 1)
+	foreach my $k in (keys $q)
+		tprintf(2, " %-16s= %-10s %N\n", $k, type($q.$k), $q.$k);
+
+	# fix values where we know the return type is different
+	$args.money_f = 400.56;
+	$args.timetz_f = 11:38:21;
+	$args.tinterval_f = '["1947-05-10 21:59:12" "1973-01-14 02:14:21"]';
+	$args.number_f = "7235634215.3250";
+	$args.reltime_f = 19177551s;
+	$args.interval_f = 6M + 3D + 9915s;
+
+	# rounding errors can happen in float4
+	$q.float4_f = round($q.float4_f);
+	$args.float4_f = round($args.float4_f);
+
+	# remove values where we know they won't match
+	# abstime and timestamptz are converted to GMT by the server
+	delete $q.abstime_f;
+	delete $q.timestamptz_f;
+
+	# compare each value
+	foreach my $k in (keys $q)
+	test_value($q.$k, $args.$k, sprintf("%s bind and retrieve", $k));
+
+	$db.commit();
+}
+
+sub mysql_test()
+{
+}
+
+const family_q = ( "family_id" : 1,
+		   "name" : "Smith" );
+const person_q = ( "person_id" : 1,
+		   "family_id" : 1,
+		   "name" : "Arnie",
+		   "dob" : 1983-05-13 );
+const params = ( "string" : "hello there",
+		 "int" : 150 );
+
+sub sybase_test($db)
+{
+	# simple stored proc test, bind by name
+	my $x = $db.exec("exec find_family %v", "Smith");
+	test_value($x, ("name": list("Smith"), "family_id" : list(1)), "simple stored proc");
+
+	# stored proc execute with output params
+	$x = $db.exec("declare @string varchar(40), @int int
+exec get_values :string output, :int output");
+	test_value($x, params + ("rowcount":1), "get_values");
+
+	# we use Datasource::selectRows() in the following queries because we
+	# get hash results instead of a hash of lists as with exec in the queries
+	# normally we should not use selectRows to execute a stored procedure,
+	# as the Datasource::selectRows() method will not grab the transaction lock,
+	# but we already called Datasource::exec() above, so we have it already.
+	# the other alternative would be to call Datasource::beginTransaction() before
+	# Datasource::selectRows()
+
+	# simple stored proc test, bind by name, returns hash
+	$x = $db.selectRows("exec find_family %v", "Smith");
+	test_value($x, family_q, "simple stored proc");
+
+	# stored proc execute with output params and select results
+	$x = $db.selectRows("declare @string varchar(40), @int int
+exec get_values_and_select :string output, :int output");
+	test_value($x, ("query":family_q,"params":params), "get_values_and_select");
+
+	# stored proc execute with output params and multiple select results
+	$x = $db.selectRows("declare @string varchar(40), @int int
+exec get_values_and_multiple_select :string output, :int output");
+	test_value($x, ("query":("query0":family_q,"query1":person_q),"params":params), "get_values_and_multiple_select");
+
+	# stored proc execute with just select results
+	$x = $db.selectRows("exec just_select");
+	test_value($x, family_q, "just_select");
+
+	# stored proc execute with multiple select results
+	$x = $db.selectRows("exec multiple_select");
+	test_value($x, ("query0":family_q,"query1":person_q), "multiple_select");
+
+	my $args = ( "null_f"          : NULL,
+		 "varchar_f"       : "varchar",
+		 "char_f"          : "char",
+		 "unichar_f"       : "unichar",
+		 "univarchar_f"    : "univarchar",
+		 "text_f"          : "test",
+		 "unitext_f"       : "test",
+		 "bit_f"           : True,
+		 "tinyint_f"       : 55,
+		 "smallint_f"      : 4285,
+		 "int_f"           : 405402,
+		 "int_f2"          : 214123498,
+		 "decimal_f"       : 500.1231,
+		 "float_f"         : 23443.234324234,
+		 "real_f"          : 213.123,
+		 "money_f"         : 3434234250.2034,
+		 "smallmoney_f"    : 211100.1012,
+		 "date_f"          : 2007-05-01,
+			 "time_f"          : 10:30:01,
+		 "datetime_f"      : 3459-01-01T11:15:02.250,
+		 "smalldatetime_f" : 2007-12-01T12:01:00,
+		 "binary_f"        : <0badbeef>,
+		 "varbinary_f"     : <feedface>,
+		 "image_f"         : <cafebead> );
+
+	# insert data
+	my $rows = $db.vexec("insert into data_test values (%v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %d, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v)", hash_values($args));
+
+	my $q = $db.selectRow("select * from data_test");
+	if ($o.verbose > 1)
+	foreach my $k in (keys $q)
+		tprintf(2, " %-16s= %-10s %N\n", $k, type($q.$k), $q.$k);
+
+	# remove values where we know they won't match
+	# unitext_f is returned as IMAGE by the server
+	delete $q.unitext_f;
+	delete $args.unitext_f;
+	# rounding errors can happen in real
+	$q.real_f = round($q.real_f);
+	$args.real_f = round($args.real_f);
+
+	# compare each value
+	foreach my $k in (keys $q)
+	test_value($q.$k, $args.$k, sprintf("%s bind and retrieve", $k));
+
+	$db.commit();
+}
+
+sub freetds_test($db)
+{
+	# simple stored proc test, bind by name
+	my $x = $db.exec("exec find_family %v", "Smith");
+	test_value($x, ("name": list("Smith"), "family_id" : list(1)), "simple stored proc");
+
+	# we cannot retrieve parameters from newer SQL Servers with the approach we use;
+	# Microsoft changed the handling of the protocol and require us to use RPC calls,
+	# this will be implemented in the next version of qore where the "freetds" driver will
+	# be able to add custom methods to the Datasource class.  For now, we skip these tests
+
+	if ($db.is_sybase)
+	{
+	$x = $db.exec("declare @string varchar(40), @int int
+exec get_values :string output, :int output");
+	test_value($x, params, "get_values");
+	}
+
+	# we use Datasource::selectRows() in the following queries because we
+	# get hash results instead of a hash of lists as with exec in the queries
+	# normally we should not use selectRows to execute a stored procedure,
+	# as the Datasource::selectRows() method will not grab the transaction lock,
+	# but we already called Datasource::exec() above, so we have it already.
+	# the other alternative would be to call Datasource::beginTransaction() before
+	# Datasource::selectRows()
+
+	# simple stored proc test, bind by name, returns hash
+	$x = $db.selectRows("exec find_family %v", "Smith");
+	test_value($x, family_q, "simple stored proc");
+
+	# stored proc execute with output params and select results
+	if ($db.is_sybase)
+	{
+	$x = $db.selectRows("declare @string varchar(40), @int int
+exec get_values_and_select :string output, :int output");
+	test_value($x, ("query":family_q,"params":params), "get_values_and_select");
+
+	# stored proc execute with output params and multiple select results
+	$x = $db.selectRows("declare @string varchar(40), @int int
+exec get_values_and_multiple_select :string output, :int output");
+	test_value($x, ("query":("query0":family_q,"query1":person_q),"params":params), "get_values_and_multiple_select");
+	}
+
+	# stored proc execute with just select results
+	$x = $db.selectRows("exec just_select");
+	test_value($x, family_q, "just_select");
+
+	# stored proc execute with multiple select results
+	$x = $db.selectRows("exec multiple_select");
+	test_value($x, ("query0":family_q,"query1":person_q), "multiple_select");
+
+	# the freetds driver does not work with the following sybase column types:
+	# unichar, univarchar
+
+	my $args = ( "null_f"          : NULL,
+		 "varchar_f"       : "test",
+		 "char_f"          : "test",
+		 "text_f"          : "test",
+		 "unitext_f"       : "test",
+		 "bit_f"           : True,
+		 "tinyint_f"       : 55,
+		 "smallint_f"      : 4285,
+		 "int_f"           : 405402,
+		 "int_f2"          : 214123498,
+		 "decimal_f"       : 500.1231,
+		 "float_f"         : 23443.234324234,
+		 "real_f"          : 213.123,
+		 "money_f"         : 3434234250.2034,
+		 "smallmoney_f"    : 211100.1012,
+		 "date_f"          : 2007-05-01,
+			 "time_f"          : 10:30:01,
+		 "datetime_f"      : 3459-01-01T11:15:02.250,
+		 "smalldatetime_f" : 2007-12-01T12:01:00,
+		 "binary_f"        : <0badbeef>,
+		 "varbinary_f"     : <feedface>,
+		 "image_f"         : <cafebead> );
+
+	# remove fields not supported by sql server
+	if (!$db.is_sybase)
+	{
+	delete $args.unitext_f;
+	delete $args.date_f;
+	delete $args.time_f;
+	}
+
+	my $sql = "insert into data_test values (";
+	for (my $i; $i < elements $args; ++$i)
+	$sql += "%v, ";
+	$sql = substr($sql, 0, -2) + ")";
+
+	# insert data, using the values from the hash above
+	my $rows = $db.vexec($sql, hash_values($args));
+
+	my $q = $db.selectRow("select * from data_test");
+	if ($o.verbose > 1)
+	foreach my $k in (keys $q)
+		tprintf(2, " %-16s= %-10s %N\n", $k, type($q.$k), $q.$k);
+
+	# remove values where we know they won't match
+	# unitext_f is returned as IMAGE by the server
+	delete $q.unitext_f;
+	delete $args.unitext_f;
+	# rounding errors can happen in real
+	$q.real_f = round($q.real_f);
+	$args.real_f = round($args.real_f);
+
+	# compare each value
+	foreach my $k in (keys $q)
+	test_value($q.$k, $args.$k, sprintf("%s bind and retrieve", $k));
+
+	$db.commit();
+}
+
+sub main()
+{
+	my $test_map =
+	( "sybase" : \sybase_test(),
+	  "freetds"  : \freetds_test(),
+	  "mysql"  : \mysql_test(),
+	  "pgsql"  : \pgsql_test(),
+	  "oracle" : \oracle_test());
+
+	parse_command_line();
+	my $db = getDS();
+
+	my $driver = $db.getDriverName();
+	printf("testing %s driver\n", $driver);
+	my $sv = $db.getServerVersion();
+	if ($o.verbose > 1)
+	tprintf(2, "client version=%n\nserver version=%n\n", $db.getClientVersion(), $sv);
+
+	# determine if the server is a sybase or sql server dataserver
+	if ($driver == "freetds")
+	if ($sv !~ /microsoft/i)
+		$db.is_sybase = True;
+
+	create_datamodel($db);
+
+	context_test($db);
+	transaction_test($db);
+	my $test = $test_map.($db.getDriverName());
+	if (exists $test)
+	$test($db);
+
+	if (!$o.leave)
+	drop_test_datamodel($db);
+	printf("%d/%d tests OK\n", $test_count - $errors, $test_count);
+}
+
+main();
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-r.html b/docs/_style/prism-master/examples/prism-r.html new file mode 100644 index 00000000..3c694189 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-r.html @@ -0,0 +1,38 @@ +

Comments

+
# This is a comment
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+ +

Full example

+
# Goal: To make a latex table with results of an OLS regression.
+
+# Get an OLS --
+x1 = runif(100)
+x2 = runif(100, 0, 2)
+y = 2 + 3*x1 + 4*x2 + rnorm(100)
+m = lm(y ~ x1 + x2)
+
+# and print it out prettily --
+library(xtable)
+# Bare --
+xtable(m)
+xtable(anova(m))
+
+# Better --
+print.xtable(xtable(m, caption="My regression",
+                    label="t:mymodel",
+                    digits=c(0,3,2,2,3)),
+             type="latex",
+             file="xtable_demo_ols.tex",
+             table.placement = "tp",
+             latex.environments=c("center", "footnotesize"))
+
+print.xtable(xtable(anova(m),
+                    caption="ANOVA of my regression",
+                    label="t:anova_mymodel"),
+             type="latex",
+             file="xtable_demo_anova.tex",
+             table.placement = "tp",
+             latex.environments=c("center", "footnotesize"))
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-reason.html b/docs/_style/prism-master/examples/prism-reason.html new file mode 100644 index 00000000..8842f24c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-reason.html @@ -0,0 +1,35 @@ +

Comments

+
/* This is a comment */
+ +

Strings and characters

+
"This is a \"string\""
+'a'
+'\\'
+'\o123'
+'\x4a'
+ +

Constructors

+
type response =
+  | Yes
+  | No
+  | PrettyMuch;
+ +

Example

+
type car = {maker: string, model: string};
+type carList =
+  | List car carList
+  | NoMore;
+
+let chevy = {maker: "Chevy", model: "Suburban"};
+let toyota = {maker: "Toyota", model: "Tacoma"};
+let myCarList = List chevy (List toyota NoMore);
+
+let hasExactlyTwoCars = fun lst =>
+  switch lst {
+    | NoMore => false                              /* 0 */
+    | List p NoMore => false                       /* 1 */
+    | List p (List p2 NoMore) => true              /* 2 */
+    | List p (List p2 (List p3 theRest)) => false  /* 3+ */
+  };
+
+let justTwo = hasExactlyTwoCars myCarList;  /* true! */
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-renpy.html b/docs/_style/prism-master/examples/prism-renpy.html new file mode 100644 index 00000000..dffac07c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-renpy.html @@ -0,0 +1,123 @@ +

Comments

+
+    # This is a comment
+
+ +

Strings

+
+    "foo \"bar\" baz"
+'foo \'bar\' baz'
+""" "Multi-line" strings
+are supported."""
+''' 'Multi-line' strings
+are supported.'''
+
+ +

Python

+
+    class Dog:
+
+    tricks = []             # mistaken use of a class variable
+
+    def __init__(self, name):
+        self.name = name
+
+    def add_trick(self, trick):
+        self.tricks.append(trick)
+
+ +

Properties

+
+    style my_text is text:
+    size 40
+    font "gentium.ttf"
+
+ +

Configuration

+
+    init -1:
+    python hide:
+
+        ## Should we enable the use of developer tools? This should be
+        ## set to False before the game is released, so the user can't
+        ## cheat using developer tools.
+
+        config.developer = True
+
+        ## These control the width and height of the screen.
+
+        config.screen_width = 800
+        config.screen_height = 600
+
+        ## This controls the title of the window, when Ren'Py is
+        ## running in a window.
+
+        config.window_title = u"The Question"
+
+ + +

Full example

+
# Declare images used by this game.
+image bg lecturehall = "lecturehall.jpg"
+image bg uni = "uni.jpg"
+image bg meadow = "meadow.jpg"
+image bg club = "club.jpg"
+
+image sylvie normal = "sylvie_normal.png"
+image sylvie giggle = "sylvie_giggle.png"
+image sylvie smile = "sylvie_smile.png"
+image sylvie surprised = "sylvie_surprised.png"
+
+image sylvie2 normal = "sylvie2_normal.png"
+image sylvie2 giggle = "sylvie2_giggle.png"
+image sylvie2 smile = "sylvie2_smile.png"
+image sylvie2 surprised = "sylvie2_surprised.png"
+
+# Define characters used by this game.
+define s = Character('Sylvie', color="#c8ffc8")
+define m = Character('Me', color="#c8c8ff")
+
+
+# The game starts here.
+label start:
+
+    $ bl_game = False
+
+    play music "illurock.ogg"
+
+    scene bg lecturehall
+    with fade
+
+    "Well, professor Eileen's lecture was interesting."
+    "But to be honest, I couldn't concentrate on it very much."
+    "I had a lot of other thoughts on my mind."
+    "And they all ended up with a question."
+    "A question, I've been meaning to ask someone."
+
+    scene bg uni
+    with fade
+
+    "When we came out of the university, I saw her."
+
+    show sylvie normal
+    with dissolve
+
+    "She was a wonderful person."
+    "I've known her ever since we were children."
+    "And she's always been a good friend."
+    "But..."
+    "Recently..."
+    "I think..."
+    "... that I wanted more."
+    "More just talking... more than just walking home together when our classes ended."
+    "And I decided..."
+
+    menu:
+
+        "... to ask her right away.":
+
+            jump rightaway
+
+        "... to ask her later.":
+
+            jump later
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-rest.html b/docs/_style/prism-master/examples/prism-rest.html new file mode 100644 index 00000000..511e87c9 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-rest.html @@ -0,0 +1,329 @@ +

Titles

+
===============
+ Section Title
+===============
+
+---------------
+ Section Title
+---------------
+
+Section Title
+=============
+
+Section Title
+-------------
+
+Section Title
+`````````````
+
+Section Title
+'''''''''''''
+
+Section Title
+.............
+
+Section Title
+~~~~~~~~~~~~~
+
+Section Title
+*************
+
+Section Title
++++++++++++++
+
+Section Title
+^^^^^^^^^^^^^
+ +

Lists

+
- This is the first bullet list item.
+- This is the first paragraph in the second item in the list.
+
+  This is the second paragraph in the second item in the list.
+
+  - This is a sublist.  The bullet lines up with the left edge of
+    the text blocks above.
+
+- This is the third item of the main list.
+
+This paragraph is not part of the list.
+
+1. Item 1 initial text.
+
+   a) Item 1a.
+   b) Item 1b.
+
+2. a) Item 2a.
+   b) Item 2b.
+ +

Field lists

+
:Date: 2001-08-16
+:Version: 1
+:Authors: - Me
+          - Myself
+          - I
+:Indentation: Since the field marker may be quite long, the second
+   and subsequent lines of the field body do not have to line up
+   with the first line, but they must be indented relative to the
+   field name marker, and they must line up with each other.
+:Parameter i: integer
+ +

Option lists

+
-a         Output all.
+-b         Output both (this description is
+           quite long).
+-c arg     Output just arg.
+--long     Output all day long.
+
+-p         This option has two paragraphs in the description.
+           This is the first.
+
+           This is the second.  Blank lines may be omitted between
+           options (as above) or left in (as here and below).
+
+--very-long-option  A VMS-style option.  Note the adjustment for
+                    the required two spaces.
+
+--an-even-longer-option
+           The description can also start on the next line.
+
+-2, --two  This option has two variants.
+
+-f FILE, --file=FILE  These two options are synonyms; both have
+                      arguments.
+
+/V         A VMS/DOS-style option.
+ +

Literal blocks

+
::
+
+    for a in [5,4,3,2,1]:   # this is program code, shown as-is
+        print a
+    print "it's..."
+    # a literal block continues until the indentation ends
+
+John Doe wrote::
+
+>> *Great* idea!
+>
+> Why didn't I think of that?
+
+You just did!  ;-)
+ +

Line blocks

+
| Lend us a couple of bob till Thursday.
+| I'm absolutely skint.
+| But I'm expecting a postal order and I can pay you back
+  as soon as it comes.
+| Love, Ewan.
+
+Take it away, Eric the Orchestra Leader!
+
+    | A one, two, a one two three four
+    |
+    | Half a bee, philosophically,
+    |     must, *ipso facto*, half not be.
+    | But half the bee has got to be,
+    |     *vis a vis* its entity.  D'you see?
+    |
+    | But can a bee be said to be
+    |     or not to be an entire bee,
+    |         when half the bee is not a bee,
+    |             due to some ancient injury?
+    |
+    | Singing...
+ +

Grid tables and simple tables

+
+------------------------+------------+----------+----------+
+| Header row, column 1   | Header 2   | Header 3 | Header 4 |
+| (header rows optional) |            |          |          |
++========================+============+==========+==========+
+| body row 1, column 1   | column 2   | column 3 | column 4 |
++------------------------+------------+----------+----------+
+| body row 2             | Cells may span columns.          |
++------------------------+------------+---------------------+
+| body row 3             | Cells may  | - Table cells       |
++------------------------+ span rows. | - contain           |
+| body row 4             |            | - body elements.    |
++------------------------+------------+---------------------+
+
+	+--------------+----------+-----------+-----------+
+	| row 1, col 1 | column 2 | column 3  | column 4  |
+	+--------------+----------+-----------+-----------+
+	| row 2        |                                  |
+	+--------------+----------+-----------+-----------+
+	| row 3        |          |           |           |
+	+--------------+----------+-----------+-----------+
+
+=====  =====  =======
+  A      B    A and B
+=====  =====  =======
+False  False  False
+True   False  False
+False  True   False
+True   True   True
+=====  =====  =======
+
+	=====  =====  ======
+	   Inputs     Output
+	------------  ------
+	  A      B    A or B
+	=====  =====  ======
+	False  False  False
+	True   False  True
+	False  True   True
+	True   True   True
+	=====  =====  ======
+ +

Footnotes and links

+
.. [1] Body elements go here.
+
+If [#note]_ is the first footnote reference, it will show up as
+"[1]".  We can refer to it again as [#note]_ and again see
+"[1]".  We can also refer to it as note_ (an ordinary internal
+hyperlink reference).
+
+.. [#note] This is the footnote labeled "note".
+
+Here is a symbolic footnote reference: [*]_.
+
+.. [*] This is the footnote.
+
+[2]_ will be "2" (manually numbered),
+[#]_ will be "3" (anonymous auto-numbered), and
+[#label]_ will be "1" (labeled auto-numbered).
+
+.. [2] This footnote is labeled manually, so its number is fixed.
+
+.. [#label] This autonumber-labeled footnote will be labeled "1".
+   It is the first auto-numbered footnote and no other footnote
+   with label "1" exists.  The order of the footnotes is used to
+   determine numbering, not the order of the footnote references.
+
+.. [#] This footnote will be labeled "3".  It is the second
+   auto-numbered footnote, but footnote label "2" is already used.
+
+Here is a citation reference: [CIT2002]_.
+
+.. [CIT2002] This is the citation.  It's just like a footnote,
+   except the label is textual.
+
+.. _hyperlink-name: link-block
+
+.. __: anonymous-hyperlink-target-link-block
+
+__ anonymous-hyperlink-target-link-block
+
+Clicking on this internal hyperlink will take us to the target_
+below.
+
+.. _target:
+
+The hyperlink target above points to this paragraph.
+ +

Directives

+
.. image:: mylogo.jpeg
+
+.. figure:: larch.png
+
+   The larch.
+
+.. note:: This is a paragraph
+
+   - Here is a bullet list.
+
+.. figure:: picture.png
+   :scale: 50 %
+   :alt: map to buried treasure
+
+   This is the caption of the figure (a simple paragraph).
+
+   The legend consists of all elements after the caption.  In this
+   case, the legend consists of this paragraph and the following
+   table:
+
+   +-----------------------+-----------------------+
+   | Symbol                | Meaning               |
+   +=======================+=======================+
+   | .. image:: tent.png   | Campground            |
+   +-----------------------+-----------------------+
+   | .. image:: waves.png  | Lake                  |
+   +-----------------------+-----------------------+
+   | .. image:: peak.png   | Mountain              |
+   +-----------------------+-----------------------+
+ +

Substitutions

+
The |biohazard| symbol must be used on containers used to
+dispose of medical waste.
+
+.. |biohazard| image:: biohazard.png
+
+|Michael| and |Jon| are our widget-wranglers.
+
+.. |Michael| user:: mjones
+.. |Jon|     user:: jhl
+
+West led the |H| 3, covered by dummy's |H| Q, East's |H| K,
+and trumped in hand with the |S| 2.
+
+.. |H| image:: /images/heart.png
+   :height: 11
+   :width: 11
+.. |S| image:: /images/spade.png
+   :height: 11
+   :width: 11
+
+* |Red light| means stop.
+* |Green light| means go.
+* |Yellow light| means go really fast.
+
+.. |Red light|    image:: red_light.png
+.. |Green light|  image:: green_light.png
+.. |Yellow light| image:: yellow_light.png
+ +

Comments

+
.. This is a comment
+
+..
+   _so: is this!
+
+..
+   [and] this!
+
+..
+   this:: too!
+
+..
+   |even| this:: !
+ +

Inline markup

+
This is *emphasized text*.
+This is **strong text**.
+This is `interpreted text`.
+:role:`interpreted text`
+`interpreted text`:role:
+This text is an example of ``inline literals``.
+The regular expression ``[+-]?(\d+(\.\d*)?|\.\d+)`` matches
+floating-point numbers (without exponents).
+
+See the `Python home page <http://www.python.org>`_ for info.
+
+Oh yes, the _`Norwegian Blue`.  What's, um, what's wrong with it?
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Nothing is highlighted inside table cells

+
+---------------+----------+
+| column 1     | column 2  |
++--------------+-----------+
+| **bold**?    | *italic*? |
++--------------+-----------+
+ +

The inline markup recognition rules are not as strict as they are in the spec

+

No inline markup should be highlighted in the following code.

+
2 * x a ** b (* BOM32_* ` `` _ __ |
+"*" '|' (*) [*] {*} <*> ‘*’ ‚*‘ ‘*‚ ’*’ ‚*’ “*” „*“ “*„ ”*” „*” »*« ›*‹ «*» »*» ›*›
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-rip.html b/docs/_style/prism-master/examples/prism-rip.html new file mode 100644 index 00000000..99769c3b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-rip.html @@ -0,0 +1,12 @@ +

Comments

+
# This is a comment
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+ +

Regex

+
regular_expression = /abc/
+ +

Symbols

+
string_symbol = :rip 
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-roboconf.html b/docs/_style/prism-master/examples/prism-roboconf.html new file mode 100644 index 00000000..ca57221e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-roboconf.html @@ -0,0 +1,49 @@ +

Full example

+
ApacheServer {
+    # Apache instances will be deployed by Roboconf's Puppet extension
+    installer: puppet;
+
+    # Web applications could be deployed over this Apache server
+    children: My-Dash-Board, Marketing-Suite;
+
+    # Properties exported by this component.
+    # 'port' should have a default value, or we will have to set it when we create an instance.
+    exports: port = 19099;
+
+    # 'ip' is a special variable. It will be updated at runtime by a Roboconf agent.
+    exports: ip;
+
+    # Other components properties that this server needs to have so that it can start.
+    imports: LB.port (optional), LB.ip (optional);
+
+    # Here, the Apache may also be notified about components instances of type LB.
+    # The imports are marked as optional. It means that if there is no LB instance, an
+    # Apache instance will be able to start anyway.
+    #
+    # If the import was not optional, e.g.
+    #
+    # imports: LB.port, LB.ip;
+    # or even
+    # imports: LB.port (optional), LB.ip;
+    #
+    # ... then an Apache instance would need at least one LB instance somewhere.
+
+    # Imports may also reference variables from other applications
+    imports: external Lamp.lb-ip;
+}
+
+facet LoadBalanced {
+    exports: ip, port;  # Define we export two variables.
+}
+
+instance of VM {
+
+    # This will create 5 VM instances, called VM 1, VM 2, VM3, VM 4 and VM 5.
+    name: VM ;  # Yes, there is a space at the end... :)
+    count: 5;
+
+    # On every VM instance, we will deploy...
+    instance of Tomcat {
+        name: Tomcat;
+    }
+}
diff --git a/docs/_style/prism-master/examples/prism-ruby.html b/docs/_style/prism-master/examples/prism-ruby.html new file mode 100644 index 00000000..4f1e3906 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-ruby.html @@ -0,0 +1,30 @@ +

Comments

+
# This is a comment
+=begin
+Multi-line
+comment
+=end
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+ +

Regular expressions

+
/foo?[ ]*bar/
+ +

Variables

+
$foo = 5;
+class InstTest
+  def set_foo(n)
+    @foo = n
+  end
+  def set_bar(n)
+    @bar = n
+  end
+end
+ +

Symbols

+
mystring = :steveT;
+ +

String Interpolation

+
"foo #{'bar'+my_variable}"
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-rust.html b/docs/_style/prism-master/examples/prism-rust.html new file mode 100644 index 00000000..d4479684 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-rust.html @@ -0,0 +1,68 @@ +

Comments

+
// Single line comment
+/// Doc comments
+/* Multiline
+comment */
+ +

Strings

+
'C'; '\''; '\n'; '\u7FFF'; // Characters
+"foo \"bar\" baz"; // String
+r##"foo #"bar"# baz"##; // Raw string with # pairs
+b'C'; b'\''; b'\n'; // Bytes
+b"foo \"bar\" baz"; // Byte string
+br##"foo #"bar"# baz"##; // Raw byte string with # pairs
+
+ +

Numbers

+
123i;                              // type int
+123u;                              // type uint
+123_u;                             // type uint
+0xff_u8;                           // type u8
+0o70_i16;                          // type i16
+0b1111_1111_1001_0000_i32;         // type i32
+
+123.0f64;        // type f64
+0.1f64;          // type f64
+0.1f32;          // type f32
+12E+99_f64;      // type f64
+
+ +

Booleans

+
true; false;
+ +

Functions and macros

+
println!("x is {}", x);
+fn next_two(x: int) -> (int, int) { (x + 1i, x + 2i) }
+next_two(5i);
+vec![1i, 2, 3];
+
+ +

Attributes

+
#![warn(unstable)]
+#[test]
+fn a_test() {
+	// ...
+}
+ +

Closure parameters and bitwise OR

+
let x = a | b;
+let y = c || d;
+let add_one = |x: int| -> int { 1i + x };
+let printer = || { println!("x is: {}", x); };
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Nested block comments

+
/* Nested block
+	/* comments
+	are */
+not supported */
+ +

Delimiters of parameters for closures that don't use braces

+
|x| x + 1i;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-sas.html b/docs/_style/prism-master/examples/prism-sas.html new file mode 100644 index 00000000..8932ebb0 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-sas.html @@ -0,0 +1,158 @@ +

Comments

+
/* This is a
+multi-line comment */
+
+* This is a comment too;
+ +

Numbers, dates and times

+
42; 4.5; 4.5e-10; -3; -3.5e2; -4.2e-23;
+0afx; 0123x; abcdefx;
+'1jan2013'd; '01jan09'd;
+'9:25't; '9:25:19pm't;
+'01may12:9:30:00'dt; '18jan2003:9:27:05am'dt;
+'2013-05-17T09:15:30–05:00'dt; '2013-05-17T09:15:30–05'dt;
+'2013-07-20T12:00:00+00:00'dt; '2013-07-20T12:00:00Z'dt;
+ +

Strings

+
'Single quoted string';
+"Double quoted string";
+'String ''quoted'' string "containing" quote';
+"Double ""quoted"" string 'containing' quote";
+ +

Operators

+
A**B;
+'foo'||'bar'!!'baz'¦¦'test';
+A<>B><C;
+A~=B¬=C^=D>=E<=F;
+a*b/c+d-e<f>g&h|i!j¦k;
+~a;¬b;^c;
+(a eq b) ne (c gt d) lt e ge f le h;
+state in ('NY','NJ','PA');
+not a;
+ +

More examples

+
/* Some examples adapted from the documentation (http://support.sas.com/documentation/cdl/en/basess/64003/PDF/default/basess.pdf) */
+
+data city; * another inline comment;
+
+	input Year 4. @7 ServicesPolice comma6.
+		@15 ServicesFire comma6. @22 ServicesWater_Sewer comma6.
+		@30 AdminLabor comma6. @39 AdminSupplies comma6.
+		@45 AdminUtilities comma6.;
+	ServicesTotal=ServicesPolice+ServicesFire+ServicesWater_Sewer;
+	AdminTotal=AdminLabor+AdminSupplies+AdminUtilities;
+	Total=ServicesTotal+AdminTotal;
+
+	Test='A string '' whith a quote';
+	Test2 = "A string "" whith a quote";
+
+	label   Total='Total Outlays'
+			ServicesTotal='Services: Total'
+			ServicesPolice='Services: Police'
+			ServicesFire='Services: Fire'
+			ServicesWater_Sewer='Services: Water & Sewer'
+			AdminTotal='Administration: Total'
+			AdminLabor='Administration: Labor'
+			AdminSupplies='Administration: Supplies'
+			AdminUtilities='Administration: Utilities';
+	datalines;
+1993 2,819 1,120 422 391 63 98
+1994 2,477 1,160 500 172 47 70
+1995 2,028 1,061 510 269 29 79
+1996 2,754 893 540 227 21 67
+1997 2,195 963 541 214 21 59
+1998 1,877 926 535 198 16 80
+1999 1,727 1,111 535 213 27 70
+2000 1,532 1,220 519 195 11 69
+2001 1,448 1,156 577 225 12 58
+2002 1,500 1,076 606 235 19 62
+2003 1,934 969 646 266 11 63
+2004 2,195 1,002 643 256 24 55
+2005 2,204 964 692 256 28 70
+2006 2,175 1,144 735 241 19 83
+2007 2,556 1,341 813 238 25 97
+2008 2,026 1,380 868 226 24 97
+2009 2,526 1,454 946 317 13 89
+2010 2,027 1,486 1,043 226 . 82
+2011 2,037 1,667 1,152 244 20 88
+2012 2,852 1,834 1,318 270 23 74
+2013 2,787 1,701 1,317 307 26 66
+;
+proc datasets library=work nolist
+;
+contents data=city
+;
+run;
+
+
+data city3;
+	set city(firstobs=10 obs=15);
+run;
+
+data services (keep=ServicesTotal ServicesPolice ServicesFire
+				ServicesWater_Sewer)
+	admin (keep=AdminTotal AdminLabor AdminSupplies
+			AdminUtilities);
+	set city(drop=Total);
+run;
+proc print data=services;
+	title 'City Expenditures: Services';
+run;
+
+data newlength;
+	set mylib.internationaltours;
+	length Remarks $ 30;
+	if Vendor = 'Hispania' then Remarks = 'Bonus for 10+ people';
+	else if Vendor = 'Mundial' then Remarks = 'Bonus points';
+	else if Vendor = 'Major' then Remarks = 'Discount for 30+ people';
+run;
+proc print data=newlength;
+	var Country Vendor Remarks;
+	title 'Information About Vendors';
+run;
+
+libname mylib 'permanent-data-library';
+data mylib.departures;
+	input Country $ 1-9 CitiesInTour 11-12 USGate $ 14-26
+	ArrivalDepartureGates $ 28-48;
+	datalines;
+Japan 5 San Francisco Tokyo, Osaka
+Italy 8 New York Rome, Naples
+Australia 12 Honolulu Sydney, Brisbane
+Venezuela 4 Miami Caracas, Maracaibo
+Brazil 4 Rio de Janeiro, Belem
+;
+proc print data=mylib.departures;
+	title 'Data Set AIR.DEPARTURES';
+run;
+
+data missingval;
+	length Country $ 10 TourGuide $ 10;
+	input Country TourGuide;
+	* lines is an alias for datalines;
+	lines;
+Japan Yamada
+Italy Militello
+Australia Edney
+Venezuela .
+Brazil Cardoso
+;
+
+data inventory_tool;
+	input PartNumber $ Description $ InStock @17
+		ReceivedDate date9. @27 Price;
+	format ReceivedDate date9.;
+	* cards is an alias for datalines;
+	cards;
+K89R seal 34 27jul2010 245.00
+M4J7 sander 98 20jun2011 45.88
+LK43 filter 121 19may2011 10.99
+MN21 brace 43 10aug2012 27.87
+BC85 clamp 80 16aug2012 9.55
+NCF3 valve 198 20mar2012 24.50
+KJ66 cutter 6 18jun2010 19.77
+UYN7 rod 211 09sep2010 11.55
+JD03 switch 383 09jan2013 13.99
+BV1E timer 26 03aug2013 34.50
+;
+run;
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-sass.html b/docs/_style/prism-master/examples/prism-sass.html new file mode 100644 index 00000000..7200e789 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-sass.html @@ -0,0 +1,47 @@ +

Comments

+
/* This comment will appear in the CSS output.
+  This is nested beneath the comment,
+  so it's part of it
+
+// This comment will not appear in the CSS output.
+  This is nested beneath the comment as well,
+  so it also won't appear
+ +

At-rules and shortcuts

+
@mixin large-text
+  color: #ff0000
+
+@media (min-width: 600px)
+  h1
+    @include large-text
+
+=large-text
+  color: #ff0000
+
+h1
+  +large-text
+ +

Variables

+
$width: 5em
+#main
+  width: $width
+
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Deprecated Sass syntax is not supported

+
.page
+  color = 5px + 9px
+
+!width = 13px
+.icon
+  width = !width
+ +

Selectors with pseudo classes are highlighted as property/value pairs

+
a:hover
+  text-decoration: underline
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-scala.html b/docs/_style/prism-master/examples/prism-scala.html new file mode 100644 index 00000000..1dc56f87 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-scala.html @@ -0,0 +1,100 @@ +

Comments

+
// Single line comment
+/* Mutli-line
+comment */
+ +

Strings and characters

+
'a'
+"foo bar baz"
+"""Multi-line
+string"""
+ +

Numbers

+
0
+21
+0xFFFFFFFF
+-42L
+0.0
+1e30f
+3.14159f
+1.0e-100
+.1
+
+ +

Symbols

+
'x
+'identifier
+ +

Full example

+
// Contributed by John Williams
+package examples
+
+object lazyLib {
+
+  /** Delay the evaluation of an expression until it is needed. */
+  def delay[A](value: => A): Susp[A] = new SuspImpl[A](value)
+
+  /** Get the value of a delayed expression. */
+  implicit def force[A](s: Susp[A]): A = s()
+
+  /**
+   * Data type of suspended computations. (The name froms from ML.)
+   */
+  abstract class Susp[+A] extends Function0[A]
+
+  /**
+   * Implementation of suspended computations, separated from the
+   * abstract class so that the type parameter can be invariant.
+   */
+  class SuspImpl[A](lazyValue: => A) extends Susp[A] {
+    private var maybeValue: Option[A] = None
+
+    override def apply() = maybeValue match {
+      case None =>
+        val value = lazyValue
+        maybeValue = Some(value)
+        value
+	  case Some(value) =>
+        value
+    }
+
+    override def toString() = maybeValue match {
+      case None => "Susp(?)"
+      case Some(value) => "Susp(" + value + ")"
+    }
+  }
+}
+
+object lazyEvaluation {
+  import lazyLib._
+
+  def main(args: Array[String]) = {
+    val s: Susp[Int] = delay { println("evaluating..."); 3 }
+
+    println("s     = " + s)       // show that s is unevaluated
+    println("s()   = " + s())     // evaluate s
+    println("s     = " + s)       // show that the value is saved
+    println("2 + s = " + (2 + s)) // implicit call to force()
+
+    val sl = delay { Some(3) }
+    val sl1: Susp[Some[Int]] = sl
+    val sl2: Susp[Option[Int]] = sl1   // the type is covariant
+
+    println("sl2   = " + sl2)
+    println("sl2() = " + sl2())
+    println("sl2   = " + sl2)
+  }
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Nested block comments

+
/* Nested block
+	/* comments
+	are */
+not supported */
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-scheme.html b/docs/_style/prism-master/examples/prism-scheme.html new file mode 100644 index 00000000..de50f226 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-scheme.html @@ -0,0 +1,35 @@ +

Comments

+
; This is a comment
+ +

Booleans

+
#t
+#f
+ +

Strings

+
"two \"quotes\" within"
+ +

Functions

+
(lambda (x) (+ x 3))
+(apply vector 'a 'b '(c d e))
+
+ +

Full example

+
;; Calculation of Hofstadter's male and female sequences as a list of pairs
+
+(define (hofstadter-male-female n)
+  (letrec ((female (lambda (n)
+		     (if (= n 0)
+			 1
+			 (- n (male (female (- n 1)))))))
+	   (male (lambda (n)
+		   (if (= n 0)
+		       0
+		       (- n (female (male (- n 1))))))))
+    (let loop ((i 0))
+      (if (> i n)
+	  '()
+	  (cons (cons (female i)
+		      (male i))
+		(loop (+ i 1)))))))
+
+(hofstadter-male-female 8)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-scss.html b/docs/_style/prism-master/examples/prism-scss.html new file mode 100644 index 00000000..f0daaf57 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-scss.html @@ -0,0 +1,31 @@ +

Comments

+
// Single line comment
+/* Multi-line
+comment */
+ +

At-rules

+
@import "foo.scss";
+@media (min-width: 600px) {}
+.seriousError {
+    @extend .error;
+}
+@for $i from 1 through 3 {}
+
+ +

Compass URLs

+
@font-face {
+	font-family: "opensans";
+	src: font-url("opensans.ttf");
+}
+ +

Variables

+
$width: 5em;
+#main {
+    width: $width;
+}
+ +

Interpolations are highlighted in property names

+
p.#{$name} {
+    #{$attr}-color: blue;
+}
+
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-smalltalk.html b/docs/_style/prism-master/examples/prism-smalltalk.html new file mode 100644 index 00000000..7fb70f8f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-smalltalk.html @@ -0,0 +1,92 @@ +

Numbers

+
3
+30.45
+-3
+0.005
+-14.0
+13772
+8r377
+8r153
+8r34.1
+8r-37
+16r106
+16rFF
+16rAC.DC
+16r-1.C
+1.586e5
+1.586e-3
+8r3e2
+2r11e6
+ +

Strings and characters

+
$a
+$M
+$-
+$$
+$1
+'hi'
+'food'
+'the Smalltalk-80 system'
+'can''t'
+ +

Symbols

+
#bill
+#M63
+#+
+#*
+ +

Arrays

+
#(1 2 3)
+#('food' 'utilities' 'rent' 'household' 'transportation' 'taxes' 'recreation')
+#(('one' 1) ('not' 'negative') 0 -1)
+#(9 'nine' $9 (0 'zero' $0 ( ) 'e' $f 'g' $h 'i'))
+ +

Blocks

+
sum := 0.
+#(2 3 5 7 11) do: [ :primel | sum := sum + (prime * prime)]
+
+sizeAdder := [ :array | total := total + array size].
+
+[ :x :y | (x * x) + (y * y)]
+[ :frame :clippingBox | frame intersect: clippingBox]
+ +

Full example

+
Object>>method: num
+    "comment 123"
+    | var1 var2 |
+    (1 to: num) do: [:i | |var| ^i].
+    Klass with: var1.
+    Klass new.
+    arr := #('123' 123.345 #hello Transcript var $@).
+    arr := #().
+    var2 = arr at: 3.
+    ^ self abc
+
+heapExample
+    "HeapTest new heapExample"
+    "Multiline
+    decription"
+    | n rnd array time sorted |
+    n := 5000.
+    "# of elements to sort"
+    rnd := Random new.
+    array := (1 to: n)
+                collect: [:i | rnd next].
+    "First, the heap version"
+    time := Time
+                millisecondsToRun: [sorted := Heap withAll: array.
+    1
+        to: n
+        do: [:i |
+            sorted removeFirst.
+            sorted add: rnd next]].
+    Transcript cr; show: 'Time for Heap: ' , time printString , ' msecs'.
+    "The quicksort version"
+    time := Time
+                millisecondsToRun: [sorted := SortedCollection withAll: array.
+    1
+        to: n
+        do: [:i |
+            sorted removeFirst.
+            sorted add: rnd next]].
+    Transcript cr; show: 'Time for SortedCollection: ' , time printString , ' msecs'
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-smarty.html b/docs/_style/prism-master/examples/prism-smarty.html new file mode 100644 index 00000000..5e57922f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-smarty.html @@ -0,0 +1,81 @@ +

Comments

+
{* This is a comment with <p>some markup</p> in it *}
+{* Multi-line
+comment *}
+ +

Variables

+
{$foo}
+{$foo.bar}
+{$foo.$bar}
+{$foo[$bar]}
+{$foo->bar}
+{$foo->bar()}
+{#foo#}
+{$smarty.config.foo}
+{$foo[bar]}
+
+ +

Strings and numbers

+
{$foo[4]}
+{$foo['bar']}
+ +

Tags and filters

+
{assign var=foo value='baa'}
+{include file='header.tpl'}
+{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}
+{$title|truncate:40:'...'}
+{$myArray|@count}
+
+{math equation="height * width / division"
+   height=$row_height
+   width=$row_width
+   division=#col_div#}
+ +

Control flow

+ +
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
+   ...
+{/if}
+{if count($var) gt 0}{/if}
+{if $var is even by 3}
+   ...
+{/if}
+
+{foreach from=$myArray item=i name=foo}
+	{$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
+{/foreach}
+
+<ul>
+{foreach from=$items key=myId item=i}
+  <li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li>
+{/foreach}
+</ul>
+
+ +

Literal section

+
{literal}
+	<script>
+		(function() { /* This is JS, not Smarty */ } ());
+	</script>
+{/literal}
+
+<style type="text/css">
+{literal}
+/* this is an intersting idea for this section */
+.madIdea{
+    border: 3px outset #ffffff;
+    margin: 2 3 4 5px;
+    background-color: #001122;
+}
+{/literal}
+</style>
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Smarty tag in the middle of an HTML tag

+
<div{if $test} class="test"{/if}></div>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-soy.html b/docs/_style/prism-master/examples/prism-soy.html new file mode 100644 index 00000000..648b8e5f --- /dev/null +++ b/docs/_style/prism-master/examples/prism-soy.html @@ -0,0 +1,36 @@ +

Comments

+
/* Multi-line
+comment */
+// This is a comment with <p>some markup</p> in it
+ +

Variable

+
{$name}
+{$folders[0]['name']}
+{$aaa?.bbb.ccc?[0]}
+ +

Commands

+
{template .helloNames}
+  // Greet the person.
+  {call .helloName data="all" /}
+ // Greet the additional people. + {foreach $additionalName in $additionalNames} + {call .helloName} + {param name: $additionalName /} + {/call} + {if not isLast($additionalName)} + <br> // break after every line except the last + {/if} + {ifempty} + No additional people to greet. + {/foreach} +{/template}
+ +

Functions and print directives

+
{if length($items) > 5}
+{$foo|changeNewlineToBr}
+{$bar|truncate: 4, false}
+ +

Literal section

+
{literal}
+This is not a {$variable}
+{/literal}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-sql.html b/docs/_style/prism-master/examples/prism-sql.html new file mode 100644 index 00000000..6fe99775 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-sql.html @@ -0,0 +1,34 @@ +

Comments

+
# Single line comment
+-- Single line comment
+// Single line comment
+/* Multi-line
+comment */
+ +

Strings

+
"foo \"bar\" baz"
+'foo \'bar\' baz'
+"Multi-line strings
+are supported"
+'Multi-line strings
+are supported'
+ +

Variables

+
SET @variable = 1;
+SET @$_ = 2;
+SET @"quoted-variable" = 3;
+SET @'quoted-variable' = 3;
+SET @`quoted-variable` = 3;
+ +

Operators

+
SELECT 1 && 1;
+SELECT 1 OR NULL;
+SELECT 5 & 2*3;
+SELECT 2 BETWEEN 1 AND 3;
+ +

Functions and keywords

+
SELECT COUNT(*) AS cpt, MAX(t.pos) AS max_pos
+FROM `my_table`
+LEFT JOIN `other_table` AS t
+WHERE `somecol` IS NOT NULL
+ORDER BY t.other_col DESC
diff --git a/docs/_style/prism-master/examples/prism-stylus.html b/docs/_style/prism-master/examples/prism-stylus.html new file mode 100644 index 00000000..2b8ffdca --- /dev/null +++ b/docs/_style/prism-master/examples/prism-stylus.html @@ -0,0 +1,72 @@ +

Full Example

+
/*!
+ * Adds the given numbers together.
+ */
+/*
+ * Adds the given numbers together.
+ */
+// I'm a comment!
+body {
+	font: 12px Helvetica, Arial, sans-serif;
+}
+a.button {
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	border-radius: 5px;
+}
+
+body
+	font: 12px Helvetica, Arial, sans-serif;
+
+a.button:after
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	border-radius: 5px;
+
+body
+	font: 12px Helvetica, Arial, sans-serif
+
+a.link > button#test, input[type=button], a:after
+	-webkit-border-radius: 5px
+	-moz-border-radius: 5px
+	border-radius: 5px
+
+font-size = 14px
+font = font-size "Lucida Grande", Arial
+
+body {
+	padding: 50px;
+	font: 14px/1.4 fonts;
+}
+
+border-radius()
+	-webkit-border-radius arguments
+	-moz-border-radius arguments
+	border-radius arguments
+
+body
+	font 12px Helvetica, Arial, sans-serif
+
+a.button
+	border-radius(5px)
+
+@media (max-width: 30em) {
+	body {
+		color: #fff;
+	}
+}
+
+@media (max-width: 500px)
+	.foo
+		color: #000
+
+	@media (min-width: 100px), (min-height: 200px)
+		.foo
+			color: #100
+
+sum(nums...)
+	sum = 0
+	sum += n for n in nums
+
+sum(1 2 3 4)
+// => 10
diff --git a/docs/_style/prism-master/examples/prism-swift.html b/docs/_style/prism-master/examples/prism-swift.html new file mode 100644 index 00000000..98d6eb55 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-swift.html @@ -0,0 +1,80 @@ +

Comments

+
// this is a comment
+/* this is also a comment,
+but written over multiple lines */
+
+ +

Numbers

+
42
+-23
+3.14159
+0.1
+-273.15
+1.25e-2
+0xC.3p0
+1_000_000
+1_000_000.000_000_1
+ +

Strings

+
let someString = "Some string literal value"
+var emptyString = ""
+// String interpolation
+let multiplier = 3
+"\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
+ +

Control flow

+
for index in 1...5 {
+	println("\(index) times 5 is \(index * 5)")
+}
+for _ in 1...power {
+	answer *= base
+}
+while square < finalSquare {
+	// roll the dice
+	if ++diceRoll == 7 { diceRoll = 1 }
+	// move by the rolled amount
+	square += diceRoll
+	if square < board.count {
+		// if we're still on the board, move up or down for a snake or a ladder
+		square += board[square]
+	}
+}
+switch someCharacter {
+	case "a", "e", "i", "o", "u":
+		println("\(someCharacter) is a vowel")
+	case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
+		"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
+		println("\(someCharacter) is a consonant")
+	default:
+		println("\(someCharacter) is not a vowel or a consonant")
+}
+
+ +

Classes and attributes

+
class MyViewController: UIViewController {
+    @IBOutlet weak var button: UIButton!
+    @IBOutlet var textFields: [UITextField]!
+    @IBAction func buttonTapped(AnyObject) {
+	    println("button tapped!")
+	}
+}
+
+@IBDesignable
+class MyCustomView: UIView {
+    @IBInspectable var textColor: UIColor
+    @IBInspectable var iconHeight: CGFloat
+    /* ... */
+}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Nested block comments

+
/* Nested block
+	/* comments
+	are */
+not supported */
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-tcl.html b/docs/_style/prism-master/examples/prism-tcl.html new file mode 100644 index 00000000..080d817c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-tcl.html @@ -0,0 +1,26 @@ +

Comments

+
# This is a comment
+ +

Strings

+
"foo \"bar\" baz"
+"foo\
+bar\
+baz"
+ +

Variables

+
$foo
+$foo::bar_42
+$::baz
+${foobar}
+set foo::bar "baz"
+ +

Functions

+
proc foobar {baz} {
+	puts $baz
+}
+
+proc RESTORE/post/:post_id/comment/:comment_id {post_id comment_id} {
+    #| Restore a comment handler
+    comment_restore $comment_id
+    qc::actions redirect [url "/post/$post_id" show_deleted_comment_ids $comment_id]
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-textile.html b/docs/_style/prism-master/examples/prism-textile.html new file mode 100644 index 00000000..4ff4d127 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-textile.html @@ -0,0 +1,178 @@ +

HTML

+
I am <b>very</b> serious.
+
+<div style="background:#fff">Foo bar</div>
+ +

Blocks

+
h1. Header 1
+
+h2. Header 2
+
+h3. Header 3 written on
+multiple lines
+
+bq. A block quotation
+on multiple lines.
+ +

Footnotes

+
This is covered elsewhere[1].
+
+fn1. Down here, in fact.
+ +

Structural emphasis

+
I _believe_ every word.
+And then? She *fell*!
+
+I __know__.
+I **really** __know__.
+
+??Cat's Cradle?? by Vonnegut
+
+Convert with @r.to_html@
+
+I'm -sure- not sure.
+
+You are a +pleasant+ child.
+
+a ^2^ + b ^2^ = c ^2^
+log ~2~ x
+ +

Block attributes

+
p(example1). An example
+
+p(#big-red). Red here
+
+p(example1#big-red2). Red here
+
+p{color:blue;margin:30px}. Spacey blue
+
+p[fr]. rouge
+ +

Phrase attributes

+
I seriously *{color:red}blushed*
+when I _(big)sprouted_ that
+corn stalk from my
+%[es]cabeza%.
+ +

Phrase alignments and indentation

+
p<. align left
+
+p>. align right
+
+p=. centered
+
+p<>. justified
+
+p(. left ident 1em
+
+p((. left ident 2em
+
+p))). right ident 3em
+ +

Attributes and alignments combined

+
h2()>. Bingo.
+
+h3()>[no]{color:red}. Bingo
+ +

Lists

+
# First item
+# Second item
+# Third
+
+# Fuel could be:
+## Coal
+## Gasoline
+## Electricity
+# Humans need only:
+## Water
+## Protein
+
+* First item
+* Second item
+* Third
+
+* Fuel could be:
+** Coal
+** Gasoline
+** Electricity
+* Humans need only:
+** Water
+** Protein
+
+#(foo) List can have attributes too
+#{background: red} Red item
+ +

Links and images

+
I searched "Google":http://google.com.
+
+I am crazy about "Hobix":hobix
+and "it's":hobix "all":hobix I ever
+"link to":hobix!
+
+[hobix]http://hobix.com
+
+And "(some-link)[en]links":# can have attributes too!
+
+!http://redcloth.org/hobix.com/textile/sample.jpg!
+!openwindow1.gif(Bunny.)!
+!openwindow1.gif!:http://hobix.com/
+
+!>obake.gif!
+
+And others sat all round the small
+machine and paid it to sing to them.
+ +

Tables

+
| name | age | sex |
+| joan | 24 | f |
+| archie | 29 | m |
+| bella | 45 | f |
+
+|_. name |_. age |_. sex |
+| joan | 24 | f |
+| archie | 29 | m |
+| bella | 45 | f |
+
+|_. attribute list |
+|<. align left |
+|>. align right|
+|=. center |
+|<>. justify |
+|^. valign top |
+|~. bottom |
+
+|\2. spans two cols |
+| col 1 | col 2 |
+
+|/3. spans 3 rows | a |
+| b |
+| c |
+
+|{background:#ddd}. Grey cell|
+
+table{border:1px solid black}.
+|This|is|a|row|
+|This|is|a|row|
+
+|This|is|a|row|
+{background:#ddd}. |This|is|grey|row|
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Nested styles are only partially supported

+ +

Only one level of nesting is supported.

+ +
*A bold paragraph %containing a span with broken _italic_ inside%!*
+ +

HTML inside Textile is not supported

+ +

But Textile inside HTML should be just fine.

+ +
<strong>This _should_ work properly.</strong>
+*But this is <em>definitely</em> broken.*
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-tsx.html b/docs/_style/prism-master/examples/prism-tsx.html new file mode 100644 index 00000000..d83d1dd8 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-tsx.html @@ -0,0 +1,31 @@ +

Full example

+
import * as React from 'react';
+
+interface IState {
+	clicks: number;
+}
+
+export class Clicker extends React.Component<any, IState> {
+	constructor(props) {
+		super(props);
+
+		this.state = {
+			clicks: 0,
+		};
+	}
+
+	public clickHandler = () => {
+		this.setState({ clicks: this.state.clicks + 1 });
+	}
+
+	public render() {
+		return (
+			<div>
+				<p>You have clicked the button {this.state.clicks} time(s).</p>
+				<p>
+					<button onClick={this.clickHandler}>click me</button>
+				</p>
+			</div>
+		);
+	}
+}
diff --git a/docs/_style/prism-master/examples/prism-tt2.html b/docs/_style/prism-master/examples/prism-tt2.html new file mode 100644 index 00000000..1a6711f9 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-tt2.html @@ -0,0 +1,61 @@ +

Comments

+
[%# this entire directive is ignored no
+    matter how many lines it wraps onto
+%]
+[% # this is a comment
+   theta = 20      # so is this
+   rho   = 30      # <aol>me too!</aol>
+%]
+
+ +

Variables

+
[% text %]
+[% article.title %]
+[%= eat.whitespace.left %]
+[% eat.whitespace.right =%]
+[%= eat.whitespace.both =%]
+[% object.method() %]
+ + +

Conditionals and Loops

+
[% IF foo = bar %]
+this
+[% ELSE %]
+that
+[% END %]
+[% FOREACH post IN q.listPosts(lingua = "de") %]
+  <a href="[% post.permalink %]">[% post.title | html %]</a>
+[% END %]
+ +

Multiple Directives

+
[% IF title;
+      INCLUDE header;
+   ELSE;
+      INCLUDE other/header  title="Some Other Title";
+   END
+%]
+ +

Operators

+
[% FOREACH post IN q.listPosts(lingua => 'de') %]
+  [% post.title | myfilter(foo = "bar") %]
+[% END %]
+ +

Known Limitations

+
    +
  • + Outline tags are not supported.
  • +
  • The arguments to + TAGS + are usually misinterpreted
  • +
  • In TT2, you can use keywords as identifiers where this is + unambiguous. But these keywords will be highlighted as keywords, not + as variables here.
  • +
  • The + ANYCASE + option is not supported.
  • +
  • + Any number of backslashes in front of dollar signs inside of double quoted + strings are ignored since the behavior of Template Toolkit 2.26 seems to be + inconsistent. +
  • +
diff --git a/docs/_style/prism-master/examples/prism-twig.html b/docs/_style/prism-master/examples/prism-twig.html new file mode 100644 index 00000000..0a707815 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-twig.html @@ -0,0 +1,35 @@ +

Comments

+
{# Some comment
+on multiple lines
+with <html></html>
+inside #}
+ +

Keywords

+
{% if foo %} bar {% endif %}
+{% for key, value in arr if value %} {{ do_something() }} {% endfor %}
+{% include 'header.html' %}
+{% include 'template.html' with {'foo': 'bar'} %}
+ +

Operators

+
{{ not a }}
+{{ 20 // 7 }}
+{{ b b-and c }}
+{% if phone matches '/^[\\d\\.]+$/' %} ... {% endif %}
+ +

Twig embedded in HTML

+
<div>
+{% if foo %}
+	<p>Foo!</p>
+{% else %}
+	<p>Not foo...</p>
+{% endif %}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Tag containing Twig is not highlighted

+
<div{% if foo %} class="bar"{% endif %}></div>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-typescript.html b/docs/_style/prism-master/examples/prism-typescript.html new file mode 100644 index 00000000..561c4dc4 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-typescript.html @@ -0,0 +1,28 @@ +

Full example

+
interface SearchFunc {
+  (source: string, subString: string): boolean;
+}
+
+var mySearch: SearchFunc;
+mySearch = function(source: string, subString: string) {
+  var result = source.search(subString);
+  if (result == -1) {
+    return false;
+  }
+  else {
+    return true;
+  }
+}
+
+class Greeter {
+    greeting: string;
+    constructor(message: string) {
+        this.greeting = message;
+    }
+    greet() {
+        return "Hello, " + this.greeting;
+    }
+}
+
+var greeter = new Greeter("world");
+
diff --git a/docs/_style/prism-master/examples/prism-vala.html b/docs/_style/prism-master/examples/prism-vala.html new file mode 100644 index 00000000..ef5e98a9 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-vala.html @@ -0,0 +1,33 @@ +

Comments

+
// Single line comment
+/** Multi-line
+doc comment */
+ +

Strings

+
"foo \"bar\" baz"
+"Multi-line strings ending with a \
+are supported too."
+"""Verbatim strings
+You can create
+multi-line strings like this too."""
+@"Template string with variables $var1 $(var2 * 2)"
+ +

Regex

+
/foo?[ ]*bar/
+ +

Full example

+
using Gtk;
+
+int main (string[] args) {
+	Gtk.init(ref args);
+
+	var window = new Window();
+
+	var button = new Button.with_label("Click me!");
+
+	window.add(button);
+	window.show_all();
+
+	Gtk.main();
+	return 0;
+}
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-vbnet.html b/docs/_style/prism-master/examples/prism-vbnet.html new file mode 100644 index 00000000..bc2a376b --- /dev/null +++ b/docs/_style/prism-master/examples/prism-vbnet.html @@ -0,0 +1,16 @@ +

Comments

+
!foobar
+REM foobar
+'foobar
+ +

Example

+
Public Function findValue(ByVal arr() As Double,
+    ByVal searchValue As Double) As Double
+    Dim i As Integer = 0
+    While i <= UBound(arr) AndAlso arr(i) <> searchValue
+        ' If i is greater than UBound(arr), searchValue is not checked.
+        i += 1
+    End While
+    If i > UBound(arr) Then i = -1
+    Return i
+End Function
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-velocity.html b/docs/_style/prism-master/examples/prism-velocity.html new file mode 100644 index 00000000..a97fa05e --- /dev/null +++ b/docs/_style/prism-master/examples/prism-velocity.html @@ -0,0 +1,47 @@ +

Comments

+
## Single line comment
+#* Multi-line
+comment *#
+ +

Unparsed sections

+
## Section below is not parsed
+#[[
+	## This is not a comment
+]]#
+ +

Variables

+
$mud
+$customer.Name
+$flogger.getPromo( $mud )
+$!{mudSlinger_9}
+$foo[0]
+$foo[$i]
+$foo["bar"]
+$foo.bar[1].junk
+$foo.callMethod()[1]
+ +

Directives

+
#set($foo.bar[1] = 3)
+#if($a==1)true enough#{else}no way!#end
+#macro( d )
+<tr><td>$!bodyContent</td></tr>
+#end
+#@d()Hello!#end
+ +

Integration with HTML

+
<html>
+  <body>
+    Hello $customer.Name!
+    <table>
+    #foreach( $mud in $mudsOnSpecial )
+      #if ( $customer.hasPurchased($mud) )
+        <tr>
+          <td>
+            $flogger.getPromo( $mud )
+          </td>
+        </tr>
+      #end
+    #end
+    </table>
+  </body>
+</html>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-verilog.html b/docs/_style/prism-master/examples/prism-verilog.html new file mode 100644 index 00000000..d7c9a0bf --- /dev/null +++ b/docs/_style/prism-master/examples/prism-verilog.html @@ -0,0 +1,103 @@ +

Note that this package supports syntax highlighting for both Verilog and System Verilog.

+ +

Comments

+
/* Multiline comments in Verilog
+   look like C comments and // is OK in here. */
+// Single-line comment in Verilog.
+ +

Literals

+
// example code from: http://iroi.seu.edu.cn/books/asics/Book2/CH11/CH11.02.htm
+module declarations;
+  parameter H12_UNSIZED = 'h 12;
+  parameter H12_SIZED = 6'h 12;
+  parameter D42 = 8'B0010_1010;
+  parameter D123 = 123;
+  parameter D63 = 8'o 77;
+  parameter A = 'h x, B = 'o x, C = 8'b x, D = 'h z, E = 16'h ????;
+  reg [3:0] B0011,Bxxx1,Bzzz1;
+  real R1,R2,R3;
+  integer I1,I3,I_3;
+  parameter BXZ = 8'b1x0x1z0z;
+
+  initial begin
+    B0011 = 4'b11; Bxxx1 = 4'bx1; Bzzz1 = 4'bz1;
+    R1 = 0.1e1; R2 = 2.0; R3 = 30E-01;
+    I1 = 1.1; I3 = 2.5; I_3 = -2.5;
+  end
+
+  initial begin #1;
+    $display("H12_UNSIZED, H12_SIZED (hex) = %h, %h",H12_UNSIZED, H12_SIZED);
+    $display("D42 (bin) = %b",D42," (dec) = %d",D42);
+    $display("D123 (hex) = %h",D123," (dec) = %d",D123);
+    $display("D63 (oct) = %o",D63);
+    $display("A (hex) = %h",A," B (hex) = %h",B);
+    $display("C (hex) = %h",C," D (hex) = %h",D," E (hex) = %h",E);
+    $display("BXZ (bin) = %b",BXZ," (hex) = %h",BXZ);
+    $display("B0011, Bxxx1, Bzzz1 (bin) = %b, %b, %b",B0011,Bxxx1,Bzzz1);
+    $display("R1, R2, R3 (e, f, g) = %e, %f, %g", R1, R2, R3);
+    $display("I1, I3, I_3 (d) = %d, %d, %d", I1, I3, I_3);
+  end
+endmodule
+ +

Full example

+
`include "internal_defines.vh"
+
+//*****************************************************************************
+// memory_decoder: a custom module used to handle memory transactions
+//*****************************************************************************
+//
+// out_mem (output) - The output to memory
+// out_reg (output) - The output to the register file
+// mem_we  (output) - Which byte in the word to write too
+// mem_in  (input)  - The input from memory
+// addr_in (input)  - The lowest 2 bits of byte offset to store in memory
+// data_in (input)  - The input from the register file to be stored
+// l_bit   (input)  - The load bit signal (control)
+// b_bit   (input)  - The byte bit signal (control)
+//
+module memory_decoder(out_mem, out_reg, mem_in, data_in, l_bit, b_bit, addr_in,
+                      mem_we);
+
+  output reg  [31:0]  out_mem, out_reg;
+  output reg  [3:0]   mem_we;
+  input       [31:0]  mem_in, data_in;
+  input       [1:0]   addr_in;
+  input               l_bit, b_bit;
+
+  always_comb begin
+    mem_we = 4'b0000;     // dont write memory by default
+    if (l_bit == 1) begin // ldr and ldrb
+      out_mem = mem_in;   // dont change memory!
+      if (b_bit == 1) begin
+        /* figure out which byte to load from memory */
+        case (addr_in)
+          2'b00: out_reg = {24'b00, mem_in[7:0]};
+          2'b01: out_reg = {24'b00, mem_in[15:8]};
+          2'b10: out_reg = {24'b00, mem_in[23:16]};
+          2'b11: out_reg = {24'b00, mem_in[31:24]};
+        endcase
+      end
+      else begin
+        out_reg = mem_in;
+      end
+    end
+    else begin            // str and strb
+      out_reg = `UNKNOWN; // We are not reading from mem
+      if (b_bit == 1) begin
+        /* figure out which byte to write to in memory */
+        out_mem = {4{data_in[7:0]}};
+        case (addr_in)
+          2'b00: mem_we = 4'b1000;
+          2'b01: mem_we = 4'b0100;
+          2'b10: mem_we = 4'b0010;
+          2'b11: mem_we = 4'b0001;
+        endcase
+      end
+      else begin
+        mem_we = 4'b1111; // write to all channels
+        out_mem = data_in;
+      end
+    end
+  end
+
+endmodule
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-vhdl.html b/docs/_style/prism-master/examples/prism-vhdl.html new file mode 100644 index 00000000..b4950851 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-vhdl.html @@ -0,0 +1,92 @@ +

Comments

+
-- I am a comment
+I am not
+ +

Literals

+
constant FREEZE : integer := 32;
+constant TEMP : real := 32.0;
+A_INT <= 16#FF#;
+B_INT <= 2#1010_1010#;
+MONEY := 1_000_000.0;
+FACTOR := 2.2E-6;
+constant DEL1 :time := 10 ns;
+constant DEL2 :time := 2.27 us;
+type MY_LOGIC is ('X','0','1','Z');
+type T_STATE is (IDLE, READ, END_CYC);
+signal CLK : MY_LOGIC := '0';
+signal STATE : T_STATE := IDLE;
+constant FLAG :bit_vector(0 to 7) := "11111111";
+constant MSG : string := "Hello";
+BIT_8_BUS <= B"1111_1111";
+BIT_9_BUS <= O"353";
+BIT_16_BUS <= X"AA55";
+constant TWO_LINE_MSG : string := "Hello" & CR & "World";
+ +

Full example

+
-- example code from: http://www.csee.umbc.edu/portal/help/VHDL/samples/samples.html
+library IEEE;
+use IEEE.std_logic_1164.all;
+
+entity fadd is               -- full adder stage, interface
+  port(a    : in  std_logic;
+       b    : in  std_logic;
+       cin  : in  std_logic;
+       s    : out std_logic;
+       cout : out std_logic);
+end entity fadd;
+
+architecture circuits of fadd is  -- full adder stage, body
+begin  -- circuits of fadd
+  s <= a xor b xor cin after 1 ns;
+  cout <= (a and b) or (a and cin) or (b and cin) after 1 ns;
+end architecture circuits; -- of fadd
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+entity add32 is             -- simple 32 bit ripple carry adder
+  port(a    : in  std_logic_vector(31 downto 0);
+       b    : in  std_logic_vector(31 downto 0);
+       cin  : in  std_logic;
+       sum  : out std_logic_vector(31 downto 0);
+       cout : out std_logic);
+end entity add32;
+
+architecture circuits of add32 is
+  signal c : std_logic_vector(0 to 30); -- internal carry signals
+begin  -- circuits of add32
+  a0: entity WORK.fadd port map(a(0), b(0), cin, sum(0), c(0));
+  stage: for I in 1 to 30 generate
+             as: entity WORK.fadd port map(a(I), b(I), c(I-1) , sum(I), c(I));
+         end generate stage;
+  a31: entity WORK.fadd port map(a(31), b(31), c(30) , sum(31), cout);
+end architecture circuits;  -- of add32
+
+use STD.textio.all;
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.std_logic_textio.all;
+
+entity signal_trace is
+end signal_trace;
+
+architecture circuits of signal_trace is
+  signal a:    std_logic_vector(31 downto 0) := x"00000000";
+  signal b:    std_logic_vector(31 downto 0) := x"FFFFFFFF";
+  signal cin:  std_logic := '1';
+  signal cout: std_logic;
+  signal sum:  std_logic_vector(31 downto 0);
+begin  -- circuits of signal_trace
+  adder: entity WORK.add32 port map(a, b, cin, sum, cout); -- parallel circuit
+
+  prtsum: process (sum)
+            variable my_line : LINE;
+            alias swrite is write [line, string, side, width] ;
+          begin
+            swrite(my_line, "sum=");
+            write(my_line, sum);
+            swrite(my_line, ",  at=");
+            write(my_line, now);
+            writeline(output, my_line);
+          end process prtsum;
+
+end architecture circuits; -- of signal_trace
diff --git a/docs/_style/prism-master/examples/prism-vim.html b/docs/_style/prism-master/examples/prism-vim.html new file mode 100644 index 00000000..567b8206 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-vim.html @@ -0,0 +1,25 @@ +

Comments

+
" This is a comment
+ +

Variables

+

+set softab = 2
+map <leader>tn :tabnew
+
+ +

Map

+
mystring = :steveT;
+ +

Functions

+

+func! DeleteTrailingWS()
+  exe "normal mz"
+  %s/\s\+$//ge
+  exe "normal `z"
+endfunc
+ +

Logic

+

+if has("mac")
+  nmap <D-j> <M-j>
+endif
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-visual-basic.html b/docs/_style/prism-master/examples/prism-visual-basic.html new file mode 100644 index 00000000..733faa82 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-visual-basic.html @@ -0,0 +1,36 @@ +

Comments

+
' Comment
+REM This is a comment too
+ +

Strings and characters

+
"Foo""bar"
+“”
+"a"c
+ +

Dates and times

+
# 8/23/1970 3:45:39AM #
+#8/23/1970 #
+# 3:45:39AM #
+# 3:45:39#
+# 13:45:39 #
+# 1AM #
+# 13:45:39PM #
+ +

Numbers

+
42S
+.369E+14
+3.1415R
+ +

Preprocessing directives

+
#ExternalChecksum("c:\wwwroot\inetpub\test.aspx", _
+    "{12345678-1234-1234-1234-123456789abc}", _
+    "1a2b3c4e5f617239a49b9a9c0391849d34950f923fab9484")
+ +

Keywords

+
Function AddNumbers(ByVal X As Integer, ByVal Y As Integer)
+    AddNumbers = X + Y
+End Function
+Module Test
+    Sub Main()
+    End Sub
+End Module
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-wasm.html b/docs/_style/prism-master/examples/prism-wasm.html new file mode 100644 index 00000000..5cc1b65c --- /dev/null +++ b/docs/_style/prism-master/examples/prism-wasm.html @@ -0,0 +1,43 @@ +

Comments

+
;; Single line comment
+(; Multi-line
+comment ;)
+ +

Strings

+
""
+"Foobar"
+"Foo\"ba\\r"
+ +

Numbers

+
42
+3.1415
+0.4E-4
+-3.1_41_5
+0xBADFACE
+0xB_adF_a_c_e
++0x4E.F7
+0xFFp+4
+inf
+nan
+nan:0xf4
+ +

Keywords

+
(func (param i32) (param f32) (local f64)
+  get_local 0
+  get_local 1
+  get_local 2)
+ +

Identifiers

+
$p
+$getAnswer
+$return_i32
+ +

Full example

+
(module
+  (import "js" "memory" (memory 1))
+  (import "js" "table" (table 1 anyfunc))
+  (elem (i32.const 0) $shared0func)
+  (func $shared0func (result i32)
+   i32.const 0
+   i32.load)
+)
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-wiki.html b/docs/_style/prism-master/examples/prism-wiki.html new file mode 100644 index 00000000..295eb3f8 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-wiki.html @@ -0,0 +1,165 @@ +

Embedded markup

+
Paragraphs can be forced in lists by using HTML tags.
+Two line break symbols, <code><nowiki><br /><br /></nowiki></code>, will create the desired effect. So will enclosing all but the first paragraph with <code><nowiki><p>...</p></nowiki></code>
+ +

Headings

+
= Header 1 =
+== Header 2 ==
+=== Header 3 ===
+==== Header 4 ====
+===== Header 5 =====
+====== Header 6 ======
+ +

Bold and italic

+
'''''Both bold and italic'''''
+'''Only bold'''
+''Only italic''
+ +

Links and Magic links

+
[[w:en:Formal_grammar|Formal grammar]]
+[http://www.cl.cam.ac.uk/~mgk25/iso-ebnf.html EBNF help]
+
+ISBN 1234567890
+ISBN 123456789x
+ISBN      1 2 3-4-5 6789 X
+ISBN 978-9999999999
+
+RFC 822
+PMID 822
+ +

Magic words and special symbols

+
#REDIRECT [[somewhere]]
+
+{{SITENAME}}
+{{PAGESINCATEGORY:category}}
+{{#dateformat:2009-12-25|mdy}}
+
+__NOTOC__
+
+{{!}}
+
+~~~ ~~~~ ~~~~~
+ +

Lists

+
* Lists are easy to do:
+** start every line
+* with a star
+** more stars mean
+*** deeper levels
+
+# Numbered lists are good
+## very organized
+## easy to follow
+
+; Definition lists
+; item : definition
+; semicolon plus term
+: colon plus definition
+
+* Or create mixed lists
+*# and nest them
+*#* like this
+*#*; definitions
+*#*: work:
+*#*; apple
+*#*; banana
+*#*: fruits
+ +

Tables

+
{|
+|Orange
+|Apple
+|-
+|Bread
+|Pie
+|-
+|Butter
+|Ice cream
+|}
+
+{|
+|Lorem ipsum dolor sit amet,
+consetetur sadipscing elitr,
+sed diam nonumy eirmod tempor invidunt
+ut labore et dolore magna aliquyam erat,
+sed diam voluptua.
+
+At vero eos et accusam et justo duo dolores
+et ea rebum. Stet clita kasd gubergren,
+no sea takimata sanctus est Lorem ipsum
+dolor sit amet.
+|
+* Lorem ipsum dolor sit amet
+* consetetur sadipscing elitr
+* sed diam nonumy eirmod tempor invidunt
+|}
+
+{|
+|  Orange    ||   Apple   ||   more
+|-
+|   Bread    ||   Pie     ||   more
+|-
+|   Butter   || Ice cream ||  and more
+|}
+
+{|
+! style="text-align:left;"| Item
+! Amount
+! Cost
+|-
+|Orange
+|10
+|7.00
+|-
+|Bread
+|4
+|3.00
+|-
+|Butter
+|1
+|5.00
+|-
+!Total
+|
+|15.00
+|}
+
+{|
+! style="text-align:left;"| Item !! style="color:red;"| Amount !! Cost
+|-
+|Orange
+|10
+|7.00
+|-
+| style="text-align:right;"| Bread
+|4
+|3.00
+|-
+|Butter
+|1
+|5.00
+|-
+!Total
+|
+|15.00
+|}
+ +

Known failures

+

There are certain edge cases where Prism will fail. + There are always such cases in every regex-based syntax highlighter. + However, Prism dares to be open and honest about them. + If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug. +

+ +

Nested magic words are not supported

+ +
{{#switch:{{PAGENAME}}
+| L'Aquila = No translation
+| L = Not OK
+| L'Aquila = Entity escaping
+| L'Aquila = Numeric char encoding
+}}
+ +

Nesting of bold and italic is not supported

+
''Italic with '''bold''' inside''
+ diff --git a/docs/_style/prism-master/examples/prism-xeora.html b/docs/_style/prism-master/examples/prism-xeora.html new file mode 100644 index 00000000..541a9165 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-xeora.html @@ -0,0 +1,111 @@ +

Special Constants

+
$DomainContents$
+$PageRenderDuration$
+ +

Operators & Variables

+
$SearchKey$
+$^SearchKey$
+$~SearchKey$
+$-SearchKey$
+$+SearchKey$
+$=SearchKey$
+$#SearchKey$
+$##SearchKey$
+
+$*SearchKey$
+
+$@SearchObject.SearchProperty$
+$@#SearchObject.SearchProperty$
+$@-SearchObject.SearchProperty$
+ +

Controls

+
$C:ControlID$
+$C:ControlID:{ <!-- Something --> }:ControlID$
+$C:ControlID:{ <!-- Something --> }:ControlID:{ <!-- Something (Alternative) --> }:ControlID$
+
+Control with Parent
+$C[Control1]:Control2$
+$C[Control2]:Control3:{ <!-- Something --> }:Control3$
+$C[Control2]:Control3:{ <!-- Something --> }:Control3:{ <!-- Something (Alternative) --> }:Control3$
+
+Control with Parent & Leveling
+$C#1[ParentControlID]:ControlID:{ <!-- Something --> }:ControlID$
+
+All Control Tags has leveling specification;
+$C:LoopControl1:{
+	$#FirstLoopSQLField1$
+
+	$C:ControlID:{ <!-- Something --> }:ControlID$
+
+	$C:LoopControl2:{
+		$##FirstLoopSQLField1$
+		$#SecondLoopSQLField1$
+
+		$C#1:ControlID:{ <!-- Something --> }:ControlID$
+	}:LoopControl2$
+}:LoopControl1$
+
+XML setup on a Control in Controls.xml
+<Control id="[ControlID]">
+	<Type>[ControlType]</Type>
+
+	<Bind>[ThemeID|AddonID]?[ControlClass].[FunctionName],SomeOperatorTags(seperated with |)</Bind>
+
+	<BlockIDsToUpdate localupdate="True|False">
+		<BlockID>[BlockID]</BlockID>
+		<BlockID>[BlockID]</BlockID>
+		<BlockID>[BlockID]</BlockID>
+	</BlockIDsToUpdate>
+
+	<DefaultButtonID>[ControlID]</DefaultButtonID>
+
+	<Text>[TextBox, Password value or Button Text]</Text>
+
+	<Content>[Textarea Content]</Content>
+
+	<Source>[Image URL]</Source>
+
+	<Url>[Link URL]</Url>
+
+	<Attributes>
+		<Attribute key="[HTMLAttributeKey]">[AttributeValue]</Attributes>
+	</Attributes>
+</Control>
+ +

Directives

+
$T:TemplateID$
+$L:TranslationID$
+$P:TemplateID$
+ +

Executable Functions

+
$F:AddonLib1?GlobalControls.PrintOutSums$
+$F:AddonLib1?GlobalControls.PrintOut,~FormField$
+$F:AddonLib1?GlobalControls.SumNumbers,~FormField|=5$
+ +

Client Side Function Binding

+
$XF:{AddonLib1?GlobalControls.SumNumbers,~FormField|=5}:XF$
+ +

Inline Statements

+
$S:StatementID:{ <!-- C# Code --> }:StatementID$
+$S:StatementID:{!NOCACHE <!-- C# Code --> }:StatementID$
+
+$S:Statement1:{
+	int intvalue1 = 5;
+	int intvalue2 = Integer.Parse("0" + $~FormValue$);
+
+	return intvalue1 * intvalue2;
+}:Statement1$
+ +

Request Blocks

+
$H:RequestBlockID:{ <!-- Something --> }:RequestBlockID$
+$H:RequestBlockID:{!RENDERONREQUEST <!-- Something --> }:RequestBlockID$
+ +

Cache Block

+
$PC:{ <!-- Page Content Part --> }:PC$
+ +

Message Handling Block

+
$MB:{ <!-- Message Output Content --> }:MB$
+$MB:{
+	$#Message$
+	$#MessageType$
+}:MB$
diff --git a/docs/_style/prism-master/examples/prism-xojo.html b/docs/_style/prism-master/examples/prism-xojo.html new file mode 100644 index 00000000..35480744 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-xojo.html @@ -0,0 +1,63 @@ +

Comments

+
' This is a comment
+// This is a comment too
+Rem This is a remark
+ +

Strings

+
""
+"foo ""bar"" baz"
+ +

Numbers and colors

+
42
+3.14159
+3E4
+&b0110
+&cAABBCCDD
+&hBadFace
+&o777
+&u9
+ +

Example

+
Dim g As Graphics
+Dim yOffSet As Integer
+g = OpenPrinterDialog()
+If g <> Nil Then
+  If MainDishMenu.ListIndex <> -1 Then
+    g.Bold = True
+    g.DrawString("Main Dish:",20,20)
+    g.Bold = False
+    g.DrawString(MainDishMenu.Text,100,20)
+    g.Bold = True
+    g.DrawString("Side Order:",20,40)
+    g.Bold = False
+    If FriesRadio.Value Then
+      g.DrawString(FriesRadio.Caption,100,40)
+    End If
+    If PotatoRadio.Value Then
+      g.DrawString(PotatoRadio.Caption,100,40)
+    End If
+    If OnionRingRadio.Value Then
+      g.DrawString(OnionRingRadio.Caption,100,40)
+    End If
+    yOffSet = 60
+    If CheeseCheckBox.Value Then
+      g.Bold = True
+      g.DrawString("Extra:",20,yOffSet)
+      g.Bold = False
+      g.DrawString(CheeseCheckBox.Caption,100,yOffSet)
+      yOffSet = yOffSet + 20
+    End If
+    If BaconCheckBox.Value Then
+      g.Bold = True
+      g.DrawString("Extra:",20,yOffSet)
+      g.Bold = False
+      g.DrawString(BaconCheckBox.Caption,100,yOffSet)
+      yOffSet = yOffSet + 20
+    End If
+    g.Bold = True
+    g.DrawString("Notes:",20,yOffSet)
+    g.Bold = False
+    g.DrawString(NotesField.Text,100,yOffSet,(g.Width-40))
+  End If
+End If
+
diff --git a/docs/_style/prism-master/examples/prism-xquery.html b/docs/_style/prism-master/examples/prism-xquery.html new file mode 100644 index 00000000..8166d771 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-xquery.html @@ -0,0 +1,47 @@ +

Comments

+
(::)
+(: Comment :)
+(: Multi-line
+comment :)
+(:~
+: The <b>functx:substring-after-last</b> function returns the part
+: of <b>$string</b> that appears after the last occurrence of
+: <b>$delim</b>. If <b>$string</b> does not contain
+: <b>$delim</b>, the entire string is returned.
+:
+: @param $string the string to substring
+: @param $delim the delimiter
+: @return the substring
+:)
+ +

Variables

+
$myProduct
+$foo-bar
+$strings:LetterA
+ +

Functions

+
document-node(schema-element(catalog))
+strings:trim($arg as xs:string?)
+false()
+ +

Keywords

+
xquery version "1.0";
+declare default element namespace "http://datypic.com/cat";
+declare boundary-space preserve;
+declare default collation "http://datypic.com/collation/custom";
+ +

Types

+
xs:anyAtomicType
+element
+xs:double
+ +

Full example

+
<report xmlns="http://datypic.com/report"
+xmlns:cat="http://datypic.com/cat"
+xmlns:prod="http://datypic.com/prod"> {
+for $product in doc("prod_ns.xml")/prod:product
+return <lineItem>
+{$product/prod:number}
+{$product/prod:name}
+</lineItem>
+} </report>
\ No newline at end of file diff --git a/docs/_style/prism-master/examples/prism-yaml.html b/docs/_style/prism-master/examples/prism-yaml.html new file mode 100644 index 00000000..bea52f86 --- /dev/null +++ b/docs/_style/prism-master/examples/prism-yaml.html @@ -0,0 +1,107 @@ +

Null and Boolean

+
---
+A null: null
+A null: ~
+Also a null: # Empty
+Not a null: ""
+Booleans: [ true, True, false, FALSE ]
+
+ +

Numbers and timestamps

+
---
+Integers: [ 0, -0, 3, 0o7, 0x3A, -19 ]
+Floats: [ 0., -0.0, .5, 12e03, +12e03, -2E+05 ]
+Also floats: [ .inf, -.Inf, +.INF, .NAN ]
+Timestamps:
+  canonical: 2001-12-15T02:59:43.1Z
+  iso8601: 2001-12-14t21:59:43.10-05:00
+  spaced: 2001-12-14 21:59:43.10 -5
+  date: 2002-12-14
+  times:
+    - 10:53
+    - 10:53:20.53
+
+ +

Strings

+
---
+product: High Heeled "Ruby" Slippers
+description: "Putting on these \"slippers\" is easy."
+address:
+  city:   East Centerville
+  street: !!str |
+    123 Tornado Alley
+    Suite 16
+
+  specialDelivery:  >
+    Follow the Yellow Brick
+    Road to the Emerald City.
+    #Pay no attention to the
+    man behind the curtain.
+
+ +

Sequences and maps

+
---
+- Casablanca
+- North by Northwest
+- {
+    name: John Smith, age: 33}
+- name: Mary Smith
+  age: 27
+---
+"name": John Smith
+age: 33
+men: [ John Smith,
+    "Bill Jones" ]
+women:
+ - Mary Smith
+ - "Susan Williams"
+
+ +

Tags

+
---
+!!map {
+  ? !!str friends: !!seq [
+    !!map {
+      ? !!str "age"
+      : !!int 33,
+      ? !!str "name"
+      : !!str "John Smith",
+    }
+  ],
+  men:
+    [ !!str "John Smith", !!str "Bill Jones"]
+}
+
+ +

Full example

+
%YAML 1.2
+--- !<tag:clarkevans.com,2002:invoice>
+invoice: 34843
+date   : 2001-01-23
+bill-to: &id001
+  given  : Chris
+  family : Dumars
+  address:
+    lines: |
+      458 Walkman Dr.
+      Suite #292
+    city    : Royal Oak
+    state   : MI
+    postal  : 48046
+ship-to:
+  <<: *id001
+  product:
+    - sku         : BL394D
+      quantity    : 4
+      description : Basketball
+      price       : 450.00
+    - sku         : BL4438H
+      quantity    : 1
+      description : Super Hoop
+      price       : 2392.00
+tax  : 251.42
+total: 4443.52
+comments:
+    Late afternoon is best.
+    Backup contact is Nancy
+
diff --git a/docs/_style/prism-master/extending.html b/docs/_style/prism-master/extending.html new file mode 100644 index 00000000..59101b6f --- /dev/null +++ b/docs/_style/prism-master/extending.html @@ -0,0 +1,247 @@ + + + + + + +Extending Prism ▲ Prism + + + + + + + + + +
+
+ +

Extending Prism

+

Prism is awesome out of the box, but it’s even awesomer when it’s customized to your own needs. This section will help you write new language definitions, plugins and all-around Prism hacking.

+
+ +
+

Language definitions

+ +

Every language is defined as a set of tokens, which are expressed as regular expressions. For example, this is the language definition for CSS:

+

+
+	

A regular expression literal is the simplest way to express a token. An alternative way, with more options, is by using an object literal. With that notation, the regular expression describing the token would be the pattern attribute:

+
...
+'tokenname': {
+	pattern: /regex/
+}
+...
+

So far the functionality is exactly the same between the short and extended notations. However, the extended notation allows for additional options:

+ +
+
inside
+
This property accepts another object literal, with tokens that are allowed to be nested in this token. + This makes it easier to define certain languages. However, keep in mind that they’re slower and if coded poorly, can even result in infinite recursion. + For an example of nested tokens, check out the Markup language definition: +
+ +
lookbehind
+
This option mitigates JavaScript’s lack of lookbehind. When set to true, + the first capturing group in the regex pattern is discarded when matching this token, so it effectively behaves + as if it was lookbehind. For an example of this, check out the C-like language definition, in particular the comment and class-name tokens: +
+ +
rest
+
Accepts an object literal with tokens and appends them to the end of the current object literal. Useful for referring to tokens defined elsewhere. For an example where rest is useful, check the Markup definitions above.
+ +
alias
+
This option can be used to define one or more aliases for the matched token. The result will be, that + the styles of the token and its aliases are combined. This can be useful, to combine the styling of a well known + token, which is already supported by most of the themes, with a semantically correct token name. The option + can be set to a string literal or an array of string literals. In the following example the token + name latex-equation is not supported by any theme, but it will be highlighted the same as a string. +
{
+	'latex-equation': {
+		pattern: /\$(\\?.)*?\$/g,
+		alias: 'string'
+	}
+}
+ +
greedy
+
This is a boolean attribute. It is intended to solve a common problem with + patterns that match long strings like comments, regex or string literals. For example, + comments are parsed first, but if the string /* foo */ + appears inside a string, you would not want it to be highlighted as a comment. + The greedy-property allows a pattern to ignore previous matches of other patterns, and + overwrite them when necessary. Use this flag with restraint, as it incurs a small performance overhead. + The following example demonstrates its usage: +
'string': {
+	pattern: /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
+	greedy: true
+}
+
+ +

Unless explicitly allowed through the inside property, each token cannot contain other tokens, so their order is significant. Although per the ECMAScript specification, objects are not required to have a specific ordering of their properties, in practice they do in every modern browser.

+ +

In most languages there are multiple different ways of declaring the same constructs (e.g. comments, strings, ...) and sometimes it is difficult or unpractical to match all of them with one single regular expression. To add multiple regular expressions for one token name an array can be used:

+ +
...
+'tokenname': [ /regex0/, /regex1/, { pattern: /regex2/ } ]
+...
+ +
+

Prism.languages.insertBefore(inside, before, insert, root)

+ +

This is a helper method to ease modifying existing languages. For example, the CSS language definition not only defines CSS highlighting for CSS documents, + but also needs to define highlighting for CSS embedded in HTML through <style> elements. To do this, it needs to modify + Prism.languages.markup and add the appropriate tokens. However, Prism.languages.markup + is a regular JavaScript object literal, so if you do this:

+ +
Prism.languages.markup.style = {
+	/* tokens */
+};
+ +

then the style token will be added (and processed) at the end. Prism.languages.insertBefore allows you to insert + tokens before existing tokens. For the CSS example above, you would use it like this:

+ +
Prism.languages.insertBefore('markup', 'cdata', {
+	'style': {
+		/* tokens */
+	}
+});
+ +

Parameters

+
+
inside
+
The property of root that contains the object to be modified.
+ +
before
+
Key to insert before (String)
+ +
insert
+
An object containing the key-value pairs to be inserted
+ +
root
+
The root object, i.e. the object that contains the object that will be modified. Optional, default value is Prism.languages.
+
+
+
+ +
+

Writing plugins

+ +

Prism’s plugin architecture is fairly simple. To add a callback, you use Prism.hooks.add(hookname, callback). + hookname is a string with the hook id, that uniquely identifies the hook your code should run at. + callback is a function that accepts one parameter: an object with various variables that can be modified, since objects in JavaScript are passed by reference. + For example, here’s a plugin from the Markup language definition that adds a tooltip to entity tokens which shows the actual character encoded: +

Prism.hooks.add('wrap', function(env) {
+	if (env.token === 'entity') {
+		env.attributes['title'] = env.content.replace(/&amp;/, '&');
+	}
+});
+

Of course, to understand which hooks to use you would have to read Prism’s source. Imagine where you would add your code and then find the appropriate hook. + If there is no hook you can use, you may request one to be added, detailing why you need it there. +

+ +
+

API documentation

+ +
+

Prism.highlightAll(async, callback)

+

This is the most high-level function in Prism’s API. It fetches all the elements that have a .language-xxxx class + and then calls Prism.highlightElement() on each one of them.

+ +

Parameters

+
+
async
+
+ Whether to use Web Workers to improve performance and avoid blocking the UI when highlighting very large + chunks of code. False by default + (why?).
+ Note: All language definitions required to highlight the code must be included in the main prism.js + file for the async highlighting to work. You can build your own bundle on the Download page. +
+ +
callback
+
+ An optional callback to be invoked after the highlighting is done. Mostly useful when async + is true, since in that case, the highlighting is done asynchronously. +
+
+
+ +
+

Prism.highlightAllUnder(element, async, callback)

+

Fetches all the descendants of element that have a .language-xxxx class + and then calls Prism.highlightElement() on each one of them.

+ +

Parameters

+
+
element
+
The root element, whose descendants that have a .language-xxxx class will be highlighted.
+ +
async
+
Same as in Prism.highlightAll()
+ +
callback
+
Same as in Prism.highlightAll()
+
+
+ +
+

Prism.highlightElement(element, async, callback)

+

Highlights the code inside a single element.

+ +

Parameters

+
+
element
+
The element containing the code. It must have a class of language-xxxx to be processed, where xxxx is a valid language identifier.
+ +
async
+
Same as in Prism.highlightAll()
+
callback
+
Same as in Prism.highlightAll()
+
+
+ +
+

Prism.highlight(text, grammar)

+

Low-level function, only use if you know what you’re doing. + It accepts a string of text as input and the language definitions to use, and returns a string with the HTML produced.

+ +

Parameters

+
+
text
+
A string with the code to be highlighted.
+
grammar
+
An object containing the tokens to use. Usually a language definition like Prism.languages.markup
+
+ +

Returns

+

The highlighted HTML

+
+ +
+

Prism.tokenize(text, grammar)

+

This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input and the language definitions to use, and returns an array with the tokenized code. + When the language definition includes nested tokens, the function is called recursively on each of these tokens. This method could be useful in other contexts as well, as a very crude parser.

+ +

Parameters

+
+
text
+
A string with the code to be highlighted.
+
grammar
+
An object containing the tokens to use. Usually a language definition like Prism.languages.markup
+
+ +

Returns

+

An array of strings, tokens (class Prism.Token) and other arrays.

+
+
+ +
+ + + + + + + + diff --git a/docs/_style/prism-master/faq.html b/docs/_style/prism-master/faq.html new file mode 100644 index 00000000..ae32cb68 --- /dev/null +++ b/docs/_style/prism-master/faq.html @@ -0,0 +1,182 @@ + + + + + + +FAQ ▲ Prism + + + + + + + + + + +
+
+ +

FAQ

+

Frequently Asked Questions, with a few Questions I want people to Frequently Ask.

+
+ +
+

This page doesn’t work in Opera!

+ +

Prism works fine in Opera. However, this page might sometimes appear to not be working in Opera, due to the theme switcher triggering an Opera bug. + This will be fixed soon.

+
+ +
+

Isn’t it bad to do syntax highlighting with regular expressions?

+ +

It is true that to correctly handle every possible case of syntax found in the wild, one would need to write a full-blown parser. + However, in most web applications and websites a small error margin is usually acceptable and a rare highlighting failure is not the end of the world. + A syntax highlighter based on regular expressions might only be accurate 99% of the time (the actual percentage is just a guess), + but in exchange for the small error margin, it offers some very important benefits: + +

    +
  • Smaller filesize. Proper parsers are very big.
  • +
  • Extensibility. Authors can define new languages simply by knowing how to code regular expressions. + Writing a correct, unambiguous BNF grammar is a task at least an order of magnitude harder.
  • +
  • Graceful error recovery. Parsers fail on incorrect syntax, where regular expressions keep matching.
  • +
+ +

For this reason, most syntax highlighters on the web and on desktop, are powered by regular expressions. This includes the internal syntax + highlighters used by popular native applications like Espresso and Sublime Text, at the time of writing. + Of course, not every regex-powered syntax highlighter is created equal. The number and type of failures can be vastly different, depending on + the exact algorithm used. Prism’s known failures are documented in the Examples section.

+
+ +
+

Why is asynchronous highlighting disabled by default?

+ +

Web Workers are good for preventing syntax highlighting of really large code blocks from blocking the main UI thread. + In most cases, you will want to highlight reasonably sized chunks of code, and this will not be needed. + Furthermore, using Web Workers is actually slower than synchronously highlighting, due to the overhead of creating and terminating + the Worker. It just appears faster in these cases because it doesn’t block the main thread. + In addition, since Web Workers operate on files instead of objects, plugins that hook on core parts of Prism (e.g. modify language definitions) + will not work unless included in the same file (using the builder in the Download page will protect you from this pitfall). + Lastly, Web Workers cannot interact with the DOM and most other APIs (e.g. the console), so they are notoriously hard to debug. +

+
+ +
+

Why is pre-existing HTML stripped off?

+ +

Because it would complicate the code a lot, although it’s not a crucial feature for most people. + If it’s very important to you, you can use the Keep Markup plugin.

+
+ +
+

If pre-existing HTML is stripped off, how can I highlight certain parts of the code?

+ +

There is a number of ways around it. You can always break the block of code into multiple parts, and wrap the HTML around it (or just use a .highlight class). + You can see an example of this in action at the “Basic usage” section of the homepage.

+

Another way around the limitation is to use the Line Highlght plugin, to highlight and link to specific lines and/or line ranges. +

+ +
+

How do I know which tokens I can style for every language?

+ +

Every token that is highlighted gets two classes: token and a class with the token type (e.g. comment). + You can find the different types of tokens either by looking at the keys of the object defining the language or by running this snippet in the console: +

function printTokens(o, prefix) { for (var i in o) { console.log((prefix? prefix + ' > ' : '') + i); if (o[i].inside) printTokens(o[i].inside, (prefix? prefix + ' > ' : '') + i); } };
+

Then you can use the function for every language you want to examine. For example, markup:

+
printTokens(Prism.languages.markup);
+

which outputs:

+
comment
+prolog
+doctype
+script
+script > tag
+script > tag > tag
+script > tag > tag > punctuation
+script > tag > tag > namespace
+script > tag > attr-value
+script > tag > attr-value > punctuation
+script > tag > punctuation
+script > tag > attr-name
+script > tag > attr-name > namespace
+script > rest
+style
+style > tag
+style > tag > tag
+style > tag > tag > punctuation
+style > tag > tag > namespace
+style > tag > attr-value
+style > tag > attr-value > punctuation
+style > tag > punctuation
+style > tag > attr-name
+style > tag > attr-name > namespace
+style > rest
+cdata
+tag
+tag > tag
+tag > tag > punctuation
+tag > tag > namespace
+tag > attr-value
+tag > attr-value > punctuation
+tag > punctuation
+tag > attr-name
+tag > attr-name > namespace
+entity
+
+ +
+

How can I use different highlighting for tokens with the same name in different languages?

+

Just use a descendant selector, that includes the language class. The default prism.css does this, to have different colors for + JavaScript strings (which are very common) and CSS strings (which are relatively rare). Here’s that code, simplified to illustrate the technique: +


+.token.string {
+	color: #690;
+}
+
+.language-css .token.string,
+.style .token.string {
+	color: #a67f59;
+}
+ +

Abbreviated language classes (e.g. lang-css) will be converted to their extended forms, so you don’t need to account for them.

+

The same technique can be used to differentiate XML tag namespaces from attribute namespaces:

+
.tag > .token.namespace {
+	color: #b37298;
+}
+.attr-name > .token.namespace {
+	color: #ab6;
+}
+
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/favicon.png b/docs/_style/prism-master/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..11838d355486c147ded60afcf81aa67e3c69cce1 GIT binary patch literal 209 zcmV;?051QDP)\n' + + '********************************************** */\n\n')) + .pipe(concat('prism.js')) + .pipe(gulp.dest('./')); +}); + +gulp.task('plugins', ['languages-plugins'], function() { + return gulp.src(paths.plugins) + .pipe(uglify()) + .pipe(rename({ suffix: '.min' })) + .pipe(gulp.dest('plugins')); +}); + +gulp.task('components-json', function (cb) { + componentsPromise.then(function (data) { + data = 'var components = ' + JSON.stringify(data) + ';\n' + + 'if (typeof module !== \'undefined\' && module.exports) { module.exports = components; }'; + fs.writeFile(paths.componentsFileJS, data, cb); + }); +}); + +gulp.task('watch', function() { + gulp.watch(paths.components, ['components', 'build']); + gulp.watch(paths.plugins, ['plugins', 'build']); +}); + +gulp.task('languages-plugins', function (cb) { + componentsPromise.then(function (data) { + var languagesMap = {}; + var dependenciesMap = {}; + for (var p in data.languages) { + if (p !== 'meta') { + var title = data.languages[p].displayTitle || data.languages[p].title; + var ucfirst = p.substring(0, 1).toUpperCase() + p.substring(1); + if (title !== ucfirst) { + languagesMap[p] = title; + } + + for (var name in data.languages[p].aliasTitles) { + languagesMap[name] = data.languages[p].aliasTitles[name]; + } + + if(data.languages[p].require) { + dependenciesMap[p] = data.languages[p].require; + } + } + } + + var jsonLanguagesMap = JSON.stringify(languagesMap); + var jsonDependenciesMap = JSON.stringify(dependenciesMap); + + var tasks = [ + {plugin: paths.showLanguagePlugin, map: jsonLanguagesMap}, + {plugin: paths.autoloaderPlugin, map: jsonDependenciesMap} + ]; + + var cpt = 0; + var l = tasks.length; + var done = function() { + cpt++; + if(cpt === l) { + cb && cb(); + } + }; + + tasks.forEach(function(task) { + var stream = gulp.src(task.plugin) + .pipe(replace( + /\/\*languages_placeholder\[\*\/[\s\S]*?\/\*\]\*\//, + '/*languages_placeholder[*/' + task.map + '/*]*/' + )) + .pipe(gulp.dest(task.plugin.substring(0, task.plugin.lastIndexOf('/')))); + + stream.on('error', done); + stream.on('end', done); + }); + }); +}); + +gulp.task('changelog', function (cb) { + return gulp.src(paths.changelog) + .pipe(replace( + /#(\d+)(?![\d\]])/g, + '[#$1](https://github.com/PrismJS/prism/issues/$1)' + )) + .pipe(replace( + /\[[\da-f]+(?:, *[\da-f]+)*\]/g, + function (match) { + return match.replace(/([\da-f]{7})[\da-f]*/g, '[`$1`](https://github.com/PrismJS/prism/commit/$1)'); + } + )) + .pipe(gulp.dest('.')); +}); + +gulp.task('default', ['components', 'components-json', 'plugins', 'build']); diff --git a/docs/_style/prism-master/img/logo-ala.png b/docs/_style/prism-master/img/logo-ala.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd3f129a98eb5c16ee5b7559c994beba3c81e8e GIT binary patch literal 1745 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/img/logo-drupal.png b/docs/_style/prism-master/img/logo-drupal.png new file mode 100644 index 0000000000000000000000000000000000000000..6f2b026b7c26e66455a02de72b2ba17f949455d4 GIT binary patch literal 2371 zcmYLK2{@E%8y-e7c9QHF*=7vNdLq({Y#|0eN+Al-PbHi>97#<&l~EHF5oXL{3CSK; zBbso^(PEzk$u?!{h%D#*hOVybn|Ge?d7tNg?)!e<>-y3>+#RLFRm5R1n3S`VJs$kC zz|T|+4%ScaYT{rp;X)5r?}OkKL+2XMIT+fo0fUR#ctD0RVo2eE44TT*r*aG!JOikV zt5?wrTVDqOEE%jI$@5{XqXk<4WTOVG+T;Py3wFU4h9Ss9ubU5=#?!7Iz<_qf2avRD zh7i!SU+o5f44|}8Pum=AK;!69hoLe+hQ>kDIff-1Q^pVkOXHe8=rk%DMA5jY5|H7c zO4$MeT&S${Cjx_qhO|I5Fd(4wj2R<8SphO2-W&=>qiLXqYsBChGDbiQaDG+-bD)V3 zJwS#gK%=oupN>He0I@WV5reIn_scX4g9nPi3eBZ+fc%Xv2oORR*aDn~`~(L9m_Q^k z)Io3@0m7Y(pkA5gH1_>J|wY3Vhb50ha(( zFpGzx^Y#Mmf*1_|1&UCmo2*c@VaN?C;J`*f^q~B&69@h?CIR@S4;%M{222CeK#~pR z!7ZY3P;|DSQJ_x1>SqfFP&FzT-#C}e6;iQ@sRqBl7hF?rEZ*G<_AYJL5ypiEc{waj z^VE+uDWNaIC)44DOZ9Clv(g>$k0K@;KdmnMY`rG>S>*iT&cq4xz&oSI`MrKB!ATE( z*Ow_y-J)osW4-g~J-XKOg?*OI-|T8t%ck74E6LNj&Q?gnqZuj7V^Nu}h&?S1;%9>{ z>xtEUWgmPJ{WAH?Ez;oKzYe?!sBleSsfUz@?*2aT{~g;#+Rd)NH5kvHj~u=<_xHu{ z*9wmPf9U!XyzLQrXq$qE%3jr&n|mxgP`9skb!$k*-T3#|$DzG6U@XcVbEz!>Q2fP!6_&xJiMqP#5X2Yf<_`TI<223NrHdHV5SM!ff zMGaWwu8(&4On9qUC%z8;wq(AdOLq~T9DB6HIkbLYJl%pcY~`J)zfY{jwWi-BEJ?C! zJT@gs;Yrf?awLKxtJTon)UJN=)m@ezF~Bip?aV;#A4Aui>LlTJYAvKBI`x!ThYBqn zoP68n7x(IkiF#Yc;!-g)r8NzBG1323%sPmrN%ysFEmLR8+>K5pF4h_PBPMPxQ4g0s zTzYd`_hM9YF0Q`Xy&mUqCh(fPJmOX%`8Gay;)2?VP{|AnMZ6UZ=8s?^Yx#%nTeZLZ zc(^Q9$S+f~FF(9Pj*(wUXwDeID(?Rg<0B&+)0&%Y&>7^w8#Jge>OfvEtWtn6^#>8K z+kAJIw{OsqZ8%Rmq;Ng1ZvH)grAnfyvObVpMsMgjE!M41{uhnh1}mV_j>`YRvW(N| z9&dTuaujEKYfi>bDx$E;7l9DUOw206T0HA^oIJm~+_B3yZ|De1g2eX3;tifQId~!W zuPU$hO(%aTj9T_G4M&N%DQJ;oHC%#Yke+SCWy=Z9XKscMZk^pxsW7K3ZvBC{7>*7t zCtfzQn-38+87r6XcFK2_%C935l)I{``?g6=qYRL%3iw29wXOelcEFF~uoP*3=k(0k zdwJ>_X`Mx{5Vfr(6y1>DTRQFiz!vJQ#uny;x{LWOXJoG~2xarsfHG;=w;Tkw`fHS%uJ-)`u4GRGxI zqOOE#a(Qe9QQ4*V@%@5whxL^ek;WXd2aJTbf*1ObPIO+=KJ29ws7)qx%PRCOYf4dL z6pl9)tf;wqDP8_Y)a9R3xF&mga0YRQ{v*O09=WTOFf+AVr7%V&IYePDXyNiFVl>|B zsnhl1`^=ihszvWhQgc!de5^rD``Shn1d&deljn|qdo8V2AV~<3PG~$Ffk#C2Z}r(v zp$g>`nF)U=`TMlfcFNj8+-a0KF67DM8C89x8lj-+K2v;0@>ehM3S5{>ek;)tkBSc?`&@+5xh)J!!n#eJ6?+x`&fCew`SsQ3I$?`n85N%Ix;5;b5H@W0y7kY^ z`UPWIGvdLMla1ee`z@NC(gR!g!+S1<=9T5rlk~F9+fg<{2P#48K;X05|jCL&vFDYB?p?G%X@TNlEN`jq5t9CpUP*j1Nq zJEu{p!6Yh+sHPY$_yiGrSu+i0?cd=F1mAZZA@}0_q!ANJb~8xUAxc&nK7nxE|JdgM z8F-JPs?VQMglEJs_ir)>#7#u9*X(@`!nx}5@PL@^mg=#y2@QDM&=vl<5lx&{tZ&1Y zhNrtMO4N?`7m}%Ry{|g{LiJX1`nNVCl>+p9A2uJ6*&h(Lj<>JrDHesjba0N-G(P6^ z;?IHBtBsXyzFNh31g4Vkf+)FeF4W?;1wd}d(I2i@(Nkl>n;}k0YX7h^JVSmq5n)c+qx#n7V#YJdQRN0_d6sfQWgBcqo9w#z-N<(xH-5 z@^0Tu3?mK#aD;dW01=l?&Jfibnm^|Q*MeLPq9b6( z<5Jis*aSQUyaudn$p*R*;WpqR4n%CR|I-EBU~2{NC*TEO56y?Rz*Pvh0KEw=iywg$)bP{kq$hANh4vAPo?9YR<)gORIf!Bd2fe$HO&I0)fa53Qj)_B07 z;_(Ap8-VBRWo}b*G|*UtTY(EW8f3o?M-aH$)(YS+b^!NM__PMDNBA+&n{P!9%0P#q zEAT5@bATs+w=@N+hz-=$u4~2tCv&uj9H^tMq5d1VA9xdZ8u%xL$GO0dL4F8?I4b0T zm~gc57;S51+K^WTo&q)(lYu4x*8`(Ps4sS`j)@3xjjhiGW&(c&cGGmUQ*e`MnwJ3s zs5c5k5a1Z1(mS0uCZV_orRD(70IwFRfqL3MxbZ+Qj*|mA4~~&RrZ5QjrCo5(1m@Cs zTmW2dD}cyBbFzA8AY1iD&_FH%_KC0USWE-f6@r1T04@VA1we%3M#L7Dj*}2@qpiij zE5KBsiiW2Ha2+rX7;;c7>KUJdYarDS@i^sxT4|;okC}~api_Wr5z9E;IZ=oJLIX0? z*01fLy$HT4NBmYytS zCj;3y8HlU_(F|0lAdyG8b;`?poZKnIu#?Le)w?zQx|Yzcl@C&R*p-61tYxm2h?9X7 zU0t{~{9Te~3r%7gT5?WaS?L)fd6GlZ>mSw7nyXYSe>QaclD9(h zIOID_NolfnSDdGoZ0GTL8%Sn#0wGU*OjKXfI7^tow@;!q1*fR1UYM=-MVg*YXHs`YJ#G6El-19#3P+LEgiqLHBk+9=oUyLnexdv=>$&8AuKlFr~2AnShX+2gY{emm@pU7$^mK5n{<4kUQ$%V+cfJ8Qgl7 z@%=mT)Rj4IetsEQmxkM|A>y?0jf18jlZS0}oY}jKWw-RV%u@^~g;f)!l5uVtdJ;FD z*OmO96sA&~NSqo-4lvK|6e#$`m~K3LPA7^DW%=L4mrwKb4|?*>H@n%gJBdH+LF5EH z*ygnHvVW$-jyRPSVWy1h!MT+YiWN;MV#zEekqEa9tKgm&S73%bsD|(3oeZRuf@BVA zl8ipBoL4UIgsRqkH&KyXA(iFLx6nHcq9M^+;M|7lF zk;_wA;-kFO%Z}_ z=24`oli*U!xNRs`46G!dNm{jmu4^<`G^NPo3`{f5`2H32yEn|wUS7eRC0oh)-FRF1 z(EyRd-?8Z|VVWYfJw}^$LEheHp1~DuNG9S|9i(ZB=8awRnL;#H$H{F&%)WIP(@)#N z|DCsvRjaBY;Ktp`k4qhJKalC13qvU|f$WwTy?T`K-tEKaSP~)@iy=x`ffW&20?H0Z zZ8VABqjU9;E?hpKJx_kLnP)%U&S$HtEt65|Lkj|`g=ZkU)56#h=bY0zFz42xcwH`P zqjgr+QM61nOdEb+Iy3W&oxHkiC$H>Nerp{>f)H|nO9N9{Rt=;y zMJ8(?RdL3j-IbXWhX5wE(Zv2G%d2a618zW(N@QB3k?OJrW+q0^tutY8Crc~0)$siC zC~vKev20TM`^?h$}$Z|mJh$KX8xwV zTy#o1237`XiD*h$t$i|kiFE8KC)Gw=edrb{&O+uLu{4Nkcn#pErK4TEbn@qWL1QP~!rY2g) zXIrBz*sz!R>uOlCEk>p$1)FQpPj179_nyUwF72$2Ozcfn2M|E9AKWgDD+jc*v}#v^ z|N3w%Q@+@Vu{{p0{f(B9T%14zFj6@#8`+uiu#Zdr@-g$*?j{<`LLv)37w8I-S;k)4 zhZz%3!|!$zjYdJ!@NqOa^lBI6>2W7>-??45@4XE?yKpNcl$DV%q(GO4UcGB1KkVDdnn1_Xc{J^K=RgkUoK(uP ze;dY`lRstSo+O05#oflcY~v`fhlo)syOi?I9V6*gUP>Y!CvP_71lplf$ittmIEB%_ zT?9c7s3JcXrW6<^Oj`nL^0sULC%c=X0GketW~ z^tKq|&N+!!ZW#^;duwCXvKH~Xz~u+YuqT?fGS>0q5ccQ%;Ff+sxSz48b0G&N`bv*mQS42hl$%w9$d39^faeO!gJ-QXkq+x)#in9hX z5sa-duKIot%RG<=%}XfkV!`SvUixAOlV`28j<>vY`v}S-Uh5<%D2@*Y1w_0$^jcFSE`TaFa{^tf(uGtMa1M(&}+&qM5t{VpA>|J@S z0o!qaSvr*jRoh2c;U@j$)^2Z@>jz0}8zGrlCYHHvjHQ$-26SQ=_m{Qj1q+;L7X zYk=r-X|yVd5Rb>%uqR1nnV$y4$v^;7WHpecDUzui`Mim{JcOoeWNK58$nwnp8Nm(1 zy90S#-T+n6I-Z=nf@cjsISE9=T)?`D}`GF2BF~ zYM2D%@Yupl5KV(iE6&YSm!`D)pljD1mHk3W6Tqy>k?xQxl6*>i3{| z13;epUtD6H75~@ooyxJ}F!|#xurm%_OTm=ly`fBDBX&Vum*LreA4Qk8r5Kq6Wu>JU z`3%!PUdyj%EM@hE8vgP4nB&-$cQ8bFa^YrZ;p?h6UoEeKGJhi&sF5&DA=p05 zlJ$G|kJp!z*cyfMFdnZ?wmOctb%0s_G7`}7`21|HjuHyGC<}O~9}ZKNY=dYTO83`4 z#a{#I3bMeA57vWA!_zSWKsJ_!jKSaUJBtow5diM}+hUgPPBZ`C(9caG$|-W9CeS;N2l zVIlJuZe;G{v9$8LC`LpCk4wWJ2ml(8#{$h3AQ_U$9QotO5I=wQYaXAq3cM}?r9R6* zR3)Iq3w}2kW;4AfT0kj=k?&u^ZM}T`K!3?FN-k0+`&VSUVRwAZ}(zK#7 zj!RbrgAqV@cj+eHTDqO}HAzgM)bFN8+YtRKN*LUwj4tgXfNQ^@Qpp^-Ll{b|c(I?k zE35h03(Husq6*rDz@?F_O@pSOZ243wq=@ZtKs^y?5N;&Tv6boxPH|pKpOw4m>XGH4IDvk4~^{ zh+!wSW?)4Lr*&z?@NR9WEDz(i4Fx7(fN6r}1~k@GC;9aoE1CAs4VFRZe87P4z-%qj z{I9rEA_Ut8xoyVheEi8~XcL0k6wm+YG(czLo+y9(`+7dxlj6r`c4kmTghE5?Wx2E@ z0J!*UeH9PCv7A>Htb?2h?ZbH51P?lCYX~G#S>`R;$h=G*ye>lJVTN>VMV}5OoYXqN z$?d~*C=C$uxvZ1D)4tfv@8)epcE+GX*fJr8*>W%0)LlANwJEB$M$y}aF{C%4m zt!&NR(>~_0nX4ceV%DTH8FOkmg@!3&P0B+h5jNMvc=WYpJTdnhh^C=K1h@SV*P-rz z)&bq?f_*}PA=cHu%wM#b`B?*$f`A)>9(-OG>3AB_ZfG5bE>_kl+#AY-M#BC95b+`c zddO>SbM*Vq*({s2obxUn#Cwx2pb!yj719U^PLR)}q!qeAS` z+UJIS0uThlel2-AZojLweF*eJ7RJuYRurHjUY?n|8q#^fgDW|AP)DXO+)SS?r3~m8 zp^(s&5D12uzIYwi-1jzwJh-~I21AerSXLBR*$qtxHz0x`AjR>{RGI|InYcn;@&ONZ zRZ%8Q{+QE7_Tq_7g=HSos(HdJ+q8>o9+?LbAMP?gk{3=G!Vz&^wqlzoqAP}--i1k* z^yADv6%-nNuMP-TJ+l~6Ib4-Nwfe609p7k51W5&v`T859~`mj(!r&0P(KiSAO3)C~y; zP6j#>ngS{HGx?cMXx}Qpy<-MYNcaO@)@-Y0{#QGpbr1}pQ4osBK+>e`vF_F|+Xk5Q z#1h)JZOctVJ5mS;0B%0nuor5QXyu_siQK_eSs5n-)ob$*IZQAGz7v9s!OS_UnEBC0t{l;Yd&c&mZ)GVBh1;!L$F854 zw;D8shJetxh!pS=R=6BFUWR~6gHEN8$}!`umCX2P6Qc)q;JQ&=x$N{#xOA;SvZ0s) zN`X)$8OW)D>Ng|tx}b9_NavU{e;so^SkJ$8Z^KzV+j8;X4t%fgcPI&Zs4s?L;`Vr% zFtjs^7py}NR1;*N`r~wA^*53s;MSpI35c+5dz8Pe+Qr{yuO!l`lrwv_rEf)qJ{2YO zt0<*gd6QS_i3Y6QH6jKv~dD(CfnI)=>(JtO2P+oOmL^j=gELh!@PJSVx>LtbWJ| zNdG~PB?|%a1~t`n)NHL~Y1TNjF_aG3IAqfh^r5#2f`&u=mat}8G`e(41UWoPL(A%D zc^{&h@MZr}L`Ad|ND(ask+KC5TS&3Q!&$p&#*sNVc*51d4}tFjpo+SE zeg}9H)N~+P53^0PH2~oX;9}rp095nKKndU_%Q)}`>bRG?KiC=wG9Hslfu7i)3O)m^ z1YQGP1im`Xcr3N`3y@1JBbkf``~axpu7T#E)a&*#wVQ_L3tRVEfrD|tcm!Vo)<8*= znrR#7O->B2+4?zfIdBQW*~Qj{Z3f-~o&}cBc)V`wZiMTAOMxK;aLdPH;1#>R*+t_} z1^kaCVVGTXj{zzQ)j&DmZD2Yu6A+q?9l)a?`@}HddXS6iA3SM@e?-p#pU|`{vV`0Y zj0dg(z7Obyu$lUeUC2!VwM{7sjYUeSMPiBzxB_G%a87*&iBi8MY@SluUs38sF$_~_ ziUPs_Ua%x|vSV>I(4(=7=%~HUPC@Zcii13M*P@i_AtF~HTno|-IQ;X@N9Ub2z*Jxc zighT8fi1xOw$4VFXxEV86WPXp2s~}K;4zAqH41gVAonY!ouw2vnTB}<3LU`$b;Jj8 za=;AWFQ68H0)!&veOsl#B_KBe!y76CZ3CuQrcr!GGeha>15NRPnU{M&jaEuc6p^9d zayD(D-5ktDv7P2cEilEBFvKzwTn~JwJ{idVpLr2@9@INPp5}^xV6g?^DVN9flxY}4 z48s@)G7+R5V(vhxXOz-j13nWGS^!II{R-p);0D`J%RWEpLh#%LkKf3GXMa97#rzX9gkJV zuQVg*`0MdleCBxI!RueaTVrqF16*-PfVMl<4GA?yyLuq4kgo25zTHSQ0D$&9%H|6G zikT@KfkjKX{>DfV&_2g(06Q!b8AX`13QR^`Qd$Nstpb;pf&Tpn z9Y@2t-+)``8T=jVc%?4niO2iEVX%OJ0I2{uDJ;$dCZnRF0+W`7$;wI|BP9I-F?d&k zB*stpkAfc34}nAZ;89o%^tYm`8`dAME_CelKPjMn{*lG_{avQxg24!`J}?<6>E9{+ z0h*cp|4=mgAG9Cd3i)5Z|EI8@O`s1FW`*>_`r{DC2X{mGcPJmYE)MC6$Kq_T*qeW< zXyJ*)WBoj_K2TlV-&IqBirJ$u?$`jo3x9FU%;3ftKfEgjfi%`r7dlpvLZRH@I?B>Y zI`YzTG6p*OGBWzgI=a#Z272<^it_SudNSI&f4F*Bgg+XI!T;g9|CcNOuiW45fc80# ztcS#*ZXw+ba9A|-ue9N)fA=EuuX=xT-T&Q-?7wnh$7W!^5BGl^_Mffe4*EU)r*)4P z|1>`mbKLQ`=PvYndKHV?#;OworLaW!J8R(1_#8 zr|Z_6$HP@aSC=Sy`&D~o!Hv$XVNH6kA{4Q$!$ z=`Y{x2m33!K8Nk_QRAt#?fsEebTI8aTGS#RH}@KDZ@M@Z+}3=F3VA%*mJ!i^nZ_;h z1%HUd4&vB z^Ac?}7hKZRrB_RHWlfv_ceKLoN?);1`OmUD4>#04%>rsbnwlGyaBJI^E1E^5yKZuV zH-UkgJ7?CW#P%b5lDmq)pK`sJQo_$>G^rrzSIx)N%JbuBO*Kydci5?c)J=TmXs_08 zh7U=r38H2^?*tT#^BawuOkM0O+*4uyO6qOTu|8e_^ z*U-9}B6eYZBrxD>+NmZ!o&xa)0JX;V-$ZswR)=Dg1Jrg7Zf}Qv3^>Zg@si)1M2=D{ zG)0zermI)AVloZ+m0kIo@xxo*46UoKSVIC zdArxE*t!PX%!_lACB*l<9uN)Lt`ha)*g=si+tzF5@0IRlRL84XtsUx5Bo7$-=C6H7 zYV^6db8fjVGQ%qzzB8Mtz259fpzhC<%?}#J+&yx zQR<@qMkntO*D|4K#euYEEqm`7n;5`;o$2t|is3bS z=&uG4tfm8|Jy7}B3GYGUSg+bO`^{2-@#q< zUA}-*Km#>EUFOBJZ+_H42)nyeoNC&%@#qObyYoCDSnro?&A`{Gs`!}hn5 zJeDXH*ny!5a;V`!(V;-7<+GZp5+f1Fm7{%^=FoB0=d>Y}udO=K*WBMjg13`fV%bh+ z7;_N0Uo|^X_tL@D%}oha8S#pVzL4Y^P8(9UvOPKEFhBA{YK=P2reiz<`G?|E{o9lw zjdhW0?fY-X5W&Ttd7};&;hf+DCU^@u;QAd4^@O5=lIZQup{wsz6P}OrXPU@LU&UUx z61IN0Jk;F8z1bbeVKfqJ#CwLh(J(L<1$Mk<0`}QO9ZCqy0UDnvpEBHKRQmqQMt^{k zE>AWOF3)=wy}rTZ3<_gc0~C>)Z+9hcAP-k$8cCbE(d&H1Xy_C^T9uf zY3>7n7$!hAh zs$?es-Ym0^N~f$&+8Od(Zs(Z;IuZyU?!lkf!?yVMA1(5f>r8mGwZ^~C`bfFpwe7+m zL>d5LwDb2ZsE^U1>{b_S@YXZ->C6t0ME4;G!z>teL0(dX{^NbsfxA1hkYQ-7xyZth|tl|yMa3+ zK9vzRqtDcQ`tl<=%!YWXZb0Q1D#om2w7Mg^gNy-xQ~f1C-!KE$(c+~4gc%+c{6T5# zU0NO{WA8LtBw40Lfm@u`YsL2_To&*CRNio?MkBBfDLIj!Xu}^KoS>_b7-Cxs&P81> zsGDPRUPZSKld1m_{*ZhU<$BJqa zg5OQ$35uAtn^E6cw_<6yCP@;yy#olQ)z$uBW!u5Y+GPvl8D;*oPjOj$yKCIhFAO6V z%pQtz4e|zn+zZ)g%a&-3!;^yF?S`<(5NoI!!*h+&US;W&;1)P(Pbk&B<#ge85BK`r zR~^0~l}xAAW^IMAss@w$+G$4>B>^Up!_L^^99F?W0oEqx(gWHcQZ>1Vd!{Gq?9kWK zsVojg*Nd41PTE$=Uz2KQR6yaIA@x6m4H^fUH^l^g<*<*2eB{dpH@vOyqbL^SL*1nG zu8`4%_Ds@O_U8G?larBGg{lm1@rBv#l`u7g_FrU%3L=u=jn6b6cYF z-{j@SnwR*S9;Fj1Q}?JF-?FsxU0(E;nabgScLRe`yf~6cpl9|>*=fS$)j{w|nb*s; zCuLHc)UHxV1(W@o@S5al}_@M)7N$x8E5pr7iC>nEN373_8mGW?qk;x2!b*s?D8~Dl+ke;)h%Wh z`}XNOiO?of_XG&8TJv!W6$}gT!I<-<0f}w<7a$~c8ZEzO@(c^&$1_jx=c~&$MZ-3X zVbA1xAB%aUxg2OjKUIGPU0VBI^i%lm$)=b_Ko$Is9Cv25e22i5bK(satg!V*{$=xEC-^ zBMi}fCoW~eeRIP65yTFyV;74FO0}208I#y6+QFxf78*9`awdbkw(FCqGcG%+-*mhqKxzKF9Q@ z-0B`jYXE8tpYYLXS=eReLD;u=U~xub_Sn0N5>GB?53-JA{sL_`LW&8xB}5NBK*k0cEPr(HU4QRE z^S9ngyNhOpn9e|tW*vaA?==xD(s-LZqRvcPA_{8L#=NKm zN7sJjYi`pk-68{58^>En)U!MmE<2+l-_9hnlErg@4z&xxM2oUmNYXJ)X~k% z%|h=|NEDe^?TmcKLmCCvJ1hquDo--yLfsl#Q>CPye$E$Y1Zt%_U2IIL(jd}5%6H(T6@5KP*ZN+JGI!l_nDg< zX&#>!%%V@rrtC zQ1rMC=J|HA7H zgPYt|OE((gKJ_2pl5VW=0_60GsUi!qh?7aK4u_FjwZ>X}G+%fI3meijxpKptyt-bI jF|}u!j+{4~fgpg+c3aT>$!i_IfBG2fo9k8TxJ3OAR^x`5 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/img/logo-sitepoint.png b/docs/_style/prism-master/img/logo-sitepoint.png new file mode 100644 index 0000000000000000000000000000000000000000..cf275f6eca9f4cbd7c3b46e79c034de121c295da GIT binary patch literal 2703 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 JPDHLkV1g(N_A~$h literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/img/logo-smashing.png b/docs/_style/prism-master/img/logo-smashing.png new file mode 100644 index 0000000000000000000000000000000000000000..8d34f6f38d345c08fc3263b3bd8573d8a07fff65 GIT binary patch literal 14160 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 literal 0 HcmV?d00001 diff --git a/docs/_style/prism-master/img/spectrum.png b/docs/_style/prism-master/img/spectrum.png new file mode 100644 index 0000000000000000000000000000000000000000..5954bd46ff3f78b6c101148f6475165c9392fcf6 GIT binary patch literal 359393 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

  • Um-~ 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

    EL7`ns6- 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 z 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

    aUzBd&FnTy%XLNK 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 + + + + + + +Prism + + + + + + + + + +

    +
    + +
      +
    • + Dead simple + Include prism.css and prism.js, use proper HTML5 code tags (code.language-xxxx), done! +
    • +
    • + Intuitive + Language classes are inherited so you can only define the language once for multiple code snippets. +
    • +
    • + Light as a feather + The core is 2KB minified & gzipped. Languages add 0.3-0.5KB each, themes are around 1KB. +
    • +
    • + Blazing fast + Supports parallelism with Web Workers, if available. +
    • +
    • + Extensible + Define new languages or extend existing ones. + Add new features thanks to Prism’s plugin architecture. +
    • +
    • + Easy styling + All styling is done through CSS, with sensible class names like .comment, .string, .property etc +
    • +
    + +
    + +
    +

    Used By

    + +

    Prism is used on several websites, small and large. Some of them are:

    + +
    + Smashing Magazine + A List Apart + Mozilla Developer Network (MDN) + CSS-Tricks + SitePoint + Drupal + React + Stripe +
    +
    + +
    +

    Examples

    + +

    The Prism source, highlighted with Prism (don’t you just love how meta this is?):

    +
    
    +
    +	

    This page’s CSS code, highlighted with Prism:

    +
    
    +
    +	

    This page’s HTML, highlighted with Prism:

    +
    
    +
    +	

    This page’s logo (SVG), highlighted with Prism:

    +
    
    +
    +	

    If you’re still not sold, you can view more examples or try it out for yourself.

    +
    + +
    +

    Full list of features

    +
      +
    • Only 2KB minified & gzipped (core). Each language definition adds roughly 300-500 bytes.
    • +
    • Encourages good author practices. Other highlighters encourage or even force you to use elements that are semantically wrong, + like <pre> (on its own) or <script>. + Prism forces you to use the correct element for marking up code: <code>. + On its own for inline code, or inside a <pre> for blocks of code. + In addition, the language is defined through the way recommended in the HTML5 draft: through a language-xxxx class.
    • +
    • The language definition is inherited. This means that if multiple code snippets have the same language, you can just define it once, in one of their common ancestors.
    • +
    • Supports parallelism with Web Workers, if available. Disabled by default (why?).
    • +
    • Very easy to extend without modifying the code, due to Prism’s plugin architecture. Multiple hooks are scattered throughout the source.
    • +
    • Very easy to define new languages. Only thing you need is a good understanding of regular expressions
    • +
    • All styling is done through CSS, with sensible class names rather than ugly namespaced abbreviated nonsense.
    • +
    • Wide browser support: IE9+, Firefox, Chrome, Safari, Opera, most Mobile browsers
    • +
    • Highlights embedded languages (e.g. CSS inside HTML, JavaScript inside HTML)
    • +
    • Highlights inline code as well, not just code blocks
    • +
    • Highlights nested languages (CSS in HTML, JavaScript in HTML)
    • +
    • It doesn’t force you to use any Prism-specific markup, not even a Prism-specific class name, only standard markup you should be using anyway. So, you can just try it for a while, remove it if you don’t like it and leave no traces behind.
    • +
    • Highlight specific lines and/or line ranges (requires plugin)
    • +
    • Show invisible characters like tabs, line breaks etc (requires plugin)
    • +
    • Autolink URLs and emails, use Markdown links in comments (requires plugin)
    • +
    +
    + +
    +

    Limitations

    +
      +
    • Any pre-existing HTML in the code will be stripped off. There are ways around it though.
    • +
    • Regex-based so it *will* fail on certain edge cases, which are documented in the Examples section.
    • +
    • No IE 6-8 support. If someone can read code, they are probably in the 85% of the population with a modern browser.
    • +
    +
    + +
    +

    Basic usage

    + +

    You will need to include the prism.css and prism.js files you downloaded in your page. Example: +

    <!DOCTYPE html>
    +<html>
    +<head>
    +	...
    +	<link href="themes/prism.css" rel="stylesheet" />
    +</head>
    +<body>
    +	...
    +	<script src="prism.js"></script>
    +</body>
    +</html>
    + +

    Prism does its best to encourage good authoring practices. Therefore, it only works with <code> elements, since marking up code without a <code> element is semantically invalid. + According to the HTML5 spec, the recommended way to define a code language is a language-xxxx class, which is what Prism uses. + Alternatively, Prism also supports a shorter version: lang-xxxx.

    +

    To make things easier however, Prism assumes that this language definition is inherited. Therefore, if multiple <code> elements have the same language, you can add the language-xxxx class on one of their common ancestors. + This way, you can also define a document-wide default language, by adding a language-xxxx class on the <body> or <html> element.

    + +

    If you want to opt-out of highlighting for a <code> element that is a descendant of an element with a declared code language, you can add the class language-none to it (or any non-existing language, really).

    + +

    The recommended way to mark up a code block + (both for semantics and for Prism) is a <pre> element with a <code> element inside, like so:

    +
    <pre><code class="language-css">p { color: red }</code></pre>
    +

    If you use that pattern, the <pre> will automatically get the language-xxxx class (if it doesn’t already have it) and will be styled as a code block.

    + +

    If you want to prevent any elements from being automatically highlighted, you can use the attribute data-manual on the <script> element you used for prism and use the API. + Example:

    +
    <script src="prism.js" data-manual></script>
    + +

    Usage with Webpack, Browserify, & Other Bundlers

    + +

    If you want to use Prism with a bundler, install Prism with npm:

    + +
    $ npm install prismjs
    + +

    You can then import into your bundle:

    + +
    import Prism from 'prismjs';
    + +

    To make it easy to configure your Prism instance with only the languages and plugins you need, use the babel plugin, + babel-plugin-prismjs. This will allow you to load + the minimum number of languages and plugins to satisfy your needs. + See that plugin's documentation for configuration details.

    + +

    Usage with Node

    + +

    If you want to use Prism on the server or through the command line, Prism can be used with Node.js as well. + This might be useful if you're trying to generate static HTML pages with highlighted code for environments that don't support browser-side JS, like AMP pages.

    + +

    Example:

    +
    var Prism = require('prismjs');
    +
    +// The code snippet you want to highlight, as a string
    +var code = "var data = 1;";
    +
    +// Returns a highlighted HTML string
    +var html = Prism.highlight(code, Prism.languages.javascript, 'javascript');
    + +

    Requiring prismjs will load the default languages: markup, css, + clike and javascript. You can load more languages with the + loadLanguages() utility, which will automatically handle any required dependencies.

    +

    Example:

    + +
    var Prism = require('prismjs');
    +var loadLanguages = require('prismjs/components/');
    +loadLanguages(['haml']);
    +
    +// The code snippet you want to highlight, as a string
    +var code = "= ['hi', 'there', 'reader!'].join \" \"";
    +
    +// Returns a highlighted HTML string
    +var html = Prism.highlight(code, Prism.languages.haml, 'haml');
    + +

    Note: Do not use loadLanguages() with Webpack or another bundler, as this will cause Webpack to include all languages and plugins. Use the babel plugin described above.

    + +
    + +
    +

    Supported languages

    +

    This is the list of all languages currently supported by Prism, with + their corresponding alias, to use in place of xxxx in the language-xxxx (or lang-xxxx) class:

    +
    + +
    +

    Plugins

    +

    Plugins are additional scripts (and CSS code) that extend Prism’s functionality. Many of the following plugins are official, but are released as plugins to keep the Prism Core small for those who don’t need the extra functionality.

    +
      + +

      No assembly required to use them. Just select them in the download page.

      +

      It’s very easy to write your own Prism plugins. Did you write a plugin for Prism that you want added to this list? Send a pull request!

      +
      + +
      +

      Third-party language definitions

      + + +
      + +
      +

      Third-party tutorials

      + +

      Several tutorials have been written by members of the community to help you integrate Prism into multiple different website types and configurations:

      + + + +

      Please note that the tutorials listed here are not verified to contain correct information. Read at your risk and always check the official documentation here if something doesn’t work :)

      + +

      Have you written a tutorial about Prism that’s not already included here? Send a pull request!

      +
      + +
      +

      Credits

      + +
      + +
      + + + + + + + + + diff --git a/docs/_style/prism-master/logo.svg b/docs/_style/prism-master/logo.svg new file mode 100644 index 00000000..22fcdec9 --- /dev/null +++ b/docs/_style/prism-master/logo.svg @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/docs/_style/prism-master/package.json b/docs/_style/prism-master/package.json new file mode 100644 index 00000000..cbffb02a --- /dev/null +++ b/docs/_style/prism-master/package.json @@ -0,0 +1,47 @@ +{ + "name": "prismjs", + "version": "1.15.0", + "description": "Lightweight, robust, elegant syntax highlighting. A spin-off project from Dabblet.", + "main": "prism.js", + "style": "themes/prism.css", + "scripts": { + "test": "mocha tests/testrunner-tests.js && mocha tests/run.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/LeaVerou/prism.git" + }, + "keywords": [ + "prism", + "highlight" + ], + "author": "Lea Verou", + "license": "MIT", + "readmeFilename": "README.md", + "optionalDependencies": { + "clipboard": "^2.0.0" + }, + "devDependencies": { + "chai": "^2.3.0", + "gulp": "^3.8.6", + "gulp-concat": "^2.3.4", + "gulp-header": "^1.0.5", + "gulp-rename": "^1.2.0", + "gulp-uglify": "^0.3.1", + "gulp-replace": "^0.5.4", + "mocha": "^2.2.5", + "yargs": "^3.26.0" + }, + "jspm": { + "main": "prism", + "registry": "jspm", + "jspmPackage": true, + "format": "global", + "files": [ + "components/**/*.js", + "plugins/**/*", + "themes/*.css", + "prism.js" + ] + } +} diff --git a/docs/_style/prism-master/plugins/autolinker/index.html b/docs/_style/prism-master/plugins/autolinker/index.html new file mode 100644 index 00000000..6053b62c --- /dev/null +++ b/docs/_style/prism-master/plugins/autolinker/index.html @@ -0,0 +1,70 @@ + + + + + + +Autolinker ▲ Prism plugins + + + + + + + + + + + +
      +
      + +

      Autolinker

      +

      Converts URLs and emails in code to clickable links. Parses Markdown links in comments.

      +
      + +
      +

      How to use

      +

      URLs and emails will be linked automatically, you don’t need to do anything. To link some text inside a comment to a certain URL, + you may use the Markdown syntax: +

      [Text you want to see](http://url-goes-here.com)
      +
      + +
      +

      Examples

      + +

      JavaScript

      +
      /**
      + * Prism: Lightweight, robust, elegant syntax highlighting
      + * MIT license http://www.opensource.org/licenses/mit-license.php/
      + * @author Lea Verou http://lea.verou.me
      + * Reach Lea at fake@email.com (no, not really)
      + * And this is [a Markdown link](http://prismjs.com). Sweet, huh?
      + */
      +var foo = 5;
      +// And a single line comment http://google.com
      + +

      CSS

      +
      @font-face {
      +	src: url(http://lea.verou.me/logo.otf);
      +	font-family: 'LeaVerou';
      +}
      + +

      HTML

      +
      <!-- Links in HTML, woo!
      +Lea Verou http://lea.verou.me or, with Markdown, [Lea Verou](http://lea.verou.me) -->
      +<img src="http://prismjs.com/img/spectrum.png" alt="In attributes too!" />
      +<p>Autolinking in raw text: http://prismjs.com</p>
      +
      + +
      + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/autolinker/prism-autolinker.css b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.css new file mode 100644 index 00000000..b5f76309 --- /dev/null +++ b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.css @@ -0,0 +1,3 @@ +.token a { + color: inherit; +} \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/autolinker/prism-autolinker.js b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.js new file mode 100644 index 00000000..3913c98a --- /dev/null +++ b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.js @@ -0,0 +1,81 @@ +(function(){ + +if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism +) { + return; +} + +var url = /\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~/.:=&]+(?:\?[\w\-+%~/.:#=?&!$'()*,;]*)?(?:#[\w\-+%~/.:#=?&!$'()*,;]*)?/, + email = /\b\S+@[\w.]+[a-z]{2}/, + linkMd = /\[([^\]]+)]\(([^)]+)\)/, + + // Tokens that may contain URLs and emails + candidates = ['comment', 'url', 'attr-value', 'string']; + +Prism.plugins.autolinker = { + processGrammar: function (grammar) { + // Abort if grammar has already been processed + if (!grammar || grammar['url-link']) { + return; + } + Prism.languages.DFS(grammar, function (key, def, type) { + if (candidates.indexOf(type) > -1 && Prism.util.type(def) !== 'Array') { + if (!def.pattern) { + def = this[key] = { + pattern: def + }; + } + + def.inside = def.inside || {}; + + if (type == 'comment') { + def.inside['md-link'] = linkMd; + } + if (type == 'attr-value') { + Prism.languages.insertBefore('inside', 'punctuation', { 'url-link': url }, def); + } + else { + def.inside['url-link'] = url; + } + + def.inside['email-link'] = email; + } + }); + grammar['url-link'] = url; + grammar['email-link'] = email; + } +}; + +Prism.hooks.add('before-highlight', function(env) { + Prism.plugins.autolinker.processGrammar(env.grammar); +}); + +Prism.hooks.add('wrap', function(env) { + if (/-link$/.test(env.type)) { + env.tag = 'a'; + + var href = env.content; + + if (env.type == 'email-link' && href.indexOf('mailto:') != 0) { + href = 'mailto:' + href; + } + else if (env.type == 'md-link') { + // Markdown + var match = env.content.match(linkMd); + + href = match[2]; + env.content = match[1]; + } + + env.attributes.href = href; + } + + // Silently catch any error thrown by decodeURIComponent (#1186) + try { + env.content = decodeURIComponent(env.content); + } catch(e) {} +}); + +})(); diff --git a/docs/_style/prism-master/plugins/autolinker/prism-autolinker.min.js b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.min.js new file mode 100644 index 00000000..9fdced95 --- /dev/null +++ b/docs/_style/prism-master/plugins/autolinker/prism-autolinker.min.js @@ -0,0 +1 @@ +!function(){if(("undefined"==typeof self||self.Prism)&&("undefined"==typeof global||global.Prism)){var i=/\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~\/.:=&]+(?:\?[\w\-+%~\/.:#=?&!$'()*,;]*)?(?:#[\w\-+%~\/.:#=?&!$'()*,;]*)?/,n=/\b\S+@[\w.]+[a-z]{2}/,e=/\[([^\]]+)]\(([^)]+)\)/,t=["comment","url","attr-value","string"];Prism.plugins.autolinker={processGrammar:function(r){r&&!r["url-link"]&&(Prism.languages.DFS(r,function(r,a,l){t.indexOf(l)>-1&&"Array"!==Prism.util.type(a)&&(a.pattern||(a=this[r]={pattern:a}),a.inside=a.inside||{},"comment"==l&&(a.inside["md-link"]=e),"attr-value"==l?Prism.languages.insertBefore("inside","punctuation",{"url-link":i},a):a.inside["url-link"]=i,a.inside["email-link"]=n)}),r["url-link"]=i,r["email-link"]=n)}},Prism.hooks.add("before-highlight",function(i){Prism.plugins.autolinker.processGrammar(i.grammar)}),Prism.hooks.add("wrap",function(i){if(/-link$/.test(i.type)){i.tag="a";var n=i.content;if("email-link"==i.type&&0!=n.indexOf("mailto:"))n="mailto:"+n;else if("md-link"==i.type){var t=i.content.match(e);n=t[2],i.content=t[1]}i.attributes.href=n}try{i.content=decodeURIComponent(i.content)}catch(r){}})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/autoloader/index.html b/docs/_style/prism-master/plugins/autoloader/index.html new file mode 100644 index 00000000..3e5357e0 --- /dev/null +++ b/docs/_style/prism-master/plugins/autoloader/index.html @@ -0,0 +1,204 @@ + + + + + + +Autoloader ▲ Prism plugins + + + + + + + + + + + +
      +
      + +

      Autoloader

      +

      Automatically loads the needed languages to highlight the code blocks.

      +
      + +
      +

      How to use

      + +

      + The plugin will automatically handle missing grammars and load them for you. + To do this, you need to provide it with a directory of all the grammars you want. +

      +

      + You can download all the available grammars by clicking on the following link: .
      + Alternatively, you can also clone the GitHub repo and take the components folder from there. +

      +

      + You can then download Prism core and any plugins from the Download page, without checking any languages (or just check the languages you want to load by default, e.g. if you're using a language a lot, then you probably want to save the extra HTTP request). +

      +

      + A couple of additional options are available through the configuration object Prism.plugins.autoloader. +

      + +

      Specifying the grammars path

      + +

      + By default, the plugin will look for the missing grammars in the components folder. + If your files are in a different location, you can specify it using the languages_path option: +

      + +
      Prism.plugins.autoloader.languages_path = 'path/to/grammars/';
      + +

      Using development versions

      + +

      + By default, the plugin uses the minified versions of the grammars. + If you wish to use the development versions instead, you can set the use_minified option to false: +

      + +
      Prism.plugins.autoloader.use_minified = false;
      + +

      Specifying additional dependencies

      + +

      + All default dependencies are already included in the plugin. + However, there are some cases where you might want to load an additional dependency for a specific code block. + To do so, just add a data-dependencies attribute on you <code> or <pre> tags, + containing a list of comma-separated language aliases. +

      + +
      <pre><code class="language-pug" data-dependencies="less">
      +:less
      +	foo {
      +		color: @red;
      +	}
      +</code><pre>
      + +

      Force to reload a grammar

      + +

      + The plugin usually doesn't reload a grammar if it already exists. + In some very specific cases, you might however want to do so. + If you add an exclamation mark after an alias in the data-dependencies attribute, + this language will be reloaded. +

      + +
      <pre class="language-markup" data-dependencies="markup,css!"><code>
      + +
      + +
      +

      Examples

      + +

      Note that no languages are loaded on this page by default.

      + +

      Basic usage with some Perl code:

      +
      my ($class, $filename) = @_;
      + +

      The Less filter used in Pug:

      +
      :less
      +	foo {
      +		color: @red;
      +	}
      + +
      + +
      + + + + + + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/autoloader/prism-autoloader.js b/docs/_style/prism-master/plugins/autoloader/prism-autoloader.js new file mode 100644 index 00000000..4d6a6014 --- /dev/null +++ b/docs/_style/prism-master/plugins/autoloader/prism-autoloader.js @@ -0,0 +1,209 @@ +(function () { + if (typeof self === 'undefined' || !self.Prism || !self.document || !document.createElement) { + return; + } + + // The dependencies map is built automatically with gulp + var lang_dependencies = /*languages_placeholder[*/{"javascript":"clike","actionscript":"javascript","arduino":"cpp","aspnet":["markup","csharp"],"bison":"c","c":"clike","csharp":"clike","cpp":"c","coffeescript":"javascript","crystal":"ruby","css-extras":"css","d":"clike","dart":"clike","django":"markup","erb":["ruby","markup-templating"],"fsharp":"clike","flow":"javascript","glsl":"clike","gml":"clike","go":"clike","groovy":"clike","haml":"ruby","handlebars":"markup-templating","haxe":"clike","java":"clike","jolie":"clike","kotlin":"clike","less":"css","markdown":"markup","markup-templating":"markup","n4js":"javascript","nginx":"clike","objectivec":"c","opencl":"cpp","parser":"markup","php":["clike","markup-templating"],"php-extras":"php","plsql":"sql","processing":"clike","protobuf":"clike","pug":"javascript","qore":"clike","jsx":["markup","javascript"],"tsx":["jsx","typescript"],"reason":"clike","ruby":"clike","sass":"css","scss":"css","scala":"java","smarty":"markup-templating","soy":"markup-templating","swift":"clike","tap":"yaml","textile":"markup","tt2":["clike","markup-templating"],"twig":"markup","typescript":"javascript","vala":"clike","vbnet":"basic","velocity":"markup","wiki":"markup","xeora":"markup","xquery":"markup"}/*]*/; + + var lang_data = {}; + + var ignored_language = 'none'; + + var script = document.getElementsByTagName('script'); + script = script[script.length - 1]; + var languages_path = 'components/'; + if(script.hasAttribute('data-autoloader-path')) { + var path = script.getAttribute('data-autoloader-path').trim(); + if(path.length > 0 && !/^[a-z]+:\/\//i.test(script.src)) { + languages_path = path.replace(/\/?$/, '/'); + } + } else if (/[\w-]+\.js$/.test(script.src)) { + languages_path = script.src.replace(/[\w-]+\.js$/, 'components/'); + } + var config = Prism.plugins.autoloader = { + languages_path: languages_path, + use_minified: true + }; + + /** + * Lazy loads an external script + * @param {string} src + * @param {function=} success + * @param {function=} error + */ + var addScript = function (src, success, error) { + var s = document.createElement('script'); + s.src = src; + s.async = true; + s.onload = function() { + document.body.removeChild(s); + success && success(); + }; + s.onerror = function() { + document.body.removeChild(s); + error && error(); + }; + document.body.appendChild(s); + }; + + /** + * Returns the path to a grammar, using the language_path and use_minified config keys. + * @param {string} lang + * @returns {string} + */ + var getLanguagePath = function (lang) { + return config.languages_path + + 'prism-' + lang + + (config.use_minified ? '.min' : '') + '.js' + }; + + /** + * Tries to load a grammar and + * highlight again the given element once loaded. + * @param {string} lang + * @param {HTMLElement} elt + */ + var registerElement = function (lang, elt) { + var data = lang_data[lang]; + if (!data) { + data = lang_data[lang] = {}; + } + + // Look for additional dependencies defined on the or
       tags
      +		var deps = elt.getAttribute('data-dependencies');
      +		if (!deps && elt.parentNode && elt.parentNode.tagName.toLowerCase() === 'pre') {
      +			deps = elt.parentNode.getAttribute('data-dependencies');
      +		}
      +
      +		if (deps) {
      +			deps = deps.split(/\s*,\s*/g);
      +		} else {
      +			deps = [];
      +		}
      +
      +		loadLanguages(deps, function () {
      +			loadLanguage(lang, function () {
      +				Prism.highlightElement(elt);
      +			});
      +		});
      +	};
      +
      +	/**
      +	 * Sequentially loads an array of grammars.
      +	 * @param {string[]|string} langs
      +	 * @param {function=} success
      +	 * @param {function=} error
      +	 */
      +	var loadLanguages = function (langs, success, error) {
      +		if (typeof langs === 'string') {
      +			langs = [langs];
      +		}
      +		var i = 0;
      +		var l = langs.length;
      +		var f = function () {
      +			if (i < l) {
      +				loadLanguage(langs[i], function () {
      +					i++;
      +					f();
      +				}, function () {
      +					error && error(langs[i]);
      +				});
      +			} else if (i === l) {
      +				success && success(langs);
      +			}
      +		};
      +		f();
      +	};
      +
      +	/**
      +	 * Load a grammar with its dependencies
      +	 * @param {string} lang
      +	 * @param {function=} success
      +	 * @param {function=} error
      +	 */
      +	var loadLanguage = function (lang, success, error) {
      +		var load = function () {
      +			var force = false;
      +			// Do we want to force reload the grammar?
      +			if (lang.indexOf('!') >= 0) {
      +				force = true;
      +				lang = lang.replace('!', '');
      +			}
      +
      +			var data = lang_data[lang];
      +			if (!data) {
      +				data = lang_data[lang] = {};
      +			}
      +			if (success) {
      +				if (!data.success_callbacks) {
      +					data.success_callbacks = [];
      +				}
      +				data.success_callbacks.push(success);
      +			}
      +			if (error) {
      +				if (!data.error_callbacks) {
      +					data.error_callbacks = [];
      +				}
      +				data.error_callbacks.push(error);
      +			}
      +
      +			if (!force && Prism.languages[lang]) {
      +				languageSuccess(lang);
      +			} else if (!force && data.error) {
      +				languageError(lang);
      +			} else if (force || !data.loading) {
      +				data.loading = true;
      +				var src = getLanguagePath(lang);
      +				addScript(src, function () {
      +					data.loading = false;
      +					languageSuccess(lang);
      +
      +				}, function () {
      +					data.loading = false;
      +					data.error = true;
      +					languageError(lang);
      +				});
      +			}
      +		};
      +		var dependencies = lang_dependencies[lang];
      +		if(dependencies && dependencies.length) {
      +			loadLanguages(dependencies, load);
      +		} else {
      +			load();
      +		}
      +	};
      +
      +	/**
      +	 * Runs all success callbacks for this language.
      +	 * @param {string} lang
      +	 */
      +	var languageSuccess = function (lang) {
      +		if (lang_data[lang] && lang_data[lang].success_callbacks && lang_data[lang].success_callbacks.length) {
      +			lang_data[lang].success_callbacks.forEach(function (f) {
      +				f(lang);
      +			});
      +		}
      +	};
      +
      +	/**
      +	 * Runs all error callbacks for this language.
      +	 * @param {string} lang
      +	 */
      +	var languageError = function (lang) {
      +		if (lang_data[lang] && lang_data[lang].error_callbacks && lang_data[lang].error_callbacks.length) {
      +			lang_data[lang].error_callbacks.forEach(function (f) {
      +				f(lang);
      +			});
      +		}
      +	};
      +
      +	Prism.hooks.add('complete', function (env) {
      +		if (env.element && env.language && !env.grammar) {
      +			if (env.language !== ignored_language) {
      +				registerElement(env.language, env.element);
      +			}
      +		}
      +	});
      +
      +}());
      \ No newline at end of file
      diff --git a/docs/_style/prism-master/plugins/autoloader/prism-autoloader.min.js b/docs/_style/prism-master/plugins/autoloader/prism-autoloader.min.js
      new file mode 100644
      index 00000000..629f1b2b
      --- /dev/null
      +++ b/docs/_style/prism-master/plugins/autoloader/prism-autoloader.min.js
      @@ -0,0 +1 @@
      +!function(){if("undefined"!=typeof self&&self.Prism&&self.document&&document.createElement){var e={javascript:"clike",actionscript:"javascript",arduino:"cpp",aspnet:["markup","csharp"],bison:"c",c:"clike",csharp:"clike",cpp:"c",coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup",erb:["ruby","markup-templating"],fsharp:"clike",flow:"javascript",glsl:"clike",gml:"clike",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",java:"clike",jolie:"clike",kotlin:"clike",less:"css",markdown:"markup","markup-templating":"markup",n4js:"javascript",nginx:"clike",objectivec:"c",opencl:"cpp",parser:"markup",php:["clike","markup-templating"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:"javascript",qore:"clike",jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java",smarty:"markup-templating",soy:"markup-templating",swift:"clike",tap:"yaml",textile:"markup",tt2:["clike","markup-templating"],twig:"markup",typescript:"javascript",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup",xquery:"markup"},a={},c="none",t=document.getElementsByTagName("script");t=t[t.length-1];var r="components/";if(t.hasAttribute("data-autoloader-path")){var s=t.getAttribute("data-autoloader-path").trim();s.length>0&&!/^[a-z]+:\/\//i.test(t.src)&&(r=s.replace(/\/?$/,"/"))}else/[\w-]+\.js$/.test(t.src)&&(r=t.src.replace(/[\w-]+\.js$/,"components/"));var i=Prism.plugins.autoloader={languages_path:r,use_minified:!0},n=function(e,a,c){var t=document.createElement("script");t.src=e,t.async=!0,t.onload=function(){document.body.removeChild(t),a&&a()},t.onerror=function(){document.body.removeChild(t),c&&c()},document.body.appendChild(t)},l=function(e){return i.languages_path+"prism-"+e+(i.use_minified?".min":"")+".js"},o=function(e,c){var t=a[e];t||(t=a[e]={});var r=c.getAttribute("data-dependencies");!r&&c.parentNode&&"pre"===c.parentNode.tagName.toLowerCase()&&(r=c.parentNode.getAttribute("data-dependencies")),r=r?r.split(/\s*,\s*/g):[],p(r,function(){u(e,function(){Prism.highlightElement(c)})})},p=function(e,a,c){"string"==typeof e&&(e=[e]);var t=0,r=e.length,s=function(){r>t?u(e[t],function(){t++,s()},function(){c&&c(e[t])}):t===r&&a&&a(e)};s()},u=function(c,t,r){var s=function(){var e=!1;c.indexOf("!")>=0&&(e=!0,c=c.replace("!",""));var s=a[c];if(s||(s=a[c]={}),t&&(s.success_callbacks||(s.success_callbacks=[]),s.success_callbacks.push(t)),r&&(s.error_callbacks||(s.error_callbacks=[]),s.error_callbacks.push(r)),!e&&Prism.languages[c])m(c);else if(!e&&s.error)k(c);else if(e||!s.loading){s.loading=!0;var i=l(c);n(i,function(){s.loading=!1,m(c)},function(){s.loading=!1,s.error=!0,k(c)})}},i=e[c];i&&i.length?p(i,s):s()},m=function(e){a[e]&&a[e].success_callbacks&&a[e].success_callbacks.length&&a[e].success_callbacks.forEach(function(a){a(e)})},k=function(e){a[e]&&a[e].error_callbacks&&a[e].error_callbacks.length&&a[e].error_callbacks.forEach(function(a){a(e)})};Prism.hooks.add("complete",function(e){e.element&&e.language&&!e.grammar&&e.language!==c&&o(e.language,e.element)})}}();
      \ No newline at end of file
      diff --git a/docs/_style/prism-master/plugins/command-line/index.html b/docs/_style/prism-master/plugins/command-line/index.html
      new file mode 100644
      index 00000000..109138b6
      --- /dev/null
      +++ b/docs/_style/prism-master/plugins/command-line/index.html
      @@ -0,0 +1,111 @@
      +
      +
      +
      +
      +
      +
      +Command Line ▲ Prism plugins
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +

      Command Line

      +

      Display a command line with a prompt and, optionally, the output/response from the commands.

      +
      + +
      +

      How to use

      + +

      This is intended for code blocks (<pre><code>) and not for inline code.

      + +

      Add class command-line to your <pre>. For a server command line, specify the user and host names using the data-user and data-host attributes. The resulting prompt displays a # for the root user and $ for all other users. For any other command line, such as a Windows prompt, you may specify the entire prompt using the data-prompt attribute.

      + +

      Optional: You may specify the lines to be presented as output (no prompt and no highlighting) through the data-output attribute on the <pre> element in the following simple format:

      +
        +
      • A single number refers to the line with that number
      • +
      • Ranges are denoted by two numbers, separated with a hyphen (-)
      • +
      • Multiple line numbers or ranges are separated by commas.
      • +
      • Whitespace is allowed anywhere and will be stripped off.
      • +
      + +

      Examples:

      +
      +
      5
      +
      The 5th line
      + +
      1-5
      +
      Lines 1 through 5
      + +
      1,4
      +
      Line 1 and line 4
      + +
      1-2, 5, 9-20
      +
      Lines 1 through 2, line 5, lines 9 through 20
      +
      + +

      Optional: To automatically present some lines as output, you can prefix those lines with any string and specify the prefix using the data-filter-output attribute on the <pre> element. For example, data-filter-output="(out)" will treat lines beginning with (out) as output and remove the prefix.

      +
      + +
      +

      Examples

      + +

      Root User Without Output

      +
      cd /usr/local/etc
      +cp php.ini php.ini.bak
      +vi php.ini
      + +

      Non-Root User With Output

      +
      pwd
      +/usr/home/chris/bin
      +ls -la
      +total 2
      +drwxr-xr-x   2 chris  chris     11 Jan 10 16:48 .
      +drwxr--r-x  45 chris  chris     92 Feb 14 11:10 ..
      +-rwxr-xr-x   1 chris  chris    444 Aug 25  2013 backup
      +-rwxr-xr-x   1 chris  chris    642 Jan 17 14:42 deploy
      + +

      Windows PowerShell With Output

      +
      dir
      +
      +
      +    Directory: C:\Users\Chris
      +
      +
      +Mode                LastWriteTime     Length Name
      +----                -------------     ------ ----
      +d-r--        10/14/2015   5:06 PM            Contacts
      +d-r--        12/12/2015   1:47 PM            Desktop
      +d-r--         11/4/2015   7:59 PM            Documents
      +d-r--        10/14/2015   5:06 PM            Downloads
      +d-r--        10/14/2015   5:06 PM            Favorites
      +d-r--        10/14/2015   5:06 PM            Links
      +d-r--        10/14/2015   5:06 PM            Music
      +d-r--        10/14/2015   5:06 PM            Pictures
      +d-r--        10/14/2015   5:06 PM            Saved Games
      +d-r--        10/14/2015   5:06 PM            Searches
      +d-r--        10/14/2015   5:06 PM            Videos
      + +
      + +
      + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/command-line/prism-command-line.css b/docs/_style/prism-master/plugins/command-line/prism-command-line.css new file mode 100644 index 00000000..153a8707 --- /dev/null +++ b/docs/_style/prism-master/plugins/command-line/prism-command-line.css @@ -0,0 +1,33 @@ +.command-line-prompt { + border-right: 1px solid #999; + display: block; + float: left; + font-size: 100%; + letter-spacing: -1px; + margin-right: 1em; + pointer-events: none; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.command-line-prompt > span:before { + color: #999; + content: ' '; + display: block; + padding-right: 0.8em; +} + +.command-line-prompt > span[data-user]:before { + content: "[" attr(data-user) "@" attr(data-host) "] $"; +} + +.command-line-prompt > span[data-user="root"]:before { + content: "[" attr(data-user) "@" attr(data-host) "] #"; +} + +.command-line-prompt > span[data-prompt]:before { + content: attr(data-prompt); +} diff --git a/docs/_style/prism-master/plugins/command-line/prism-command-line.js b/docs/_style/prism-master/plugins/command-line/prism-command-line.js new file mode 100644 index 00000000..3c779914 --- /dev/null +++ b/docs/_style/prism-master/plugins/command-line/prism-command-line.js @@ -0,0 +1,139 @@ +(function() { + +if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; +} + +var clsReg = /(?:^|\s)command-line(?:\s|$)/; + +Prism.hooks.add('before-highlight', function (env) { + var vars = env.vars = env.vars || {}; + var commandLine = vars['command-line'] = vars['command-line'] || {}; + + if (commandLine.complete || !env.code) { + commandLine.complete = true; + return; + } + + // Works only for wrapped inside
       (not inline).
      +	var pre = env.element.parentNode;
      +	if (!pre || !/pre/i.test(pre.nodeName) || // Abort only if neither the 
       nor the  have the class
      +		(!clsReg.test(pre.className) && !clsReg.test(env.element.className))) {
      +		commandLine.complete = true;
      +		return;
      +	}
      +
      +	if (env.element.querySelector('.command-line-prompt')) { // Abort if prompt already exists.
      +		commandLine.complete = true;
      +		return;
      +	}
      +
      +	var codeLines = env.code.split('\n');
      +	commandLine.numberOfLines = codeLines.length;
      +	var outputLines = commandLine.outputLines = [];
      +
      +	var outputSections = pre.getAttribute('data-output');
      +	var outputFilter = pre.getAttribute('data-filter-output');
      +	if (outputSections || outputSections === '') { // The user specified the output lines. -- cwells
      +		outputSections = outputSections.split(',');
      +		for (var i = 0; i < outputSections.length; i++) { // Parse the output sections into start/end ranges. -- cwells
      +			var range = outputSections[i].split('-');
      +			var outputStart = parseInt(range[0], 10);
      +			var outputEnd = (range.length === 2 ? parseInt(range[1], 10) : outputStart);
      +
      +			if (!isNaN(outputStart) && !isNaN(outputEnd)) {
      +				if (outputStart < 1) {
      +					outputStart = 1;
      +				}
      +				if (outputEnd > codeLines.length) {
      +					outputEnd = codeLines.length;
      +				}
      +				// Convert start and end to 0-based to simplify the arrays. -- cwells
      +				outputStart--;
      +				outputEnd--;
      +				// Save the output line in an array and clear it in the code so it's not highlighted. -- cwells
      +				for (var j = outputStart; j <= outputEnd; j++) {
      +					outputLines[j] = codeLines[j];
      +					codeLines[j] = '';
      +				}
      +			}
      +		}
      +	} else if (outputFilter) { // Treat lines beginning with this string as output. -- cwells
      +		for (var i = 0; i < codeLines.length; i++) {
      +			if (codeLines[i].indexOf(outputFilter) === 0) { // This line is output. -- cwells
      +				outputLines[i] = codeLines[i].slice(outputFilter.length);
      +				codeLines[i] = '';
      +			}
      +		}
      +	}
      +
      +	env.code = codeLines.join('\n');
      +});
      +
      +Prism.hooks.add('before-insert', function (env) {
      +	var vars = env.vars = env.vars || {};
      +	var commandLine = vars['command-line'] = vars['command-line'] || {};
      +	if (commandLine.complete) {
      +		return;
      +	}
      +
      +	// Reinsert the output lines into the highlighted code. -- cwells
      +	var codeLines = env.highlightedCode.split('\n');
      +	for (var i = 0; i < commandLine.outputLines.length; i++) {
      +		if (commandLine.outputLines.hasOwnProperty(i)) {
      +			codeLines[i] = commandLine.outputLines[i];
      +		}
      +	}
      +	env.highlightedCode = codeLines.join('\n');
      +});
      +
      +Prism.hooks.add('complete', function (env) {
      +	var vars = env.vars = env.vars || {};
      +	var commandLine = vars['command-line'] = vars['command-line'] || {};
      +	if (commandLine.complete) {
      +		return;
      +	}
      +
      +	var pre = env.element.parentNode;
      +	if (clsReg.test(env.element.className)) { // Remove the class "command-line" from the 
      +		env.element.className = env.element.className.replace(clsReg, ' ');
      +	}
      +	if (!clsReg.test(pre.className)) { // Add the class "command-line" to the 
      +		pre.className += ' command-line';
      +	}
      +
      +	var getAttribute = function(key, defaultValue) {
      +		return (pre.getAttribute(key) || defaultValue).replace(/"/g, '"');
      +	};
      +
      +	// Create the "rows" that will become the command-line prompts. -- cwells
      +	var promptLines = new Array(commandLine.numberOfLines + 1);
      +	var promptText = getAttribute('data-prompt', '');
      +	if (promptText !== '') {
      +		promptLines = promptLines.join('');
      +	} else {
      +		var user = getAttribute('data-user', 'user');
      +		var host = getAttribute('data-host', 'localhost');
      +		promptLines = promptLines.join('');
      +	}
      +
      +	// Create the wrapper element. -- cwells
      +	var prompt = document.createElement('span');
      +	prompt.className = 'command-line-prompt';
      +	prompt.innerHTML = promptLines;
      +
      +	// Remove the prompt from the output lines. -- cwells
      +	for (var i = 0; i < commandLine.outputLines.length; i++) {
      +		if (commandLine.outputLines.hasOwnProperty(i)) {
      +			var node = prompt.children[i];
      +			node.removeAttribute('data-user');
      +			node.removeAttribute('data-host');
      +			node.removeAttribute('data-prompt');
      +		}
      +	}
      +
      +	env.element.insertBefore(prompt, env.element.firstChild);
      +	commandLine.complete = true;
      +});
      +
      +}());
      diff --git a/docs/_style/prism-master/plugins/command-line/prism-command-line.min.js b/docs/_style/prism-master/plugins/command-line/prism-command-line.min.js
      new file mode 100644
      index 00000000..44d011ac
      --- /dev/null
      +++ b/docs/_style/prism-master/plugins/command-line/prism-command-line.min.js
      @@ -0,0 +1 @@
      +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e=/(?:^|\s)command-line(?:\s|$)/;Prism.hooks.add("before-highlight",function(t){var a=t.vars=t.vars||{},n=a["command-line"]=a["command-line"]||{};if(n.complete||!t.code)return n.complete=!0,void 0;var r=t.element.parentNode;if(!r||!/pre/i.test(r.nodeName)||!e.test(r.className)&&!e.test(t.element.className))return n.complete=!0,void 0;if(t.element.querySelector(".command-line-prompt"))return n.complete=!0,void 0;var o=t.code.split("\n");n.numberOfLines=o.length;var s=n.outputLines=[],i=r.getAttribute("data-output"),l=r.getAttribute("data-filter-output");if(i||""===i){i=i.split(",");for(var m=0;mp&&(p=1),c>o.length&&(c=o.length),p--,c--;for(var u=p;c>=u;u++)s[u]=o[u],o[u]=""}}}else if(l)for(var m=0;m');else{var l=o("data-user","user"),m=o("data-host","localhost");s=s.join('')}var d=document.createElement("span");d.className="command-line-prompt",d.innerHTML=s;for(var p=0;p
      +
      +
      +
      +	
      +	
      +	Copy to Clipboard ▲ Prism plugins
      +	
      +	
      +	
      +	
      +	
      +
      +	
      +	
      +
      +
      +
      +
      +
      + +

      Copy to Clipboard

      +

      Add a button that copies the code block to the clipboard when clicked.

      +
      + +
      +

      How to use

      +

      In addition to including the plugin file with your PrismJS build, ensure Clipboard.js is loaded before the plugin.

      + +

      The simplest way to include Clipboard.js is to use any of the + recommended CDNs. If you're using Browserify, Clipboard.js will be loaded auotmatically + if it's included in your package.json. + If you don't load Clipboard.js yourself, the plugin will load it from a CDN for you.

      + +
      
      +
      + +
      + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.js b/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.js new file mode 100644 index 00000000..0b185f47 --- /dev/null +++ b/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.js @@ -0,0 +1,75 @@ +(function(){ + if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; + } + + if (!Prism.plugins.toolbar) { + console.warn('Copy to Clipboard plugin loaded before Toolbar plugin.'); + + return; + } + + var ClipboardJS = window.ClipboardJS || undefined; + + if (!ClipboardJS && typeof require === 'function') { + ClipboardJS = require('clipboard'); + } + + var callbacks = []; + + if (!ClipboardJS) { + var script = document.createElement('script'); + var head = document.querySelector('head'); + + script.onload = function() { + ClipboardJS = window.ClipboardJS; + + if (ClipboardJS) { + while (callbacks.length) { + callbacks.pop()(); + } + } + }; + + script.src = 'https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js'; + head.appendChild(script); + } + + Prism.plugins.toolbar.registerButton('copy-to-clipboard', function (env) { + var linkCopy = document.createElement('a'); + linkCopy.textContent = 'Copy'; + + if (!ClipboardJS) { + callbacks.push(registerClipboard); + } else { + registerClipboard(); + } + + return linkCopy; + + function registerClipboard() { + var clip = new ClipboardJS(linkCopy, { + 'text': function () { + return env.code; + } + }); + + clip.on('success', function() { + linkCopy.textContent = 'Copied!'; + + resetText(); + }); + clip.on('error', function () { + linkCopy.textContent = 'Press Ctrl+C to copy'; + + resetText(); + }); + } + + function resetText() { + setTimeout(function () { + linkCopy.textContent = 'Copy'; + }, 5000); + } + }); +})(); diff --git a/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js b/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js new file mode 100644 index 00000000..aa5742db --- /dev/null +++ b/docs/_style/prism-master/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js @@ -0,0 +1 @@ +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."),void 0;var o=window.ClipboardJS||void 0;o||"function"!=typeof require||(o=require("clipboard"));var e=[];if(!o){var t=document.createElement("script"),n=document.querySelector("head");t.onload=function(){if(o=window.ClipboardJS)for(;e.length;)e.pop()()},t.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",n.appendChild(t)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(t){function n(){var e=new o(i,{text:function(){return t.code}});e.on("success",function(){i.textContent="Copied!",r()}),e.on("error",function(){i.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){i.textContent="Copy"},5e3)}var i=document.createElement("a");return i.textContent="Copy",o?n():e.push(n),i})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/custom-class/index.html b/docs/_style/prism-master/plugins/custom-class/index.html new file mode 100644 index 00000000..ee4fade7 --- /dev/null +++ b/docs/_style/prism-master/plugins/custom-class/index.html @@ -0,0 +1,133 @@ + + + + + + +Custom Class ▲ Prism plugins + + + + + + + + + +
      +
      + +

      Custom Class

      +

      This plugin allows you to prefix Prism default classes (.comment will become .namespace--comment) or replace them with your defined ones (like .editor__comment or .comment_7sh3a).

      +
      + +
      +

      Motivation

      + +

      Prism default classes are sensible but fixed and too generic. This plugin provide some ways to customize those classes to suit your needs. Example usages:

      + +
        +
      • + You want to add namespace for all of them (like .prism--comment) to avoid conflict with your existing classes. +
      • +
      • + You use a naming convention (like BEM). You want to write classes like .editor__comment. +
      • +
      • You use + CSS Modules. You want to use your hashed classes, like .comment_7sh3a. +
      • +
      + +

      Features

      + +

      This plugin currently provides 2 features:

      + +

      1. Prefix all Prism classes with a string

      + + Prism.plugins.customClass.prefix('prism--') + +

      2. Replace some Prism classes with your defined ones via an object

      + +
      Prism.plugins.customClass.map({
      +	keyword: 'special-keyword',
      +	string: 'string_ch29s',
      +	comment: 'comment_93jsa'
      +})
      + +

      Object's keys are the tokens you want to replace (eg: comment), with their values being the classes you want to use (eg: my-comment). Tokens which are not specified will stay the same.

      + +

      Notes

      + +
        +
      • +

        Feature functions must be called AFTER Prism and this plugin. For example:

        + +
        <!-- 1. load prism -->
        +<script src="prism.js"></script>
        +<!-- 2. load the plugin if you don't include it inside prism when download -->
        +<script src="plugins/custom-class/custom-class.js"></script>
        +<!-- 3. call the feature you want to use -->
        +<script>
        +	Prism.plugins.customClass.map(myClassMap);
        +	Prism.plugins.customClass.prefix(myPrefixString);
        +</script>
        + +
      • + +
      • In most cases, using 1 feature is enough. However, it is possible to use both of them together if you want (Result will be like .my-namespace--comment_93jsa).
      • + +
      + +

      CSS Modules Usage:

      + +

      The initial purpose of this plugin is to be used with CSS Modules. It works perfectly with the class map object returned by CSS Modules. For example:

      + +
      import Prism from 'prismjs';
      +import classMap from 'styles/editor-class-map.css';
      +Prism.plugins.customClass.map(classMap)
      + +
      + +
      +

      Example

      + +

      Input

      +
      <pre class="language-javascript"><code>
      +	var foo = 'bar';
      +</code></pre>
      + +

      Options

      +
      Prism.plugins.customClass.map({
      +	keyword: 'special-keyword',
      +	string: 'my-string'
      +});
      +Prism.plugins.customClass.prefix('pr-');
      + +

      Output

      +
      <pre class="language-javascript"><code>
      +	<span class="pr-token pr-special-keyword">var</span>
      +	foo
      +	<span class="pr-token pr-operator">=</span>
      +	<span class="pr-my-string">'bar'</span>
      +	<span class="pr-token pr-punctuation">;</span>
      +</code></pre>
      +
      + +
      +

      Todo

      + +
      + +
      + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/custom-class/prism-custom-class.js b/docs/_style/prism-master/plugins/custom-class/prism-custom-class.js new file mode 100644 index 00000000..bb5bd6a6 --- /dev/null +++ b/docs/_style/prism-master/plugins/custom-class/prism-custom-class.js @@ -0,0 +1,31 @@ +(function(){ + +if ( + (typeof self === 'undefined' || !self.Prism) && + (typeof global === 'undefined' || !global.Prism) +) { + return; +} + +var options = { + classMap: {} +}; +Prism.plugins.customClass = { + map: function map(cm) { + options.classMap = cm; + }, + prefix: function prefix(string) { + options.prefixString = string; + } +} + +Prism.hooks.add('wrap', function (env) { + if (!options.classMap && !options.prefixString) { + return; + } + env.classes = env.classes.map(function(c) { + return (options.prefixString || '') + (options.classMap[c] || c); + }); +}); + +})(); diff --git a/docs/_style/prism-master/plugins/custom-class/prism-custom-class.min.js b/docs/_style/prism-master/plugins/custom-class/prism-custom-class.min.js new file mode 100644 index 00000000..f22063f5 --- /dev/null +++ b/docs/_style/prism-master/plugins/custom-class/prism-custom-class.min.js @@ -0,0 +1 @@ +!function(){if("undefined"!=typeof self&&self.Prism||"undefined"!=typeof global&&global.Prism){var s={classMap:{}};Prism.plugins.customClass={map:function(i){s.classMap=i},prefix:function(i){s.prefixString=i}},Prism.hooks.add("wrap",function(i){(s.classMap||s.prefixString)&&(i.classes=i.classes.map(function(i){return(s.prefixString||"")+(s.classMap[i]||i)}))})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/data-uri-highlight/index.html b/docs/_style/prism-master/plugins/data-uri-highlight/index.html new file mode 100644 index 00000000..380be2d6 --- /dev/null +++ b/docs/_style/prism-master/plugins/data-uri-highlight/index.html @@ -0,0 +1,60 @@ + + + + + + +Data-URI Highlight ▲ Prism plugins + + + + + + + + + + + +
      +
      + +

      Data-URI Highlight

      +

      Highlights data-URI contents.

      +
      + +
      +

      How to use

      +

      Data-URIs will be highlighted automatically, provided the needed grammar is loaded. + The grammar to use is guessed using the MIME type information.

      +
      + +
      +

      Example

      + +
      div {
      +    border: 40px solid transparent;
      +    border-image: 33.334% url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30"> \
      +                          <circle cx="5" cy="5" r="5" fill="%23ab4"/><circle cx="15" cy="5" r="5" fill="%23655"/> \
      +                          <circle cx="25" cy="5" r="5" fill="%23e07"/><circle cx="5" cy="15" r="5" fill="%23655"/> \
      +                          <circle cx="15" cy="15" r="5" fill="hsl(15, 25%, 75%)"/> \
      +                          <circle cx="25" cy="15" r="5" fill="%23655"/><circle cx="5" cy="25" r="5" fill="%23fb3"/> \
      +                          <circle cx="15" cy="25" r="5" fill="%23655"/><circle cx="25" cy="25" r="5" fill="%2358a"/></svg>');
      +    padding: 1em;
      +    max-width: 20em;
      +    font: 130%/1.6 Baskerville, Palatino, serif;
      +}
      + +
      + +
      + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.js b/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.js new file mode 100644 index 00000000..7ff8d1fd --- /dev/null +++ b/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.js @@ -0,0 +1,98 @@ +(function () { + + if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism + ) { + return; + } + + var autoLinkerProcess = function (grammar) { + if (Prism.plugins.autolinker) { + Prism.plugins.autolinker.processGrammar(grammar); + } + return grammar; + }; + var dataURI = { + pattern: /(.)\bdata:[^\/]+\/[^,]+,(?:(?!\1)[\s\S]|\\\1)+(?=\1)/, + lookbehind: true, + inside: { + 'language-css': { + pattern: /(data:[^\/]+\/(?:[^+,]+\+)?css,)[\s\S]+/, + lookbehind: true + }, + 'language-javascript': { + pattern: /(data:[^\/]+\/(?:[^+,]+\+)?javascript,)[\s\S]+/, + lookbehind: true + }, + 'language-json': { + pattern: /(data:[^\/]+\/(?:[^+,]+\+)?json,)[\s\S]+/, + lookbehind: true + }, + 'language-markup': { + pattern: /(data:[^\/]+\/(?:[^+,]+\+)?(?:html|xml),)[\s\S]+/, + lookbehind: true + } + } + }; + + // Tokens that may contain URLs + var candidates = ['url', 'attr-value', 'string']; + + Prism.plugins.dataURIHighlight = { + processGrammar: function (grammar) { + // Abort if grammar has already been processed + if (!grammar || grammar['data-uri']) { + return; + } + + Prism.languages.DFS(grammar, function (key, def, type) { + if (candidates.indexOf(type) > -1 && Prism.util.type(def) !== 'Array') { + if (!def.pattern) { + def = this[key] = { + pattern: def + }; + } + + def.inside = def.inside || {}; + + if (type == 'attr-value') { + Prism.languages.insertBefore('inside', def.inside['url-link'] ? 'url-link' : 'punctuation', { + 'data-uri': dataURI + }, def); + } + else { + if (def.inside['url-link']) { + Prism.languages.insertBefore('inside', 'url-link', { + 'data-uri': dataURI + }, def); + } else { + def.inside['data-uri'] = dataURI; + } + } + } + }); + grammar['data-uri'] = dataURI; + } + }; + + Prism.hooks.add('before-highlight', function (env) { + // Prepare the needed grammars for this code block + if (dataURI.pattern.test(env.code)) { + for (var p in dataURI.inside) { + if (dataURI.inside.hasOwnProperty(p)) { + if (!dataURI.inside[p].inside && dataURI.inside[p].pattern.test(env.code)) { + var lang = p.match(/^language-(.+)/)[1]; + if (Prism.languages[lang]) { + dataURI.inside[p].inside = { + rest: autoLinkerProcess(Prism.languages[lang]) + }; + } + } + } + } + } + + Prism.plugins.dataURIHighlight.processGrammar(env.grammar); + }); +}()); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.min.js b/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.min.js new file mode 100644 index 00000000..479828d9 --- /dev/null +++ b/docs/_style/prism-master/plugins/data-uri-highlight/prism-data-uri-highlight.min.js @@ -0,0 +1 @@ +!function(){if(("undefined"==typeof self||self.Prism)&&("undefined"==typeof global||global.Prism)){var i=function(i){return Prism.plugins.autolinker&&Prism.plugins.autolinker.processGrammar(i),i},a={pattern:/(.)\bdata:[^\/]+\/[^,]+,(?:(?!\1)[\s\S]|\\\1)+(?=\1)/,lookbehind:!0,inside:{"language-css":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?css,)[\s\S]+/,lookbehind:!0},"language-javascript":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?javascript,)[\s\S]+/,lookbehind:!0},"language-json":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?json,)[\s\S]+/,lookbehind:!0},"language-markup":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?(?:html|xml),)[\s\S]+/,lookbehind:!0}}},n=["url","attr-value","string"];Prism.plugins.dataURIHighlight={processGrammar:function(i){i&&!i["data-uri"]&&(Prism.languages.DFS(i,function(i,e,r){n.indexOf(r)>-1&&"Array"!==Prism.util.type(e)&&(e.pattern||(e=this[i]={pattern:e}),e.inside=e.inside||{},"attr-value"==r?Prism.languages.insertBefore("inside",e.inside["url-link"]?"url-link":"punctuation",{"data-uri":a},e):e.inside["url-link"]?Prism.languages.insertBefore("inside","url-link",{"data-uri":a},e):e.inside["data-uri"]=a)}),i["data-uri"]=a)}},Prism.hooks.add("before-highlight",function(n){if(a.pattern.test(n.code))for(var e in a.inside)if(a.inside.hasOwnProperty(e)&&!a.inside[e].inside&&a.inside[e].pattern.test(n.code)){var r=e.match(/^language-(.+)/)[1];Prism.languages[r]&&(a.inside[e].inside={rest:i(Prism.languages[r])})}Prism.plugins.dataURIHighlight.processGrammar(n.grammar)})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/file-highlight/index.html b/docs/_style/prism-master/plugins/file-highlight/index.html new file mode 100644 index 00000000..e66b9897 --- /dev/null +++ b/docs/_style/prism-master/plugins/file-highlight/index.html @@ -0,0 +1,75 @@ + + + + + + +File Highlight ▲ Prism plugins + + + + + + + + + + + +
      +
      + +

      File Highlight

      +

      Fetch external files and highlight them with Prism. Used on the Prism website itself.

      +
      + +
      +

      How to use

      + +

      Use the data-src attribute on empty <pre> elements, like so:

      + +
      <pre data-src="myfile.js"></pre>
      + +

      You don’t need to specify the language, it’s automatically determined by the file extension. + If, however, the language cannot be determined from the file extension or the file extension is incorrect, you may specify a language as well (with the usual class name way).

      + +

      Please note that the files are fetched with XMLHttpRequest. This means that if the file is on a different origin, fetching it will fail, unless CORS is enabled on that website.

      + +

      + When used in conjunction with the Toolbar plugin, this plugin can also display a button to download the file. + To use it, add a data-download-link attribute on the <pre> element.
      + Optionally, the text can also be customized by using a data-download-link-label attribute. +

      +
      <pre data-src="myfile.js" data-download-link data-download-link-label="Download this file"></pre>
      +
      + +
      +

      Examples

      + +

      The plugin’s JS code:

      +
      
      +	
      +	

      This page:

      +
      
      +
      +	

      File that doesn’t exist:

      +
      
      +
      +	

      With a download button:

      +
      
      +
      +	

      For more examples, browse around the Prism website. Most large code samples are actually files fetched with this plugin.

      +
      + +
      + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.js b/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.js new file mode 100644 index 00000000..65efaf9f --- /dev/null +++ b/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.js @@ -0,0 +1,105 @@ +(function () { + if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) { + return; + } + + /** + * @param {Element} [container=document] + */ + self.Prism.fileHighlight = function(container) { + container = container || document; + + var Extensions = { + 'js': 'javascript', + 'py': 'python', + 'rb': 'ruby', + 'ps1': 'powershell', + 'psm1': 'powershell', + 'sh': 'bash', + 'bat': 'batch', + 'h': 'c', + 'tex': 'latex' + }; + + Array.prototype.slice.call(container.querySelectorAll('pre[data-src]')).forEach(function (pre) { + // ignore if already loaded + if (pre.hasAttribute('data-src-loaded')) { + return; + } + + // load current + var src = pre.getAttribute('data-src'); + + var language, parent = pre; + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + while (parent && !lang.test(parent.className)) { + parent = parent.parentNode; + } + + if (parent) { + language = (pre.className.match(lang) || [, ''])[1]; + } + + if (!language) { + var extension = (src.match(/\.(\w+)$/) || [, ''])[1]; + language = Extensions[extension] || extension; + } + + var code = document.createElement('code'); + code.className = 'language-' + language; + + pre.textContent = ''; + + code.textContent = 'Loading…'; + + pre.appendChild(code); + + var xhr = new XMLHttpRequest(); + + xhr.open('GET', src, true); + + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + + if (xhr.status < 400 && xhr.responseText) { + code.textContent = xhr.responseText; + + Prism.highlightElement(code); + // mark as loaded + pre.setAttribute('data-src-loaded', ''); + } + else if (xhr.status >= 400) { + code.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText; + } + else { + code.textContent = '✖ Error: File does not exist or is empty'; + } + } + }; + + xhr.send(null); + }); + + if (Prism.plugins.toolbar) { + Prism.plugins.toolbar.registerButton('download-file', function (env) { + var pre = env.element.parentNode; + if (!pre || !/pre/i.test(pre.nodeName) || !pre.hasAttribute('data-src') || !pre.hasAttribute('data-download-link')) { + return; + } + var src = pre.getAttribute('data-src'); + var a = document.createElement('a'); + a.textContent = pre.getAttribute('data-download-link-label') || 'Download'; + a.setAttribute('download', ''); + a.href = src; + return a; + }); + } + + }; + + document.addEventListener('DOMContentLoaded', function () { + // execute inside handler, for dropping Event as argumnet + self.Prism.fileHighlight(); + }); + +})(); diff --git a/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.min.js b/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.min.js new file mode 100644 index 00000000..31869b3c --- /dev/null +++ b/docs/_style/prism-master/plugins/file-highlight/prism-file-highlight.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(t){t=t||document;var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(t.querySelectorAll("pre[data-src]")).forEach(function(t){if(!t.hasAttribute("data-src-loaded")){for(var a,n=t.getAttribute("data-src"),r=t,s=/\blang(?:uage)?-([\w-]+)\b/i;r&&!s.test(r.className);)r=r.parentNode;if(r&&(a=(t.className.match(s)||[,""])[1]),!a){var o=(n.match(/\.(\w+)$/)||[,""])[1];a=e[o]||o}var l=document.createElement("code");l.className="language-"+a,t.textContent="",l.textContent="Loading…",t.appendChild(l);var i=new XMLHttpRequest;i.open("GET",n,!0),i.onreadystatechange=function(){4==i.readyState&&(i.status<400&&i.responseText?(l.textContent=i.responseText,Prism.highlightElement(l),t.setAttribute("data-src-loaded","")):l.textContent=i.status>=400?"✖ Error "+i.status+" while fetching file: "+i.statusText:"✖ Error: File does not exist or is empty")},i.send(null)}}),Prism.plugins.toolbar&&Prism.plugins.toolbar.registerButton("download-file",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-src")&&e.hasAttribute("data-download-link")){var a=e.getAttribute("data-src"),n=document.createElement("a");return n.textContent=e.getAttribute("data-download-link-label")||"Download",n.setAttribute("download",""),n.href=a,n}})},document.addEventListener("DOMContentLoaded",function(){self.Prism.fileHighlight()}))}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/highlight-keywords/index.html b/docs/_style/prism-master/plugins/highlight-keywords/index.html new file mode 100644 index 00000000..46658734 --- /dev/null +++ b/docs/_style/prism-master/plugins/highlight-keywords/index.html @@ -0,0 +1,51 @@ + + + + + + +Highlight Keywords ▲ Prism plugins + + + + + + + + + + +
      +
      + +

      Highlight Keywords

      +

      This plugin adds special CSS classes for each keyword matched in the code. For example, the keyword if will have the class keyword-if as well. You can have fine grained control over the appearance of each keyword by providing your own CSS rules.

      +
      + +
      +

      Examples

      + +

      JavaScript

      +
      
      +
      +	

      HTML (Markup)

      +
      
      +
      +
      + + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.js b/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.js new file mode 100644 index 00000000..32b28122 --- /dev/null +++ b/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.js @@ -0,0 +1,17 @@ +(function(){ + +if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism +) { + return; +} + +Prism.hooks.add('wrap', function(env) { + if (env.type !== "keyword") { + return; + } + env.classes.push('keyword-' + env.content); +}); + +})(); diff --git a/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.min.js b/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.min.js new file mode 100644 index 00000000..c4326fea --- /dev/null +++ b/docs/_style/prism-master/plugins/highlight-keywords/prism-highlight-keywords.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&!self.Prism||"undefined"!=typeof global&&!global.Prism||Prism.hooks.add("wrap",function(e){"keyword"===e.type&&e.classes.push("keyword-"+e.content)})}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/index.html b/docs/_style/prism-master/plugins/index.html new file mode 100644 index 00000000..7b4a48a7 --- /dev/null +++ b/docs/_style/prism-master/plugins/index.html @@ -0,0 +1,42 @@ + + + + + + +Plugins ▲ Prism + + + + + + + + + + + +
      +
      +
      + +
      +

      Available plugins

      +
        +
        + +
        +

        Contribute

        +

        Writing Prism plugins is easy! Read how at the “Extending Prism” section. +

        + +
        + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/jsonp-highlight/index.html b/docs/_style/prism-master/plugins/jsonp-highlight/index.html new file mode 100644 index 00000000..2ad4ac9a --- /dev/null +++ b/docs/_style/prism-master/plugins/jsonp-highlight/index.html @@ -0,0 +1,174 @@ + + + + + + +JSONP Highlight ▲ Prism plugins + + + + + + + + + + +
        +
        + +

        JSONP Highlight

        +

        Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).

        +
        + +
        +

        How to use

        + +

        Use the data-jsonp attribute on <pre> elements, like so:

        + +
        <pre
        +  class="language-javascript"
        +  data-jsonp="https://api.github.com/repos/leaverou/prism/contents/prism.js">
        +</pre>
        + +

        + Don't specifiy the callback query parameter in the URL; this will be added + automatically. If the API expects a different callback parameter name however, use the + data-callback parameter to specify the name: +

        + +
        <pre class="…" data-jsonp="…" data-callback="cb"></pre>
        + +

        + The next trick is of course actually extracting something from the JSONP response worth + highlighting, which means processing the response to extract the interesting data. +

        + +

        The following JSONP APIs are automatically detected and parsed:

        + + + +

        If you need to do your own parsing, you can hook your your own data adapters in two ways:

        +
          +
        1. + Supply the data-adapter parameter on the <pre> element. + This must be the name of a globally defined function. + The plugin will use only this adapter to parse the response. +
        2. +
        3. + Register your adapter function by calling + Prism.plugins.jsonphighlight.registerAdapter(function(rsp) { … }). + It will be added to the list of inbuilt adapters and used if no other registered + adapater (e.g. GitHub/Bitbucket) can parse the response. +
        4. +
        + +

        + In either case, the function must accept at least a single parameter (the JSONP response) and + returns a string of the content to highlight. If your adapter cannot parse the response, you + must return null. The DOM node that will contain the highlighted code will also + be passed in as the second argument, incase you need to use it to query any extra information + (maybe you wish to inspect the class or data-jsonp attributes to + assist in parsing the response). +

        + +

        + The following example demonstrates both methods of using a custom adapter, to simply return + the stringyfied JSONP response (i.e highlight the entire JSONP data): +

        + +
        <!-- perhaps this is in a .js file elsewhere -->
        +<script>
        +	function dump_json(rsp) {
        +		return "using dump_json: " + JSON.stringify(rsp,null,2);
        +	}
        +</script>
        +
        +<!-- … include prism.js … -->
        +<script>
        +	Prism.plugins.jsonphighlight.registerAdapter(function(rsp) {
        +		return "using registerAdapter: " + JSON.stringify(rsp,null,2);
        +	})
        +</script>
        +
        + +

        And later in your HTML:

        + +
        <!-- using the data-adapter attribute -->
        +<pre class="language-javascript" data-jsonp="…" data-adapter="dump_json"></pre>
        +
        +<!-- using whatever data adapters are available -->
        +<pre class="language-javascript" data-jsonp="…"></pre>
        +
        + +

        + Finally, unlike like the File Highlight + plugin, you do need to supply the appropriate class with the language + to highlight. This could have been auto-detected, but since you're not actually linking to + a file it's not always possible (see below in the example using GitHub status). + Furthermore, if you're linking to files with a .xaml extension for example, + this plugin then needs to somehow map that to highlight as markup, which just + means more bloat. You know what you're trying to highlight, just say so :) +

        + +

        Caveat for Gists

        + +

        + There's a bit of a catch with gists, as they can actually contain multiple files. + There are two options to handle this: +

        + +
          +
        1. + If your gist only contains one file, you don't need to to anything; the one and only + file will automatically be chosen and highlighted +
        2. +
        3. + If your file contains multiple files, the first one will be chosen by default. + However, you can supply the filename in the data-filename attribute, and + this file will be highlighted instead: +
          <pre class="…" data-jsonp="…" data-filename="mydemo.js"></pre>
          +
        4. +
        +
        + +
        +

        Examples

        + +

        The plugin’s JS code (from GitHub):

        +
        
        +
        +	

        GitHub Gist (gist contains a single file, automatically selected):

        +
        
        +
        +	

        GitHub Gist (gist contains a multiple files, file to load specified):

        +
        
        +
        + 	

        Bitbucket API:

        +
        
        + 	
        + 	

        Custom adapter (JSON.stringify showing GitHub status):

        +
        
        +
        +	

        Registered adapter (as above, but without explicitly declaring the data-adapter attribute):

        +
        
        +
        + +
        + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.js b/docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.js new file mode 100644 index 00000000..4ce5ca50 --- /dev/null +++ b/docs/_style/prism-master/plugins/jsonp-highlight/prism-jsonp-highlight.js @@ -0,0 +1,151 @@ +(function() { + if ( !self.Prism || !self.document || !document.querySelectorAll || ![].filter) return; + + var adapters = []; + function registerAdapter(adapter) { + if (typeof adapter === "function" && !getAdapter(adapter)) { + adapters.push(adapter); + } + } + function getAdapter(adapter) { + if (typeof adapter === "function") { + return adapters.filter(function(fn) { return fn.valueOf() === adapter.valueOf()})[0]; + } + else if (typeof adapter === "string" && adapter.length > 0) { + return adapters.filter(function(fn) { return fn.name === adapter})[0]; + } + return null; + } + function removeAdapter(adapter) { + if (typeof adapter === "string") + adapter = getAdapter(adapter); + if (typeof adapter === "function") { + var index = adapters.indexOf(adapter); + if (index >=0) { + adapters.splice(index,1); + } + } + } + + Prism.plugins.jsonphighlight = { + registerAdapter: registerAdapter, + removeAdapter: removeAdapter, + highlight: highlight + }; + registerAdapter(function github(rsp, el) { + if ( rsp && rsp.meta && rsp.data ) { + if ( rsp.meta.status && rsp.meta.status >= 400 ) { + return "Error: " + ( rsp.data.message || rsp.meta.status ); + } + else if ( typeof(rsp.data.content) === "string" ) { + return typeof(atob) === "function" + ? atob(rsp.data.content.replace(/\s/g, "")) + : "Your browser cannot decode base64"; + } + } + return null; + }); + registerAdapter(function gist(rsp, el) { + if ( rsp && rsp.meta && rsp.data && rsp.data.files ) { + if ( rsp.meta.status && rsp.meta.status >= 400 ) { + return "Error: " + ( rsp.data.message || rsp.meta.status ); + } + else { + var filename = el.getAttribute("data-filename"); + if (filename == null) { + // Maybe in the future we can somehow render all files + // But the standard + + + + + + +
        +
        + +

        Keep markup

        +

        Prevents custom markup from being dropped out during highlighting.

        +
        + +
        + +

        How to use

        +

        You have nothing to do. With this plugin loaded, all markup inside code will be kept.

        + +

        Examples

        + +

        The following source code

        +
        <pre><code class="language-css">
        +@media <mark>screen</mark> {
        +	div {
        +		<mark>text</mark>-decoration: <mark><mark>under</mark>line</mark>;
        +		back<mark>ground: url</mark>('foo.png');
        +	}
        +}</code></pre>
        + +

        would render like this:

        +
        
        +@media screen {
        +	div {
        +		text-decoration: underline;
        +		background: url('foo.png');
        +	}
        +}
        + +

        + It also works for inline code: + var bar = function () { /* foo */ }; +

        + +
        + +
        + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.js b/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.js new file mode 100644 index 00000000..bc136c67 --- /dev/null +++ b/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.js @@ -0,0 +1,99 @@ +(function () { + + if (typeof self === 'undefined' || !self.Prism || !self.document || !document.createRange) { + return; + } + + Prism.plugins.KeepMarkup = true; + + Prism.hooks.add('before-highlight', function (env) { + if (!env.element.children.length) { + return; + } + + var pos = 0; + var data = []; + var f = function (elt, baseNode) { + var o = {}; + if (!baseNode) { + // Clone the original tag to keep all attributes + o.clone = elt.cloneNode(false); + o.posOpen = pos; + data.push(o); + } + for (var i = 0, l = elt.childNodes.length; i < l; i++) { + var child = elt.childNodes[i]; + if (child.nodeType === 1) { // element + f(child); + } else if(child.nodeType === 3) { // text + pos += child.data.length; + } + } + if (!baseNode) { + o.posClose = pos; + } + }; + f(env.element, true); + + if (data && data.length) { + // data is an array of all existing tags + env.keepMarkup = data; + } + }); + + Prism.hooks.add('after-highlight', function (env) { + if(env.keepMarkup && env.keepMarkup.length) { + + var walk = function (elt, nodeState) { + for (var i = 0, l = elt.childNodes.length; i < l; i++) { + + var child = elt.childNodes[i]; + + if (child.nodeType === 1) { // element + if (!walk(child, nodeState)) { + return false; + } + + } else if (child.nodeType === 3) { // text + if(!nodeState.nodeStart && nodeState.pos + child.data.length > nodeState.node.posOpen) { + // We found the start position + nodeState.nodeStart = child; + nodeState.nodeStartPos = nodeState.node.posOpen - nodeState.pos; + } + if(nodeState.nodeStart && nodeState.pos + child.data.length >= nodeState.node.posClose) { + // We found the end position + nodeState.nodeEnd = child; + nodeState.nodeEndPos = nodeState.node.posClose - nodeState.pos; + } + + nodeState.pos += child.data.length; + } + + if (nodeState.nodeStart && nodeState.nodeEnd) { + // Select the range and wrap it with the clone + var range = document.createRange(); + range.setStart(nodeState.nodeStart, nodeState.nodeStartPos); + range.setEnd(nodeState.nodeEnd, nodeState.nodeEndPos); + nodeState.node.clone.appendChild(range.extractContents()); + range.insertNode(nodeState.node.clone); + range.detach(); + + // Process is over + return false; + } + } + return true; + }; + + // For each tag, we walk the DOM to reinsert it + env.keepMarkup.forEach(function (node) { + walk(env.element, { + node: node, + pos: 0 + }); + }); + // Store new highlightedCode for later hooks calls + env.highlightedCode = env.element.innerHTML; + } + }); +}()); diff --git a/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.min.js b/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.min.js new file mode 100644 index 00000000..7f54d276 --- /dev/null +++ b/docs/_style/prism-master/plugins/keep-markup/prism-keep-markup.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&self.Prism&&self.document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",function(e){if(e.element.children.length){var n=0,o=[],t=function(e,d){var r={};d||(r.clone=e.cloneNode(!1),r.posOpen=n,o.push(r));for(var a=0,s=e.childNodes.length;s>a;a++){var l=e.childNodes[a];1===l.nodeType?t(l):3===l.nodeType&&(n+=l.data.length)}d||(r.posClose=n)};t(e.element,!0),o&&o.length&&(e.keepMarkup=o)}}),Prism.hooks.add("after-highlight",function(e){if(e.keepMarkup&&e.keepMarkup.length){var n=function(e,o){for(var t=0,d=e.childNodes.length;d>t;t++){var r=e.childNodes[t];if(1===r.nodeType){if(!n(r,o))return!1}else 3===r.nodeType&&(!o.nodeStart&&o.pos+r.data.length>o.node.posOpen&&(o.nodeStart=r,o.nodeStartPos=o.node.posOpen-o.pos),o.nodeStart&&o.pos+r.data.length>=o.node.posClose&&(o.nodeEnd=r,o.nodeEndPos=o.node.posClose-o.pos),o.pos+=r.data.length);if(o.nodeStart&&o.nodeEnd){var a=document.createRange();return a.setStart(o.nodeStart,o.nodeStartPos),a.setEnd(o.nodeEnd,o.nodeEndPos),o.node.clone.appendChild(a.extractContents()),a.insertNode(o.node.clone),a.detach(),!1}}return!0};e.keepMarkup.forEach(function(o){n(e.element,{node:o,pos:0})}),e.highlightedCode=e.element.innerHTML}}))}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-highlight/index.html b/docs/_style/prism-master/plugins/line-highlight/index.html new file mode 100644 index 00000000..f3b58b4b --- /dev/null +++ b/docs/_style/prism-master/plugins/line-highlight/index.html @@ -0,0 +1,88 @@ + + + + + + +Line highlight ▲ Prism plugins + + + + + + + + + + + +
        +
        + +

        Line highlight

        +

        Highlights specific lines and/or line ranges.

        +
        + +
        +

        How to use

        + +

        Obviously, this only works on code blocks (<pre><code>) and not for inline code. + +

        You specify the lines to be highlighted through the data-line attribute on the <pre> element, in the following simple format:

        +
          +
        • A single number refers to the line with that number
        • +
        • Ranges are denoted by two numbers, separated with a hyphen (-)
        • +
        • Multiple line numbers or ranges are separated by commas.
        • +
        • Whitespace is allowed anywhere and will be stripped off.
        • +
        + +

        Examples:

        +
        +
        5
        +
        The 5th line
        + +
        1-5
        +
        Lines 1 through 5
        + +
        1,4
        +
        Line 1 and line 4
        + +
        1-2, 5, 9-20
        +
        Lines 1 through 2, line 5, lines 9 through 20
        +
        + +

        In case you want the line numbering to be offset by a certain number (for example, you want the 1st line to be number 41 instead of 1, which is an offset of 40), you can additionally use the data-line-offset attribute. + +

        You can also link to specific lines on any code snippet, by using the following as a url hash: #{element-id}.{lines} where + {element-id} is the id of the <pre> element and {lines} is one or more lines or line ranges that follow the format + outlined above. For example, if there is an element with id="play" on the page, you can link to lines 5-6 by linking to #play.5-6

        +
        + +
        +

        Examples

        + +

        Line 2

        +
        
        +	
        +	

        Lines 15-25

        +
        
        +	
        +	

        Line 1 and lines 3-4 and line 42

        +
        
        +	
        +	

        Line 43, starting from line 41

        +
        
        +	
        +	

        Linking example

        +
        + +
        + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.css b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.css new file mode 100644 index 00000000..6058db44 --- /dev/null +++ b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.css @@ -0,0 +1,49 @@ +pre[data-line] { + position: relative; + padding: 1em 0 1em 3em; +} + +.line-highlight { + position: absolute; + left: 0; + right: 0; + padding: inherit 0; + margin-top: 1em; /* Same as .prism’s padding-top */ + + background: hsla(24, 20%, 50%,.08); + background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0)); + + pointer-events: none; + + line-height: inherit; + white-space: pre; +} + + .line-highlight:before, + .line-highlight[data-end]:after { + content: attr(data-start); + position: absolute; + top: .4em; + left: .6em; + min-width: 1em; + padding: 0 .5em; + background-color: hsla(24, 20%, 50%,.4); + color: hsl(24, 20%, 95%); + font: bold 65%/1.5 sans-serif; + text-align: center; + vertical-align: .3em; + border-radius: 999px; + text-shadow: none; + box-shadow: 0 1px white; + } + + .line-highlight[data-end]:after { + content: attr(data-end); + top: auto; + bottom: .4em; + } + +.line-numbers .line-highlight:before, +.line-numbers .line-highlight:after { + content: none; +} diff --git a/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.js b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.js new file mode 100644 index 00000000..5d919ae6 --- /dev/null +++ b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.js @@ -0,0 +1,181 @@ +(function(){ + +if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) { + return; +} + +function $$(expr, con) { + return Array.prototype.slice.call((con || document).querySelectorAll(expr)); +} + +function hasClass(element, className) { + className = " " + className + " "; + return (" " + element.className + " ").replace(/[\n\t]/g, " ").indexOf(className) > -1 +} + +// Some browsers round the line-height, others don't. +// We need to test for it to position the elements properly. +var isLineHeightRounded = (function() { + var res; + return function() { + if(typeof res === 'undefined') { + var d = document.createElement('div'); + d.style.fontSize = '13px'; + d.style.lineHeight = '1.5'; + d.style.padding = 0; + d.style.border = 0; + d.innerHTML = ' 
         '; + document.body.appendChild(d); + // Browsers that round the line-height should have offsetHeight === 38 + // The others should have 39. + res = d.offsetHeight === 38; + document.body.removeChild(d); + } + return res; + } +}()); + +function highlightLines(pre, lines, classes) { + lines = typeof lines === 'string' ? lines : pre.getAttribute('data-line'); + + var ranges = lines.replace(/\s+/g, '').split(','), + offset = +pre.getAttribute('data-line-offset') || 0; + + var parseMethod = isLineHeightRounded() ? parseInt : parseFloat; + var lineHeight = parseMethod(getComputedStyle(pre).lineHeight); + var hasLineNumbers = hasClass(pre, 'line-numbers'); + + for (var i=0, currentRange; currentRange = ranges[i++];) { + var range = currentRange.split('-'); + + var start = +range[0], + end = +range[1] || start; + + var line = pre.querySelector('.line-highlight[data-range="' + currentRange + '"]') || document.createElement('div'); + + line.setAttribute('aria-hidden', 'true'); + line.setAttribute('data-range', currentRange); + line.className = (classes || '') + ' line-highlight'; + + //if the line-numbers plugin is enabled, then there is no reason for this plugin to display the line numbers + if(hasLineNumbers && Prism.plugins.lineNumbers) { + var startNode = Prism.plugins.lineNumbers.getLine(pre, start); + var endNode = Prism.plugins.lineNumbers.getLine(pre, end); + + if (startNode) { + line.style.top = startNode.offsetTop + 'px'; + } + + if (endNode) { + line.style.height = (endNode.offsetTop - startNode.offsetTop) + endNode.offsetHeight + 'px'; + } + } else { + line.setAttribute('data-start', start); + + if(end > start) { + line.setAttribute('data-end', end); + } + + line.style.top = (start - offset - 1) * lineHeight + 'px'; + + line.textContent = new Array(end - start + 2).join(' \n'); + } + + //allow this to play nicely with the line-numbers plugin + if(hasLineNumbers) { + //need to attack to pre as when line-numbers is enabled, the code tag is relatively which screws up the positioning + pre.appendChild(line); + } else { + (pre.querySelector('code') || pre).appendChild(line); + } + } +} + +function applyHash() { + var hash = location.hash.slice(1); + + // Remove pre-existing temporary lines + $$('.temporary.line-highlight').forEach(function (line) { + line.parentNode.removeChild(line); + }); + + var range = (hash.match(/\.([\d,-]+)$/) || [,''])[1]; + + if (!range || document.getElementById(hash)) { + return; + } + + var id = hash.slice(0, hash.lastIndexOf('.')), + pre = document.getElementById(id); + + if (!pre) { + return; + } + + if (!pre.hasAttribute('data-line')) { + pre.setAttribute('data-line', ''); + } + + highlightLines(pre, range, 'temporary '); + + document.querySelector('.temporary.line-highlight').scrollIntoView(); +} + +var fakeTimer = 0; // Hack to limit the number of times applyHash() runs + +Prism.hooks.add('before-sanity-check', function(env) { + var pre = env.element.parentNode; + var lines = pre && pre.getAttribute('data-line'); + + if (!pre || !lines || !/pre/i.test(pre.nodeName)) { + return; + } + + /* + * Cleanup for other plugins (e.g. autoloader). + * + * Sometimes blocks are highlighted multiple times. It is necessary + * to cleanup any left-over tags, because the whitespace inside of the
        + * tags change the content of the tag. + */ + var num = 0; + $$('.line-highlight', pre).forEach(function (line) { + num += line.textContent.length; + line.parentNode.removeChild(line); + }); + // Remove extra whitespace + if (num && /^( \n)+$/.test(env.code.slice(-num))) { + env.code = env.code.slice(0, -num); + } +}); + +Prism.hooks.add('complete', function completeHook(env) { + var pre = env.element.parentNode; + var lines = pre && pre.getAttribute('data-line'); + + if (!pre || !lines || !/pre/i.test(pre.nodeName)) { + return; + } + + clearTimeout(fakeTimer); + + var hasLineNumbers = Prism.plugins.lineNumbers; + var isLineNumbersLoaded = env.plugins && env.plugins.lineNumbers; + + if (hasClass(pre, 'line-numbers') && hasLineNumbers && !isLineNumbersLoaded) { + Prism.hooks.add('line-numbers', completeHook); + } else { + highlightLines(pre, lines); + fakeTimer = setTimeout(applyHash, 1); + } +}); + + window.addEventListener('hashchange', applyHash); + window.addEventListener('resize', function () { + var preElements = document.querySelectorAll('pre[data-line]'); + Array.prototype.forEach.call(preElements, function (pre) { + highlightLines(pre); + }); + }); + +})(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.min.js b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.min.js new file mode 100644 index 00000000..6c870914 --- /dev/null +++ b/docs/_style/prism-master/plugins/line-highlight/prism-line-highlight.min.js @@ -0,0 +1 @@ +!function(){function e(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function t(e,t){return t=" "+t+" ",(" "+e.className+" ").replace(/[\n\t]/g," ").indexOf(t)>-1}function n(e,n,i){n="string"==typeof n?n:e.getAttribute("data-line");for(var o,l=n.replace(/\s+/g,"").split(","),a=+e.getAttribute("data-line-offset")||0,s=r()?parseInt:parseFloat,d=s(getComputedStyle(e).lineHeight),u=t(e,"line-numbers"),c=0;o=l[c++];){var p=o.split("-"),m=+p[0],f=+p[1]||m,h=e.querySelector('.line-highlight[data-range="'+o+'"]')||document.createElement("div");if(h.setAttribute("aria-hidden","true"),h.setAttribute("data-range",o),h.className=(i||"")+" line-highlight",u&&Prism.plugins.lineNumbers){var g=Prism.plugins.lineNumbers.getLine(e,m),y=Prism.plugins.lineNumbers.getLine(e,f);g&&(h.style.top=g.offsetTop+"px"),y&&(h.style.height=y.offsetTop-g.offsetTop+y.offsetHeight+"px")}else h.setAttribute("data-start",m),f>m&&h.setAttribute("data-end",f),h.style.top=(m-a-1)*d+"px",h.textContent=new Array(f-m+2).join(" \n");u?e.appendChild(h):(e.querySelector("code")||e).appendChild(h)}}function i(){var t=location.hash.slice(1);e(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var i=(t.match(/\.([\d,-]+)$/)||[,""])[1];if(i&&!document.getElementById(t)){var r=t.slice(0,t.lastIndexOf(".")),o=document.getElementById(r);o&&(o.hasAttribute("data-line")||o.setAttribute("data-line",""),n(o,i,"temporary "),document.querySelector(".temporary.line-highlight").scrollIntoView())}}if("undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector){var r=function(){var e;return function(){if("undefined"==typeof e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding=0,t.style.border=0,t.innerHTML=" 
         ",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}}(),o=0;Prism.hooks.add("before-sanity-check",function(t){var n=t.element.parentNode,i=n&&n.getAttribute("data-line");if(n&&i&&/pre/i.test(n.nodeName)){var r=0;e(".line-highlight",n).forEach(function(e){r+=e.textContent.length,e.parentNode.removeChild(e)}),r&&/^( \n)+$/.test(t.code.slice(-r))&&(t.code=t.code.slice(0,-r))}}),Prism.hooks.add("complete",function l(e){var r=e.element.parentNode,a=r&&r.getAttribute("data-line");if(r&&a&&/pre/i.test(r.nodeName)){clearTimeout(o);var s=Prism.plugins.lineNumbers,d=e.plugins&&e.plugins.lineNumbers;t(r,"line-numbers")&&s&&!d?Prism.hooks.add("line-numbers",l):(n(r,a),o=setTimeout(i,1))}}),window.addEventListener("hashchange",i),window.addEventListener("resize",function(){var e=document.querySelectorAll("pre[data-line]");Array.prototype.forEach.call(e,function(e){n(e)})})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-numbers/index.html b/docs/_style/prism-master/plugins/line-numbers/index.html new file mode 100644 index 00000000..5af756ca --- /dev/null +++ b/docs/_style/prism-master/plugins/line-numbers/index.html @@ -0,0 +1,69 @@ + + + + + + +Line Numbers ▲ Prism plugins + + + + + + + + + + + +
        +
        + +

        Line Numbers

        +

        Line number at the beginning of code lines.

        +
        + +
        +

        How to use

        + +

        Obviously, this is supposed to work only for code blocks (<pre><code>) and not for inline code.

        +

        Add class line-numbers to your desired <pre> and line-numbers plugin will take care.

        +

        Optional: You can specify the data-start (Number) attribute on the <pre> element. It will shift the line counter.

        +

        Optional: To support multiline line numbers using soft wrap add css white-space to pre-line or pre-wrap.

        +
        + +
        +

        Examples

        + +

        JavaScript

        +
        
        +
        +  

        CSS

        +
        
        +
        +  

        HTML

        +

        Please note the data-start="-5" in the code below.

        +
        
        +
        +  

        Unknown languages

        +
        This raw text
        +is not highlighted
        +but it still has
        +lines numbers
        + +

        Soft wrap support

        +
        
        +
        +
        + +
        + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.css b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.css new file mode 100644 index 00000000..08b29ed6 --- /dev/null +++ b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.css @@ -0,0 +1,41 @@ +pre[class*="language-"].line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; +} + +pre[class*="language-"].line-numbers > code { + position: relative; + white-space: inherit; +} + +.line-numbers .line-numbers-rows { + position: absolute; + pointer-events: none; + top: 0; + font-size: 100%; + left: -3.8em; + width: 3em; /* works for line-numbers below 1000 lines */ + letter-spacing: -1px; + border-right: 1px solid #999; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + +} + + .line-numbers-rows > span { + pointer-events: none; + display: block; + counter-increment: linenumber; + } + + .line-numbers-rows > span:before { + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; + } diff --git a/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.js b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.js new file mode 100644 index 00000000..e9e684fe --- /dev/null +++ b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.js @@ -0,0 +1,159 @@ +(function () { + + if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; + } + + /** + * Plugin name which is used as a class name for
         which is activating the plugin
        +	 * @type {String}
        +	 */
        +	var PLUGIN_NAME = 'line-numbers';
        +	
        +	/**
        +	 * Regular expression used for determining line breaks
        +	 * @type {RegExp}
        +	 */
        +	var NEW_LINE_EXP = /\n(?!$)/g;
        +
        +	/**
        +	 * Resizes line numbers spans according to height of line of code
        +	 * @param {Element} element 
         element
        +	 */
        +	var _resizeElement = function (element) {
        +		var codeStyles = getStyles(element);
        +		var whiteSpace = codeStyles['white-space'];
        +
        +		if (whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line') {
        +			var codeElement = element.querySelector('code');
        +			var lineNumbersWrapper = element.querySelector('.line-numbers-rows');
        +			var lineNumberSizer = element.querySelector('.line-numbers-sizer');
        +			var codeLines = codeElement.textContent.split(NEW_LINE_EXP);
        +
        +			if (!lineNumberSizer) {
        +				lineNumberSizer = document.createElement('span');
        +				lineNumberSizer.className = 'line-numbers-sizer';
        +
        +				codeElement.appendChild(lineNumberSizer);
        +			}
        +
        +			lineNumberSizer.style.display = 'block';
        +
        +			codeLines.forEach(function (line, lineNumber) {
        +				lineNumberSizer.textContent = line || '\n';
        +				var lineSize = lineNumberSizer.getBoundingClientRect().height;
        +				lineNumbersWrapper.children[lineNumber].style.height = lineSize + 'px';
        +			});
        +
        +			lineNumberSizer.textContent = '';
        +			lineNumberSizer.style.display = 'none';
        +		}
        +	};
        +
        +	/**
        +	 * Returns style declarations for the element
        +	 * @param {Element} element
        +	 */
        +	var getStyles = function (element) {
        +		if (!element) {
        +			return null;
        +		}
        +
        +		return window.getComputedStyle ? getComputedStyle(element) : (element.currentStyle || null);
        +	};
        +
        +	window.addEventListener('resize', function () {
        +		Array.prototype.forEach.call(document.querySelectorAll('pre.' + PLUGIN_NAME), _resizeElement);
        +	});
        +
        +	Prism.hooks.add('complete', function (env) {
        +		if (!env.code) {
        +			return;
        +		}
        +
        +		// works only for  wrapped inside 
         (not inline)
        +		var pre = env.element.parentNode;
        +		var clsReg = /\s*\bline-numbers\b\s*/;
        +		if (
        +			!pre || !/pre/i.test(pre.nodeName) ||
        +			// Abort only if nor the 
         nor the  have the class
        +			(!clsReg.test(pre.className) && !clsReg.test(env.element.className))
        +		) {
        +			return;
        +		}
        +
        +		if (env.element.querySelector('.line-numbers-rows')) {
        +			// Abort if line numbers already exists
        +			return;
        +		}
        +
        +		if (clsReg.test(env.element.className)) {
        +			// Remove the class 'line-numbers' from the 
        +			env.element.className = env.element.className.replace(clsReg, ' ');
        +		}
        +		if (!clsReg.test(pre.className)) {
        +			// Add the class 'line-numbers' to the 
        +			pre.className += ' line-numbers';
        +		}
        +
        +		var match = env.code.match(NEW_LINE_EXP);
        +		var linesNum = match ? match.length + 1 : 1;
        +		var lineNumbersWrapper;
        +
        +		var lines = new Array(linesNum + 1);
        +		lines = lines.join('');
        +
        +		lineNumbersWrapper = document.createElement('span');
        +		lineNumbersWrapper.setAttribute('aria-hidden', 'true');
        +		lineNumbersWrapper.className = 'line-numbers-rows';
        +		lineNumbersWrapper.innerHTML = lines;
        +
        +		if (pre.hasAttribute('data-start')) {
        +			pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1);
        +		}
        +
        +		env.element.appendChild(lineNumbersWrapper);
        +
        +		_resizeElement(pre);
        +
        +		Prism.hooks.run('line-numbers', env);
        +	});
        +
        +	Prism.hooks.add('line-numbers', function (env) {
        +		env.plugins = env.plugins || {};
        +		env.plugins.lineNumbers = true;
        +	});
        +	
        +	/**
        +	 * Global exports
        +	 */
        +	Prism.plugins.lineNumbers = {
        +		/**
        +		 * Get node for provided line number
        +		 * @param {Element} element pre element
        +		 * @param {Number} number line number
        +		 * @return {Element|undefined}
        +		 */
        +		getLine: function (element, number) {
        +			if (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {
        +				return;
        +			}
        +
        +			var lineNumberRows = element.querySelector('.line-numbers-rows');
        +			var lineNumberStart = parseInt(element.getAttribute('data-start'), 10) || 1;
        +			var lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);
        +
        +			if (number < lineNumberStart) {
        +				number = lineNumberStart;
        +			}
        +			if (number > lineNumberEnd) {
        +				number = lineNumberEnd;
        +			}
        +
        +			var lineIndex = number - lineNumberStart;
        +
        +			return lineNumberRows.children[lineIndex];
        +		}
        +	};
        +
        +}());
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.min.js b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.min.js
        new file mode 100644
        index 00000000..5291216f
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/line-numbers/prism-line-numbers.min.js
        @@ -0,0 +1 @@
        +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e="line-numbers",t=/\n(?!$)/g,n=function(e){var n=r(e),s=n["white-space"];if("pre-wrap"===s||"pre-line"===s){var l=e.querySelector("code"),i=e.querySelector(".line-numbers-rows"),a=e.querySelector(".line-numbers-sizer"),o=l.textContent.split(t);a||(a=document.createElement("span"),a.className="line-numbers-sizer",l.appendChild(a)),a.style.display="block",o.forEach(function(e,t){a.textContent=e||"\n";var n=a.getBoundingClientRect().height;i.children[t].style.height=n+"px"}),a.textContent="",a.style.display="none"}},r=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null};window.addEventListener("resize",function(){Array.prototype.forEach.call(document.querySelectorAll("pre."+e),n)}),Prism.hooks.add("complete",function(e){if(e.code){var r=e.element.parentNode,s=/\s*\bline-numbers\b\s*/;if(r&&/pre/i.test(r.nodeName)&&(s.test(r.className)||s.test(e.element.className))&&!e.element.querySelector(".line-numbers-rows")){s.test(e.element.className)&&(e.element.className=e.element.className.replace(s," ")),s.test(r.className)||(r.className+=" line-numbers");var l,i=e.code.match(t),a=i?i.length+1:1,o=new Array(a+1);o=o.join(""),l=document.createElement("span"),l.setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=o,r.hasAttribute("data-start")&&(r.style.counterReset="linenumber "+(parseInt(r.getAttribute("data-start"),10)-1)),e.element.appendChild(l),n(r),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}),Prism.plugins.lineNumbers={getLine:function(t,n){if("PRE"===t.tagName&&t.classList.contains(e)){var r=t.querySelector(".line-numbers-rows"),s=parseInt(t.getAttribute("data-start"),10)||1,l=s+(r.children.length-1);s>n&&(n=s),n>l&&(n=l);var i=n-s;return r.children[i]}}}}}();
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/normalize-whitespace/demo.html b/docs/_style/prism-master/plugins/normalize-whitespace/demo.html
        new file mode 100644
        index 00000000..a6bcf22b
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/normalize-whitespace/demo.html
        @@ -0,0 +1,33 @@
        +
        +
        + +
        +
        +	
        +
        +
        +		var example = {
        +			foo: true,
        +
        +			bar: false
        +		};
        +
        +
        +	
        +
        +
        + +
        + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/normalize-whitespace/index.html b/docs/_style/prism-master/plugins/normalize-whitespace/index.html new file mode 100644 index 00000000..e1469de6 --- /dev/null +++ b/docs/_style/prism-master/plugins/normalize-whitespace/index.html @@ -0,0 +1,180 @@ + + + + + + + Normalize Whitespace ▲ Prism plugins + + + + + + + + + + + + +
        +
        + +

        Normalize Whitespace

        +

        Supports multiple operations to normalize whitespace in code blocks.

        +
        + +
        +

        How to use

        + +

        Obviously, this is supposed to work only for code blocks (<pre><code>) and not for inline code.

        +

        By default the plugin trims all leading and trailing whitespace of every code block. + It also removes extra indents and trailing whitespace on every line.

        + +

        The plugin can be disabled for a particular code block by adding the class no-whitespace-normalization to + either the <pre> or <code> tag.

        + +

        The default settings can be overridden with the setDefaults() method + like so:

        + +
        
        +Prism.plugins.NormalizeWhitespace.setDefaults({
        +	'remove-trailing': true,
        +	'remove-indent': true,
        +	'left-trim': true,
        +	'right-trim': true,
        +	/*'break-lines': 80,
        +	'indent': 2,
        +	'remove-initial-line-feed': false,
        +	'tabs-to-spaces': 4,
        +	'spaces-to-tabs': 4*/
        +});
        +
        + +

        The following settings are available:

        + +
        +
        remove-trailing
        +
        Removes trailing whitespace on all lines.
        +
        remove-indent
        +
        If the whole code block is indented too much it removes the extra indent.
        +
        left-trim
        +
        Removes all whitespace from the top of the code block.
        +
        right-trim
        +
        Removes all whitespace from the bottom of the code block.
        +
        break-lines
        +
        Simple way of breaking long lines at a certain length (default is 80 characters).
        +
        indent
        +
        Adds a certain number of tabs to every line.
        +
        remove-initial-line-feed
        +
        Less aggressive version of left-trim. + It only removes a single line feed from the top of the code block.
        +
        tabs-to-spaces
        +
        Converts all tabs to a certain number of spaces (default is 4 spaces).
        +
        spaces-to-tabs
        +
        Converts a certain number of spaces to a tab (default is 4 spaces).
        +
        +
        + +
        +

        Examples

        + +

        The following example demonstrates the use of this plugin:

        + +
        
        +
        +	

        The result looks like this:

        + +
        +
        +	
        +
        +
        +		var example = {
        +			foo: true,
        +
        +			bar: false
        +		};
        +
        +
        +	
        +
        +
        + +

        It is also compatible with the keep-markup plugin:

        + +
        +
        +	
        +
        +
        +	@media screen {
        +		div {
        +			text-decoration: underline;
        +			background: url('foo.png');
        +		}
        +	}
        +
        +
        +
        + +

        This plugin can also be used on the server or on the command line with Node.js:

        + +
        
        +var Prism = require('prismjs');
        +var Normalizer = require('prismjs/plugins/normalize-whitespace/prism-normalize-whitespace');
        +// Create a new Normalizer object
        +var nw = new Normalizer({
        +	'remove-trailing': true,
        +	'remove-indent': true,
        +	'left-trim': true,
        +	'right-trim': true,
        +	/*'break-lines': 80,
        +	'indent': 2,
        +	'remove-initial-line-feed': false,
        +	'tabs-to-spaces': 4,
        +	'spaces-to-tabs': 4*/
        +});
        +
        +// ..or use the default object from Prism
        +nw = Prism.plugins.NormalizeWhitespace;
        +
        +// The code snippet you want to highlight, as a string
        +var code = "\t\t\tvar data = 1;    ";
        +
        +// Removes leading and trailing whitespace
        +// and then indents by 1 tab
        +code = nw.normalize(code, {
        +	// Extra settings
        +	indent: 1
        +});
        +
        +// Returns a highlighted HTML string
        +var html = Prism.highlight(code, Prism.languages.javascript);
        +	
        + + +
        + +
        + + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.js b/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.js new file mode 100644 index 00000000..b6c64727 --- /dev/null +++ b/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.js @@ -0,0 +1,190 @@ +(function() { + +var assign = Object.assign || function (obj1, obj2) { + for (var name in obj2) { + if (obj2.hasOwnProperty(name)) + obj1[name] = obj2[name]; + } + return obj1; +} + +function NormalizeWhitespace(defaults) { + this.defaults = assign({}, defaults); +} + +function toCamelCase(value) { + return value.replace(/-(\w)/g, function(match, firstChar) { + return firstChar.toUpperCase(); + }); +} + +function tabLen(str) { + var res = 0; + for (var i = 0; i < str.length; ++i) { + if (str.charCodeAt(i) == '\t'.charCodeAt(0)) + res += 3; + } + return str.length + res; +} + +NormalizeWhitespace.prototype = { + setDefaults: function (defaults) { + this.defaults = assign(this.defaults, defaults); + }, + normalize: function (input, settings) { + settings = assign(this.defaults, settings); + + for (var name in settings) { + var methodName = toCamelCase(name); + if (name !== "normalize" && methodName !== 'setDefaults' && + settings[name] && this[methodName]) { + input = this[methodName].call(this, input, settings[name]); + } + } + + return input; + }, + + /* + * Normalization methods + */ + leftTrim: function (input) { + return input.replace(/^\s+/, ''); + }, + rightTrim: function (input) { + return input.replace(/\s+$/, ''); + }, + tabsToSpaces: function (input, spaces) { + spaces = spaces|0 || 4; + return input.replace(/\t/g, new Array(++spaces).join(' ')); + }, + spacesToTabs: function (input, spaces) { + spaces = spaces|0 || 4; + return input.replace(RegExp(' {' + spaces + '}', 'g'), '\t'); + }, + removeTrailing: function (input) { + return input.replace(/\s*?$/gm, ''); + }, + // Support for deprecated plugin remove-initial-line-feed + removeInitialLineFeed: function (input) { + return input.replace(/^(?:\r?\n|\r)/, ''); + }, + removeIndent: function (input) { + var indents = input.match(/^[^\S\n\r]*(?=\S)/gm); + + if (!indents || !indents[0].length) + return input; + + indents.sort(function(a, b){return a.length - b.length; }); + + if (!indents[0].length) + return input; + + return input.replace(RegExp('^' + indents[0], 'gm'), ''); + }, + indent: function (input, tabs) { + return input.replace(/^[^\S\n\r]*(?=\S)/gm, new Array(++tabs).join('\t') + '$&'); + }, + breakLines: function (input, characters) { + characters = (characters === true) ? 80 : characters|0 || 80; + + var lines = input.split('\n'); + for (var i = 0; i < lines.length; ++i) { + if (tabLen(lines[i]) <= characters) + continue; + + var line = lines[i].split(/(\s+)/g), + len = 0; + + for (var j = 0; j < line.length; ++j) { + var tl = tabLen(line[j]); + len += tl; + if (len > characters) { + line[j] = '\n' + line[j]; + len = tl; + } + } + lines[i] = line.join(''); + } + return lines.join('\n'); + } +}; + +// Support node modules +if (typeof module !== 'undefined' && module.exports) { + module.exports = NormalizeWhitespace; +} + +// Exit if prism is not loaded +if (typeof Prism === 'undefined') { + return; +} + +Prism.plugins.NormalizeWhitespace = new NormalizeWhitespace({ + 'remove-trailing': true, + 'remove-indent': true, + 'left-trim': true, + 'right-trim': true, + /*'break-lines': 80, + 'indent': 2, + 'remove-initial-line-feed': false, + 'tabs-to-spaces': 4, + 'spaces-to-tabs': 4*/ +}); + +Prism.hooks.add('before-sanity-check', function (env) { + var Normalizer = Prism.plugins.NormalizeWhitespace; + + // Check settings + if (env.settings && env.settings['whitespace-normalization'] === false) { + return; + } + + // Simple mode if there is no env.element + if ((!env.element || !env.element.parentNode) && env.code) { + env.code = Normalizer.normalize(env.code, env.settings); + return; + } + + // Normal mode + var pre = env.element.parentNode; + var clsReg = /\bno-whitespace-normalization\b/; + if (!env.code || !pre || pre.nodeName.toLowerCase() !== 'pre' || + clsReg.test(pre.className) || clsReg.test(env.element.className)) + return; + + var children = pre.childNodes, + before = '', + after = '', + codeFound = false; + + // Move surrounding whitespace from the
         tag into the  tag
        +	for (var i = 0; i < children.length; ++i) {
        +		var node = children[i];
        +
        +		if (node == env.element) {
        +			codeFound = true;
        +		} else if (node.nodeName === "#text") {
        +			if (codeFound) {
        +				after += node.nodeValue;
        +			} else {
        +				before += node.nodeValue;
        +			}
        +
        +			pre.removeChild(node);
        +			--i;
        +		}
        +	}
        +
        +	if (!env.element.children.length || !Prism.plugins.KeepMarkup) {
        +		env.code = before + env.code + after;
        +		env.code = Normalizer.normalize(env.code, env.settings);
        +	} else {
        +		// Preserve markup for keep-markup plugin
        +		var html = before + env.element.innerHTML + after;
        +		env.element.innerHTML = Normalizer.normalize(html, env.settings);
        +		env.code = env.element.textContent;
        +	}
        +});
        +
        +}());
        diff --git a/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.min.js b/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.min.js
        new file mode 100644
        index 00000000..39fa5795
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/normalize-whitespace/prism-normalize-whitespace.min.js
        @@ -0,0 +1 @@
        +!function(){function e(e){this.defaults=r({},e)}function n(e){return e.replace(/-(\w)/g,function(e,n){return n.toUpperCase()})}function t(e){for(var n=0,t=0;tn&&(o[s]="\n"+o[s],a=l)}r[i]=o.join("")}return r.join("\n")}},"undefined"!=typeof module&&module.exports&&(module.exports=e),"undefined"!=typeof Prism&&(Prism.plugins.NormalizeWhitespace=new e({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",function(e){var n=Prism.plugins.NormalizeWhitespace;if(!e.settings||e.settings["whitespace-normalization"]!==!1){if((!e.element||!e.element.parentNode)&&e.code)return e.code=n.normalize(e.code,e.settings),void 0;var t=e.element.parentNode,r=/\bno-whitespace-normalization\b/;if(e.code&&t&&"pre"===t.nodeName.toLowerCase()&&!r.test(t.className)&&!r.test(e.element.className)){for(var i=t.childNodes,o="",a="",s=!1,l=0;l
        +
        +
        +
        +	
        +	
        +	Previewers ▲ Prism plugins
        +	
        +	
        +	
        +	
        +	
        +
        +	
        +	
        +
        +
        +
        +
        +
        + +

        Previewers

        +

        Previewers for angles, colors, gradients, easing and time.

        +
        + +
        +

        How to use

        + +

        You don't need to do anything. With this plugin loaded, a previewer will appear on hovering some values in code blocks. + The following previewers are supported:

        +
          +
        • angle for angles
        • +
        • color for colors
        • +
        • gradient for gradients
        • +
        • easing for easing functions
        • +
        • time for durations
        • +
        +

        This plugin is compatible with CSS, Less, Markup attributes, Sass, Scss and Stylus.

        +
        + +
        +

        Examples

        + +

        CSS

        +
        .example-gradient {
        +	background: -webkit-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* Chrome10+, Safari5.1+ */
        +	background:    -moz-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* FF3.6+ */
        +	background:     -ms-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* IE10+ */
        +	background:      -o-linear-gradient(left,     #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* Opera 11.10+ */
        +	background:         linear-gradient(to right, #cb60b3 0%, #c146a1 50%, #a80077 51%, #db36a4 100%); /* W3C */
        +}
        +.example-angle {
        +	transform: rotate(10deg);
        +}
        +.example-color {
        +	color: rgba(255, 0, 0, 0.2);
        +	background: purple;
        +	border: 1px solid hsl(100, 70%, 40%);
        +}
        +.example-easing {
        +	transition-timing-function: linear;
        +}
        +.example-time {
        +	transition-duration: 3s;
        +}
        + +

        Markup attributes

        +
        <table bgcolor="#6E5494">
        +<tr style="background: lightblue;">
        + +

        Less

        +
        @gradient: linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%);
        +.example-gradient {
        +	background: -webkit-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* Chrome10+, Safari5.1+ */
        +	background:    -moz-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* FF3.6+ */
        +	background:     -ms-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* IE10+ */
        +	background:      -o-linear-gradient(-45deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* Opera 11.10+ */
        +	background:         linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* W3C */
        +}
        +@angle: 3rad;
        +.example-angle {
        +	transform: rotate(.4turn)
        +}
        +@nice-blue: #5B83AD;
        +.example-color {
        +	color: hsla(102, 53%, 42%, 0.4);
        +}
        +@easing: cubic-bezier(0.1, 0.3, 1, .4);
        +.example-easing {
        +	transition-timing-function: ease;
        +}
        +@time: 1s;
        +.example-time {
        +	transition-duration: 2s;
        +}
        + +

        Sass

        +
        $gradient: linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%)
        +@mixin example-gradient
        +	background: -moz-radial-gradient(center, ellipse cover, #f2f6f8 0%, #d8e1e7 50%, #b5c6d0 51%, #e0eff9 100%)
        +	background: radial-gradient(ellipse at center, #f2f6f8 0%, #d8e1e7 50%, #b5c6d0 51%, #e0eff9 100%)
        +$angle: 380grad
        +@mixin example-angle
        +	transform: rotate(-120deg)
        +.example-angle
        +	transform: rotate(18rad)
        +$color: blue
        +@mixin example-color
        +	color: rgba(147, 32, 34, 0.8)
        +.example-color
        +	color: pink
        +$easing: ease-out
        +.example-easing
        +	transition-timing-function: ease-in-out
        +$time: 3s
        +@mixin example-time
        +	transition-duration: 800ms
        +.example-time
        +	transition-duration: 0.8s
        +
        + +

        Scss

        +
        $gradient: linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%);
        +$attr: background;
        +.example-gradient {
        +	#{$attr}-image: repeating-linear-gradient(10deg, rgba(255, 0, 0, 0), rgba(255, 0, 0, 1) 10px, rgba(255, 0, 0, 0) 20px);
        +}
        +$angle: 1.8turn;
        +.example-angle {
        +	transform: rotate(-3rad)
        +}
        +$color: blue;
        +.example-color {
        +	#{$attr}-color: rgba(255, 255, 0, 0.75);
        +}
        +$easing: linear;
        +.example-easing {
        +	transition-timing-function: cubic-bezier(0.9, 0.1, .2, .4);
        +}
        +$time: 1s;
        +.example-time {
        +	transition-duration: 10s
        +}
        + +

        Stylus

        +
        gradient = linear-gradient(135deg, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%)
        +.example-gradient
        +	background-image: repeating-radial-gradient(circle, rgba(255, 0, 0, 0), rgba(255, 0, 0, 1) 10px, rgba(255, 0, 0, 0) 20px)
        +angle = 357deg
        +.example-angle
        +	transform: rotate(100grad)
        +color = olive
        +.example-color
        +	color: #000
        +easing = ease-in
        +.example-easing
        +	transition-timing-function: ease-out
        +time = 3s
        +.example-time
        +	transition-duration: 0.5s
        +
        + +
        +

        Disabling a previewer

        +

        All previewers are enabled by default. To enable only a subset of them, a data-previewers attribute + can be added on a code block or any ancestor. Its value should be a space-separated list of previewers + representing the subset.

        +

        For example:

        +
        <pre class="language-css" data-previewers="color time"><code>div {
        +	/* Only the previewer for color and time are enabled */
        +	color: red;
        +	transition-duration: 1s;
        +	/* The previewer for angles is not enabled. */
        +	transform: rotate(10deg);
        +}</code></pre>
        +

        will give the following result:

        +
        div {
        +	/* Only the previewers for color and time are enabled */
        +	color: red;
        +	transition-duration: 1s;
        +	/* The previewer for angles is not enabled. */
        +	transform: rotate(10deg);
        +}
        +
        + +
        +

        API

        +

        This plugins provides a constructor that can be accessed through Prism.plugins.Previewer.

        +

        Once a previewer has been instantiated, an HTML element is appended to the document body. + This element will appear when specific tokens are hovered.

        + +

        new Prism.plugins.Previewer(type, updater, supportedLanguages)

        + +
          +
        • +

          type: the token type this previewer is associated to. + The previewer will be shown when hovering tokens of this type.

          +
        • +
        • +

          updater: the function that will be called each time an associated token is hovered. + This function takes the text content of the token as its only parameter. + The previewer HTML element can be accessed through the keyword this. + This function must return true for the previewer to be shown.

          +
        • +
        • +

          supportedLanguages: an optional array of supported languages. + The previewer will be available only for those. + Defaults to '*', which means every languages.

          +
        • +
        • +

          initializer: an optional function. + This function will be called when the previewer is initialized, + right after the HTML element has been appended to the document body.

          +
        • +
        + +
        + +
        + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/previewers/prism-previewers.css b/docs/_style/prism-master/plugins/previewers/prism-previewers.css new file mode 100644 index 00000000..b36988c2 --- /dev/null +++ b/docs/_style/prism-master/plugins/previewers/prism-previewers.css @@ -0,0 +1,242 @@ +.prism-previewer, +.prism-previewer:before, +.prism-previewer:after { + position: absolute; + pointer-events: none; +} +.prism-previewer, +.prism-previewer:after { + left: 50%; +} +.prism-previewer { + margin-top: -48px; + width: 32px; + height: 32px; + margin-left: -16px; + + opacity: 0; + -webkit-transition: opacity .25s; + -o-transition: opacity .25s; + transition: opacity .25s; +} +.prism-previewer.flipped { + margin-top: 0; + margin-bottom: -48px; +} +.prism-previewer:before, +.prism-previewer:after { + content: ''; + position: absolute; + pointer-events: none; +} +.prism-previewer:before { + top: -5px; + right: -5px; + left: -5px; + bottom: -5px; + border-radius: 10px; + border: 5px solid #fff; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.5) inset, 0 0 10px rgba(0, 0, 0, 0.75); +} +.prism-previewer:after { + top: 100%; + width: 0; + height: 0; + margin: 5px 0 0 -7px; + border: 7px solid transparent; + border-color: rgba(255, 0, 0, 0); + border-top-color: #fff; +} +.prism-previewer.flipped:after { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 5px; + border-top-color: rgba(255, 0, 0, 0); + border-bottom-color: #fff; +} +.prism-previewer.active { + opacity: 1; +} + +.prism-previewer-angle:before { + border-radius: 50%; + background: #fff; +} +.prism-previewer-angle:after { + margin-top: 4px; +} +.prism-previewer-angle svg { + width: 32px; + height: 32px; + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.prism-previewer-angle[data-negative] svg { + -webkit-transform: scaleX(-1) rotate(-90deg); + -moz-transform: scaleX(-1) rotate(-90deg); + -ms-transform: scaleX(-1) rotate(-90deg); + -o-transform: scaleX(-1) rotate(-90deg); + transform: scaleX(-1) rotate(-90deg); +} +.prism-previewer-angle circle { + fill: transparent; + stroke: hsl(200, 10%, 20%); + stroke-opacity: 0.9; + stroke-width: 32; + stroke-dasharray: 0, 500; +} + +.prism-previewer-gradient { + background-image: linear-gradient(45deg, #bbb 25%, transparent 25%, transparent 75%, #bbb 75%, #bbb), linear-gradient(45deg, #bbb 25%, #eee 25%, #eee 75%, #bbb 75%, #bbb); + background-size: 10px 10px; + background-position: 0 0, 5px 5px; + + width: 64px; + margin-left: -32px; +} +.prism-previewer-gradient:before { + content: none; +} +.prism-previewer-gradient div { + position: absolute; + top: -5px; + left: -5px; + right: -5px; + bottom: -5px; + border-radius: 10px; + border: 5px solid #fff; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.5) inset, 0 0 10px rgba(0, 0, 0, 0.75); +} + +.prism-previewer-color { + background-image: linear-gradient(45deg, #bbb 25%, transparent 25%, transparent 75%, #bbb 75%, #bbb), linear-gradient(45deg, #bbb 25%, #eee 25%, #eee 75%, #bbb 75%, #bbb); + background-size: 10px 10px; + background-position: 0 0, 5px 5px; +} +.prism-previewer-color:before { + background-color: inherit; + background-clip: padding-box; +} + +.prism-previewer-easing { + margin-top: -76px; + margin-left: -30px; + width: 60px; + height: 60px; + background: #333; +} +.prism-previewer-easing.flipped { + margin-bottom: -116px; +} +.prism-previewer-easing svg { + width: 60px; + height: 60px; +} +.prism-previewer-easing circle { + fill: hsl(200, 10%, 20%); + stroke: white; +} +.prism-previewer-easing path { + fill: none; + stroke: white; + stroke-linecap: round; + stroke-width: 4; +} +.prism-previewer-easing line { + stroke: white; + stroke-opacity: 0.5; + stroke-width: 2; +} + +@-webkit-keyframes prism-previewer-time { + 0% { + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 100, 500; + stroke-dashoffset: 0; + } + 100% { + stroke-dasharray: 0, 500; + stroke-dashoffset: -100; + } +} + +@-o-keyframes prism-previewer-time { + 0% { + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 100, 500; + stroke-dashoffset: 0; + } + 100% { + stroke-dasharray: 0, 500; + stroke-dashoffset: -100; + } +} + +@-moz-keyframes prism-previewer-time { + 0% { + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 100, 500; + stroke-dashoffset: 0; + } + 100% { + stroke-dasharray: 0, 500; + stroke-dashoffset: -100; + } +} + +@keyframes prism-previewer-time { + 0% { + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 100, 500; + stroke-dashoffset: 0; + } + 100% { + stroke-dasharray: 0, 500; + stroke-dashoffset: -100; + } +} + +.prism-previewer-time:before { + border-radius: 50%; + background: #fff; +} +.prism-previewer-time:after { + margin-top: 4px; +} +.prism-previewer-time svg { + width: 32px; + height: 32px; + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.prism-previewer-time circle { + fill: transparent; + stroke: hsl(200, 10%, 20%); + stroke-opacity: 0.9; + stroke-width: 32; + stroke-dasharray: 0, 500; + stroke-dashoffset: 0; + -webkit-animation: prism-previewer-time linear infinite 3s; + -moz-animation: prism-previewer-time linear infinite 3s; + -o-animation: prism-previewer-time linear infinite 3s; + animation: prism-previewer-time linear infinite 3s; +} \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/previewers/prism-previewers.js b/docs/_style/prism-master/plugins/previewers/prism-previewers.js new file mode 100644 index 00000000..0f0d2f9c --- /dev/null +++ b/docs/_style/prism-master/plugins/previewers/prism-previewers.js @@ -0,0 +1,708 @@ +(function() { + + if ( + typeof self !== 'undefined' && !self.Prism || + !self.document || !Function.prototype.bind + ) { + return; + } + + var previewers = { + // gradient must be defined before color and angle + 'gradient': { + create: (function () { + + // Stores already processed gradients so that we don't + // make the conversion every time the previewer is shown + var cache = {}; + + /** + * Returns a W3C-valid linear gradient + * @param {string} prefix Vendor prefix if any ("-moz-", "-webkit-", etc.) + * @param {string} func Gradient function name ("linear-gradient") + * @param {string[]} values Array of the gradient function parameters (["0deg", "red 0%", "blue 100%"]) + */ + var convertToW3CLinearGradient = function(prefix, func, values) { + // Default value for angle + var angle = '180deg'; + + if (/^(?:-?\d*\.?\d+(?:deg|rad)|to\b|top|right|bottom|left)/.test(values[0])) { + angle = values.shift(); + if (angle.indexOf('to ') < 0) { + // Angle uses old keywords + // W3C syntax uses "to" + opposite keywords + if (angle.indexOf('top') >= 0) { + if (angle.indexOf('left') >= 0) { + angle = 'to bottom right'; + } else if (angle.indexOf('right') >= 0) { + angle = 'to bottom left'; + } else { + angle = 'to bottom'; + } + } else if (angle.indexOf('bottom') >= 0) { + if (angle.indexOf('left') >= 0) { + angle = 'to top right'; + } else if (angle.indexOf('right') >= 0) { + angle = 'to top left'; + } else { + angle = 'to top'; + } + } else if (angle.indexOf('left') >= 0) { + angle = 'to right'; + } else if (angle.indexOf('right') >= 0) { + angle = 'to left'; + } else if (prefix) { + // Angle is shifted by 90deg in prefixed gradients + if (angle.indexOf('deg') >= 0) { + angle = (90 - parseFloat(angle)) + 'deg'; + } else if (angle.indexOf('rad') >= 0) { + angle = (Math.PI / 2 - parseFloat(angle)) + 'rad'; + } + } + } + } + + return func + '(' + angle + ',' + values.join(',') + ')'; + }; + + /** + * Returns a W3C-valid radial gradient + * @param {string} prefix Vendor prefix if any ("-moz-", "-webkit-", etc.) + * @param {string} func Gradient function name ("linear-gradient") + * @param {string[]} values Array of the gradient function parameters (["0deg", "red 0%", "blue 100%"]) + */ + var convertToW3CRadialGradient = function(prefix, func, values) { + if (values[0].indexOf('at') < 0) { + // Looks like old syntax + + // Default values + var position = 'center'; + var shape = 'ellipse'; + var size = 'farthest-corner'; + + if (/\bcenter|top|right|bottom|left\b|^\d+/.test(values[0])) { + // Found a position + // Remove angle value, if any + position = values.shift().replace(/\s*-?\d+(?:rad|deg)\s*/, ''); + } + if (/\bcircle|ellipse|closest|farthest|contain|cover\b/.test(values[0])) { + // Found a shape and/or size + var shapeSizeParts = values.shift().split(/\s+/); + if (shapeSizeParts[0] && (shapeSizeParts[0] === 'circle' || shapeSizeParts[0] === 'ellipse')) { + shape = shapeSizeParts.shift(); + } + if (shapeSizeParts[0]) { + size = shapeSizeParts.shift(); + } + + // Old keywords are converted to their synonyms + if (size === 'cover') { + size = 'farthest-corner'; + } else if (size === 'contain') { + size = 'clothest-side'; + } + } + + return func + '(' + shape + ' ' + size + ' at ' + position + ',' + values.join(',') + ')'; + } + return func + '(' + values.join(',') + ')'; + }; + + /** + * Converts a gradient to a W3C-valid one + * Does not support old webkit syntax (-webkit-gradient(linear...) and -webkit-gradient(radial...)) + * @param {string} gradient The CSS gradient + */ + var convertToW3CGradient = function(gradient) { + if (cache[gradient]) { + return cache[gradient]; + } + var parts = gradient.match(/^(\b|\B-[a-z]{1,10}-)((?:repeating-)?(?:linear|radial)-gradient)/); + // "", "-moz-", etc. + var prefix = parts && parts[1]; + // "linear-gradient", "radial-gradient", etc. + var func = parts && parts[2]; + + var values = gradient.replace(/^(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\(|\)$/g, '').split(/\s*,\s*/); + + if (func.indexOf('linear') >= 0) { + return cache[gradient] = convertToW3CLinearGradient(prefix, func, values); + } else if (func.indexOf('radial') >= 0) { + return cache[gradient] = convertToW3CRadialGradient(prefix, func, values); + } + return cache[gradient] = func + '(' + values.join(',') + ')'; + }; + + return function () { + new Prism.plugins.Previewer('gradient', function(value) { + this.firstChild.style.backgroundImage = ''; + this.firstChild.style.backgroundImage = convertToW3CGradient(value); + return !!this.firstChild.style.backgroundImage; + }, '*', function () { + this._elt.innerHTML = '
        '; + }); + }; + }()), + tokens: { + 'gradient': { + pattern: /(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:rgb|hsl)a?\(.+?\)|[^\)])+\)/gi, + inside: { + 'function': /[\w-]+(?=\()/, + 'punctuation': /[(),]/ + } + } + }, + languages: { + 'css': true, + 'less': true, + 'sass': [ + { + lang: 'sass', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + }, + { + lang: 'sass', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'func', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'func', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + }, + 'angle': { + create: function () { + new Prism.plugins.Previewer('angle', function(value) { + var num = parseFloat(value); + var unit = value.match(/[a-z]+$/i); + var max, percentage; + if (!num || !unit) { + return false; + } + unit = unit[0]; + + switch(unit) { + case 'deg': + max = 360; + break; + case 'grad': + max = 400; + break; + case 'rad': + max = 2 * Math.PI; + break; + case 'turn': + max = 1; + } + + percentage = 100 * num/max; + percentage %= 100; + + this[(num < 0? 'set' : 'remove') + 'Attribute']('data-negative', ''); + this.querySelector('circle').style.strokeDasharray = Math.abs(percentage) + ',500'; + return true; + }, '*', function () { + this._elt.innerHTML = '' + + '' + + ''; + }); + }, + tokens: { + 'angle': /(?:\b|\B-|(?=\B\.))\d*\.?\d+(?:deg|g?rad|turn)\b/i + }, + languages: { + 'css': true, + 'less': true, + 'markup': { + lang: 'markup', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value'] + }, + 'sass': [ + { + lang: 'sass', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + }, + { + lang: 'sass', + before: 'operator', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'func', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'func', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + }, + 'color': { + create: function () { + new Prism.plugins.Previewer('color', function(value) { + this.style.backgroundColor = ''; + this.style.backgroundColor = value; + return !!this.style.backgroundColor; + }); + }, + tokens: { + 'color': { + pattern: /\B#(?:[0-9a-f]{3}){1,2}\b|\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B|\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGray|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGray|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGray|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gray|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGray|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGray|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGray|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i, + inside: { + 'function': /[\w-]+(?=\()/, + 'punctuation': /[(),]/ + } + } + }, + languages: { + 'css': true, + 'less': true, + 'markup': { + lang: 'markup', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value'] + }, + 'sass': [ + { + lang: 'sass', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + }, + { + lang: 'sass', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + }, + 'easing': { + create: function () { + new Prism.plugins.Previewer('easing', function (value) { + + value = { + 'linear': '0,0,1,1', + 'ease': '.25,.1,.25,1', + 'ease-in': '.42,0,1,1', + 'ease-out': '0,0,.58,1', + 'ease-in-out':'.42,0,.58,1' + }[value] || value; + + var p = value.match(/-?\d*\.?\d+/g); + + if(p.length === 4) { + p = p.map(function(p, i) { return (i % 2? 1 - p : p) * 100; }); + + this.querySelector('path').setAttribute('d', 'M0,100 C' + p[0] + ',' + p[1] + ', ' + p[2] + ',' + p[3] + ', 100,0'); + + var lines = this.querySelectorAll('line'); + lines[0].setAttribute('x2', p[0]); + lines[0].setAttribute('y2', p[1]); + lines[1].setAttribute('x2', p[2]); + lines[1].setAttribute('y2', p[3]); + + return true; + } + + return false; + }, '*', function () { + this._elt.innerHTML = '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + }); + }, + tokens: { + 'easing': { + pattern: /\bcubic-bezier\((?:-?\d*\.?\d+,\s*){3}-?\d*\.?\d+\)\B|\b(?:linear|ease(?:-in)?(?:-out)?)(?=\s|[;}]|$)/i, + inside: { + 'function': /[\w-]+(?=\()/, + 'punctuation': /[(),]/ + } + } + }, + languages: { + 'css': true, + 'less': true, + 'sass': [ + { + lang: 'sass', + inside: 'inside', + before: 'punctuation', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + }, + { + lang: 'sass', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + }, + + 'time': { + create: function () { + new Prism.plugins.Previewer('time', function(value) { + var num = parseFloat(value); + var unit = value.match(/[a-z]+$/i); + if (!num || !unit) { + return false; + } + unit = unit[0]; + this.querySelector('circle').style.animationDuration = 2 * num + unit; + return true; + }, '*', function () { + this._elt.innerHTML = '' + + '' + + ''; + }); + }, + tokens: { + 'time': /(?:\b|\B-|(?=\B\.))\d*\.?\d+m?s\b/i + }, + languages: { + 'css': true, + 'less': true, + 'markup': { + lang: 'markup', + before: 'punctuation', + inside: 'inside', + root: Prism.languages.markup && Prism.languages.markup['tag'].inside['attr-value'] + }, + 'sass': [ + { + lang: 'sass', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['property-line'] + }, + { + lang: 'sass', + before: 'operator', + inside: 'inside', + root: Prism.languages.sass && Prism.languages.sass['variable-line'] + } + ], + 'scss': true, + 'stylus': [ + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['property-declaration'].inside + }, + { + lang: 'stylus', + before: 'hexcode', + inside: 'rest', + root: Prism.languages.stylus && Prism.languages.stylus['variable-declaration'].inside + } + ] + } + } + }; + + /** + * Returns the absolute X, Y offsets for an element + * @param {HTMLElement} element + * @returns {{top: number, right: number, bottom: number, left: number, width: number, height: number}} + */ + var getOffset = function (element) { + var elementBounds = element.getBoundingClientRect(); + var left = elementBounds.left; + var top = elementBounds.top; + var documentBounds = document.documentElement.getBoundingClientRect(); + left -= documentBounds.left; + top -= documentBounds.top; + + return { + top: top, + right: innerWidth - left - elementBounds.width, + bottom: innerHeight - top - elementBounds.height, + left: left, + width: elementBounds.width, + height: elementBounds.height + }; + }; + + var tokenRegexp = /(?:^|\s)token(?=$|\s)/; + var activeRegexp = /(?:^|\s)active(?=$|\s)/g; + var flippedRegexp = /(?:^|\s)flipped(?=$|\s)/g; + + /** + * Previewer constructor + * @param {string} type Unique previewer type + * @param {function} updater Function that will be called on mouseover. + * @param {string[]|string=} supportedLanguages Aliases of the languages this previewer must be enabled for. Defaults to "*", all languages. + * @param {function=} initializer Function that will be called on initialization. + * @constructor + */ + var Previewer = function (type, updater, supportedLanguages, initializer) { + this._elt = null; + this._type = type; + this._clsRegexp = RegExp('(?:^|\\s)' + type + '(?=$|\\s)'); + this._token = null; + this.updater = updater; + this._mouseout = this.mouseout.bind(this); + this.initializer = initializer; + + var self = this; + + if (!supportedLanguages) { + supportedLanguages = ['*']; + } + if (Prism.util.type(supportedLanguages) !== 'Array') { + supportedLanguages = [supportedLanguages]; + } + supportedLanguages.forEach(function (lang) { + if (typeof lang !== 'string') { + lang = lang.lang; + } + if (!Previewer.byLanguages[lang]) { + Previewer.byLanguages[lang] = []; + } + if (Previewer.byLanguages[lang].indexOf(self) < 0) { + Previewer.byLanguages[lang].push(self); + } + }); + Previewer.byType[type] = this; + }; + + /** + * Creates the HTML element for the previewer. + */ + Previewer.prototype.init = function () { + if (this._elt) { + return; + } + this._elt = document.createElement('div'); + this._elt.className = 'prism-previewer prism-previewer-' + this._type; + document.body.appendChild(this._elt); + if(this.initializer) { + this.initializer(); + } + }; + + Previewer.prototype.isDisabled = function (token) { + do { + if (token.hasAttribute && token.hasAttribute('data-previewers')) { + var previewers = token.getAttribute('data-previewers'); + return (previewers || '').split(/\s+/).indexOf(this._type) === -1; + } + } while(token = token.parentNode); + return false; + }; + + /** + * Checks the class name of each hovered element + * @param token + */ + Previewer.prototype.check = function (token) { + if (tokenRegexp.test(token.className) && this.isDisabled(token)) { + return; + } + do { + if (tokenRegexp.test(token.className) && this._clsRegexp.test(token.className)) { + break; + } + } while(token = token.parentNode); + + if (token && token !== this._token) { + this._token = token; + this.show(); + } + }; + + /** + * Called on mouseout + */ + Previewer.prototype.mouseout = function() { + this._token.removeEventListener('mouseout', this._mouseout, false); + this._token = null; + this.hide(); + }; + + /** + * Shows the previewer positioned properly for the current token. + */ + Previewer.prototype.show = function () { + if (!this._elt) { + this.init(); + } + if (!this._token) { + return; + } + + if (this.updater.call(this._elt, this._token.textContent)) { + this._token.addEventListener('mouseout', this._mouseout, false); + + var offset = getOffset(this._token); + this._elt.className += ' active'; + + if (offset.top - this._elt.offsetHeight > 0) { + this._elt.className = this._elt.className.replace(flippedRegexp, ''); + this._elt.style.top = offset.top + 'px'; + this._elt.style.bottom = ''; + } else { + this._elt.className += ' flipped'; + this._elt.style.bottom = offset.bottom + 'px'; + this._elt.style.top = ''; + } + + this._elt.style.left = offset.left + Math.min(200, offset.width / 2) + 'px'; + } else { + this.hide(); + } + }; + + /** + * Hides the previewer. + */ + Previewer.prototype.hide = function () { + this._elt.className = this._elt.className.replace(activeRegexp, ''); + }; + + /** + * Map of all registered previewers by language + * @type {{}} + */ + Previewer.byLanguages = {}; + + /** + * Map of all registered previewers by type + * @type {{}} + */ + Previewer.byType = {}; + + /** + * Initializes the mouseover event on the code block. + * @param {HTMLElement} elt The code block (env.element) + * @param {string} lang The language (env.language) + */ + Previewer.initEvents = function (elt, lang) { + var previewers = []; + if (Previewer.byLanguages[lang]) { + previewers = previewers.concat(Previewer.byLanguages[lang]); + } + if (Previewer.byLanguages['*']) { + previewers = previewers.concat(Previewer.byLanguages['*']); + } + elt.addEventListener('mouseover', function (e) { + var target = e.target; + previewers.forEach(function (previewer) { + previewer.check(target); + }); + }, false); + }; + Prism.plugins.Previewer = Previewer; + + Prism.hooks.add('before-highlight', function (env) { + for (var previewer in previewers) { + var languages = previewers[previewer].languages; + if (env.language && languages[env.language] && !languages[env.language].initialized) { + var lang = languages[env.language]; + if (Prism.util.type(lang) !== 'Array') { + lang = [lang]; + } + lang.forEach(function (lang) { + var before, inside, root, skip; + if (lang === true) { + before = 'important'; + inside = env.language; + lang = env.language; + } else { + before = lang.before || 'important'; + inside = lang.inside || lang.lang; + root = lang.root || Prism.languages; + skip = lang.skip; + lang = env.language; + } + + if (!skip && Prism.languages[lang]) { + Prism.languages.insertBefore(inside, before, previewers[previewer].tokens, root); + env.grammar = Prism.languages[lang]; + + languages[env.language] = {initialized: true}; + } + }); + } + } + }); + + // Initialize the previewers only when needed + Prism.hooks.add('after-highlight', function (env) { + if(Previewer.byLanguages['*'] || Previewer.byLanguages[env.language]) { + Previewer.initEvents(env.element, env.language); + } + }); + + for (var previewer in previewers) { + previewers[previewer].create(); + } + +}()); diff --git a/docs/_style/prism-master/plugins/previewers/prism-previewers.min.js b/docs/_style/prism-master/plugins/previewers/prism-previewers.min.js new file mode 100644 index 00000000..477d4e52 --- /dev/null +++ b/docs/_style/prism-master/plugins/previewers/prism-previewers.min.js @@ -0,0 +1 @@ +!function(){if(("undefined"==typeof self||self.Prism)&&self.document&&Function.prototype.bind){var e={gradient:{create:function(){var e={},s=function(e,s,i){var t="180deg";return/^(?:-?\d*\.?\d+(?:deg|rad)|to\b|top|right|bottom|left)/.test(i[0])&&(t=i.shift(),t.indexOf("to ")<0&&(t.indexOf("top")>=0?t=t.indexOf("left")>=0?"to bottom right":t.indexOf("right")>=0?"to bottom left":"to bottom":t.indexOf("bottom")>=0?t=t.indexOf("left")>=0?"to top right":t.indexOf("right")>=0?"to top left":"to top":t.indexOf("left")>=0?t="to right":t.indexOf("right")>=0?t="to left":e&&(t.indexOf("deg")>=0?t=90-parseFloat(t)+"deg":t.indexOf("rad")>=0&&(t=Math.PI/2-parseFloat(t)+"rad")))),s+"("+t+","+i.join(",")+")"},i=function(e,s,i){if(i[0].indexOf("at")<0){var t="center",a="ellipse",r="farthest-corner";if(/\bcenter|top|right|bottom|left\b|^\d+/.test(i[0])&&(t=i.shift().replace(/\s*-?\d+(?:rad|deg)\s*/,"")),/\bcircle|ellipse|closest|farthest|contain|cover\b/.test(i[0])){var n=i.shift().split(/\s+/);!n[0]||"circle"!==n[0]&&"ellipse"!==n[0]||(a=n.shift()),n[0]&&(r=n.shift()),"cover"===r?r="farthest-corner":"contain"===r&&(r="clothest-side")}return s+"("+a+" "+r+" at "+t+","+i.join(",")+")"}return s+"("+i.join(",")+")"},t=function(t){if(e[t])return e[t];var a=t.match(/^(\b|\B-[a-z]{1,10}-)((?:repeating-)?(?:linear|radial)-gradient)/),r=a&&a[1],n=a&&a[2],l=t.replace(/^(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\(|\)$/g,"").split(/\s*,\s*/);return e[t]=n.indexOf("linear")>=0?s(r,n,l):n.indexOf("radial")>=0?i(r,n,l):n+"("+l.join(",")+")"};return function(){new Prism.plugins.Previewer("gradient",function(e){return this.firstChild.style.backgroundImage="",this.firstChild.style.backgroundImage=t(e),!!this.firstChild.style.backgroundImage},"*",function(){this._elt.innerHTML="
        "})}}(),tokens:{gradient:{pattern:/(?:\b|\B-[a-z]{1,10}-)(?:repeating-)?(?:linear|radial)-gradient\((?:(?:rgb|hsl)a?\(.+?\)|[^\)])+\)/gi,inside:{"function":/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},angle:{create:function(){new Prism.plugins.Previewer("angle",function(e){var s,i,t=parseFloat(e),a=e.match(/[a-z]+$/i);if(!t||!a)return!1;switch(a=a[0]){case"deg":s=360;break;case"grad":s=400;break;case"rad":s=2*Math.PI;break;case"turn":s=1}return i=100*t/s,i%=100,this[(0>t?"set":"remove")+"Attribute"]("data-negative",""),this.querySelector("circle").style.strokeDasharray=Math.abs(i)+",500",!0},"*",function(){this._elt.innerHTML=''})},tokens:{angle:/(?:\b|\B-|(?=\B\.))\d*\.?\d+(?:deg|g?rad|turn)\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"func",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},color:{create:function(){new Prism.plugins.Previewer("color",function(e){return this.style.backgroundColor="",this.style.backgroundColor=e,!!this.style.backgroundColor})},tokens:{color:{pattern:/\B#(?:[0-9a-f]{3}){1,2}\b|\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B|\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGray|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGray|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGray|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gray|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGray|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGray|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGray|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,inside:{"function":/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",before:"punctuation",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},easing:{create:function(){new Prism.plugins.Previewer("easing",function(e){e={linear:"0,0,1,1",ease:".25,.1,.25,1","ease-in":".42,0,1,1","ease-out":"0,0,.58,1","ease-in-out":".42,0,.58,1"}[e]||e;var s=e.match(/-?\d*\.?\d+/g);if(4===s.length){s=s.map(function(e,s){return 100*(s%2?1-e:e)}),this.querySelector("path").setAttribute("d","M0,100 C"+s[0]+","+s[1]+", "+s[2]+","+s[3]+", 100,0");var i=this.querySelectorAll("line");return i[0].setAttribute("x2",s[0]),i[0].setAttribute("y2",s[1]),i[1].setAttribute("x2",s[2]),i[1].setAttribute("y2",s[3]),!0}return!1},"*",function(){this._elt.innerHTML=''})},tokens:{easing:{pattern:/\bcubic-bezier\((?:-?\d*\.?\d+,\s*){3}-?\d*\.?\d+\)\B|\b(?:linear|ease(?:-in)?(?:-out)?)(?=\s|[;}]|$)/i,inside:{"function":/[\w-]+(?=\()/,punctuation:/[(),]/}}},languages:{css:!0,less:!0,sass:[{lang:"sass",inside:"inside",before:"punctuation",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]},{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}},time:{create:function(){new Prism.plugins.Previewer("time",function(e){var s=parseFloat(e),i=e.match(/[a-z]+$/i);return s&&i?(i=i[0],this.querySelector("circle").style.animationDuration=2*s+i,!0):!1},"*",function(){this._elt.innerHTML=''})},tokens:{time:/(?:\b|\B-|(?=\B\.))\d*\.?\d+m?s\b/i},languages:{css:!0,less:!0,markup:{lang:"markup",before:"punctuation",inside:"inside",root:Prism.languages.markup&&Prism.languages.markup.tag.inside["attr-value"]},sass:[{lang:"sass",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["property-line"]},{lang:"sass",before:"operator",inside:"inside",root:Prism.languages.sass&&Prism.languages.sass["variable-line"]}],scss:!0,stylus:[{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["property-declaration"].inside},{lang:"stylus",before:"hexcode",inside:"rest",root:Prism.languages.stylus&&Prism.languages.stylus["variable-declaration"].inside}]}}},s=function(e){var s=e.getBoundingClientRect(),i=s.left,t=s.top,a=document.documentElement.getBoundingClientRect();return i-=a.left,t-=a.top,{top:t,right:innerWidth-i-s.width,bottom:innerHeight-t-s.height,left:i,width:s.width,height:s.height}},i=/(?:^|\s)token(?=$|\s)/,t=/(?:^|\s)active(?=$|\s)/g,a=/(?:^|\s)flipped(?=$|\s)/g,r=function(e,s,i,t){this._elt=null,this._type=e,this._clsRegexp=RegExp("(?:^|\\s)"+e+"(?=$|\\s)"),this._token=null,this.updater=s,this._mouseout=this.mouseout.bind(this),this.initializer=t;var a=this;i||(i=["*"]),"Array"!==Prism.util.type(i)&&(i=[i]),i.forEach(function(e){"string"!=typeof e&&(e=e.lang),r.byLanguages[e]||(r.byLanguages[e]=[]),r.byLanguages[e].indexOf(a)<0&&r.byLanguages[e].push(a)}),r.byType[e]=this};r.prototype.init=function(){this._elt||(this._elt=document.createElement("div"),this._elt.className="prism-previewer prism-previewer-"+this._type,document.body.appendChild(this._elt),this.initializer&&this.initializer())},r.prototype.isDisabled=function(e){do if(e.hasAttribute&&e.hasAttribute("data-previewers")){var s=e.getAttribute("data-previewers");return-1===(s||"").split(/\s+/).indexOf(this._type)}while(e=e.parentNode);return!1},r.prototype.check=function(e){if(!i.test(e.className)||!this.isDisabled(e)){do if(i.test(e.className)&&this._clsRegexp.test(e.className))break;while(e=e.parentNode);e&&e!==this._token&&(this._token=e,this.show())}},r.prototype.mouseout=function(){this._token.removeEventListener("mouseout",this._mouseout,!1),this._token=null,this.hide()},r.prototype.show=function(){if(this._elt||this.init(),this._token)if(this.updater.call(this._elt,this._token.textContent)){this._token.addEventListener("mouseout",this._mouseout,!1);var e=s(this._token);this._elt.className+=" active",e.top-this._elt.offsetHeight>0?(this._elt.className=this._elt.className.replace(a,""),this._elt.style.top=e.top+"px",this._elt.style.bottom=""):(this._elt.className+=" flipped",this._elt.style.bottom=e.bottom+"px",this._elt.style.top=""),this._elt.style.left=e.left+Math.min(200,e.width/2)+"px"}else this.hide()},r.prototype.hide=function(){this._elt.className=this._elt.className.replace(t,"")},r.byLanguages={},r.byType={},r.initEvents=function(e,s){var i=[];r.byLanguages[s]&&(i=i.concat(r.byLanguages[s])),r.byLanguages["*"]&&(i=i.concat(r.byLanguages["*"])),e.addEventListener("mouseover",function(e){var s=e.target;i.forEach(function(e){e.check(s)})},!1)},Prism.plugins.Previewer=r,Prism.hooks.add("before-highlight",function(s){for(var i in e){var t=e[i].languages;if(s.language&&t[s.language]&&!t[s.language].initialized){var a=t[s.language];"Array"!==Prism.util.type(a)&&(a=[a]),a.forEach(function(a){var r,n,l,o;a===!0?(r="important",n=s.language,a=s.language):(r=a.before||"important",n=a.inside||a.lang,l=a.root||Prism.languages,o=a.skip,a=s.language),!o&&Prism.languages[a]&&(Prism.languages.insertBefore(n,r,e[i].tokens,l),s.grammar=Prism.languages[a],t[s.language]={initialized:!0})})}}}),Prism.hooks.add("after-highlight",function(e){(r.byLanguages["*"]||r.byLanguages[e.language])&&r.initEvents(e.element,e.language)});for(var n in e)e[n].create()}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/remove-initial-line-feed/index.html b/docs/_style/prism-master/plugins/remove-initial-line-feed/index.html new file mode 100644 index 00000000..8eb942fa --- /dev/null +++ b/docs/_style/prism-master/plugins/remove-initial-line-feed/index.html @@ -0,0 +1,59 @@ + + + + + + + Remove initial line feed ▲ Prism plugins + + + + + + + + + + +
        +
        + +

        Remove initial line feed

        +

        Removes the initial line feed in code blocks.

        +
        + +
        +

        How to use (DEPRECATED)

        + +

        This plugin will be removed in the future. Please use the general purpose Normalize Whitespace plugin instead.

        +

        Obviously, this is supposed to work only for code blocks (<pre><code>) and not for inline code.

        +

        With this plugin included, any initial line feed will be removed by default.

        +

        To bypass this behaviour, you may add the class keep-initial-line-feed to your desired <pre>.

        +
        + +
        +

        Examples

        + +

        Without adding the class

        +
        
        +<div></div>
        +
        + +

        With the class added

        +
        
        +<div></div>
        +
        + +
        + +
        + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js b/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js new file mode 100644 index 00000000..f62a8bfe --- /dev/null +++ b/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js @@ -0,0 +1,21 @@ +(function() { + +if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; +} + +Prism.hooks.add('before-sanity-check', function (env) { + if (env.code) { + var pre = env.element.parentNode; + var clsReg = /\s*\bkeep-initial-line-feed\b\s*/; + if ( + pre && pre.nodeName.toLowerCase() === 'pre' && + // Apply only if nor the
         or the  have the class
        +			(!clsReg.test(pre.className) && !clsReg.test(env.element.className))
        +		) {
        +			env.code = env.code.replace(/^(?:\r?\n|\r)/, '');
        +		}
        +	}
        +});
        +
        +}());
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js b/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js
        new file mode 100644
        index 00000000..e0016a49
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js
        @@ -0,0 +1 @@
        +!function(){"undefined"!=typeof self&&self.Prism&&self.document&&Prism.hooks.add("before-sanity-check",function(e){if(e.code){var s=e.element.parentNode,n=/\s*\bkeep-initial-line-feed\b\s*/;!s||"pre"!==s.nodeName.toLowerCase()||n.test(s.className)||n.test(e.element.className)||(e.code=e.code.replace(/^(?:\r?\n|\r)/,""))}})}();
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/show-invisibles/index.html b/docs/_style/prism-master/plugins/show-invisibles/index.html
        new file mode 100644
        index 00000000..cb0ad436
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/show-invisibles/index.html
        @@ -0,0 +1,46 @@
        +
        +
        +
        +
        +
        +
        +Show Invisibles ▲ Prism plugins
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        + +

        Show Invisibles

        +

        Show hidden characters such as tabs and line breaks.

        +
        + +
        +

        Examples

        + +
        
        +	
        +	
        
        +	
        +	
        
        +
        + +
        + + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.css b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.css new file mode 100644 index 00000000..c57be588 --- /dev/null +++ b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.css @@ -0,0 +1,34 @@ +.token.tab:not(:empty), +.token.cr, +.token.lf, +.token.space { + position: relative; +} + +.token.tab:not(:empty):before, +.token.cr:before, +.token.lf:before, +.token.space:before { + color: inherit; + opacity: 0.4; + position: absolute; +} + +.token.tab:not(:empty):before { + content: '\21E5'; +} + +.token.cr:before { + content: '\240D'; +} + +.token.crlf:before { + content: '\240D\240A'; +} +.token.lf:before { + content: '\240A'; +} + +.token.space:before { + content: '\00B7'; +} diff --git a/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.js b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.js new file mode 100644 index 00000000..f3d120a9 --- /dev/null +++ b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.js @@ -0,0 +1,21 @@ +(function(){ + +if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism +) { + return; +} + +Prism.hooks.add('before-highlight', function(env) { + var tokens = env.grammar; + + if (!tokens) return; + + tokens.tab = /\t/g; + tokens.crlf = /\r\n/g; + tokens.lf = /\n/g; + tokens.cr = /\r/g; + tokens.space = / /g; +}); +})(); diff --git a/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.min.js b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.min.js new file mode 100644 index 00000000..9df7258c --- /dev/null +++ b/docs/_style/prism-master/plugins/show-invisibles/prism-show-invisibles.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&!self.Prism||"undefined"!=typeof global&&!global.Prism||Prism.hooks.add("before-highlight",function(e){var f=e.grammar;f&&(f.tab=/\t/g,f.crlf=/\r\n/g,f.lf=/\n/g,f.cr=/\r/g,f.space=/ /g)})}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/show-language/index.html b/docs/_style/prism-master/plugins/show-language/index.html new file mode 100644 index 00000000..e79b1ccf --- /dev/null +++ b/docs/_style/prism-master/plugins/show-language/index.html @@ -0,0 +1,54 @@ + + + + + + +Show Language ▲ Prism plugins + + + + + + + + + + + +
        +
        + +

        Show Language

        +

        Display the highlighted language in code blocks (inline code does not show the label).

        +
        + +
        +

        Examples

        + +

        JavaScript

        +
        
        +
        +	

        CSS

        +
        
        +
        +	

        HTML (Markup)

        +
        
        +
        +	

        SVG

        +

        The data-language attribute can be used to display a specific label whether it has been defined as a language or not.

        +
        
        +
        + +
        + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/show-language/prism-show-language.js b/docs/_style/prism-master/plugins/show-language/prism-show-language.js new file mode 100644 index 00000000..38675bb6 --- /dev/null +++ b/docs/_style/prism-master/plugins/show-language/prism-show-language.js @@ -0,0 +1,31 @@ +(function(){ + +if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; +} + +if (!Prism.plugins.toolbar) { + console.warn('Show Languages plugin loaded before Toolbar plugin.'); + + return; +} + +// The languages map is built automatically with gulp +var Languages = /*languages_placeholder[*/{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","css":"CSS","clike":"C-like","javascript":"JavaScript","abap":"ABAP","actionscript":"ActionScript","apacheconf":"Apache Configuration","apl":"APL","applescript":"AppleScript","arff":"ARFF","asciidoc":"AsciiDoc","asm6502":"6502 Assembly","aspnet":"ASP.NET (C#)","autohotkey":"AutoHotkey","autoit":"AutoIt","shell":"Shell","basic":"BASIC","csharp":"C#","cpp":"C++","cil":"CIL","coffeescript":"CoffeeScript","csp":"Content-Security-Policy","css-extras":"CSS Extras","django":"Django/Jinja2","erb":"ERB","fsharp":"F#","gcode":"G-code","gedcom":"GEDCOM","glsl":"GLSL","gml":"GameMaker Language","graphql":"GraphQL","http":"HTTP","hpkp":"HTTP Public-Key-Pins","hsts":"HTTP Strict-Transport-Security","ichigojam":"IchigoJam","inform7":"Inform 7","javastacktrace":"Java stack trace","json":"JSON","jsonp":"JSONP","latex":"LaTeX","livescript":"LiveScript","lolcode":"LOLCODE","markup-templating":"Markup templating","matlab":"MATLAB","mel":"MEL","n4js":"N4JS","nasm":"NASM","nginx":"nginx","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","opencl":"OpenCL","parigp":"PARI/GP","objectpascal":"Object Pascal","php":"PHP","php-extras":"PHP Extras","plsql":"PL/SQL","powershell":"PowerShell","properties":".properties","protobuf":"Protocol Buffers","q":"Q (kdb+ database)","jsx":"React JSX","tsx":"React TSX","renpy":"Ren'py","rest":"reST (reStructuredText)","sas":"SAS","sass":"Sass (Sass)","scss":"Sass (Scss)","sql":"SQL","soy":"Soy (Closure Template)","tap":"TAP","toml":"TOML","tt2":"Template Toolkit 2","typescript":"TypeScript","vbnet":"VB.Net","vhdl":"VHDL","vim":"vim","visual-basic":"Visual Basic","wasm":"WebAssembly","wiki":"Wiki markup","xeoracube":"XeoraCube","xojo":"Xojo (REALbasic)","xquery":"XQuery","yaml":"YAML"}/*]*/; +Prism.plugins.toolbar.registerButton('show-language', function(env) { + var pre = env.element.parentNode; + if (!pre || !/pre/i.test(pre.nodeName)) { + return; + } + var language = pre.getAttribute('data-language') || Languages[env.language] || (env.language && (env.language.substring(0, 1).toUpperCase() + env.language.substring(1))); + + if(!language) { + return; + } + var element = document.createElement('span'); + element.textContent = language; + + return element; +}); + +})(); diff --git a/docs/_style/prism-master/plugins/show-language/prism-show-language.min.js b/docs/_style/prism-master/plugins/show-language/prism-show-language.min.js new file mode 100644 index 00000000..7f4dd60f --- /dev/null +++ b/docs/_style/prism-master/plugins/show-language/prism-show-language.min.js @@ -0,0 +1 @@ +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Show Languages plugin loaded before Toolbar plugin."),void 0;var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",arff:"ARFF",asciidoc:"AsciiDoc",asm6502:"6502 Assembly",aspnet:"ASP.NET (C#)",autohotkey:"AutoHotkey",autoit:"AutoIt",shell:"Shell",basic:"BASIC",csharp:"C#",cpp:"C++",cil:"CIL",coffeescript:"CoffeeScript",csp:"Content-Security-Policy","css-extras":"CSS Extras",django:"Django/Jinja2",erb:"ERB",fsharp:"F#",gcode:"G-code",gedcom:"GEDCOM",glsl:"GLSL",gml:"GameMaker Language",graphql:"GraphQL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam",inform7:"Inform 7",javastacktrace:"Java stack trace",json:"JSON",jsonp:"JSONP",latex:"LaTeX",livescript:"LiveScript",lolcode:"LOLCODE","markup-templating":"Markup templating",matlab:"MATLAB",mel:"MEL",n4js:"N4JS",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",parigp:"PARI/GP",objectpascal:"Object Pascal",php:"PHP","php-extras":"PHP Extras",plsql:"PL/SQL",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",q:"Q (kdb+ database)",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",soy:"Soy (Closure Template)",tap:"TAP",toml:"TOML",tt2:"Template Toolkit 2",typescript:"TypeScript",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",wasm:"WebAssembly",wiki:"Wiki markup",xeoracube:"XeoraCube",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(a){var t=a.element.parentNode;if(t&&/pre/i.test(t.nodeName)){var s=t.getAttribute("data-language")||e[a.language]||a.language&&a.language.substring(0,1).toUpperCase()+a.language.substring(1);if(s){var r=document.createElement("span");return r.textContent=s,r}}})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/toolbar/index.html b/docs/_style/prism-master/plugins/toolbar/index.html new file mode 100644 index 00000000..5547c5de --- /dev/null +++ b/docs/_style/prism-master/plugins/toolbar/index.html @@ -0,0 +1,134 @@ + + + + + + + Toolbar ▲ Prism plugins + + + + + + + + + + + +
        +
        + +

        Toolbar

        +

        Attach a toolbar for plugins to easily register buttons on the top of a code block.

        +
        + +
        +

        How to use

        +

        The Toolbar plugin allows for several methods to register your button, using the Prism.plugins.toolbar.registerButton function.

        + +

        The simplest method is through the HTML API. Add a data-label attribute to the pre element, and the Toolbar + plugin will read the value of that attribute and append a label to the code snippet.

        + +
        <pre data-src="plugins/toolbar/prism-toolbar.js" data-label="Hello World!"></pre>
        + +

        If you want to provide arbitrary HTML to the label, create a template element with the HTML you want in the label, and provide the + template element's id to data-label. The Toolbar plugin will use the template's content for the button. + You can also use to declare your event handlers inline:

        + +
        <pre data-src="plugins/toolbar/prism-toolbar.js" data-label="my-label-button"></pre>
        + +
        <template id="my-label-button"><button onclick="console.log('This is an inline-handler');">My button</button></template>
        + +

        For more flexibility, the Toolbar exposes a JavaScript function that can be used to register new buttons or labels to the Toolbar, + Prism.plugins.toolbar.registerButton.

        + +

        The function accepts a key for the button and an object with a text property string and an optional + onClick function or url string. The onClick function will be called when the button is clicked, while the + url property will be set to the anchor tag's href.

        + +
        Prism.plugins.toolbar.registerButton('hello-world', {
        +	text: 'Hello World!', // required
        +	onClick: function (env) { // optional
        +		alert('This code snippet is written in ' + env.language + '.');
        +	}
        +});
        + +

        See how the above code registers the Hello World! button? You can use this in your plugins to register your own buttons with the toolbar.

        + +

        If you need more control, you can provide a function to registerButton that returns either a span, a, or + button element.

        + +
        Prism.plugins.toolbar.registerButton('select-code', function() {
        +	var button = document.createElement('button');
        +	button.innerHTML = 'Select Code';
        +
        +	button.addEventListener('click', function () {
        +		// Source: http://stackoverflow.com/a/11128179/2757940
        +		if (document.body.createTextRange) { // ms
        +			var range = document.body.createTextRange();
        +			range.moveToElementText(env.element);
        +			range.select();
        +		} else if (window.getSelection) { // moz, opera, webkit
        +			var selection = window.getSelection();
        +			var range = document.createRange();
        +			range.selectNodeContents(env.element);
        +			selection.removeAllRanges();
        +			selection.addRange(range);
        +		}
        +	});
        +
        +	return button;
        +});
        + +

        The above function creates the Select Code button you see, and when you click it, the code gets highlighted.

        + +

        By default, the buttons will be added to the code snippet in the order they were registered. If more control over + the order is needed, an HTML attribute can be added to the body tag with a comma-separated string indicating the + order.

        + +
        <body data-toolbar-order="select-code,hello-world,label">
        +
        + +
        + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/toolbar/prism-toolbar.css b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.css new file mode 100644 index 00000000..2b234e19 --- /dev/null +++ b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.css @@ -0,0 +1,58 @@ +div.code-toolbar { + position: relative; +} + +div.code-toolbar > .toolbar { + position: absolute; + top: .3em; + right: .2em; + transition: opacity 0.3s ease-in-out; + opacity: 0; +} + +div.code-toolbar:hover > .toolbar { + opacity: 1; +} + +div.code-toolbar > .toolbar .toolbar-item { + display: inline-block; +} + +div.code-toolbar > .toolbar a { + cursor: pointer; +} + +div.code-toolbar > .toolbar button { + background: none; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + -webkit-user-select: none; /* for button */ + -moz-user-select: none; + -ms-user-select: none; +} + +div.code-toolbar > .toolbar a, +div.code-toolbar > .toolbar button, +div.code-toolbar > .toolbar span { + color: #bbb; + font-size: .8em; + padding: 0 .5em; + background: #f5f2f0; + background: rgba(224, 224, 224, 0.2); + box-shadow: 0 2px 0 0 rgba(0,0,0,0.2); + border-radius: .5em; +} + +div.code-toolbar > .toolbar a:hover, +div.code-toolbar > .toolbar a:focus, +div.code-toolbar > .toolbar button:hover, +div.code-toolbar > .toolbar button:focus, +div.code-toolbar > .toolbar span:hover, +div.code-toolbar > .toolbar span:focus { + color: inherit; + text-decoration: none; +} diff --git a/docs/_style/prism-master/plugins/toolbar/prism-toolbar.js b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.js new file mode 100644 index 00000000..93294514 --- /dev/null +++ b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.js @@ -0,0 +1,137 @@ +(function(){ + if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; + } + + var callbacks = []; + var map = {}; + var noop = function() {}; + + Prism.plugins.toolbar = {}; + + /** + * Register a button callback with the toolbar. + * + * @param {string} key + * @param {Object|Function} opts + */ + var registerButton = Prism.plugins.toolbar.registerButton = function (key, opts) { + var callback; + + if (typeof opts === 'function') { + callback = opts; + } else { + callback = function (env) { + var element; + + if (typeof opts.onClick === 'function') { + element = document.createElement('button'); + element.type = 'button'; + element.addEventListener('click', function () { + opts.onClick.call(this, env); + }); + } else if (typeof opts.url === 'string') { + element = document.createElement('a'); + element.href = opts.url; + } else { + element = document.createElement('span'); + } + + element.textContent = opts.text; + + return element; + }; + } + + callbacks.push(map[key] = callback); + }; + + /** + * Post-highlight Prism hook callback. + * + * @param env + */ + var hook = Prism.plugins.toolbar.hook = function (env) { + // Check if inline or actual code block (credit to line-numbers plugin) + var pre = env.element.parentNode; + if (!pre || !/pre/i.test(pre.nodeName)) { + return; + } + + // Autoloader rehighlights, so only do this once. + if (pre.parentNode.classList.contains('code-toolbar')) { + return; + } + + // Create wrapper for
         to prevent scrolling toolbar with content
        +		var wrapper = document.createElement("div");
        +		wrapper.classList.add("code-toolbar");
        +		pre.parentNode.insertBefore(wrapper, pre);
        +		wrapper.appendChild(pre);
        +
        +		// Setup the toolbar
        +		var toolbar = document.createElement('div');
        +		toolbar.classList.add('toolbar');
        +
        +		if (document.body.hasAttribute('data-toolbar-order')) {
        +			callbacks = document.body.getAttribute('data-toolbar-order').split(',').map(function(key) {
        +				return map[key] || noop;
        +			});
        +		}
        +
        +		callbacks.forEach(function(callback) {
        +			var element = callback(env);
        +
        +			if (!element) {
        +				return;
        +			}
        +
        +			var item = document.createElement('div');
        +			item.classList.add('toolbar-item');
        +
        +			item.appendChild(element);
        +			toolbar.appendChild(item);
        +		});
        +
        +		// Add our toolbar to the currently created wrapper of 
         tag
        +		wrapper.appendChild(toolbar);
        +	};
        +
        +	registerButton('label', function(env) {
        +		var pre = env.element.parentNode;
        +		if (!pre || !/pre/i.test(pre.nodeName)) {
        +			return;
        +		}
        +
        +		if (!pre.hasAttribute('data-label')) {
        +			return;
        +		}
        +
        +		var element, template;
        +		var text = pre.getAttribute('data-label');
        +		try {
        +			// Any normal text will blow up this selector.
        +			template = document.querySelector('template#' + text);
        +		} catch (e) {}
        +
        +		if (template) {
        +			element = template.content;
        +		} else {
        +			if (pre.hasAttribute('data-url')) {
        +				element = document.createElement('a');
        +				element.href = pre.getAttribute('data-url');
        +			} else {
        +				element = document.createElement('span');
        +			}
        +
        +			element.textContent = text;
        +		}
        +
        +		return element;
        +	});
        +
        +	/**
        +	 * Register the toolbar with Prism.
        +	 */
        +	Prism.hooks.add('complete', hook);
        +})();
        diff --git a/docs/_style/prism-master/plugins/toolbar/prism-toolbar.min.js b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.min.js
        new file mode 100644
        index 00000000..17cee962
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/toolbar/prism-toolbar.min.js
        @@ -0,0 +1 @@
        +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var t=[],e={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var o;o="function"==typeof a?a:function(t){var e;return"function"==typeof a.onClick?(e=document.createElement("button"),e.type="button",e.addEventListener("click",function(){a.onClick.call(this,t)})):"string"==typeof a.url?(e=document.createElement("a"),e.href=a.url):e=document.createElement("span"),e.textContent=a.text,e},t.push(e[n]=o)},o=Prism.plugins.toolbar.hook=function(a){var o=a.element.parentNode;if(o&&/pre/i.test(o.nodeName)&&!o.parentNode.classList.contains("code-toolbar")){var r=document.createElement("div");r.classList.add("code-toolbar"),o.parentNode.insertBefore(r,o),r.appendChild(o);var i=document.createElement("div");i.classList.add("toolbar"),document.body.hasAttribute("data-toolbar-order")&&(t=document.body.getAttribute("data-toolbar-order").split(",").map(function(t){return e[t]||n})),t.forEach(function(t){var e=t(a);if(e){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(e),i.appendChild(n)}}),r.appendChild(i)}};a("label",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-label")){var n,a,o=e.getAttribute("data-label");try{a=document.querySelector("template#"+o)}catch(r){}return a?n=a.content:(e.hasAttribute("data-url")?(n=document.createElement("a"),n.href=e.getAttribute("data-url")):n=document.createElement("span"),n.textContent=o),n}}),Prism.hooks.add("complete",o)}}();
        \ No newline at end of file
        diff --git a/docs/_style/prism-master/plugins/unescaped-markup/index.html b/docs/_style/prism-master/plugins/unescaped-markup/index.html
        new file mode 100644
        index 00000000..442ef2aa
        --- /dev/null
        +++ b/docs/_style/prism-master/plugins/unescaped-markup/index.html
        @@ -0,0 +1,195 @@
        +
        +
        +
        +
        +	
        +	
        +	Unescaped markup ▲ Prism plugins
        +	
        +	
        +	
        +	
        +
        +	
        +
        +	
        +	
        +
        +
        +
        +
        +
        + +

        Unescaped markup

        +

        Write markup without having to escape anything.

        +
        + +
        +

        How to use

        +

        This plugin provides several methods of achieving the same thing:

        + +
          +
        • Instead of using <pre><code> elements, use <script type="text/plain"> +
          <script type="text/plain" class="language-markup">
          +<p>Example</p>
          +</script>
          +
        • +
        • Use a HTML-comment to escape your code +
          <pre class="language-markup"><code><!--
          +<p>Example</p>
          +--></code></pre>
        • +
        +
        + +
        +

        Examples

        + +

        View source to see that the following didn’t need escaping (except for </script>, that does):

        + + + +

        The next example uses the HTML-comment method:

        + +
        +
        + +
        +

        FAQ

        + +

        Why not use the HTML <template> tag?

        + +

        Because it is a PITA to get its textContent and needs to be pointlessly cloned. + Feel free to implement it yourself and send a pull request though, if you are so inclined.

        + +

        Can I use this inline?

        + +

        Not out of the box, because I figured it’s more of a hassle to type <script type="text/plain"> than escape the 1-2 < characters you need to escape in inline code. + Also inline code is not as frequently copy-pasted, which was the major source of annoyance that got me to write this plugin.

        +
        + +
        + + + + + + + + + diff --git a/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.css b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.css new file mode 100644 index 00000000..3ba2a1e6 --- /dev/null +++ b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.css @@ -0,0 +1,10 @@ +/* Fallback, in case JS does not run, to ensure the code is at least visible */ +[class*='lang-'] script[type='text/plain'], +[class*='language-'] script[type='text/plain'], +script[type='text/plain'][class*='lang-'], +script[type='text/plain'][class*='language-'] { + display: block; + font: 100% Consolas, Monaco, monospace; + white-space: pre; + overflow: auto; +} diff --git a/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.js b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.js new file mode 100644 index 00000000..8684ebac --- /dev/null +++ b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.js @@ -0,0 +1,44 @@ +(function () { + + if (typeof self === 'undefined' || !self.Prism || !self.document || !Prism.languages.markup) { + return; + } + + Prism.plugins.UnescapedMarkup = true; + + Prism.hooks.add('before-highlightall', function (env) { + env.selector += ", [class*='lang-'] script[type='text/plain'], [class*='language-'] script[type='text/plain']" + + ", script[type='text/plain'][class*='lang-'], script[type='text/plain'][class*='language-']"; + }); + + Prism.hooks.add('before-sanity-check', function (env) { + if ((env.element.matches || env.element.msMatchesSelector).call(env.element, "script[type='text/plain']")) { + var code = document.createElement("code"); + var pre = document.createElement("pre"); + + pre.className = code.className = env.element.className; + + if (env.element.dataset) { + Object.keys(env.element.dataset).forEach(function (key) { + if (Object.prototype.hasOwnProperty.call(env.element.dataset, key)) { + pre.dataset[key] = env.element.dataset[key]; + } + }); + } + + env.code = env.code.replace(/<\/script(>|>)/gi, ""); + code.textContent = env.code; + + pre.appendChild(code); + env.element.parentNode.replaceChild(pre, env.element); + env.element = code; + return; + } + + var pre = env.element.parentNode; + if (!env.code && pre && pre.nodeName.toLowerCase() == 'pre' && + env.element.childNodes.length && env.element.childNodes[0].nodeName == "#comment") { + env.element.textContent = env.code = env.element.childNodes[0].textContent; + } + }); +}()); diff --git a/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.min.js b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.min.js new file mode 100644 index 00000000..f48514a3 --- /dev/null +++ b/docs/_style/prism-master/plugins/unescaped-markup/prism-unescaped-markup.min.js @@ -0,0 +1 @@ +!function(){"undefined"!=typeof self&&self.Prism&&self.document&&Prism.languages.markup&&(Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",function(e){e.selector+=", [class*='lang-'] script[type='text/plain'], [class*='language-'] script[type='text/plain'], script[type='text/plain'][class*='lang-'], script[type='text/plain'][class*='language-']"}),Prism.hooks.add("before-sanity-check",function(e){if((e.element.matches||e.element.msMatchesSelector).call(e.element,"script[type='text/plain']")){var t=document.createElement("code"),n=document.createElement("pre");return n.className=t.className=e.element.className,e.element.dataset&&Object.keys(e.element.dataset).forEach(function(t){Object.prototype.hasOwnProperty.call(e.element.dataset,t)&&(n.dataset[t]=e.element.dataset[t])}),e.code=e.code.replace(/<\/script(>|>)/gi,""),t.textContent=e.code,n.appendChild(t),e.element.parentNode.replaceChild(n,e.element),e.element=t,void 0}var n=e.element.parentNode;!e.code&&n&&"pre"==n.nodeName.toLowerCase()&&e.element.childNodes.length&&"#comment"==e.element.childNodes[0].nodeName&&(e.element.textContent=e.code=e.element.childNodes[0].textContent)}))}(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/wpd/index.html b/docs/_style/prism-master/plugins/wpd/index.html new file mode 100644 index 00000000..9157a483 --- /dev/null +++ b/docs/_style/prism-master/plugins/wpd/index.html @@ -0,0 +1,68 @@ + + + + + + +WebPlatform Docs ▲ Prism plugins + + + + + + + + + + + +
        +
        + +

        WebPlatform Docs

        +

        Makes tokens link to WebPlatform.org documentation. The links open in a new tab.

        +
        + +
        +

        How to use

        + +

        No setup required, just include the plugin in your download and you’re good to go!

        + +

        Tokens that currently link to documentation:

        + +
          +
        • HTML, MathML and SVG tags
        • +
        • HTML, MathML and SVG non-namespaced attributes
        • +
        • (Non-prefixed) CSS properties
        • +
        • (Non-prefixed) CSS @rules
        • +
        • (Non-prefixed) CSS pseudo-classes
        • +
        • (Non-prefixed) CSS pseudo-elements (starting with ::)
        • +
        + +

        Beta: This plugin is still in beta. Please help make it better: Test it and report any false positives etc!

        +
        + +
        +

        Examples

        + +

        CSS

        +
        
        +	
        
        +
        +	

        HTML

        +
        
        +
        +	

        SVG

        +
        
        +
        + +
        + + + + + + + + + \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/wpd/prism-wpd.css b/docs/_style/prism-master/plugins/wpd/prism-wpd.css new file mode 100644 index 00000000..43b7165a --- /dev/null +++ b/docs/_style/prism-master/plugins/wpd/prism-wpd.css @@ -0,0 +1,11 @@ +code[class*="language-"] a[href], +pre[class*="language-"] a[href] { + cursor: help; + text-decoration: none; +} + +code[class*="language-"] a[href]:hover, +pre[class*="language-"] a[href]:hover { + cursor: help; + text-decoration: underline; +} \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/wpd/prism-wpd.js b/docs/_style/prism-master/plugins/wpd/prism-wpd.js new file mode 100644 index 00000000..dc147d4f --- /dev/null +++ b/docs/_style/prism-master/plugins/wpd/prism-wpd.js @@ -0,0 +1,169 @@ +(function(){ + +if ( + typeof self !== 'undefined' && !self.Prism || + typeof global !== 'undefined' && !global.Prism +) { + return; +} + +if (Prism.languages.css) { + // check whether the selector is an advanced pattern before extending it + if (Prism.languages.css.selector.pattern) + { + Prism.languages.css.selector.inside['pseudo-class'] = /:[\w-]+/; + Prism.languages.css.selector.inside['pseudo-element'] = /::[\w-]+/; + } + else + { + Prism.languages.css.selector = { + pattern: Prism.languages.css.selector, + inside: { + 'pseudo-class': /:[\w-]+/, + 'pseudo-element': /::[\w-]+/ + } + }; + } +} + +if (Prism.languages.markup) { + Prism.languages.markup.tag.inside.tag.inside['tag-id'] = /[\w-]+/; + + var Tags = { + HTML: { + 'a': 1, 'abbr': 1, 'acronym': 1, 'b': 1, 'basefont': 1, 'bdo': 1, 'big': 1, 'blink': 1, 'cite': 1, 'code': 1, 'dfn': 1, 'em': 1, 'kbd': 1, 'i': 1, + 'rp': 1, 'rt': 1, 'ruby': 1, 's': 1, 'samp': 1, 'small': 1, 'spacer': 1, 'strike': 1, 'strong': 1, 'sub': 1, 'sup': 1, 'time': 1, 'tt': 1, 'u': 1, + 'var': 1, 'wbr': 1, 'noframes': 1, 'summary': 1, 'command': 1, 'dt': 1, 'dd': 1, 'figure': 1, 'figcaption': 1, 'center': 1, 'section': 1, 'nav': 1, + 'article': 1, 'aside': 1, 'hgroup': 1, 'header': 1, 'footer': 1, 'address': 1, 'noscript': 1, 'isIndex': 1, 'main': 1, 'mark': 1, 'marquee': 1, + 'meter': 1, 'menu': 1 + }, + SVG: { + 'animateColor': 1, 'animateMotion': 1, 'animateTransform': 1, 'glyph': 1, 'feBlend': 1, 'feColorMatrix': 1, 'feComponentTransfer': 1, + 'feFuncR': 1, 'feFuncG': 1, 'feFuncB': 1, 'feFuncA': 1, 'feComposite': 1, 'feConvolveMatrix': 1, 'feDiffuseLighting': 1, 'feDisplacementMap': 1, + 'feFlood': 1, 'feGaussianBlur': 1, 'feImage': 1, 'feMerge': 1, 'feMergeNode': 1, 'feMorphology': 1, 'feOffset': 1, 'feSpecularLighting': 1, + 'feTile': 1, 'feTurbulence': 1, 'feDistantLight': 1, 'fePointLight': 1, 'feSpotLight': 1, 'linearGradient': 1, 'radialGradient': 1, 'altGlyph': 1, + 'textPath': 1, 'tref': 1, 'altglyph': 1, 'textpath': 1, 'altglyphdef': 1, 'altglyphitem': 1, 'clipPath': 1, 'color-profile': 1, 'cursor': 1, + 'font-face': 1, 'font-face-format': 1, 'font-face-name': 1, 'font-face-src': 1, 'font-face-uri': 1, 'foreignObject': 1, 'glyphRef': 1, + 'hkern': 1, 'vkern': 1 + }, + MathML: {} + } +} + +var language; + +Prism.hooks.add('wrap', function(env) { + if ((env.type == 'tag-id' + || (env.type == 'property' && env.content.indexOf('-') != 0) + || (env.type == 'rule'&& env.content.indexOf('@-') != 0) + || (env.type == 'pseudo-class'&& env.content.indexOf(':-') != 0) + || (env.type == 'pseudo-element'&& env.content.indexOf('::-') != 0) + || (env.type == 'attr-name' && env.content.indexOf('data-') != 0) + ) && env.content.indexOf('<') === -1 + ) { + if (env.language == 'css' + || env.language == 'scss' + || env.language == 'markup' + ) { + var href = 'https://webplatform.github.io/docs/'; + var content = env.content; + + if (env.language == 'css' || env.language == 'scss') { + href += 'css/'; + + if (env.type == 'property') { + href += 'properties/'; + } + else if (env.type == 'rule') { + href += 'atrules/'; + content = content.substring(1); + } + else if (env.type == 'pseudo-class') { + href += 'selectors/pseudo-classes/'; + content = content.substring(1); + } + else if (env.type == 'pseudo-element') { + href += 'selectors/pseudo-elements/'; + content = content.substring(2); + } + } + else if (env.language == 'markup') { + if (env.type == 'tag-id') { + // Check language + language = getLanguage(env.content) || language; + + if (language) { + href += language + '/elements/'; + } + else { + return; // Abort + } + } + else if (env.type == 'attr-name') { + if (language) { + href += language + '/attributes/'; + } + else { + return; // Abort + } + } + } + + href += content; + env.tag = 'a'; + env.attributes.href = href; + env.attributes.target = '_blank'; + } + } +}); + +function getLanguage(tag) { + var tagL = tag.toLowerCase(); + + if (Tags.HTML[tagL]) { + return 'html'; + } + else if (Tags.SVG[tag]) { + return 'svg'; + } + else if (Tags.MathML[tag]) { + return 'mathml'; + } + + // Not in dictionary, perform check + if (Tags.HTML[tagL] !== 0 && typeof document !== 'undefined') { + var htmlInterface = (document.createElement(tag).toString().match(/\[object HTML(.+)Element\]/) || [])[1]; + + if (htmlInterface && htmlInterface != 'Unknown') { + Tags.HTML[tagL] = 1; + return 'html'; + } + } + + Tags.HTML[tagL] = 0; + + if (Tags.SVG[tag] !== 0 && typeof document !== 'undefined') { + var svgInterface = (document.createElementNS('http://www.w3.org/2000/svg', tag).toString().match(/\[object SVG(.+)Element\]/) || [])[1]; + + if (svgInterface && svgInterface != 'Unknown') { + Tags.SVG[tag] = 1; + return 'svg'; + } + } + + Tags.SVG[tag] = 0; + + // Lame way to detect MathML, but browsers don’t expose interface names there :( + if (Tags.MathML[tag] !== 0) { + if (tag.indexOf('m') === 0) { + Tags.MathML[tag] = 1; + return 'mathml'; + } + } + + Tags.MathML[tag] = 0; + + return null; +} + +})(); \ No newline at end of file diff --git a/docs/_style/prism-master/plugins/wpd/prism-wpd.min.js b/docs/_style/prism-master/plugins/wpd/prism-wpd.min.js new file mode 100644 index 00000000..86bad362 --- /dev/null +++ b/docs/_style/prism-master/plugins/wpd/prism-wpd.min.js @@ -0,0 +1 @@ +!function(){function e(e){var n=e.toLowerCase();if(t.HTML[n])return"html";if(t.SVG[e])return"svg";if(t.MathML[e])return"mathml";if(0!==t.HTML[n]&&"undefined"!=typeof document){var a=(document.createElement(e).toString().match(/\[object HTML(.+)Element\]/)||[])[1];if(a&&"Unknown"!=a)return t.HTML[n]=1,"html"}if(t.HTML[n]=0,0!==t.SVG[e]&&"undefined"!=typeof document){var s=(document.createElementNS("http://www.w3.org/2000/svg",e).toString().match(/\[object SVG(.+)Element\]/)||[])[1];if(s&&"Unknown"!=s)return t.SVG[e]=1,"svg"}return t.SVG[e]=0,0!==t.MathML[e]&&0===e.indexOf("m")?(t.MathML[e]=1,"mathml"):(t.MathML[e]=0,null)}if(("undefined"==typeof self||self.Prism)&&("undefined"==typeof global||global.Prism)){if(Prism.languages.css&&(Prism.languages.css.selector.pattern?(Prism.languages.css.selector.inside["pseudo-class"]=/:[\w-]+/,Prism.languages.css.selector.inside["pseudo-element"]=/::[\w-]+/):Prism.languages.css.selector={pattern:Prism.languages.css.selector,inside:{"pseudo-class":/:[\w-]+/,"pseudo-element":/::[\w-]+/}}),Prism.languages.markup){Prism.languages.markup.tag.inside.tag.inside["tag-id"]=/[\w-]+/;var t={HTML:{a:1,abbr:1,acronym:1,b:1,basefont:1,bdo:1,big:1,blink:1,cite:1,code:1,dfn:1,em:1,kbd:1,i:1,rp:1,rt:1,ruby:1,s:1,samp:1,small:1,spacer:1,strike:1,strong:1,sub:1,sup:1,time:1,tt:1,u:1,"var":1,wbr:1,noframes:1,summary:1,command:1,dt:1,dd:1,figure:1,figcaption:1,center:1,section:1,nav:1,article:1,aside:1,hgroup:1,header:1,footer:1,address:1,noscript:1,isIndex:1,main:1,mark:1,marquee:1,meter:1,menu:1},SVG:{animateColor:1,animateMotion:1,animateTransform:1,glyph:1,feBlend:1,feColorMatrix:1,feComponentTransfer:1,feFuncR:1,feFuncG:1,feFuncB:1,feFuncA:1,feComposite:1,feConvolveMatrix:1,feDiffuseLighting:1,feDisplacementMap:1,feFlood:1,feGaussianBlur:1,feImage:1,feMerge:1,feMergeNode:1,feMorphology:1,feOffset:1,feSpecularLighting:1,feTile:1,feTurbulence:1,feDistantLight:1,fePointLight:1,feSpotLight:1,linearGradient:1,radialGradient:1,altGlyph:1,textPath:1,tref:1,altglyph:1,textpath:1,altglyphdef:1,altglyphitem:1,clipPath:1,"color-profile":1,cursor:1,"font-face":1,"font-face-format":1,"font-face-name":1,"font-face-src":1,"font-face-uri":1,foreignObject:1,glyphRef:1,hkern:1,vkern:1},MathML:{}}}var n;Prism.hooks.add("wrap",function(t){if(("tag-id"==t.type||"property"==t.type&&0!=t.content.indexOf("-")||"rule"==t.type&&0!=t.content.indexOf("@-")||"pseudo-class"==t.type&&0!=t.content.indexOf(":-")||"pseudo-element"==t.type&&0!=t.content.indexOf("::-")||"attr-name"==t.type&&0!=t.content.indexOf("data-"))&&-1===t.content.indexOf("<")&&("css"==t.language||"scss"==t.language||"markup"==t.language)){var a="https://webplatform.github.io/docs/",s=t.content;if("css"==t.language||"scss"==t.language)a+="css/","property"==t.type?a+="properties/":"rule"==t.type?(a+="atrules/",s=s.substring(1)):"pseudo-class"==t.type?(a+="selectors/pseudo-classes/",s=s.substring(1)):"pseudo-element"==t.type&&(a+="selectors/pseudo-elements/",s=s.substring(2));else if("markup"==t.language)if("tag-id"==t.type){if(n=e(t.content)||n,!n)return;a+=n+"/elements/"}else if("attr-name"==t.type){if(!n)return;a+=n+"/attributes/"}a+=s,t.tag="a",t.attributes.href=a,t.attributes.target="_blank"}})}}(); \ No newline at end of file diff --git a/docs/_style/prism-master/prefixfree.min.js b/docs/_style/prism-master/prefixfree.min.js new file mode 100644 index 00000000..94fc4087 --- /dev/null +++ b/docs/_style/prism-master/prefixfree.min.js @@ -0,0 +1,5 @@ +/** + * StyleFix 1.0.3 & PrefixFree 1.0.7 + * @author Lea Verou + * MIT license + */(function(){function t(e,t){return[].slice.call((t||document).querySelectorAll(e))}if(!window.addEventListener)return;var e=window.StyleFix={link:function(t){try{if(t.rel!=="stylesheet"||t.hasAttribute("data-noprefix"))return}catch(n){return}var r=t.href||t.getAttribute("data-href"),i=r.replace(/[^\/]+$/,""),s=t.parentNode,o=new XMLHttpRequest,u;o.onreadystatechange=function(){o.readyState===4&&u()};u=function(){var n=o.responseText;if(n&&t.parentNode&&(!o.status||o.status<400||o.status>600)){n=e.fix(n,!0,t);if(i){n=n.replace(/url\(\s*?((?:"|')?)(.+?)\1\s*?\)/gi,function(e,t,n){return/^([a-z]{3,10}:|\/|#)/i.test(n)?e:'url("'+i+n+'")'});var r=i.replace(/([\\\^\$*+[\]?{}.=!:(|)])/g,"\\$1");n=n.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+r,"gi"),"$1")}var u=document.createElement("style");u.textContent=n;u.media=t.media;u.disabled=t.disabled;u.setAttribute("data-href",t.getAttribute("href"));s.insertBefore(u,t);s.removeChild(t);u.media=t.media}};try{o.open("GET",r);o.send(null)}catch(n){if(typeof XDomainRequest!="undefined"){o=new XDomainRequest;o.onerror=o.onprogress=function(){};o.onload=u;o.open("GET",r);o.send(null)}}t.setAttribute("data-inprogress","")},styleElement:function(t){if(t.hasAttribute("data-noprefix"))return;var n=t.disabled;t.textContent=e.fix(t.textContent,!0,t);t.disabled=n},styleAttribute:function(t){var n=t.getAttribute("style");n=e.fix(n,!1,t);t.setAttribute("style",n)},process:function(){t('link[rel="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);t("style").forEach(StyleFix.styleElement);t("[style]").forEach(StyleFix.styleAttribute)},register:function(t,n){(e.fixers=e.fixers||[]).splice(n===undefined?e.fixers.length:n,0,t)},fix:function(t,n,r){for(var i=0;i-1&&(e=e.replace(/(\s|:|,)(repeating-)?linear-gradient\(\s*(-?\d*\.?\d*)deg/ig,function(e,t,n,r){r=Math.abs(r-450)%360;return t+(n||"")+"linear-gradient("+r+"deg"}));e=t("functions","(\\s|:|,)","\\s*\\(","$1"+s+"$2(",e);e=t("keywords","(\\s|:)","(\\s|;|\\}|$)","$1"+s+"$2$3",e);e=t("properties","(^|\\{|\\s|;)","\\s*:","$1"+s+"$2:",e);if(n.properties.length){var o=RegExp("\\b("+n.properties.join("|")+")(?!:)","gi");e=t("valueProperties","\\b",":(.+?);",function(e){return e.replace(o,s+"$1")},e)}if(r){e=t("selectors","","\\b",n.prefixSelector,e);e=t("atrules","@","\\b","@"+s+"$1",e)}e=e.replace(RegExp("-"+s,"g"),"-");e=e.replace(/-\*-(?=[a-z]+)/gi,n.prefix);return e},property:function(e){return(n.properties.indexOf(e)?n.prefix:"")+e},value:function(e,r){e=t("functions","(^|\\s|,)","\\s*\\(","$1"+n.prefix+"$2(",e);e=t("keywords","(^|\\s)","(\\s|$)","$1"+n.prefix+"$2$3",e);return e},prefixSelector:function(e){return e.replace(/^:{1,2}/,function(e){return e+n.prefix})},prefixProperty:function(e,t){var r=n.prefix+e;return t?StyleFix.camelCase(r):r}};(function(){var e={},t=[],r={},i=getComputedStyle(document.documentElement,null),s=document.createElement("div").style,o=function(n){if(n.charAt(0)==="-"){t.push(n);var r=n.split("-"),i=r[1];e[i]=++e[i]||1;while(r.length>3){r.pop();var s=r.join("-");u(s)&&t.indexOf(s)===-1&&t.push(s)}}},u=function(e){return StyleFix.camelCase(e)in s};if(i.length>0)for(var a=0;a text.length) { + // Something went terribly wrong, ABORT, ABORT! + return; + } + + if (str instanceof Token) { + continue; + } + + if (greedy && i != strarr.length - 1) { + pattern.lastIndex = pos; + var match = pattern.exec(text); + if (!match) { + break; + } + + var from = match.index + (lookbehind ? match[1].length : 0), + to = match.index + match[0].length, + k = i, + p = pos; + + for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) { + p += strarr[k].length; + // Move the index i to the element in strarr that is closest to from + if (from >= p) { + ++i; + pos = p; + } + } + + // If strarr[i] is a Token, then the match starts inside another Token, which is invalid + if (strarr[i] instanceof Token) { + continue; + } + + // Number of tokens to delete and replace with the new match + delNum = k - i; + str = text.slice(pos, p); + match.index -= pos; + } else { + pattern.lastIndex = 0; + + var match = pattern.exec(str), + delNum = 1; + } + + if (!match) { + if (oneshot) { + break; + } + + continue; + } + + if(lookbehind) { + lookbehindLength = match[1] ? match[1].length : 0; + } + + var from = match.index + lookbehindLength, + match = match[0].slice(lookbehindLength), + to = from + match.length, + before = str.slice(0, from), + after = str.slice(to); + + var args = [i, delNum]; + + if (before) { + ++i; + pos += before.length; + args.push(before); + } + + var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy); + + args.push(wrapped); + + if (after) { + args.push(after); + } + + Array.prototype.splice.apply(strarr, args); + + if (delNum != 1) + _.matchGrammar(text, strarr, grammar, i, pos, true, token); + + if (oneshot) + break; + } + } + } + }, + + tokenize: function(text, grammar, language) { + var strarr = [text]; + + var rest = grammar.rest; + + if (rest) { + for (var token in rest) { + grammar[token] = rest[token]; + } + + delete grammar.rest; + } + + _.matchGrammar(text, strarr, grammar, 0, 0, false); + + return strarr; + }, + + hooks: { + all: {}, + + add: function (name, callback) { + var hooks = _.hooks.all; + + hooks[name] = hooks[name] || []; + + hooks[name].push(callback); + }, + + run: function (name, env) { + var callbacks = _.hooks.all[name]; + + if (!callbacks || !callbacks.length) { + return; + } + + for (var i=0, callback; callback = callbacks[i++];) { + callback(env); + } + } + } +}; + +var Token = _.Token = function(type, content, alias, matchedStr, greedy) { + this.type = type; + this.content = content; + this.alias = alias; + // Copy of the full string this token was created from + this.length = (matchedStr || "").length|0; + this.greedy = !!greedy; +}; + +Token.stringify = function(o, language, parent) { + if (typeof o == 'string') { + return o; + } + + if (_.util.type(o) === 'Array') { + return o.map(function(element) { + return Token.stringify(element, language, o); + }).join(''); + } + + var env = { + type: o.type, + content: Token.stringify(o.content, language, parent), + tag: 'span', + classes: ['token', o.type], + attributes: {}, + language: language, + parent: parent + }; + + if (o.alias) { + var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias]; + Array.prototype.push.apply(env.classes, aliases); + } + + _.hooks.run('wrap', env); + + var attributes = Object.keys(env.attributes).map(function(name) { + return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"'; + }).join(' '); + + return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + ''; + +}; + +if (!_self.document) { + if (!_self.addEventListener) { + // in Node.js + return _self.Prism; + } + + if (!_.disableWorkerMessageHandler) { + // In worker + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data), + lang = message.language, + code = message.code, + immediateClose = message.immediateClose; + + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + } + + return _self.Prism; +} + +//Get current script and highlight +var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop(); + +if (script) { + _.filename = script.src; + + if (!_.manual && !script.hasAttribute('data-manual')) { + if(document.readyState !== "loading") { + if (window.requestAnimationFrame) { + window.requestAnimationFrame(_.highlightAll); + } else { + window.setTimeout(_.highlightAll, 16); + } + } + else { + document.addEventListener('DOMContentLoaded', _.highlightAll); + } + } +} + +return _self.Prism; + +})(); + +if (typeof module !== 'undefined' && module.exports) { + module.exports = Prism; +} + +// hack for components to work correctly in node.js +if (typeof global !== 'undefined') { + global.Prism = Prism; +} + + +/* ********************************************** + Begin prism-markup.js +********************************************** */ + +Prism.languages.markup = { + 'comment': //, + 'prolog': /<\?[\s\S]+?\?>/, + 'doctype': //i, + 'cdata': //i, + 'tag': { + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i, + greedy: true, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/i, + inside: { + 'punctuation': /^<\/?/, + 'namespace': /^[^\s>\/:]+:/ + } + }, + 'attr-value': { + pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i, + inside: { + 'punctuation': [ + /^=/, + { + pattern: /(^|[^\\])["']/, + lookbehind: true + } + ] + } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { + 'namespace': /^[^\s>\/:]+:/ + } + } + + } + }, + 'entity': /&#?[\da-z]{1,8};/i +}; + +Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = + Prism.languages.markup['entity']; + +// Plugin to make entity title show the real entity, idea by Roman Komarov +Prism.hooks.add('wrap', function(env) { + + if (env.type === 'entity') { + env.attributes['title'] = env.content.replace(/&/, '&'); + } +}); + +Prism.languages.xml = Prism.languages.markup; +Prism.languages.html = Prism.languages.markup; +Prism.languages.mathml = Prism.languages.markup; +Prism.languages.svg = Prism.languages.markup; + + +/* ********************************************** + Begin prism-css.js +********************************************** */ + +Prism.languages.css = { + 'comment': /\/\*[\s\S]*?\*\//, + 'atrule': { + pattern: /@[\w-]+?.*?(?:;|(?=\s*\{))/i, + inside: { + 'rule': /@[\w-]+/ + // See rest below + } + }, + 'url': /url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i, + 'selector': /[^{}\s][^{};]*?(?=\s*\{)/, + 'string': { + pattern: /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i, + 'important': /!important\b/i, + 'function': /[-a-z0-9]+(?=\()/i, + 'punctuation': /[(){};:,]/ +}; + +Prism.languages.css['atrule'].inside.rest = Prism.languages.css; + +if (Prism.languages.markup) { + Prism.languages.insertBefore('markup', 'tag', { + 'style': { + pattern: /()[\s\S]*?(?=<\/style>)/i, + lookbehind: true, + inside: Prism.languages.css, + alias: 'language-css', + greedy: true + } + }); + + Prism.languages.insertBefore('inside', 'attr-value', { + 'style-attr': { + pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i, + inside: { + 'attr-name': { + pattern: /^\s*style/i, + inside: Prism.languages.markup.tag.inside + }, + 'punctuation': /^\s*=\s*['"]|['"]\s*$/, + 'attr-value': { + pattern: /.+/i, + inside: Prism.languages.css + } + }, + alias: 'language-css' + } + }, Prism.languages.markup.tag); +} + + +/* ********************************************** + Begin prism-clike.js +********************************************** */ + +Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'class-name': { + pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i, + lookbehind: true, + inside: { + punctuation: /[.\\]/ + } + }, + 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + 'boolean': /\b(?:true|false)\b/, + 'function': /\w+(?=\()/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, + 'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/, + 'punctuation': /[{}[\];(),.:]/ +}; + + +/* ********************************************** + Begin prism-javascript.js +********************************************** */ + +Prism.languages.javascript = Prism.languages.extend('clike', { + 'class-name': [ + Prism.languages.clike['class-name'], + { + pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, + lookbehind: true + } + ], + 'keyword': [ + { + pattern: /((?:^|})\s*)(?:catch|finally)\b/, + lookbehind: true + }, + /\b(?:as|async|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/ + ], + 'number': /\b(?:(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+)n?|\d+n|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/, + // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444) + 'function': /[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\(|\.(?:apply|bind|call)\()/, + 'operator': /-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/ +}); + +Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/ + +Prism.languages.insertBefore('javascript', 'keyword', { + 'regex': { + pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/, + lookbehind: true, + greedy: true + }, + // This must be declared before keyword because we use "function" inside the look-forward + 'function-variable': { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i, + alias: 'function' + }, + 'parameter': [ + { + pattern: /(function(?:\s+[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)[^\s()][^()]*?(?=\s*\))/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/, + inside: Prism.languages.javascript + }, + { + pattern: /(\(\s*)[^\s()][^()]*?(?=\s*\)\s*=>)/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)[^\s()][^()]*?(?=\s*\)\s*\{)/, + lookbehind: true, + inside: Prism.languages.javascript + } + ], + 'constant': /\b[A-Z][A-Z\d_]*\b/ +}); + +Prism.languages.insertBefore('javascript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/, + greedy: true, + inside: { + 'interpolation': { + pattern: /\${[^}]+}/, + inside: { + 'interpolation-punctuation': { + pattern: /^\${|}$/, + alias: 'punctuation' + }, + rest: Prism.languages.javascript + } + }, + 'string': /[\s\S]+/ + } + } +}); + +if (Prism.languages.markup) { + Prism.languages.insertBefore('markup', 'tag', { + 'script': { + pattern: /()[\s\S]*?(?=<\/script>)/i, + lookbehind: true, + inside: Prism.languages.javascript, + alias: 'language-javascript', + greedy: true + } + }); +} + +Prism.languages.js = Prism.languages.javascript; + + +/* ********************************************** + Begin prism-file-highlight.js +********************************************** */ + +(function () { + if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) { + return; + } + + /** + * @param {Element} [container=document] + */ + self.Prism.fileHighlight = function(container) { + container = container || document; + + var Extensions = { + 'js': 'javascript', + 'py': 'python', + 'rb': 'ruby', + 'ps1': 'powershell', + 'psm1': 'powershell', + 'sh': 'bash', + 'bat': 'batch', + 'h': 'c', + 'tex': 'latex' + }; + + Array.prototype.slice.call(container.querySelectorAll('pre[data-src]')).forEach(function (pre) { + // ignore if already loaded + if (pre.hasAttribute('data-src-loaded')) { + return; + } + + // load current + var src = pre.getAttribute('data-src'); + + var language, parent = pre; + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + while (parent && !lang.test(parent.className)) { + parent = parent.parentNode; + } + + if (parent) { + language = (pre.className.match(lang) || [, ''])[1]; + } + + if (!language) { + var extension = (src.match(/\.(\w+)$/) || [, ''])[1]; + language = Extensions[extension] || extension; + } + + var code = document.createElement('code'); + code.className = 'language-' + language; + + pre.textContent = ''; + + code.textContent = 'Loading…'; + + pre.appendChild(code); + + var xhr = new XMLHttpRequest(); + + xhr.open('GET', src, true); + + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + + if (xhr.status < 400 && xhr.responseText) { + code.textContent = xhr.responseText; + + Prism.highlightElement(code); + // mark as loaded + pre.setAttribute('data-src-loaded', ''); + } + else if (xhr.status >= 400) { + code.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText; + } + else { + code.textContent = '✖ Error: File does not exist or is empty'; + } + } + }; + + xhr.send(null); + }); + + if (Prism.plugins.toolbar) { + Prism.plugins.toolbar.registerButton('download-file', function (env) { + var pre = env.element.parentNode; + if (!pre || !/pre/i.test(pre.nodeName) || !pre.hasAttribute('data-src') || !pre.hasAttribute('data-download-link')) { + return; + } + var src = pre.getAttribute('data-src'); + var a = document.createElement('a'); + a.textContent = pre.getAttribute('data-download-link-label') || 'Download'; + a.setAttribute('download', ''); + a.href = src; + return a; + }); + } + + }; + + document.addEventListener('DOMContentLoaded', function () { + // execute inside handler, for dropping Event as argumnet + self.Prism.fileHighlight(); + }); + +})(); diff --git a/docs/_style/prism-master/style.css b/docs/_style/prism-master/style.css new file mode 100644 index 00000000..80a674ed --- /dev/null +++ b/docs/_style/prism-master/style.css @@ -0,0 +1,407 @@ +@import url(https://fonts.googleapis.com/css?family=Questrial); +@import url(https://fonts.googleapis.com/css?family=Arvo); + +@font-face { + src: url(https://lea.verou.me/logo.otf); + font-family: 'LeaVerou'; +} + +/* + Shared styles + */ + +section h1, +#features li strong, +header h2, +footer p { + font: 100% Rockwell, Arvo, serif; +} + +/* + Styles + */ + +* { + margin: 0; + padding: 0; + font-weight: normal; +} + +body { + font: 100%/1.5 Questrial, sans-serif; + tab-size: 4; + hyphens: auto; +} + +a { + color: inherit; +} + +section h1 { + font-size: 250%; +} + + section section h1 { + font-size: 150%; + } + + section h1 code { + font-style: normal; + } + + section h1 > a { + text-decoration: none; + } + + section h1 > a:before { + content: '§'; + position: absolute; + padding: 0 .2em; + margin-left: -1em; + border-radius: .2em; + color: silver; + text-shadow: 0 1px white; + } + + section h1 > a:hover:before { + color: black; + background: #f1ad26; + } + +p { + margin: 1em 0; +} + +section h1, +h2 { + margin: 1em 0 .3em; +} + +dt { + margin: 1em 0 0 0; + font-size: 130%; +} + + dt:after { + content: ':'; + } + +dd { + margin-left: 2em; +} + +strong { + font-weight: bold; +} + +code, pre { + font-family: Consolas, Monaco, 'Andale Mono', 'Lucida Console', monospace; + hyphens: none; +} + +pre { + max-height: 30em; + overflow: auto; +} + +pre > code.highlight { + outline: .4em solid red; + outline-offset: .4em; +} + +header, +body > section { + display: block; + max-width: 900px; + margin: auto; +} + +header, footer { + position: relative; + padding: 30px -webkit-calc(50% - 450px); /* Workaround for bug */ + padding: 30px calc(50% - 450px); + color: white; + text-shadow: 0 -1px 2px black; + background: url(img/spectrum.png) fixed; +} + +header:before, +footer:before { + content: ''; + position: absolute; + bottom: 0; left: 0; right: 0; + height: 20px; + background-size: 20px 40px; + background-repeat: repeat-x; + background-image: linear-gradient(45deg, transparent 34%, white 34%, white 66%, transparent 66%), + linear-gradient(135deg, transparent 34%, white 34%, white 66%, transparent 66%); +} + +header { + +} + + header .intro, + html.simple header { + overflow: hidden; + } + + header h1 { + float: left; + margin-right: 30px; + color: #7fab14; + text-align: center; + font-size: 140%; + text-transform: uppercase; + letter-spacing: .25em; + } + + header h2 { + margin-top: .5em; + color: #f1ad26; + } + + header h1 a { + text-decoration: none; + } + + header img { + display: block; + width: 150px; + height: 128px; + margin-bottom: .3em; + border: 0; + } + + header h2 { + font-size: 300%; + } + + header .intro p { + margin: 0; + font: 150%/1.4 Questrial, sans-serif; + font-size: 150%; + } + + #features { + width: 66em; + margin-top: 2em; + font-size: 80%; + } + + #features li { + margin: 0 0 2em 0; + list-style: none; + display: inline-block; + width: 27em; + vertical-align: top; + } + + #features li:nth-child(odd) { + margin-right: 5em; + } + + #features li:before { + content: '✓'; + float: left; + margin-left: -.8em; + color: #7fab14; + font-size: 400%; + line-height: 1; + } + + #features li strong { + display: block; + margin-bottom: .1em; + font-size: 200%; + } + + header .download-button { + float: right; + margin: 0 0 .5em .5em; + } + + #theme { + position: relative; + z-index: 1; + float: right; + margin-right: -1em; + text-align: center; + text-transform: uppercase; + letter-spacing: .2em; + } + + #theme > p { + position: absolute; + left: 100%; + transform: translateX(50%) rotate(90deg) ; + transform-origin: top left; + font-size: 130%; + } + + #theme > label { + position: relative; + display: flex; + justify-content: center; + align-items: center; + width: 8.5em; + height: 8.5em; + line-height: 1em; + border-radius: 50%; + background: hsla(0,0%,100%,.5); + cursor: pointer; + font-size: 90%; + padding: 0; + } + + #theme > label:before { + content: ''; + position: absolute; + top: 0; right: 0; bottom: 0; left: 0; + z-index: -1; + border-radius: inherit; + background: url(img/spectrum.png) fixed; + } + + #theme > label:nth-of-type(n+2) { + margin-top: -2.5em; + } + + #theme > input:not(:checked) + label:hover { + background: hsla(77, 80%, 60%, .5); + } + + #theme > input { + position: absolute; + clip: rect(0,0,0,0); + } + + #theme > input:checked + label { + background: #7fab14; + } + +footer { + margin-top: 2em; + background-position: bottom; + color: white; + text-shadow: 0 -1px 2px black; +} + + footer:before { + bottom: auto; + top: 0; + background-position: bottom; + } + + footer p { + font-size: 150%; + } + + footer ul { + column-count: 3; + } + +.download-button { + display: block; + padding: .2em .8em .1em; + border: 1px solid rgba(0,0,0,0.5); + border-radius: 10px; + background: #39a1cf; + box-shadow: 0 2px 10px black, + inset 0 1px hsla(0,0%,100%,.3), + inset 0 .4em hsla(0,0%,100%,.2), + inset 0 10px 20px hsla(0,0%,100%,.25), + inset 0 -15px 30px rgba(0,0,0,0.3); + color: white; + text-shadow: 0 -1px 2px black; + text-align: center; + font-size: 250%; + line-height: 1.5; + text-transform: uppercase; + text-decoration: none; + hyphens: manual; +} + +.download-button:hover { + background-color: #7fab14; +} + +.download-button:active { + box-shadow: inset 0 2px 8px rgba(0,0,0,.8); +} + +#toc { + position: fixed; + left: 1%; + max-width: calc(48% - 450px); + font-size: 80%; + opacity: .3; +} + +@media (max-width: 1200px) { + #toc { + display: none; + } +} + +#toc:hover { + opacity: 1; +} + + #toc h1 { + font-size: 180%; + } + + #toc li { + list-style: none; + } + +#logo:before { + content: '☠'; + float: right; + font: 100px/1.6 LeaVerou; +} + +.used-by-logos { + overflow: hidden; +} + .used-by-logos > a { + float: left; + width: 33.33%; + height: 100px; + text-align: center; + background: #F5F2F0; + box-sizing: border-box; + border: 5px solid white; + position: relative; + } + .used-by-logos > a > img { + max-height: 100%; + max-width: 100%; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + +label a.owner { + margin: 0 .5em; +} + +label a.owner:not(:hover) { + text-decoration: none; + color: #aaa; +} + +#languages-list ul { + column-count: 3; +} + #languages-list li { + padding: .2em; + } + #languages-list li[data-id="javascript"] { + border-bottom: 1px solid #aaa; + padding-bottom: 1em; + margin-bottom: 1em; + margin-right: 1em; + } diff --git a/docs/_style/prism-master/templates/footer.html b/docs/_style/prism-master/templates/footer.html new file mode 100644 index 00000000..b0e306a5 --- /dev/null +++ b/docs/_style/prism-master/templates/footer.html @@ -0,0 +1,15 @@ + +

        Handcrafted with ♥, by Lea Verou, Golmote +& all these awesome people

        + + diff --git a/docs/_style/prism-master/templates/header-download.html b/docs/_style/prism-master/templates/header-download.html new file mode 100644 index 00000000..4e3df4e2 --- /dev/null +++ b/docs/_style/prism-master/templates/header-download.html @@ -0,0 +1,2 @@ +Download Prism +Customize your download to include only the languages and plugins you need and the compression level you prefer. \ No newline at end of file diff --git a/docs/_style/prism-master/templates/header-main.html b/docs/_style/prism-master/templates/header-main.html new file mode 100644 index 00000000..01fe9406 --- /dev/null +++ b/docs/_style/prism-master/templates/header-main.html @@ -0,0 +1,12 @@ +

        Prism

        + +Download + +

        + Prism is a lightweight, extensible syntax highlighter, built with modern web standards in mind. + It’s used in thousands of websites, including some of those you visit daily. +

        + + diff --git a/docs/_style/prism-master/templates/header-plugins.html b/docs/_style/prism-master/templates/header-plugins.html new file mode 100644 index 00000000..45e2aac8 --- /dev/null +++ b/docs/_style/prism-master/templates/header-plugins.html @@ -0,0 +1,8 @@ +

        Prism plugins

        + +Download + +

        + Prism is a lightweight, extensible syntax highlighter, built with modern web standards in mind. + It’s used in thousands of websites, including some of those you visit daily. +

        diff --git a/docs/_style/prism-master/test-suite.html b/docs/_style/prism-master/test-suite.html new file mode 100644 index 00000000..5aeebf2a --- /dev/null +++ b/docs/_style/prism-master/test-suite.html @@ -0,0 +1,167 @@ + + + + + + +Running the test suite ▲ Prism + + + + + + + + + +
        +
        + +

        Running the test suite

        +

        Prism has a test suite, that ensures that the correct tokens are matched.

        +
        + +
        +

        Running the test suite

        + +

        Running the test suite is simple: just call npm test.

        +

        All test files are run in isolation. A new prism instance is created for each test case. This will slow the test runner a bit down, but we can be sure that nothing leaks into the next test case.

        + +
        +

        Running tests for specific languages

        + +

        To run the tests only for one language, you can use the language parameter: npm test -- --language=markup.

        +

        You can even specify multiple languages: npm test -- --language=markup --language=css.

        +
        +
        + +
        +

        Writing tests

        + +

        Thank you for writing tests! Tests are awesome! They ensure, that we can improve the codebase without breaking anything. Also, this way, we can ensure that upgrading Prism is as painless as possible for you.

        +

        You can add new tests by creating a new test case file (with the .test file extension) in the tests directory which is located at /tests/languages/${language}.

        + +
        +

        Language directories

        +

        All tests are sorted into directories in the tests/languages directory. Each directory name encodes, which language you are currently testing.

        +

        All language names must match the names from the definition in components.js.

        + +

        Example 1: testing a language in isolation (default use case)

        +

        Just put your test file into the directory of the language you want to test.

        +

        So, if you want to test CSS, put your test file in /tests/languages/css to test CSS only. If you create a test case in this directory, the test runner will ensure that the css language definition including all required language definitions are correctly loaded.

        + +

        Example 2: testing language injection

        +

        If you want to test language injection, you typically need to load two or more languages where one language is the “main” language that is being tested, with all other languages being injected into it.

        +

        You need to define multiple languages by separating them using a + sign: markup+php.

        +

        The languages are loaded in order, so first markup (+ dependencies) is loaded, then php (+ dependencies). The test loader ensures that no language is loaded more than once (for example if two languages have the same dependencies).

        +

        By default the last language is the main language: php+markup will have markup as main language. This is equal to putting your code in the following code block:

        +
        ...
        +<pre><code class="language-markup">
        +	<!-- your code here -->
        +</code><pre>
        +...
        + +

        If you need to load the languages in a given order, but you don't want to use the last language as main language, you can mark the main language with an exclamation mark: php!+markup. This will use php as main language. (You can only define one main language. The test runner will fail all tests in directories with more than one main language.)

        + +

        Note: by loading multiple languages you can do integration tests (ensure that loading two or more languages together won't break anything).

        +
        + +
        +

        Creating your test case file

        +

        At first you need to create a new file in the language directory, you want to test.

        +

        Use a proper name for your test case. Please use one case of the following conventions:

        +
          +
        • issue{issueid}: reference a github issue id (example: issue588.test).
        • +
        • {featurename}_feature: group all tests to one feature in one file (example: string_interpolation_feature.test).
        • +
        • {language}_inclusion: test inclusion of one language into the other (example: markup!+css/css_inclusion.test will test CSS inclusion into markup).
        • +
        +

        You can use all conventions as a prefix, so string_interpolation_feature_inline.test is possible. But please take a minute or two to think of a proper name of your test case file. You are writing code not only for the computers, but also for your fellow developers.

        +
        + +
        +

        Writing your test

        +

        The structure of a test case file is as follows:

        +
        
        +... language snippet...
        +----
        +... the simplified token stream you expect ...
        + +

        Your file is built up of two or three sections, separated by ten or more dashes -, starting at the begin of the line:

        +
          +
        1. Your language snippet. The code you want to compile using Prism. (required)
        2. +
        3. The simplified token stream you expect. Needs to be valid JSON. (required)
        4. +
        5. A comment explaining the test case. (optional)
        6. +
        +

        The easiest way would be to look at an existing test file:

        +
        var a = 5;
        +
        +----------------------------------------------------
        +
        +[
        +	["keyword", "var"],
        +	" a ",
        +	["operator", "="],
        +	["number", "5"],
        +	["punctuation", ";"]
        +]
        +
        +----------------------------------------------------
        +
        +This is a comment explaining this test case.
        +
        + +
        +

        Explaining the simplified token stream

        +

        While compiling, Prism transforms your source code into a token stream. This is basically a tree of nested tokens (or arrays, or strings).

        +

        As these trees are hard to write by hand, the test runner uses a simplified version of it.

        +

        It uses the following rules:

        +
          +
        • Token objects are transformed into an array: [token.type, token.content] (whereas token.content can be a nested structure).
        • +
        • All strings that are either empty or only contain whitespace, are removed from the token stream.
        • +
        • All empty structures are removed.
        • +
        +

        For further information: reading the tests of the test runner (tests/testrunner-tests.js) will help you understand the transformation.

        +
        +
        + +
        +

        Writing specific tests

        + +

        Sometimes, using the token stream tests is not powerful enough. By creating a test file with the file extension .js instead of .test, you can make Prism highlight arbitrary pieces of code and check their HTML results.

        +

        The language is determined by the folder containing the test file lies, as explained in the previous section.

        +

        The structure of your test file will look like this, for example:

        +
        module.exports = {
        +	'&#x278a;': '<span class="token entity" title="&#x278a;">&amp;#x278a;</span>',
        +	'&#182;': '<span class="token entity" title="&#182;">&amp;#182;</span>',
        +};
        +

        The keys are the codes which will be highlighted by Prism. The values are the expected results, as HTML.

        +
        + +
        +

        Test runner tests

        +

        The test runner itself is tested in a separate test case. You can find all “test core” related tests in tests/testrunner-tests.js.

        +

        You shouldn't need to touch this file ever, except you modify the test runner code.

        +
        + +
        +

        Internal structure

        +

        The global test flow is at follows:

        +
          +
        1. Run all internal tests (test the test runner).
        2. +
        3. Find all language tests.
        4. +
        5. Run all language tests individually.
        6. +
        7. Report the results.
        8. +
        +
        + + +
        + + + + + + + + + diff --git a/docs/_style/prism-master/test.html b/docs/_style/prism-master/test.html new file mode 100644 index 00000000..e28cce1d --- /dev/null +++ b/docs/_style/prism-master/test.html @@ -0,0 +1,203 @@ + + + + + + +Test drive ▲ Prism + + + + + + + + + + +
        +
        + +

        Test drive

        +

        Take Prism for a spin!

        +
        + +
        +
        +

        + +

        + +

        Result:

        +
        + +

        + Language: +

        +
        +
        + +
        + + + + + + + + + + + diff --git a/docs/_style/prism-master/tests/helper/prism-loader.js b/docs/_style/prism-master/tests/helper/prism-loader.js new file mode 100644 index 00000000..3257485a --- /dev/null +++ b/docs/_style/prism-master/tests/helper/prism-loader.js @@ -0,0 +1,131 @@ +"use strict"; + +var fs = require("fs"); +var vm = require("vm"); +var components = require("../../components"); +var languagesCatalog = components.languages; + + +module.exports = { + + /** + * Creates a new Prism instance with the given language loaded + * + * @param {string|string[]} languages + * @returns {Prism} + */ + createInstance: function (languages) { + var context = { + loadedLanguages: [], + Prism: this.createEmptyPrism() + }; + + context = this.loadLanguages(languages, context); + + return context.Prism; + }, + + /** + * Loads the given languages and appends the config to the given Prism object + * + * @private + * @param {string|string[]} languages + * @param {{loadedLanguages: string[], Prism: Prism}} context + * @returns {{loadedLanguages: string[], Prism: Prism}} + */ + loadLanguages: function (languages, context) { + if (typeof languages === 'string') { + languages = [languages]; + } + + var self = this; + + languages.forEach(function (language) { + context = self.loadLanguage(language, context); + }); + + return context; + }, + + /** + * Loads the given language (including recursively loading the dependencies) and + * appends the config to the given Prism object + * + * @private + * @param {string} language + * @param {{loadedLanguages: string[], Prism: Prism}} context + * @returns {{loadedLanguages: string[], Prism: Prism}} + */ + loadLanguage: function (language, context) { + if (!languagesCatalog[language]) { + throw new Error("Language '" + language + "' not found."); + } + + // the given language was already loaded + if (-1 < context.loadedLanguages.indexOf(language)) { + return context; + } + + // if the language has a dependency -> load it first + if (languagesCatalog[language].require) { + context = this.loadLanguages(languagesCatalog[language].require, context); + } + + // load the language itself + var languageSource = this.loadFileSource(language); + context.Prism = this.runFileWithContext(languageSource, {Prism: context.Prism}).Prism; + context.loadedLanguages.push(language); + + return context; + }, + + + /** + * Creates a new empty prism instance + * + * @private + * @returns {Prism} + */ + createEmptyPrism: function () { + var coreSource = this.loadFileSource("core"); + var context = this.runFileWithContext(coreSource); + return context.Prism; + }, + + + /** + * Cached file sources, to prevent massive HDD work + * + * @private + * @type {Object.} + */ + fileSourceCache: {}, + + + /** + * Loads the given file source as string + * + * @private + * @param {string} name + * @returns {string} + */ + loadFileSource: function (name) { + return this.fileSourceCache[name] = this.fileSourceCache[name] || fs.readFileSync(__dirname + "/../../components/prism-" + name + ".js", "utf8"); + }, + + + /** + * Runs a VM for a given file source with the given context + * + * @private + * @param {string} fileSource + * @param {*} [context] + * + * @returns {*} + */ + runFileWithContext: function (fileSource, context) { + context = context || {}; + vm.runInNewContext(fileSource, context); + return context; + } +}; diff --git a/docs/_style/prism-master/tests/helper/test-case.js b/docs/_style/prism-master/tests/helper/test-case.js new file mode 100644 index 00000000..cbf51a95 --- /dev/null +++ b/docs/_style/prism-master/tests/helper/test-case.js @@ -0,0 +1,196 @@ +"use strict"; + +var fs = require("fs"); +var assert = require("chai").assert; +var PrismLoader = require("./prism-loader"); +var TokenStreamTransformer = require("./token-stream-transformer"); + +/** + * Handles parsing of a test case file. + * + * + * A test case file consists of at least two parts, separated by a line of dashes. + * This separation line must start at the beginning of the line and consist of at least three dashes. + * + * The test case file can either consist of two parts: + * + * {source code} + * ---- + * {expected token stream} + * + * + * or of three parts: + * + * {source code} + * ---- + * {expected token stream} + * ---- + * {text comment explaining the test case} + * + * If the file contains more than three parts, the remaining parts are just ignored. + * If the file however does not contain at least two parts (so no expected token stream), + * the test case will later be marked as failed. + * + * + * @type {{runTestCase: Function, transformCompiledTokenStream: Function, parseTestCaseFile: Function}} + */ +module.exports = { + + /** + * Runs the given test case file and asserts the result + * + * The passed language identifier can either be a language like "css" or a composed language + * identifier like "css+markup". Composed identifiers can be used for testing language inclusion. + * + * When testing language inclusion, the first given language is the main language which will be passed + * to Prism for highlighting ("css+markup" will result in a call to Prism to highlight with the "css" grammar). + * But it will be ensured, that the additional passed languages will be loaded too. + * + * The languages will be loaded in the order they were provided. + * + * @param {string} languageIdentifier + * @param {string} filePath + */ + runTestCase: function (languageIdentifier, filePath) { + var testCase = this.parseTestCaseFile(filePath); + var usedLanguages = this.parseLanguageNames(languageIdentifier); + + if (null === testCase) { + throw new Error("Test case file has invalid format (or the provided token stream is invalid JSON), please read the docs."); + } + + var Prism = PrismLoader.createInstance(usedLanguages.languages); + // the first language is the main language to highlight + var mainLanguageGrammar = Prism.languages[usedLanguages.mainLanguage]; + var env = { + code: testCase.testSource, + grammar: mainLanguageGrammar, + language: usedLanguages.mainLanguage + }; + Prism.hooks.run('before-tokenize', env); + env.tokens = Prism.tokenize(env.code, env.grammar); + Prism.hooks.run('after-tokenize', env); + var compiledTokenStream = env.tokens; + + var simplifiedTokenStream = TokenStreamTransformer.simplify(compiledTokenStream); + + var tzd = JSON.stringify( simplifiedTokenStream ); var exp = JSON.stringify( testCase.expectedTokenStream ); + var i = 0; var j = 0; var diff = ""; + while ( j < tzd.length ){ if (exp[i] != tzd[j] || i == exp.length) diff += tzd[j]; else i++; j++; } + + // var message = "\nToken Stream: \n" + JSON.stringify( simplifiedTokenStream, null, " " ) + + var message = "\nToken Stream: \n" + tzd + + "\n-----------------------------------------\n" + + "Expected Token Stream: \n" + exp + + "\n-----------------------------------------\n" + diff; + + var result = assert.deepEqual(simplifiedTokenStream, testCase.expectedTokenStream, testCase.comment + message); + }, + + + /** + * Parses the language names and finds the main language. + * + * It is either the last language or the language followed by a exclamation mark “!”. + * There should only be one language with an exclamation mark. + * + * @param {string} languageIdentifier + * + * @returns {{languages: string[], mainLanguage: string}} + */ + parseLanguageNames: function (languageIdentifier) { + var languages = languageIdentifier.split("+"); + var mainLanguage = null; + + languages = languages.map( + function (language) { + var pos = language.indexOf("!"); + + if (-1 < pos) { + if (mainLanguage) { + throw "There are multiple main languages defined."; + } + + mainLanguage = language.replace("!", ""); + return mainLanguage; + } + + return language; + } + ); + + if (!mainLanguage) { + mainLanguage = languages[languages.length-1]; + } + + return { + languages: languages, + mainLanguage: mainLanguage + }; + }, + + + /** + * Parses the test case from the given test case file + * + * @private + * @param {string} filePath + * @returns {{testSource: string, expectedTokenStream: Array.>, comment:string?}|null} + */ + parseTestCaseFile: function (filePath) { + var testCaseSource = fs.readFileSync(filePath, "utf8"); + var testCaseParts = testCaseSource.split(/^-{10,}\w*$/m); + + try { + var testCase = { + testSource: testCaseParts[0].trim(), + expectedTokenStream: JSON.parse(testCaseParts[1]), + comment: null + }; + + // if there are three parts, the third one is the comment + // explaining the test case + if (testCaseParts[2]) { + testCase.comment = testCaseParts[2].trim(); + } + + return testCase; + } + catch (e) { + // the JSON can't be parsed (e.g. it could be empty) + return null; + } + }, + + /** + * Runs the given pieces of codes and asserts their result. + * + * Code is provided as the key and expected result as the value. + * + * @param {string} languageIdentifier + * @param {object} codes + */ + runTestsWithHooks: function (languageIdentifier, codes) { + var usedLanguages = this.parseLanguageNames(languageIdentifier); + var Prism = PrismLoader.createInstance(usedLanguages.languages); + // the first language is the main language to highlight + + for (var code in codes) { + if (codes.hasOwnProperty(code)) { + var env = { + element: {}, + language: usedLanguages.mainLanguage, + grammar: Prism.languages[usedLanguages.mainLanguage], + code: code + }; + Prism.hooks.run('before-highlight', env); + env.highlightedCode = Prism.highlight(env.code, env.grammar, env.language); + Prism.hooks.run('before-insert', env); + env.element.innerHTML = env.highlightedCode; + Prism.hooks.run('after-highlight', env); + Prism.hooks.run('complete', env); + assert.equal(env.highlightedCode, codes[code]); + } + } + } +}; diff --git a/docs/_style/prism-master/tests/helper/test-discovery.js b/docs/_style/prism-master/tests/helper/test-discovery.js new file mode 100644 index 00000000..b2aade1a --- /dev/null +++ b/docs/_style/prism-master/tests/helper/test-discovery.js @@ -0,0 +1,115 @@ +"use strict"; + +var fs = require("fs"); +var path = require("path"); + + +module.exports = { + + /** + * Loads the list of all available tests + * + * @param {string} rootDir + * @returns {Object.} + */ + loadAllTests: function (rootDir) { + var testSuite = {}; + var self = this; + + this.getAllDirectories(rootDir).forEach( + function (language) { + testSuite[language] = self.getAllFiles(path.join(rootDir, language)); + } + ); + + return testSuite; + }, + + /** + * Loads the list of available tests that match the given languages + * + * @param {string} rootDir + * @param {string|string[]} languages + * @returns {Object.} + */ + loadSomeTests: function (rootDir, languages) { + var testSuite = {}; + var self = this; + + this.getSomeDirectories(rootDir, languages).forEach( + function (language) { + testSuite[language] = self.getAllFiles(path.join(rootDir, language)); + } + ); + + return testSuite; + }, + + + /** + * Returns a list of all (sub)directories (just the directory names, not full paths) + * in the given src directory + * + * @param {string} src + * @returns {Array.} + */ + getAllDirectories: function (src) { + return fs.readdirSync(src).filter( + function (file) { + return fs.statSync(path.join(src, file)).isDirectory(); + } + ); + }, + + /** + * Returns a list of all (sub)directories (just the directory names, not full paths) + * in the given src directory, matching the given languages + * + * @param {string} src + * @param {string|string[]} languages + * @returns {Array.} + */ + getSomeDirectories: function (src, languages) { + var self = this; + return fs.readdirSync(src).filter( + function (file) { + return fs.statSync(path.join(src, file)).isDirectory() && self.directoryMatches(file, languages); + } + ); + }, + + /** + * Returns whether a directory matches one of the given languages. + * @param {string} directory + * @param {string|string[]} languages + */ + directoryMatches: function (directory, languages) { + if (!Array.isArray(languages)) { + languages = [languages]; + } + var dirLanguages = directory.split(/!?\+!?/); + return dirLanguages.some(function (lang) { + return languages.indexOf(lang) >= 0; + }); + }, + + + /** + * Returns a list of all full file paths to all files in the given src directory + * + * @private + * @param {string} src + * @returns {Array.} + */ + getAllFiles: function (src) { + return fs.readdirSync(src).filter( + function (fileName) { + return fs.statSync(path.join(src, fileName)).isFile(); + } + ).map( + function (fileName) { + return path.join(src, fileName); + } + ); + } +}; diff --git a/docs/_style/prism-master/tests/helper/token-stream-transformer.js b/docs/_style/prism-master/tests/helper/token-stream-transformer.js new file mode 100644 index 00000000..deb831c4 --- /dev/null +++ b/docs/_style/prism-master/tests/helper/token-stream-transformer.js @@ -0,0 +1,32 @@ +"use strict"; + + +module.exports = { + /** + * Simplifies the token stream to ease the matching with the expected token stream. + * + * * Strings are kept as-is + * * In arrays each value is transformed individually + * * Values that are empty (empty arrays or strings only containing whitespace) + * + * + * @param {Array} tokenStream + * @returns {Array.} + */ + simplify: function (tokenStream) { + if (Array.isArray(tokenStream)) { + return tokenStream + .map(this.simplify.bind(this)) + .filter(function (value) { + return !(Array.isArray(value) && !value.length) && !(typeof value === "string" && !value.trim().length); + } + ); + } + else if (typeof tokenStream === "object") { + return [tokenStream.type, this.simplify(tokenStream.content)]; + } + else { + return tokenStream; + } + } +}; diff --git a/docs/_style/prism-master/tests/languages/abap/comment_feature.test b/docs/_style/prism-master/tests/languages/abap/comment_feature.test new file mode 100644 index 00000000..e0f28feb --- /dev/null +++ b/docs/_style/prism-master/tests/languages/abap/comment_feature.test @@ -0,0 +1,13 @@ +* +* Foobar + +---------------------------------------------------- + +[ + ["comment", "*"], + ["comment", "* Foobar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/abap/eol-comment_feature.test b/docs/_style/prism-master/tests/languages/abap/eol-comment_feature.test new file mode 100644 index 00000000..f29fc84a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/abap/eol-comment_feature.test @@ -0,0 +1,13 @@ +" +" foobar + +---------------------------------------------------- + +[ + ["eol-comment", "\""], + ["eol-comment", "\" foobar"] +] + +---------------------------------------------------- + +Checks for EOL comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/abap/keyword_feature.test b/docs/_style/prism-master/tests/languages/abap/keyword_feature.test new file mode 100644 index 00000000..0a5a94d8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/abap/keyword_feature.test @@ -0,0 +1,1801 @@ +SCIENTIFIC_WITH_LEADING_ZERO +SCALE_PRESERVING_SCIENTIFIC +RMC_COMMUNICATION_FAILURE +END-ENHANCEMENT-SECTION +MULTIPLY-CORRESPONDING +SUBTRACT-CORRESPONDING +VERIFICATION-MESSAGE +DIVIDE-CORRESPONDING +ENHANCEMENT-SECTION +CURRENCY_CONVERSION +RMC_SYSTEM_FAILURE +START-OF-SELECTION +MOVE-CORRESPONDING +RMC_INVALID_STATUS +CUSTOMER-FUNCTION +END-OF-DEFINITION +ENHANCEMENT-POINT +SYSTEM-EXCEPTIONS +ADD-CORRESPONDING +SCALE_PRESERVING +SELECTION-SCREEN +CURSOR-SELECTION +END-OF-SELECTION +LOAD-OF-PROGRAM +SCROLL-BOUNDARY +SELECTION-TABLE +EXCEPTION-TABLE +IMPLEMENTATIONS +PARAMETER-TABLE +RIGHT-JUSTIFIED +UNIT_CONVERSION +AUTHORITY-CHECK +LIST-PROCESSING +SIGN_AS_POSTFIX +COL_BACKGROUND +IMPLEMENTATION +INTERFACE-POOL +TRANSFORMATION +IDENTIFICATION +ENDENHANCEMENT +LINE-SELECTION +INITIALIZATION +LEFT-JUSTIFIED +SELECT-OPTIONS +SELECTION-SETS +COMMUNICATION +CORRESPONDING +DECIMAL_SHIFT +PRINT-CONTROL +VALUE-REQUEST +CHAIN-REQUEST +FUNCTION-POOL +FIELD-SYMBOLS +FUNCTIONALITY +INVERTED-DATE +SELECTION-SET +CLASS-METHODS +OUTPUT-LENGTH +CLASS-CODING +COL_NEGATIVE +ERRORMESSAGE +FIELD-GROUPS +HELP-REQUEST +NO-EXTENSION +NO-TOPOFPAGE +REDEFINITION +DISPLAY-MODE +ENDINTERFACE +EXIT-COMMAND +FIELD-SYMBOL +NO-SCROLLING +SHORTDUMP-ID +ACCESSPOLICY +CLASS-EVENTS +COL_POSITIVE +DECLARATIONS +ENHANCEMENTS +FILTER-TABLE +SWITCHSTATES +SYNTAX-CHECK +TRANSPORTING +ASYNCHRONOUS +SYNTAX-TRACE +TOKENIZATION +USER-COMMAND +WITH-HEADING +ABAP-SOURCE +BREAK-POINT +CHAIN-INPUT +COMPRESSION +FIXED-POINT +NEW-SECTION +NON-UNICODE +OCCURRENCES +RESPONSIBLE +SYSTEM-CALL +TRACE-TABLE +ABBREVIATED +CHAR-TO-HEX +END-OF-FILE +ENDFUNCTION +ENVIRONMENT +ASSOCIATION +COL_HEADING +EDITOR-CALL +END-OF-PAGE +ENGINEERING +IMPLEMENTED +INTENSIFIED +RADIOBUTTON +SYSTEM-EXIT +TOP-OF-PAGE +TRANSACTION +APPLICATION +CONCATENATE +DESTINATION +ENHANCEMENT +IMMEDIATELY +NO-GROUPING +PRECOMPILED +REPLACEMENT +TITLE-LINES +ACTIVATION +BYTE-ORDER +CLASS-POOL +CONNECTION +CONVERSION +DEFINITION +DEPARTMENT +EXPIRATION +INHERITING +MESSAGE-ID +NO-HEADING +PERFORMING +QUEUE-ONLY +RIGHTSPACE +SCIENTIFIC +STATUSINFO +STRUCTURES +SYNCPOINTS +WITH-TITLE +ATTRIBUTES +BOUNDARIES +CLASS-DATA +COL_NORMAL +DD/MM/YYYY +DESCENDING +INTERFACES +LINE-COUNT +MM/DD/YYYY +NON-UNIQUE +PRESERVING +SELECTIONS +STATEMENTS +SUBROUTINE +TRUNCATION +TYPE-POOLS +ARITHMETIC +BACKGROUND +ENDPROVIDE +EXCEPTIONS +IDENTIFIER +INDEX-LINE +OBLIGATORY +PARAMETERS +PERCENTAGE +PUSHBUTTON +RESOLUTION +COMPONENTS +DEALLOCATE +DISCONNECT +DUPLICATES +FIRST-LINE +HEAD-LINES +NO-DISPLAY +OCCURRENCE +RESPECTING +RETURNCODE +SUBMATCHES +TRACE-FILE +ASCENDING +BYPASSING +ENDMODULE +EXCEPTION +EXCLUDING +EXPORTING +INCREMENT +MATCHCODE +PARAMETER +PARTIALLY +PREFERRED +REFERENCE +REPLACING +RETURNING +SELECTION +SEPARATED +SPECIFIED +STATEMENT +TIMESTAMP +TYPE-POOL +ACCEPTING +APPENDAGE +ASSIGNING +COL_GROUP +COMPARING +CONSTANTS +DANGEROUS +IMPORTING +INSTANCES +LEFTSPACE +LOG-POINT +QUICKINFO +READ-ONLY +SCROLLING +SQLSCRIPT +STEP-LOOP +TOP-LINES +TRANSLATE +APPENDING +AUTHORITY +CHARACTER +COMPONENT +CONDITION +DIRECTORY +DUPLICATE +MESSAGING +RECEIVING +SUBSCREEN +ACCORDING +COL_TOTAL +END-LINES +ENDMETHOD +ENDSELECT +EXPANDING +EXTENSION +INCLUDING +INFOTYPES +INTERFACE +INTERVALS +LINE-SIZE +PF-STATUS +PROCEDURE +PROTECTED +REQUESTED +RESUMABLE +RIGHTPLUS +SAP-SPOOL +SECONDARY +STRUCTURE +SUBSTRING +TABLEVIEW +NUMOFCHAR +ADJACENT +ANALYSIS +ASSIGNED +BACKWARD +CHANNELS +CHECKBOX +CONTINUE +CRITICAL +DATAINFO +DD/MM/YY +DURATION +ENCODING +ENDCLASS +FUNCTION +LEFTPLUS +LINEFEED +MM/DD/YY +OVERFLOW +RECEIVED +SKIPPING +SORTABLE +STANDARD +SUBTRACT +SUPPRESS +TABSTRIP +TITLEBAR +TRUNCATE +UNASSIGN +WHENEVER +ANALYZER +COALESCE +COMMENTS +CONDENSE +DECIMALS +DEFERRED +ENDWHILE +EXPLICIT +KEYWORDS +MESSAGES +POSITION +PRIORITY +RECEIVER +RENAMING +TIMEZONE +TRAILING +ALLOCATE +CENTERED +CIRCULAR +CONTROLS +CURRENCY +DELETING +DESCRIBE +DISTANCE +ENDCATCH +EXPONENT +EXTENDED +GENERATE +IGNORING +INCLUDES +INTERNAL +MAJOR-ID +MODIFIER +NEW-LINE +OPTIONAL +PROPERTY +ROLLBACK +STARTING +SUPPLIED +ABSTRACT +CHANGING +CONTEXTS +CREATING +CUSTOMER +DATABASE +DAYLIGHT +DEFINING +DISTINCT +DIVISION +ENABLING +ENDCHAIN +ESCAPING +HARMLESS +IMPLICIT +INACTIVE +LANGUAGE +MINOR-ID +MULTIPLY +NEW-PAGE +NO-TITLE +POS_HIGH +SEPARATE +TEXTPOOL +TRANSFER +SELECTOR +DBMAXLEN +ITERATOR +SELECTOR +ARCHIVE +BIT-XOR +BYTE-CO +COLLECT +COMMENT +CURRENT +DEFAULT +DISPLAY +ENDFORM +EXTRACT +LEADING +LISTBOX +LOCATOR +MEMBERS +METHODS +NESTING +POS_LOW +PROCESS +PROVIDE +RAISING +RESERVE +SECONDS +SUMMARY +VISIBLE +BETWEEN +BIT-AND +BYTE-CS +CLEANUP +COMPUTE +CONTROL +CONVERT +DATASET +ENDCASE +FORWARD +HEADERS +HOTSPOT +INCLUDE +INVERSE +KEEPING +NO-ZERO +OBJECTS +OVERLAY +PADDING +PATTERN +PROGRAM +REFRESH +SECTION +SUMMING +TESTING +VERSION +WINDOWS +WITHOUT +BIT-NOT +BYTE-CA +BYTE-NA +CASTING +CONTEXT +COUNTRY +DYNAMIC +ENABLED +ENDLOOP +EXECUTE +FRIENDS +HANDLER +HEADING +INITIAL + *-INPUT +LOGFILE +MAXIMUM +MINIMUM +NO-GAPS +NO-SIGN +PRAGMAS +PRIMARY +PRIVATE +REDUCED +REPLACE +REQUEST +RESULTS +UNICODE +WARNING +ALIASES +BYTE-CN +BYTE-NS +CALLING +COL_KEY +COLUMNS +CONNECT +ENDEXEC +ENTRIES +EXCLUDE +FILTERS +FURTHER +HELP-ID +LOGICAL +MAPPING +MESSAGE +NAMETAB +OPTIONS +PACKAGE +PERFORM +RECEIVE +STATICS +VARYING +BINDING +CHARLEN +GREATER +XSTRLEN +ACCEPT +APPEND +DETAIL +ELSEIF +ENDING +ENDTRY +FORMAT +FRAMES +GIVING +HASHED +HEADER +IMPORT +INSERT +MARGIN +MODULE +NATIVE +OBJECT +OFFSET +REMOTE +RESUME +SAVING +SIMPLE +SUBMIT +TABBED +TOKENS +UNIQUE +UNPACK +UPDATE +WINDOW +YELLOW +ACTUAL +ASPECT +CENTER +CURSOR +DELETE +DIALOG +DIVIDE +DURING +ERRORS +EVENTS +EXTEND +FILTER +HANDLE +HAVING +IGNORE +LITTLE +MEMORY +NO-GAP +OCCURS +OPTION +PERSON +PLACES +PUBLIC +REDUCE +REPORT +RESULT +SINGLE +SORTED +SWITCH +SYNTAX +TARGET +VALUES +WRITER +ASSERT +BLOCKS +BOUNDS +BUFFER +CHANGE +COLUMN +COMMIT +CONCAT +COPIES +CREATE +DDMMYY +DEFINE +ENDIAN +ESCAPE +EXPAND +KERNEL +LAYOUT +LEGACY +LEVELS +MMDDYY +NUMBER +OUTPUT +RANGES +READER +RETURN +SCREEN +SEARCH +SELECT +SHARED +SOURCE +STABLE +STATIC +SUBKEY +SUFFIX +TABLES +UNWIND +YYMMDD +ASSIGN +BACKUP +BEFORE +BINARY +BIT-OR +BLANKS +CLIENT +CODING +COMMON +DEMAND +DYNPRO +EXCEPT +EXISTS +EXPORT +FIELDS +GLOBAL +GROUPS +LENGTH +LOCALE +MEDIUM +METHOD +MODIFY +NESTED +OTHERS +REJECT +SCROLL +SUPPLY +SYMBOL +ENDFOR +STRLEN +ALIGN +BEGIN +BOUND +ENDAT +ENTRY +EVENT +FINAL +FLUSH +GRANT +INNER +SHORT +USING +WRITE +AFTER +BLACK +BLOCK +CLOCK +COLOR +COUNT +DUMMY +EMPTY +ENDDO +ENDON +GREEN +INDEX +INOUT +LEAVE +LEVEL +LINES +MODIF +ORDER +OUTER +RANGE +RESET +RETRY +RIGHT +SMART +SPLIT +STYLE +TABLE +THROW +UNDER +UNTIL +UPPER +UTF-8 +WHERE +ALIAS +BLANK +CLEAR +CLOSE +EXACT +FETCH +FIRST +FOUND +GROUP +LLANG +LOCAL +OTHER +REGEX +SPOOL +TITLE +TYPES +VALID +WHILE +ALPHA +BOXED +CATCH +CHAIN +CHECK +CLASS +COVER +ENDIF +EQUIV +FIELD +FLOOR +FRAME +INPUT +LOWER +MATCH +NODES +PAGES +PRINT +RAISE +ROUND +SHIFT +SPACE +SPOTS +STAMP +STATE +TASKS +TIMES +TRMAC +ULINE +UNION +VALUE +WIDTH +EQUAL +LOG10 +TRUNC +BLOB +CASE +CEIL +CLOB +COND +EXIT +FILE +GAPS +HOLD +INCL +INTO +KEEP +KEYS +LAST +LINE +LONG +LPAD +MAIL +MODE +OPEN +PINK +READ +ROWS +TEST +THEN +ZERO +AREA +BACK +BADI +BYTE +CAST +EDIT +EXEC +FAIL +FIND +FKEQ +FONT +FREE +GKEQ +HIDE +INIT +ITNO +LATE +LOOP +MAIN +MARK +MOVE +NEXT +NULL +RISK +ROLE +UNIT +WAIT +ZONE +BASE +CALL +CODE +DATA +DATE +FKGE +GKGE +HIGH +KIND +LEFT +LIST +MASK +MESH +NAME +NODE +PACK +PAGE +POOL +SEND +SIGN +SIZE +SOME +STOP +TASK +TEXT +TIME +USER +VARY +WITH +WORD +BLUE +CONV +COPY +DEEP +ELSE +FORM +FROM +HINT +ICON +JOIN +LIKE +LOAD +ONLY +PART +SCAN +SKIP +SORT +TYPE +UNIX +VIEW +WHEN +WORK +ACOS +ASIN +ATAN +COSH +EACH +FRAC +LESS +RTTI +SINH +SQRT +TANH +AVG +BIT +DIV +ISO +LET +OUT +PAD +SQL +ALL +CI_ +CPI +END +LOB +LPI +MAX +MIN +NEW +OLE +RUN +SET +?TO +YES +ABS +ADD +AND +BIG +FOR +HDB +JOB +LOW +NOT +SAP +TRY +VIA +XML +ANY +GET +IDS +KEY +MOD +OFF +PUT +RAW +RED +REF +SUM +TAB +XSD +CNT +COS +EXP +LOG +SIN +TAN +XOR +AT +CO +CP +DO +GT +ID +IF +NS +OR +BT +CA +CS +GE +NA +NB +EQ +IN +LT +NE +NO +OF +ON +PF +TO +AS +BY +CN +IS +LE +NP +UP +E +I +M +O +Z +C +X + +---------------------------------------------------- + +[ + ["keyword", "SCIENTIFIC_WITH_LEADING_ZERO"], + ["keyword", "SCALE_PRESERVING_SCIENTIFIC"], + ["keyword", "RMC_COMMUNICATION_FAILURE"], + ["keyword", "END-ENHANCEMENT-SECTION"], + ["keyword", "MULTIPLY-CORRESPONDING"], + ["keyword", "SUBTRACT-CORRESPONDING"], + ["keyword", "VERIFICATION-MESSAGE"], + ["keyword", "DIVIDE-CORRESPONDING"], + ["keyword", "ENHANCEMENT-SECTION"], + ["keyword", "CURRENCY_CONVERSION"], + ["keyword", "RMC_SYSTEM_FAILURE"], + ["keyword", "START-OF-SELECTION"], + ["keyword", "MOVE-CORRESPONDING"], + ["keyword", "RMC_INVALID_STATUS"], + ["keyword", "CUSTOMER-FUNCTION"], + ["keyword", "END-OF-DEFINITION"], + ["keyword", "ENHANCEMENT-POINT"], + ["keyword", "SYSTEM-EXCEPTIONS"], + ["keyword", "ADD-CORRESPONDING"], + ["keyword", "SCALE_PRESERVING"], + ["keyword", "SELECTION-SCREEN"], + ["keyword", "CURSOR-SELECTION"], + ["keyword", "END-OF-SELECTION"], + ["keyword", "LOAD-OF-PROGRAM"], + ["keyword", "SCROLL-BOUNDARY"], + ["keyword", "SELECTION-TABLE"], + ["keyword", "EXCEPTION-TABLE"], + ["keyword", "IMPLEMENTATIONS"], + ["keyword", "PARAMETER-TABLE"], + ["keyword", "RIGHT-JUSTIFIED"], + ["keyword", "UNIT_CONVERSION"], + ["keyword", "AUTHORITY-CHECK"], + ["keyword", "LIST-PROCESSING"], + ["keyword", "SIGN_AS_POSTFIX"], + ["keyword", "COL_BACKGROUND"], + ["keyword", "IMPLEMENTATION"], + ["keyword", "INTERFACE-POOL"], + ["keyword", "TRANSFORMATION"], + ["keyword", "IDENTIFICATION"], + ["keyword", "ENDENHANCEMENT"], + ["keyword", "LINE-SELECTION"], + ["keyword", "INITIALIZATION"], + ["keyword", "LEFT-JUSTIFIED"], + ["keyword", "SELECT-OPTIONS"], + ["keyword", "SELECTION-SETS"], + ["keyword", "COMMUNICATION"], + ["keyword", "CORRESPONDING"], + ["keyword", "DECIMAL_SHIFT"], + ["keyword", "PRINT-CONTROL"], + ["keyword", "VALUE-REQUEST"], + ["keyword", "CHAIN-REQUEST"], + ["keyword", "FUNCTION-POOL"], + ["keyword", "FIELD-SYMBOLS"], + ["keyword", "FUNCTIONALITY"], + ["keyword", "INVERTED-DATE"], + ["keyword", "SELECTION-SET"], + ["keyword", "CLASS-METHODS"], + ["keyword", "OUTPUT-LENGTH"], + ["keyword", "CLASS-CODING"], + ["keyword", "COL_NEGATIVE"], + ["keyword", "ERRORMESSAGE"], + ["keyword", "FIELD-GROUPS"], + ["keyword", "HELP-REQUEST"], + ["keyword", "NO-EXTENSION"], + ["keyword", "NO-TOPOFPAGE"], + ["keyword", "REDEFINITION"], + ["keyword", "DISPLAY-MODE"], + ["keyword", "ENDINTERFACE"], + ["keyword", "EXIT-COMMAND"], + ["keyword", "FIELD-SYMBOL"], + ["keyword", "NO-SCROLLING"], + ["keyword", "SHORTDUMP-ID"], + ["keyword", "ACCESSPOLICY"], + ["keyword", "CLASS-EVENTS"], + ["keyword", "COL_POSITIVE"], + ["keyword", "DECLARATIONS"], + ["keyword", "ENHANCEMENTS"], + ["keyword", "FILTER-TABLE"], + ["keyword", "SWITCHSTATES"], + ["keyword", "SYNTAX-CHECK"], + ["keyword", "TRANSPORTING"], + ["keyword", "ASYNCHRONOUS"], + ["keyword", "SYNTAX-TRACE"], + ["keyword", "TOKENIZATION"], + ["keyword", "USER-COMMAND"], + ["keyword", "WITH-HEADING"], + ["keyword", "ABAP-SOURCE"], + ["keyword", "BREAK-POINT"], + ["keyword", "CHAIN-INPUT"], + ["keyword", "COMPRESSION"], + ["keyword", "FIXED-POINT"], + ["keyword", "NEW-SECTION"], + ["keyword", "NON-UNICODE"], + ["keyword", "OCCURRENCES"], + ["keyword", "RESPONSIBLE"], + ["keyword", "SYSTEM-CALL"], + ["keyword", "TRACE-TABLE"], + ["keyword", "ABBREVIATED"], + ["keyword", "CHAR-TO-HEX"], + ["keyword", "END-OF-FILE"], + ["keyword", "ENDFUNCTION"], + ["keyword", "ENVIRONMENT"], + ["keyword", "ASSOCIATION"], + ["keyword", "COL_HEADING"], + ["keyword", "EDITOR-CALL"], + ["keyword", "END-OF-PAGE"], + ["keyword", "ENGINEERING"], + ["keyword", "IMPLEMENTED"], + ["keyword", "INTENSIFIED"], + ["keyword", "RADIOBUTTON"], + ["keyword", "SYSTEM-EXIT"], + ["keyword", "TOP-OF-PAGE"], + ["keyword", "TRANSACTION"], + ["keyword", "APPLICATION"], + ["keyword", "CONCATENATE"], + ["keyword", "DESTINATION"], + ["keyword", "ENHANCEMENT"], + ["keyword", "IMMEDIATELY"], + ["keyword", "NO-GROUPING"], + ["keyword", "PRECOMPILED"], + ["keyword", "REPLACEMENT"], + ["keyword", "TITLE-LINES"], + ["keyword", "ACTIVATION"], + ["keyword", "BYTE-ORDER"], + ["keyword", "CLASS-POOL"], + ["keyword", "CONNECTION"], + ["keyword", "CONVERSION"], + ["keyword", "DEFINITION"], + ["keyword", "DEPARTMENT"], + ["keyword", "EXPIRATION"], + ["keyword", "INHERITING"], + ["keyword", "MESSAGE-ID"], + ["keyword", "NO-HEADING"], + ["keyword", "PERFORMING"], + ["keyword", "QUEUE-ONLY"], + ["keyword", "RIGHTSPACE"], + ["keyword", "SCIENTIFIC"], + ["keyword", "STATUSINFO"], + ["keyword", "STRUCTURES"], + ["keyword", "SYNCPOINTS"], + ["keyword", "WITH-TITLE"], + ["keyword", "ATTRIBUTES"], + ["keyword", "BOUNDARIES"], + ["keyword", "CLASS-DATA"], + ["keyword", "COL_NORMAL"], + ["keyword", "DD/MM/YYYY"], + ["keyword", "DESCENDING"], + ["keyword", "INTERFACES"], + ["keyword", "LINE-COUNT"], + ["keyword", "MM/DD/YYYY"], + ["keyword", "NON-UNIQUE"], + ["keyword", "PRESERVING"], + ["keyword", "SELECTIONS"], + ["keyword", "STATEMENTS"], + ["keyword", "SUBROUTINE"], + ["keyword", "TRUNCATION"], + ["keyword", "TYPE-POOLS"], + ["keyword", "ARITHMETIC"], + ["keyword", "BACKGROUND"], + ["keyword", "ENDPROVIDE"], + ["keyword", "EXCEPTIONS"], + ["keyword", "IDENTIFIER"], + ["keyword", "INDEX-LINE"], + ["keyword", "OBLIGATORY"], + ["keyword", "PARAMETERS"], + ["keyword", "PERCENTAGE"], + ["keyword", "PUSHBUTTON"], + ["keyword", "RESOLUTION"], + ["keyword", "COMPONENTS"], + ["keyword", "DEALLOCATE"], + ["keyword", "DISCONNECT"], + ["keyword", "DUPLICATES"], + ["keyword", "FIRST-LINE"], + ["keyword", "HEAD-LINES"], + ["keyword", "NO-DISPLAY"], + ["keyword", "OCCURRENCE"], + ["keyword", "RESPECTING"], + ["keyword", "RETURNCODE"], + ["keyword", "SUBMATCHES"], + ["keyword", "TRACE-FILE"], + ["keyword", "ASCENDING"], + ["keyword", "BYPASSING"], + ["keyword", "ENDMODULE"], + ["keyword", "EXCEPTION"], + ["keyword", "EXCLUDING"], + ["keyword", "EXPORTING"], + ["keyword", "INCREMENT"], + ["keyword", "MATCHCODE"], + ["keyword", "PARAMETER"], + ["keyword", "PARTIALLY"], + ["keyword", "PREFERRED"], + ["keyword", "REFERENCE"], + ["keyword", "REPLACING"], + ["keyword", "RETURNING"], + ["keyword", "SELECTION"], + ["keyword", "SEPARATED"], + ["keyword", "SPECIFIED"], + ["keyword", "STATEMENT"], + ["keyword", "TIMESTAMP"], + ["keyword", "TYPE-POOL"], + ["keyword", "ACCEPTING"], + ["keyword", "APPENDAGE"], + ["keyword", "ASSIGNING"], + ["keyword", "COL_GROUP"], + ["keyword", "COMPARING"], + ["keyword", "CONSTANTS"], + ["keyword", "DANGEROUS"], + ["keyword", "IMPORTING"], + ["keyword", "INSTANCES"], + ["keyword", "LEFTSPACE"], + ["keyword", "LOG-POINT"], + ["keyword", "QUICKINFO"], + ["keyword", "READ-ONLY"], + ["keyword", "SCROLLING"], + ["keyword", "SQLSCRIPT"], + ["keyword", "STEP-LOOP"], + ["keyword", "TOP-LINES"], + ["keyword", "TRANSLATE"], + ["keyword", "APPENDING"], + ["keyword", "AUTHORITY"], + ["keyword", "CHARACTER"], + ["keyword", "COMPONENT"], + ["keyword", "CONDITION"], + ["keyword", "DIRECTORY"], + ["keyword", "DUPLICATE"], + ["keyword", "MESSAGING"], + ["keyword", "RECEIVING"], + ["keyword", "SUBSCREEN"], + ["keyword", "ACCORDING"], + ["keyword", "COL_TOTAL"], + ["keyword", "END-LINES"], + ["keyword", "ENDMETHOD"], + ["keyword", "ENDSELECT"], + ["keyword", "EXPANDING"], + ["keyword", "EXTENSION"], + ["keyword", "INCLUDING"], + ["keyword", "INFOTYPES"], + ["keyword", "INTERFACE"], + ["keyword", "INTERVALS"], + ["keyword", "LINE-SIZE"], + ["keyword", "PF-STATUS"], + ["keyword", "PROCEDURE"], + ["keyword", "PROTECTED"], + ["keyword", "REQUESTED"], + ["keyword", "RESUMABLE"], + ["keyword", "RIGHTPLUS"], + ["keyword", "SAP-SPOOL"], + ["keyword", "SECONDARY"], + ["keyword", "STRUCTURE"], + ["keyword", "SUBSTRING"], + ["keyword", "TABLEVIEW"], + ["keyword", "NUMOFCHAR"], + ["keyword", "ADJACENT"], + ["keyword", "ANALYSIS"], + ["keyword", "ASSIGNED"], + ["keyword", "BACKWARD"], + ["keyword", "CHANNELS"], + ["keyword", "CHECKBOX"], + ["keyword", "CONTINUE"], + ["keyword", "CRITICAL"], + ["keyword", "DATAINFO"], + ["keyword", "DD/MM/YY"], + ["keyword", "DURATION"], + ["keyword", "ENCODING"], + ["keyword", "ENDCLASS"], + ["keyword", "FUNCTION"], + ["keyword", "LEFTPLUS"], + ["keyword", "LINEFEED"], + ["keyword", "MM/DD/YY"], + ["keyword", "OVERFLOW"], + ["keyword", "RECEIVED"], + ["keyword", "SKIPPING"], + ["keyword", "SORTABLE"], + ["keyword", "STANDARD"], + ["keyword", "SUBTRACT"], + ["keyword", "SUPPRESS"], + ["keyword", "TABSTRIP"], + ["keyword", "TITLEBAR"], + ["keyword", "TRUNCATE"], + ["keyword", "UNASSIGN"], + ["keyword", "WHENEVER"], + ["keyword", "ANALYZER"], + ["keyword", "COALESCE"], + ["keyword", "COMMENTS"], + ["keyword", "CONDENSE"], + ["keyword", "DECIMALS"], + ["keyword", "DEFERRED"], + ["keyword", "ENDWHILE"], + ["keyword", "EXPLICIT"], + ["keyword", "KEYWORDS"], + ["keyword", "MESSAGES"], + ["keyword", "POSITION"], + ["keyword", "PRIORITY"], + ["keyword", "RECEIVER"], + ["keyword", "RENAMING"], + ["keyword", "TIMEZONE"], + ["keyword", "TRAILING"], + ["keyword", "ALLOCATE"], + ["keyword", "CENTERED"], + ["keyword", "CIRCULAR"], + ["keyword", "CONTROLS"], + ["keyword", "CURRENCY"], + ["keyword", "DELETING"], + ["keyword", "DESCRIBE"], + ["keyword", "DISTANCE"], + ["keyword", "ENDCATCH"], + ["keyword", "EXPONENT"], + ["keyword", "EXTENDED"], + ["keyword", "GENERATE"], + ["keyword", "IGNORING"], + ["keyword", "INCLUDES"], + ["keyword", "INTERNAL"], + ["keyword", "MAJOR-ID"], + ["keyword", "MODIFIER"], + ["keyword", "NEW-LINE"], + ["keyword", "OPTIONAL"], + ["keyword", "PROPERTY"], + ["keyword", "ROLLBACK"], + ["keyword", "STARTING"], + ["keyword", "SUPPLIED"], + ["keyword", "ABSTRACT"], + ["keyword", "CHANGING"], + ["keyword", "CONTEXTS"], + ["keyword", "CREATING"], + ["keyword", "CUSTOMER"], + ["keyword", "DATABASE"], + ["keyword", "DAYLIGHT"], + ["keyword", "DEFINING"], + ["keyword", "DISTINCT"], + ["keyword", "DIVISION"], + ["keyword", "ENABLING"], + ["keyword", "ENDCHAIN"], + ["keyword", "ESCAPING"], + ["keyword", "HARMLESS"], + ["keyword", "IMPLICIT"], + ["keyword", "INACTIVE"], + ["keyword", "LANGUAGE"], + ["keyword", "MINOR-ID"], + ["keyword", "MULTIPLY"], + ["keyword", "NEW-PAGE"], + ["keyword", "NO-TITLE"], + ["keyword", "POS_HIGH"], + ["keyword", "SEPARATE"], + ["keyword", "TEXTPOOL"], + ["keyword", "TRANSFER"], + ["keyword", "SELECTOR"], + ["keyword", "DBMAXLEN"], + ["keyword", "ITERATOR"], + ["keyword", "SELECTOR"], + ["keyword", "ARCHIVE"], + ["keyword", "BIT-XOR"], + ["keyword", "BYTE-CO"], + ["keyword", "COLLECT"], + ["keyword", "COMMENT"], + ["keyword", "CURRENT"], + ["keyword", "DEFAULT"], + ["keyword", "DISPLAY"], + ["keyword", "ENDFORM"], + ["keyword", "EXTRACT"], + ["keyword", "LEADING"], + ["keyword", "LISTBOX"], + ["keyword", "LOCATOR"], + ["keyword", "MEMBERS"], + ["keyword", "METHODS"], + ["keyword", "NESTING"], + ["keyword", "POS_LOW"], + ["keyword", "PROCESS"], + ["keyword", "PROVIDE"], + ["keyword", "RAISING"], + ["keyword", "RESERVE"], + ["keyword", "SECONDS"], + ["keyword", "SUMMARY"], + ["keyword", "VISIBLE"], + ["keyword", "BETWEEN"], + ["keyword", "BIT-AND"], + ["keyword", "BYTE-CS"], + ["keyword", "CLEANUP"], + ["keyword", "COMPUTE"], + ["keyword", "CONTROL"], + ["keyword", "CONVERT"], + ["keyword", "DATASET"], + ["keyword", "ENDCASE"], + ["keyword", "FORWARD"], + ["keyword", "HEADERS"], + ["keyword", "HOTSPOT"], + ["keyword", "INCLUDE"], + ["keyword", "INVERSE"], + ["keyword", "KEEPING"], + ["keyword", "NO-ZERO"], + ["keyword", "OBJECTS"], + ["keyword", "OVERLAY"], + ["keyword", "PADDING"], + ["keyword", "PATTERN"], + ["keyword", "PROGRAM"], + ["keyword", "REFRESH"], + ["keyword", "SECTION"], + ["keyword", "SUMMING"], + ["keyword", "TESTING"], + ["keyword", "VERSION"], + ["keyword", "WINDOWS"], + ["keyword", "WITHOUT"], + ["keyword", "BIT-NOT"], + ["keyword", "BYTE-CA"], + ["keyword", "BYTE-NA"], + ["keyword", "CASTING"], + ["keyword", "CONTEXT"], + ["keyword", "COUNTRY"], + ["keyword", "DYNAMIC"], + ["keyword", "ENABLED"], + ["keyword", "ENDLOOP"], + ["keyword", "EXECUTE"], + ["keyword", "FRIENDS"], + ["keyword", "HANDLER"], + ["keyword", "HEADING"], + ["keyword", "INITIAL"], + ["keyword", "*-INPUT"], + ["keyword", "LOGFILE"], + ["keyword", "MAXIMUM"], + ["keyword", "MINIMUM"], + ["keyword", "NO-GAPS"], + ["keyword", "NO-SIGN"], + ["keyword", "PRAGMAS"], + ["keyword", "PRIMARY"], + ["keyword", "PRIVATE"], + ["keyword", "REDUCED"], + ["keyword", "REPLACE"], + ["keyword", "REQUEST"], + ["keyword", "RESULTS"], + ["keyword", "UNICODE"], + ["keyword", "WARNING"], + ["keyword", "ALIASES"], + ["keyword", "BYTE-CN"], + ["keyword", "BYTE-NS"], + ["keyword", "CALLING"], + ["keyword", "COL_KEY"], + ["keyword", "COLUMNS"], + ["keyword", "CONNECT"], + ["keyword", "ENDEXEC"], + ["keyword", "ENTRIES"], + ["keyword", "EXCLUDE"], + ["keyword", "FILTERS"], + ["keyword", "FURTHER"], + ["keyword", "HELP-ID"], + ["keyword", "LOGICAL"], + ["keyword", "MAPPING"], + ["keyword", "MESSAGE"], + ["keyword", "NAMETAB"], + ["keyword", "OPTIONS"], + ["keyword", "PACKAGE"], + ["keyword", "PERFORM"], + ["keyword", "RECEIVE"], + ["keyword", "STATICS"], + ["keyword", "VARYING"], + ["keyword", "BINDING"], + ["keyword", "CHARLEN"], + ["keyword", "GREATER"], + ["keyword", "XSTRLEN"], + ["keyword", "ACCEPT"], + ["keyword", "APPEND"], + ["keyword", "DETAIL"], + ["keyword", "ELSEIF"], + ["keyword", "ENDING"], + ["keyword", "ENDTRY"], + ["keyword", "FORMAT"], + ["keyword", "FRAMES"], + ["keyword", "GIVING"], + ["keyword", "HASHED"], + ["keyword", "HEADER"], + ["keyword", "IMPORT"], + ["keyword", "INSERT"], + ["keyword", "MARGIN"], + ["keyword", "MODULE"], + ["keyword", "NATIVE"], + ["keyword", "OBJECT"], + ["keyword", "OFFSET"], + ["keyword", "REMOTE"], + ["keyword", "RESUME"], + ["keyword", "SAVING"], + ["keyword", "SIMPLE"], + ["keyword", "SUBMIT"], + ["keyword", "TABBED"], + ["keyword", "TOKENS"], + ["keyword", "UNIQUE"], + ["keyword", "UNPACK"], + ["keyword", "UPDATE"], + ["keyword", "WINDOW"], + ["keyword", "YELLOW"], + ["keyword", "ACTUAL"], + ["keyword", "ASPECT"], + ["keyword", "CENTER"], + ["keyword", "CURSOR"], + ["keyword", "DELETE"], + ["keyword", "DIALOG"], + ["keyword", "DIVIDE"], + ["keyword", "DURING"], + ["keyword", "ERRORS"], + ["keyword", "EVENTS"], + ["keyword", "EXTEND"], + ["keyword", "FILTER"], + ["keyword", "HANDLE"], + ["keyword", "HAVING"], + ["keyword", "IGNORE"], + ["keyword", "LITTLE"], + ["keyword", "MEMORY"], + ["keyword", "NO-GAP"], + ["keyword", "OCCURS"], + ["keyword", "OPTION"], + ["keyword", "PERSON"], + ["keyword", "PLACES"], + ["keyword", "PUBLIC"], + ["keyword", "REDUCE"], + ["keyword", "REPORT"], + ["keyword", "RESULT"], + ["keyword", "SINGLE"], + ["keyword", "SORTED"], + ["keyword", "SWITCH"], + ["keyword", "SYNTAX"], + ["keyword", "TARGET"], + ["keyword", "VALUES"], + ["keyword", "WRITER"], + ["keyword", "ASSERT"], + ["keyword", "BLOCKS"], + ["keyword", "BOUNDS"], + ["keyword", "BUFFER"], + ["keyword", "CHANGE"], + ["keyword", "COLUMN"], + ["keyword", "COMMIT"], + ["keyword", "CONCAT"], + ["keyword", "COPIES"], + ["keyword", "CREATE"], + ["keyword", "DDMMYY"], + ["keyword", "DEFINE"], + ["keyword", "ENDIAN"], + ["keyword", "ESCAPE"], + ["keyword", "EXPAND"], + ["keyword", "KERNEL"], + ["keyword", "LAYOUT"], + ["keyword", "LEGACY"], + ["keyword", "LEVELS"], + ["keyword", "MMDDYY"], + ["keyword", "NUMBER"], + ["keyword", "OUTPUT"], + ["keyword", "RANGES"], + ["keyword", "READER"], + ["keyword", "RETURN"], + ["keyword", "SCREEN"], + ["keyword", "SEARCH"], + ["keyword", "SELECT"], + ["keyword", "SHARED"], + ["keyword", "SOURCE"], + ["keyword", "STABLE"], + ["keyword", "STATIC"], + ["keyword", "SUBKEY"], + ["keyword", "SUFFIX"], + ["keyword", "TABLES"], + ["keyword", "UNWIND"], + ["keyword", "YYMMDD"], + ["keyword", "ASSIGN"], + ["keyword", "BACKUP"], + ["keyword", "BEFORE"], + ["keyword", "BINARY"], + ["keyword", "BIT-OR"], + ["keyword", "BLANKS"], + ["keyword", "CLIENT"], + ["keyword", "CODING"], + ["keyword", "COMMON"], + ["keyword", "DEMAND"], + ["keyword", "DYNPRO"], + ["keyword", "EXCEPT"], + ["keyword", "EXISTS"], + ["keyword", "EXPORT"], + ["keyword", "FIELDS"], + ["keyword", "GLOBAL"], + ["keyword", "GROUPS"], + ["keyword", "LENGTH"], + ["keyword", "LOCALE"], + ["keyword", "MEDIUM"], + ["keyword", "METHOD"], + ["keyword", "MODIFY"], + ["keyword", "NESTED"], + ["keyword", "OTHERS"], + ["keyword", "REJECT"], + ["keyword", "SCROLL"], + ["keyword", "SUPPLY"], + ["keyword", "SYMBOL"], + ["keyword", "ENDFOR"], + ["keyword", "STRLEN"], + ["keyword", "ALIGN"], + ["keyword", "BEGIN"], + ["keyword", "BOUND"], + ["keyword", "ENDAT"], + ["keyword", "ENTRY"], + ["keyword", "EVENT"], + ["keyword", "FINAL"], + ["keyword", "FLUSH"], + ["keyword", "GRANT"], + ["keyword", "INNER"], + ["keyword", "SHORT"], + ["keyword", "USING"], + ["keyword", "WRITE"], + ["keyword", "AFTER"], + ["keyword", "BLACK"], + ["keyword", "BLOCK"], + ["keyword", "CLOCK"], + ["keyword", "COLOR"], + ["keyword", "COUNT"], + ["keyword", "DUMMY"], + ["keyword", "EMPTY"], + ["keyword", "ENDDO"], + ["keyword", "ENDON"], + ["keyword", "GREEN"], + ["keyword", "INDEX"], + ["keyword", "INOUT"], + ["keyword", "LEAVE"], + ["keyword", "LEVEL"], + ["keyword", "LINES"], + ["keyword", "MODIF"], + ["keyword", "ORDER"], + ["keyword", "OUTER"], + ["keyword", "RANGE"], + ["keyword", "RESET"], + ["keyword", "RETRY"], + ["keyword", "RIGHT"], + ["keyword", "SMART"], + ["keyword", "SPLIT"], + ["keyword", "STYLE"], + ["keyword", "TABLE"], + ["keyword", "THROW"], + ["keyword", "UNDER"], + ["keyword", "UNTIL"], + ["keyword", "UPPER"], + ["keyword", "UTF-8"], + ["keyword", "WHERE"], + ["keyword", "ALIAS"], + ["keyword", "BLANK"], + ["keyword", "CLEAR"], + ["keyword", "CLOSE"], + ["keyword", "EXACT"], + ["keyword", "FETCH"], + ["keyword", "FIRST"], + ["keyword", "FOUND"], + ["keyword", "GROUP"], + ["keyword", "LLANG"], + ["keyword", "LOCAL"], + ["keyword", "OTHER"], + ["keyword", "REGEX"], + ["keyword", "SPOOL"], + ["keyword", "TITLE"], + ["keyword", "TYPES"], + ["keyword", "VALID"], + ["keyword", "WHILE"], + ["keyword", "ALPHA"], + ["keyword", "BOXED"], + ["keyword", "CATCH"], + ["keyword", "CHAIN"], + ["keyword", "CHECK"], + ["keyword", "CLASS"], + ["keyword", "COVER"], + ["keyword", "ENDIF"], + ["keyword", "EQUIV"], + ["keyword", "FIELD"], + ["keyword", "FLOOR"], + ["keyword", "FRAME"], + ["keyword", "INPUT"], + ["keyword", "LOWER"], + ["keyword", "MATCH"], + ["keyword", "NODES"], + ["keyword", "PAGES"], + ["keyword", "PRINT"], + ["keyword", "RAISE"], + ["keyword", "ROUND"], + ["keyword", "SHIFT"], + ["keyword", "SPACE"], + ["keyword", "SPOTS"], + ["keyword", "STAMP"], + ["keyword", "STATE"], + ["keyword", "TASKS"], + ["keyword", "TIMES"], + ["keyword", "TRMAC"], + ["keyword", "ULINE"], + ["keyword", "UNION"], + ["keyword", "VALUE"], + ["keyword", "WIDTH"], + ["keyword", "EQUAL"], + ["keyword", "LOG10"], + ["keyword", "TRUNC"], + ["keyword", "BLOB"], + ["keyword", "CASE"], + ["keyword", "CEIL"], + ["keyword", "CLOB"], + ["keyword", "COND"], + ["keyword", "EXIT"], + ["keyword", "FILE"], + ["keyword", "GAPS"], + ["keyword", "HOLD"], + ["keyword", "INCL"], + ["keyword", "INTO"], + ["keyword", "KEEP"], + ["keyword", "KEYS"], + ["keyword", "LAST"], + ["keyword", "LINE"], + ["keyword", "LONG"], + ["keyword", "LPAD"], + ["keyword", "MAIL"], + ["keyword", "MODE"], + ["keyword", "OPEN"], + ["keyword", "PINK"], + ["keyword", "READ"], + ["keyword", "ROWS"], + ["keyword", "TEST"], + ["keyword", "THEN"], + ["keyword", "ZERO"], + ["keyword", "AREA"], + ["keyword", "BACK"], + ["keyword", "BADI"], + ["keyword", "BYTE"], + ["keyword", "CAST"], + ["keyword", "EDIT"], + ["keyword", "EXEC"], + ["keyword", "FAIL"], + ["keyword", "FIND"], + ["keyword", "FKEQ"], + ["keyword", "FONT"], + ["keyword", "FREE"], + ["keyword", "GKEQ"], + ["keyword", "HIDE"], + ["keyword", "INIT"], + ["keyword", "ITNO"], + ["keyword", "LATE"], + ["keyword", "LOOP"], + ["keyword", "MAIN"], + ["keyword", "MARK"], + ["keyword", "MOVE"], + ["keyword", "NEXT"], + ["keyword", "NULL"], + ["keyword", "RISK"], + ["keyword", "ROLE"], + ["keyword", "UNIT"], + ["keyword", "WAIT"], + ["keyword", "ZONE"], + ["keyword", "BASE"], + ["keyword", "CALL"], + ["keyword", "CODE"], + ["keyword", "DATA"], + ["keyword", "DATE"], + ["keyword", "FKGE"], + ["keyword", "GKGE"], + ["keyword", "HIGH"], + ["keyword", "KIND"], + ["keyword", "LEFT"], + ["keyword", "LIST"], + ["keyword", "MASK"], + ["keyword", "MESH"], + ["keyword", "NAME"], + ["keyword", "NODE"], + ["keyword", "PACK"], + ["keyword", "PAGE"], + ["keyword", "POOL"], + ["keyword", "SEND"], + ["keyword", "SIGN"], + ["keyword", "SIZE"], + ["keyword", "SOME"], + ["keyword", "STOP"], + ["keyword", "TASK"], + ["keyword", "TEXT"], + ["keyword", "TIME"], + ["keyword", "USER"], + ["keyword", "VARY"], + ["keyword", "WITH"], + ["keyword", "WORD"], + ["keyword", "BLUE"], + ["keyword", "CONV"], + ["keyword", "COPY"], + ["keyword", "DEEP"], + ["keyword", "ELSE"], + ["keyword", "FORM"], + ["keyword", "FROM"], + ["keyword", "HINT"], + ["keyword", "ICON"], + ["keyword", "JOIN"], + ["keyword", "LIKE"], + ["keyword", "LOAD"], + ["keyword", "ONLY"], + ["keyword", "PART"], + ["keyword", "SCAN"], + ["keyword", "SKIP"], + ["keyword", "SORT"], + ["keyword", "TYPE"], + ["keyword", "UNIX"], + ["keyword", "VIEW"], + ["keyword", "WHEN"], + ["keyword", "WORK"], + ["keyword", "ACOS"], + ["keyword", "ASIN"], + ["keyword", "ATAN"], + ["keyword", "COSH"], + ["keyword", "EACH"], + ["keyword", "FRAC"], + ["keyword", "LESS"], + ["keyword", "RTTI"], + ["keyword", "SINH"], + ["keyword", "SQRT"], + ["keyword", "TANH"], + ["keyword", "AVG"], + ["keyword", "BIT"], + ["keyword", "DIV"], + ["keyword", "ISO"], + ["keyword", "LET"], + ["keyword", "OUT"], + ["keyword", "PAD"], + ["keyword", "SQL"], + ["keyword", "ALL"], + ["keyword", "CI_"], + ["keyword", "CPI"], + ["keyword", "END"], + ["keyword", "LOB"], + ["keyword", "LPI"], + ["keyword", "MAX"], + ["keyword", "MIN"], + ["keyword", "NEW"], + ["keyword", "OLE"], + ["keyword", "RUN"], + ["keyword", "SET"], + ["keyword", "?TO"], + ["keyword", "YES"], + ["keyword", "ABS"], + ["keyword", "ADD"], + ["keyword", "AND"], + ["keyword", "BIG"], + ["keyword", "FOR"], + ["keyword", "HDB"], + ["keyword", "JOB"], + ["keyword", "LOW"], + ["keyword", "NOT"], + ["keyword", "SAP"], + ["keyword", "TRY"], + ["keyword", "VIA"], + ["keyword", "XML"], + ["keyword", "ANY"], + ["keyword", "GET"], + ["keyword", "IDS"], + ["keyword", "KEY"], + ["keyword", "MOD"], + ["keyword", "OFF"], + ["keyword", "PUT"], + ["keyword", "RAW"], + ["keyword", "RED"], + ["keyword", "REF"], + ["keyword", "SUM"], + ["keyword", "TAB"], + ["keyword", "XSD"], + ["keyword", "CNT"], + ["keyword", "COS"], + ["keyword", "EXP"], + ["keyword", "LOG"], + ["keyword", "SIN"], + ["keyword", "TAN"], + ["keyword", "XOR"], + ["keyword", "AT"], + ["keyword", "CO"], + ["keyword", "CP"], + ["keyword", "DO"], + ["keyword", "GT"], + ["keyword", "ID"], + ["keyword", "IF"], + ["keyword", "NS"], + ["keyword", "OR"], + ["keyword", "BT"], + ["keyword", "CA"], + ["keyword", "CS"], + ["keyword", "GE"], + ["keyword", "NA"], + ["keyword", "NB"], + ["keyword", "EQ"], + ["keyword", "IN"], + ["keyword", "LT"], + ["keyword", "NE"], + ["keyword", "NO"], + ["keyword", "OF"], + ["keyword", "ON"], + ["keyword", "PF"], + ["keyword", "TO"], + ["keyword", "AS"], + ["keyword", "BY"], + ["keyword", "CN"], + ["keyword", "IS"], + ["keyword", "LE"], + ["keyword", "NP"], + ["keyword", "UP"], + ["keyword", "E"], + ["keyword", "I"], + ["keyword", "M"], + ["keyword", "O"], + ["keyword", "Z"], + ["keyword", "C"], + ["keyword", "X"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/abap/number_feature.test b/docs/_style/prism-master/tests/languages/abap/number_feature.test new file mode 100644 index 00000000..0c9556e7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/abap/number_feature.test @@ -0,0 +1,15 @@ +0 +42 +123456789 + +---------------------------------------------------- + +[ + ["number", "0"], + ["number", "42"], + ["number", "123456789"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/abap/operator_feature.test b/docs/_style/prism-master/tests/languages/abap/operator_feature.test new file mode 100644 index 00000000..23cb4a04 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/abap/operator_feature.test @@ -0,0 +1,38 @@ +. ++ - +/ * ** +< > <= >= += ?= <> + +& && + +a-b +a~b +a->b +a=>b +a|b +a{b}c + +---------------------------------------------------- + +[ + ["punctuation", "."], + ["operator", "+"], ["operator", "-"], + ["operator", "/"], ["operator", "*"], ["operator", "**"], + ["operator", "<"], ["operator", ">"], ["operator", "<="], ["operator", ">="], + ["operator", "="], ["operator", "?="], ["operator", "<>"], + + ["string-operator", "&"], ["string-operator", "&&"], + + "\r\n\r\na", ["token-operator", "-"], + "b\r\na", ["token-operator", "~"], + "b\r\na", ["token-operator", "->"], + "b\r\na", ["token-operator", "=>"], + "b\r\na", ["token-operator", "|"], + "b\r\na", ["token-operator", "{"], "b", ["token-operator", "}"], "c" +] + +---------------------------------------------------- + +Checks for operators, string-operators and token-operators. +The leading dot serves only because tests are trimmed. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/abap/string-template_feature.test b/docs/_style/prism-master/tests/languages/abap/string-template_feature.test new file mode 100644 index 00000000..7979fbef --- /dev/null +++ b/docs/_style/prism-master/tests/languages/abap/string-template_feature.test @@ -0,0 +1,17 @@ +|foobar| +|foo\|b\{a}r| +|foo { bar } baz| + +---------------------------------------------------- + +[ + ["token-operator", "|"], ["string-template", "foobar"], ["token-operator", "|"], + ["token-operator", "|"], ["string-template", "foo\\|b\\{a}r"], ["token-operator", "|"], + ["token-operator", "|"], ["string-template", "foo "], ["token-operator", "{"], + " bar ", + ["token-operator", "}"], ["string-template", " baz"], ["token-operator", "|"] +] + +---------------------------------------------------- + +Checks for string templates. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/abap/string_feature.test b/docs/_style/prism-master/tests/languages/abap/string_feature.test new file mode 100644 index 00000000..808b0271 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/abap/string_feature.test @@ -0,0 +1,21 @@ +'' +'foo' +'foo\'bar' +`` +`foo` +`foo\`bar` + +---------------------------------------------------- + +[ + ["string", "''"], + ["string", "'foo'"], + ["string", "'foo\\'bar'"], + ["string", "``"], + ["string", "`foo`"], + ["string", "`foo\\`bar`"] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/actionscript/keyword_feature.test b/docs/_style/prism-master/tests/languages/actionscript/keyword_feature.test new file mode 100644 index 00000000..c41a8524 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/actionscript/keyword_feature.test @@ -0,0 +1,71 @@ +as; break; case; catch; class; +const; default; delete; do; else; +extends; finally; for; function; if; +implements; import; in; instanceof; interface; +internal; is; native; new; null; +package; private; protected; public; return; +super; switch; this; throw; try; +typeof; use; var; void; while; +with; dynamic; each; final; get; +include; namespace; native; override; set; +static; + +---------------------------------------------------- + +[ + ["keyword", "as"], ["punctuation", ";"], + ["keyword", "break"], ["punctuation", ";"], + ["keyword", "case"], ["punctuation", ";"], + ["keyword", "catch"], ["punctuation", ";"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "const"], ["punctuation", ";"], + ["keyword", "default"], ["punctuation", ";"], + ["keyword", "delete"], ["punctuation", ";"], + ["keyword", "do"], ["punctuation", ";"], + ["keyword", "else"], ["punctuation", ";"], + ["keyword", "extends"], ["punctuation", ";"], + ["keyword", "finally"], ["punctuation", ";"], + ["keyword", "for"], ["punctuation", ";"], + ["keyword", "function"], ["punctuation", ";"], + ["keyword", "if"], ["punctuation", ";"], + ["keyword", "implements"], ["punctuation", ";"], + ["keyword", "import"], ["punctuation", ";"], + ["keyword", "in"], ["punctuation", ";"], + ["keyword", "instanceof"], ["punctuation", ";"], + ["keyword", "interface"], ["punctuation", ";"], + ["keyword", "internal"], ["punctuation", ";"], + ["keyword", "is"], ["punctuation", ";"], + ["keyword", "native"], ["punctuation", ";"], + ["keyword", "new"], ["punctuation", ";"], + ["keyword", "null"], ["punctuation", ";"], + ["keyword", "package"], ["punctuation", ";"], + ["keyword", "private"], ["punctuation", ";"], + ["keyword", "protected"], ["punctuation", ";"], + ["keyword", "public"], ["punctuation", ";"], + ["keyword", "return"], ["punctuation", ";"], + ["keyword", "super"], ["punctuation", ";"], + ["keyword", "switch"], ["punctuation", ";"], + ["keyword", "this"], ["punctuation", ";"], + ["keyword", "throw"], ["punctuation", ";"], + ["keyword", "try"], ["punctuation", ";"], + ["keyword", "typeof"], ["punctuation", ";"], + ["keyword", "use"], ["punctuation", ";"], + ["keyword", "var"], ["punctuation", ";"], + ["keyword", "void"], ["punctuation", ";"], + ["keyword", "while"], ["punctuation", ";"], + ["keyword", "with"], ["punctuation", ";"], + ["keyword", "dynamic"], ["punctuation", ";"], + ["keyword", "each"], ["punctuation", ";"], + ["keyword", "final"], ["punctuation", ";"], + ["keyword", "get"], ["punctuation", ";"], + ["keyword", "include"], ["punctuation", ";"], + ["keyword", "namespace"], ["punctuation", ";"], + ["keyword", "native"], ["punctuation", ";"], + ["keyword", "override"], ["punctuation", ";"], + ["keyword", "set"], ["punctuation", ";"], + ["keyword", "static"], ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/actionscript/operator_feature.test b/docs/_style/prism-master/tests/languages/actionscript/operator_feature.test new file mode 100644 index 00000000..14c007c7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/actionscript/operator_feature.test @@ -0,0 +1,29 @@ ++ - * / % ^ ++= -= *= /= %= ^= +& && | || +&= &&= |= ||= +< << > >> >>> +<= <<= >= >>= >>>= +! != = == +!== === +~ ? @ +++ -- + +---------------------------------------------------- + +[ + ["operator", "+"], ["operator", "-"], ["operator", "*"], ["operator", "/"], ["operator", "%"], ["operator", "^"], + ["operator", "+="], ["operator", "-="], ["operator", "*="], ["operator", "/="], ["operator", "%="], ["operator", "^="], + ["operator", "&"], ["operator", "&&"], ["operator", "|"], ["operator", "||"], + ["operator", "&="], ["operator", "&&="], ["operator", "|="], ["operator", "||="], + ["operator", "<"], ["operator", "<<"], ["operator", ">"], ["operator", ">>"], ["operator", ">>>"], + ["operator", "<="], ["operator", "<<="], ["operator", ">="], ["operator", ">>="], ["operator", ">>>="], + ["operator", "!"], ["operator", "!="], ["operator", "="], ["operator", "=="], + ["operator", "!=="], ["operator", "==="], + ["operator", "~"], ["operator", "?"], ["operator", "@"], + ["operator", "++"], ["operator", "--"] +] + +---------------------------------------------------- + +Checks for all operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ada/attr-name_feature.test b/docs/_style/prism-master/tests/languages/ada/attr-name_feature.test new file mode 100644 index 00000000..c30a2f57 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ada/attr-name_feature.test @@ -0,0 +1,13 @@ +Integer'Size +Character'Val + +---------------------------------------------------- + +[ + ["variable", "Integer"], ["attr-name", "'Size"], + ["variable", "Character"], ["attr-name", "'Val"] +] + +---------------------------------------------------- + +Checks for attributes. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ada/boolean_feature.test b/docs/_style/prism-master/tests/languages/ada/boolean_feature.test new file mode 100644 index 00000000..4019c444 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ada/boolean_feature.test @@ -0,0 +1,13 @@ +true +false + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ada/char_feature.test b/docs/_style/prism-master/tests/languages/ada/char_feature.test new file mode 100644 index 00000000..145f2cee --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ada/char_feature.test @@ -0,0 +1,13 @@ +'f' +'A' + +---------------------------------------------------- + +[ + ["char", "'f'"], + ["char", "'A'"] +] + +---------------------------------------------------- + +Checks for chars. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ada/comment_feature.test b/docs/_style/prism-master/tests/languages/ada/comment_feature.test new file mode 100644 index 00000000..adf3e0ce --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ada/comment_feature.test @@ -0,0 +1,13 @@ +-- +-- Foo bar + +---------------------------------------------------- + +[ + ["comment", "--"], + ["comment", "-- Foo bar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ada/keyword_feature.test b/docs/_style/prism-master/tests/languages/ada/keyword_feature.test new file mode 100644 index 00000000..e5c815f2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ada/keyword_feature.test @@ -0,0 +1,153 @@ +abort +abs +abstract +accept +access +aliased +all +and +array +at +begin +body +case +constant +declare +delay +delta +digits +do +else +new +return +elsif +end +entry +exception +exit +for +function +generic +goto +if +in +interface +is +limited +loop +mod +not +null +of +others +out +overriding +package +pragma +private +procedure +protected +raise +range +record +rem +renames +requeue +reverse +select +separate +some +subtype +synchronized +tagged +task +terminate +then +type +until +use +when +while +with +xor + +---------------------------------------------------- + +[ + ["keyword", "abort"], + ["keyword", "abs"], + ["keyword", "abstract"], + ["keyword", "accept"], + ["keyword", "access"], + ["keyword", "aliased"], + ["keyword", "all"], + ["keyword", "and"], + ["keyword", "array"], + ["keyword", "at"], + ["keyword", "begin"], + ["keyword", "body"], + ["keyword", "case"], + ["keyword", "constant"], + ["keyword", "declare"], + ["keyword", "delay"], + ["keyword", "delta"], + ["keyword", "digits"], + ["keyword", "do"], + ["keyword", "else"], + ["keyword", "new"], + ["keyword", "return"], + ["keyword", "elsif"], + ["keyword", "end"], + ["keyword", "entry"], + ["keyword", "exception"], + ["keyword", "exit"], + ["keyword", "for"], + ["keyword", "function"], + ["keyword", "generic"], + ["keyword", "goto"], + ["keyword", "if"], + ["keyword", "in"], + ["keyword", "interface"], + ["keyword", "is"], + ["keyword", "limited"], + ["keyword", "loop"], + ["keyword", "mod"], + ["keyword", "not"], + ["keyword", "null"], + ["keyword", "of"], + ["keyword", "others"], + ["keyword", "out"], + ["keyword", "overriding"], + ["keyword", "package"], + ["keyword", "pragma"], + ["keyword", "private"], + ["keyword", "procedure"], + ["keyword", "protected"], + ["keyword", "raise"], + ["keyword", "range"], + ["keyword", "record"], + ["keyword", "rem"], + ["keyword", "renames"], + ["keyword", "requeue"], + ["keyword", "reverse"], + ["keyword", "select"], + ["keyword", "separate"], + ["keyword", "some"], + ["keyword", "subtype"], + ["keyword", "synchronized"], + ["keyword", "tagged"], + ["keyword", "task"], + ["keyword", "terminate"], + ["keyword", "then"], + ["keyword", "type"], + ["keyword", "until"], + ["keyword", "use"], + ["keyword", "when"], + ["keyword", "while"], + ["keyword", "with"], + ["keyword", "xor"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ada/number_feature.test b/docs/_style/prism-master/tests/languages/ada/number_feature.test new file mode 100644 index 00000000..a27f1af8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ada/number_feature.test @@ -0,0 +1,21 @@ +42 +42_000 +3.14_15_9 +0.4E+123_456 +3.7e-7 +1_6#Bad_Face#E-32_1 + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "42_000"], + ["number", "3.14_15_9"], + ["number", "0.4E+123_456"], + ["number", "3.7e-7"], + ["number", "1_6#Bad_Face#E-32_1"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ada/operator_feature.test b/docs/_style/prism-master/tests/languages/ada/operator_feature.test new file mode 100644 index 00000000..21a31374 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ada/operator_feature.test @@ -0,0 +1,23 @@ +<> +=> := +< <= +> >= += /= +& + - +* ** / + +---------------------------------------------------- + +[ + ["operator", "<>"], + ["operator", "=>"], ["operator", ":="], + ["operator", "<"], ["operator", "<="], + ["operator", ">"], ["operator", ">="], + ["operator", "="], ["operator", "/="], + ["operator", "&"], ["operator", "+"], ["operator", "-"], + ["operator", "*"], ["operator", "**"], ["operator", "/"] +] + +---------------------------------------------------- + +Checks for operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ada/string_feature.test b/docs/_style/prism-master/tests/languages/ada/string_feature.test new file mode 100644 index 00000000..c44e9cd0 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ada/string_feature.test @@ -0,0 +1,13 @@ +"" +"Foo""bar""" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"Foo\"\"bar\"\"\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ada/variable_feature.test b/docs/_style/prism-master/tests/languages/ada/variable_feature.test new file mode 100644 index 00000000..f47a4fc4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ada/variable_feature.test @@ -0,0 +1,13 @@ +Byte +foo_bar42 + +---------------------------------------------------- + +[ + ["variable", "Byte"], + ["variable", "foo_bar42"] +] + +---------------------------------------------------- + +Checks for variables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apacheconf/comment_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/comment_feature.test new file mode 100644 index 00000000..bde22880 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apacheconf/comment_feature.test @@ -0,0 +1,15 @@ +#foo +# bar +# Redirect 301 /2006/oldfile.html http://subdomain.domain.tld/newfile.html + +---------------------------------------------------- + +[ + ["comment", "#foo"], + ["comment", "# bar"], + ["comment", "# Redirect 301 /2006/oldfile.html http://subdomain.domain.tld/newfile.html"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apacheconf/directive-block_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/directive-block_feature.test new file mode 100644 index 00000000..1af6addd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apacheconf/directive-block_feature.test @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +---------------------------------------------------- + +[ + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "AuthnProviderAlias" + ]], + ["directive-block-parameter", [ + " file file2" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "AuthzProviderAlias" + ]], + ["directive-block-parameter", [ + " ldap-group ldap-group-alias1 ", + ["string", [ + "\"cn=my-group,o=ctx\"" + ]] + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "Directory" + ]], + ["directive-block-parameter", [ + ["string", [ + "\"/webpages/secure\"" + ]] + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "DirectoryMatch" + ]], + ["directive-block-parameter", [ + ["string", [ + "\"^/www/(.+/)?[0-9]{3}\"" + ]] + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "Else" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "ElseIf" + ]], + ["directive-block-parameter", [ + ["string", [ + "\"-R '10.0.0.0/8'\"" + ]] + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "Files" + ]], + ["directive-block-parameter", [ + " ~ ", + ["string", [ + "\"\\.(gif|jpe?g|png)$\"" + ]] + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "FilesMatch" + ]], + ["directive-block-parameter", [ + ["string", [ + "\".+\\.(gif|jpe?g|png)$\"" + ]] + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "If" + ]], + ["directive-block-parameter", [ + ["string", [ + "\"-z req('Host')\"" + ]] + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "IfDefine" + ]], + ["directive-block-parameter", [ + " !MemCache" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "IfModule" + ]], + ["directive-block-parameter", [ + " mod_rewrite.c" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "IfVersion" + ]], + ["directive-block-parameter", [ + " 2.1.0" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "Limit" + ]], + ["directive-block-parameter", [ + " POST PUT DELETE" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "LimitExcept" + ]], + ["directive-block-parameter", [ + " POST GET" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "Location" + ]], + ["directive-block-parameter", [ + " /private1" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "LocationMatch" + ]], + ["directive-block-parameter", [ + ["string", [ + "\"/(extra|special)/data\"" + ]] + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "Macro" + ]], + ["directive-block-parameter", [ + " LocalAccessPolicy" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "Proxy" + ]], + ["directive-block-parameter", [ + ["string", [ + "\"*\"" + ]] + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "RequireAll" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "RequireAny" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "RequireNone" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]], + + ["directive-block", [ + ["directive-block", [ + ["punctuation", "<"], + "VirtualHost" + ]], + ["directive-block-parameter", [ + " [2001", + ["punctuation", ":"], + "db8", + ["punctuation", ":"], + ["punctuation", ":"], + "a00", + ["punctuation", ":"], + "20ff", + ["punctuation", ":"], + "fea7", + ["punctuation", ":"], + "ccea]", + ["punctuation", ":"], + "80" + ]], + ["punctuation", ">"] + ]], + ["directive-block", [ + ["directive-block", [ + ["punctuation", ""] + ]] +] + +---------------------------------------------------- + +Checks for directive blocks. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apacheconf/directive-flags_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/directive-flags_feature.test new file mode 100644 index 00000000..0bb206ec --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apacheconf/directive-flags_feature.test @@ -0,0 +1,13 @@ +[OR] +[L,QSA] + +---------------------------------------------------- + +[ + ["directive-flags", "[OR]"], + ["directive-flags", "[L,QSA]"] +] + +---------------------------------------------------- + +Checks for directive flags. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apacheconf/directive-inline_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/directive-inline_feature.test new file mode 100644 index 00000000..6b4df43b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apacheconf/directive-inline_feature.test @@ -0,0 +1,1163 @@ +AcceptFilter +AcceptPathInfo +AccessFileName +Action +AddAlt +AddAltByEncoding +AddAltByType +AddCharset +AddDefaultCharset +AddDescription +AddEncoding +AddHandler +AddIcon +AddIconByEncoding +AddIconByType +AddInputFilter +AddLanguage +AddModuleInfo +AddOutputFilter +AddOutputFilterByType +AddType +Alias +AliasMatch +Allow +AllowCONNECT +AllowEncodedSlashes +AllowMethods +AllowOverride +AllowOverrideList +Anonymous +Anonymous_LogEmail +Anonymous_MustGiveEmail +Anonymous_NoUserID +Anonymous_VerifyEmail +AsyncRequestWorkerFactor +AuthBasicAuthoritative +AuthBasicFake +AuthBasicProvider +AuthBasicUseDigestAlgorithm +AuthDBDUserPWQuery +AuthDBDUserRealmQuery +AuthDBMGroupFile +AuthDBMType +AuthDBMUserFile +AuthDigestAlgorithm +AuthDigestDomain +AuthDigestNonceLifetime +AuthDigestProvider +AuthDigestQop +AuthDigestShmemSize +AuthFormAuthoritative +AuthFormBody +AuthFormDisableNoStore +AuthFormFakeBasicAuth +AuthFormLocation +AuthFormLoginRequiredLocation +AuthFormLoginSuccessLocation +AuthFormLogoutLocation +AuthFormMethod +AuthFormMimetype +AuthFormPassword +AuthFormProvider +AuthFormSitePassphrase +AuthFormSize +AuthFormUsername +AuthGroupFile +AuthLDAPAuthorizePrefix +AuthLDAPBindAuthoritative +AuthLDAPBindDN +AuthLDAPBindPassword +AuthLDAPCharsetConfig +AuthLDAPCompareAsUser +AuthLDAPCompareDNOnServer +AuthLDAPDereferenceAliases +AuthLDAPGroupAttribute +AuthLDAPGroupAttributeIsDN +AuthLDAPInitialBindAsUser +AuthLDAPInitialBindPattern +AuthLDAPMaxSubGroupDepth +AuthLDAPRemoteUserAttribute +AuthLDAPRemoteUserIsDN +AuthLDAPSearchAsUser +AuthLDAPSubGroupAttribute +AuthLDAPSubGroupClass +AuthLDAPUrl +AuthMerging +AuthName +AuthnCacheContext +AuthnCacheEnable +AuthnCacheProvideFor +AuthnCacheSOCache +AuthnCacheTimeout +AuthnzFcgiCheckAuthnProvider +AuthnzFcgiDefineProvider +AuthType +AuthUserFile +AuthzDBDLoginToReferer +AuthzDBDQuery +AuthzDBDRedirectQuery +AuthzDBMType +AuthzSendForbiddenOnFailure +BalancerGrowth +BalancerInherit +BalancerMember +BalancerPersist +BrowserMatch +BrowserMatchNoCase +BufferedLogs +BufferSize +CacheDefaultExpire +CacheDetailHeader +CacheDirLength +CacheDirLevels +CacheDisable +CacheEnable +CacheFile +CacheHeader +CacheIgnoreCacheControl +CacheIgnoreHeaders +CacheIgnoreNoLastMod +CacheIgnoreQueryString +CacheIgnoreURLSessionIdentifiers +CacheKeyBaseURL +CacheLastModifiedFactor +CacheLock +CacheLockMaxAge +CacheLockPath +CacheMaxExpire +CacheMaxFileSize +CacheMinExpire +CacheMinFileSize +CacheNegotiatedDocs +CacheQuickHandler +CacheReadSize +CacheReadTime +CacheRoot +CacheSocache +CacheSocacheMaxSize +CacheSocacheMaxTime +CacheSocacheMinTime +CacheSocacheReadSize +CacheSocacheReadTime +CacheStaleOnError +CacheStoreExpired +CacheStoreNoStore +CacheStorePrivate +CGIDScriptTimeout +CGIMapExtension +CharsetDefault +CharsetOptions +CharsetSourceEnc +CheckCaseOnly +CheckSpelling +ChrootDir +ContentDigest +CookieDomain +CookieExpires +CookieName +CookieStyle +CookieTracking +CoreDumpDirectory +CustomLog +Dav +DavDepthInfinity +DavGenericLockDB +DavLockDB +DavMinTimeout +DBDExptime +DBDInitSQL +DBDKeep +DBDMax +DBDMin +DBDParams +DBDPersist +DBDPrepareSQL +DBDriver +DefaultIcon +DefaultLanguage +DefaultRuntimeDir +DefaultType +Define +DeflateBufferSize +DeflateCompressionLevel +DeflateFilterNote +DeflateInflateLimitRequestBody +DeflateInflateRatioBurst +DeflateInflateRatioLimit +DeflateMemLevel +DeflateWindowSize +Deny +DirectoryCheckHandler +DirectoryIndex +DirectoryIndexRedirect +DirectorySlash +DocumentRoot +DTracePrivileges +DumpIOInput +DumpIOOutput +EnableExceptionHook +EnableMMAP +EnableSendfile +Error +ErrorDocument +ErrorLog +ErrorLogFormat +Example +ExpiresActive +ExpiresByType +ExpiresDefault +ExtendedStatus +ExtFilterDefine +ExtFilterOptions +FallbackResource +FileETag +FilterChain +FilterDeclare +FilterProtocol +FilterProvider +FilterTrace +ForceLanguagePriority +ForceType +ForensicLog +GprofDir +GracefulShutdownTimeout +Group +Header +HeaderName +HeartbeatAddress +HeartbeatListen +HeartbeatMaxServers +HeartbeatStorage +HeartbeatStorage +HostnameLookups +IdentityCheck +IdentityCheckTimeout +ImapBase +ImapDefault +ImapMenu +Include +IncludeOptional +IndexHeadInsert +IndexIgnore +IndexIgnoreReset +IndexOptions +IndexOrderDefault +IndexStyleSheet +InputSed +ISAPIAppendLogToErrors +ISAPIAppendLogToQuery +ISAPICacheFile +ISAPIFakeAsync +ISAPILogNotSupported +ISAPIReadAheadBuffer +KeepAlive +KeepAliveTimeout +KeptBodySize +LanguagePriority +LDAPCacheEntries +LDAPCacheTTL +LDAPConnectionPoolTTL +LDAPConnectionTimeout +LDAPLibraryDebug +LDAPOpCacheEntries +LDAPOpCacheTTL +LDAPReferralHopLimit +LDAPReferrals +LDAPRetries +LDAPRetryDelay +LDAPSharedCacheFile +LDAPSharedCacheSize +LDAPTimeout +LDAPTrustedClientCert +LDAPTrustedGlobalCert +LDAPTrustedMode +LDAPVerifyServerCert +LimitInternalRecursion +LimitRequestBody +LimitRequestFields +LimitRequestFieldSize +LimitRequestLine +LimitXMLRequestBody +Listen +ListenBackLog +LoadFile +LoadModule +LogFormat +LogLevel +LogMessage +LuaAuthzProvider +LuaCodeCache +LuaHookAccessChecker +LuaHookAuthChecker +LuaHookCheckUserID +LuaHookFixups +LuaHookInsertFilter +LuaHookLog +LuaHookMapToStorage +LuaHookTranslateName +LuaHookTypeChecker +LuaInherit +LuaInputFilter +LuaMapHandler +LuaOutputFilter +LuaPackageCPath +LuaPackagePath +LuaQuickHandler +LuaRoot +LuaScope +MaxConnectionsPerChild +MaxKeepAliveRequests +MaxMemFree +MaxRangeOverlaps +MaxRangeReversals +MaxRanges +MaxRequestWorkers +MaxSpareServers +MaxSpareThreads +MaxThreads +MergeTrailers +MetaDir +MetaFiles +MetaSuffix +MimeMagicFile +MinSpareServers +MinSpareThreads +MMapFile +ModemStandard +ModMimeUsePathInfo +MultiviewsMatch +Mutex +NameVirtualHost +NoProxy +NWSSLTrustedCerts +NWSSLUpgradeable +Options +Order +OutputSed +PassEnv +PidFile +PrivilegesMode +Protocol +ProtocolEcho +ProxyAddHeaders +ProxyBadHeader +ProxyBlock +ProxyDomain +ProxyErrorOverride +ProxyExpressDBMFile +ProxyExpressDBMType +ProxyExpressEnable +ProxyFtpDirCharset +ProxyFtpEscapeWildcards +ProxyFtpListOnWildcard +ProxyHTMLBufSize +ProxyHTMLCharsetOut +ProxyHTMLDocType +ProxyHTMLEnable +ProxyHTMLEvents +ProxyHTMLExtended +ProxyHTMLFixups +ProxyHTMLInterp +ProxyHTMLLinks +ProxyHTMLMeta +ProxyHTMLStripComments +ProxyHTMLURLMap +ProxyIOBufferSize +ProxyMaxForwards +ProxyPass +ProxyPassInherit +ProxyPassInterpolateEnv +ProxyPassMatch +ProxyPassReverse +ProxyPassReverseCookieDomain +ProxyPassReverseCookiePath +ProxyPreserveHost +ProxyReceiveBufferSize +ProxyRemote +ProxyRemoteMatch +ProxyRequests +ProxySCGIInternalRedirect +ProxySCGISendfile +ProxySet +ProxySourceAddress +ProxyStatus +ProxyTimeout +ProxyVia +ReadmeName +ReceiveBufferSize +Redirect +RedirectMatch +RedirectPermanent +RedirectTemp +ReflectorHeader +RemoteIPHeader +RemoteIPInternalProxy +RemoteIPInternalProxyList +RemoteIPProxiesHeader +RemoteIPTrustedProxy +RemoteIPTrustedProxyList +RemoveCharset +RemoveEncoding +RemoveHandler +RemoveInputFilter +RemoveLanguage +RemoveOutputFilter +RemoveType +RequestHeader +RequestReadTimeout +Require +RewriteBase +RewriteCond +RewriteEngine +RewriteMap +RewriteOptions +RewriteRule +RLimitCPU +RLimitMEM +RLimitNPROC +Satisfy +ScoreBoardFile +Script +ScriptAlias +ScriptAliasMatch +ScriptInterpreterSource +ScriptLog +ScriptLogBuffer +ScriptLogLength +ScriptSock +SecureListen +SeeRequestTail +SendBufferSize +ServerAdmin +ServerAlias +ServerLimit +ServerName +ServerPath +ServerRoot +ServerSignature +ServerTokens +Session +SessionCookieName +SessionCookieName2 +SessionCookieRemove +SessionCryptoCipher +SessionCryptoDriver +SessionCryptoPassphrase +SessionCryptoPassphraseFile +SessionDBDCookieName +SessionDBDCookieName2 +SessionDBDCookieRemove +SessionDBDDeleteLabel +SessionDBDInsertLabel +SessionDBDPerUser +SessionDBDSelectLabel +SessionDBDUpdateLabel +SessionEnv +SessionExclude +SessionHeader +SessionInclude +SessionMaxAge +SetEnv +SetEnvIf +SetEnvIfExpr +SetEnvIfNoCase +SetHandler +SetInputFilter +SetOutputFilter +SSIEndTag +SSIErrorMsg +SSIETag +SSILastModified +SSILegacyExprParser +SSIStartTag +SSITimeFormat +SSIUndefinedEcho +SSLCACertificateFile +SSLCACertificatePath +SSLCADNRequestFile +SSLCADNRequestPath +SSLCARevocationCheck +SSLCARevocationFile +SSLCARevocationPath +SSLCertificateChainFile +SSLCertificateFile +SSLCertificateKeyFile +SSLCipherSuite +SSLCompression +SSLCryptoDevice +SSLEngine +SSLFIPS +SSLHonorCipherOrder +SSLInsecureRenegotiation +SSLOCSPDefaultResponder +SSLOCSPEnable +SSLOCSPOverrideResponder +SSLOCSPResponderTimeout +SSLOCSPResponseMaxAge +SSLOCSPResponseTimeSkew +SSLOCSPUseRequestNonce +SSLOpenSSLConfCmd +SSLOptions +SSLPassPhraseDialog +SSLProtocol +SSLProxyCACertificateFile +SSLProxyCACertificatePath +SSLProxyCARevocationCheck +SSLProxyCARevocationFile +SSLProxyCARevocationPath +SSLProxyCheckPeerCN +SSLProxyCheckPeerExpire +SSLProxyCheckPeerName +SSLProxyCipherSuite +SSLProxyEngine +SSLProxyMachineCertificateChainFile +SSLProxyMachineCertificateFile +SSLProxyMachineCertificatePath +SSLProxyProtocol +SSLProxyVerify +SSLProxyVerifyDepth +SSLRandomSeed +SSLRenegBufferSize +SSLRequire +SSLRequireSSL +SSLSessionCache +SSLSessionCacheTimeout +SSLSessionTicketKeyFile +SSLSRPUnknownUserSeed +SSLSRPVerifierFile +SSLStaplingCache +SSLStaplingErrorCacheTimeout +SSLStaplingFakeTryLater +SSLStaplingForceURL +SSLStaplingResponderTimeout +SSLStaplingResponseMaxAge +SSLStaplingResponseTimeSkew +SSLStaplingReturnResponderErrors +SSLStaplingStandardCacheTimeout +SSLStrictSNIVHostCheck +SSLUserName +SSLUseStapling +SSLVerifyClient +SSLVerifyDepth +StartServers +StartThreads +Substitute +Suexec +SuexecUserGroup +ThreadLimit +ThreadsPerChild +ThreadStackSize +TimeOut +TraceEnable +TransferLog +TypesConfig +UnDefine +UndefMacro +UnsetEnv +Use +UseCanonicalName +UseCanonicalPhysicalPort +User +UserDir +VHostCGIMode +VHostCGIPrivs +VHostGroup +VHostPrivs +VHostSecure +VHostUser +VirtualDocumentRoot +VirtualDocumentRootIP +VirtualScriptAlias +VirtualScriptAliasIP +WatchdogInterval +XBitHack +xml2EncAlias +xml2EncDefault +xml2StartParse + +---------------------------------------------------- + +[ + ["directive-inline", "AcceptFilter"], + ["directive-inline", "AcceptPathInfo"], + ["directive-inline", "AccessFileName"], + ["directive-inline", "Action"], + ["directive-inline", "AddAlt"], + ["directive-inline", "AddAltByEncoding"], + ["directive-inline", "AddAltByType"], + ["directive-inline", "AddCharset"], + ["directive-inline", "AddDefaultCharset"], + ["directive-inline", "AddDescription"], + ["directive-inline", "AddEncoding"], + ["directive-inline", "AddHandler"], + ["directive-inline", "AddIcon"], + ["directive-inline", "AddIconByEncoding"], + ["directive-inline", "AddIconByType"], + ["directive-inline", "AddInputFilter"], + ["directive-inline", "AddLanguage"], + ["directive-inline", "AddModuleInfo"], + ["directive-inline", "AddOutputFilter"], + ["directive-inline", "AddOutputFilterByType"], + ["directive-inline", "AddType"], + ["directive-inline", "Alias"], + ["directive-inline", "AliasMatch"], + ["directive-inline", "Allow"], + ["directive-inline", "AllowCONNECT"], + ["directive-inline", "AllowEncodedSlashes"], + ["directive-inline", "AllowMethods"], + ["directive-inline", "AllowOverride"], + ["directive-inline", "AllowOverrideList"], + ["directive-inline", "Anonymous"], + ["directive-inline", "Anonymous_LogEmail"], + ["directive-inline", "Anonymous_MustGiveEmail"], + ["directive-inline", "Anonymous_NoUserID"], + ["directive-inline", "Anonymous_VerifyEmail"], + ["directive-inline", "AsyncRequestWorkerFactor"], + ["directive-inline", "AuthBasicAuthoritative"], + ["directive-inline", "AuthBasicFake"], + ["directive-inline", "AuthBasicProvider"], + ["directive-inline", "AuthBasicUseDigestAlgorithm"], + ["directive-inline", "AuthDBDUserPWQuery"], + ["directive-inline", "AuthDBDUserRealmQuery"], + ["directive-inline", "AuthDBMGroupFile"], + ["directive-inline", "AuthDBMType"], + ["directive-inline", "AuthDBMUserFile"], + ["directive-inline", "AuthDigestAlgorithm"], + ["directive-inline", "AuthDigestDomain"], + ["directive-inline", "AuthDigestNonceLifetime"], + ["directive-inline", "AuthDigestProvider"], + ["directive-inline", "AuthDigestQop"], + ["directive-inline", "AuthDigestShmemSize"], + ["directive-inline", "AuthFormAuthoritative"], + ["directive-inline", "AuthFormBody"], + ["directive-inline", "AuthFormDisableNoStore"], + ["directive-inline", "AuthFormFakeBasicAuth"], + ["directive-inline", "AuthFormLocation"], + ["directive-inline", "AuthFormLoginRequiredLocation"], + ["directive-inline", "AuthFormLoginSuccessLocation"], + ["directive-inline", "AuthFormLogoutLocation"], + ["directive-inline", "AuthFormMethod"], + ["directive-inline", "AuthFormMimetype"], + ["directive-inline", "AuthFormPassword"], + ["directive-inline", "AuthFormProvider"], + ["directive-inline", "AuthFormSitePassphrase"], + ["directive-inline", "AuthFormSize"], + ["directive-inline", "AuthFormUsername"], + ["directive-inline", "AuthGroupFile"], + ["directive-inline", "AuthLDAPAuthorizePrefix"], + ["directive-inline", "AuthLDAPBindAuthoritative"], + ["directive-inline", "AuthLDAPBindDN"], + ["directive-inline", "AuthLDAPBindPassword"], + ["directive-inline", "AuthLDAPCharsetConfig"], + ["directive-inline", "AuthLDAPCompareAsUser"], + ["directive-inline", "AuthLDAPCompareDNOnServer"], + ["directive-inline", "AuthLDAPDereferenceAliases"], + ["directive-inline", "AuthLDAPGroupAttribute"], + ["directive-inline", "AuthLDAPGroupAttributeIsDN"], + ["directive-inline", "AuthLDAPInitialBindAsUser"], + ["directive-inline", "AuthLDAPInitialBindPattern"], + ["directive-inline", "AuthLDAPMaxSubGroupDepth"], + ["directive-inline", "AuthLDAPRemoteUserAttribute"], + ["directive-inline", "AuthLDAPRemoteUserIsDN"], + ["directive-inline", "AuthLDAPSearchAsUser"], + ["directive-inline", "AuthLDAPSubGroupAttribute"], + ["directive-inline", "AuthLDAPSubGroupClass"], + ["directive-inline", "AuthLDAPUrl"], + ["directive-inline", "AuthMerging"], + ["directive-inline", "AuthName"], + ["directive-inline", "AuthnCacheContext"], + ["directive-inline", "AuthnCacheEnable"], + ["directive-inline", "AuthnCacheProvideFor"], + ["directive-inline", "AuthnCacheSOCache"], + ["directive-inline", "AuthnCacheTimeout"], + ["directive-inline", "AuthnzFcgiCheckAuthnProvider"], + ["directive-inline", "AuthnzFcgiDefineProvider"], + ["directive-inline", "AuthType"], + ["directive-inline", "AuthUserFile"], + ["directive-inline", "AuthzDBDLoginToReferer"], + ["directive-inline", "AuthzDBDQuery"], + ["directive-inline", "AuthzDBDRedirectQuery"], + ["directive-inline", "AuthzDBMType"], + ["directive-inline", "AuthzSendForbiddenOnFailure"], + ["directive-inline", "BalancerGrowth"], + ["directive-inline", "BalancerInherit"], + ["directive-inline", "BalancerMember"], + ["directive-inline", "BalancerPersist"], + ["directive-inline", "BrowserMatch"], + ["directive-inline", "BrowserMatchNoCase"], + ["directive-inline", "BufferedLogs"], + ["directive-inline", "BufferSize"], + ["directive-inline", "CacheDefaultExpire"], + ["directive-inline", "CacheDetailHeader"], + ["directive-inline", "CacheDirLength"], + ["directive-inline", "CacheDirLevels"], + ["directive-inline", "CacheDisable"], + ["directive-inline", "CacheEnable"], + ["directive-inline", "CacheFile"], + ["directive-inline", "CacheHeader"], + ["directive-inline", "CacheIgnoreCacheControl"], + ["directive-inline", "CacheIgnoreHeaders"], + ["directive-inline", "CacheIgnoreNoLastMod"], + ["directive-inline", "CacheIgnoreQueryString"], + ["directive-inline", "CacheIgnoreURLSessionIdentifiers"], + ["directive-inline", "CacheKeyBaseURL"], + ["directive-inline", "CacheLastModifiedFactor"], + ["directive-inline", "CacheLock"], + ["directive-inline", "CacheLockMaxAge"], + ["directive-inline", "CacheLockPath"], + ["directive-inline", "CacheMaxExpire"], + ["directive-inline", "CacheMaxFileSize"], + ["directive-inline", "CacheMinExpire"], + ["directive-inline", "CacheMinFileSize"], + ["directive-inline", "CacheNegotiatedDocs"], + ["directive-inline", "CacheQuickHandler"], + ["directive-inline", "CacheReadSize"], + ["directive-inline", "CacheReadTime"], + ["directive-inline", "CacheRoot"], + ["directive-inline", "CacheSocache"], + ["directive-inline", "CacheSocacheMaxSize"], + ["directive-inline", "CacheSocacheMaxTime"], + ["directive-inline", "CacheSocacheMinTime"], + ["directive-inline", "CacheSocacheReadSize"], + ["directive-inline", "CacheSocacheReadTime"], + ["directive-inline", "CacheStaleOnError"], + ["directive-inline", "CacheStoreExpired"], + ["directive-inline", "CacheStoreNoStore"], + ["directive-inline", "CacheStorePrivate"], + ["directive-inline", "CGIDScriptTimeout"], + ["directive-inline", "CGIMapExtension"], + ["directive-inline", "CharsetDefault"], + ["directive-inline", "CharsetOptions"], + ["directive-inline", "CharsetSourceEnc"], + ["directive-inline", "CheckCaseOnly"], + ["directive-inline", "CheckSpelling"], + ["directive-inline", "ChrootDir"], + ["directive-inline", "ContentDigest"], + ["directive-inline", "CookieDomain"], + ["directive-inline", "CookieExpires"], + ["directive-inline", "CookieName"], + ["directive-inline", "CookieStyle"], + ["directive-inline", "CookieTracking"], + ["directive-inline", "CoreDumpDirectory"], + ["directive-inline", "CustomLog"], + ["directive-inline", "Dav"], + ["directive-inline", "DavDepthInfinity"], + ["directive-inline", "DavGenericLockDB"], + ["directive-inline", "DavLockDB"], + ["directive-inline", "DavMinTimeout"], + ["directive-inline", "DBDExptime"], + ["directive-inline", "DBDInitSQL"], + ["directive-inline", "DBDKeep"], + ["directive-inline", "DBDMax"], + ["directive-inline", "DBDMin"], + ["directive-inline", "DBDParams"], + ["directive-inline", "DBDPersist"], + ["directive-inline", "DBDPrepareSQL"], + ["directive-inline", "DBDriver"], + ["directive-inline", "DefaultIcon"], + ["directive-inline", "DefaultLanguage"], + ["directive-inline", "DefaultRuntimeDir"], + ["directive-inline", "DefaultType"], + ["directive-inline", "Define"], + ["directive-inline", "DeflateBufferSize"], + ["directive-inline", "DeflateCompressionLevel"], + ["directive-inline", "DeflateFilterNote"], + ["directive-inline", "DeflateInflateLimitRequestBody"], + ["directive-inline", "DeflateInflateRatioBurst"], + ["directive-inline", "DeflateInflateRatioLimit"], + ["directive-inline", "DeflateMemLevel"], + ["directive-inline", "DeflateWindowSize"], + ["directive-inline", "Deny"], + ["directive-inline", "DirectoryCheckHandler"], + ["directive-inline", "DirectoryIndex"], + ["directive-inline", "DirectoryIndexRedirect"], + ["directive-inline", "DirectorySlash"], + ["directive-inline", "DocumentRoot"], + ["directive-inline", "DTracePrivileges"], + ["directive-inline", "DumpIOInput"], + ["directive-inline", "DumpIOOutput"], + ["directive-inline", "EnableExceptionHook"], + ["directive-inline", "EnableMMAP"], + ["directive-inline", "EnableSendfile"], + ["directive-inline", "Error"], + ["directive-inline", "ErrorDocument"], + ["directive-inline", "ErrorLog"], + ["directive-inline", "ErrorLogFormat"], + ["directive-inline", "Example"], + ["directive-inline", "ExpiresActive"], + ["directive-inline", "ExpiresByType"], + ["directive-inline", "ExpiresDefault"], + ["directive-inline", "ExtendedStatus"], + ["directive-inline", "ExtFilterDefine"], + ["directive-inline", "ExtFilterOptions"], + ["directive-inline", "FallbackResource"], + ["directive-inline", "FileETag"], + ["directive-inline", "FilterChain"], + ["directive-inline", "FilterDeclare"], + ["directive-inline", "FilterProtocol"], + ["directive-inline", "FilterProvider"], + ["directive-inline", "FilterTrace"], + ["directive-inline", "ForceLanguagePriority"], + ["directive-inline", "ForceType"], + ["directive-inline", "ForensicLog"], + ["directive-inline", "GprofDir"], + ["directive-inline", "GracefulShutdownTimeout"], + ["directive-inline", "Group"], + ["directive-inline", "Header"], + ["directive-inline", "HeaderName"], + ["directive-inline", "HeartbeatAddress"], + ["directive-inline", "HeartbeatListen"], + ["directive-inline", "HeartbeatMaxServers"], + ["directive-inline", "HeartbeatStorage"], + ["directive-inline", "HeartbeatStorage"], + ["directive-inline", "HostnameLookups"], + ["directive-inline", "IdentityCheck"], + ["directive-inline", "IdentityCheckTimeout"], + ["directive-inline", "ImapBase"], + ["directive-inline", "ImapDefault"], + ["directive-inline", "ImapMenu"], + ["directive-inline", "Include"], + ["directive-inline", "IncludeOptional"], + ["directive-inline", "IndexHeadInsert"], + ["directive-inline", "IndexIgnore"], + ["directive-inline", "IndexIgnoreReset"], + ["directive-inline", "IndexOptions"], + ["directive-inline", "IndexOrderDefault"], + ["directive-inline", "IndexStyleSheet"], + ["directive-inline", "InputSed"], + ["directive-inline", "ISAPIAppendLogToErrors"], + ["directive-inline", "ISAPIAppendLogToQuery"], + ["directive-inline", "ISAPICacheFile"], + ["directive-inline", "ISAPIFakeAsync"], + ["directive-inline", "ISAPILogNotSupported"], + ["directive-inline", "ISAPIReadAheadBuffer"], + ["directive-inline", "KeepAlive"], + ["directive-inline", "KeepAliveTimeout"], + ["directive-inline", "KeptBodySize"], + ["directive-inline", "LanguagePriority"], + ["directive-inline", "LDAPCacheEntries"], + ["directive-inline", "LDAPCacheTTL"], + ["directive-inline", "LDAPConnectionPoolTTL"], + ["directive-inline", "LDAPConnectionTimeout"], + ["directive-inline", "LDAPLibraryDebug"], + ["directive-inline", "LDAPOpCacheEntries"], + ["directive-inline", "LDAPOpCacheTTL"], + ["directive-inline", "LDAPReferralHopLimit"], + ["directive-inline", "LDAPReferrals"], + ["directive-inline", "LDAPRetries"], + ["directive-inline", "LDAPRetryDelay"], + ["directive-inline", "LDAPSharedCacheFile"], + ["directive-inline", "LDAPSharedCacheSize"], + ["directive-inline", "LDAPTimeout"], + ["directive-inline", "LDAPTrustedClientCert"], + ["directive-inline", "LDAPTrustedGlobalCert"], + ["directive-inline", "LDAPTrustedMode"], + ["directive-inline", "LDAPVerifyServerCert"], + ["directive-inline", "LimitInternalRecursion"], + ["directive-inline", "LimitRequestBody"], + ["directive-inline", "LimitRequestFields"], + ["directive-inline", "LimitRequestFieldSize"], + ["directive-inline", "LimitRequestLine"], + ["directive-inline", "LimitXMLRequestBody"], + ["directive-inline", "Listen"], + ["directive-inline", "ListenBackLog"], + ["directive-inline", "LoadFile"], + ["directive-inline", "LoadModule"], + ["directive-inline", "LogFormat"], + ["directive-inline", "LogLevel"], + ["directive-inline", "LogMessage"], + ["directive-inline", "LuaAuthzProvider"], + ["directive-inline", "LuaCodeCache"], + ["directive-inline", "LuaHookAccessChecker"], + ["directive-inline", "LuaHookAuthChecker"], + ["directive-inline", "LuaHookCheckUserID"], + ["directive-inline", "LuaHookFixups"], + ["directive-inline", "LuaHookInsertFilter"], + ["directive-inline", "LuaHookLog"], + ["directive-inline", "LuaHookMapToStorage"], + ["directive-inline", "LuaHookTranslateName"], + ["directive-inline", "LuaHookTypeChecker"], + ["directive-inline", "LuaInherit"], + ["directive-inline", "LuaInputFilter"], + ["directive-inline", "LuaMapHandler"], + ["directive-inline", "LuaOutputFilter"], + ["directive-inline", "LuaPackageCPath"], + ["directive-inline", "LuaPackagePath"], + ["directive-inline", "LuaQuickHandler"], + ["directive-inline", "LuaRoot"], + ["directive-inline", "LuaScope"], + ["directive-inline", "MaxConnectionsPerChild"], + ["directive-inline", "MaxKeepAliveRequests"], + ["directive-inline", "MaxMemFree"], + ["directive-inline", "MaxRangeOverlaps"], + ["directive-inline", "MaxRangeReversals"], + ["directive-inline", "MaxRanges"], + ["directive-inline", "MaxRequestWorkers"], + ["directive-inline", "MaxSpareServers"], + ["directive-inline", "MaxSpareThreads"], + ["directive-inline", "MaxThreads"], + ["directive-inline", "MergeTrailers"], + ["directive-inline", "MetaDir"], + ["directive-inline", "MetaFiles"], + ["directive-inline", "MetaSuffix"], + ["directive-inline", "MimeMagicFile"], + ["directive-inline", "MinSpareServers"], + ["directive-inline", "MinSpareThreads"], + ["directive-inline", "MMapFile"], + ["directive-inline", "ModemStandard"], + ["directive-inline", "ModMimeUsePathInfo"], + ["directive-inline", "MultiviewsMatch"], + ["directive-inline", "Mutex"], + ["directive-inline", "NameVirtualHost"], + ["directive-inline", "NoProxy"], + ["directive-inline", "NWSSLTrustedCerts"], + ["directive-inline", "NWSSLUpgradeable"], + ["directive-inline", "Options"], + ["directive-inline", "Order"], + ["directive-inline", "OutputSed"], + ["directive-inline", "PassEnv"], + ["directive-inline", "PidFile"], + ["directive-inline", "PrivilegesMode"], + ["directive-inline", "Protocol"], + ["directive-inline", "ProtocolEcho"], + ["directive-inline", "ProxyAddHeaders"], + ["directive-inline", "ProxyBadHeader"], + ["directive-inline", "ProxyBlock"], + ["directive-inline", "ProxyDomain"], + ["directive-inline", "ProxyErrorOverride"], + ["directive-inline", "ProxyExpressDBMFile"], + ["directive-inline", "ProxyExpressDBMType"], + ["directive-inline", "ProxyExpressEnable"], + ["directive-inline", "ProxyFtpDirCharset"], + ["directive-inline", "ProxyFtpEscapeWildcards"], + ["directive-inline", "ProxyFtpListOnWildcard"], + ["directive-inline", "ProxyHTMLBufSize"], + ["directive-inline", "ProxyHTMLCharsetOut"], + ["directive-inline", "ProxyHTMLDocType"], + ["directive-inline", "ProxyHTMLEnable"], + ["directive-inline", "ProxyHTMLEvents"], + ["directive-inline", "ProxyHTMLExtended"], + ["directive-inline", "ProxyHTMLFixups"], + ["directive-inline", "ProxyHTMLInterp"], + ["directive-inline", "ProxyHTMLLinks"], + ["directive-inline", "ProxyHTMLMeta"], + ["directive-inline", "ProxyHTMLStripComments"], + ["directive-inline", "ProxyHTMLURLMap"], + ["directive-inline", "ProxyIOBufferSize"], + ["directive-inline", "ProxyMaxForwards"], + ["directive-inline", "ProxyPass"], + ["directive-inline", "ProxyPassInherit"], + ["directive-inline", "ProxyPassInterpolateEnv"], + ["directive-inline", "ProxyPassMatch"], + ["directive-inline", "ProxyPassReverse"], + ["directive-inline", "ProxyPassReverseCookieDomain"], + ["directive-inline", "ProxyPassReverseCookiePath"], + ["directive-inline", "ProxyPreserveHost"], + ["directive-inline", "ProxyReceiveBufferSize"], + ["directive-inline", "ProxyRemote"], + ["directive-inline", "ProxyRemoteMatch"], + ["directive-inline", "ProxyRequests"], + ["directive-inline", "ProxySCGIInternalRedirect"], + ["directive-inline", "ProxySCGISendfile"], + ["directive-inline", "ProxySet"], + ["directive-inline", "ProxySourceAddress"], + ["directive-inline", "ProxyStatus"], + ["directive-inline", "ProxyTimeout"], + ["directive-inline", "ProxyVia"], + ["directive-inline", "ReadmeName"], + ["directive-inline", "ReceiveBufferSize"], + ["directive-inline", "Redirect"], + ["directive-inline", "RedirectMatch"], + ["directive-inline", "RedirectPermanent"], + ["directive-inline", "RedirectTemp"], + ["directive-inline", "ReflectorHeader"], + ["directive-inline", "RemoteIPHeader"], + ["directive-inline", "RemoteIPInternalProxy"], + ["directive-inline", "RemoteIPInternalProxyList"], + ["directive-inline", "RemoteIPProxiesHeader"], + ["directive-inline", "RemoteIPTrustedProxy"], + ["directive-inline", "RemoteIPTrustedProxyList"], + ["directive-inline", "RemoveCharset"], + ["directive-inline", "RemoveEncoding"], + ["directive-inline", "RemoveHandler"], + ["directive-inline", "RemoveInputFilter"], + ["directive-inline", "RemoveLanguage"], + ["directive-inline", "RemoveOutputFilter"], + ["directive-inline", "RemoveType"], + ["directive-inline", "RequestHeader"], + ["directive-inline", "RequestReadTimeout"], + ["directive-inline", "Require"], + ["directive-inline", "RewriteBase"], + ["directive-inline", "RewriteCond"], + ["directive-inline", "RewriteEngine"], + ["directive-inline", "RewriteMap"], + ["directive-inline", "RewriteOptions"], + ["directive-inline", "RewriteRule"], + ["directive-inline", "RLimitCPU"], + ["directive-inline", "RLimitMEM"], + ["directive-inline", "RLimitNPROC"], + ["directive-inline", "Satisfy"], + ["directive-inline", "ScoreBoardFile"], + ["directive-inline", "Script"], + ["directive-inline", "ScriptAlias"], + ["directive-inline", "ScriptAliasMatch"], + ["directive-inline", "ScriptInterpreterSource"], + ["directive-inline", "ScriptLog"], + ["directive-inline", "ScriptLogBuffer"], + ["directive-inline", "ScriptLogLength"], + ["directive-inline", "ScriptSock"], + ["directive-inline", "SecureListen"], + ["directive-inline", "SeeRequestTail"], + ["directive-inline", "SendBufferSize"], + ["directive-inline", "ServerAdmin"], + ["directive-inline", "ServerAlias"], + ["directive-inline", "ServerLimit"], + ["directive-inline", "ServerName"], + ["directive-inline", "ServerPath"], + ["directive-inline", "ServerRoot"], + ["directive-inline", "ServerSignature"], + ["directive-inline", "ServerTokens"], + ["directive-inline", "Session"], + ["directive-inline", "SessionCookieName"], + ["directive-inline", "SessionCookieName2"], + ["directive-inline", "SessionCookieRemove"], + ["directive-inline", "SessionCryptoCipher"], + ["directive-inline", "SessionCryptoDriver"], + ["directive-inline", "SessionCryptoPassphrase"], + ["directive-inline", "SessionCryptoPassphraseFile"], + ["directive-inline", "SessionDBDCookieName"], + ["directive-inline", "SessionDBDCookieName2"], + ["directive-inline", "SessionDBDCookieRemove"], + ["directive-inline", "SessionDBDDeleteLabel"], + ["directive-inline", "SessionDBDInsertLabel"], + ["directive-inline", "SessionDBDPerUser"], + ["directive-inline", "SessionDBDSelectLabel"], + ["directive-inline", "SessionDBDUpdateLabel"], + ["directive-inline", "SessionEnv"], + ["directive-inline", "SessionExclude"], + ["directive-inline", "SessionHeader"], + ["directive-inline", "SessionInclude"], + ["directive-inline", "SessionMaxAge"], + ["directive-inline", "SetEnv"], + ["directive-inline", "SetEnvIf"], + ["directive-inline", "SetEnvIfExpr"], + ["directive-inline", "SetEnvIfNoCase"], + ["directive-inline", "SetHandler"], + ["directive-inline", "SetInputFilter"], + ["directive-inline", "SetOutputFilter"], + ["directive-inline", "SSIEndTag"], + ["directive-inline", "SSIErrorMsg"], + ["directive-inline", "SSIETag"], + ["directive-inline", "SSILastModified"], + ["directive-inline", "SSILegacyExprParser"], + ["directive-inline", "SSIStartTag"], + ["directive-inline", "SSITimeFormat"], + ["directive-inline", "SSIUndefinedEcho"], + ["directive-inline", "SSLCACertificateFile"], + ["directive-inline", "SSLCACertificatePath"], + ["directive-inline", "SSLCADNRequestFile"], + ["directive-inline", "SSLCADNRequestPath"], + ["directive-inline", "SSLCARevocationCheck"], + ["directive-inline", "SSLCARevocationFile"], + ["directive-inline", "SSLCARevocationPath"], + ["directive-inline", "SSLCertificateChainFile"], + ["directive-inline", "SSLCertificateFile"], + ["directive-inline", "SSLCertificateKeyFile"], + ["directive-inline", "SSLCipherSuite"], + ["directive-inline", "SSLCompression"], + ["directive-inline", "SSLCryptoDevice"], + ["directive-inline", "SSLEngine"], + ["directive-inline", "SSLFIPS"], + ["directive-inline", "SSLHonorCipherOrder"], + ["directive-inline", "SSLInsecureRenegotiation"], + ["directive-inline", "SSLOCSPDefaultResponder"], + ["directive-inline", "SSLOCSPEnable"], + ["directive-inline", "SSLOCSPOverrideResponder"], + ["directive-inline", "SSLOCSPResponderTimeout"], + ["directive-inline", "SSLOCSPResponseMaxAge"], + ["directive-inline", "SSLOCSPResponseTimeSkew"], + ["directive-inline", "SSLOCSPUseRequestNonce"], + ["directive-inline", "SSLOpenSSLConfCmd"], + ["directive-inline", "SSLOptions"], + ["directive-inline", "SSLPassPhraseDialog"], + ["directive-inline", "SSLProtocol"], + ["directive-inline", "SSLProxyCACertificateFile"], + ["directive-inline", "SSLProxyCACertificatePath"], + ["directive-inline", "SSLProxyCARevocationCheck"], + ["directive-inline", "SSLProxyCARevocationFile"], + ["directive-inline", "SSLProxyCARevocationPath"], + ["directive-inline", "SSLProxyCheckPeerCN"], + ["directive-inline", "SSLProxyCheckPeerExpire"], + ["directive-inline", "SSLProxyCheckPeerName"], + ["directive-inline", "SSLProxyCipherSuite"], + ["directive-inline", "SSLProxyEngine"], + ["directive-inline", "SSLProxyMachineCertificateChainFile"], + ["directive-inline", "SSLProxyMachineCertificateFile"], + ["directive-inline", "SSLProxyMachineCertificatePath"], + ["directive-inline", "SSLProxyProtocol"], + ["directive-inline", "SSLProxyVerify"], + ["directive-inline", "SSLProxyVerifyDepth"], + ["directive-inline", "SSLRandomSeed"], + ["directive-inline", "SSLRenegBufferSize"], + ["directive-inline", "SSLRequire"], + ["directive-inline", "SSLRequireSSL"], + ["directive-inline", "SSLSessionCache"], + ["directive-inline", "SSLSessionCacheTimeout"], + ["directive-inline", "SSLSessionTicketKeyFile"], + ["directive-inline", "SSLSRPUnknownUserSeed"], + ["directive-inline", "SSLSRPVerifierFile"], + ["directive-inline", "SSLStaplingCache"], + ["directive-inline", "SSLStaplingErrorCacheTimeout"], + ["directive-inline", "SSLStaplingFakeTryLater"], + ["directive-inline", "SSLStaplingForceURL"], + ["directive-inline", "SSLStaplingResponderTimeout"], + ["directive-inline", "SSLStaplingResponseMaxAge"], + ["directive-inline", "SSLStaplingResponseTimeSkew"], + ["directive-inline", "SSLStaplingReturnResponderErrors"], + ["directive-inline", "SSLStaplingStandardCacheTimeout"], + ["directive-inline", "SSLStrictSNIVHostCheck"], + ["directive-inline", "SSLUserName"], + ["directive-inline", "SSLUseStapling"], + ["directive-inline", "SSLVerifyClient"], + ["directive-inline", "SSLVerifyDepth"], + ["directive-inline", "StartServers"], + ["directive-inline", "StartThreads"], + ["directive-inline", "Substitute"], + ["directive-inline", "Suexec"], + ["directive-inline", "SuexecUserGroup"], + ["directive-inline", "ThreadLimit"], + ["directive-inline", "ThreadsPerChild"], + ["directive-inline", "ThreadStackSize"], + ["directive-inline", "TimeOut"], + ["directive-inline", "TraceEnable"], + ["directive-inline", "TransferLog"], + ["directive-inline", "TypesConfig"], + ["directive-inline", "UnDefine"], + ["directive-inline", "UndefMacro"], + ["directive-inline", "UnsetEnv"], + ["directive-inline", "Use"], + ["directive-inline", "UseCanonicalName"], + ["directive-inline", "UseCanonicalPhysicalPort"], + ["directive-inline", "User"], + ["directive-inline", "UserDir"], + ["directive-inline", "VHostCGIMode"], + ["directive-inline", "VHostCGIPrivs"], + ["directive-inline", "VHostGroup"], + ["directive-inline", "VHostPrivs"], + ["directive-inline", "VHostSecure"], + ["directive-inline", "VHostUser"], + ["directive-inline", "VirtualDocumentRoot"], + ["directive-inline", "VirtualDocumentRootIP"], + ["directive-inline", "VirtualScriptAlias"], + ["directive-inline", "VirtualScriptAliasIP"], + ["directive-inline", "WatchdogInterval"], + ["directive-inline", "XBitHack"], + ["directive-inline", "xml2EncAlias"], + ["directive-inline", "xml2EncDefault"], + ["directive-inline", "xml2StartParse"] +] + +---------------------------------------------------- + +Checks for all inline directives. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apacheconf/regex_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/regex_feature.test new file mode 100644 index 00000000..322e59f5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apacheconf/regex_feature.test @@ -0,0 +1,15 @@ +^(.*)$ +^foo +bar$ + +---------------------------------------------------- + +[ + ["regex", "^(.*)$"], + ["regex", "^foo"], + ["regex", "bar$"] +] + +---------------------------------------------------- + +Checks for regex. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apacheconf/string_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/string_feature.test new file mode 100644 index 00000000..d2849caf --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apacheconf/string_feature.test @@ -0,0 +1,24 @@ +"foo bar" +'foo bar' +"%{REMOTE_HOST}" + +---------------------------------------------------- + +[ + ["string", [ + "\"foo bar\"" + ]], + ["string", [ + "'foo bar'" + ]], + ["string", [ + "\"", + ["variable", "%{REMOTE_HOST}"], + "\"" + ]] +] + +---------------------------------------------------- + +Checks for strings. +Also checks for variables inside strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apacheconf/variable_feature.test b/docs/_style/prism-master/tests/languages/apacheconf/variable_feature.test new file mode 100644 index 00000000..025fe75b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apacheconf/variable_feature.test @@ -0,0 +1,15 @@ +$port +${docroot} +%{REMOTE_HOST} + +---------------------------------------------------- + +[ + ["variable", "$port"], + ["variable", "${docroot}"], + ["variable", "%{REMOTE_HOST}"] +] + +---------------------------------------------------- + +Checks for variables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/assignment_feature.test b/docs/_style/prism-master/tests/languages/apl/assignment_feature.test new file mode 100644 index 00000000..b06cb39b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/assignment_feature.test @@ -0,0 +1,13 @@ +a←1 2 3 + +---------------------------------------------------- + +[ + "a", + ["assignment", "←"], + ["number", "1"], ["number", "2"], ["number", "3"] +] + +---------------------------------------------------- + +Checks for assignment. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/comment_feature.test b/docs/_style/prism-master/tests/languages/apl/comment_feature.test new file mode 100644 index 00000000..a3084510 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/comment_feature.test @@ -0,0 +1,15 @@ +⍝ +⍝ Foobar +#!/usr/bin/env runapl + +---------------------------------------------------- + +[ + ["comment", "⍝"], + ["comment", "⍝ Foobar"], + ["comment", "#!/usr/bin/env runapl"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/constant_feature.test b/docs/_style/prism-master/tests/languages/apl/constant_feature.test new file mode 100644 index 00000000..9f631626 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/constant_feature.test @@ -0,0 +1,19 @@ +⍬ +⌾ +# +⎕ +⍞ + +---------------------------------------------------- + +[ + ["constant", "⍬"], + ["constant", "⌾"], + ["constant", "#"], + ["constant", "⎕"], + ["constant", "⍞"] +] + +---------------------------------------------------- + +Checks for constants. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/dfn_feature.test b/docs/_style/prism-master/tests/languages/apl/dfn_feature.test new file mode 100644 index 00000000..ef4be35c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/dfn_feature.test @@ -0,0 +1,23 @@ +{0=⍴⍴⍺:'hello' ⋄ ∇¨⍵} + +---------------------------------------------------- + +[ + ["dfn", "{"], + ["number", "0"], + ["function", "="], + ["function", "⍴"], + ["function", "⍴"], + ["dfn", "⍺"], + ["dfn", ":"], + ["string", "'hello'"], + ["punctuation", "⋄"], + ["dfn", "∇"], + ["monadic-operator", "¨"], + ["dfn", "⍵"], + ["dfn", "}"] +] + +---------------------------------------------------- + +Checks for Dfns. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/dyadic-operator_feature.test b/docs/_style/prism-master/tests/languages/apl/dyadic-operator_feature.test new file mode 100644 index 00000000..bd141ede --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/dyadic-operator_feature.test @@ -0,0 +1,15 @@ +. ⍣ ⍠ +⍤ ∘ ⌸ +@ ⌺ + +---------------------------------------------------- + +[ + ["dyadic-operator", "."], ["dyadic-operator", "⍣"], ["dyadic-operator", "⍠"], + ["dyadic-operator", "⍤"], ["dyadic-operator", "∘"], ["dyadic-operator", "⌸"], + ["dyadic-operator", "@"], ["dyadic-operator", "⌺"] +] + +---------------------------------------------------- + +Checks for dyadic operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/function_feature.test b/docs/_style/prism-master/tests/languages/apl/function_feature.test new file mode 100644 index 00000000..b926e51e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/function_feature.test @@ -0,0 +1,43 @@ +- + × ÷ +⌈ ⌊ ∣ | +⍳ ⍸ ? * +⍟ ○ ! ⌹ +< ≤ = > +≥ ≠ ≡ ≢ +∊ ⍷ ∪ ∩ +~ ∨ ∧ ⍱ +⍲ ⍴ , ⍪ +⌽ ⊖ ⍉ +↑ ↓ ⊂ ⊃ +⊆ ⊇ +⌷ ⍋ ⍒ +⊤ ⊥ ⍕ ⍎ +⊣ ⊢ ⍁ ⍂ +≈ ⍯ +↗ ¤ → + +---------------------------------------------------- + +[ + ["function", "-"], ["function", "+"], ["function", "×"], ["function", "÷"], + ["function", "⌈"], ["function", "⌊"], ["function", "∣"], ["function", "|"], + ["function", "⍳"], ["function", "⍸"], ["function", "?"], ["function", "*"], + ["function", "⍟"], ["function", "○"], ["function", "!"], ["function", "⌹"], + ["function", "<"], ["function", "≤"], ["function", "="], ["function", ">"], + ["function", "≥"], ["function", "≠"], ["function", "≡"], ["function", "≢"], + ["function", "∊"], ["function", "⍷"], ["function", "∪"], ["function", "∩"], + ["function", "~"], ["function", "∨"], ["function", "∧"], ["function", "⍱"], + ["function", "⍲"], ["function", "⍴"], ["function", ","], ["function", "⍪"], + ["function", "⌽"], ["function", "⊖"], ["function", "⍉"], + ["function", "↑"], ["function", "↓"], ["function", "⊂"], ["function", "⊃"], + ["function", "⊆"], ["function", "⊇"], + ["function", "⌷"], ["function", "⍋"], ["function", "⍒"], + ["function", "⊤"], ["function", "⊥"], ["function", "⍕"], ["function", "⍎"], + ["function", "⊣"], ["function", "⊢"], ["function", "⍁"], ["function", "⍂"], + ["function", "≈"], ["function", "⍯"], + ["function", "↗"], ["function", "¤"], ["function", "→"] +] + +---------------------------------------------------- + +Checks for functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/monadic-operator_feature.test b/docs/_style/prism-master/tests/languages/apl/monadic-operator_feature.test new file mode 100644 index 00000000..0dcc9b08 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/monadic-operator_feature.test @@ -0,0 +1,15 @@ +\ / ⌿ ⍀ +¨ ⍨ ⌶ +& ∥ + +---------------------------------------------------- + +[ + ["monadic-operator", "\\"], ["monadic-operator", "/"], ["monadic-operator", "⌿"], ["monadic-operator", "⍀"], + ["monadic-operator", "¨"], ["monadic-operator", "⍨"], ["monadic-operator", "⌶"], + ["monadic-operator", "&"], ["monadic-operator", "∥"] +] + +---------------------------------------------------- + +Checks for monadic operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/number_feature.test b/docs/_style/prism-master/tests/languages/apl/number_feature.test new file mode 100644 index 00000000..815d1ca8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/number_feature.test @@ -0,0 +1,27 @@ +42 +3.14159 +¯2 +∞ +3E12 +2.8e¯4 +0.1e+7 +2j3 +¯4.3e2J1.9e¯4 + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "¯2"], + ["number", "∞"], + ["number", "3E12"], + ["number", "2.8e¯4"], + ["number", "0.1e+7"], + ["number", "2j3"], + ["number", "¯4.3e2J1.9e¯4"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/statement_feature.test b/docs/_style/prism-master/tests/languages/apl/statement_feature.test new file mode 100644 index 00000000..24c68744 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/statement_feature.test @@ -0,0 +1,13 @@ +:Ab +:FooBar + +---------------------------------------------------- + +[ + ["statement", ":Ab"], + ["statement", ":FooBar"] +] + +---------------------------------------------------- + +Checks for statements. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/string_feature.test b/docs/_style/prism-master/tests/languages/apl/string_feature.test new file mode 100644 index 00000000..8bc8dd1b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/string_feature.test @@ -0,0 +1,15 @@ +'' +'foobar' +'fo''obar' + +---------------------------------------------------- + +[ + ["string", "''"], + ["string", "'foobar'"], + ["string", "'fo''obar'"] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/apl/system-function_feature.test b/docs/_style/prism-master/tests/languages/apl/system-function_feature.test new file mode 100644 index 00000000..81cbcaa1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/apl/system-function_feature.test @@ -0,0 +1,17 @@ +⎕IO +⎕WA +⎕CR +⎕TCNL + +---------------------------------------------------- + +[ + ["system-function", "⎕IO"], + ["system-function", "⎕WA"], + ["system-function", "⎕CR"], + ["system-function", "⎕TCNL"] +] + +---------------------------------------------------- + +Checks for system functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/applescript/class_feature.test b/docs/_style/prism-master/tests/languages/applescript/class_feature.test new file mode 100644 index 00000000..547906de --- /dev/null +++ b/docs/_style/prism-master/tests/languages/applescript/class_feature.test @@ -0,0 +1,39 @@ +alias application boolean class constant +date file integer list number +POSIX file +real record reference +RGB color +script text centimetres centimeters feet +inches kilometres kilometers metres meters +miles yards +square feet square kilometres square kilometers square metres +square meters square miles square yards +cubic centimetres cubic centimeters cubic feet cubic inches +cubic metres cubic meters cubic yards +gallons litres liters quarts grams +kilograms ounces pounds +degrees Celsius degrees Fahrenheit degrees Kelvin + +---------------------------------------------------- + +[ + ["class", "alias"], ["class", "application"], ["class", "boolean"], ["class", "class"], ["class", "constant"], + ["class", "date"], ["class", "file"], ["class", "integer"], ["class", "list"], ["class", "number"], + ["class", "POSIX file"], + ["class", "real"], ["class", "record"], ["class", "reference"], + ["class", "RGB color"], + ["class", "script"], ["class", "text"], ["class", "centimetres"], ["class", "centimeters"], ["class", "feet"], + ["class", "inches"], ["class", "kilometres"], ["class", "kilometers"], ["class", "metres"], ["class", "meters"], + ["class", "miles"], ["class", "yards"], + ["class", "square feet"], ["class", "square kilometres"], ["class", "square kilometers"], ["class", "square metres"], + ["class", "square meters"], ["class", "square miles"], ["class", "square yards"], + ["class", "cubic centimetres"], ["class", "cubic centimeters"], ["class", "cubic feet"], ["class", "cubic inches"], + ["class", "cubic metres"], ["class", "cubic meters"], ["class", "cubic yards"], + ["class", "gallons"], ["class", "litres"], ["class", "liters"], ["class", "quarts"], ["class", "grams"], + ["class", "kilograms"], ["class", "ounces"], ["class", "pounds"], + ["class", "degrees Celsius"], ["class", "degrees Fahrenheit"], ["class", "degrees Kelvin"] +] + +---------------------------------------------------- + +Checks for all classes. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/applescript/comment_feature.test b/docs/_style/prism-master/tests/languages/applescript/comment_feature.test new file mode 100644 index 00000000..d823ba42 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/applescript/comment_feature.test @@ -0,0 +1,21 @@ +-- foo bar +# foo bar +(* foo +bar *) +(* foo +(* bar *) +*) + +---------------------------------------------------- + +[ + ["comment", "-- foo bar"], + ["comment", "# foo bar"], + ["comment", "(* foo\r\nbar *)"], + ["comment", "(* foo\r\n(* bar *)\r\n*)"] +] + +---------------------------------------------------- + +Checks for single-line and multi-line comments. +Also checks for one level of nesting. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/applescript/keyword_feature.test b/docs/_style/prism-master/tests/languages/applescript/keyword_feature.test new file mode 100644 index 00000000..bde63a16 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/applescript/keyword_feature.test @@ -0,0 +1,59 @@ +about above after against +apart from +around +aside from +at back before beginning behind below +beneath beside between but by +considering continue copy +does eighth else end +equal error every exit +false fifth first for fourth +from front get given global +if ignoring in +instead of +into is it its last +local me middle my +ninth of on onto +out of +over prop property put +repeat return returning +second set seventh since sixth +some tell tenth that the +then third through thru timeout +times to transaction true try +until where while whose with +without + +---------------------------------------------------- + +[ + ["keyword", "about"], ["keyword", "above"], ["keyword", "after"], ["keyword", "against"], + ["keyword", "apart from"], + ["keyword", "around"], + ["keyword", "aside from"], + ["keyword", "at"], ["keyword", "back"], ["keyword", "before"], ["keyword", "beginning"], ["keyword", "behind"], ["keyword", "below"], + ["keyword", "beneath"], ["keyword", "beside"], ["keyword", "between"], ["keyword", "but"], ["keyword", "by"], + ["keyword", "considering"], ["keyword", "continue"], ["keyword", "copy"], + ["keyword", "does"], ["keyword", "eighth"], ["keyword", "else"], ["keyword", "end"], + ["keyword", "equal"], ["keyword", "error"], ["keyword", "every"], ["keyword", "exit"], + ["keyword", "false"], ["keyword", "fifth"], ["keyword", "first"], ["keyword", "for"], ["keyword", "fourth"], + ["keyword", "from"], ["keyword", "front"], ["keyword", "get"], ["keyword", "given"], ["keyword", "global"], + ["keyword", "if"], ["keyword", "ignoring"], ["keyword", "in"], + ["keyword", "instead of"], + ["keyword", "into"], ["keyword", "is"], ["keyword", "it"], ["keyword", "its"], ["keyword", "last"], + ["keyword", "local"], ["keyword", "me"], ["keyword", "middle"], ["keyword", "my"], + ["keyword", "ninth"], ["keyword", "of"], ["keyword", "on"], ["keyword", "onto"], + ["keyword", "out of"], + ["keyword", "over"], ["keyword", "prop"], ["keyword", "property"], ["keyword", "put"], + ["keyword", "repeat"], ["keyword", "return"], ["keyword", "returning"], + ["keyword", "second"], ["keyword", "set"], ["keyword", "seventh"], ["keyword", "since"], ["keyword", "sixth"], + ["keyword", "some"], ["keyword", "tell"], ["keyword", "tenth"], ["keyword", "that"], ["keyword", "the"], + ["keyword", "then"], ["keyword", "third"], ["keyword", "through"], ["keyword", "thru"], ["keyword", "timeout"], + ["keyword", "times"], ["keyword", "to"], ["keyword", "transaction"], ["keyword", "true"], ["keyword", "try"], + ["keyword", "until"], ["keyword", "where"], ["keyword", "while"], ["keyword", "whose"], ["keyword", "with"], + ["keyword", "without"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/applescript/number_feature.test b/docs/_style/prism-master/tests/languages/applescript/number_feature.test new file mode 100644 index 00000000..96eb6f28 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/applescript/number_feature.test @@ -0,0 +1,17 @@ +42 +3.14159 +3e10 +4.2E-5 + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "3e10"], + ["number", "4.2E-5"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/applescript/operator_feature.test b/docs/_style/prism-master/tests/languages/applescript/operator_feature.test new file mode 100644 index 00000000..fb4acf4d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/applescript/operator_feature.test @@ -0,0 +1,48 @@ +& = ≠ ≤ ≥ +* + - / ÷ ^ +< <= > >= + +start with begin with end with +starts with begins with ends with +does not contain doesn't contain +contain contains +is in isn't in is not in +is contained by isn't contained by is not contained by +greater than greater than or equal greater than or equal to +less than less than or equal less than or equal to +does not come before doesn't come before comes before +does not come after doesn't come after comes after +is equal isn't equal is not equal +is equal to isn't equal to is not equal to +does not equal doesn't equal equals +isn't is not +ref a ref to a reference to +and or div mod as not + +---------------------------------------------------- + +[ + ["operator", "&"], ["operator", "="], ["operator", "≠"], ["operator", "≤"], ["operator", "≥"], + ["operator", "*"], ["operator", "+"], ["operator", "-"], ["operator", "/"], ["operator", "÷"], ["operator", "^"], + ["operator", "<"], ["operator", "<="], ["operator", ">"], ["operator", ">="], + ["operator", "start with"], ["operator", "begin with"], ["operator", "end with"], + ["operator", "starts with"], ["operator", "begins with"], ["operator", "ends with"], + ["operator", "does not contain"], ["operator", "doesn't contain"], + ["operator", "contain"], ["operator", "contains"], + ["operator", "is in"], ["operator", "isn't in"], ["operator", "is not in"], + ["operator", "is contained by"], ["operator", "isn't contained by"], ["operator", "is not contained by"], + ["operator", "greater than"], ["operator", "greater than or equal"], ["operator", "greater than or equal to"], + ["operator", "less than"], ["operator", "less than or equal"], ["operator", "less than or equal to"], + ["operator", "does not come before"], ["operator", "doesn't come before"], ["operator", "comes before"], + ["operator", "does not come after"], ["operator", "doesn't come after"], ["operator", "comes after"], + ["operator", "is equal"], ["operator", "isn't equal"], ["operator", "is not equal"], + ["operator", "is equal to"], ["operator", "isn't equal to"], ["operator", "is not equal to"], + ["operator", "does not equal"], ["operator", "doesn't equal"], ["operator", "equals"], + ["operator", "isn't"], ["operator", "is not"], + ["operator", "ref"], ["operator", "a ref to"], ["operator", "a reference to"], + ["operator", "and"], ["operator", "or"], ["operator", "div"], ["operator", "mod"], ["operator", "as"], ["operator", "not"] +] + +---------------------------------------------------- + +Checks for most of the operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/applescript/string_feature.test b/docs/_style/prism-master/tests/languages/applescript/string_feature.test new file mode 100644 index 00000000..42770f61 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/applescript/string_feature.test @@ -0,0 +1,13 @@ +"" +"foo bar" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"foo bar\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/arff/comment_feature.test b/docs/_style/prism-master/tests/languages/arff/comment_feature.test new file mode 100644 index 00000000..4d53a8e1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/arff/comment_feature.test @@ -0,0 +1,15 @@ +% +% Some comment +% Comment " with ' quotes + +---------------------------------------------------- + +[ + ["comment", "%"], + ["comment", "% Some comment"], + ["comment", "% Comment \" with ' quotes"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/arff/keyword_feature.test b/docs/_style/prism-master/tests/languages/arff/keyword_feature.test new file mode 100644 index 00000000..b1c98169 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/arff/keyword_feature.test @@ -0,0 +1,17 @@ +@attribute +@data +@end +@relation + +---------------------------------------------------- + +[ + ["keyword", "@attribute"], + ["keyword", "@data"], + ["keyword", "@end"], + ["keyword", "@relation"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/arff/number_feature.test b/docs/_style/prism-master/tests/languages/arff/number_feature.test new file mode 100644 index 00000000..99969b4d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/arff/number_feature.test @@ -0,0 +1,13 @@ +42 +0.14 + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "0.14"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/arff/string_feature.test b/docs/_style/prism-master/tests/languages/arff/string_feature.test new file mode 100644 index 00000000..c3178f17 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/arff/string_feature.test @@ -0,0 +1,13 @@ +"double quoted\"' % string" +'single quoted"\' % string' + +---------------------------------------------------- + +[ + ["string", "\"double quoted\\\"' % string\""], + ["string", "'single quoted\"\\' % string'"] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/admonition_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/admonition_feature.test new file mode 100644 index 00000000..6b1688f5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/admonition_feature.test @@ -0,0 +1,19 @@ +TIP: Foobar +NOTE: Foo bar baz +IMPORTANT: Foobar +WARNING: Foo bar baz +CAUTION: Foobar + +---------------------------------------------------- + +[ + ["admonition", "TIP:"], " Foobar\r\n", + ["admonition", "NOTE:"], " Foo bar baz\r\n", + ["admonition", "IMPORTANT:"], " Foobar\r\n", + ["admonition", "WARNING:"], " Foo bar baz\r\n", + ["admonition", "CAUTION:"], " Foobar" +] + +---------------------------------------------------- + +Checks for admonitions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/attribute-entry_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/attribute-entry_feature.test new file mode 100644 index 00000000..a12299ab --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/attribute-entry_feature.test @@ -0,0 +1,58 @@ +:Foo bar: baz + +:Foobar: Foo + +bar + +baz + +:Foo bar!: +:Foobar!: + +===== +:Foo bar: baz + +:Foobar: Foo + +bar + +baz + +:Foo bar!: +:Foobar!: +===== + +|===== +| +:Foo bar: baz + +:Foobar: Foo + +bar + +baz +|===== + +---------------------------------------------------- + +[ + ["attribute-entry", ":Foo bar: baz"], + ["attribute-entry", ":Foobar: Foo +\r\nbar +\r\nbaz"], + ["attribute-entry", ":Foo bar!:"], + ["attribute-entry", ":Foobar!:"], + + ["other-block", [ + ["punctuation", "====="], + ["attribute-entry", ":Foo bar: baz"], + ["attribute-entry", ":Foobar: Foo +\r\nbar +\r\nbaz"], + ["attribute-entry", ":Foo bar!:"], + ["attribute-entry", ":Foobar!:"], + ["punctuation", "====="] + ]], + + ["table", [ + ["punctuation", "|====="], + ["punctuation", "|"], + ["attribute-entry", ":Foo bar: baz"], + ["attribute-entry", ":Foobar: Foo +\r\nbar +\r\nbaz"], + ["punctuation", "|====="] + ]] +] + +---------------------------------------------------- + +Checks for attribute entries. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/attributes_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/attributes_feature.test new file mode 100644 index 00000000..a4eb9e25 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/attributes_feature.test @@ -0,0 +1,403 @@ +Foo [big red yellow-background]#obvious# + +[float] +[quote,'http://en.wikipedia.org/wiki/Samuel_Johnson[Samuel Johnson]'] +[quote,'"with *an* image" image:foo.png[] (TM)'] + +[NOTE] +[icon="./images/icons/wink.png"] +[icons=None, caption="My Special Note"] +[start=7] + +[cols="e,m,^,>s",width="25%"] + +===== +Foo [big red yellow-background]#obvious# + +[float] +[quote,'http://en.wikipedia.org/wiki/Samuel_Johnson[Samuel Johnson]'] +[quote,'"with *an* image" image:foo.png[] (TM)'] + +[NOTE] +[icon="./images/icons/wink.png"] +[icons=None, caption="My Special Note"] +[start=7] + +[cols="e,m,^,>s",width="25%"] +===== + +|===== +| +Foo [big red yellow-background]#obvious# + +[float] +[quote,'http://en.wikipedia.org/wiki/Samuel_Johnson[Samuel Johnson]'] +[quote,'"with *an* image" image:foo.png[] (TM)'] + +[NOTE] +[icon="./images/icons/wink.png"] +[icons=None, caption="My Special Note"] +[start=7] + +[cols="e,m,^,>s",width="25%"] +|===== + + +latexmath:[$C = \alpha + \beta Y^{\gamma} + \epsilon$] +asciimath:[`x/x={(1,if x!=0),(text{undefined},if x=0):}`] +latexmath:[$\sum_{n=1}^\infty \frac{1}{2^n}$] + +---------------------------------------------------- + +[ + "Foo ", + ["inline", [ + ["attributes", [ + ["punctuation", "["], + ["attr-value", "big red yellow-background"], + ["punctuation", "]"] + ]], + ["punctuation", "#"], "obvious", ["punctuation", "#"] + ]], + + ["attributes", [ + ["punctuation", "["], ["attr-value", "float"], ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "quote"], ["punctuation", ","], + ["interpreted", [ + ["punctuation", "'"], + ["macro", [ + ["function", "http"], ["punctuation", ":"], + "//en.wikipedia.org/wiki/Samuel_Johnson", + ["attributes", [ + ["punctuation", "["], + ["attr-value", "Samuel Johnson"], + ["punctuation", "]"] + ]] + ]], + ["punctuation", "'"] + ]], + ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "quote"], ["punctuation", ","], + ["interpreted", [ + ["punctuation", "'"], + ["entity", """], + "with ", + ["inline", [ + ["bold", [ + ["punctuation", "*"], "an", ["punctuation", "*"] + ]] + ]], + " image", + ["entity", """], + ["macro", [ + ["function", "image"], ["punctuation", ":"], + "foo.png", + ["attributes", [ + ["punctuation", "["], ["punctuation", "]"] + ]] + ]], + ["replacement", "(TM)"], + ["punctuation", "'"] + ]], + ["punctuation", "]"] + ]], + + ["attributes", [ + ["punctuation", "["], ["attr-value", "NOTE"], ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["variable", "icon"], + ["operator", "="], + ["string", "\"./images/icons/wink.png\""], + ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["variable", "icons"], + ["operator", "="], + ["attr-value", "None"], + ["punctuation", ","], + ["variable", "caption"], + ["operator", "="], + ["string", "\"My Special Note\""], + ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["variable", "start"], + ["operator", "="], + ["attr-value", "7"], + ["punctuation", "]"] + ]], + + ["attributes", [ + ["punctuation", "["], + ["variable", "cols"], + ["operator", "="], + ["string", "\"e,m,^,>s\""], + ["punctuation", ","], + ["variable", "width"], + ["operator", "="], + ["string", "\"25%\""], + ["punctuation", "]"] + ]], + + ["other-block", [ + ["punctuation", "====="], + + "\r\nFoo ", + ["inline", [ + ["attributes", [ + ["punctuation", "["], + ["attr-value", "big red yellow-background"], + ["punctuation", "]"] + ]], + ["punctuation", "#"], "obvious", ["punctuation", "#"] + ]], + + ["attributes", [ + ["punctuation", "["], ["attr-value", "float"], ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "quote"], ["punctuation", ","], + ["interpreted", [ + ["punctuation", "'"], + ["macro", [ + ["function", "http"], ["punctuation", ":"], + "//en.wikipedia.org/wiki/Samuel_Johnson", + ["attributes", [ + ["punctuation", "["], + ["attr-value", "Samuel Johnson"], + ["punctuation", "]"] + ]] + ]], + ["punctuation", "'"] + ]], + ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "quote"], ["punctuation", ","], + ["interpreted", [ + ["punctuation", "'"], + ["entity", """], + "with ", + ["inline", [ + ["bold", [ + ["punctuation", "*"], "an", ["punctuation", "*"] + ]] + ]], + " image", + ["entity", """], + ["macro", [ + ["function", "image"], ["punctuation", ":"], + "foo.png", + ["attributes", [ + ["punctuation", "["], ["punctuation", "]"] + ]] + ]], + ["replacement", "(TM)"], + ["punctuation", "'"] + ]], + ["punctuation", "]"] + ]], + + ["attributes", [ + ["punctuation", "["], ["attr-value", "NOTE"], ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["variable", "icon"], + ["operator", "="], + ["string", "\"./images/icons/wink.png\""], + ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["variable", "icons"], + ["operator", "="], + ["attr-value", "None"], + ["punctuation", ","], + ["variable", "caption"], + ["operator", "="], + ["string", "\"My Special Note\""], + ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["variable", "start"], + ["operator", "="], + ["attr-value", "7"], + ["punctuation", "]"] + ]], + + ["attributes", [ + ["punctuation", "["], + ["variable", "cols"], + ["operator", "="], + ["string", "\"e,m,^,>s\""], + ["punctuation", ","], + ["variable", "width"], + ["operator", "="], + ["string", "\"25%\""], + ["punctuation", "]"] + ]], + + ["punctuation", "====="] + ]], + + ["table", [ + ["punctuation", "|====="], + ["punctuation", "|"], + + "\r\nFoo ", + ["inline", [ + ["attributes", [ + ["punctuation", "["], + ["attr-value", "big red yellow-background"], + ["punctuation", "]"] + ]], + ["punctuation", "#"], "obvious", ["punctuation", "#"] + ]], + + ["attributes", [ + ["punctuation", "["], ["attr-value", "float"], ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "quote"], ["punctuation", ","], + ["interpreted", [ + ["punctuation", "'"], + ["macro", [ + ["function", "http"], ["punctuation", ":"], + "//en.wikipedia.org/wiki/Samuel_Johnson", + ["attributes", [ + ["punctuation", "["], + ["attr-value", "Samuel Johnson"], + ["punctuation", "]"] + ]] + ]], + ["punctuation", "'"] + ]], + ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "quote"], ["punctuation", ","], + ["interpreted", [ + ["punctuation", "'"], + ["entity", """], + "with ", + ["inline", [ + ["bold", [ + ["punctuation", "*"], "an", ["punctuation", "*"] + ]] + ]], + " image", + ["entity", """], + ["macro", [ + ["function", "image"], ["punctuation", ":"], + "foo.png", + ["attributes", [ + ["punctuation", "["], ["punctuation", "]"] + ]] + ]], + ["replacement", "(TM)"], + ["punctuation", "'"] + ]], + ["punctuation", "]"] + ]], + + ["attributes", [ + ["punctuation", "["], ["attr-value", "NOTE"], ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["variable", "icon"], + ["operator", "="], + ["string", "\"./images/icons/wink.png\""], + ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["variable", "icons"], + ["operator", "="], + ["attr-value", "None"], + ["punctuation", ","], + ["variable", "caption"], + ["operator", "="], + ["string", "\"My Special Note\""], + ["punctuation", "]"] + ]], + ["attributes", [ + ["punctuation", "["], + ["variable", "start"], + ["operator", "="], + ["attr-value", "7"], + ["punctuation", "]"] + ]], + + ["attributes", [ + ["punctuation", "["], + ["variable", "cols"], + ["operator", "="], + ["string", "\"e,m,^,>s\""], + ["punctuation", ","], + ["variable", "width"], + ["operator", "="], + ["string", "\"25%\""], + ["punctuation", "]"] + ]], + + ["punctuation", "|====="] + ]], + + ["macro", [ + ["function", "latexmath"], ["punctuation", ":"], + ["attributes", [ + ["punctuation", "["], + ["quoted", [ + ["punctuation", "$"], + "C = \\alpha + \\beta Y^{\\gamma} + \\epsilon", + ["punctuation", "$"] + ]], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "asciimath"], ["punctuation", ":"], + ["attributes", [ + ["punctuation", "["], + ["quoted", [ + ["punctuation", "`"], + "x/x={(1,if x!=0),(text{undefined},if x=0):}", + ["punctuation", "`"] + ]], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "latexmath"], ["punctuation", ":"], + ["attributes", [ + ["punctuation", "["], + ["quoted", [ + ["punctuation", "$"], + "\\sum_{n=1}^\\infty \\frac{1}{2^n}", + ["punctuation", "$"] + ]], + ["punctuation", "]"] + ]] + ]] +] + +---------------------------------------------------- + +Checks for attributes. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/callout_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/callout_feature.test new file mode 100644 index 00000000..b7de9b1b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/callout_feature.test @@ -0,0 +1,34 @@ +Foobar <1> +<1> Foo +1> Bar +> Baz + +|==== +| Foobar <1> +<1> Foo +1> Bar +> Baz +|==== + +---------------------------------------------------- + +[ + "Foobar ", ["callout", "<1>"], + ["callout", "<1>"], " Foo\r\n", + ["callout", "1>"], " Bar\r\n", + ["callout", ">"], " Baz\r\n\r\n", + + ["table", [ + ["punctuation", "|===="], + ["punctuation", "|"], + " Foobar ", ["callout", "<1>"], + ["callout", "<1>"], " Foo\r\n", + ["callout", "1>"], " Bar\r\n", + ["callout", ">"], " Baz\r\n", + ["punctuation", "|===="] + ]] +] + +---------------------------------------------------- + +Checks for callouts. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/comment-block_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/comment-block_feature.test new file mode 100644 index 00000000..4c4248ed --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/comment-block_feature.test @@ -0,0 +1,19 @@ +//// +//// + +//// +Foobar + +Baz +//// + +---------------------------------------------------- + +[ + ["comment-block", "////\r\n////"], + ["comment-block", "////\r\nFoobar\r\n\r\nBaz\r\n////"] +] + +---------------------------------------------------- + +Checks for comment blocks. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/comment_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/comment_feature.test new file mode 100644 index 00000000..c2ccc51b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/comment_feature.test @@ -0,0 +1,41 @@ +// +// Foobar + +****** +// +// Foobar +****** + +|====== +| +// +| +// Foobar +|====== + +---------------------------------------------------- + +[ + ["comment", "//"], + ["comment", "// Foobar"], + + ["other-block", [ + ["punctuation", "******"], + ["comment", "//"], + ["comment", "// Foobar"], + ["punctuation", "******"] + ]], + + ["table", [ + ["punctuation", "|======"], + ["punctuation", "|"], + ["comment", "//"], + ["punctuation", "|"], + ["comment", "// Foobar"], + ["punctuation", "|======"] + ]] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.js b/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.js new file mode 100644 index 00000000..2e99cd10 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.js @@ -0,0 +1,4 @@ +module.exports = { + '➊': '&#x278a;', + '¶': '&#182;' +}; \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.test new file mode 100644 index 00000000..a3d5ce81 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/entity_feature.test @@ -0,0 +1,48 @@ +➊ ¶ + +➊ ¶ +============ + +['➊ ¶'] + +-- +➊ ¶ +-- + +|====== +| ➊ ¶ +|====== + +---------------------------------------------------- + +[ + ["entity", "➊"], ["entity", "¶"], + ["title", [ + ["entity", "➊"], ["entity", "¶"], + ["punctuation", "============"] + ]], + ["attributes", [ + ["punctuation", "["], + ["interpreted", [ + ["punctuation", "'"], + ["entity", "➊"], ["entity", "¶"], + ["punctuation", "'"] + ]], + ["punctuation", "]"] + ]], + ["other-block", [ + ["punctuation", "--"], + ["entity", "➊"], ["entity", "¶"], + ["punctuation", "--"] + ]], + ["table", [ + ["punctuation", "|======"], + ["punctuation", "|"], + ["entity", "➊"], ["entity", "¶"], + ["punctuation", "|======"] + ]] +] + +---------------------------------------------------- + +Checks for entities. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/hr_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/hr_feature.test new file mode 100644 index 00000000..822a7dbb --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/hr_feature.test @@ -0,0 +1,14 @@ +''' + +'''''''''' + +---------------------------------------------------- + +[ + ["hr", "'''"], + ["hr", "''''''''''"] +] + +---------------------------------------------------- + +Checks for hr. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/indented-block_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/indented-block_feature.test new file mode 100644 index 00000000..c6d66575 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/indented-block_feature.test @@ -0,0 +1,28 @@ +. + + (TM) __foobar__ + :bar: baz + + Foo *bar* baz + // Foobar + == Foobar == + + Title + ~~~~~ + ..... + ..... + +---------------------------------------------------- + +[ + ".\r\n\r\n", + ["indented-block", "\t(TM) __foobar__\r\n\t:bar: baz"], + ["indented-block", " Foo *bar* baz\r\n // Foobar\r\n == Foobar =="], + ["indented-block", " Title\r\n ~~~~~\r\n .....\r\n ....."] +] + +---------------------------------------------------- + +Checks for indented blocks. +Also checks that nothing gets highlighted inside. +The initial dot is required because tests are trimmed. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/inline_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/inline_feature.test new file mode 100644 index 00000000..d88a5708 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/inline_feature.test @@ -0,0 +1,521 @@ +_emphasis_ +``double quotes'' +`single quotes' +`monospace` +'emphasis' +*strong* ++monospace+ +#unquoted# + +_foo _ bar baz_ +`foo ' bar baz' +`foo ` bar baz` +'foo ' bar baz' +*foo * bar baz* ++foo + bar baz+ +#foo # bar baz# + +_foo +bar_ +``foo +bar'' +`foo +bar' +`foo +bar` +'foo +bar' +*foo +bar* ++foo +bar+ +#foo +bar# + +foo__emphasis__bar +foo**strong**bar +foo++monospace++bar +foo+++passthrough+++bar +foo##unquoted##bar +foo$$passthrough$$bar +foo~subscript~bar +foo^superscript^bar +foo{attribute-reference}bar +foo[[anchor]]bar +foo[[[bibliography anchor]]]bar +foo<>bar +foo(((indexes)))bar +foo((indexes))bar + +==== +_emphasis_ +``double quotes'' +`single quotes' +`monospace` +'emphasis' +*strong* ++monospace+ +#unquoted# +__emphasis__ +**strong** +++monospace++ ++++passthrough+++ +##unquoted## +$$passthrough$$ +~subscript~ +^superscript^ +{attribute-reference} +[[anchor]] +[[[bibliography anchor]]] +<> +(((indexes))) +((indexes)) +==== + +|==== +| +_emphasis_ +``double quotes'' +`single quotes' +`monospace` +'emphasis' +*strong* ++monospace+ +#unquoted# +__emphasis__ +**strong** +++monospace++ ++++passthrough+++ +##unquoted## +$$passthrough$$ +~subscript~ +^superscript^ +{attribute-reference} +[[anchor]] +[[[bibliography anchor]]] +<> +(((indexes))) +((indexes)) +|==== + +['foo *bar* baz'] + +== foo *bar* baz == + +{names=value} +{names?value} +{names!value} +{names#value} +{names%value} +{names@regexp:value1:value2} +{names$regexp:value1:value2} +{names$regexp::value} +{foo,bar=foobar} +{foo+bar=foobar} +{counter:attrname} + +---------------------------------------------------- + +[ + ["inline", [ + ["italic", [["punctuation", "_"], "emphasis", ["punctuation", "_"]]] + ]], + ["inline", [ + ["punctuation", "``"], "double quotes", ["punctuation", "''"] + ]], + ["inline", [ + ["punctuation", "`"], "single quotes", ["punctuation", "'"] + ]], + ["inline", [ + ["punctuation", "`"], "monospace", ["punctuation", "`"] + ]], + ["inline", [ + ["italic", [["punctuation", "'"], "emphasis", ["punctuation", "'"]]] + ]], + ["inline", [ + ["bold", [["punctuation", "*"], "strong", ["punctuation", "*"]]] + ]], + ["inline", [ + ["punctuation", "+"], "monospace", ["punctuation", "+"] + ]], + ["inline", [ + ["punctuation", "#"], "unquoted", ["punctuation", "#"] + ]], + + ["inline", [ + ["italic", [["punctuation", "_"], "foo _ bar baz", ["punctuation", "_"]]] + ]], + ["inline", [ + ["punctuation", "`"], "foo ' bar baz", ["punctuation", "'"] + ]], + ["inline", [ + ["punctuation", "`"], "foo ` bar baz", ["punctuation", "`"] + ]], + ["inline", [ + ["italic", [["punctuation", "'"], "foo ' bar baz", ["punctuation", "'"]]] + ]], + ["inline", [ + ["bold", [["punctuation", "*"], "foo * bar baz", ["punctuation", "*"]]] + ]], + ["inline", [ + ["punctuation", "+"], "foo + bar baz", ["punctuation", "+"] + ]], + ["inline", [ + ["punctuation", "#"], "foo # bar baz", ["punctuation", "#"] + ]], + + ["inline", [ + ["italic", [["punctuation", "_"], "foo\r\nbar", ["punctuation", "_"]]] + ]], + ["inline", [ + ["punctuation", "``"], "foo\r\nbar", ["punctuation", "''"] + ]], + ["inline", [ + ["punctuation", "`"], "foo\r\nbar", ["punctuation", "'"] + ]], + ["inline", [ + ["punctuation", "`"], "foo\r\nbar", ["punctuation", "`"] + ]], + ["inline", [ + ["italic", [["punctuation", "'"], "foo\r\nbar", ["punctuation", "'"]]] + ]], + ["inline", [ + ["bold", [["punctuation", "*"], "foo\r\nbar", ["punctuation", "*"]]] + ]], + ["inline", [ + ["punctuation", "+"], "foo\r\nbar", ["punctuation", "+"] + ]], + ["inline", [ + ["punctuation", "#"], "foo\r\nbar", ["punctuation", "#"] + ]], + + "\r\n\r\nfoo", + ["inline", [ + ["italic", [["punctuation", "__"], "emphasis", ["punctuation", "__"]]] + ]], + "bar\r\nfoo", + ["inline", [ + ["bold", [["punctuation", "**"], "strong", ["punctuation", "**"]]] + ]], + "bar\r\nfoo", + ["inline", [ + ["punctuation", "++"], "monospace", ["punctuation", "++"] + ]], + "bar\r\nfoo", + ["inline", [ + ["punctuation", "+++"], "passthrough", ["punctuation", "+++"] + ]], + "bar\r\nfoo", + ["inline", [ + ["punctuation", "##"], "unquoted", ["punctuation", "##"] + ]], + "bar\r\nfoo", + ["inline", [ + ["punctuation", "$$"], "passthrough", ["punctuation", "$$"] + ]], + "bar\r\nfoo", + ["inline", [ + ["punctuation", "~"], "subscript", ["punctuation", "~"] + ]], + "bar\r\nfoo", + ["inline", [ + ["punctuation", "^"], "superscript", ["punctuation", "^"] + ]], + "bar\r\nfoo", + ["inline", [ + ["attribute-ref", [["punctuation", "{"], ["variable", "attribute-reference"], ["punctuation", "}"]]] + ]], + "bar\r\nfoo", + ["inline", [ + ["url", [["punctuation", "[["], "anchor", ["punctuation", "]]"]]] + ]], + "bar\r\nfoo", + ["inline", [ + ["url", [["punctuation", "[[["], "bibliography anchor", ["punctuation", "]]]"]]] + ]], + "bar\r\nfoo", + ["inline", [ + ["url", [["punctuation", "<<"], "xref", ["punctuation", ">>"]]] + ]], + "bar\r\nfoo", + ["inline", [ + ["punctuation", "((("], "indexes", ["punctuation", ")))"] + ]], + "bar\r\nfoo", + ["inline", [ + ["punctuation", "(("], "indexes", ["punctuation", "))"] + ]], + "bar\r\n\r\n", + + ["other-block", [ + ["punctuation", "===="], + + ["inline", [ + ["italic", [["punctuation", "_"], "emphasis", ["punctuation", "_"]]] + ]], + ["inline", [ + ["punctuation", "``"], "double quotes", ["punctuation", "''"] + ]], + ["inline", [ + ["punctuation", "`"], "single quotes", ["punctuation", "'"] + ]], + ["inline", [ + ["punctuation", "`"], "monospace", ["punctuation", "`"] + ]], + ["inline", [ + ["italic", [["punctuation", "'"], "emphasis", ["punctuation", "'"]]] + ]], + ["inline", [ + ["bold", [["punctuation", "*"], "strong", ["punctuation", "*"]]] + ]], + ["inline", [ + ["punctuation", "+"], "monospace", ["punctuation", "+"] + ]], + ["inline", [ + ["punctuation", "#"], "unquoted", ["punctuation", "#"] + ]], + ["inline", [ + ["italic", [["punctuation", "__"], "emphasis", ["punctuation", "__"]]] + ]], + ["inline", [ + ["bold", [["punctuation", "**"], "strong", ["punctuation", "**"]]] + ]], + ["inline", [ + ["punctuation", "++"], "monospace", ["punctuation", "++"] + ]], + ["inline", [ + ["punctuation", "+++"], "passthrough", ["punctuation", "+++"] + ]], + ["inline", [ + ["punctuation", "##"], "unquoted", ["punctuation", "##"] + ]], + ["inline", [ + ["punctuation", "$$"], "passthrough", ["punctuation", "$$"] + ]], + ["inline", [ + ["punctuation", "~"], "subscript", ["punctuation", "~"] + ]], + ["inline", [ + ["punctuation", "^"], "superscript", ["punctuation", "^"] + ]], + ["inline", [ + ["attribute-ref", [["punctuation", "{"], ["variable", "attribute-reference"], ["punctuation", "}"]]] + ]], + ["inline", [ + ["url", [["punctuation", "[["], "anchor", ["punctuation", "]]"]]] + ]], + ["inline", [ + ["url", [["punctuation", "[[["], "bibliography anchor", ["punctuation", "]]]"]]] + ]], + ["inline", [ + ["url", [["punctuation", "<<"], "xref", ["punctuation", ">>"]]] + ]], + ["inline", [ + ["punctuation", "((("], "indexes", ["punctuation", ")))"] + ]], + ["inline", [ + ["punctuation", "(("], "indexes", ["punctuation", "))"] + ]], + + ["punctuation", "===="] + ]], + + ["table", [ + ["punctuation", "|===="], + ["punctuation", "|"], + + ["inline", [ + ["italic", [["punctuation", "_"], "emphasis", ["punctuation", "_"]]] + ]], + ["inline", [ + ["punctuation", "``"], "double quotes", ["punctuation", "''"] + ]], + ["inline", [ + ["punctuation", "`"], "single quotes", ["punctuation", "'"] + ]], + ["inline", [ + ["punctuation", "`"], "monospace", ["punctuation", "`"] + ]], + ["inline", [ + ["italic", [["punctuation", "'"], "emphasis", ["punctuation", "'"]]] + ]], + ["inline", [ + ["bold", [["punctuation", "*"], "strong", ["punctuation", "*"]]] + ]], + ["inline", [ + ["punctuation", "+"], "monospace", ["punctuation", "+"] + ]], + ["inline", [ + ["punctuation", "#"], "unquoted", ["punctuation", "#"] + ]], + ["inline", [ + ["italic", [["punctuation", "__"], "emphasis", ["punctuation", "__"]]] + ]], + ["inline", [ + ["bold", [["punctuation", "**"], "strong", ["punctuation", "**"]]] + ]], + ["inline", [ + ["punctuation", "++"], "monospace", ["punctuation", "++"] + ]], + ["inline", [ + ["punctuation", "+++"], "passthrough", ["punctuation", "+++"] + ]], + ["inline", [ + ["punctuation", "##"], "unquoted", ["punctuation", "##"] + ]], + ["inline", [ + ["punctuation", "$$"], "passthrough", ["punctuation", "$$"] + ]], + ["inline", [ + ["punctuation", "~"], "subscript", ["punctuation", "~"] + ]], + ["inline", [ + ["punctuation", "^"], "superscript", ["punctuation", "^"] + ]], + ["inline", [ + ["attribute-ref", [["punctuation", "{"], ["variable", "attribute-reference"], ["punctuation", "}"]]] + ]], + ["inline", [ + ["url", [["punctuation", "[["], "anchor", ["punctuation", "]]"]]] + ]], + ["inline", [ + ["url", [["punctuation", "[[["], "bibliography anchor", ["punctuation", "]]]"]]] + ]], + ["inline", [ + ["url", [["punctuation", "<<"], "xref", ["punctuation", ">>"]]] + ]], + ["inline", [ + ["punctuation", "((("], "indexes", ["punctuation", ")))"] + ]], + ["inline", [ + ["punctuation", "(("], "indexes", ["punctuation", "))"] + ]], + + ["punctuation", "|===="] + ]], + + ["attributes", [ + ["punctuation", "["], + ["interpreted", [ + ["punctuation", "'"], + "foo ", ["inline", [["bold", [["punctuation", "*"], "bar", ["punctuation", "*"]]]]], " baz", + ["punctuation", "'"] + ]], + ["punctuation", "]"] + ]], + + ["title", [ + ["punctuation", "=="], + " foo ", ["inline", [["bold", [["punctuation", "*"], "bar", ["punctuation", "*"]]]]], " baz ", + ["punctuation", "=="] + ]], + + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "names"], + ["operator", "="], + "value", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "names"], + ["operator", "?"], + "value", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "names"], + ["operator", "!"], + "value", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "names"], + ["operator", "#"], + "value", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "names"], + ["operator", "%"], + "value", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "names"], + ["operator", "@"], + "regexp", ["punctuation", ":"], + "value1", ["punctuation", ":"], + "value2", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "names"], + ["operator", "$"], + "regexp", ["punctuation", ":"], + "value1", ["punctuation", ":"], + "value2", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "names"], + ["operator", "$"], + "regexp", ["punctuation", "::"], + "value", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "foo,bar"], + ["operator", "="], + "foobar", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "foo+bar"], + ["operator", "="], + "foobar", + ["punctuation", "}"] + ]] + ]], + ["inline", [ + ["attribute-ref", [ + ["punctuation", "{"], + ["variable", "counter"], + ["punctuation", ":"], + "attrname", + ["punctuation", "}"] + ]] + ]] +] + +---------------------------------------------------- + +Checks for all kinds of inline quoted text. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/line-continuation_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/line-continuation_feature.test new file mode 100644 index 00000000..651fa81f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/line-continuation_feature.test @@ -0,0 +1,18 @@ +Foo + +bar + +* Foo ++ +bar + +---------------------------------------------------- + +[ + "Foo ", ["line-continuation", "+"], "\r\nbar\r\n\r\n", + ["list-punctuation", "*"], " Foo\r\n", + ["line-continuation", "+"], "\r\nbar" +] + +---------------------------------------------------- + +Checks for line continuations. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/list-label_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/list-label_feature.test new file mode 100644 index 00000000..3e95bb6a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/list-label_feature.test @@ -0,0 +1,73 @@ +In:: +Lorem:: + Foo bar baz +Dolor::: + Ipsum:::: + Donec;; + Foobar + +____ +In:: +Lorem:: + Foo bar baz +Dolor::: + Ipsum:::: + Donec;; + Foobar +____ + +|======== +| +In:: +Lorem:: + Foo bar baz +Dolor::: + Ipsum:::: + Donec;; + Foobar +|======== + +---------------------------------------------------- + +[ + ["list-label", "In::"], + ["list-label", "Lorem::"], + "\r\n Foo bar baz\r\n", + ["list-label", "Dolor:::"], + ["list-label", "Ipsum::::"], + ["list-label", "Donec;;"], + "\r\n Foobar\r\n\r\n", + + ["other-block", [ + ["punctuation", "____"], + + ["list-label", "In::"], + ["list-label", "Lorem::"], + "\r\n Foo bar baz\r\n", + ["list-label", "Dolor:::"], + ["list-label", "Ipsum::::"], + ["list-label", "Donec;;"], + "\r\n Foobar\r\n", + + ["punctuation", "____"] + ]], + + ["table", [ + ["punctuation", "|========"], + ["punctuation", "|"], + + ["list-label", "In::"], + ["list-label", "Lorem::"], + "\r\n Foo bar baz\r\n", + ["list-label", "Dolor:::"], + ["list-label", "Ipsum::::"], + ["list-label", "Donec;;"], + "\r\n Foobar\r\n", + + ["punctuation", "|========"] + ]] +] + +---------------------------------------------------- + +Checks for list labels. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/list-punctuation_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/list-punctuation_feature.test new file mode 100644 index 00000000..60dbf13c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/list-punctuation_feature.test @@ -0,0 +1,77 @@ +- Foo +* Foo +** Foo bar +*** Foo + 1. Foo + 2. Foo bar + 42. Foo +**** Foo +***** Foo bar + +. Foo +.. Foo + a. Foo + b. Foo + z. Foo +... Foo bar +.... Foo + i) Foo + vi) Bar + xxvii) Baz +..... Foo + +____ +. 1 +.. 2 +____ + +|=== +| +xi) a +xii) b +|=== + +---------------------------------------------------- + +[ + ["list-punctuation", "-"], " Foo\r\n", + ["list-punctuation", "*"], " Foo\r\n", + ["list-punctuation", "**"], " Foo bar\r\n", + ["list-punctuation", "***"], " Foo\r\n\t", + ["list-punctuation", "1."], " Foo\r\n\t", + ["list-punctuation", "2."], " Foo bar\r\n\t", + ["list-punctuation", "42."], " Foo\r\n", + ["list-punctuation", "****"], " Foo\r\n", + ["list-punctuation", "*****"], " Foo bar\r\n\r\n", + + ["list-punctuation", "."], " Foo\r\n", + ["list-punctuation", ".."], " Foo\r\n ", + ["list-punctuation", "a."], " Foo\r\n ", + ["list-punctuation", "b."], " Foo\r\n ", + ["list-punctuation", "z."], " Foo\r\n", + ["list-punctuation", "..."], " Foo bar\r\n", + ["list-punctuation", "...."], " Foo\r\n\t", + ["list-punctuation", "i)"], " Foo\r\n\t", + ["list-punctuation", "vi)"], " Bar\r\n\t", + ["list-punctuation", "xxvii)"], " Baz\r\n", + ["list-punctuation", "....."], " Foo\r\n\r\n", + + ["other-block", [ + ["punctuation", "____"], + ["list-punctuation", "."], " 1\r\n", + ["list-punctuation", ".."], " 2\r\n", + ["punctuation", "____"] + ]], + + ["table", [ + ["punctuation", "|==="], + ["punctuation", "|"], + ["list-punctuation", "xi)"], " a\r\n", + ["list-punctuation", "xii)"], " b\r\n", + ["punctuation", "|==="] + ]] +] + +---------------------------------------------------- + +Checks for list punctuation. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/literal-block_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/literal-block_feature.test new file mode 100644 index 00000000..9449ca06 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/literal-block_feature.test @@ -0,0 +1,46 @@ +---- +== Foobar == +Bar _baz_ (TM) <1> +* Foo <2> +<1> Foobar +2> Baz +---- + +....... +.Foo +. Foobar <1> +include::addendum.txt <2> +> Foo +> Bar +__Foo__**bar**{baz} +....... + +---------------------------------------------------- + +[ + ["literal-block", [ + ["punctuation", "----"], + "\r\n== Foobar ==\r\nBar _baz_ (TM) ", + ["callout", "<1>"], + "\r\n* Foo ", + ["callout", "<2>"], + ["callout", "<1>"], " Foobar\r\n", + ["callout", "2>"], " Baz\r\n", + ["punctuation", "----"] + ]], + ["literal-block", [ + ["punctuation", "......."], + "\r\n.Foo\r\n. Foobar ", + ["callout", "<1>"], + "\r\ninclude::addendum.txt ", + ["callout", "<2>"], + ["callout", ">"], " Foo\r\n", + ["callout", ">"], " Bar\r\n__Foo__**bar**{baz}\r\n", + ["punctuation", "......."] + ]] +] + +---------------------------------------------------- + +Checks for literal blocks and listing blocks. +Also checks that nothing gets highlighted inside expect callouts. diff --git a/docs/_style/prism-master/tests/languages/asciidoc/macro_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/macro_feature.test new file mode 100644 index 00000000..50ee1616 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/macro_feature.test @@ -0,0 +1,250 @@ +footnote:[An example footnote.] +indexterm:[Tigers,Big cats] + +http://www.docbook.org/[DocBook.org] +include::chapt1.txt[tabsize=2] +mailto:srackham@gmail.com[] + +image:screen-thumbnail.png[height=32,link="screen.png"] + +== Foo image:foo.jpg[] == + +-- +footnote:[An example footnote.] +indexterm:[Tigers,Big cats] + +http://www.docbook.org/[DocBook.org] +include::chapt1.txt[tabsize=2] +mailto:srackham@gmail.com[] + +image:screen-thumbnail.png[height=32,link="screen.png"] +-- + +|==== +| +footnote:[An example footnote.] +indexterm:[Tigers,Big cats] + +http://www.docbook.org/[DocBook.org] +include::chapt1.txt[tabsize=2] +mailto:srackham@gmail.com[] + +image:screen-thumbnail.png[height=32,link="screen.png"] +|==== + +---------------------------------------------------- + +[ + ["macro", [ + ["function", "footnote"], ["punctuation", ":"], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "An example footnote."], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "indexterm"], ["punctuation", ":"], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "Tigers"], + ["punctuation", ","], + ["attr-value", "Big cats"], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "http"], ["punctuation", ":"], + "//www.docbook.org/", + ["attributes", [ + ["punctuation", "["], + ["attr-value", "DocBook.org"], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "include"], ["punctuation", "::"], + "chapt1.txt", + ["attributes", [ + ["punctuation", "["], + ["variable", "tabsize"], + ["operator", "="], + ["attr-value", "2"], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "mailto"], ["punctuation", ":"], + "srackham@gmail.com", + ["attributes", [ + ["punctuation", "["], ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "image"], ["punctuation", ":"], + "screen-thumbnail.png", + ["attributes", [ + ["punctuation", "["], + ["variable", "height"], + ["operator", "="], + ["attr-value", "32"], + ["punctuation", ","], + ["variable", "link"], + ["operator", "="], + ["string", "\"screen.png\""], + ["punctuation", "]"] + ]] + ]], + + ["title", [ + ["punctuation", "=="], + " Foo ", + ["macro", [ + ["function", "image"], ["punctuation", ":"], + "foo.jpg", + ["attributes", [ + ["punctuation", "["], ["punctuation", "]"] + ]] + ]], + ["punctuation", "=="] + ]], + + ["other-block", [ + ["punctuation", "--"], + + ["macro", [ + ["function", "footnote"], ["punctuation", ":"], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "An example footnote."], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "indexterm"], ["punctuation", ":"], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "Tigers"], + ["punctuation", ","], + ["attr-value", "Big cats"], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "http"], ["punctuation", ":"], + "//www.docbook.org/", + ["attributes", [ + ["punctuation", "["], + ["attr-value", "DocBook.org"], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "include"], ["punctuation", "::"], + "chapt1.txt", + ["attributes", [ + ["punctuation", "["], + ["variable", "tabsize"], + ["operator", "="], + ["attr-value", "2"], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "mailto"], ["punctuation", ":"], + "srackham@gmail.com", + ["attributes", [ + ["punctuation", "["], ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "image"], ["punctuation", ":"], + "screen-thumbnail.png", + ["attributes", [ + ["punctuation", "["], + ["variable", "height"], + ["operator", "="], + ["attr-value", "32"], + ["punctuation", ","], + ["variable", "link"], + ["operator", "="], + ["string", "\"screen.png\""], + ["punctuation", "]"] + ]] + ]], + + ["punctuation", "--"] + ]], + + ["table", [ + ["punctuation", "|===="], + ["punctuation", "|"], + + ["macro", [ + ["function", "footnote"], ["punctuation", ":"], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "An example footnote."], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "indexterm"], ["punctuation", ":"], + ["attributes", [ + ["punctuation", "["], + ["attr-value", "Tigers"], + ["punctuation", ","], + ["attr-value", "Big cats"], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "http"], ["punctuation", ":"], + "//www.docbook.org/", + ["attributes", [ + ["punctuation", "["], + ["attr-value", "DocBook.org"], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "include"], ["punctuation", "::"], + "chapt1.txt", + ["attributes", [ + ["punctuation", "["], + ["variable", "tabsize"], + ["operator", "="], + ["attr-value", "2"], + ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "mailto"], ["punctuation", ":"], + "srackham@gmail.com", + ["attributes", [ + ["punctuation", "["], ["punctuation", "]"] + ]] + ]], + ["macro", [ + ["function", "image"], ["punctuation", ":"], + "screen-thumbnail.png", + ["attributes", [ + ["punctuation", "["], + ["variable", "height"], + ["operator", "="], + ["attr-value", "32"], + ["punctuation", ","], + ["variable", "link"], + ["operator", "="], + ["string", "\"screen.png\""], + ["punctuation", "]"] + ]] + ]], + + ["punctuation", "|===="] + ]] +] + +---------------------------------------------------- + +Checks for macros. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/other-block_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/other-block_feature.test new file mode 100644 index 00000000..fb33c207 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/other-block_feature.test @@ -0,0 +1,45 @@ +**** +Sidebar block <1> +**** + +______ +Quote block <2> +______ + +======== +Example block <3> +======== + +-- +Open block <4> +-- + +---------------------------------------------------- + +[ + ["other-block", [ + ["punctuation", "****"], + "\r\nSidebar block <1>\r\n", + ["punctuation", "****"] + ]], + ["other-block", [ + ["punctuation", "______"], + "\r\nQuote block <2>\r\n", + ["punctuation", "______"] + ]], + ["other-block", [ + ["punctuation", "========"], + "\r\nExample block <3>\r\n", + ["punctuation", "========"] + ]], + ["other-block", [ + ["punctuation", "--"], + "\r\nOpen block <4>\r\n", + ["punctuation", "--"] + ]] +] + +---------------------------------------------------- + +Checks for sidebar blocks, quote blocks, example blocks and open blocks. +Also checks that callouts are not highlighted. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/page-break_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/page-break_feature.test new file mode 100644 index 00000000..010a5901 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/page-break_feature.test @@ -0,0 +1,14 @@ +<<< + +<<<<<<<<<<<<< + +---------------------------------------------------- + +[ + ["page-break", "<<<"], + ["page-break", "<<<<<<<<<<<<<"] +] + +---------------------------------------------------- + +Checks for page breaks. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/passthrough-block_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/passthrough-block_feature.test new file mode 100644 index 00000000..a5bb08b4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/passthrough-block_feature.test @@ -0,0 +1,29 @@ +++++ +.Fo__o__bar *baz* +Fo(((o)))bar baz +* Foobar baz +include::addendum.txt[] +++++ + +---------------------------------------------------- + +[ + ["passthrough-block", [ + ["punctuation", "++++"], + "\r\n.Fo__o__bar *baz*\r\nFo(((o)))bar baz\r\n* Foobar baz\r\n", + ["macro", [ + ["function", "include"], + ["punctuation", "::"], + "addendum.txt", + ["attributes", [ + ["punctuation", "["], ["punctuation", "]"] + ]] + ]], + ["punctuation", "++++"] + ]] +] + +---------------------------------------------------- + +Checks for passthrough blocks. +Also checks that nothing gets highlighted inside expect macros. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/replacement_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/replacement_feature.test new file mode 100644 index 00000000..ca27610e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/replacement_feature.test @@ -0,0 +1,48 @@ +(C) (TM) (R) + +(C) (TM) (R) +============ + +['(C) (TM) (R)'] + +-- +(C) (TM) (R) +-- + +|====== +| (C) (TM) (R) +|====== + +---------------------------------------------------- + +[ + ["replacement", "(C)"], ["replacement", "(TM)"], ["replacement", "(R)"], + ["title", [ + ["replacement", "(C)"], ["replacement", "(TM)"], ["replacement", "(R)"], + ["punctuation", "============"] + ]], + ["attributes", [ + ["punctuation", "["], + ["interpreted", [ + ["punctuation", "'"], + ["replacement", "(C)"], ["replacement", "(TM)"], ["replacement", "(R)"], + ["punctuation", "'"] + ]], + ["punctuation", "]"] + ]], + ["other-block", [ + ["punctuation", "--"], + ["replacement", "(C)"], ["replacement", "(TM)"], ["replacement", "(R)"], + ["punctuation", "--"] + ]], + ["table", [ + ["punctuation", "|======"], + ["punctuation", "|"], + ["replacement", "(C)"], ["replacement", "(TM)"], ["replacement", "(R)"], + ["punctuation", "|======"] + ]] +] + +---------------------------------------------------- + +Checks for replacements. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/table_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/table_feature.test new file mode 100644 index 00000000..0b4bd3c6 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/table_feature.test @@ -0,0 +1,61 @@ +|=== +|1 +|=== + +|============================ +|1 >s|2 |3 |4 +^|5 2.2+^.^|6 .3+<.>m|7 +2*^|8 +|9 2+>|10 +|============================ + +|============================================== +|Normal cell + +|Cell with nested table + +!============================================== +!Nested table cell 1 !Nested table cell 2 +!============================================== + +|============================================== + +---------------------------------------------------- + +[ + ["table", [ + ["punctuation", "|==="], + ["punctuation", "|"], "1\r\n", + ["punctuation", "|==="] + ]], + + ["table", [ + ["punctuation", "|============================"], + ["punctuation", "|"], "1 ", + ["specifiers", ">s"], ["punctuation", "|"], "2 ", + ["punctuation", "|"], "3 ", + ["punctuation", "|"], "4\r\n", + ["specifiers", "^"], ["punctuation", "|"], "5 ", + ["specifiers", "2.2+^.^"], ["punctuation", "|"], "6 ", + ["specifiers", ".3+<.>m"], ["punctuation", "|"], "7\r\n", + ["specifiers", "2*^"], ["punctuation", "|"], "8\r\n", + ["punctuation", "|"], "9 ", + ["specifiers", "2+>"], ["punctuation", "|"], "10\r\n", + ["punctuation", "|============================"] + ]], + + ["table", [ + ["punctuation", "|=============================================="], + ["punctuation", "|"], "Normal cell\r\n\r\n", + ["punctuation", "|"], "Cell with nested table\r\n\r\n", + ["punctuation", "!=============================================="], + ["punctuation", "!"], "Nested table cell 1 ", + ["punctuation", "!"], "Nested table cell 2\r\n", + ["punctuation", "!=============================================="], + ["punctuation", "|=============================================="] + ]] +] + +---------------------------------------------------- + +Checks for tables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asciidoc/title_feature.test b/docs/_style/prism-master/tests/languages/asciidoc/title_feature.test new file mode 100644 index 00000000..a9d40474 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asciidoc/title_feature.test @@ -0,0 +1,80 @@ +Foobar +====== + +Foobar +------ + +Foobar +~~~~~~ + +Foobar +^^^^^^ + +Foo ++++ + += Foo bar baz = +== Foo bar baz +=== Foo bar baz === +==== Foo bar baz +===== Foo bar baz ===== + +.Foo bar baz + +---------------------------------------------------- + +[ + ["title", [ + "Foobar\r\n", + ["punctuation", "======"] + ]], + ["title", [ + "Foobar\r\n", + ["punctuation", "------"] + ]], + ["title", [ + "Foobar\r\n", + ["punctuation", "~~~~~~"] + ]], + ["title", [ + "Foobar\r\n", + ["punctuation", "^^^^^^"] + ]], + ["title", [ + "Foo\r\n", + ["punctuation", "+++"] + ]], + + ["title", [ + ["punctuation", "="], + " Foo bar baz ", + ["punctuation", "="] + ]], + ["title", [ + ["punctuation", "=="], + " Foo bar baz" + ]], + ["title", [ + ["punctuation", "==="], + " Foo bar baz ", + ["punctuation", "==="] + ]], + ["title", [ + ["punctuation", "===="], + " Foo bar baz" + ]], + ["title", [ + ["punctuation", "====="], + " Foo bar baz ", + ["punctuation", "====="] + ]], + + ["title", [ + ["punctuation", "."], + "Foo bar baz" + ]] +] + +---------------------------------------------------- + +Checks for titles. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/asm6502/comment_feature.test b/docs/_style/prism-master/tests/languages/asm6502/comment_feature.test new file mode 100644 index 00000000..d4b86016 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asm6502/comment_feature.test @@ -0,0 +1,13 @@ +; +; foo bar baz + +------------------------- + +[ + ["comment", ";"], + ["comment", "; foo bar baz"] +] + +------------------------- + +Check for comments diff --git a/docs/_style/prism-master/tests/languages/asm6502/directive_feature.test b/docs/_style/prism-master/tests/languages/asm6502/directive_feature.test new file mode 100644 index 00000000..1cf42c81 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asm6502/directive_feature.test @@ -0,0 +1,12 @@ +.segment CODE + +------------------------- + +[ + ["directive", ".segment"], + " CODE" +] + +------------------------- + +Check for directives diff --git a/docs/_style/prism-master/tests/languages/asm6502/number_feature.test b/docs/_style/prism-master/tests/languages/asm6502/number_feature.test new file mode 100644 index 00000000..55262f67 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asm6502/number_feature.test @@ -0,0 +1,18 @@ +LDA #127 +STA $8000 +LDX #%10001010 + +------------------------- + +[ + ["opcode", "LDA"], + ["decimalnumber", "#127"], + ["opcode", "STA"], + ["hexnumber", "$8000"], + ["opcode", "LDX"], + ["binarynumber", "#%10001010"] +] + +------------------------- + +Check for numbers diff --git a/docs/_style/prism-master/tests/languages/asm6502/opcode_feature.test b/docs/_style/prism-master/tests/languages/asm6502/opcode_feature.test new file mode 100644 index 00000000..75e7b428 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asm6502/opcode_feature.test @@ -0,0 +1,17 @@ +LDA +BNE +inx +clc + +------------------------------------- + +[ + ["opcode", "LDA"], + ["opcode", "BNE"], + ["opcode", "inx"], + ["opcode", "clc"] +] + +------------------------------------- + +Check for opcodes diff --git a/docs/_style/prism-master/tests/languages/asm6502/register_feature.test b/docs/_style/prism-master/tests/languages/asm6502/register_feature.test new file mode 100644 index 00000000..91ec7c42 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asm6502/register_feature.test @@ -0,0 +1,17 @@ +LDA $8000,x +ASL A + +------------------------- + +[ + ["opcode", "LDA"], + ["hexnumber", "$8000"], + ",", + ["register", "x"], + ["opcode", "ASL"], + ["register", "A"] +] + +------------------------- + +Check for registers diff --git a/docs/_style/prism-master/tests/languages/asm6502/string_feature.test b/docs/_style/prism-master/tests/languages/asm6502/string_feature.test new file mode 100644 index 00000000..02050744 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/asm6502/string_feature.test @@ -0,0 +1,12 @@ +.include "header.asm" + +------------------------- + +[ + ["directive", ".include"], + ["string", "\"header.asm\""] +] + +------------------------- + +Check for strings diff --git a/docs/_style/prism-master/tests/languages/aspnet/comment_feature.test b/docs/_style/prism-master/tests/languages/aspnet/comment_feature.test new file mode 100644 index 00000000..da388e5f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/aspnet/comment_feature.test @@ -0,0 +1,16 @@ +<%----%> +<%--foo--%> +<%-- foo +bar --%> + +---------------------------------------------------- + +[ + ["asp comment", "<%----%>"], + ["asp comment", "<%--foo--%>"], + ["asp comment", "<%-- foo\r\nbar --%>"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/aspnet/page-directive_feature.test b/docs/_style/prism-master/tests/languages/aspnet/page-directive_feature.test new file mode 100644 index 00000000..3d79dae9 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/aspnet/page-directive_feature.test @@ -0,0 +1,92 @@ +<%@Assembly foo="bar"%> +<% @Control foo="bar" %> +<%@ Implements%> +<%@Import%> +<%@Master%> +<%@MasterType%> +<%@OutputCache%> +<%@Page%> +<%@PreviousPageType%> +<%@Reference%> +<%@Register%> + +---------------------------------------------------- + +[ + ["page-directive tag", [ + ["page-directive tag", "<%@Assembly"], + ["attr-name", [ + "foo" + ]], + ["attr-value", [ + ["punctuation", "="], + ["punctuation", "\""], + "bar", + ["punctuation", "\""] + ]], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<% @Control"], + ["attr-name", [ + "foo" + ]], + ["attr-value", [ + ["punctuation", "="], + ["punctuation", "\""], + "bar", + ["punctuation", "\""] + ]], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<%@ Implements"], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<%@Import"], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<%@Master"], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<%@MasterType"], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<%@OutputCache"], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<%@Page"], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<%@PreviousPageType"], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<%@Reference"], + ["page-directive tag", "%>"] + ]], + + ["page-directive tag", [ + ["page-directive tag", "<%@Register"], + ["page-directive tag", "%>"] + ]] +] + +---------------------------------------------------- + +Checks for all page directives. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/boolean_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/boolean_feature.test new file mode 100644 index 00000000..6d97d4bf --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/boolean_feature.test @@ -0,0 +1,13 @@ +true +false + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"] +] + +---------------------------------------------------- + +Checks for booleans \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/builtin_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/builtin_feature.test new file mode 100644 index 00000000..afbe8d33 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/builtin_feature.test @@ -0,0 +1,147 @@ +abs +acos +asc +asin +atan +ceil +chr +class +cos +dllcall +exp +fileexist +Fileopen +floor +il_add +il_create +il_destroy +instr +substr +isfunc +islabel +IsObject +ln +log +lv_add +lv_delete +lv_deletecol +lv_getcount +lv_getnext +lv_gettext +lv_insert +lv_insertcol +lv_modify +lv_modifycol +lv_setimagelist +mod +onmessage +numget +numput +registercallback +regexmatch +regexreplace +round +sin +tan +sqrt +strlen +sb_seticon +sb_setparts +sb_settext +strsplit +tv_add +tv_delete +tv_getchild +tv_getcount +tv_getnext +tv_get +tv_getparent +tv_getprev +tv_getselection +tv_gettext +tv_modify +varsetcapacity +winactive +winexist +__New +__Call +__Get +__Set + +---------------------------------------------------- + +[ + ["builtin", "abs"], + ["builtin", "acos"], + ["builtin", "asc"], + ["builtin", "asin"], + ["builtin", "atan"], + ["builtin", "ceil"], + ["builtin", "chr"], + ["builtin", "class"], + ["builtin", "cos"], + ["builtin", "dllcall"], + ["builtin", "exp"], + ["builtin", "fileexist"], + ["builtin", "Fileopen"], + ["builtin", "floor"], + ["builtin", "il_add"], + ["builtin", "il_create"], + ["builtin", "il_destroy"], + ["builtin", "instr"], + ["builtin", "substr"], + ["builtin", "isfunc"], + ["builtin", "islabel"], + ["builtin", "IsObject"], + ["builtin", "ln"], + ["builtin", "log"], + ["builtin", "lv_add"], + ["builtin", "lv_delete"], + ["builtin", "lv_deletecol"], + ["builtin", "lv_getcount"], + ["builtin", "lv_getnext"], + ["builtin", "lv_gettext"], + ["builtin", "lv_insert"], + ["builtin", "lv_insertcol"], + ["builtin", "lv_modify"], + ["builtin", "lv_modifycol"], + ["builtin", "lv_setimagelist"], + ["builtin", "mod"], + ["builtin", "onmessage"], + ["builtin", "numget"], + ["builtin", "numput"], + ["builtin", "registercallback"], + ["builtin", "regexmatch"], + ["builtin", "regexreplace"], + ["builtin", "round"], + ["builtin", "sin"], + ["builtin", "tan"], + ["builtin", "sqrt"], + ["builtin", "strlen"], + ["builtin", "sb_seticon"], + ["builtin", "sb_setparts"], + ["builtin", "sb_settext"], + ["builtin", "strsplit"], + ["builtin", "tv_add"], + ["builtin", "tv_delete"], + ["builtin", "tv_getchild"], + ["builtin", "tv_getcount"], + ["builtin", "tv_getnext"], + ["builtin", "tv_get"], + ["builtin", "tv_getparent"], + ["builtin", "tv_getprev"], + ["builtin", "tv_getselection"], + ["builtin", "tv_gettext"], + ["builtin", "tv_modify"], + ["builtin", "varsetcapacity"], + ["builtin", "winactive"], + ["builtin", "winexist"], + ["builtin", "__New"], + ["builtin", "__Call"], + ["builtin", "__Get"], + ["builtin", "__Set"] +] + +---------------------------------------------------- + +Checks for all builtins. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/comment_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/comment_feature.test new file mode 100644 index 00000000..5b00ce20 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/comment_feature.test @@ -0,0 +1,13 @@ +;foo +; bar + +---------------------------------------------------- + +[ + ["comment", ";foo"], + ["comment", "; bar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/constant_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/constant_feature.test new file mode 100644 index 00000000..ab116734 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/constant_feature.test @@ -0,0 +1,275 @@ +a_ahkpath +a_ahkversion +a_appdata +a_appdatacommon +a_autotrim +a_batchlines +a_caretx +a_carety +a_computername +a_controldelay +a_cursor +a_dd +a_ddd +a_dddd +a_defaultmousespeed +a_desktop +a_desktopcommon +a_detecthiddentext +a_detecthiddenwindows +a_endchar +a_eventinfo +a_exitreason +a_formatfloat +a_formatinteger +a_gui +a_guievent +a_guicontrol +a_guicontrolevent +a_guiheight +a_guiwidth +a_guix +a_guiy +a_hour +a_iconfile +a_iconhidden +a_iconnumber +a_icontip +a_index +a_ipaddress1 +a_ipaddress2 +a_ipaddress3 +a_ipaddress4 +a_isadmin +a_iscompiled +a_iscritical +a_ispaused +a_issuspended +a_isunicode +a_keydelay +a_language +a_lasterror +a_linefile +a_linenumber +a_loopfield +a_loopfileattrib +a_loopfiledir +a_loopfileext +a_loopfilefullpath +a_loopfilelongpath +a_loopfilename +a_loopfileshortname +a_loopfileshortpath +a_loopfilesize +a_loopfilesizekb +a_loopfilesizemb +a_loopfiletimeaccessed +a_loopfiletimecreated +a_loopfiletimemodified +a_loopreadline +a_loopregkey +a_loopregname +a_loopregsubkey +a_loopregtimemodified +a_loopregtype +a_mday +a_min +a_mm +a_mmm +a_mmmm +a_mon +a_mousedelay +a_msec +a_mydocuments +a_now +a_nowutc +a_numbatchlines +a_ostype +a_osversion +a_priorhotkey +programfiles +a_programfiles +a_programs +a_programscommon +a_screenheight +a_screenwidth +a_scriptdir +a_scriptfullpath +a_scriptname +a_sec +a_space +a_startmenu +a_startmenucommon +a_startup +a_startupcommon +a_stringcasesense +a_tab +a_temp +a_thisfunc +a_thishotkey +a_thislabel +a_thismenu +a_thismenuitem +a_thismenuitempos +a_tickcount +a_timeidle +a_timeidlephysical +a_timesincepriorhotkey +a_timesincethishotkey +a_titlematchmode +a_titlematchmodespeed +a_username +a_wday +a_windelay +a_windir +a_workingdir +a_yday +a_year +a_yweek +a_yyyy +clipboard +clipboardall +comspec +errorlevel + +---------------------------------------------------- + +[ + ["constant", "a_ahkpath"], + ["constant", "a_ahkversion"], + ["constant", "a_appdata"], + ["constant", "a_appdatacommon"], + ["constant", "a_autotrim"], + ["constant", "a_batchlines"], + ["constant", "a_caretx"], + ["constant", "a_carety"], + ["constant", "a_computername"], + ["constant", "a_controldelay"], + ["constant", "a_cursor"], + ["constant", "a_dd"], + ["constant", "a_ddd"], + ["constant", "a_dddd"], + ["constant", "a_defaultmousespeed"], + ["constant", "a_desktop"], + ["constant", "a_desktopcommon"], + ["constant", "a_detecthiddentext"], + ["constant", "a_detecthiddenwindows"], + ["constant", "a_endchar"], + ["constant", "a_eventinfo"], + ["constant", "a_exitreason"], + ["constant", "a_formatfloat"], + ["constant", "a_formatinteger"], + ["constant", "a_gui"], + ["constant", "a_guievent"], + ["constant", "a_guicontrol"], + ["constant", "a_guicontrolevent"], + ["constant", "a_guiheight"], + ["constant", "a_guiwidth"], + ["constant", "a_guix"], + ["constant", "a_guiy"], + ["constant", "a_hour"], + ["constant", "a_iconfile"], + ["constant", "a_iconhidden"], + ["constant", "a_iconnumber"], + ["constant", "a_icontip"], + ["constant", "a_index"], + ["constant", "a_ipaddress1"], + ["constant", "a_ipaddress2"], + ["constant", "a_ipaddress3"], + ["constant", "a_ipaddress4"], + ["constant", "a_isadmin"], + ["constant", "a_iscompiled"], + ["constant", "a_iscritical"], + ["constant", "a_ispaused"], + ["constant", "a_issuspended"], + ["constant", "a_isunicode"], + ["constant", "a_keydelay"], + ["constant", "a_language"], + ["constant", "a_lasterror"], + ["constant", "a_linefile"], + ["constant", "a_linenumber"], + ["constant", "a_loopfield"], + ["constant", "a_loopfileattrib"], + ["constant", "a_loopfiledir"], + ["constant", "a_loopfileext"], + ["constant", "a_loopfilefullpath"], + ["constant", "a_loopfilelongpath"], + ["constant", "a_loopfilename"], + ["constant", "a_loopfileshortname"], + ["constant", "a_loopfileshortpath"], + ["constant", "a_loopfilesize"], + ["constant", "a_loopfilesizekb"], + ["constant", "a_loopfilesizemb"], + ["constant", "a_loopfiletimeaccessed"], + ["constant", "a_loopfiletimecreated"], + ["constant", "a_loopfiletimemodified"], + ["constant", "a_loopreadline"], + ["constant", "a_loopregkey"], + ["constant", "a_loopregname"], + ["constant", "a_loopregsubkey"], + ["constant", "a_loopregtimemodified"], + ["constant", "a_loopregtype"], + ["constant", "a_mday"], + ["constant", "a_min"], + ["constant", "a_mm"], + ["constant", "a_mmm"], + ["constant", "a_mmmm"], + ["constant", "a_mon"], + ["constant", "a_mousedelay"], + ["constant", "a_msec"], + ["constant", "a_mydocuments"], + ["constant", "a_now"], + ["constant", "a_nowutc"], + ["constant", "a_numbatchlines"], + ["constant", "a_ostype"], + ["constant", "a_osversion"], + ["constant", "a_priorhotkey"], + ["constant", "programfiles"], + ["constant", "a_programfiles"], + ["constant", "a_programs"], + ["constant", "a_programscommon"], + ["constant", "a_screenheight"], + ["constant", "a_screenwidth"], + ["constant", "a_scriptdir"], + ["constant", "a_scriptfullpath"], + ["constant", "a_scriptname"], + ["constant", "a_sec"], + ["constant", "a_space"], + ["constant", "a_startmenu"], + ["constant", "a_startmenucommon"], + ["constant", "a_startup"], + ["constant", "a_startupcommon"], + ["constant", "a_stringcasesense"], + ["constant", "a_tab"], + ["constant", "a_temp"], + ["constant", "a_thisfunc"], + ["constant", "a_thishotkey"], + ["constant", "a_thislabel"], + ["constant", "a_thismenu"], + ["constant", "a_thismenuitem"], + ["constant", "a_thismenuitempos"], + ["constant", "a_tickcount"], + ["constant", "a_timeidle"], + ["constant", "a_timeidlephysical"], + ["constant", "a_timesincepriorhotkey"], + ["constant", "a_timesincethishotkey"], + ["constant", "a_titlematchmode"], + ["constant", "a_titlematchmodespeed"], + ["constant", "a_username"], + ["constant", "a_wday"], + ["constant", "a_windelay"], + ["constant", "a_windir"], + ["constant", "a_workingdir"], + ["constant", "a_yday"], + ["constant", "a_year"], + ["constant", "a_yweek"], + ["constant", "a_yyyy"], + ["constant", "clipboard"], + ["constant", "clipboardall"], + ["constant", "comspec"], + ["constant", "errorlevel"] +] + +---------------------------------------------------- + +Checks for all constants. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/function_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/function_feature.test new file mode 100644 index 00000000..f38a186f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/function_feature.test @@ -0,0 +1,15 @@ +foo( +foo_bar( + +---------------------------------------------------- + +[ + ["function", "foo"], + ["punctuation", "("], + ["function", "foo_bar"], + ["punctuation", "("] +] + +---------------------------------------------------- + +Checks for functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/important_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/important_feature.test new file mode 100644 index 00000000..aa9cbeb5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/important_feature.test @@ -0,0 +1,67 @@ +#AllowSameLineComments +#ClipboardTimeout +#CommentFlag +#ErrorStdOut +#EscapeChar +#HotkeyInterval +#HotkeyModifierTimeout +#Hotstring +#IfWinActive +#IfWinExist +#IfWinNotActive +#IfWinNotExist +#Include +#IncludeAgain +#InstallKeybdHook +#InstallMouseHook +#KeyHistory +#LTrim +#MaxHotkeysPerInterval +#MaxMem +#MaxThreads +#MaxThreadsBuffer +#MaxThreadsPerHotkey +#NoEnv +#NoTrayIcon +#Persistent +#SingleInstance +#UseHook +#WinActivateForce + +---------------------------------------------------- + +[ + ["important", "#AllowSameLineComments"], + ["important", "#ClipboardTimeout"], + ["important", "#CommentFlag"], + ["important", "#ErrorStdOut"], + ["important", "#EscapeChar"], + ["important", "#HotkeyInterval"], + ["important", "#HotkeyModifierTimeout"], + ["important", "#Hotstring"], + ["important", "#IfWinActive"], + ["important", "#IfWinExist"], + ["important", "#IfWinNotActive"], + ["important", "#IfWinNotExist"], + ["important", "#Include"], + ["important", "#IncludeAgain"], + ["important", "#InstallKeybdHook"], + ["important", "#InstallMouseHook"], + ["important", "#KeyHistory"], + ["important", "#LTrim"], + ["important", "#MaxHotkeysPerInterval"], + ["important", "#MaxMem"], + ["important", "#MaxThreads"], + ["important", "#MaxThreadsBuffer"], + ["important", "#MaxThreadsPerHotkey"], + ["important", "#NoEnv"], + ["important", "#NoTrayIcon"], + ["important", "#Persistent"], + ["important", "#SingleInstance"], + ["important", "#UseHook"], + ["important", "#WinActivateForce"] +] + +---------------------------------------------------- + +Checks for all important keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/keyword_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/keyword_feature.test new file mode 100644 index 00000000..91671355 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/keyword_feature.test @@ -0,0 +1,537 @@ +Abort +AboveNormal +Add +ahk_class +ahk_group +ahk_id +ahk_pid +All +Alnum +Alpha +AltSubmit +AltTab +AltTabAndMenu +AltTabMenu +AltTabMenuDismiss +AlwaysOnTop +AutoSize +Background +BackgroundTrans +BelowNormal +between +BitAnd +BitNot +BitOr +BitShiftLeft +BitShiftRight +BitXOr +Bold +Border +Button +ByRef +Checkbox +Checked +CheckedGray +Choose +ChooseString +Close +Color +ComboBox +Contains +ControlList +Count +Date +DateTime +Days +DDL +Default +DeleteAll +Delimiter +Deref +Destroy +Digit +Disable +Disabled +DropDownList +Edit +Eject +Else +Enable +Enabled +Error +Exist +Expand +ExStyle +FileSystem +First +Flash +Float +FloatFast +Focus +Font +for +global +Grid +Group +GroupBox +GuiClose +GuiContextMenu +GuiDropFiles +GuiEscape +GuiSize +Hdr +Hidden +Hide +High +HKCC +HKCR +HKCU +HKEY_CLASSES_ROOT +HKEY_CURRENT_CONFIG +HKEY_CURRENT_USER +HKEY_LOCAL_MACHINE +HKEY_USERS +HKLM +HKU +Hours +HScroll +Icon +IconSmall +ID +IDLast +If +IfEqual +IfExist +IfGreater +IfGreaterOrEqual +IfInString +IfLess +IfLessOrEqual +IfMsgBox +IfNotEqual +IfNotExist +IfNotInString +IfWinActive +IfWinExist +IfWinNotActive +IfWinNotExist +Ignore +ImageList +in +Integer +IntegerFast +Interrupt +is +italic +Join +Label +LastFound +LastFoundExist +Limit +Lines +List +ListBox +ListView +local +Lock +Logoff +Low +Lower +Lowercase +MainWindow +Margin +Maximize +MaximizeBox +MaxSize +Minimize +MinimizeBox +MinMax +MinSize +Minutes +MonthCal +Mouse +Move +Multi +NA +No +NoActivate +NoDefault +NoHide +NoIcon +NoMainWindow +norm +Normal +NoSort +NoSortHdr +NoStandard +Not +NoTab +NoTimers +Number +Off +Ok +On +OwnDialogs +Owner +Parse +Password +Picture +Pixel +Pos +Pow +Priority +ProcessName +Radio +Range +Read +ReadOnly +Realtime +Redraw +REG_BINARY +REG_DWORD +REG_EXPAND_SZ +REG_MULTI_SZ +REG_SZ +Region +Relative +Rename +Report +Resize +Restore +Retry +RGB +Screen +Seconds +Section +Serial +SetLabel +ShiftAltTab +Show +Single +Slider +SortDesc +Standard +static +Status +StatusBar +StatusCD +strike +Style +Submit +SysMenu +Tab2 +TabStop +Text +Theme +Tile +ToggleCheck +ToggleEnable +ToolWindow +Top +Topmost +TransColor +Transparent +Tray +TreeView +TryAgain +Type +UnCheck +underline +Unicode +Unlock +UpDown +Upper +Uppercase +UseErrorLevel +Vis +VisFirst +Visible +VScroll +Wait +WaitClose +WantCtrlA +WantF2 +WantReturn +While +Wrap +Xdigit +xm +xp +xs +Yes +ym +yp +ys + +---------------------------------------------------- + +[ + ["keyword", "Abort"], + ["keyword", "AboveNormal"], + ["keyword", "Add"], + ["keyword", "ahk_class"], + ["keyword", "ahk_group"], + ["keyword", "ahk_id"], + ["keyword", "ahk_pid"], + ["keyword", "All"], + ["keyword", "Alnum"], + ["keyword", "Alpha"], + ["keyword", "AltSubmit"], + ["keyword", "AltTab"], + ["keyword", "AltTabAndMenu"], + ["keyword", "AltTabMenu"], + ["keyword", "AltTabMenuDismiss"], + ["keyword", "AlwaysOnTop"], + ["keyword", "AutoSize"], + ["keyword", "Background"], + ["keyword", "BackgroundTrans"], + ["keyword", "BelowNormal"], + ["keyword", "between"], + ["keyword", "BitAnd"], + ["keyword", "BitNot"], + ["keyword", "BitOr"], + ["keyword", "BitShiftLeft"], + ["keyword", "BitShiftRight"], + ["keyword", "BitXOr"], + ["keyword", "Bold"], + ["keyword", "Border"], + ["keyword", "Button"], + ["keyword", "ByRef"], + ["keyword", "Checkbox"], + ["keyword", "Checked"], + ["keyword", "CheckedGray"], + ["keyword", "Choose"], + ["keyword", "ChooseString"], + ["keyword", "Close"], + ["keyword", "Color"], + ["keyword", "ComboBox"], + ["keyword", "Contains"], + ["keyword", "ControlList"], + ["keyword", "Count"], + ["keyword", "Date"], + ["keyword", "DateTime"], + ["keyword", "Days"], + ["keyword", "DDL"], + ["keyword", "Default"], + ["keyword", "DeleteAll"], + ["keyword", "Delimiter"], + ["keyword", "Deref"], + ["keyword", "Destroy"], + ["keyword", "Digit"], + ["keyword", "Disable"], + ["keyword", "Disabled"], + ["keyword", "DropDownList"], + ["keyword", "Edit"], + ["keyword", "Eject"], + ["keyword", "Else"], + ["keyword", "Enable"], + ["keyword", "Enabled"], + ["keyword", "Error"], + ["keyword", "Exist"], + ["keyword", "Expand"], + ["keyword", "ExStyle"], + ["keyword", "FileSystem"], + ["keyword", "First"], + ["keyword", "Flash"], + ["keyword", "Float"], + ["keyword", "FloatFast"], + ["keyword", "Focus"], + ["keyword", "Font"], + ["keyword", "for"], + ["keyword", "global"], + ["keyword", "Grid"], + ["keyword", "Group"], + ["keyword", "GroupBox"], + ["keyword", "GuiClose"], + ["keyword", "GuiContextMenu"], + ["keyword", "GuiDropFiles"], + ["keyword", "GuiEscape"], + ["keyword", "GuiSize"], + ["keyword", "Hdr"], + ["keyword", "Hidden"], + ["keyword", "Hide"], + ["keyword", "High"], + ["keyword", "HKCC"], + ["keyword", "HKCR"], + ["keyword", "HKCU"], + ["keyword", "HKEY_CLASSES_ROOT"], + ["keyword", "HKEY_CURRENT_CONFIG"], + ["keyword", "HKEY_CURRENT_USER"], + ["keyword", "HKEY_LOCAL_MACHINE"], + ["keyword", "HKEY_USERS"], + ["keyword", "HKLM"], + ["keyword", "HKU"], + ["keyword", "Hours"], + ["keyword", "HScroll"], + ["keyword", "Icon"], + ["keyword", "IconSmall"], + ["keyword", "ID"], + ["keyword", "IDLast"], + ["keyword", "If"], + ["keyword", "IfEqual"], + ["keyword", "IfExist"], + ["keyword", "IfGreater"], + ["keyword", "IfGreaterOrEqual"], + ["keyword", "IfInString"], + ["keyword", "IfLess"], + ["keyword", "IfLessOrEqual"], + ["keyword", "IfMsgBox"], + ["keyword", "IfNotEqual"], + ["keyword", "IfNotExist"], + ["keyword", "IfNotInString"], + ["keyword", "IfWinActive"], + ["keyword", "IfWinExist"], + ["keyword", "IfWinNotActive"], + ["keyword", "IfWinNotExist"], + ["keyword", "Ignore"], + ["keyword", "ImageList"], + ["keyword", "in"], + ["keyword", "Integer"], + ["keyword", "IntegerFast"], + ["keyword", "Interrupt"], + ["keyword", "is"], + ["keyword", "italic"], + ["keyword", "Join"], + ["keyword", "Label"], + ["keyword", "LastFound"], + ["keyword", "LastFoundExist"], + ["keyword", "Limit"], + ["keyword", "Lines"], + ["keyword", "List"], + ["keyword", "ListBox"], + ["keyword", "ListView"], + ["keyword", "local"], + ["keyword", "Lock"], + ["keyword", "Logoff"], + ["keyword", "Low"], + ["keyword", "Lower"], + ["keyword", "Lowercase"], + ["keyword", "MainWindow"], + ["keyword", "Margin"], + ["keyword", "Maximize"], + ["keyword", "MaximizeBox"], + ["keyword", "MaxSize"], + ["keyword", "Minimize"], + ["keyword", "MinimizeBox"], + ["keyword", "MinMax"], + ["keyword", "MinSize"], + ["keyword", "Minutes"], + ["keyword", "MonthCal"], + ["keyword", "Mouse"], + ["keyword", "Move"], + ["keyword", "Multi"], + ["keyword", "NA"], + ["keyword", "No"], + ["keyword", "NoActivate"], + ["keyword", "NoDefault"], + ["keyword", "NoHide"], + ["keyword", "NoIcon"], + ["keyword", "NoMainWindow"], + ["keyword", "norm"], + ["keyword", "Normal"], + ["keyword", "NoSort"], + ["keyword", "NoSortHdr"], + ["keyword", "NoStandard"], + ["keyword", "Not"], + ["keyword", "NoTab"], + ["keyword", "NoTimers"], + ["keyword", "Number"], + ["keyword", "Off"], + ["keyword", "Ok"], + ["keyword", "On"], + ["keyword", "OwnDialogs"], + ["keyword", "Owner"], + ["keyword", "Parse"], + ["keyword", "Password"], + ["keyword", "Picture"], + ["keyword", "Pixel"], + ["keyword", "Pos"], + ["keyword", "Pow"], + ["keyword", "Priority"], + ["keyword", "ProcessName"], + ["keyword", "Radio"], + ["keyword", "Range"], + ["keyword", "Read"], + ["keyword", "ReadOnly"], + ["keyword", "Realtime"], + ["keyword", "Redraw"], + ["keyword", "REG_BINARY"], + ["keyword", "REG_DWORD"], + ["keyword", "REG_EXPAND_SZ"], + ["keyword", "REG_MULTI_SZ"], + ["keyword", "REG_SZ"], + ["keyword", "Region"], + ["keyword", "Relative"], + ["keyword", "Rename"], + ["keyword", "Report"], + ["keyword", "Resize"], + ["keyword", "Restore"], + ["keyword", "Retry"], + ["keyword", "RGB"], + ["keyword", "Screen"], + ["keyword", "Seconds"], + ["keyword", "Section"], + ["keyword", "Serial"], + ["keyword", "SetLabel"], + ["keyword", "ShiftAltTab"], + ["keyword", "Show"], + ["keyword", "Single"], + ["keyword", "Slider"], + ["keyword", "SortDesc"], + ["keyword", "Standard"], + ["keyword", "static"], + ["keyword", "Status"], + ["keyword", "StatusBar"], + ["keyword", "StatusCD"], + ["keyword", "strike"], + ["keyword", "Style"], + ["keyword", "Submit"], + ["keyword", "SysMenu"], + ["keyword", "Tab2"], + ["keyword", "TabStop"], + ["keyword", "Text"], + ["keyword", "Theme"], + ["keyword", "Tile"], + ["keyword", "ToggleCheck"], + ["keyword", "ToggleEnable"], + ["keyword", "ToolWindow"], + ["keyword", "Top"], + ["keyword", "Topmost"], + ["keyword", "TransColor"], + ["keyword", "Transparent"], + ["keyword", "Tray"], + ["keyword", "TreeView"], + ["keyword", "TryAgain"], + ["keyword", "Type"], + ["keyword", "UnCheck"], + ["keyword", "underline"], + ["keyword", "Unicode"], + ["keyword", "Unlock"], + ["keyword", "UpDown"], + ["keyword", "Upper"], + ["keyword", "Uppercase"], + ["keyword", "UseErrorLevel"], + ["keyword", "Vis"], + ["keyword", "VisFirst"], + ["keyword", "Visible"], + ["keyword", "VScroll"], + ["keyword", "Wait"], + ["keyword", "WaitClose"], + ["keyword", "WantCtrlA"], + ["keyword", "WantF2"], + ["keyword", "WantReturn"], + ["keyword", "While"], + ["keyword", "Wrap"], + ["keyword", "Xdigit"], + ["keyword", "xm"], + ["keyword", "xp"], + ["keyword", "xs"], + ["keyword", "Yes"], + ["keyword", "ym"], + ["keyword", "yp"], + ["keyword", "ys"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/number_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/number_feature.test new file mode 100644 index 00000000..35a493ae --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/number_feature.test @@ -0,0 +1,21 @@ +42 +3.14159 +3.2e10 +2.9E-7 +0xbabe +0xBABE + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "3.2e10"], + ["number", "2.9E-7"], + ["number", "0xbabe"], + ["number", "0xBABE"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/operator_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/operator_feature.test new file mode 100644 index 00000000..ec9e23ed --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/operator_feature.test @@ -0,0 +1,33 @@ ++ - * / += ? & | +< > +++ -- ** // +! ~ ^ . +<< >> <= >= +~= == <> != +NOT AND && OR || +:= += -= *= +/= //= .= +|= &= ^= +>>= <<= + +---------------------------------------------------- + +[ + ["operator", "+"], ["operator", "-"], ["operator", "*"], ["operator", "/"], + ["operator", "="], ["operator", "?"], ["operator", "&"], ["operator", "|"], + ["operator", "<"], ["operator", ">"], + ["operator", "++"], ["operator", "--"], ["operator", "**"], ["operator", "//"], + ["operator", "!"], ["operator", "~"], ["operator", "^"], ["operator", "."], + ["operator", "<<"], ["operator", ">>"], ["operator", "<="], ["operator", ">="], + ["operator", "~="], ["operator", "=="], ["operator", "<>"], ["operator", "!="], + ["operator", "NOT"], ["operator", "AND"], ["operator", "&&"], ["operator", "OR"], ["operator", "||"], + ["operator", ":="], ["operator", "+="], ["operator", "-="], ["operator", "*="], + ["operator", "/="], ["operator", "//="], ["operator", ".="], + ["operator", "|="], ["operator", "&="], ["operator", "^="], + ["operator", ">>="], ["operator", "<<="] +] + +---------------------------------------------------- + +Checks for all operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/selector_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/selector_feature.test new file mode 100644 index 00000000..29210c26 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/selector_feature.test @@ -0,0 +1,381 @@ +AutoTrim +BlockInput +Break +Click +ClipWait +Continue +Control +ControlClick +ControlFocus +ControlGet +ControlGetFocus +ControlGetPos +ControlGetText +ControlMove +ControlSend +ControlSendRaw +ControlSetText +CoordMode +Critical +DetectHiddenText +DetectHiddenWindows +Drive +DriveGet +DriveSpaceFree +EnvAdd +EnvDiv +EnvGet +EnvMult +EnvSet +EnvSub +EnvUpdate +Exit +ExitApp +FileAppend +FileCopy +FileCopyDir +FileCreateDir +FileCreateShortcut +FileDelete +FileEncoding +FileGetAttrib +FileGetShortcut +FileGetSize +FileGetTime +FileGetVersion +FileInstall +FileMove +FileMoveDir +FileRead +FileReadLine +FileRecycle +FileRecycleEmpty +FileRemoveDir +FileSelectFile +FileSelectFolder +FileSetAttrib +FileSetTime +FormatTime +GetKeyState +Gosub +Goto +GroupActivate +GroupAdd +GroupClose +GroupDeactivate +Gui +GuiControl +GuiControlGet +Hotkey +ImageSearch +IniDelete +IniRead +IniWrite +Input +InputBox +KeyWait +ListHotkeys +ListLines +ListVars +Loop +Menu +MouseClick +MouseClickDrag +MouseGetPos +MouseMove +MsgBox +OnExit +OutputDebug +Pause +PixelGetColor +PixelSearch +PostMessage +Process +Progress +Random +RegDelete +RegRead +RegWrite +Reload +Repeat +Return +Run +RunAs +RunWait +Send +SendEvent +SendInput +SendMessage +SendMode +SendPlay +SendRaw +SetBatchLines +SetCapslockState +SetControlDelay +SetDefaultMouseSpeed +SetEnv +SetFormat +SetKeyDelay +SetMouseDelay +SetNumlockState +SetScrollLockState +SetStoreCapslockMode +SetTimer +SetTitleMatchMode +SetWinDelay +SetWorkingDir +Shutdown +Sleep +Sort +SoundBeep +SoundGet +SoundGetWaveVolume +SoundPlay +SoundSet +SoundSetWaveVolume +SplashImage +SplashTextOff +SplashTextOn +SplitPath +StatusBarGetText +StatusBarWait +StringCaseSense +StringGetPos +StringLeft +StringLen +StringLower +StringMid +StringReplace +StringRight +StringSplit +StringTrimLeft +StringTrimRight +StringUpper +Suspend +SysGet +Thread +ToolTip +Transform +TrayTip +URLDownloadToFile +WinActivate +WinActivateBottom +WinClose +WinGet +WinGetActiveStats +WinGetActiveTitle +WinGetClass +WinGetPos +WinGetText +WinGetTitle +WinHide +WinKill +WinMaximize +WinMenuSelectItem +WinMinimize +WinMinimizeAll +WinMinimizeAllUndo +WinMove +WinRestore +WinSet +WinSetTitle +WinShow +WinWait +WinWaitActive +WinWaitClose +WinWaitNotActive + +---------------------------------------------------- + +[ + ["selector", "AutoTrim"], + ["selector", "BlockInput"], + ["selector", "Break"], + ["selector", "Click"], + ["selector", "ClipWait"], + ["selector", "Continue"], + ["selector", "Control"], + ["selector", "ControlClick"], + ["selector", "ControlFocus"], + ["selector", "ControlGet"], + ["selector", "ControlGetFocus"], + ["selector", "ControlGetPos"], + ["selector", "ControlGetText"], + ["selector", "ControlMove"], + ["selector", "ControlSend"], + ["selector", "ControlSendRaw"], + ["selector", "ControlSetText"], + ["selector", "CoordMode"], + ["selector", "Critical"], + ["selector", "DetectHiddenText"], + ["selector", "DetectHiddenWindows"], + ["selector", "Drive"], + ["selector", "DriveGet"], + ["selector", "DriveSpaceFree"], + ["selector", "EnvAdd"], + ["selector", "EnvDiv"], + ["selector", "EnvGet"], + ["selector", "EnvMult"], + ["selector", "EnvSet"], + ["selector", "EnvSub"], + ["selector", "EnvUpdate"], + ["selector", "Exit"], + ["selector", "ExitApp"], + ["selector", "FileAppend"], + ["selector", "FileCopy"], + ["selector", "FileCopyDir"], + ["selector", "FileCreateDir"], + ["selector", "FileCreateShortcut"], + ["selector", "FileDelete"], + ["selector", "FileEncoding"], + ["selector", "FileGetAttrib"], + ["selector", "FileGetShortcut"], + ["selector", "FileGetSize"], + ["selector", "FileGetTime"], + ["selector", "FileGetVersion"], + ["selector", "FileInstall"], + ["selector", "FileMove"], + ["selector", "FileMoveDir"], + ["selector", "FileRead"], + ["selector", "FileReadLine"], + ["selector", "FileRecycle"], + ["selector", "FileRecycleEmpty"], + ["selector", "FileRemoveDir"], + ["selector", "FileSelectFile"], + ["selector", "FileSelectFolder"], + ["selector", "FileSetAttrib"], + ["selector", "FileSetTime"], + ["selector", "FormatTime"], + ["selector", "GetKeyState"], + ["selector", "Gosub"], + ["selector", "Goto"], + ["selector", "GroupActivate"], + ["selector", "GroupAdd"], + ["selector", "GroupClose"], + ["selector", "GroupDeactivate"], + ["selector", "Gui"], + ["selector", "GuiControl"], + ["selector", "GuiControlGet"], + ["selector", "Hotkey"], + ["selector", "ImageSearch"], + ["selector", "IniDelete"], + ["selector", "IniRead"], + ["selector", "IniWrite"], + ["selector", "Input"], + ["selector", "InputBox"], + ["selector", "KeyWait"], + ["selector", "ListHotkeys"], + ["selector", "ListLines"], + ["selector", "ListVars"], + ["selector", "Loop"], + ["selector", "Menu"], + ["selector", "MouseClick"], + ["selector", "MouseClickDrag"], + ["selector", "MouseGetPos"], + ["selector", "MouseMove"], + ["selector", "MsgBox"], + ["selector", "OnExit"], + ["selector", "OutputDebug"], + ["selector", "Pause"], + ["selector", "PixelGetColor"], + ["selector", "PixelSearch"], + ["selector", "PostMessage"], + ["selector", "Process"], + ["selector", "Progress"], + ["selector", "Random"], + ["selector", "RegDelete"], + ["selector", "RegRead"], + ["selector", "RegWrite"], + ["selector", "Reload"], + ["selector", "Repeat"], + ["selector", "Return"], + ["selector", "Run"], + ["selector", "RunAs"], + ["selector", "RunWait"], + ["selector", "Send"], + ["selector", "SendEvent"], + ["selector", "SendInput"], + ["selector", "SendMessage"], + ["selector", "SendMode"], + ["selector", "SendPlay"], + ["selector", "SendRaw"], + ["selector", "SetBatchLines"], + ["selector", "SetCapslockState"], + ["selector", "SetControlDelay"], + ["selector", "SetDefaultMouseSpeed"], + ["selector", "SetEnv"], + ["selector", "SetFormat"], + ["selector", "SetKeyDelay"], + ["selector", "SetMouseDelay"], + ["selector", "SetNumlockState"], + ["selector", "SetScrollLockState"], + ["selector", "SetStoreCapslockMode"], + ["selector", "SetTimer"], + ["selector", "SetTitleMatchMode"], + ["selector", "SetWinDelay"], + ["selector", "SetWorkingDir"], + ["selector", "Shutdown"], + ["selector", "Sleep"], + ["selector", "Sort"], + ["selector", "SoundBeep"], + ["selector", "SoundGet"], + ["selector", "SoundGetWaveVolume"], + ["selector", "SoundPlay"], + ["selector", "SoundSet"], + ["selector", "SoundSetWaveVolume"], + ["selector", "SplashImage"], + ["selector", "SplashTextOff"], + ["selector", "SplashTextOn"], + ["selector", "SplitPath"], + ["selector", "StatusBarGetText"], + ["selector", "StatusBarWait"], + ["selector", "StringCaseSense"], + ["selector", "StringGetPos"], + ["selector", "StringLeft"], + ["selector", "StringLen"], + ["selector", "StringLower"], + ["selector", "StringMid"], + ["selector", "StringReplace"], + ["selector", "StringRight"], + ["selector", "StringSplit"], + ["selector", "StringTrimLeft"], + ["selector", "StringTrimRight"], + ["selector", "StringUpper"], + ["selector", "Suspend"], + ["selector", "SysGet"], + ["selector", "Thread"], + ["selector", "ToolTip"], + ["selector", "Transform"], + ["selector", "TrayTip"], + ["selector", "URLDownloadToFile"], + ["selector", "WinActivate"], + ["selector", "WinActivateBottom"], + ["selector", "WinClose"], + ["selector", "WinGet"], + ["selector", "WinGetActiveStats"], + ["selector", "WinGetActiveTitle"], + ["selector", "WinGetClass"], + ["selector", "WinGetPos"], + ["selector", "WinGetText"], + ["selector", "WinGetTitle"], + ["selector", "WinHide"], + ["selector", "WinKill"], + ["selector", "WinMaximize"], + ["selector", "WinMenuSelectItem"], + ["selector", "WinMinimize"], + ["selector", "WinMinimizeAll"], + ["selector", "WinMinimizeAllUndo"], + ["selector", "WinMove"], + ["selector", "WinRestore"], + ["selector", "WinSet"], + ["selector", "WinSetTitle"], + ["selector", "WinShow"], + ["selector", "WinWait"], + ["selector", "WinWaitActive"], + ["selector", "WinWaitClose"], + ["selector", "WinWaitNotActive"] +] + +---------------------------------------------------- + +Checks for all selectors. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/string_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/string_feature.test new file mode 100644 index 00000000..76168fd2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/string_feature.test @@ -0,0 +1,15 @@ +"" +"foo" +"foo""bar" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"foo\""], + ["string", "\"foo\"\"bar\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/symbol_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/symbol_feature.test new file mode 100644 index 00000000..2c477774 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/symbol_feature.test @@ -0,0 +1,347 @@ +alt +altdown +altup +appskey +backspace +browser_back +browser_favorites +browser_forward +browser_home +browser_refresh +browser_search +browser_stop +bs +capslock +ctrl +ctrlbreak +ctrldown +ctrlup +del +delete +down +end +enter +esc +escape +f1 +f10 +f11 +f12 +f13 +f14 +f15 +f16 +f17 +f18 +f19 +f2 +f20 +f21 +f22 +f23 +f24 +f3 +f4 +f5 +f6 +f7 +f8 +f9 +home +ins +insert +joy1 +joy10 +joy11 +joy12 +joy13 +joy14 +joy15 +joy16 +joy17 +joy18 +joy19 +joy2 +joy20 +joy21 +joy22 +joy23 +joy24 +joy25 +joy26 +joy27 +joy28 +joy29 +joy3 +joy30 +joy31 +joy32 +joy4 +joy5 +joy6 +joy7 +joy8 +joy9 +joyaxes +joybuttons +joyinfo +joyname +joypov +joyr +joyu +joyv +joyx +joyy +joyz +lalt +launch_app1 +launch_app2 +launch_mail +launch_media +lbutton +lcontrol +lctrl +left +lshift +lwin +lwindown +lwinup +mbutton +media_next +media_play_pause +media_prev +media_stop +numlock +numpad0 +numpad1 +numpad2 +numpad3 +numpad4 +numpad5 +numpad6 +numpad7 +numpad8 +numpad9 +numpadadd +numpadclear +numpaddel +numpaddiv +numpaddot +numpaddown +numpadend +numpadenter +numpadhome +numpadins +numpadleft +numpadmult +numpadpgdn +numpadpgup +numpadright +numpadsub +numpadup +pgdn +pgup +printscreen +ralt +rbutton +rcontrol +rctrl +right +rshift +rwin +rwindown +rwinup +scrolllock +shift +shiftdown +shiftup +space +tab +up +volume_down +volume_mute +volume_up +wheeldown +wheelleft +wheelright +wheelup +xbutton1 +xbutton2 + +---------------------------------------------------- + +[ + ["symbol", "alt"], + ["symbol", "altdown"], + ["symbol", "altup"], + ["symbol", "appskey"], + ["symbol", "backspace"], + ["symbol", "browser_back"], + ["symbol", "browser_favorites"], + ["symbol", "browser_forward"], + ["symbol", "browser_home"], + ["symbol", "browser_refresh"], + ["symbol", "browser_search"], + ["symbol", "browser_stop"], + ["symbol", "bs"], + ["symbol", "capslock"], + ["symbol", "ctrl"], + ["symbol", "ctrlbreak"], + ["symbol", "ctrldown"], + ["symbol", "ctrlup"], + ["symbol", "del"], + ["symbol", "delete"], + ["symbol", "down"], + ["symbol", "end"], + ["symbol", "enter"], + ["symbol", "esc"], + ["symbol", "escape"], + ["symbol", "f1"], + ["symbol", "f10"], + ["symbol", "f11"], + ["symbol", "f12"], + ["symbol", "f13"], + ["symbol", "f14"], + ["symbol", "f15"], + ["symbol", "f16"], + ["symbol", "f17"], + ["symbol", "f18"], + ["symbol", "f19"], + ["symbol", "f2"], + ["symbol", "f20"], + ["symbol", "f21"], + ["symbol", "f22"], + ["symbol", "f23"], + ["symbol", "f24"], + ["symbol", "f3"], + ["symbol", "f4"], + ["symbol", "f5"], + ["symbol", "f6"], + ["symbol", "f7"], + ["symbol", "f8"], + ["symbol", "f9"], + ["symbol", "home"], + ["symbol", "ins"], + ["symbol", "insert"], + ["symbol", "joy1"], + ["symbol", "joy10"], + ["symbol", "joy11"], + ["symbol", "joy12"], + ["symbol", "joy13"], + ["symbol", "joy14"], + ["symbol", "joy15"], + ["symbol", "joy16"], + ["symbol", "joy17"], + ["symbol", "joy18"], + ["symbol", "joy19"], + ["symbol", "joy2"], + ["symbol", "joy20"], + ["symbol", "joy21"], + ["symbol", "joy22"], + ["symbol", "joy23"], + ["symbol", "joy24"], + ["symbol", "joy25"], + ["symbol", "joy26"], + ["symbol", "joy27"], + ["symbol", "joy28"], + ["symbol", "joy29"], + ["symbol", "joy3"], + ["symbol", "joy30"], + ["symbol", "joy31"], + ["symbol", "joy32"], + ["symbol", "joy4"], + ["symbol", "joy5"], + ["symbol", "joy6"], + ["symbol", "joy7"], + ["symbol", "joy8"], + ["symbol", "joy9"], + ["symbol", "joyaxes"], + ["symbol", "joybuttons"], + ["symbol", "joyinfo"], + ["symbol", "joyname"], + ["symbol", "joypov"], + ["symbol", "joyr"], + ["symbol", "joyu"], + ["symbol", "joyv"], + ["symbol", "joyx"], + ["symbol", "joyy"], + ["symbol", "joyz"], + ["symbol", "lalt"], + ["symbol", "launch_app1"], + ["symbol", "launch_app2"], + ["symbol", "launch_mail"], + ["symbol", "launch_media"], + ["symbol", "lbutton"], + ["symbol", "lcontrol"], + ["symbol", "lctrl"], + ["symbol", "left"], + ["symbol", "lshift"], + ["symbol", "lwin"], + ["symbol", "lwindown"], + ["symbol", "lwinup"], + ["symbol", "mbutton"], + ["symbol", "media_next"], + ["symbol", "media_play_pause"], + ["symbol", "media_prev"], + ["symbol", "media_stop"], + ["symbol", "numlock"], + ["symbol", "numpad0"], + ["symbol", "numpad1"], + ["symbol", "numpad2"], + ["symbol", "numpad3"], + ["symbol", "numpad4"], + ["symbol", "numpad5"], + ["symbol", "numpad6"], + ["symbol", "numpad7"], + ["symbol", "numpad8"], + ["symbol", "numpad9"], + ["symbol", "numpadadd"], + ["symbol", "numpadclear"], + ["symbol", "numpaddel"], + ["symbol", "numpaddiv"], + ["symbol", "numpaddot"], + ["symbol", "numpaddown"], + ["symbol", "numpadend"], + ["symbol", "numpadenter"], + ["symbol", "numpadhome"], + ["symbol", "numpadins"], + ["symbol", "numpadleft"], + ["symbol", "numpadmult"], + ["symbol", "numpadpgdn"], + ["symbol", "numpadpgup"], + ["symbol", "numpadright"], + ["symbol", "numpadsub"], + ["symbol", "numpadup"], + ["symbol", "pgdn"], + ["symbol", "pgup"], + ["symbol", "printscreen"], + ["symbol", "ralt"], + ["symbol", "rbutton"], + ["symbol", "rcontrol"], + ["symbol", "rctrl"], + ["symbol", "right"], + ["symbol", "rshift"], + ["symbol", "rwin"], + ["symbol", "rwindown"], + ["symbol", "rwinup"], + ["symbol", "scrolllock"], + ["symbol", "shift"], + ["symbol", "shiftdown"], + ["symbol", "shiftup"], + ["symbol", "space"], + ["symbol", "tab"], + ["symbol", "up"], + ["symbol", "volume_down"], + ["symbol", "volume_mute"], + ["symbol", "volume_up"], + ["symbol", "wheeldown"], + ["symbol", "wheelleft"], + ["symbol", "wheelright"], + ["symbol", "wheelup"], + ["symbol", "xbutton1"], + ["symbol", "xbutton2"] +] + +---------------------------------------------------- + +Checks for all symbols. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/tag_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/tag_feature.test new file mode 100644 index 00000000..0ca92589 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/tag_feature.test @@ -0,0 +1,15 @@ +foo: +foo_bar: + +---------------------------------------------------- + +[ + ["tag", "foo"], + ["punctuation", ":"], + ["tag", "foo_bar"], + ["punctuation", ":"] +] + +---------------------------------------------------- + +Checks for tags (labels). \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autohotkey/variable_feature.test b/docs/_style/prism-master/tests/languages/autohotkey/variable_feature.test new file mode 100644 index 00000000..5ed8a4c5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autohotkey/variable_feature.test @@ -0,0 +1,13 @@ +%foo% +%foo_bar% + +---------------------------------------------------- + +[ + ["variable", "%foo%"], + ["variable", "%foo_bar%"] +] + +---------------------------------------------------- + +Checks for variables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/boolean_feature.test b/docs/_style/prism-master/tests/languages/autoit/boolean_feature.test new file mode 100644 index 00000000..5750be06 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/boolean_feature.test @@ -0,0 +1,13 @@ +True +False + +---------------------------------------------------- + +[ + ["boolean", "True"], + ["boolean", "False"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/comment_feature.test b/docs/_style/prism-master/tests/languages/autoit/comment_feature.test new file mode 100644 index 00000000..d88708f3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/comment_feature.test @@ -0,0 +1,33 @@ +; +; foo +#comments-start + foobar() +#comments-end +#cs + foobar() +#ce +;#comments-start + foobar() +;#comments-end +;#cs + foobar() +;#ce + +---------------------------------------------------- + +[ + ["comment", ";"], + ["comment", "; foo"], + ["comment", "#comments-start\r\n\tfoobar()\r\n#comments-end"], + ["comment", "#cs\r\n\tfoobar()\r\n#ce"], + ["comment", ";#comments-start"], + ["function", "foobar"], ["punctuation", "("], ["punctuation", ")"], + ["comment", ";#comments-end"], + ["comment", ";#cs"], + ["function", "foobar"], ["punctuation", "("], ["punctuation", ")"], + ["comment", ";#ce"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/directive_feature.test b/docs/_style/prism-master/tests/languages/autoit/directive_feature.test new file mode 100644 index 00000000..9219f700 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/directive_feature.test @@ -0,0 +1,13 @@ +#NoTrayIcon +#OnAutoItStartRegister "Example" + +---------------------------------------------------- + +[ + ["directive", "#NoTrayIcon"], + ["directive", "#OnAutoItStartRegister"], ["string", ["\"Example\""]] +] + +---------------------------------------------------- + +Checks for directives. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/function_feature.test b/docs/_style/prism-master/tests/languages/autoit/function_feature.test new file mode 100644 index 00000000..13c82dda --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/function_feature.test @@ -0,0 +1,15 @@ +foo() +foo_bar() +foo_bar_42() + +---------------------------------------------------- + +[ + ["function", "foo"], ["punctuation", "("], ["punctuation", ")"], + ["function", "foo_bar"], ["punctuation", "("], ["punctuation", ")"], + ["function", "foo_bar_42"], ["punctuation", "("], ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/keyword_feature.test b/docs/_style/prism-master/tests/languages/autoit/keyword_feature.test new file mode 100644 index 00000000..2db276cb --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/keyword_feature.test @@ -0,0 +1,83 @@ +Case +Const +ContinueCase +ContinueLoop +Default +Dim +Do +Else +ElseIf +EndFunc +EndIf +EndSelect +EndSwitch +EndWith +Enum +Exit +ExitLoop +For +Func +Global +If +In +Local +Next +Null +ReDim +Select +Static +Step +Switch +Then +To +Until +Volatile +WEnd +While +With + +---------------------------------------------------- + +[ + ["keyword", "Case"], + ["keyword", "Const"], + ["keyword", "ContinueCase"], + ["keyword", "ContinueLoop"], + ["keyword", "Default"], + ["keyword", "Dim"], + ["keyword", "Do"], + ["keyword", "Else"], + ["keyword", "ElseIf"], + ["keyword", "EndFunc"], + ["keyword", "EndIf"], + ["keyword", "EndSelect"], + ["keyword", "EndSwitch"], + ["keyword", "EndWith"], + ["keyword", "Enum"], + ["keyword", "Exit"], + ["keyword", "ExitLoop"], + ["keyword", "For"], + ["keyword", "Func"], + ["keyword", "Global"], + ["keyword", "If"], + ["keyword", "In"], + ["keyword", "Local"], + ["keyword", "Next"], + ["keyword", "Null"], + ["keyword", "ReDim"], + ["keyword", "Select"], + ["keyword", "Static"], + ["keyword", "Step"], + ["keyword", "Switch"], + ["keyword", "Then"], + ["keyword", "To"], + ["keyword", "Until"], + ["keyword", "Volatile"], + ["keyword", "WEnd"], + ["keyword", "While"], + ["keyword", "With"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/number_feature.test b/docs/_style/prism-master/tests/languages/autoit/number_feature.test new file mode 100644 index 00000000..5c6ac5bc --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/number_feature.test @@ -0,0 +1,21 @@ +42 +3.14159 +4e8 +3.5E-9 +0.7e+12 +0xBadFace + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "4e8"], + ["number", "3.5E-9"], + ["number", "0.7e+12"], + ["number", "0xBadFace"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/operator_feature.test b/docs/_style/prism-master/tests/languages/autoit/operator_feature.test new file mode 100644 index 00000000..65f4ce4d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/operator_feature.test @@ -0,0 +1,23 @@ +< <= <> +> >= ++ += - -= +* *= / /= +& &= +? ^ +And Or Not + +---------------------------------------------------- + +[ + ["operator", "<"], ["operator", "<="], ["operator", "<>"], + ["operator", ">"], ["operator", ">="], + ["operator", "+"], ["operator", "+="], ["operator", "-"], ["operator", "-="], + ["operator", "*"], ["operator", "*="], ["operator", "/"], ["operator", "/="], + ["operator", "&"], ["operator", "&="], + ["operator", "?"], ["operator", "^"], + ["operator", "And"], ["operator", "Or"], ["operator", "Not"] +] + +---------------------------------------------------- + +Checks for operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/string_feature.test b/docs/_style/prism-master/tests/languages/autoit/string_feature.test new file mode 100644 index 00000000..5ae4bb70 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/string_feature.test @@ -0,0 +1,37 @@ +"" +"foo""bar" +"foo %foo% bar $bar$ baz @baz@" +'' +'foo''bar' +'foo %foo% bar $bar$ baz @baz@' + +---------------------------------------------------- + +[ + ["string", ["\"\""]], + ["string", ["\"foo\"\"bar\""]], + ["string", [ + "\"foo ", + ["variable", "%foo%"], + " bar ", + ["variable", "$bar$"], + " baz ", + ["variable", "@baz@"], + "\"" + ]], + ["string", ["''"]], + ["string", ["'foo''bar'"]], + ["string", [ + "'foo ", + ["variable", "%foo%"], + " bar ", + ["variable", "$bar$"], + " baz ", + ["variable", "@baz@"], + "'" + ]] +] + +---------------------------------------------------- + +Checks for strings and interpolation. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/url_feature.test b/docs/_style/prism-master/tests/languages/autoit/url_feature.test new file mode 100644 index 00000000..1f6d3cd4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/url_feature.test @@ -0,0 +1,15 @@ +#include +#include "foo.au3" + +---------------------------------------------------- + +[ + ["directive", "#include"], + ["url", ""], + ["directive", "#include"], + ["url", "\"foo.au3\""] +] + +---------------------------------------------------- + +Checks for files in includes. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/autoit/variable_feature.test b/docs/_style/prism-master/tests/languages/autoit/variable_feature.test new file mode 100644 index 00000000..e36ffe32 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/autoit/variable_feature.test @@ -0,0 +1,19 @@ +$foo +$foo_bar_42 +@ComputerName +@CPUArch +@TAB + +---------------------------------------------------- + +[ + ["variable", "$foo"], + ["variable", "$foo_bar_42"], + ["variable", "@ComputerName"], + ["variable", "@CPUArch"], + ["variable", "@TAB"] +] + +---------------------------------------------------- + +Checks for variables and macros. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bash/arithmetic_environment_feature.test b/docs/_style/prism-master/tests/languages/bash/arithmetic_environment_feature.test new file mode 100644 index 00000000..a9c5663d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bash/arithmetic_environment_feature.test @@ -0,0 +1,53 @@ +(( 4 + 5 )) +$((5 * 7)) +"foo $((5 * 7)) bar" +for (( NUM=1 ; NUM<=1000 ; NUM++ )) + +---------------------------------------------------- + +[ + ["variable", [ + ["punctuation", "(("], + ["number", "4"], + ["operator", "+"], + ["number", "5"], + ["punctuation", "))"] + ]], + ["variable", [ + ["variable", "$(("], + ["number", "5"], + ["operator", "*"], + ["number", "7"], + ["variable", "))"] + ]], + ["string", [ + "\"foo ", + ["variable", [ + ["variable", "$(("], + ["number", "5"], + ["operator", "*"], + ["number", "7"], + ["variable", "))"] + ]], + " bar\"" + ]], + ["keyword", "for"], + ["variable", [ + ["punctuation", "(("], + " NUM", + ["operator", "="], + ["number", "1"], + ["punctuation", ";"], + " NUM", + ["operator", "<="], + ["number", "1000"], + ["punctuation", ";"], + " NUM", + ["operator", "++"], + ["punctuation", "))"] + ]] +] + +---------------------------------------------------- + +Checks arithmetic environments \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bash/command_substitution_feature.test b/docs/_style/prism-master/tests/languages/bash/command_substitution_feature.test new file mode 100644 index 00000000..2b78b518 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bash/command_substitution_feature.test @@ -0,0 +1,45 @@ +$(echo "foo") +`echo "foo"` +"$(echo "foo") bar" +"`echo "foo"` bar" + +---------------------------------------------------- + +[ + ["variable", [ + ["variable", "$("], + ["keyword", "echo"], + ["string", ["\"foo\""]], + ["variable", ")"] + ]], + ["variable", [ + ["variable", "`"], + ["keyword", "echo"], + ["string", ["\"foo\""]], + ["variable", "`"] + ]], + ["string", [ + "\"", + ["variable", [ + ["variable", "$("], + ["keyword", "echo"], + ["string", ["\"foo\""]], + ["variable", ")"] + ]], + " bar\"" + ]], + ["string", [ + "\"", + ["variable", [ + ["variable", "`"], + ["keyword", "echo"], + ["string", ["\"foo\""]], + ["variable", "`"] + ]], + " bar\"" + ]] +] + +---------------------------------------------------- + +Checks for command substitution. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bash/comment_feature.test b/docs/_style/prism-master/tests/languages/bash/comment_feature.test new file mode 100644 index 00000000..58249096 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bash/comment_feature.test @@ -0,0 +1,13 @@ +#foo +# bar + +---------------------------------------------------- + +[ + ["comment", "#foo"], + ["comment", "# bar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bash/function_feature.test b/docs/_style/prism-master/tests/languages/bash/function_feature.test new file mode 100644 index 00000000..f3fb7123 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bash/function_feature.test @@ -0,0 +1,101 @@ +alias apropos apt apt-cache apt-get aptitude aspell +automysqlbackup awk basename bash bc bconsole bg +builtin bzip2 cal cat cd +cfdisk chgrp chmod chown chroot +chkconfig cksum clear cmp comm +command cp cron crontab csplit +curl cut date dc dd ddrescue debootstrap +df diff diff3 dig dir dircolors +dirname dirs dmesg du +egrep eject enable env ethtool +eval exec expand expect +export expr fdformat fdisk +fg fgrep file find fmt +fold format free fsck ftp +fuser gawk getopts git gparted grep +groupadd groupdel groupmod groups grub-mkconfig +gzip halt hash head help hg history host +hostname htop iconv id ifconfig +ifdown ifup import install ip jobs +join kill killall less link ln +locate logname logout logrotate look lpc lpr +lprint lprintd lprintq lprm ls +lsof lynx make man mc mdadm mkconfig mkdir mke2fs mkfifo +mkfs mkisofs mknod mkswap more most mount +mtools mtr mutt mv mmv nano nc netstat +nice nl nohup notify-send nslookup +open parted op passwd paste pathchk ping +pkill popd pr printcap printenv +printf ps pushd pv pwd quota +quotacheck quotactl ram rar rcp +read readarray readonly reboot +rename renice remsync rev rm +rmdir rpm rsync screen scp sdiff sed sendmail +seq service sftp shift +shopt shutdown sleep slocate +sort source split ssh stat strace +su sudo sum suspend swapon sync tail tar +tee test time timeout times +touch top traceroute trap tr +tsort tty type ulimit umask +umount unalias uname unexpand uniq +units unrar unshar unzip update-grub uptime +useradd userdel usermod users uuencode +uudecode vdir vi vim virsh vmstat wait watch +wc wget whereis which who whoami write +xargs xdg-open yes zip zypper + +---------------------------------------------------- + +[ + ["function", "alias"], ["function", "apropos"], ["function", "apt"], ["function", "apt-cache"], ["function", "apt-get"], ["function", "aptitude"], ["function", "aspell"], + ["function", "automysqlbackup"], ["function", "awk"], ["function", "basename"], ["function", "bash"], ["function", "bc"], ["function", "bconsole"], ["function", "bg"], + ["function", "builtin"], ["function", "bzip2"], ["function", "cal"], ["function", "cat"], ["function", "cd"], + ["function", "cfdisk"], ["function", "chgrp"], ["function", "chmod"], ["function", "chown"], ["function", "chroot"], + ["function", "chkconfig"], ["function", "cksum"], ["function", "clear"], ["function", "cmp"], ["function", "comm"], + ["function", "command"], ["function", "cp"], ["function", "cron"], ["function", "crontab"], ["function", "csplit"], + ["function", "curl"], ["function", "cut"], ["function", "date"], ["function", "dc"], ["function", "dd"], ["function", "ddrescue"], ["function", "debootstrap"], + ["function", "df"], ["function", "diff"], ["function", "diff3"], ["function", "dig"], ["function", "dir"], ["function", "dircolors"], + ["function", "dirname"], ["function", "dirs"], ["function", "dmesg"], ["function", "du"], + ["function", "egrep"], ["function", "eject"], ["function", "enable"], ["function", "env"], ["function", "ethtool"], + ["function", "eval"], ["function", "exec"], ["function", "expand"], ["function", "expect"], + ["function", "export"], ["function", "expr"], ["function", "fdformat"], ["function", "fdisk"], + ["function", "fg"], ["function", "fgrep"], ["function", "file"], ["function", "find"], ["function", "fmt"], + ["function", "fold"], ["function", "format"], ["function", "free"], ["function", "fsck"], ["function", "ftp"], + ["function", "fuser"], ["function", "gawk"], ["function", "getopts"], ["function", "git"], ["function", "gparted"], ["function", "grep"], + ["function", "groupadd"], ["function", "groupdel"], ["function", "groupmod"], ["function", "groups"], ["function", "grub-mkconfig"], + ["function", "gzip"], ["function", "halt"], ["function", "hash"], ["function", "head"], ["function", "help"], ["function", "hg"], ["function", "history"], ["function", "host"], + ["function", "hostname"], ["function", "htop"], ["function", "iconv"], ["function", "id"], ["function", "ifconfig"], + ["function", "ifdown"], ["function", "ifup"], ["function", "import"], ["function", "install"], ["function", "ip"], ["function", "jobs"], + ["function", "join"], ["function", "kill"], ["function", "killall"], ["function", "less"], ["function", "link"], ["function", "ln"], + ["function", "locate"], ["function", "logname"], ["function", "logout"], ["function", "logrotate"], ["function", "look"], ["function", "lpc"], ["function", "lpr"], + ["function", "lprint"], ["function", "lprintd"], ["function", "lprintq"], ["function", "lprm"], ["function", "ls"], + ["function", "lsof"], ["function", "lynx"], ["function", "make"], ["function", "man"], ["function", "mc"], ["function", "mdadm"], ["function", "mkconfig"], ["function", "mkdir"], ["function", "mke2fs"], ["function", "mkfifo"], + ["function", "mkfs"], ["function", "mkisofs"], ["function", "mknod"], ["function", "mkswap"], ["function", "more"], ["function", "most"], ["function", "mount"], + ["function", "mtools"], ["function", "mtr"], ["function", "mutt"], ["function", "mv"], ["function", "mmv"], ["function", "nano"], ["function", "nc"], ["function", "netstat"], + ["function", "nice"], ["function", "nl"], ["function", "nohup"], ["function", "notify-send"], ["function", "nslookup"], + ["function", "open"], ["function", "parted"], ["function", "op"], ["function", "passwd"], ["function", "paste"], ["function", "pathchk"], ["function", "ping"], + ["function", "pkill"], ["function", "popd"], ["function", "pr"], ["function", "printcap"], ["function", "printenv"], + ["function", "printf"], ["function", "ps"], ["function", "pushd"], ["function", "pv"], ["function", "pwd"], ["function", "quota"], + ["function", "quotacheck"], ["function", "quotactl"], ["function", "ram"], ["function", "rar"], ["function", "rcp"], + ["function", "read"], ["function", "readarray"], ["function", "readonly"], ["function", "reboot"], + ["function", "rename"], ["function", "renice"], ["function", "remsync"], ["function", "rev"], ["function", "rm"], + ["function", "rmdir"], ["function", "rpm"], ["function", "rsync"], ["function", "screen"], ["function", "scp"], ["function", "sdiff"], ["function", "sed"], ["function", "sendmail"], + ["function", "seq"], ["function", "service"], ["function", "sftp"], ["function", "shift"], + ["function", "shopt"], ["function", "shutdown"], ["function", "sleep"], ["function", "slocate"], + ["function", "sort"], ["function", "source"], ["function", "split"], ["function", "ssh"], ["function", "stat"], ["function", "strace"], + ["function", "su"], ["function", "sudo"], ["function", "sum"], ["function", "suspend"], ["function", "swapon"], ["function", "sync"], ["function", "tail"], ["function", "tar"], + ["function", "tee"], ["function", "test"], ["function", "time"], ["function", "timeout"], ["function", "times"], + ["function", "touch"], ["function", "top"], ["function", "traceroute"], ["function", "trap"], ["function", "tr"], + ["function", "tsort"], ["function", "tty"], ["function", "type"], ["function", "ulimit"], ["function", "umask"], + ["function", "umount"], ["function", "unalias"], ["function", "uname"], ["function", "unexpand"], ["function", "uniq"], + ["function", "units"], ["function", "unrar"], ["function", "unshar"], ["function", "unzip"], ["function", "update-grub"], ["function", "uptime"], + ["function", "useradd"], ["function", "userdel"], ["function", "usermod"], ["function", "users"], ["function", "uuencode"], + ["function", "uudecode"], ["function", "vdir"], ["function", "vi"], ["function", "vim"], ["function", "virsh"], ["function", "vmstat"], ["function", "wait"], ["function", "watch"], + ["function", "wc"], ["function", "wget"], ["function", "whereis"], ["function", "which"], ["function", "who"], ["function", "whoami"], ["function", "write"], + ["function", "xargs"], ["function", "xdg-open"], ["function", "yes"], ["function", "zip"], ["function", "zypper"] +] + +---------------------------------------------------- + +Checks for all functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bash/keyword_feature.test b/docs/_style/prism-master/tests/languages/bash/keyword_feature.test new file mode 100644 index 00000000..b3bacf55 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bash/keyword_feature.test @@ -0,0 +1,20 @@ +if then else elif fi +for break continue while +in case function select +do done until echo exit +return set declare +. : +---------------------------------------------------- + +[ + ["keyword", "if"], ["keyword", "then"], ["keyword", "else"], ["keyword", "elif"], ["keyword", "fi"], + ["keyword", "for"], ["keyword", "break"], ["keyword", "continue"], ["keyword", "while"], + ["keyword", "in"], ["keyword", "case"], ["keyword", "function"], ["keyword", "select"], + ["keyword", "do"], ["keyword", "done"], ["keyword", "until"], ["keyword", "echo"], ["keyword", "exit"], + ["keyword", "return"], ["keyword", "set"], ["keyword", "declare"], + ["keyword", "."], ["keyword", ":"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bash/shebang_feature.test b/docs/_style/prism-master/tests/languages/bash/shebang_feature.test new file mode 100644 index 00000000..c41860d0 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bash/shebang_feature.test @@ -0,0 +1,11 @@ +#!/bin/bash + +---------------------------------------------------- + +[ + ["shebang", "#!/bin/bash"] +] + +---------------------------------------------------- + +Checks for shebang. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bash/string_feature.test b/docs/_style/prism-master/tests/languages/bash/string_feature.test new file mode 100644 index 00000000..fd2a3031 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bash/string_feature.test @@ -0,0 +1,67 @@ +"" +'' +"foo" +'foo' +"foo +bar" +'foo +bar' +"'foo'" +'"bar"' +"$@" +"${foo}" +<< STRING_END +foo +bar +STRING_END +<< EOF +foo $@ +bar +EOF +<< 'EOF' +'single quoted string' +"double quoted string" +EOF +<< "EOF" +foo +bar +EOF +<< STRING_END +# comment +STRING_END +" # comment " + +---------------------------------------------------- + +[ + ["string", ["\"\""]], + ["string", ["''"]], + ["string", ["\"foo\""]], + ["string", ["'foo'"]], + ["string", ["\"foo\r\nbar\""]], + ["string", ["'foo\r\nbar'"]], + ["string", ["\"'foo'\""]], + ["string", ["'\"bar\"'"]], + ["string", [ + "\"", ["variable", "$@"], "\"" + ]], + ["string", [ + "\"", ["variable", "${foo}"], "\"" + ]], + ["operator", "<<"], + ["string", ["STRING_END\r\nfoo\r\nbar\r\nSTRING_END"]], + ["operator", "<<"], + ["string", ["EOF\r\nfoo ", ["variable", "$@"], "\r\nbar\r\nEOF"]], + ["operator", "<<"], + ["string", ["'EOF'\r\n'single quoted string'\r\n\"double quoted string\"\r\nEOF"]], + ["operator", "<<"], + ["string", ["\"EOF\"\r\nfoo\r\nbar\r\nEOF"]], + ["operator", "<<"], + ["string", ["STRING_END\r\n# comment\r\nSTRING_END"]], + ["string", ["\" # comment \""]] +] + +---------------------------------------------------- + +Checks for single-quoted and double-quoted strings. +Also checks for variables in strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bash/variable_feature.test b/docs/_style/prism-master/tests/languages/bash/variable_feature.test new file mode 100644 index 00000000..16b7448a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bash/variable_feature.test @@ -0,0 +1,15 @@ +$foo +$@ +${foo bar} + +---------------------------------------------------- + +[ + ["variable", "$foo"], + ["variable", "$@"], + ["variable", "${foo bar}"] +] + +---------------------------------------------------- + +Checks for variables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/basic/comment_feature.test b/docs/_style/prism-master/tests/languages/basic/comment_feature.test new file mode 100644 index 00000000..d3061761 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/basic/comment_feature.test @@ -0,0 +1,13 @@ +! Foobar +REM Foobar + +---------------------------------------------------- + +[ + ["comment", ["! Foobar"]], + ["comment", [["keyword", "REM"], " Foobar"]] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/basic/function_feature.test b/docs/_style/prism-master/tests/languages/basic/function_feature.test new file mode 100644 index 00000000..5fe8d760 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/basic/function_feature.test @@ -0,0 +1,309 @@ +ABS +ACCESS +ACOS +ANGLE +AREA +ARITHMETIC +ARRAY +ASIN +ASK +AT +ATN +BASE +BEGIN +BREAK +CAUSE +CEIL +CHR +CLIP +COLLATE +COLOR +CON +COS +COSH +COT +CSC +DATE +DATUM +DEBUG +DECIMAL +DEF +DEG +DEGREES +DELETE +DET +DEVICE +DISPLAY +DOT +ELAPSED +EPS +ERASABLE +EXLINE +EXP +EXTERNAL +EXTYPE +FILETYPE +FIXED +FP +GO +GRAPH +HANDLER +IDN +IMAGE +IN +INT +INTERNAL +IP +IS +KEYED +LBOUND +LCASE +LEFT +LEN +LENGTH +LET +LINE +LINES +LOG +LOG10 +LOG2 +LTRIM +MARGIN +MAT +MAX +MAXNUM +MID +MIN +MISSING +MOD +NATIVE +NUL +NUMERIC +OF +OPTION +ORD +ORGANIZATION +OUTIN +OUTPUT +PI +POINT +POINTER +POINTS +POS +PRINT +PROGRAM +PROMPT +RAD +RADIANS +RANDOMIZE +RECORD +RECSIZE +RECTYPE +RELATIVE +REMAINDER +REPEAT +REST +RETRY +REWRITE +RIGHT +RND +ROUND +RTRIM +SAME +SEC +SELECT +SEQUENTIAL +SET +SETTER +SGN +SIN +SINH +SIZE +SKIP +SQR +STANDARD +STATUS +STR +STREAM +STYLE +TAB +TAN +TANH +TEMPLATE +TEXT +THERE +TIME +TIMEOUT +TRACE +TRANSFORM +TRUNCATE +UBOUND +UCASE +USE +VAL +VARIABLE +VIEWPORT +WHEN +WINDOW +WITH +ZER +ZONEWIDTH + +---------------------------------------------------- + +[ + ["function", "ABS"], + ["function", "ACCESS"], + ["function", "ACOS"], + ["function", "ANGLE"], + ["function", "AREA"], + ["function", "ARITHMETIC"], + ["function", "ARRAY"], + ["function", "ASIN"], + ["function", "ASK"], + ["function", "AT"], + ["function", "ATN"], + ["function", "BASE"], + ["function", "BEGIN"], + ["function", "BREAK"], + ["function", "CAUSE"], + ["function", "CEIL"], + ["function", "CHR"], + ["function", "CLIP"], + ["function", "COLLATE"], + ["function", "COLOR"], + ["function", "CON"], + ["function", "COS"], + ["function", "COSH"], + ["function", "COT"], + ["function", "CSC"], + ["function", "DATE"], + ["function", "DATUM"], + ["function", "DEBUG"], + ["function", "DECIMAL"], + ["function", "DEF"], + ["function", "DEG"], + ["function", "DEGREES"], + ["function", "DELETE"], + ["function", "DET"], + ["function", "DEVICE"], + ["function", "DISPLAY"], + ["function", "DOT"], + ["function", "ELAPSED"], + ["function", "EPS"], + ["function", "ERASABLE"], + ["function", "EXLINE"], + ["function", "EXP"], + ["function", "EXTERNAL"], + ["function", "EXTYPE"], + ["function", "FILETYPE"], + ["function", "FIXED"], + ["function", "FP"], + ["function", "GO"], + ["function", "GRAPH"], + ["function", "HANDLER"], + ["function", "IDN"], + ["function", "IMAGE"], + ["function", "IN"], + ["function", "INT"], + ["function", "INTERNAL"], + ["function", "IP"], + ["function", "IS"], + ["function", "KEYED"], + ["function", "LBOUND"], + ["function", "LCASE"], + ["function", "LEFT"], + ["function", "LEN"], + ["function", "LENGTH"], + ["function", "LET"], + ["function", "LINE"], + ["function", "LINES"], + ["function", "LOG"], + ["function", "LOG10"], + ["function", "LOG2"], + ["function", "LTRIM"], + ["function", "MARGIN"], + ["function", "MAT"], + ["function", "MAX"], + ["function", "MAXNUM"], + ["function", "MID"], + ["function", "MIN"], + ["function", "MISSING"], + ["function", "MOD"], + ["function", "NATIVE"], + ["function", "NUL"], + ["function", "NUMERIC"], + ["function", "OF"], + ["function", "OPTION"], + ["function", "ORD"], + ["function", "ORGANIZATION"], + ["function", "OUTIN"], + ["function", "OUTPUT"], + ["function", "PI"], + ["function", "POINT"], + ["function", "POINTER"], + ["function", "POINTS"], + ["function", "POS"], + ["function", "PRINT"], + ["function", "PROGRAM"], + ["function", "PROMPT"], + ["function", "RAD"], + ["function", "RADIANS"], + ["function", "RANDOMIZE"], + ["function", "RECORD"], + ["function", "RECSIZE"], + ["function", "RECTYPE"], + ["function", "RELATIVE"], + ["function", "REMAINDER"], + ["function", "REPEAT"], + ["function", "REST"], + ["function", "RETRY"], + ["function", "REWRITE"], + ["function", "RIGHT"], + ["function", "RND"], + ["function", "ROUND"], + ["function", "RTRIM"], + ["function", "SAME"], + ["function", "SEC"], + ["function", "SELECT"], + ["function", "SEQUENTIAL"], + ["function", "SET"], + ["function", "SETTER"], + ["function", "SGN"], + ["function", "SIN"], + ["function", "SINH"], + ["function", "SIZE"], + ["function", "SKIP"], + ["function", "SQR"], + ["function", "STANDARD"], + ["function", "STATUS"], + ["function", "STR"], + ["function", "STREAM"], + ["function", "STYLE"], + ["function", "TAB"], + ["function", "TAN"], + ["function", "TANH"], + ["function", "TEMPLATE"], + ["function", "TEXT"], + ["function", "THERE"], + ["function", "TIME"], + ["function", "TIMEOUT"], + ["function", "TRACE"], + ["function", "TRANSFORM"], + ["function", "TRUNCATE"], + ["function", "UBOUND"], + ["function", "UCASE"], + ["function", "USE"], + ["function", "VAL"], + ["function", "VARIABLE"], + ["function", "VIEWPORT"], + ["function", "WHEN"], + ["function", "WINDOW"], + ["function", "WITH"], + ["function", "ZER"], + ["function", "ZONEWIDTH"] +] + +---------------------------------------------------- + +Checks for functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/basic/keyword_feature.test b/docs/_style/prism-master/tests/languages/basic/keyword_feature.test new file mode 100644 index 00000000..ecac6855 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/basic/keyword_feature.test @@ -0,0 +1,213 @@ +AS +BEEP +BLOAD +BSAVE +CALL +CALL ABSOLUTE +CASE +CHAIN +CHDIR +CLEAR +CLOSE +CLS +COM +COMMON +CONST +DATA +DECLARE +DEF FN +DEF SEG +DEFDBL +DEFINT +DEFLNG +DEFSNG +DEFSTR +DIM +DO +DOUBLE +ELSE +ELSEIF +END +ENVIRON +ERASE +ERROR +EXIT +FIELD +FILES +FOR +FUNCTION +GET +GOSUB +GOTO +IF +INPUT +INTEGER +IOCTL +KEY +KILL +LINE INPUT +LOCATE +LOCK +LONG +LOOP +LSET +MKDIR +NAME +NEXT +OFF +ON +ON COM +ON ERROR +ON KEY +ON TIMER +OPEN +OPTION BASE +OUT +POKE +PUT +READ +REDIM +REM +RESTORE +RESUME +RETURN +RMDIR +RSET +RUN +SHARED +SINGLE +SELECT CASE +SHELL +SLEEP +STATIC +STEP +STOP +STRING +SUB +SWAP +SYSTEM +THEN +TIMER +TO +TROFF +TRON +TYPE +UNLOCK +UNTIL +USING +VIEW PRINT +WAIT +WEND +WHILE +WRITE + +---------------------------------------------------- + +[ + ["keyword", "AS"], + ["keyword", "BEEP"], + ["keyword", "BLOAD"], + ["keyword", "BSAVE"], + ["keyword", "CALL"], + ["keyword", "CALL ABSOLUTE"], + ["keyword", "CASE"], + ["keyword", "CHAIN"], + ["keyword", "CHDIR"], + ["keyword", "CLEAR"], + ["keyword", "CLOSE"], + ["keyword", "CLS"], + ["keyword", "COM"], + ["keyword", "COMMON"], + ["keyword", "CONST"], + ["keyword", "DATA"], + ["keyword", "DECLARE"], + ["keyword", "DEF FN"], + ["keyword", "DEF SEG"], + ["keyword", "DEFDBL"], + ["keyword", "DEFINT"], + ["keyword", "DEFLNG"], + ["keyword", "DEFSNG"], + ["keyword", "DEFSTR"], + ["keyword", "DIM"], + ["keyword", "DO"], + ["keyword", "DOUBLE"], + ["keyword", "ELSE"], + ["keyword", "ELSEIF"], + ["keyword", "END"], + ["keyword", "ENVIRON"], + ["keyword", "ERASE"], + ["keyword", "ERROR"], + ["keyword", "EXIT"], + ["keyword", "FIELD"], + ["keyword", "FILES"], + ["keyword", "FOR"], + ["keyword", "FUNCTION"], + ["keyword", "GET"], + ["keyword", "GOSUB"], + ["keyword", "GOTO"], + ["keyword", "IF"], + ["keyword", "INPUT"], + ["keyword", "INTEGER"], + ["keyword", "IOCTL"], + ["keyword", "KEY"], + ["keyword", "KILL"], + ["keyword", "LINE INPUT"], + ["keyword", "LOCATE"], + ["keyword", "LOCK"], + ["keyword", "LONG"], + ["keyword", "LOOP"], + ["keyword", "LSET"], + ["keyword", "MKDIR"], + ["keyword", "NAME"], + ["keyword", "NEXT"], + ["keyword", "OFF"], + ["keyword", "ON"], + ["keyword", "ON COM"], + ["keyword", "ON ERROR"], + ["keyword", "ON KEY"], + ["keyword", "ON TIMER"], + ["keyword", "OPEN"], + ["keyword", "OPTION BASE"], + ["keyword", "OUT"], + ["keyword", "POKE"], + ["keyword", "PUT"], + ["keyword", "READ"], + ["keyword", "REDIM"], + ["keyword", "REM"], + ["keyword", "RESTORE"], + ["keyword", "RESUME"], + ["keyword", "RETURN"], + ["keyword", "RMDIR"], + ["keyword", "RSET"], + ["keyword", "RUN"], + ["keyword", "SHARED"], + ["keyword", "SINGLE"], + ["keyword", "SELECT CASE"], + ["keyword", "SHELL"], + ["keyword", "SLEEP"], + ["keyword", "STATIC"], + ["keyword", "STEP"], + ["keyword", "STOP"], + ["keyword", "STRING"], + ["keyword", "SUB"], + ["keyword", "SWAP"], + ["keyword", "SYSTEM"], + ["keyword", "THEN"], + ["keyword", "TIMER"], + ["keyword", "TO"], + ["keyword", "TROFF"], + ["keyword", "TRON"], + ["keyword", "TYPE"], + ["keyword", "UNLOCK"], + ["keyword", "UNTIL"], + ["keyword", "USING"], + ["keyword", "VIEW PRINT"], + ["keyword", "WAIT"], + ["keyword", "WEND"], + ["keyword", "WHILE"], + ["keyword", "WRITE"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/basic/number_feature.test b/docs/_style/prism-master/tests/languages/basic/number_feature.test new file mode 100644 index 00000000..5adeb7af --- /dev/null +++ b/docs/_style/prism-master/tests/languages/basic/number_feature.test @@ -0,0 +1,19 @@ +42 +3.14159 +2e8 +3.4E-9 +0.7E+12 + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "2e8"], + ["number", "3.4E-9"], + ["number", "0.7E+12"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/basic/operator_feature.test b/docs/_style/prism-master/tests/languages/basic/operator_feature.test new file mode 100644 index 00000000..b2d93f61 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/basic/operator_feature.test @@ -0,0 +1,21 @@ +< <= <> +> >= ++ - * / +^ = & +AND EQV IMP +NOT OR XOR + +---------------------------------------------------- + +[ + ["operator", "<"], ["operator", "<="], ["operator", "<>"], + ["operator", ">"], ["operator", ">="], + ["operator", "+"], ["operator", "-"], ["operator", "*"], ["operator", "/"], + ["operator", "^"], ["operator", "="], ["operator", "&"], + ["operator", "AND"], ["operator", "EQV"], ["operator", "IMP"], + ["operator", "NOT"], ["operator", "OR"], ["operator", "XOR"] +] + +---------------------------------------------------- + +Checks for operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/basic/string_feature.test b/docs/_style/prism-master/tests/languages/basic/string_feature.test new file mode 100644 index 00000000..83fea35e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/basic/string_feature.test @@ -0,0 +1,13 @@ +"" +"fo""obar" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"fo\"\"obar\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/batch/command_feature.test b/docs/_style/prism-master/tests/languages/batch/command_feature.test new file mode 100644 index 00000000..350788a8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/batch/command_feature.test @@ -0,0 +1,103 @@ +FOR /l %%a in (5,-1,1) do (TITLE %title% -- closing in %%as) +SET title=%~n0 +echo.Hello World +@ECHO OFF +if not defined ProgressFormat set "ProgressFormat=[PPPP]" +EXIT /b +set /a ProgressCnt+=1 +IF "%~1" NEQ "" (SET %~1=%new%) ELSE (echo.%new%) + +---------------------------------------------------- + +[ + ["command", [ + ["keyword", "FOR"], + ["parameter", ["/l"]], + ["variable", "%%a"], + ["keyword", "in"], + ["punctuation", "("], + ["number", "5"], ["punctuation", ","], + ["number", "-1"], ["punctuation", ","], + ["number", "1"], ["punctuation", ")"], + ["keyword", "do"] + ]], + ["punctuation", "("], + ["command", [ + ["keyword", "TITLE"], + ["variable", "%title%"], + " -- closing in ", + ["variable", "%%as"] + ]], + ["punctuation", ")"], + + ["command", [ + ["keyword", "SET"], + ["variable", "title"], + ["operator", "="], + ["variable", "%~n0"] + ]], + + ["command", [ + ["keyword", "echo"], + ".Hello World" + ]], + + ["operator", "@"], + ["command", [ + ["keyword", "ECHO"], + " OFF" + ]], + + ["command", [ + ["keyword", "if"], + ["keyword", "not"], + ["keyword", "defined"], + " ProgressFormat" + ]], + ["command", [ + ["keyword", "set"], + ["string", "\"ProgressFormat=[PPPP]\""] + ]], + + ["command", [ + ["keyword", "EXIT"], + ["parameter", ["/b"]] + ]], + + ["command", [ + ["keyword", "set"], + ["parameter", ["/a"]], + ["variable", "ProgressCnt"], + ["operator", "+="], + ["number", "1"] + ]], + + ["command", [ + ["keyword", "IF"], + ["string", "\"%~1\""], + ["operator", "NEQ"], + ["string", "\"\""] + ]], + ["punctuation", "("], + ["command", [ + ["keyword", "SET"], + ["variable", "%~1"], + ["operator", "="], + ["variable", "%new%"] + ]], + ["punctuation", ")"], + ["command", [ + ["keyword", "ELSE"] + ]], + ["punctuation", "("], + ["command", [ + ["keyword", "echo"], + ".", + ["variable", "%new%"] + ]], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for commands. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/batch/comment_feature.test b/docs/_style/prism-master/tests/languages/batch/comment_feature.test new file mode 100644 index 00000000..83759d8e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/batch/comment_feature.test @@ -0,0 +1,18 @@ +:: +:: Foobar +REM Foobar +rem foo^ +bar + +---------------------------------------------------- + +[ + ["comment", "::"], + ["comment", ":: Foobar"], + ["comment", "REM Foobar"], + ["comment", "rem foo^\r\nbar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/batch/label_feature.test b/docs/_style/prism-master/tests/languages/batch/label_feature.test new file mode 100644 index 00000000..a672ba0c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/batch/label_feature.test @@ -0,0 +1,13 @@ +:foo +:Foo_Bar + +---------------------------------------------------- + +[ + ["label", ":foo"], + ["label", ":Foo_Bar"] +] + +---------------------------------------------------- + +Checks for labels. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bison/c_feature.test b/docs/_style/prism-master/tests/languages/bison/c_feature.test new file mode 100644 index 00000000..4d8be839 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bison/c_feature.test @@ -0,0 +1,56 @@ +%{ + #include +%} +%code { + if(foo) { + + } +} +%% +exp: + NUM { + $$ = f($3, $4); + @$.first_column = @1.first_column; + $result = $left + $1; + } +%% + +---------------------------------------------------- + +[ + ["bison", [ + ["c", [ + ["delimiter", "%{"], + ["macro", ["#", ["directive", "include"], ["string", ""]]], + ["delimiter", "%}"] + ]], + ["keyword", "%code"], + ["c", [ + ["delimiter", "{"], + ["keyword", "if"], ["punctuation", "("], "foo", ["punctuation", ")"], + ["punctuation", "{"], ["punctuation", "}"], + ["delimiter", "}"] + ]], + ["punctuation", "%%"], + ["property", "exp"], ["punctuation", ":"], + "\r\n\tNUM ", + ["c", [ + ["delimiter", "{"], + ["bison-variable", ["$$"]], ["operator", "="], + ["function", "f"], ["punctuation", "("], + ["bison-variable", ["$3"]], ["punctuation", ","], + ["bison-variable", ["$4"]], ["punctuation", ")"], ["punctuation", ";"], + ["bison-variable", ["@$"]], ["punctuation", "."], "first_column ", ["operator", "="], + ["bison-variable", ["@1"]], ["punctuation", "."], "first_column", ["punctuation", ";"], + ["bison-variable", ["$result"]], ["operator", "="], + ["bison-variable", ["$left"]], ["operator", "+"], + ["bison-variable", ["$", ["punctuation", "<"], "itype", ["punctuation", ">"], "1"]], ["punctuation", ";"], + ["delimiter", "}"] + ]], + ["punctuation", "%%"] + ]] +] + +---------------------------------------------------- + +Checks for C inside Bison, along with special Bison variables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bison/comment_feature.test b/docs/_style/prism-master/tests/languages/bison/comment_feature.test new file mode 100644 index 00000000..15ed152e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bison/comment_feature.test @@ -0,0 +1,25 @@ +// Foobar +/* Foo +bar */ +%% +// Foobar +/* Foo +bar */ +%% + +---------------------------------------------------- + +[ + ["bison", [ + ["comment", "// Foobar"], + ["comment", "/* Foo\r\nbar */"], + ["punctuation", "%%"], + ["comment", "// Foobar"], + ["comment", "/* Foo\r\nbar */"], + ["punctuation", "%%"] + ]] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bison/keyword_feature.test b/docs/_style/prism-master/tests/languages/bison/keyword_feature.test new file mode 100644 index 00000000..49fb3733 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bison/keyword_feature.test @@ -0,0 +1,22 @@ +%union +%token +%% +exp: %empty +%% + +---------------------------------------------------- + +[ + ["bison", [ + ["keyword", "%union"], + ["keyword", "%token"], + ["punctuation", "%%"], + ["property", "exp"], ["punctuation", ":"], + ["keyword", "%empty"], + ["punctuation", "%%"] + ]] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bison/number_feature.test b/docs/_style/prism-master/tests/languages/bison/number_feature.test new file mode 100644 index 00000000..ddbacff9 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bison/number_feature.test @@ -0,0 +1,15 @@ +42 +0 +0xBadFace + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "0"], + ["number", "0xBadFace"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bison/property_feature.test b/docs/_style/prism-master/tests/languages/bison/property_feature.test new file mode 100644 index 00000000..c1b6cb24 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bison/property_feature.test @@ -0,0 +1,21 @@ +%% +foo: +bar_42: +$@1: +%% + +---------------------------------------------------- + +[ + ["bison", [ + ["punctuation", "%%"], + ["property", "foo"], ["punctuation", ":"], + ["property", "bar_42"], ["punctuation", ":"], + ["property", "$@1"], ["punctuation", ":"], + ["punctuation", "%%"] + ]] +] + +---------------------------------------------------- + +Checks for properties. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bison/string_feature.test b/docs/_style/prism-master/tests/languages/bison/string_feature.test new file mode 100644 index 00000000..3f3f6c0d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bison/string_feature.test @@ -0,0 +1,21 @@ +%% +foo: 'foo' "foo"; +bar: '\'' "\""; +%% + +---------------------------------------------------- + +[ + ["bison", [ + ["punctuation", "%%"], + ["property", "foo"], ["punctuation", ":"], + ["string", "'foo'"], ["string", "\"foo\""], ["punctuation", ";"], + ["property", "bar"], ["punctuation", ":"], + ["string", "'\\''"], ["string", "\"\\\"\""], ["punctuation", ";"], + ["punctuation", "%%"] + ]] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/brainfuck/all_feature.test b/docs/_style/prism-master/tests/languages/brainfuck/all_feature.test new file mode 100644 index 00000000..284f758a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/brainfuck/all_feature.test @@ -0,0 +1,19 @@ +++ foobar +[ + >. + <-, +] + +---------------------------------------------------- + +[ + ["increment", "+"], ["increment", "+"], ["comment", "foobar"], + ["branching", "["], + ["pointer", ">"], ["operator", "."], + ["pointer", "<"], ["decrement", "-"], ["operator", ","], + ["branching", "]"] +] + +---------------------------------------------------- + +Checks for all patterns. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bro/builtin_feature.test b/docs/_style/prism-master/tests/languages/bro/builtin_feature.test new file mode 100644 index 00000000..cd5a1210 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bro/builtin_feature.test @@ -0,0 +1,29 @@ +@load-sigs +@load-plugin +@unload +@prefixes +@ifndef +@ifdef +@else +&redef +&priority +redef + +---------------------------------------------------- + +[ + ["builtin", "@load-sigs"], + ["builtin", "@load-plugin"], + ["builtin", "@unload"], + ["builtin", "@prefixes"], + ["builtin", "@ifndef"], + ["builtin", "@ifdef"], + ["builtin", "@else"], + ["builtin", "&redef"], + ["builtin", "&priority"], + ["builtin", "redef"] +] + +---------------------------------------------------- + +Checks for the builtins \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bro/comment_feature.test b/docs/_style/prism-master/tests/languages/bro/comment_feature.test new file mode 100644 index 00000000..e1eff305 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bro/comment_feature.test @@ -0,0 +1,17 @@ +## comment +#TODO +## FIXME +# XXX + +---------------------------------------------------- + +[ + ["comment", [ "## comment"]], + ["comment", [ "#", ["italic", "TODO"]]], + ["comment", [ "## ", ["italic", "FIXME"]]], + ["comment", [ "# ", ["italic", "XXX"]]] +] + +---------------------------------------------------- + +Checks for the highlighting of comments \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bro/function_feature.test b/docs/_style/prism-master/tests/languages/bro/function_feature.test new file mode 100644 index 00000000..a10d792a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bro/function_feature.test @@ -0,0 +1,21 @@ +function foo +hook foo +event foo +function foo::bar +hook foo::bar +event foo::bar + +---------------------------------------------------- + +[ + ["function", [["keyword", "function"], " foo"]], + ["function", [["keyword", "hook"], " foo"]], + ["function", [["keyword", "event"], " foo"]], + ["function", [["keyword", "function"], " foo::bar"]], + ["function", [["keyword", "hook"], " foo::bar"]], + ["function", [["keyword", "event"], " foo::bar"]] +] + +---------------------------------------------------- + +Checks for the function feature \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bro/keyword_feature.test b/docs/_style/prism-master/tests/languages/bro/keyword_feature.test new file mode 100644 index 00000000..aa025cd4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bro/keyword_feature.test @@ -0,0 +1,87 @@ +break +next +continue +alarm +using +of +add +delete +export +print +return +schedule +when +timeout +addr +any +bool +count +double +enum +file +int +interval +pattern +opaque +port +record +set +string +subnet +table +time +vector +for +if +else +in +module +function + +---------------------------------------------------- + +[ + ["keyword", "break"], + ["keyword", "next"], + ["keyword", "continue"], + ["keyword", "alarm"], + ["keyword", "using"], + ["keyword", "of"], + ["keyword", "add"], + ["keyword", "delete"], + ["keyword", "export"], + ["keyword", "print"], + ["keyword", "return"], + ["keyword", "schedule"], + ["keyword", "when"], + ["keyword", "timeout"], + ["keyword", "addr"], + ["keyword", "any"], + ["keyword", "bool"], + ["keyword", "count"], + ["keyword", "double"], + ["keyword", "enum"], + ["keyword", "file"], + ["keyword", "int"], + ["keyword", "interval"], + ["keyword", "pattern"], + ["keyword", "opaque"], + ["keyword", "port"], + ["keyword", "record"], + ["keyword", "set"], + ["keyword", "string"], + ["keyword", "subnet"], + ["keyword", "table"], + ["keyword", "time"], + ["keyword", "vector"], + ["keyword", "for"], + ["keyword", "if"], + ["keyword", "else"], + ["keyword", "in"], + ["keyword", "module"], + ["keyword", "function"] +] + +---------------------------------------------------- + +Checks for the builtins \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bro/string_feature.test b/docs/_style/prism-master/tests/languages/bro/string_feature.test new file mode 100644 index 00000000..68277b51 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bro/string_feature.test @@ -0,0 +1,23 @@ +"" +'' +"foo" +'foo' +"'foo'" +'"bar"' +" # comment " + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "''"], + ["string", "\"foo\""], + ["string", "'foo'"], + ["string", "\"'foo'\""], + ["string", "'\"bar\"'"], + ["string", "\" # comment \""] +] + +---------------------------------------------------- + +Checks for single-quoted and double-quoted strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/bro/variable_feature.test b/docs/_style/prism-master/tests/languages/bro/variable_feature.test new file mode 100644 index 00000000..daf51203 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/bro/variable_feature.test @@ -0,0 +1,25 @@ +local foo +global foo +local bool = T; +const bar +local baz = 66; + +---------------------------------------------------- + +[ + ["variable", [["keyword", "local"], " foo"]], + ["variable", [["keyword", "global"], " foo"]], + ["variable", [["keyword", "local"], " bool"]], + ["operator", "="], + ["boolean", "T"], + ["punctuation", ";"], + ["constant", [["keyword", "const"], " bar"]], + ["variable", [["keyword", "local"], " baz"]], + ["operator", "="], + ["number", "66"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for the highlighting of variables \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/c+pure/c_inclusion.test b/docs/_style/prism-master/tests/languages/c+pure/c_inclusion.test new file mode 100644 index 00000000..312fde2c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/c+pure/c_inclusion.test @@ -0,0 +1,28 @@ +%< +asm (); +%> + +%< -*- C -*- +asm (); +%> + +---------------------------------------------------- + +[ + ["inline-lang", [ + ["delimiter", "%<"], + ["keyword", "asm"], ["punctuation", "("], ["punctuation", ")"], ["punctuation", ";"], + ["delimiter", "%>"] + ]], + + ["inline-lang-c", [ + ["delimiter", "%< "], + ["lang", "-*- C -*-"], + ["keyword", "asm"], ["punctuation", "("], ["punctuation", ")"], ["punctuation", ";"], + ["delimiter", "%>"] + ]] +] + +---------------------------------------------------- + +Checks for C in Pure. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/c/constant_feature.test b/docs/_style/prism-master/tests/languages/c/constant_feature.test new file mode 100644 index 00000000..449305a7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/c/constant_feature.test @@ -0,0 +1,37 @@ +__FILE__ +__LINE__ +__DATE__ +__TIME__ +__TIMESTAMP__ +__func__ +EOF +NULL +SEEK_CUR +SEEK_END +SEEK_SET +stdin +stdout +stderr + +---------------------------------------------------- + +[ + ["constant", "__FILE__"], + ["constant", "__LINE__"], + ["constant", "__DATE__"], + ["constant", "__TIME__"], + ["constant", "__TIMESTAMP__"], + ["constant", "__func__"], + ["constant", "EOF"], + ["constant", "NULL"], + ["constant", "SEEK_CUR"], + ["constant", "SEEK_END"], + ["constant", "SEEK_SET"], + ["constant", "stdin"], + ["constant", "stdout"], + ["constant", "stderr"] +] + +---------------------------------------------------- + +Checks for all constants. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/c/keyword_feature.test b/docs/_style/prism-master/tests/languages/c/keyword_feature.test new file mode 100644 index 00000000..feb9ff93 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/c/keyword_feature.test @@ -0,0 +1,29 @@ +_Alignas _Alignof _Atomic _Bool +_Complex _Generic _Imaginary +_Noreturn _Static_assert _Thread_local +asm typeof inline auto break +case char const continue default +do double else enum extern +float for goto if int +long register return short signed +sizeof static struct switch typedef +union unsigned void volatile while + +---------------------------------------------------- + +[ + ["keyword", "_Alignas"], ["keyword", "_Alignof"], ["keyword", "_Atomic"], ["keyword", "_Bool"], + ["keyword", "_Complex"], ["keyword", "_Generic"], ["keyword", "_Imaginary"], + ["keyword", "_Noreturn"], ["keyword", "_Static_assert"], ["keyword", "_Thread_local"], + ["keyword", "asm"], ["keyword", "typeof"], ["keyword", "inline"], ["keyword", "auto"], ["keyword", "break"], + ["keyword", "case"], ["keyword", "char"], ["keyword", "const"], ["keyword", "continue"], ["keyword", "default"], + ["keyword", "do"], ["keyword", "double"], ["keyword", "else"], ["keyword", "enum"], ["keyword", "extern"], + ["keyword", "float"], ["keyword", "for"], ["keyword", "goto"], ["keyword", "if"], ["keyword", "int"], + ["keyword", "long"], ["keyword", "register"], ["keyword", "return"], ["keyword", "short"], ["keyword", "signed"], + ["keyword", "sizeof"], ["keyword", "static"], ["keyword", "struct"], ["keyword", "switch"], ["keyword", "typedef"], + ["keyword", "union"], ["keyword", "unsigned"], ["keyword", "void"], ["keyword", "volatile"], ["keyword", "while"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/c/macro_feature.test b/docs/_style/prism-master/tests/languages/c/macro_feature.test new file mode 100644 index 00000000..6e65d9d5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/c/macro_feature.test @@ -0,0 +1,45 @@ +# include + #define PG_locked 0 + +#defined +#elif +#else +#endif +#error +#ifdef +#ifndef +#if +#import +#include +#line +#pragma +#undef +#using + +---------------------------------------------------- + +[ + ["macro", [ + "# ", ["directive", "include"], + ["string", ""] + ]], + ["macro", ["#", ["directive", "define"], " PG_locked 0"]], + ["macro", ["#", ["directive", "defined"]]], + ["macro", ["#", ["directive", "elif"]]], + ["macro", ["#", ["directive", "else"]]], + ["macro", ["#", ["directive", "endif"]]], + ["macro", ["#", ["directive", "error"]]], + ["macro", ["#", ["directive", "ifdef"]]], + ["macro", ["#", ["directive", "ifndef"]]], + ["macro", ["#", ["directive", "if"]]], + ["macro", ["#", ["directive", "import"]]], + ["macro", ["#", ["directive", "include"]]], + ["macro", ["#", ["directive", "line"]]], + ["macro", ["#", ["directive", "pragma"]]], + ["macro", ["#", ["directive", "undef"]]], + ["macro", ["#", ["directive", "using"]]] +] + +---------------------------------------------------- + +Checks for macros and paths inside include statements. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/c/number_feature.test b/docs/_style/prism-master/tests/languages/c/number_feature.test new file mode 100644 index 00000000..05426834 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/c/number_feature.test @@ -0,0 +1,35 @@ +42 +3.14159 +4e10 +2.1e-10 +0.4e+2 +0xbabe +0xBABE +42f +42F +42u +42U +42l +42L + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "4e10"], + ["number", "2.1e-10"], + ["number", "0.4e+2"], + ["number", "0xbabe"], + ["number", "0xBABE"], + ["number", "42f"], + ["number", "42F"], + ["number", "42u"], + ["number", "42U"], + ["number", "42l"], + ["number", "42L"] +] + +---------------------------------------------------- + +Checks for decimal numbers and hexadecimal numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/c/operator_feature.test b/docs/_style/prism-master/tests/languages/c/operator_feature.test new file mode 100644 index 00000000..95cef646 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/c/operator_feature.test @@ -0,0 +1,61 @@ ++ - * / % -- ++ +>> << +~ & | ^ ++= -= *= /= %= >>= <<= &= |= ^= +! && || +-> :: +? : += == != < > <= >= + +---------------------------------------------------- + +[ + ["operator", "+"], + ["operator", "-"], + ["operator", "*"], + ["operator", "/"], + ["operator", "%"], + ["operator", "--"], + ["operator", "++"], + + ["operator", ">>"], + ["operator", "<<"], + + ["operator", "~"], + ["operator", "&"], + ["operator", "|"], + ["operator", "^"], + + ["operator", "+="], + ["operator", "-="], + ["operator", "*="], + ["operator", "/="], + ["operator", "%="], + ["operator", ">>="], + ["operator", "<<="], + ["operator", "&="], + ["operator", "|="], + ["operator", "^="], + + ["operator", "!"], + ["operator", "&&"], + ["operator", "||"], + + ["operator", "->"], + ["operator", "::"], + + ["operator", "?"], + ["operator", ":"], + + ["operator", "="], + ["operator", "=="], + ["operator", "!="], + ["operator", "<"], + ["operator", ">"], + ["operator", "<="], + ["operator", ">="] +] + +---------------------------------------------------- + +Checks for all operators diff --git a/docs/_style/prism-master/tests/languages/cil/asm_reference.test b/docs/_style/prism-master/tests/languages/cil/asm_reference.test new file mode 100644 index 00000000..991f998c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cil/asm_reference.test @@ -0,0 +1,11 @@ +[mscorlib] + +-------------------------------------------------------- + +[ + [ "variable", "[mscorlib]" ] +] + +-------------------------------------------------------- + +Tests assembly references diff --git a/docs/_style/prism-master/tests/languages/cil/boolean.test b/docs/_style/prism-master/tests/languages/cil/boolean.test new file mode 100644 index 00000000..c6cfe746 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cil/boolean.test @@ -0,0 +1,14 @@ + +true +false + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"] +] + +---------------------------------------------------- + +Tests booleans. diff --git a/docs/_style/prism-master/tests/languages/cil/comment.test b/docs/_style/prism-master/tests/languages/cil/comment.test new file mode 100644 index 00000000..97a30a45 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cil/comment.test @@ -0,0 +1,11 @@ +// this is a test + +-------------------------------------------------------- + +[ + [ "comment", "// this is a test" ] +] + +-------------------------------------------------------- + +Tests comments diff --git a/docs/_style/prism-master/tests/languages/cil/instructions.test b/docs/_style/prism-master/tests/languages/cil/instructions.test new file mode 100644 index 00000000..fc01826c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cil/instructions.test @@ -0,0 +1,457 @@ +add +add.ovf +add.ovf.un +and +arglist +beq +beq.s +bge +bge.s +bge.un +bge.un.s +bgt +bgt.s +bgt.un +bgt.un.s +ble +ble.s +ble.un +ble.un.s +blt +blt.s +blt.un +blt.un.s +bne.un +bne.un.s +box +br +br.s +break +brfalse +brfalse.s +brinst +brinst.s +brnull +brnull.s +brtrue +brtrue.s +brzero +brzero.s +call +calli +callvirt +castclass +ceq +cgt +cgt.un +ckfinite +clt +clt.un +conv.i +conv.i1 +conv.i2 +conv.i4 +conv.i8 +conv.ovf.i +conv.ovf.i.un +conv.ovf.i1 +conv.ovf.i1.un +conv.ovf.i2 +conv.ovf.i2.un +conv.ovf.i4 +conv.ovf.i4.un +conv.ovf.i8 +conv.ovf.i8.un +conv.ovf.u +conv.ovf.u.un +conv.ovf.u1 +conv.ovf.u1.un +conv.ovf.u2 +conv.ovf.u2.un +conv.ovf.u4 +conv.ovf.u4.un +conv.ovf.u8 +conv.ovf.u8.un +conv.r.un +conv.r4 +conv.r8 +conv.u +conv.u1 +conv.u2 +conv.u4 +conv.u8 +cpblk +cpobj +div +div.un +dup +endfault +endfilter +endfinally +initblk +initobj +isinst +jmp +ldarg +ldarg.0 +ldarg.1 +ldarg.2 +ldarg.3 +ldarg.s +ldarga +ldarga.s +ldc.i4 +ldc.i4.0 +ldc.i4.1 +ldc.i4.2 +ldc.i4.3 +ldc.i4.4 +ldc.i4.5 +ldc.i4.6 +ldc.i4.7 +ldc.i4.8 +ldc.i4.m1 +ldc.i4.M1 +ldc.i4.s +ldc.i8 +ldc.r4 +ldc.r8 +ldelem +ldelem.i +ldelem.i1 +ldelem.i2 +ldelem.i4 +ldelem.i8 +ldelem.r4 +ldelem.r8 +ldelem.ref +ldelem.u1 +ldelem.u2 +ldelem.u4 +ldelem.u8 +ldelema +ldfld +ldflda +ldftn +ldind.i +ldind.i1 +ldind.i2 +ldind.i4 +ldind.i8 +ldind.r4 +ldind.r8 +ldind.ref +ldind.u1 +ldind.u2 +ldind.u4 +ldind.u8 +ldlen +ldloc +ldloc.0 +ldloc.1 +ldloc.2 +ldloc.3 +ldloc.s +ldloca +ldloca.s +ldnull +ldobj +ldsfld +ldsflda +ldstr +ldtoken +ldvirtftn +leave +leave.s +localloc +mkrefany +mul +mul.ovf +mul.ovf.un +neg +newarr +newobj +nop +not +or +pop +refanytype +refanyval +rem +rem.un +ret +rethrow +shl +shr +shr.un +sizeof +starg +starg.s +stelem +stelem.i +stelem.i1 +stelem.i2 +stelem.i4 +stelem.i8 +stelem.r4 +stelem.r8 +stelem.ref +stfld +stind.i +stind.i1 +stind.i2 +stind.i4 +stind.i8 +stind.r4 +stind.r8 +stind.ref +stloc +stloc.0 +stloc.1 +stloc.2 +stloc.3 +stloc.s +stobj +stsfld +sub +sub.ovf +sub.ovf.un +switch +throw +alignment +unbox +unbox.any +xor + +---------------------------------------------------- + +[ + ["function", "add"], + ["function", "add.ovf"], + ["function", "add.ovf.un"], + ["function", "and"], + ["function", "arglist"], + ["function", "beq"], + ["function", "beq.s"], + ["function", "bge"], + ["function", "bge.s"], + ["function", "bge.un"], + ["function", "bge.un.s"], + ["function", "bgt"], + ["function", "bgt.s"], + ["function", "bgt.un"], + ["function", "bgt.un.s"], + ["function", "ble"], + ["function", "ble.s"], + ["function", "ble.un"], + ["function", "ble.un.s"], + ["function", "blt"], + ["function", "blt.s"], + ["function", "blt.un"], + ["function", "blt.un.s"], + ["function", "bne.un"], + ["function", "bne.un.s"], + ["function", "box"], + ["function", "br"], + ["function", "br.s"], + ["function", "break"], + ["function", "brfalse"], + ["function", "brfalse.s"], + ["function", "brinst"], + ["function", "brinst.s"], + ["function", "brnull"], + ["function", "brnull.s"], + ["function", "brtrue"], + ["function", "brtrue.s"], + ["function", "brzero"], + ["function", "brzero.s"], + ["function", "call"], + ["function", "calli"], + ["function", "callvirt"], + ["function", "castclass"], + ["function", "ceq"], + ["function", "cgt"], + ["function", "cgt.un"], + ["function", "ckfinite"], + ["function", "clt"], + ["function", "clt.un"], + ["function", "conv.i"], + ["function", "conv.i1"], + ["function", "conv.i2"], + ["function", "conv.i4"], + ["function", "conv.i8"], + ["function", "conv.ovf.i"], + ["function", "conv.ovf.i.un"], + ["function", "conv.ovf.i1"], + ["function", "conv.ovf.i1.un"], + ["function", "conv.ovf.i2"], + ["function", "conv.ovf.i2.un"], + ["function", "conv.ovf.i4"], + ["function", "conv.ovf.i4.un"], + ["function", "conv.ovf.i8"], + ["function", "conv.ovf.i8.un"], + ["function", "conv.ovf.u"], + ["function", "conv.ovf.u.un"], + ["function", "conv.ovf.u1"], + ["function", "conv.ovf.u1.un"], + ["function", "conv.ovf.u2"], + ["function", "conv.ovf.u2.un"], + ["function", "conv.ovf.u4"], + ["function", "conv.ovf.u4.un"], + ["function", "conv.ovf.u8"], + ["function", "conv.ovf.u8.un"], + ["function", "conv.r.un"], + ["function", "conv.r4"], + ["function", "conv.r8"], + ["function", "conv.u"], + ["function", "conv.u1"], + ["function", "conv.u2"], + ["function", "conv.u4"], + ["function", "conv.u8"], + ["function", "cpblk"], + ["function", "cpobj"], + ["function", "div"], + ["function", "div.un"], + ["function", "dup"], + ["function", "endfault"], + ["function", "endfilter"], + ["function", "endfinally"], + ["function", "initblk"], + ["function", "initobj"], + ["function", "isinst"], + ["function", "jmp"], + ["function", "ldarg"], + ["function", "ldarg.0"], + ["function", "ldarg.1"], + ["function", "ldarg.2"], + ["function", "ldarg.3"], + ["function", "ldarg.s"], + ["function", "ldarga"], + ["function", "ldarga.s"], + ["function", "ldc.i4"], + ["function", "ldc.i4.0"], + ["function", "ldc.i4.1"], + ["function", "ldc.i4.2"], + ["function", "ldc.i4.3"], + ["function", "ldc.i4.4"], + ["function", "ldc.i4.5"], + ["function", "ldc.i4.6"], + ["function", "ldc.i4.7"], + ["function", "ldc.i4.8"], + ["function", "ldc.i4.m1"], + ["function", "ldc.i4.M1"], + ["function", "ldc.i4.s"], + ["function", "ldc.i8"], + ["function", "ldc.r4"], + ["function", "ldc.r8"], + ["function", "ldelem"], + ["function", "ldelem.i"], + ["function", "ldelem.i1"], + ["function", "ldelem.i2"], + ["function", "ldelem.i4"], + ["function", "ldelem.i8"], + ["function", "ldelem.r4"], + ["function", "ldelem.r8"], + ["function", "ldelem.ref"], + ["function", "ldelem.u1"], + ["function", "ldelem.u2"], + ["function", "ldelem.u4"], + ["function", "ldelem.u8"], + ["function", "ldelema"], + ["function", "ldfld"], + ["function", "ldflda"], + ["function", "ldftn"], + ["function", "ldind.i"], + ["function", "ldind.i1"], + ["function", "ldind.i2"], + ["function", "ldind.i4"], + ["function", "ldind.i8"], + ["function", "ldind.r4"], + ["function", "ldind.r8"], + ["function", "ldind.ref"], + ["function", "ldind.u1"], + ["function", "ldind.u2"], + ["function", "ldind.u4"], + ["function", "ldind.u8"], + ["function", "ldlen"], + ["function", "ldloc"], + ["function", "ldloc.0"], + ["function", "ldloc.1"], + ["function", "ldloc.2"], + ["function", "ldloc.3"], + ["function", "ldloc.s"], + ["function", "ldloca"], + ["function", "ldloca.s"], + ["function", "ldnull"], + ["function", "ldobj"], + ["function", "ldsfld"], + ["function", "ldsflda"], + ["function", "ldstr"], + ["function", "ldtoken"], + ["function", "ldvirtftn"], + ["function", "leave"], + ["function", "leave.s"], + ["function", "localloc"], + ["function", "mkrefany"], + ["function", "mul"], + ["function", "mul.ovf"], + ["function", "mul.ovf.un"], + ["function", "neg"], + ["function", "newarr"], + ["function", "newobj"], + ["function", "nop"], + ["function", "not"], + ["function", "or"], + ["function", "pop"], + ["function", "refanytype"], + ["function", "refanyval"], + ["function", "rem"], + ["function", "rem.un"], + ["function", "ret"], + ["function", "rethrow"], + ["function", "shl"], + ["function", "shr"], + ["function", "shr.un"], + ["function", "sizeof"], + ["function", "starg"], + ["function", "starg.s"], + ["function", "stelem"], + ["function", "stelem.i"], + ["function", "stelem.i1"], + ["function", "stelem.i2"], + ["function", "stelem.i4"], + ["function", "stelem.i8"], + ["function", "stelem.r4"], + ["function", "stelem.r8"], + ["function", "stelem.ref"], + ["function", "stfld"], + ["function", "stind.i"], + ["function", "stind.i1"], + ["function", "stind.i2"], + ["function", "stind.i4"], + ["function", "stind.i8"], + ["function", "stind.r4"], + ["function", "stind.r8"], + ["function", "stind.ref"], + ["function", "stloc"], + ["function", "stloc.0"], + ["function", "stloc.1"], + ["function", "stloc.2"], + ["function", "stloc.3"], + ["function", "stloc.s"], + ["function", "stobj"], + ["function", "stsfld"], + ["function", "sub"], + ["function", "sub.ovf"], + ["function", "sub.ovf.un"], + ["function", "switch"], + ["function", "throw"], + ["function", "alignment"], + ["function", "unbox"], + ["function", "unbox.any"], + ["function", "xor"] +] + +---------------------------------------------------- + +Tests instruction names diff --git a/docs/_style/prism-master/tests/languages/cil/keywords.test b/docs/_style/prism-master/tests/languages/cil/keywords.test new file mode 100644 index 00000000..53a4645a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cil/keywords.test @@ -0,0 +1,161 @@ +abstract +ansi +assembly +auto +autochar +beforefieldinit +bool +bstr +byvalstr +cil +char +class +currency +date +decimal +default +enum +error +explicit +extends +extern +famandassem +family +famorassem +final +float32 +float64 +hidebysig +iant +idispatch +import +initonly +instance +int +int16 +int32 +int64 +int8 +uint +uint16 +uint32 +uint64 +uint8 +interface +iunknown +lpstr +lpstruct +lptstr +lpwstr +managed +nativeType +nested +newslot +objectref +pinvokeimpl +private +privatescope +public +reqsecobj +rtspecialname +sealed +sequential +serializable +specialname +static +string +struct +syschar +tbstr +unicode +unmanagedexp +unsigned +value +variant +virtual +void + +-------------------------------------------------------- + +[ + [ "keyword", "abstract" ], + [ "keyword", "ansi" ], + [ "keyword", "assembly" ], + [ "keyword", "auto" ], + [ "keyword", "autochar" ], + [ "keyword", "beforefieldinit" ], + [ "keyword", "bool" ], + [ "keyword", "bstr" ], + [ "keyword", "byvalstr" ], + [ "keyword", "cil" ], + [ "keyword", "char" ], + [ "keyword", "class" ], + [ "keyword", "currency" ], + [ "keyword", "date" ], + [ "keyword", "decimal" ], + [ "keyword", "default" ], + [ "keyword", "enum" ], + [ "keyword", "error" ], + [ "keyword", "explicit" ], + [ "keyword", "extends" ], + [ "keyword", "extern" ], + [ "keyword", "famandassem" ], + [ "keyword", "family" ], + [ "keyword", "famorassem" ], + [ "keyword", "final" ], + [ "keyword", "float32" ], + [ "keyword", "float64" ], + [ "keyword", "hidebysig" ], + [ "keyword", "iant" ], + [ "keyword", "idispatch" ], + [ "keyword", "import" ], + [ "keyword", "initonly" ], + [ "keyword", "instance" ], + [ "keyword", "int" ], + [ "keyword", "int16" ], + [ "keyword", "int32" ], + [ "keyword", "int64" ], + [ "keyword", "int8" ], + [ "keyword", "uint" ], + [ "keyword", "uint16" ], + [ "keyword", "uint32" ], + [ "keyword", "uint64" ], + [ "keyword", "uint8" ], + [ "keyword", "interface" ], + [ "keyword", "iunknown" ], + [ "keyword", "lpstr" ], + [ "keyword", "lpstruct" ], + [ "keyword", "lptstr" ], + [ "keyword", "lpwstr" ], + [ "keyword", "managed" ], + [ "keyword", "nativeType" ], + [ "keyword", "nested" ], + [ "keyword", "newslot" ], + [ "keyword", "objectref" ], + [ "keyword", "pinvokeimpl" ], + [ "keyword", "private" ], + [ "keyword", "privatescope" ], + [ "keyword", "public" ], + [ "keyword", "reqsecobj" ], + [ "keyword", "rtspecialname" ], + [ "keyword", "sealed" ], + [ "keyword", "sequential" ], + [ "keyword", "serializable" ], + [ "keyword", "specialname" ], + [ "keyword", "static" ], + [ "keyword", "string" ], + [ "keyword", "struct" ], + [ "keyword", "syschar" ], + [ "keyword", "tbstr" ], + [ "keyword", "unicode" ], + [ "keyword", "unmanagedexp" ], + [ "keyword", "unsigned" ], + [ "keyword", "value" ], + [ "keyword", "variant" ], + [ "keyword", "virtual" ], + [ "keyword", "void"] +] + +-------------------------------------------------------- + +Tests keywords diff --git a/docs/_style/prism-master/tests/languages/cil/strings.test b/docs/_style/prism-master/tests/languages/cil/strings.test new file mode 100644 index 00000000..da2de2c7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cil/strings.test @@ -0,0 +1,11 @@ +"testing! £$%^&*" + +---------------------------------------------------- + +[ + ["string", "\"testing! £$%^&*\""] +] + +---------------------------------------------------- + +Tests strings. diff --git a/docs/_style/prism-master/tests/languages/clike/boolean_feature.test b/docs/_style/prism-master/tests/languages/clike/boolean_feature.test new file mode 100644 index 00000000..6a1ad0ca --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clike/boolean_feature.test @@ -0,0 +1,12 @@ +true; false; + +---------------------------------------------------- + +[ + ["boolean", "true"], ["punctuation", ";"], + ["boolean", "false"], ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clike/class-name_feature.test b/docs/_style/prism-master/tests/languages/clike/class-name_feature.test new file mode 100644 index 00000000..04c21125 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clike/class-name_feature.test @@ -0,0 +1,53 @@ +class Foo +interface bar +extends Foo +implements bar +trait Foo +instanceof \bar +new \Foo +catch (bar) + +---------------------------------------------------- + +[ + "class ", + ["class-name", [ + "Foo" + ]], + "\r\ninterface ", + ["class-name", [ + "bar" + ]], + "\r\nextends ", + ["class-name", [ + "Foo" + ]], + "\r\nimplements ", + ["class-name", [ + "bar" + ]], + "\r\ntrait ", + ["class-name", [ + "Foo" + ]], + ["keyword", "instanceof"], + ["class-name", [ + ["punctuation", "\\"], + "bar" + ]], + ["keyword", "new"], + ["class-name", [ + ["punctuation", "\\"], + "Foo" + ]], + ["keyword", "catch"], + ["punctuation", "("], + ["class-name", [ + "bar" + ]], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for class names. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clike/comment_feature.test b/docs/_style/prism-master/tests/languages/clike/comment_feature.test new file mode 100644 index 00000000..00bb2894 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clike/comment_feature.test @@ -0,0 +1,16 @@ +// foobar +/**/ +/* foo +bar */ + +---------------------------------------------------- + +[ + ["comment", "// foobar"], + ["comment", "/**/"], + ["comment", "/* foo\r\nbar */"] +] + +---------------------------------------------------- + +Checks for single-line and multi-line comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clike/function_feature.test b/docs/_style/prism-master/tests/languages/clike/function_feature.test new file mode 100644 index 00000000..031ed1c9 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clike/function_feature.test @@ -0,0 +1,23 @@ +foo() +foo_bar() +f42() + +---------------------------------------------------- + +[ + ["function", "foo"], + ["punctuation", "("], + ["punctuation", ")"], + + ["function", "foo_bar"], + ["punctuation", "("], + ["punctuation", ")"], + + ["function", "f42"], + ["punctuation", "("], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clike/issue1340.test b/docs/_style/prism-master/tests/languages/clike/issue1340.test new file mode 100644 index 00000000..0b5effa0 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clike/issue1340.test @@ -0,0 +1,13 @@ +/* +// +*/ + +---------------------------------------------------- + +[ + ["comment", "/*\r\n//\r\n*/"] +] + +---------------------------------------------------- + +Non-regression test for inline comments inside multiline comments. See #1340 \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clike/keyword_feature.test b/docs/_style/prism-master/tests/languages/clike/keyword_feature.test new file mode 100644 index 00000000..4313f7c9 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clike/keyword_feature.test @@ -0,0 +1,30 @@ +if; else; while; do; for; +return; in; instanceof; function; new; +try; throw; catch; finally; null; +break; continue; + +---------------------------------------------------- + +[ + ["keyword", "if"], ["punctuation", ";"], + ["keyword", "else"], ["punctuation", ";"], + ["keyword", "while"], ["punctuation", ";"], + ["keyword", "do"], ["punctuation", ";"], + ["keyword", "for"], ["punctuation", ";"], + ["keyword", "return"], ["punctuation", ";"], + ["keyword", "in"], ["punctuation", ";"], + ["keyword", "instanceof"], ["punctuation", ";"], + ["keyword", "function"], ["punctuation", ";"], + ["keyword", "new"], ["punctuation", ";"], + ["keyword", "try"], ["punctuation", ";"], + ["keyword", "throw"], ["punctuation", ";"], + ["keyword", "catch"], ["punctuation", ";"], + ["keyword", "finally"], ["punctuation", ";"], + ["keyword", "null"], ["punctuation", ";"], + ["keyword", "break"], ["punctuation", ";"], + ["keyword", "continue"], ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clike/number_feature.test b/docs/_style/prism-master/tests/languages/clike/number_feature.test new file mode 100644 index 00000000..f6bcc0b6 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clike/number_feature.test @@ -0,0 +1,23 @@ +42 +3.14159 +4e10 +2.1e-10 +0.4e+2 +0xbabe +0xBABE + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "4e10"], + ["number", "2.1e-10"], + ["number", "0.4e+2"], + ["number", "0xbabe"], + ["number", "0xBABE"] +] + +---------------------------------------------------- + +Checks for decimal numbers and hexadecimal numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clike/operator_feature.test b/docs/_style/prism-master/tests/languages/clike/operator_feature.test new file mode 100644 index 00000000..1a4c6495 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clike/operator_feature.test @@ -0,0 +1,21 @@ +- + -- ++ +< <= > >= += == === +! != !== +& && | || +? * / ~ ^ % + +---------------------------------------------------- + +[ + ["operator", "-"], ["operator", "+"], ["operator", "--"], ["operator", "++"], + ["operator", "<"], ["operator", "<="], ["operator", ">"], ["operator", ">="], + ["operator", "="], ["operator", "=="], ["operator", "==="], + ["operator", "!"], ["operator", "!="], ["operator", "!=="], + ["operator", "&"], ["operator", "&&"], ["operator", "|"], ["operator", "||"], + ["operator", "?"], ["operator", "*"], ["operator", "/"], ["operator", "~"], ["operator", "^"], ["operator", "%"] +] + +---------------------------------------------------- + +Checks for all operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clike/string_feature.test b/docs/_style/prism-master/tests/languages/clike/string_feature.test new file mode 100644 index 00000000..0e347c90 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clike/string_feature.test @@ -0,0 +1,31 @@ +"" +'' +"f\"oo" +'b\'ar' +"foo\ +bar" +'foo\ +bar' +"foo /* comment */ bar" +'foo // bar' +'foo // bar' //comment + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "''"], + ["string", "\"f\\\"oo\""], + ["string", "'b\\'ar'"], + ["string", "\"foo\\\r\nbar\""], + ["string", "'foo\\\r\nbar'"], + ["string", "\"foo /* comment */ bar\""], + ["string", "'foo // bar'"], + ["string", "'foo // bar'"], + ["comment", "//comment"] +] + +---------------------------------------------------- + +Checks for empty strings, single-line strings and +multi-line strings, both single-quoted and double-quoted. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clojure/boolean_feature.test b/docs/_style/prism-master/tests/languages/clojure/boolean_feature.test new file mode 100644 index 00000000..55720b4f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clojure/boolean_feature.test @@ -0,0 +1,15 @@ +false +true +nil + +---------------------------------------------------- + +[ + ["boolean", "false"], + ["boolean", "true"], + ["boolean", "nil"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clojure/comment_feature.test b/docs/_style/prism-master/tests/languages/clojure/comment_feature.test new file mode 100644 index 00000000..c4f5c7d1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clojure/comment_feature.test @@ -0,0 +1,13 @@ +;; this is comment +; this is another comment + +---------------------------------------------------- + +[ + ["comment", ";; this is comment"], + ["comment", "; this is another comment"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clojure/keyword_feature.test b/docs/_style/prism-master/tests/languages/clojure/keyword_feature.test new file mode 100644 index 00000000..0c32cd2d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clojure/keyword_feature.test @@ -0,0 +1,175 @@ +(def) +(if) +(do) +(let) +(var) +(fn) +(quote) +(->>) +(->) +(loop) +(recur) +(throw) +(try) +(monitor-enter) +(.) +(new) +(set!) +(defn) +(defn-) +(defmacro) +(defmulti) +(defmethod) +(defstruct) +(defonce) +(declare) +(definline) +(definterface) +(defprotocol) +(defrecord) +(deftype) +(defproject) +(ns) +(*) +(+) +(-) +(/) +(<) +(<=) +(>=) +(=) +(==) +(..) +(>) +(accessor) +(agent) +(agent-errors) +(aget) +(alength) +(all-ns) +(alter) +(and) +(append-child) +(apply) +(array-map) +(aset) +(aset-boolean) +(aset-byte) +(aset-char) +(aset-double) +(aset-float) +(aset-int) +(aset-long) +(aset-short) +(assert) +(assoc) +(await) +(await-for) +(bean) +(binding) +(bit-and) +(bit-not) +(branch?) +(contains?) +(end?) +(every?) +(false?) +(identical?) +(instance?) +(keyword?) +(list*) +(not-any?) +(true?) +(zero?) + +---------------------------------------------------- + +[ + ["punctuation", "("], ["keyword", "def"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "if"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "do"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "let"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "var"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "fn"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "quote"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "->>"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "->"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "loop"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "recur"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "throw"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "try"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "monitor-enter"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "."], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "new"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "set!"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defn"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defn-"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defmacro"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defmulti"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defmethod"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defstruct"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defonce"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "declare"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "definline"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "definterface"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defprotocol"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defrecord"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "deftype"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "defproject"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "ns"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "*"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "+"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "-"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "/"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "<"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "<="], ["punctuation", ")"], + ["punctuation", "("], ["keyword", ">="], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "="], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "=="], ["punctuation", ")"], + ["punctuation", "("], ["keyword", ".."], ["punctuation", ")"], + ["punctuation", "("], ["keyword", ">"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "accessor"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "agent"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "agent-errors"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aget"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "alength"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "all-ns"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "alter"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "and"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "append-child"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "apply"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "array-map"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aset"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aset-boolean"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aset-byte"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aset-char"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aset-double"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aset-float"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aset-int"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aset-long"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "aset-short"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "assert"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "assoc"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "await"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "await-for"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "bean"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "binding"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "bit-and"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "bit-not"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "branch?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "contains?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "end?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "every?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "false?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "identical?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "instance?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "keyword?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "list*"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "not-any?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "true?"], ["punctuation", ")"], + ["punctuation", "("], ["keyword", "zero?"], ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for keywords. diff --git a/docs/_style/prism-master/tests/languages/clojure/operator_and_punctuation.test b/docs/_style/prism-master/tests/languages/clojure/operator_and_punctuation.test new file mode 100644 index 00000000..e90acb63 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clojure/operator_and_punctuation.test @@ -0,0 +1,20 @@ +(::example [x y] (:kebab-case x y)) + +---------------------------------------------------- + +[ + ["punctuation", "("], + ["operator", "::example"], + ["punctuation", "["], + "x y", + ["punctuation", "]"], + ["punctuation", "("], + ["operator", ":kebab-case"], + " x y", + ["punctuation", ")"], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for operators and punctuation. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/clojure/string_feature.test b/docs/_style/prism-master/tests/languages/clojure/string_feature.test new file mode 100644 index 00000000..13a966cf --- /dev/null +++ b/docs/_style/prism-master/tests/languages/clojure/string_feature.test @@ -0,0 +1,13 @@ +"" +"Fo\"obar" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"Fo\\\"obar\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/coffeescript+haml/coffeescript_inclusion.test b/docs/_style/prism-master/tests/languages/coffeescript+haml/coffeescript_inclusion.test new file mode 100644 index 00000000..7a775169 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/coffeescript+haml/coffeescript_inclusion.test @@ -0,0 +1,24 @@ +:coffee + 'This is coffee script' + +~ + :coffee + 'This is coffee script' + +---------------------------------------------------- + +[ + ["filter-coffee", [ + ["filter-name", ":coffee"], + ["string", "'This is coffee script'"] + ]], + ["punctuation", "~"], + ["filter-coffee", [ + ["filter-name", ":coffee"], + ["string", "'This is coffee script'"] + ]] +] + +---------------------------------------------------- + +Checks for CoffeeScript filter in Haml. The tilde serves only as a separator. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/coffeescript+pug/coffeescript_inclusion.test b/docs/_style/prism-master/tests/languages/coffeescript+pug/coffeescript_inclusion.test new file mode 100644 index 00000000..ccf8963b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/coffeescript+pug/coffeescript_inclusion.test @@ -0,0 +1,19 @@ +:coffee + "#{foo}" + +---------------------------------------------------- + +[ + ["filter-coffee", [ + ["filter-name", ":coffee"], + ["string", [ + "\"", + ["interpolation", "#{foo}"], + "\"" + ]] + ]] +] + +---------------------------------------------------- + +Checks for coffee filter (CoffeeScript) in Jade. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/coffeescript/block-regex_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/block-regex_feature.test new file mode 100644 index 00000000..b01a9a42 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/coffeescript/block-regex_feature.test @@ -0,0 +1,33 @@ +///foo[bar]/// +///foo +[bar]/// +///foo +b#{ar}baz/// +///foo #bar +baz/// + +---------------------------------------------------- + +[ + ["block-regex", [ + "///foo[bar]///" + ]], + ["block-regex", [ + "///foo\r\n[bar]///" + ]], + ["block-regex", [ + "///foo\r\nb", + ["interpolation", "#{ar}"], + "baz///" + ]], + ["block-regex", [ + "///foo ", + ["comment", "#bar"], + "\r\nbaz///" + ]] +] + +---------------------------------------------------- + +Checks for block regex. +Also checks for comments and interpolations inside block regex. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/coffeescript/class-member_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/class-member_feature.test new file mode 100644 index 00000000..6fdbcf3e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/coffeescript/class-member_feature.test @@ -0,0 +1,13 @@ +@name +@foo_bar + +---------------------------------------------------- + +[ + ["class-member", "@name"], + ["class-member", "@foo_bar"] +] + +---------------------------------------------------- + +Checks for class members. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/coffeescript/comment_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/comment_feature.test new file mode 100644 index 00000000..5d034ff0 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/coffeescript/comment_feature.test @@ -0,0 +1,16 @@ +#foo +# foo bar +### foo bar +baz ### + +---------------------------------------------------- + +[ + ["comment", "#foo"], + ["comment", "# foo bar"], + ["multiline-comment", "### foo bar\r\nbaz ###"] +] + +---------------------------------------------------- + +Checks for single-line and multi-line comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/coffeescript/inline-javascript_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/inline-javascript_feature.test new file mode 100644 index 00000000..cf15e26c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/coffeescript/inline-javascript_feature.test @@ -0,0 +1,22 @@ +`/* JS here */` +`/* +JS here */` + +---------------------------------------------------- + +[ + ["inline-javascript", [ + ["delimiter", "`"], + ["comment", "/* JS here */"], + ["delimiter", "`"] + ]], + ["inline-javascript", [ + ["delimiter", "`"], + ["comment", "/*\r\nJS here */"], + ["delimiter", "`"] + ]] +] + +---------------------------------------------------- + +Checks for inline JavaScript. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/coffeescript/keyword_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/keyword_feature.test new file mode 100644 index 00000000..3207e398 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/coffeescript/keyword_feature.test @@ -0,0 +1,41 @@ +and break by catch +class; +continue debugger delete +do each else extend +extends; +false finally for if in +instanceof; +is isnt let +loop namespace +new; +no not null of off on +or own return super +switch then this throw +true try typeof undefined +unless until when while +window with yes yield + +---------------------------------------------------- + +[ + ["keyword", "and"], ["keyword", "break"], ["keyword", "by"], ["keyword", "catch"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "continue"], ["keyword", "debugger"], ["keyword", "delete"], + ["keyword", "do"], ["keyword", "each"], ["keyword", "else"], ["keyword", "extend"], + ["keyword", "extends"], ["punctuation", ";"], + ["keyword", "false"], ["keyword", "finally"], ["keyword", "for"], ["keyword", "if"], ["keyword", "in"], + ["keyword", "instanceof"], ["punctuation", ";"], + ["keyword", "is"], ["keyword", "isnt"], ["keyword", "let"], + ["keyword", "loop"], ["keyword", "namespace"], + ["keyword", "new"], ["punctuation", ";"], + ["keyword", "no"], ["keyword", "not"], ["keyword", "null"], ["keyword", "of"], ["keyword", "off"], ["keyword", "on"], + ["keyword", "or"], ["keyword", "own"], ["keyword", "return"], ["keyword", "super"], + ["keyword", "switch"], ["keyword", "then"], ["keyword", "this"], ["keyword", "throw"], + ["keyword", "true"], ["keyword", "try"], ["keyword", "typeof"], ["keyword", "undefined"], + ["keyword", "unless"], ["keyword", "until"], ["keyword", "when"], ["keyword", "while"], + ["keyword", "window"], ["keyword", "with"], ["keyword", "yes"], ["keyword", "yield"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/coffeescript/property_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/property_feature.test new file mode 100644 index 00000000..0f256798 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/coffeescript/property_feature.test @@ -0,0 +1,15 @@ +foo: +foo_bar : + +---------------------------------------------------- + +[ + ["property", "foo"], + ["punctuation", ":"], + ["property", "foo_bar"], + ["punctuation", ":"] +] + +---------------------------------------------------- + +Checks for object properties. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/coffeescript/string_feature.test b/docs/_style/prism-master/tests/languages/coffeescript/string_feature.test new file mode 100644 index 00000000..f5a68685 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/coffeescript/string_feature.test @@ -0,0 +1,64 @@ +'' +'foo' +'foo\ +bar' +"" +"foo" +"foo\ +bar" +"foo #{interpolation} bar" +'''''' +'''foo''' +'''foo +bar''' + +"""""" +"""foo""" +"""foo +bar""" +"""foo #{interpolation} bar""" +"foo # comment bar" +'foo # bar' +"""foo +#comment +bar""" +'''foo +#comment +bar''' + +---------------------------------------------------- + +[ + ["string", "''"], + ["string", "'foo'"], + ["string", "'foo\\\r\nbar'"], + ["string", ["\"\""]], + ["string", ["\"foo\""]], + ["string", ["\"foo\\\r\nbar\""]], + ["string", [ + "\"foo ", + ["interpolation", "#{interpolation}"], + " bar\"" + ]], + + ["multiline-string", "''''''"], + ["multiline-string", "'''foo'''"], + ["multiline-string", "'''foo\r\nbar'''"], + ["multiline-string", ["\"\"\"\"\"\""]], + ["multiline-string", ["\"\"\"foo\"\"\""]], + ["multiline-string", ["\"\"\"foo\r\nbar\"\"\""]], + ["multiline-string", [ + "\"\"\"foo ", + ["interpolation", "#{interpolation}"], + " bar\"\"\"" + ]], + ["string", ["\"foo # comment bar\""]], + ["string", "'foo # bar'"], + ["multiline-string", ["\"\"\"foo\r\n#comment\r\nbar\"\"\""]], + ["multiline-string", "'''foo\r\n#comment\r\nbar'''"] +] + +---------------------------------------------------- + +Checks for single-line and multi-line strings and block strings. +Also checks for string interpolation inside double-quoted strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/cpp+pure/cpp_inclusion.test b/docs/_style/prism-master/tests/languages/cpp+pure/cpp_inclusion.test new file mode 100644 index 00000000..150080e4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cpp+pure/cpp_inclusion.test @@ -0,0 +1,18 @@ +%< -*- C++ -*- +alignas +%> + +---------------------------------------------------- + +[ + ["inline-lang-cpp", [ + ["delimiter", "%< "], + ["lang", "-*- C++ -*-"], + ["keyword", "alignas"], + ["delimiter", "%>"] + ]] +] + +---------------------------------------------------- + +Checks for C++ in Pure. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/cpp/boolean_feature.test b/docs/_style/prism-master/tests/languages/cpp/boolean_feature.test new file mode 100644 index 00000000..4019c444 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cpp/boolean_feature.test @@ -0,0 +1,13 @@ +true +false + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/cpp/class-name_feature.test b/docs/_style/prism-master/tests/languages/cpp/class-name_feature.test new file mode 100644 index 00000000..f3d5df5f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cpp/class-name_feature.test @@ -0,0 +1,13 @@ +class Foo +class Foo_bar + +---------------------------------------------------- + +[ + ["keyword", "class"], ["class-name", "Foo"], + ["keyword", "class"], ["class-name", "Foo_bar"] +] + +---------------------------------------------------- + +Checks for class names. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/cpp/keyword_feature.test b/docs/_style/prism-master/tests/languages/cpp/keyword_feature.test new file mode 100644 index 00000000..180f68ef --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cpp/keyword_feature.test @@ -0,0 +1,49 @@ +alignas alignof asm auto bool +break case catch char char16_t char32_t +class; +compl const constexpr +const_cast continue decltype default +delete do double dynamic_cast +else enum explicit export extern +float for friend goto if +inline int long mutable namespace +new noexcept nullptr operator +private protected public register +reinterpret_cast return short +signed sizeof static static_assert +static_cast struct switch template +this thread_local throw try +typedef typeid typename union +unsigned using virtual void +volatile wchar_t while +int8_t int16_t int32_t int64_t +uint8_t uint16_t uint32_t uint64_t + +---------------------------------------------------- + +[ + ["keyword", "alignas"], ["keyword", "alignof"], ["keyword", "asm"], ["keyword", "auto"], ["keyword", "bool"], + ["keyword", "break"], ["keyword", "case"], ["keyword", "catch"], ["keyword", "char"], ["keyword", "char16_t"], ["keyword", "char32_t"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "compl"], ["keyword", "const"], ["keyword", "constexpr"], + ["keyword", "const_cast"], ["keyword", "continue"], ["keyword", "decltype"], ["keyword", "default"], + ["keyword", "delete"], ["keyword", "do"], ["keyword", "double"], ["keyword", "dynamic_cast"], + ["keyword", "else"], ["keyword", "enum"], ["keyword", "explicit"], ["keyword", "export"], ["keyword", "extern"], + ["keyword", "float"], ["keyword", "for"], ["keyword", "friend"], ["keyword", "goto"], ["keyword", "if"], + ["keyword", "inline"], ["keyword", "int"], ["keyword", "long"], ["keyword", "mutable"], ["keyword", "namespace"], + ["keyword", "new"], ["keyword", "noexcept"], ["keyword", "nullptr"], ["keyword", "operator"], + ["keyword", "private"], ["keyword", "protected"], ["keyword", "public"], ["keyword", "register"], + ["keyword", "reinterpret_cast"], ["keyword", "return"], ["keyword", "short"], + ["keyword", "signed"], ["keyword", "sizeof"], ["keyword", "static"], ["keyword", "static_assert"], + ["keyword", "static_cast"], ["keyword", "struct"], ["keyword", "switch"], ["keyword", "template"], + ["keyword", "this"], ["keyword", "thread_local"], ["keyword", "throw"], ["keyword", "try"], + ["keyword", "typedef"], ["keyword", "typeid"], ["keyword", "typename"], ["keyword", "union"], + ["keyword", "unsigned"], ["keyword", "using"], ["keyword", "virtual"], ["keyword", "void"], + ["keyword", "volatile"], ["keyword", "wchar_t"], ["keyword", "while"], + ["keyword", "int8_t"], ["keyword", "int16_t"], ["keyword", "int32_t"], ["keyword", "int64_t"], + ["keyword", "uint8_t"], ["keyword", "uint16_t"], ["keyword", "uint32_t"], ["keyword", "uint64_t"] +] + +---------------------------------------------------- + +Checks for all keywords \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/cpp/operator_feature.test b/docs/_style/prism-master/tests/languages/cpp/operator_feature.test new file mode 100644 index 00000000..a29f08ea --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cpp/operator_feature.test @@ -0,0 +1,73 @@ ++ - * / % -- ++ +>> << +~ & | ^ ++= -= *= /= %= >>= <<= &= |= ^= +! && || +-> :: +? : += == != < > <= >= +and and_eq bitand bitor not not_eq or or_eq xor xor_eq + +---------------------------------------------------- + +[ + ["operator", "+"], + ["operator", "-"], + ["operator", "*"], + ["operator", "/"], + ["operator", "%"], + ["operator", "--"], + ["operator", "++"], + + ["operator", ">>"], + ["operator", "<<"], + + ["operator", "~"], + ["operator", "&"], + ["operator", "|"], + ["operator", "^"], + + ["operator", "+="], + ["operator", "-="], + ["operator", "*="], + ["operator", "/="], + ["operator", "%="], + ["operator", ">>="], + ["operator", "<<="], + ["operator", "&="], + ["operator", "|="], + ["operator", "^="], + + ["operator", "!"], + ["operator", "&&"], + ["operator", "||"], + + ["operator", "->"], + ["operator", "::"], + + ["operator", "?"], + ["operator", ":"], + + ["operator", "="], + ["operator", "=="], + ["operator", "!="], + ["operator", "<"], + ["operator", ">"], + ["operator", "<="], + ["operator", ">="], + + ["operator", "and"], + ["operator", "and_eq"], + ["operator", "bitand"], + ["operator", "bitor"], + ["operator", "not"], + ["operator", "not_eq"], + ["operator", "or"], + ["operator", "or_eq"], + ["operator", "xor"], + ["operator", "xor_eq"] +] + +---------------------------------------------------- + +Checks for all operators. diff --git a/docs/_style/prism-master/tests/languages/cpp/raw_string_feature.test b/docs/_style/prism-master/tests/languages/cpp/raw_string_feature.test new file mode 100644 index 00000000..f9a896f8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/cpp/raw_string_feature.test @@ -0,0 +1,18 @@ +R"raw( +test +)raw" +R"(no delimiter)" +R"(foo)"R"(bar)" + +---------------------------------------------------- + +[ + ["raw-string", "R\"raw(\r\ntest\r\n)raw\""], + ["raw-string", "R\"(no delimiter)\""], + ["raw-string", "R\"(foo)\""], + ["raw-string", "R\"(bar)\""] +] + +---------------------------------------------------- + +Checks for the C++11 raw string feature \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/crystal/attribute_feature.test b/docs/_style/prism-master/tests/languages/crystal/attribute_feature.test new file mode 100644 index 00000000..4fb0bad1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/crystal/attribute_feature.test @@ -0,0 +1,21 @@ +@[AlwaysInline] +@[CallConvention("X86_StdCall")] + +---------------------------------------------------- + +[ + ["attribute", [ + ["delimiter", "@["], + ["constant", "AlwaysInline"], + ["delimiter", "]"] + ]], + ["attribute", [ + ["delimiter", "@["], + ["constant", "CallConvention"], ["punctuation", "("], ["string", [ "\"X86_StdCall\"" ]], ["punctuation", ")"], + ["delimiter", "]"] + ]] +] + +---------------------------------------------------- + +Checks for attributes. diff --git a/docs/_style/prism-master/tests/languages/crystal/expansion_feature.test b/docs/_style/prism-master/tests/languages/crystal/expansion_feature.test new file mode 100644 index 00000000..b40bd1f5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/crystal/expansion_feature.test @@ -0,0 +1,37 @@ +{{ 1_u32 }} +{% 2_u32 %} +{{ { 3_u32 } }} +{% % 4_u32 % %} + +---------------------------------------------------- + +[ + ["expansion", [ + ["delimiter", "{{"], + ["number", "1_u32"], + ["delimiter", "}}"] + ]], + ["expansion", [ + ["delimiter", "{%"], + ["number", "2_u32"], + ["delimiter", "%}"] + ]], + ["expansion", [ + ["delimiter", "{{"], + ["punctuation", "{"], + ["number", "3_u32"], + ["punctuation", "}"], + ["delimiter", "}}"] + ]], + ["expansion", [ + ["delimiter", "{%"], + ["operator", "%"], + ["number", "4_u32"], + ["operator", "%"], + ["delimiter", "%}"] + ]] +] + +---------------------------------------------------- + +Checks for macro expansions. diff --git a/docs/_style/prism-master/tests/languages/crystal/keyword_feature.test b/docs/_style/prism-master/tests/languages/crystal/keyword_feature.test new file mode 100644 index 00000000..962beadf --- /dev/null +++ b/docs/_style/prism-master/tests/languages/crystal/keyword_feature.test @@ -0,0 +1,37 @@ +abstract alias as asm begin break case +class; +def; +do else elsif +end ensure enum extend for fun +if include instance_sizeof +.is_a? +lib macro module next of out pointerof +private protected rescue +.responds_to? +return require select self sizeof struct super +then type typeof uninitialized union unless +until when while with yield __DIR__ __END_LINE__ +__FILE__ __LINE__ + +---------------------------------------------------- + +[ + ["keyword", "abstract"], ["keyword", "alias"], ["keyword", "as"], ["keyword", "asm"], ["keyword", "begin"], ["keyword", "break"], ["keyword", "case"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "def"], ["punctuation", ";"], + ["keyword", "do"], ["keyword", "else"], ["keyword", "elsif"], + ["keyword", "end"], ["keyword", "ensure"], ["keyword", "enum"], ["keyword", "extend"], ["keyword", "for"], ["keyword", "fun"], + ["keyword", "if"], ["keyword", "include"], ["keyword", "instance_sizeof"], + ["punctuation", "."], ["keyword", "is_a?"], + ["keyword", "lib"], ["keyword", "macro"], ["keyword", "module"], ["keyword", "next"], ["keyword", "of"], ["keyword", "out"], ["keyword", "pointerof"], + ["keyword", "private"], ["keyword", "protected"], ["keyword", "rescue"], + ["punctuation", "."], ["keyword", "responds_to?"], + ["keyword", "return"], ["keyword", "require"], ["keyword", "select"], ["keyword", "self"], ["keyword", "sizeof"], ["keyword", "struct"], ["keyword", "super"], + ["keyword", "then"], ["keyword", "type"], ["keyword", "typeof"], ["keyword", "uninitialized"], ["keyword", "union"], ["keyword", "unless"], + ["keyword", "until"], ["keyword", "when"], ["keyword", "while"], ["keyword", "with"], ["keyword", "yield"], ["keyword", "__DIR__"], ["keyword", "__END_LINE__"], + ["keyword", "__FILE__"], ["keyword", "__LINE__"] +] + +---------------------------------------------------- + +Checks for all keywords. diff --git a/docs/_style/prism-master/tests/languages/crystal/number_feature.test b/docs/_style/prism-master/tests/languages/crystal/number_feature.test new file mode 100644 index 00000000..cefdc5ee --- /dev/null +++ b/docs/_style/prism-master/tests/languages/crystal/number_feature.test @@ -0,0 +1,23 @@ +1 +1_1 +1_1_1 +0b10_01 +0o1_2_3 +0x123456789abcdef +012_345.678_9e+10_f64 + +---------------------------------------------------- + +[ + ["number", "1"], + ["number", "1_1"], + ["number", "1_1_1"], + ["number", "0b10_01"], + ["number", "0o1_2_3"], + ["number", "0x123456789abcdef"], + ["number", "012_345.678_9e+10_f64"] +] + +---------------------------------------------------- + +Checks for number literals. diff --git a/docs/_style/prism-master/tests/languages/csharp+aspnet/directive_feature.test b/docs/_style/prism-master/tests/languages/csharp+aspnet/directive_feature.test new file mode 100644 index 00000000..f19c2a82 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp+aspnet/directive_feature.test @@ -0,0 +1,70 @@ +<%: Page.Title %> +<%#:Item.ProductID%> + +<% if(foo) { %> + foobar +<% } %> + +---------------------------------------------------- + +[ + ["directive tag", [ + ["directive tag", "<%:"], + " Page", + ["punctuation", "."], + "Title ", + ["directive tag", "%>"] + ]], + + ["directive tag", [ + ["directive tag", "<%#:"], + "Item", + ["punctuation", "."], + "ProductID", + ["directive tag", "%>"] + ]], + + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "a" + ]], + ["attr-name", [ + "href" + ]], + ["attr-value", [ + ["punctuation", "="], + ["punctuation", "\""], + "ProductDetails.aspx?productID=", + ["directive tag", [ + ["directive tag", "<%#:"], + "Item", + ["punctuation", "."], + "ProductID", + ["directive tag", "%>"] + ]], + ["punctuation", "\""] + ]], + ["punctuation", ">"] + ]], + + ["directive tag", [ + ["directive tag", "<%"], + ["keyword", "if"], + ["punctuation", "("], + "foo", + ["punctuation", ")"], + ["punctuation", "{"], + ["directive tag", "%>"] + ]], + "\r\n\tfoobar\r\n", + ["directive tag", [ + ["directive tag", "<%"], + ["punctuation", "}"], + ["directive tag", "%>"] + ]] +] + +---------------------------------------------------- + +Checks for directives. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/class-name_feature.test b/docs/_style/prism-master/tests/languages/csharp/class-name_feature.test new file mode 100644 index 00000000..113982b6 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/class-name_feature.test @@ -0,0 +1,34 @@ +class Foo +interface BarBaz +class Foo : Bar +[Foobar] +void Foo(Bar bar, Baz baz) + +---------------------------------------------------- + +[ + ["keyword", "class"], + ["class-name", ["Foo"]], + ["keyword", "interface"], + ["class-name", ["BarBaz"]], + ["keyword", "class"], + ["class-name", ["Foo"]], + ["punctuation", ":"], + ["class-name", ["Bar"]], + ["punctuation", "["], + ["class-name", ["Foobar"]], + ["punctuation", "]"], + ["keyword", "void"], + ["function", "Foo"], + ["punctuation", "("], + ["class-name", ["Bar"]], + " bar", + ["punctuation", ","], + ["class-name", ["Baz"]], + " baz", + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for class names. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/generic_feature.test b/docs/_style/prism-master/tests/languages/csharp/generic_feature.test new file mode 100644 index 00000000..05d3f589 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/generic_feature.test @@ -0,0 +1,34 @@ +void method(); +method(); + +---------------------------------------------------- + +[ + ["keyword", "void"], + ["generic-method", [ + ["function", "method"], + ["punctuation", "<"], + ["class-name", ["T"]], + ["punctuation", ","], + ["class-name", ["U"]], + ["punctuation", ">"] + ]], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ";"], + ["generic-method", [ + ["function", "method"], + ["punctuation", "<"], + ["keyword", "int"], + ["punctuation", ","], + ["keyword", "char"], + ["punctuation", ">"] + ]], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for generic methods \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/issue1091.test b/docs/_style/prism-master/tests/languages/csharp/issue1091.test new file mode 100644 index 00000000..c0c264b1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/issue1091.test @@ -0,0 +1,12 @@ +@"file:///" + +---------------------------------------------------- + +[ + ["string", "@\"file:///\""] +] + +---------------------------------------------------- + +Checks that three slashes inside a string do not break highlighting. +See #1091. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/issue1365.test b/docs/_style/prism-master/tests/languages/csharp/issue1365.test new file mode 100644 index 00000000..6aaf3c71 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/issue1365.test @@ -0,0 +1,39 @@ +interface ILogger { + void Init(SomeClass file); + void LogInfo(string message); +} +public class SomeClass : BaseClass {} + +---------------------------------------------------- + +[ + ["keyword", "interface"], + ["class-name", ["ILogger"]], + ["punctuation", "{"], + ["keyword", "void"], + ["function", "Init"], + ["punctuation", "("], + ["class-name", ["SomeClass"]], + " file", + ["punctuation", ")"], + ["punctuation", ";"], + ["keyword", "void"], + ["function", "LogInfo"], + ["punctuation", "("], + ["keyword", "string"], + " message", + ["punctuation", ")"], + ["punctuation", ";"], + ["punctuation", "}"], + ["keyword", "public"], + ["keyword", "class"], + ["class-name", ["SomeClass"]], + ["punctuation", ":"], + ["class-name", ["BaseClass"]], + ["punctuation", "{"], + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for class names. See #1365 \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/issue1371.test b/docs/_style/prism-master/tests/languages/csharp/issue1371.test new file mode 100644 index 00000000..1fec4a05 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/issue1371.test @@ -0,0 +1,144 @@ +container.Register(); +container.Register(); +var container = new Container(f => +{ + f.For().Use(); +}); +class LandAnimal { + public void Move() => Run(); } +class Dog : LandAnimal { + public new void Move() => Run(); } +class Works : LandAnimal { + public override void Move() => Run(); } +[Required] +[RequiredAttribute()] +[Range(1, 10)] + +---------------------------------------------------- + +[ + "container", + ["punctuation", "."], + ["generic-method", [ + ["function", "Register"], + ["punctuation", "<"], + ["class-name", ["Car"]], + ["punctuation", ">"] + ]], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ";"], + "\r\ncontainer", + ["punctuation", "."], + ["generic-method", [ + ["function", "Register"], + ["punctuation", "<"], + ["class-name", ["IJuice"]], + ["punctuation", ","], + ["class-name", ["Juice"]], + ["punctuation", ">"] + ]], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ";"], + ["keyword", "var"], + " container ", + ["operator", "="], + ["keyword", "new"], + ["class-name", ["Container"]], + ["punctuation", "("], + "f ", + ["operator", "=>"], + ["punctuation", "{"], + "\r\n f", + ["punctuation", "."], + ["generic-method", [ + ["function", "For"], + ["punctuation", "<"], + ["class-name", ["IFoo"]], + ["punctuation", ">"] + ]], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", "."], + ["generic-method", [ + ["function", "Use"], + ["punctuation", "<"], + ["class-name", ["Foo"]], + ["punctuation", ">"] + ]], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ";"], + ["punctuation", "}"], + ["punctuation", ")"], + ["punctuation", ";"], + ["keyword", "class"], + ["class-name", ["LandAnimal"]], + ["punctuation", "{"], + ["keyword", "public"], + ["keyword", "void"], + ["function", "Move"], + ["punctuation", "("], + ["punctuation", ")"], + ["operator", "=>"], + ["function", "Run"], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ";"], + ["punctuation", "}"], + ["keyword", "class"], + ["class-name", ["Dog"]], + ["punctuation", ":"], + ["class-name", ["LandAnimal"]], + ["punctuation", "{"], + ["keyword", "public"], + ["keyword", "new"], + ["keyword", "void"], + ["function", "Move"], + ["punctuation", "("], + ["punctuation", ")"], + ["operator", "=>"], + ["function", "Run"], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ";"], + ["punctuation", "}"], + ["keyword", "class"], + ["class-name", ["Works"]], + ["punctuation", ":"], + ["class-name", ["LandAnimal"]], + ["punctuation", "{"], + ["keyword", "public"], + ["keyword", "override"], + ["keyword", "void"], + ["function", "Move"], + ["punctuation", "("], + ["punctuation", ")"], + ["operator", "=>"], + ["function", "Run"], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ";"], + ["punctuation", "}"], + ["punctuation", "["], + ["class-name", ["Required"]], + ["punctuation", "]"], + ["punctuation", "["], + ["class-name", ["RequiredAttribute"]], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", "]"], + ["punctuation", "["], + ["class-name", ["Range"]], + ["punctuation", "("], + ["number", "1"], + ["punctuation", ","], + ["number", "10"], + ["punctuation", ")"], + ["punctuation", "]"] +] + +---------------------------------------------------- + +Checks for various cases of class names. See #1371 \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/issue806.test b/docs/_style/prism-master/tests/languages/csharp/issue806.test new file mode 100644 index 00000000..f7a4096f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/issue806.test @@ -0,0 +1,12 @@ +0.3f + +---------------------------------------------------- + +[ + ["number", "0.3f"] +] + +---------------------------------------------------- + +Checks that "f" prefix is properly highlighted as part of the number. +See #806. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/keyword_feature.test b/docs/_style/prism-master/tests/languages/csharp/keyword_feature.test new file mode 100644 index 00000000..e1c37f0a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/keyword_feature.test @@ -0,0 +1,209 @@ +abstract +add +alias +as +ascending +async +await +base +bool +break +byte +case +catch +char +checked +class; +const +continue +decimal +default +delegate +descending +do +double +dynamic +else +enum +event +explicit +extern +false +finally +fixed +float +for +foreach +from +get +global +goto +group +if +implicit +in +int +interface; +internal +into +is +join +let +lock +long +namespace +new; +null +object +operator +orderby +out +override +params +partial +private +protected +public +readonly +ref +remove +return +sbyte +sealed +select +set +short +sizeof +stackalloc +static +string +struct +switch +this +throw +true +try +typeof +uint +ulong +unchecked +unsafe +ushort +using +value +var +virtual +void +volatile +where +while +yield + +---------------------------------------------------- + +[ + ["keyword", "abstract"], + ["keyword", "add"], + ["keyword", "alias"], + ["keyword", "as"], + ["keyword", "ascending"], + ["keyword", "async"], + ["keyword", "await"], + ["keyword", "base"], + ["keyword", "bool"], + ["keyword", "break"], + ["keyword", "byte"], + ["keyword", "case"], + ["keyword", "catch"], + ["keyword", "char"], + ["keyword", "checked"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "const"], + ["keyword", "continue"], + ["keyword", "decimal"], + ["keyword", "default"], + ["keyword", "delegate"], + ["keyword", "descending"], + ["keyword", "do"], + ["keyword", "double"], + ["keyword", "dynamic"], + ["keyword", "else"], + ["keyword", "enum"], + ["keyword", "event"], + ["keyword", "explicit"], + ["keyword", "extern"], + ["keyword", "false"], + ["keyword", "finally"], + ["keyword", "fixed"], + ["keyword", "float"], + ["keyword", "for"], + ["keyword", "foreach"], + ["keyword", "from"], + ["keyword", "get"], + ["keyword", "global"], + ["keyword", "goto"], + ["keyword", "group"], + ["keyword", "if"], + ["keyword", "implicit"], + ["keyword", "in"], + ["keyword", "int"], + ["keyword", "interface"], ["punctuation", ";"], + ["keyword", "internal"], + ["keyword", "into"], + ["keyword", "is"], + ["keyword", "join"], + ["keyword", "let"], + ["keyword", "lock"], + ["keyword", "long"], + ["keyword", "namespace"], + ["keyword", "new"], ["punctuation", ";"], + ["keyword", "null"], + ["keyword", "object"], + ["keyword", "operator"], + ["keyword", "orderby"], + ["keyword", "out"], + ["keyword", "override"], + ["keyword", "params"], + ["keyword", "partial"], + ["keyword", "private"], + ["keyword", "protected"], + ["keyword", "public"], + ["keyword", "readonly"], + ["keyword", "ref"], + ["keyword", "remove"], + ["keyword", "return"], + ["keyword", "sbyte"], + ["keyword", "sealed"], + ["keyword", "select"], + ["keyword", "set"], + ["keyword", "short"], + ["keyword", "sizeof"], + ["keyword", "stackalloc"], + ["keyword", "static"], + ["keyword", "string"], + ["keyword", "struct"], + ["keyword", "switch"], + ["keyword", "this"], + ["keyword", "throw"], + ["keyword", "true"], + ["keyword", "try"], + ["keyword", "typeof"], + ["keyword", "uint"], + ["keyword", "ulong"], + ["keyword", "unchecked"], + ["keyword", "unsafe"], + ["keyword", "ushort"], + ["keyword", "using"], + ["keyword", "value"], + ["keyword", "var"], + ["keyword", "virtual"], + ["keyword", "void"], + ["keyword", "volatile"], + ["keyword", "where"], + ["keyword", "while"], + ["keyword", "yield"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/number_feature.test b/docs/_style/prism-master/tests/languages/csharp/number_feature.test new file mode 100644 index 00000000..12680803 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/number_feature.test @@ -0,0 +1,17 @@ +42 +3.14159 +0xbabe +0XBABE + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "0xbabe"], + ["number", "0XBABE"] +] + +---------------------------------------------------- + +Checks for decimal and hexadecimal numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/operator_feature.test b/docs/_style/prism-master/tests/languages/csharp/operator_feature.test new file mode 100644 index 00000000..4749c38c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/operator_feature.test @@ -0,0 +1,60 @@ ++ - * / % -- ++ +>> << +~ & | ^ ++= -= *= /= %= >>= <<= &= |= ^= +! && || +-> => += == != < > <= >= +?? + +---------------------------------------------------- + +[ + ["operator", "+"], + ["operator", "-"], + ["operator", "*"], + ["operator", "/"], + ["operator", "%"], + ["operator", "--"], + ["operator", "++"], + + ["operator", ">>"], + ["operator", "<<"], + + ["operator", "~"], + ["operator", "&"], + ["operator", "|"], + ["operator", "^"], + + ["operator", "+="], + ["operator", "-="], + ["operator", "*="], + ["operator", "/="], + ["operator", "%="], + ["operator", ">>="], + ["operator", "<<="], + ["operator", "&="], + ["operator", "|="], + ["operator", "^="], + + ["operator", "!"], + ["operator", "&&"], + ["operator", "||"], + + ["operator", "->"], + ["operator", "=>"], + + ["operator", "="], + ["operator", "=="], + ["operator", "!="], + ["operator", "<"], + ["operator", ">"], + ["operator", "<="], + ["operator", ">="], + + ["operator", "??"] +] + +---------------------------------------------------- + +Checks for all operators. diff --git a/docs/_style/prism-master/tests/languages/csharp/preprocessor_feature.test b/docs/_style/prism-master/tests/languages/csharp/preprocessor_feature.test new file mode 100644 index 00000000..93ad4903 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/preprocessor_feature.test @@ -0,0 +1,35 @@ +#define DEBUG +#if DEBUG +#endif + +#elif +#else +#endregion +#error +#line +#pragma +#region +#undef +#warning + +---------------------------------------------------- + +[ + ["preprocessor", ["#", ["directive", "define"], " DEBUG"]], + ["preprocessor", ["#", ["directive", "if"], " DEBUG"]], + ["preprocessor", ["#", ["directive", "endif"]]], + + ["preprocessor", ["#", ["directive", "elif"]]], + ["preprocessor", ["#", ["directive", "else"]]], + ["preprocessor", ["#", ["directive", "endregion"]]], + ["preprocessor", ["#", ["directive", "error"]]], + ["preprocessor", ["#", ["directive", "line"]]], + ["preprocessor", ["#", ["directive", "pragma"]]], + ["preprocessor", ["#", ["directive", "region"]]], + ["preprocessor", ["#", ["directive", "undef"]]], + ["preprocessor", ["#", ["directive", "warning"]]] +] + +---------------------------------------------------- + +Checks for preprocessor directives. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csharp/punctuation_feature.test b/docs/_style/prism-master/tests/languages/csharp/punctuation_feature.test new file mode 100644 index 00000000..b9a7bf14 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/punctuation_feature.test @@ -0,0 +1,27 @@ +. , ; : :: +? ?. +[ ] { } ( ) + +---------------------------------------------------- + +[ + ["punctuation", "."], + ["punctuation", ","], + ["punctuation", ";"], + ["punctuation", ":"], + ["punctuation", "::"], + + ["punctuation", "?"], + ["punctuation", "?."], + + ["punctuation", "["], + ["punctuation", "]"], + ["punctuation", "{"], + ["punctuation", "}"], + ["punctuation", "("], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for punctuation. diff --git a/docs/_style/prism-master/tests/languages/csharp/string_feature.test b/docs/_style/prism-master/tests/languages/csharp/string_feature.test new file mode 100644 index 00000000..2814cb56 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csharp/string_feature.test @@ -0,0 +1,32 @@ +"" +"fo\"o" + +@"" +@"foo" +@"fo""o" +@"foo +bar" + +'a' +'\'' +'\\' + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"fo\\\"o\""], + + ["string", "@\"\""], + ["string", "@\"foo\""], + ["string", "@\"fo\"\"o\""], + ["string", "@\"foo\r\nbar\""], + ["string", "'a'"], + ["string", "'\\''"], + ["string", "'\\\\'"] +] + +---------------------------------------------------- + +Checks for normal and verbatim strings. +Also checks for single quoted characters. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/csp/directive_no_value_feature.test b/docs/_style/prism-master/tests/languages/csp/directive_no_value_feature.test new file mode 100644 index 00000000..5ae927df --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csp/directive_no_value_feature.test @@ -0,0 +1,11 @@ +upgrade-insecure-requests; + +---------------------------------------------------- + +[ + ["directive", "upgrade-insecure-requests;"] +] + +---------------------------------------------------- + +Checks for a "void" CSP directive followed by semicolon. diff --git a/docs/_style/prism-master/tests/languages/csp/directive_with_source_expression_feature.test b/docs/_style/prism-master/tests/languages/csp/directive_with_source_expression_feature.test new file mode 100644 index 00000000..fc059f42 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csp/directive_with_source_expression_feature.test @@ -0,0 +1,12 @@ +script-src example.com; + +---------------------------------------------------- + +[ + ["directive", "script-src "], + "example.com;" +] + +---------------------------------------------------- + +Checks for CSP directive followed by a source expression. diff --git a/docs/_style/prism-master/tests/languages/csp/safe_feature.test b/docs/_style/prism-master/tests/languages/csp/safe_feature.test new file mode 100644 index 00000000..af31d1ac --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csp/safe_feature.test @@ -0,0 +1,19 @@ +default-src 'none'; style-src 'self' 'strict-dynamic' 'nonce-yeah' 'sha256-EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4='; + +---------------------------------------------------- + +[ + ["directive", "default-src "], + ["safe", "'none'"], + "; ", + ["directive", "style-src "], + ["safe", "'self'"], + ["safe", "'strict-dynamic'"], + ["safe", "'nonce-yeah'"], + ["safe", "'sha256-EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4='"], + ";" +] + +---------------------------------------------------- + +Checks for source expressions classified as safe. diff --git a/docs/_style/prism-master/tests/languages/csp/unsafe_feature.test b/docs/_style/prism-master/tests/languages/csp/unsafe_feature.test new file mode 100644 index 00000000..1fe7e478 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/csp/unsafe_feature.test @@ -0,0 +1,15 @@ +script-src 'unsafe-inline' 'unsafe-eval' 'unsafe-hashed-attributes'; + +---------------------------------------------------- + +[ + ["directive", "script-src "], + ["unsafe", "'unsafe-inline'"], + ["unsafe", "'unsafe-eval'"], + ["unsafe", "'unsafe-hashed-attributes'"], + ";" +] + +---------------------------------------------------- + +Checks for source expressions classified as unsafe. diff --git a/docs/_style/prism-master/tests/languages/css!+css-extras/entity_feature.test b/docs/_style/prism-master/tests/languages/css!+css-extras/entity_feature.test new file mode 100644 index 00000000..c1c91a29 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css!+css-extras/entity_feature.test @@ -0,0 +1,13 @@ +\0022 +\20B9 + +---------------------------------------------------- + +[ + ["entity", "\\0022"], + ["entity", "\\20B9"] +] + +---------------------------------------------------- + +Checks for entities. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css!+css-extras/hexcode_feature.test b/docs/_style/prism-master/tests/languages/css!+css-extras/hexcode_feature.test new file mode 100644 index 00000000..cac0b44b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css!+css-extras/hexcode_feature.test @@ -0,0 +1,17 @@ +#ff0000 +#BADA55 +#4dd +#D0C + +---------------------------------------------------- + +[ + ["hexcode", "#ff0000"], + ["hexcode", "#BADA55"], + ["hexcode", "#4dd"], + ["hexcode", "#D0C"] +] + +---------------------------------------------------- + +Checks for hexadecimal colors. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css!+css-extras/number_feature.test b/docs/_style/prism-master/tests/languages/css!+css-extras/number_feature.test new file mode 100644 index 00000000..ef58e620 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css!+css-extras/number_feature.test @@ -0,0 +1,17 @@ +42 +3.14159 +-42 +-3.14 + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "-42"], + ["number", "-3.14"] +] + +---------------------------------------------------- + +Checks for numbers. diff --git a/docs/_style/prism-master/tests/languages/css!+css-extras/operator_feature.test b/docs/_style/prism-master/tests/languages/css!+css-extras/operator_feature.test new file mode 100644 index 00000000..0df7612b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css!+css-extras/operator_feature.test @@ -0,0 +1,71 @@ +width: calc(100% + 20px); +width: calc(100% - 20px); +width: calc(5px * 2); +width: calc(10px / 2); +height: -20px; +content: 'this - is not an operator'; + +---------------------------------------------------- + +[ + ["property", "width"], + ["punctuation", ":"], + ["function", "calc"], + ["punctuation", "("], + ["number", "100"], + ["unit", "%"], + ["operator", "+"], + ["number", "20"], + ["unit", "px"], + ["punctuation", ")"], + ["punctuation", ";"], + + ["property", "width"], + ["punctuation", ":"], + ["function", "calc"], + ["punctuation", "("], + ["number", "100"], + ["unit", "%"], + ["operator", "-"], + ["number", "20"], + ["unit", "px"], + ["punctuation", ")"], + ["punctuation", ";"], + + ["property", "width"], + ["punctuation", ":"], + ["function", "calc"], + ["punctuation", "("], + ["number", "5"], + ["unit", "px"], + ["operator", "*"], + ["number", "2"], + ["punctuation", ")"], + ["punctuation", ";"], + + ["property", "width"], + ["punctuation", ":"], + ["function", "calc"], + ["punctuation", "("], + ["number", "10"], + ["unit", "px"], + ["operator", "/"], + ["number", "2"], + ["punctuation", ")"], + ["punctuation", ";"], + + ["property", "height"], + ["punctuation", ":"], + ["number", "-20"], + ["unit", "px"], + ["punctuation", ";"], + + ["property", "content"], + ["punctuation", ":"], + ["string", "'this - is not an operator'"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for operators. diff --git a/docs/_style/prism-master/tests/languages/css!+css-extras/selector_feature.test b/docs/_style/prism-master/tests/languages/css!+css-extras/selector_feature.test new file mode 100644 index 00000000..3931a663 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css!+css-extras/selector_feature.test @@ -0,0 +1,58 @@ +foo:after { +foo::first-letter { + +foo:nth-child(2n+1) { + +foo.bar { + +foo#bar { + +#foo > .bar:not(baz):after { + +div[foo="bar"] { + +---------------------------------------------------- + +[ + ["selector", [ + "foo", + ["pseudo-element", ":after"] + ]], ["punctuation", "{"], + + ["selector", [ + "foo", + ["pseudo-element", "::first-letter"] + ]], ["punctuation", "{"], + + ["selector", [ + "foo", + ["pseudo-class", ":nth-child(2n+1)"] + ]], ["punctuation", "{"], + + ["selector", [ + "foo", + ["class", ".bar"] + ]], ["punctuation", "{"], + + ["selector", [ + "foo", + ["id", "#bar"] + ]], ["punctuation", "{"], + + ["selector", [ + ["id", "#foo"], + " > ", + ["class", ".bar"], + ["pseudo-class", ":not(baz)"], + ["pseudo-element", ":after"] + ]], ["punctuation", "{"], + + ["selector", [ + "div", + ["attribute", "[foo=\"bar\"]"] + ]], ["punctuation", "{"] +] + +---------------------------------------------------- + +Checks for pseudo-elements, pseudo-classes, classes and ids inside selectors. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css!+css-extras/unit_feature.test b/docs/_style/prism-master/tests/languages/css!+css-extras/unit_feature.test new file mode 100644 index 00000000..6d5c15c8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css!+css-extras/unit_feature.test @@ -0,0 +1,21 @@ +100% +1rem +500ms +.5s +-3px +-0.618vw + +---------------------------------------------------- + +[ + ["number", "100"], ["unit", "%"], + ["number", "1"], ["unit", "rem"], + ["number", "500"], ["unit", "ms"], + ["number", ".5"], ["unit", "s"], + ["number", "-3"], ["unit", "px"], + ["number", "-0.618"], ["unit", "vw"] +] + +---------------------------------------------------- + +Checks for units. diff --git a/docs/_style/prism-master/tests/languages/css!+css-extras/variable_feature.test b/docs/_style/prism-master/tests/languages/css!+css-extras/variable_feature.test new file mode 100644 index 00000000..dc089b5f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css!+css-extras/variable_feature.test @@ -0,0 +1,54 @@ +element { + --foo: green; +} + +var(--color-primary) +var(--level-3) +var(--foo, red) +calc(100% - var(--margin-size) * 2) + +---------------------------------------------------- + +[ + ["selector", ["element"]], + ["punctuation", "{"], + ["variable", "--foo"], + ["punctuation", ":"], + " green", + ["punctuation", ";"], + ["punctuation", "}"], + + ["function", "var"], + ["punctuation", "("], + ["variable", "--color-primary"], + ["punctuation", ")"], + + ["function", "var"], + ["punctuation", "("], + ["variable", "--level-3"], + ["punctuation", ")"], + + ["function", "var"], + ["punctuation", "("], + ["variable", "--foo"], + ["punctuation", ","], + " red", + ["punctuation", ")"], + + ["function", "calc"], + ["punctuation", "("], + ["number", "100"], + ["unit", "%"], + ["operator", "-"], + ["function", "var"], + ["punctuation", "("], + ["variable", "--margin-size"], + ["punctuation", ")"], + ["operator", "*"], + ["number", "2"], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for variables. diff --git a/docs/_style/prism-master/tests/languages/css+haml/css+haml_usage.test b/docs/_style/prism-master/tests/languages/css+haml/css+haml_usage.test new file mode 100644 index 00000000..c90047f2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css+haml/css+haml_usage.test @@ -0,0 +1,28 @@ +:css + .test {} + +~ + :css + .test {} + +---------------------------------------------------- + +[ + ["filter-css", [ + ["filter-name", ":css"], + ["selector", ".test"], + ["punctuation", "{"], + ["punctuation", "}"] + ]], + ["punctuation", "~"], + ["filter-css", [ + ["filter-name", ":css"], + ["selector", ".test"], + ["punctuation", "{"], + ["punctuation", "}"] + ]] +] + +---------------------------------------------------- + +Checks for CSS filter in Haml. The tilde serves only as a separator. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css+http/css_inclusion.test b/docs/_style/prism-master/tests/languages/css+http/css_inclusion.test new file mode 100644 index 00000000..f805d6d4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css+http/css_inclusion.test @@ -0,0 +1,25 @@ +Content-type: text/css + +a.link:hover { + color: red; +} + +---------------------------------------------------- + +[ + ["header-name", "Content-type:"], + " text/css", + ["text/css", [ + ["selector", "a.link:hover"], + ["punctuation", "{"], + ["property", "color"], + ["punctuation", ":"], + " red", + ["punctuation", ";"], + ["punctuation", "}"] + ]] +] + +---------------------------------------------------- + +Checks for JavaScript content in HTTP. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css+textile/css_inclusion.test b/docs/_style/prism-master/tests/languages/css+textile/css_inclusion.test new file mode 100644 index 00000000..8b6f6052 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css+textile/css_inclusion.test @@ -0,0 +1,117 @@ +h3{color: red}. Baz + +h4[fr]{text-decoration:underline;}(#bar). Foobar + +*{color:red}bold* +"(foo)[en]{color:blue;}Foo":bar + +#[fr](#foo){background:pink} Foobar + +!(foo)[en]{border:1px solid #ccc}foo.png! + +{color: blue}.|{font-weight:bold}.Baz| +(foo#bar){font-style:italic}[fr].|{background:red;}(bar#baz)[en].Baz| + +---------------------------------------------------- + +[ + ["phrase", [ + ["block-tag", [ + ["tag", "h3"], + ["modifier", [ + ["css", [["punctuation", "{"], ["property", "color"], ["punctuation", ":"], " red", ["punctuation", "}"]]] + ]], + ["punctuation", "."] + ]], + " Baz" + ]], + ["phrase", [ + ["block-tag", [ + ["tag", "h4"], + ["modifier", [ + ["punctuation", "["], ["lang", "fr"], ["punctuation", "]"], + ["css", [["punctuation", "{"], ["property", "text-decoration"], ["punctuation", ":"], "underline", ["punctuation", ";"], ["punctuation", "}"]]], + ["punctuation", "("], ["class-id", "#bar"], ["punctuation", ")"] + ]], + ["punctuation", "."] + ]], + " Foobar" + ]], + + ["phrase", [ + ["inline", [ + ["punctuation", "*"], + ["modifier", [ + ["css", [["punctuation", "{"], ["property", "color"], ["punctuation", ":"], "red", ["punctuation", "}"]]] + ]], + ["bold", ["bold"]], + ["punctuation", "*"] + ]], + ["link", [ + ["punctuation", "\""], + ["modifier", [ + ["punctuation", "("], ["class-id", "foo"], ["punctuation", ")"], + ["punctuation", "["], ["lang", "en"], ["punctuation", "]"], + ["css", [["punctuation", "{"], ["property", "color"], ["punctuation", ":"], "blue", ["punctuation", ";"], ["punctuation", "}"]]] + ]], + ["text", "Foo"], + ["punctuation", "\""], ["punctuation", ":"], + ["url", "bar"] + ]] + ]], + + ["phrase", [ + ["list", [ + ["punctuation", "#"], + ["modifier", [ + ["punctuation", "["], ["lang", "fr"], ["punctuation", "]"], + ["punctuation", "("], ["class-id", "#foo"], ["punctuation", ")"], + ["css", [["punctuation", "{"], ["property", "background"], ["punctuation", ":"], "pink", ["punctuation", "}"]]] + ]], + " Foobar" + ]] + ]], + + ["phrase", [ + ["image", [ + ["punctuation", "!"], + ["modifier", [ + ["punctuation", "("], ["class-id", "foo"], ["punctuation", ")"], + ["punctuation", "["], ["lang", "en"], ["punctuation", "]"], + ["css", [["punctuation", "{"], ["property", "border"], ["punctuation", ":"], "1px solid #ccc", ["punctuation", "}"]]] + ]], + ["source", "foo.png"], + ["punctuation", "!"] + ]] + ]], + + ["phrase", [ + ["table", [ + ["modifier", [ + ["css", [["punctuation", "{"], ["property", "color"], ["punctuation", ":"], " blue", ["punctuation", "}"]]] + ]], + ["punctuation", "."], ["punctuation", "|"], + ["modifier", [ + ["css", [["punctuation", "{"], ["property", "font-weight"], ["punctuation", ":"], "bold", ["punctuation", "}"]]] + ]], + ["punctuation", "."], "Baz", ["punctuation", "|"], + + ["modifier", [ + ["punctuation", "("], ["class-id", "foo#bar"], ["punctuation", ")"], + ["css", [["punctuation", "{"], ["property", "font-style"], ["punctuation", ":"], "italic", ["punctuation", "}"]]], + ["punctuation", "["], ["lang", "fr"], ["punctuation", "]"] + ]], + ["punctuation", "."], ["punctuation", "|"], + ["modifier", [ + ["css", [["punctuation", "{"], ["property", "background"], ["punctuation", ":"], "red", ["punctuation", ";"], ["punctuation", "}"]]], + ["punctuation", "("], ["class-id", "bar#baz"], ["punctuation", ")"], + ["punctuation", "["], ["lang", "en"], ["punctuation", "]"] + ]], + ["punctuation", "."], "Baz", ["punctuation", "|"] + ]] + ]] +] + +---------------------------------------------------- + +Checks for CSS modifier. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css/atrule_feature.test b/docs/_style/prism-master/tests/languages/css/atrule_feature.test new file mode 100644 index 00000000..abc75def --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css/atrule_feature.test @@ -0,0 +1,47 @@ +@import url(foo.css); +@media print {} +@media (min-width: 640px) and (min-height: 1000px) {} +@main-color: red; + +---------------------------------------------------- + +[ + ["atrule", [ + ["rule", "@import"], + ["url", "url(foo.css)"], + ["punctuation", ";"] + ]], + ["atrule", [ + ["rule", "@media"], + " print" + ]], + ["punctuation", "{"], + ["punctuation", "}"], + ["atrule", [ + ["rule", "@media"], + ["punctuation", "("], + ["property", "min-width"], + ["punctuation", ":"], + " 640px", + ["punctuation", ")"], + " and ", + ["punctuation", "("], + ["property", "min-height"], + ["punctuation", ":"], + " 1000px", + ["punctuation", ")"] + ]], + ["punctuation", "{"], + ["punctuation", "}"], + ["atrule", [ + ["rule", "@main-color"], + ["punctuation", ":"], + " red", + ["punctuation", ";"] + ]] +] + +---------------------------------------------------- + +Checks for at-rules. +Also checks for LESS variables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css/comment_feature.test b/docs/_style/prism-master/tests/languages/css/comment_feature.test new file mode 100644 index 00000000..a3899edd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css/comment_feature.test @@ -0,0 +1,16 @@ +/**/ +/* foo */ +/* foo +bar */ + +---------------------------------------------------- + +[ + ["comment", "/**/"], + ["comment", "/* foo */"], + ["comment", "/* foo\r\nbar */"] +] + +---------------------------------------------------- + +Checks for empty comment, single-line comment and multi-line comment. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css/function_feature.test b/docs/_style/prism-master/tests/languages/css/function_feature.test new file mode 100644 index 00000000..0af02a0c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css/function_feature.test @@ -0,0 +1,41 @@ +transform: translate(-50%); +background: rgba(0, 0, 0, 0.2); +filter: opacity(alpha=0); + +---------------------------------------------------- + +[ + ["property", "transform"], + ["punctuation", ":"], + ["function", "translate"], + ["punctuation", "("], + "-50%", + ["punctuation", ")"], + ["punctuation", ";"], + + ["property", "background"], + ["punctuation", ":"], + ["function", "rgba"], + ["punctuation", "("], + "0", + ["punctuation", ","], + " 0", + ["punctuation", ","], + " 0", + ["punctuation", ","], + " 0.2", + ["punctuation", ")"], + ["punctuation", ";"], + + ["property", "filter"], + ["punctuation", ":"], + ["function", "opacity"], + ["punctuation", "("], + "alpha=0", + ["punctuation", ")"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css/important_feature.test b/docs/_style/prism-master/tests/languages/css/important_feature.test new file mode 100644 index 00000000..0f5c1409 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css/important_feature.test @@ -0,0 +1,27 @@ +color: red !important; +padding: 10px 20px 30px !important; +position:absolute!important; + +---------------------------------------------------- + +[ + ["property", "color"], + ["punctuation", ":"], + " red ", + ["important", "!important"], + ["punctuation", ";"], + ["property", "padding"], + ["punctuation", ":"], + " 10px 20px 30px ", + ["important", "!important"], + ["punctuation", ";"], + ["property", "position"], + ["punctuation", ":"], + "absolute", + ["important", "!important"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for !important rule. diff --git a/docs/_style/prism-master/tests/languages/css/property_feature.test b/docs/_style/prism-master/tests/languages/css/property_feature.test new file mode 100644 index 00000000..d01e2d1d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css/property_feature.test @@ -0,0 +1,29 @@ +color: red; +background-color: blue; +-webkit-transform: none; +--ötökkä: 2; + +---------------------------------------------------- + +[ + ["property", "color"], + ["punctuation", ":"], + " red", + ["punctuation", ";"], + ["property", "background-color"], + ["punctuation", ":"], + " blue", + ["punctuation", ";"], + ["property", "-webkit-transform"], + ["punctuation", ":"], + " none", + ["punctuation", ";"], + ["property", "--ötökkä"], + ["punctuation", ":"], + " 2", + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for properties. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css/selector_feature.test b/docs/_style/prism-master/tests/languages/css/selector_feature.test new file mode 100644 index 00000000..5a597201 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css/selector_feature.test @@ -0,0 +1,25 @@ +foo{ +foo + bar { +foo:first-child:hover { +* { +foo, +bar{ + +---------------------------------------------------- + +[ + ["selector", "foo"], + ["punctuation", "{"], + ["selector", "foo + bar"], + ["punctuation", "{"], + ["selector", "foo:first-child:hover"], + ["punctuation", "{"], + ["selector", "*"], + ["punctuation", "{"], + ["selector", "foo,\r\nbar"], + ["punctuation", "{"] +] + +---------------------------------------------------- + +Checks for single-line and multi-line selectors. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css/string_feature.test b/docs/_style/prism-master/tests/languages/css/string_feature.test new file mode 100644 index 00000000..c849d604 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css/string_feature.test @@ -0,0 +1,22 @@ +"f\"oo" +'f\'oo' +"foo\ +bar" +'foo\ +bar' +"foo /* bar" /* and out */ + +---------------------------------------------------- + +[ + ["string", "\"f\\\"oo\""], + ["string", "'f\\'oo'"], + ["string", "\"foo\\\r\nbar\""], + ["string", "'foo\\\r\nbar'"], + ["string", "\"foo /* bar\""], + ["comment", "/* and out */"] +] + +---------------------------------------------------- + +Checks for single-quoted and double-quoted strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/css/url_feature.test b/docs/_style/prism-master/tests/languages/css/url_feature.test new file mode 100644 index 00000000..05ce8f9f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/css/url_feature.test @@ -0,0 +1,21 @@ +url(foo.png) +url('foo.png') +url("foo.png") +url('foo\ +bar.png') +url("foo\ +bar.png") + +---------------------------------------------------- + +[ + ["url", "url(foo.png)"], + ["url", "url('foo.png')"], + ["url", "url(\"foo.png\")"], + ["url", "url('foo\\\r\nbar.png')"], + ["url", "url(\"foo\\\r\nbar.png\")"] +] + +---------------------------------------------------- + +Checks for url(), unquoted, single-quoted and double-quoted. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/d/comment_feature.test b/docs/_style/prism-master/tests/languages/d/comment_feature.test new file mode 100644 index 00000000..ed1f8603 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/d/comment_feature.test @@ -0,0 +1,27 @@ +#!/usr/bin/env rdmd + +/++/ +/+ foo +bar +/ +/+ foo + /+ + bar +/ +baz +/ +// This q{is} a comment +// This /* is a */ comment + +---------------------------------------------------- + +[ + ["comment", "#!/usr/bin/env rdmd"], + ["comment", "/++/"], + ["comment", "/+ foo\r\nbar +/"], + ["comment", "/+ foo\r\n\t/+\r\n\tbar +/\r\nbaz +/"], + ["comment", "// This q{is} a comment"], + ["comment", "// This /* is a */ comment"] +] + +---------------------------------------------------- + +Checks for shebang and nestable multi-line comments. +Other comments are tested in clike. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/d/keyword_feature.test b/docs/_style/prism-master/tests/languages/d/keyword_feature.test new file mode 100644 index 00000000..a5a03688 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/d/keyword_feature.test @@ -0,0 +1,251 @@ +$ +abstract +alias +align +asm +assert +auto +body +bool +break +byte +case +cast +catch +cdouble +cent +cfloat +char +class; +const +continue +creal +dchar +debug +default +delegate +delete +deprecated +do +double +else +enum +export +extern +false +final +finally +float +for +foreach +foreach_reverse +function +goto +idouble +if +ifloat +immutable +import +inout +int +interface; +invariant +ireal +lazy +long +macro +mixin +module +new; +nothrow +null +out +override +package +pragma +private +protected +public +pure +real +ref +return +scope +shared +short +static +struct +super +switch +synchronized +template +this +throw +true +try +typedef +typeid +typeof +ubyte +ucent +uint +ulong +union +unittest +ushort +version +void +volatile +wchar +while +with +__FILE__ +__MODULE__ +__LINE__ +__FUNCTION__ +__PRETTY_FUNCTION__ +__DATE__ +__EOF__ +__TIME__ +__TIMESTAMP__ +__VENDOR__ +__VERSION__ +__gshared +__traits +__vector +__parameters +string +wstring +dstring +size_t +ptrdiff_t + +---------------------------------------------------- + +[ + ["keyword", "$"], + ["keyword", "abstract"], + ["keyword", "alias"], + ["keyword", "align"], + ["keyword", "asm"], + ["keyword", "assert"], + ["keyword", "auto"], + ["keyword", "body"], + ["keyword", "bool"], + ["keyword", "break"], + ["keyword", "byte"], + ["keyword", "case"], + ["keyword", "cast"], + ["keyword", "catch"], + ["keyword", "cdouble"], + ["keyword", "cent"], + ["keyword", "cfloat"], + ["keyword", "char"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "const"], + ["keyword", "continue"], + ["keyword", "creal"], + ["keyword", "dchar"], + ["keyword", "debug"], + ["keyword", "default"], + ["keyword", "delegate"], + ["keyword", "delete"], + ["keyword", "deprecated"], + ["keyword", "do"], + ["keyword", "double"], + ["keyword", "else"], + ["keyword", "enum"], + ["keyword", "export"], + ["keyword", "extern"], + ["keyword", "false"], + ["keyword", "final"], + ["keyword", "finally"], + ["keyword", "float"], + ["keyword", "for"], + ["keyword", "foreach"], + ["keyword", "foreach_reverse"], + ["keyword", "function"], + ["keyword", "goto"], + ["keyword", "idouble"], + ["keyword", "if"], + ["keyword", "ifloat"], + ["keyword", "immutable"], + ["keyword", "import"], + ["keyword", "inout"], + ["keyword", "int"], + ["keyword", "interface"], ["punctuation", ";"], + ["keyword", "invariant"], + ["keyword", "ireal"], + ["keyword", "lazy"], + ["keyword", "long"], + ["keyword", "macro"], + ["keyword", "mixin"], + ["keyword", "module"], + ["keyword", "new"], ["punctuation", ";"], + ["keyword", "nothrow"], + ["keyword", "null"], + ["keyword", "out"], + ["keyword", "override"], + ["keyword", "package"], + ["keyword", "pragma"], + ["keyword", "private"], + ["keyword", "protected"], + ["keyword", "public"], + ["keyword", "pure"], + ["keyword", "real"], + ["keyword", "ref"], + ["keyword", "return"], + ["keyword", "scope"], + ["keyword", "shared"], + ["keyword", "short"], + ["keyword", "static"], + ["keyword", "struct"], + ["keyword", "super"], + ["keyword", "switch"], + ["keyword", "synchronized"], + ["keyword", "template"], + ["keyword", "this"], + ["keyword", "throw"], + ["keyword", "true"], + ["keyword", "try"], + ["keyword", "typedef"], + ["keyword", "typeid"], + ["keyword", "typeof"], + ["keyword", "ubyte"], + ["keyword", "ucent"], + ["keyword", "uint"], + ["keyword", "ulong"], + ["keyword", "union"], + ["keyword", "unittest"], + ["keyword", "ushort"], + ["keyword", "version"], + ["keyword", "void"], + ["keyword", "volatile"], + ["keyword", "wchar"], + ["keyword", "while"], + ["keyword", "with"], + ["keyword", "__FILE__"], + ["keyword", "__MODULE__"], + ["keyword", "__LINE__"], + ["keyword", "__FUNCTION__"], + ["keyword", "__PRETTY_FUNCTION__"], + ["keyword", "__DATE__"], + ["keyword", "__EOF__"], + ["keyword", "__TIME__"], + ["keyword", "__TIMESTAMP__"], + ["keyword", "__VENDOR__"], + ["keyword", "__VERSION__"], + ["keyword", "__gshared"], + ["keyword", "__traits"], + ["keyword", "__vector"], + ["keyword", "__parameters"], + ["keyword", "string"], + ["keyword", "wstring"], + ["keyword", "dstring"], + ["keyword", "size_t"], + ["keyword", "ptrdiff_t"] +] + +---------------------------------------------------- + +Checks for $, keywords, special tokens and globally defined symbols. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/d/number_feature.test b/docs/_style/prism-master/tests/languages/d/number_feature.test new file mode 100644 index 00000000..817bd7e3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/d/number_feature.test @@ -0,0 +1,55 @@ +42 +42_000 +42L +42U +42UL +3.14_15_9 +3.2e8 +0.4e-7 +62.14e+4 + +0xBAD_FACE +0xFFU +0xfaL +0x42UL +0x2.AFp4 +0xFp-3 +0xFBp+9 + +0b0000_1111 + +6.3i +6.3fi +6.3Li + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "42_000"], + ["number", "42L"], + ["number", "42U"], + ["number", "42UL"], + ["number", "3.14_15_9"], + ["number", "3.2e8"], + ["number", "0.4e-7"], + ["number", "62.14e+4"], + + ["number", "0xBAD_FACE"], + ["number", "0xFFU"], + ["number", "0xfaL"], + ["number", "0x42UL"], + ["number", "0x2.AFp4"], + ["number", "0xFp-3"], + ["number", "0xFBp+9"], + + ["number", "0b0000_1111"], + + ["number", "6.3i"], + ["number", "6.3fi"], + ["number", "6.3Li"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/d/operator_feature.test b/docs/_style/prism-master/tests/languages/d/operator_feature.test new file mode 100644 index 00000000..d7e291da --- /dev/null +++ b/docs/_style/prism-master/tests/languages/d/operator_feature.test @@ -0,0 +1,63 @@ +|| +&& +++ +-- +.. ... +=> +in is +!in !is +<< <<= +>> >>> >>= >>>= +^^ ^^= +<> !<> <>= !<>= +!< !<= +!> !>= ++ += +- -= +* *= +/ /= +% %= +& &= +| |= +^ ^= +~ ~= += == +! != +< <= +> >= + +---------------------------------------------------- + +[ + ["operator", "||"], + ["operator", "&&"], + ["operator", "++"], + ["operator", "--"], + ["operator", ".."], ["operator", "..."], + ["operator", "=>"], + ["operator", "in"], ["operator", "is"], + ["operator", "!in"], ["operator", "!is"], + ["operator", "<<"], ["operator", "<<="], + ["operator", ">>"], ["operator", ">>>"], ["operator", ">>="], ["operator", ">>>="], + ["operator", "^^"], ["operator", "^^="], + ["operator", "<>"], ["operator", "!<>"], ["operator", "<>="], ["operator", "!<>="], + ["operator", "!<"], ["operator", "!<="], + ["operator", "!>"], ["operator", "!>="], + ["operator", "+"], ["operator", "+="], + ["operator", "-"], ["operator", "-="], + ["operator", "*"], ["operator", "*="], + ["operator", "/"], ["operator", "/="], + ["operator", "%"], ["operator", "%="], + ["operator", "&"], ["operator", "&="], + ["operator", "|"], ["operator", "|="], + ["operator", "^"], ["operator", "^="], + ["operator", "~"], ["operator", "~="], + ["operator", "="], ["operator", "=="], + ["operator", "!"], ["operator", "!="], + ["operator", "<"], ["operator", "<="], + ["operator", ">"], ["operator", ">="] +] + +---------------------------------------------------- + +Checks for operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/d/property_feature.test b/docs/_style/prism-master/tests/languages/d/property_feature.test new file mode 100644 index 00000000..9e61b062 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/d/property_feature.test @@ -0,0 +1,17 @@ +@property int data() +@disable this(); + +---------------------------------------------------- + +[ + ["property", "@property"], + ["keyword", "int"], + ["function", "data"], ["punctuation", "("], ["punctuation", ")"], + ["property", "@disable"], + ["keyword", "this"], ["punctuation", "("], ["punctuation", ")"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Check for properties. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/d/register_feature.test b/docs/_style/prism-master/tests/languages/d/register_feature.test new file mode 100644 index 00000000..3eb57c67 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/d/register_feature.test @@ -0,0 +1,75 @@ +AL AH AX EAX +BL BH BX EBX +CL CH CX ECX +DL DH DX EDX +BP EBP +SP ESP +DI EDI +SI ESI +ES CS SS DS GS FS +CR0 CR2 CR3 CR4 +DR0 DR1 DR2 DR3 DR6 DR7 +TR3 TR4 TR5 TR6 TR7 +ST +ST(0) ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7) +MM0 MM1 MM2 MM3 MM4 MM5 MM6 MM7 +XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 + +RAX RBX RCX RDX +BPL RBP +SPL RSP +DIL RDI +SIL RSI +R8B R8W R8D R8 +R9B R9W R9D R9 +R10B R10W R10D R10 +R11B R11W R11D R11 +R12B R12W R12D R12 +R13B R13W R13D R13 +R14B R14W R14D R14 +R15B R15W R15D R15 +XMM8 XMM9 XMM10 XMM11 XMM12 XMM13 XMM14 XMM15 +YMM0 YMM1 YMM2 YMM3 YMM4 YMM5 YMM6 YMM7 +YMM8 YMM9 YMM10 YMM11 YMM12 YMM13 YMM14 YMM15 + +---------------------------------------------------- + +[ + ["register", "AL"], ["register", "AH"], ["register", "AX"], ["register", "EAX"], + ["register", "BL"], ["register", "BH"], ["register", "BX"], ["register", "EBX"], + ["register", "CL"], ["register", "CH"], ["register", "CX"], ["register", "ECX"], + ["register", "DL"], ["register", "DH"], ["register", "DX"], ["register", "EDX"], + ["register", "BP"], ["register", "EBP"], + ["register", "SP"], ["register", "ESP"], + ["register", "DI"], ["register", "EDI"], + ["register", "SI"], ["register", "ESI"], + ["register", "ES"], ["register", "CS"], ["register", "SS"], ["register", "DS"], ["register", "GS"], ["register", "FS"], + ["register", "CR0"], ["register", "CR2"], ["register", "CR3"], ["register", "CR4"], + ["register", "DR0"], ["register", "DR1"], ["register", "DR2"], ["register", "DR3"], ["register", "DR6"], ["register", "DR7"], + ["register", "TR3"], ["register", "TR4"], ["register", "TR5"], ["register", "TR6"], ["register", "TR7"], + ["register", "ST"], + ["register", "ST(0)"], ["register", "ST(1)"], ["register", "ST(2)"], ["register", "ST(3)"], ["register", "ST(4)"], ["register", "ST(5)"], ["register", "ST(6)"], ["register", "ST(7)"], + ["register", "MM0"], ["register", "MM1"], ["register", "MM2"], ["register", "MM3"], ["register", "MM4"], ["register", "MM5"], ["register", "MM6"], ["register", "MM7"], + ["register", "XMM0"], ["register", "XMM1"], ["register", "XMM2"], ["register", "XMM3"], ["register", "XMM4"], ["register", "XMM5"], ["register", "XMM6"], ["register", "XMM7"], + + ["register", "RAX"], ["register", "RBX"], ["register", "RCX"], ["register", "RDX"], + ["register", "BPL"], ["register", "RBP"], + ["register", "SPL"], ["register", "RSP"], + ["register", "DIL"], ["register", "RDI"], + ["register", "SIL"], ["register", "RSI"], + ["register", "R8B"], ["register", "R8W"], ["register", "R8D"], ["register", "R8"], + ["register", "R9B"], ["register", "R9W"], ["register", "R9D"], ["register", "R9"], + ["register", "R10B"], ["register", "R10W"], ["register", "R10D"], ["register", "R10"], + ["register", "R11B"], ["register", "R11W"], ["register", "R11D"], ["register", "R11"], + ["register", "R12B"], ["register", "R12W"], ["register", "R12D"], ["register", "R12"], + ["register", "R13B"], ["register", "R13W"], ["register", "R13D"], ["register", "R13"], + ["register", "R14B"], ["register", "R14W"], ["register", "R14D"], ["register", "R14"], + ["register", "R15B"], ["register", "R15W"], ["register", "R15D"], ["register", "R15"], + ["register", "XMM8"], ["register", "XMM9"], ["register", "XMM10"], ["register", "XMM11"], ["register", "XMM12"], ["register", "XMM13"], ["register", "XMM14"], ["register", "XMM15"], + ["register", "YMM0"], ["register", "YMM1"], ["register", "YMM2"], ["register", "YMM3"], ["register", "YMM4"], ["register", "YMM5"], ["register", "YMM6"], ["register", "YMM7"], + ["register", "YMM8"], ["register", "YMM9"], ["register", "YMM10"], ["register", "YMM11"], ["register", "YMM12"], ["register", "YMM13"], ["register", "YMM14"], ["register", "YMM15"] +] + +---------------------------------------------------- + +Checks for Iasm registers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/d/string_feature.test b/docs/_style/prism-master/tests/languages/d/string_feature.test new file mode 100644 index 00000000..fc501b11 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/d/string_feature.test @@ -0,0 +1,56 @@ +r"" x"" +r"fo\"o"c x"00 FBCD"w r"baz"d + +q"[fo"o +bar]" +q"(fo"o +bar)" +q"" +q"{fo"o +bar}" + +q"FOO +Bar "baz" +FOO" + +q"/fo"o +bar/" +q"|fo"o +bar|" + +'a' '\'' '\u000A' + +"" +"foo"c "bar"w "baz"d +"fo\"o +bar" +`foo` + +---------------------------------------------------- + +[ + ["string", "r\"\""], ["string", "x\"\""], + ["string", "r\"fo\\\"o\"c"], ["string", "x\"00 FBCD\"w"], ["string", "r\"baz\"d"], + + ["string", "q\"[fo\"o\r\nbar]\""], + ["string", "q\"(fo\"o\r\nbar)\""], + ["string", "q\"\""], + ["string", "q\"{fo\"o\r\nbar}\""], + + ["string", "q\"FOO\r\nBar \"baz\"\r\nFOO\""], + + ["string", "q\"/fo\"o\r\nbar/\""], + ["string", "q\"|fo\"o\r\nbar|\""], + + ["string", "'a'"], ["string", "'\\''"], ["string", "'\\u000A'"], + + ["string", "\"\""], + ["string", "\"foo\"c"], ["string", "\"bar\"w"], ["string", "\"baz\"d"], + ["string", "\"fo\\\"o\r\nbar\""], + ["string", "`foo`"] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/d/token-string_feature.test b/docs/_style/prism-master/tests/languages/d/token-string_feature.test new file mode 100644 index 00000000..01627c4a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/d/token-string_feature.test @@ -0,0 +1,13 @@ +q{foo} +q{ q{bar} } + +---------------------------------------------------- + +[ + ["token-string", "q{foo}"], + ["token-string", "q{ q{bar} }"] +] + +---------------------------------------------------- + +Checks for token strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/dart/keyword_feature.test b/docs/_style/prism-master/tests/languages/dart/keyword_feature.test new file mode 100644 index 00000000..a5e3c6c2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/dart/keyword_feature.test @@ -0,0 +1,49 @@ +async* sync* yield* +abstract assert async await +break case catch +class; +const +continue default deferred +do dynamic else enum +export external +extends; +factory final finally for +get if +implements; +import +in library +new; +null +operator part rethrow return +set static super switch this +throw try typedef var +void while with yield + +---------------------------------------------------- + +[ + ["keyword", "async*"], ["keyword", "sync*"], ["keyword", "yield*"], + ["keyword", "abstract"], ["keyword", "assert"], ["keyword", "async"], ["keyword", "await"], + ["keyword", "break"], ["keyword", "case"], ["keyword", "catch"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "const"], + ["keyword", "continue"], ["keyword", "default"], ["keyword", "deferred"], + ["keyword", "do"], ["keyword", "dynamic"], ["keyword", "else"], ["keyword", "enum"], + ["keyword", "export"], ["keyword", "external"], + ["keyword", "extends"], ["punctuation", ";"], + ["keyword", "factory"], ["keyword", "final"], ["keyword", "finally"], ["keyword", "for"], + ["keyword", "get"], ["keyword", "if"], + ["keyword", "implements"], ["punctuation", ";"], + ["keyword", "import"], + ["keyword", "in"], ["keyword", "library"], + ["keyword", "new"], ["punctuation", ";"], + ["keyword", "null"], + ["keyword", "operator"], ["keyword", "part"], ["keyword", "rethrow"], ["keyword", "return"], + ["keyword", "set"], ["keyword", "static"], ["keyword", "super"], ["keyword", "switch"], ["keyword", "this"], + ["keyword", "throw"], ["keyword", "try"], ["keyword", "typedef"], ["keyword", "var"], + ["keyword", "void"], ["keyword", "while"], ["keyword", "with"], ["keyword", "yield"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/dart/metadata_feature.test b/docs/_style/prism-master/tests/languages/dart/metadata_feature.test new file mode 100644 index 00000000..e88e7ba1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/dart/metadata_feature.test @@ -0,0 +1,20 @@ +@deprecated +@override +@todo('seth', 'make this do something') + +---------------------------------------------------- + +[ + ["metadata", "@deprecated"], + ["metadata", "@override"], + ["metadata", "@todo"], + ["punctuation", "("], + ["string", "'seth'"], + ["punctuation", ","], + ["string", "'make this do something'"], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for metadata. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/dart/operator_feature.test b/docs/_style/prism-master/tests/languages/dart/operator_feature.test new file mode 100644 index 00000000..5d631fd0 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/dart/operator_feature.test @@ -0,0 +1,33 @@ +++ -- +* / % ~/ ++ - ! ~ +<< >> ? +& ^ | +>= > <= < +as is is! +== != && || += *= /= ~/= +%= += -= +<<= >>= +&= ^= |= + +---------------------------------------------------- + +[ + ["operator", "++"], ["operator", "--"], + ["operator", "*"], ["operator", "/"], ["operator", "%"], ["operator", "~/"], + ["operator", "+"], ["operator", "-"], ["operator", "!"], ["operator", "~"], + ["operator", "<<"], ["operator", ">>"], ["operator", "?"], + ["operator", "&"], ["operator", "^"], ["operator", "|"], + ["operator", ">="], ["operator", ">"], ["operator", "<="], ["operator", "<"], + ["operator", "as"], ["operator", "is"], ["operator", "is!"], + ["operator", "=="], ["operator", "!="], ["operator", "&&"], ["operator", "||"], + ["operator", "="], ["operator", "*="], ["operator", "/="], ["operator", "~/="], + ["operator", "%="], ["operator", "+="], ["operator", "-="], + ["operator", "<<="], ["operator", ">>="], + ["operator", "&="], ["operator", "^="], ["operator", "|="] +] + +---------------------------------------------------- + +Checks for all operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/dart/string_feature.test b/docs/_style/prism-master/tests/languages/dart/string_feature.test new file mode 100644 index 00000000..feffdbce --- /dev/null +++ b/docs/_style/prism-master/tests/languages/dart/string_feature.test @@ -0,0 +1,25 @@ +"" '' +r"" r'' +"""""" '''''' +r"""""" r'''''' +"fo\"o" 'fo\'o' +"""foo +bar""" +'''foo +bar''' + +---------------------------------------------------- + +[ + ["string", "\"\""], ["string", "''"], + ["string", "r\"\""], ["string", "r''"], + ["string", "\"\"\"\"\"\""], ["string", "''''''"], + ["string", "r\"\"\"\"\"\""], ["string", "r''''''"], + ["string", "\"fo\\\"o\""], ["string", "'fo\\'o'"], + ["string", "\"\"\"foo\r\nbar\"\"\""], ["string", "'''foo\r\nbar'''"] +] + +---------------------------------------------------- + +Checks for single quoted and double quoted strings, +multi-line strings and "raw" strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/diff/coord_feature.test b/docs/_style/prism-master/tests/languages/diff/coord_feature.test new file mode 100644 index 00000000..c082693f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/diff/coord_feature.test @@ -0,0 +1,21 @@ +7c7 + +*** 4,8 **** +--- 4,8 ---- + +@@ -4,5 +4,5 @@ + +---------------------------------------------------- + +[ + ["coord", "7c7"], + + ["coord", "*** 4,8 ****"], + ["coord", "--- 4,8 ----"], + + ["coord", "@@ -4,5 +4,5 @@"] +] + +---------------------------------------------------- + +Checks for coords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/diff/diff_feature.test b/docs/_style/prism-master/tests/languages/diff/diff_feature.test new file mode 100644 index 00000000..0e534900 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/diff/diff_feature.test @@ -0,0 +1,21 @@ +! qt: core + +- qt: core ++ qt: core gui + +< qt: core +> qt: core quick + +---------------------------------------------------- + +[ + ["diff", "! qt: core"], + ["deleted", "- qt: core"], + ["inserted", "+ qt: core gui"], + ["deleted", "< qt: core"], + ["inserted", "> qt: core quick"] +] + +---------------------------------------------------- + +Checks for deleted, inserted and different lines. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/django/comment_feature.test b/docs/_style/prism-master/tests/languages/django/comment_feature.test new file mode 100644 index 00000000..d41c4489 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/django/comment_feature.test @@ -0,0 +1,16 @@ +{##} +{# This a Django template example #} +{# Multi-line +comment #} + +---------------------------------------------------- + +[ + ["comment", "{##}"], + ["comment", "{# This a Django template example #}"], + ["comment", "{# Multi-line\r\ncomment #}"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/django/property_feature.test b/docs/_style/prism-master/tests/languages/django/property_feature.test new file mode 100644 index 00000000..adbe3c4b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/django/property_feature.test @@ -0,0 +1,64 @@ +{% extends "base_generic.html" %} +{% block body %} + +{{ story.headline|upper }} + +{% endblock %} + +---------------------------------------------------- + +[ + ["property", [ + "{% ", + ["keyword", "extends"], + ["string", "\"base_generic.html\""], + " %}" + ]], + ["property", [ + "{% ", + ["keyword", "block"], + ["variable", "body"], + " %}" + ]], + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "a" + ]], + ["attr-name", ["href=\""]], + ["property", [ + "{{ ", + ["variable", "story"], + ["punctuation", "."], + ["variable", "get_absolute_url"], + " }}" + ]], + ["attr-name", ["\""]], + ["punctuation", ">"] + ]], + ["property", [ + "{{ ", + ["variable", "story"], + ["punctuation", "."], + ["variable", "headline"], + ["keyword", "|"], + ["function", "upper"], + " }}" + ]], + ["tag", [ + ["tag", [ + ["punctuation", ""] + ]], + ["property", [ + "{% ", + ["keyword", "endblock"], + " %}" + ]] +] + +---------------------------------------------------- + +Checks for properties. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/docker/comment_feature.test b/docs/_style/prism-master/tests/languages/docker/comment_feature.test new file mode 100644 index 00000000..054d6023 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/docker/comment_feature.test @@ -0,0 +1,13 @@ +# +# foobar + +---------------------------------------------------- + +[ + ["comment", "#"], + ["comment", "# foobar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/docker/keyword_feature.test b/docs/_style/prism-master/tests/languages/docker/keyword_feature.test new file mode 100644 index 00000000..a36a7e00 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/docker/keyword_feature.test @@ -0,0 +1,45 @@ +ONBUILD ADD . /app/src +FROM ubuntu +MAINTAINER SvenDowideit@home.org.au +RUN cd /tmp +EXPOSE 5900 +ENV myName John Doe +COPY hom* /mydir/ +VOLUME /myvol +USER daemon +WORKDIR /a +HEALTHCHECK CMD echo "foo" +LABEL version="1.0" +ENTRYPOINT ["top", "-b"] +ARG user1 +SHELL ["powershell", "-command"] +STOPSIGNAL signal + +---------------------------------------------------- + +[ + ["keyword", "ONBUILD"], ["keyword", "ADD"], " . /app/src\r\n", + ["keyword", "FROM"], " ubuntu\r\n", + ["keyword", "MAINTAINER"], " SvenDowideit@home.org.au\r\n", + ["keyword", "RUN"], " cd /tmp\r\n", + ["keyword", "EXPOSE"], " 5900\r\n", + ["keyword", "ENV"], " myName John Doe\r\n", + ["keyword", "COPY"], " hom* /mydir/\r\n", + ["keyword", "VOLUME"], " /myvol\r\n", + ["keyword", "USER"], " daemon\r\n", + ["keyword", "WORKDIR"], " /a\r\n", + ["keyword", "HEALTHCHECK"], ["keyword", "CMD"], " echo ", ["string", "\"foo\""], + ["keyword", "LABEL"], " version=", ["string", "\"1.0\""], + ["keyword", "ENTRYPOINT"], + ["punctuation", "["], ["string", "\"top\""], ["punctuation", ","], + ["string", "\"-b\""], ["punctuation", "]"], + ["keyword", "ARG"], " user1\r\n", + ["keyword", "SHELL"], + ["punctuation", "["], ["string", "\"powershell\""], ["punctuation", ","], + ["string", "\"-command\""], ["punctuation", "]"], + ["keyword", "STOPSIGNAL"], " signal" +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/docker/string_feature.test b/docs/_style/prism-master/tests/languages/docker/string_feature.test new file mode 100644 index 00000000..e131f021 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/docker/string_feature.test @@ -0,0 +1,23 @@ +"" +"fo\"obar" +"foo\ +bar" +'' +'fo\'obar' +'foo\ +bar' + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"fo\\\"obar\""], + ["string", "\"foo\\\r\nbar\""], + ["string", "''"], + ["string", "'fo\\'obar'"], + ["string", "'foo\\\r\nbar'"] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/eiffel/boolean_feature.test b/docs/_style/prism-master/tests/languages/eiffel/boolean_feature.test new file mode 100644 index 00000000..5750be06 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/eiffel/boolean_feature.test @@ -0,0 +1,13 @@ +True +False + +---------------------------------------------------- + +[ + ["boolean", "True"], + ["boolean", "False"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/eiffel/char_feature.test b/docs/_style/prism-master/tests/languages/eiffel/char_feature.test new file mode 100644 index 00000000..6a9b1248 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/eiffel/char_feature.test @@ -0,0 +1,15 @@ +'a' +'%'' +'%/123/' + +---------------------------------------------------- + +[ + ["char", "'a'"], + ["char", "'%''"], + ["char", "'%/123/'"] +] + +---------------------------------------------------- + +Checks for chars. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/eiffel/class-name_feature.test b/docs/_style/prism-master/tests/languages/eiffel/class-name_feature.test new file mode 100644 index 00000000..a7e15a6b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/eiffel/class-name_feature.test @@ -0,0 +1,15 @@ +A +FOO +B4D_F4C3 + +---------------------------------------------------- + +[ + ["class-name", "A"], + ["class-name", "FOO"], + ["class-name", "B4D_F4C3"] +] + +---------------------------------------------------- + +Checks for class names. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/eiffel/comment_feature.test b/docs/_style/prism-master/tests/languages/eiffel/comment_feature.test new file mode 100644 index 00000000..8a6b93e3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/eiffel/comment_feature.test @@ -0,0 +1,15 @@ +-- +-- foo bar +-- "foo" bar + +---------------------------------------------------- + +[ + ["comment", "--"], + ["comment", "-- foo bar"], + ["comment", "-- \"foo\" bar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/eiffel/keyword_feature.test b/docs/_style/prism-master/tests/languages/eiffel/keyword_feature.test new file mode 100644 index 00000000..cb6ae298 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/eiffel/keyword_feature.test @@ -0,0 +1,39 @@ +across agent alias all and +attached as assign attribute +check class convert create +Current debug deferred detachable +do else elseif end ensure +expanded export external +feature from frozen if +implies inherit inspect +invariant like local loop +not note obsolete old +once or Precursor redefine +rename require rescue Result +retry select separate some +then undefine until variant +Void when xor + +---------------------------------------------------- + +[ + ["keyword", "across"], ["keyword", "agent"], ["keyword", "alias"], ["keyword", "all"], ["keyword", "and"], + ["keyword", "attached"], ["keyword", "as"], ["keyword", "assign"], ["keyword", "attribute"], + ["keyword", "check"], ["keyword", "class"], ["keyword", "convert"], ["keyword", "create"], + ["keyword", "Current"], ["keyword", "debug"], ["keyword", "deferred"], ["keyword", "detachable"], + ["keyword", "do"], ["keyword", "else"], ["keyword", "elseif"], ["keyword", "end"], ["keyword", "ensure"], + ["keyword", "expanded"], ["keyword", "export"], ["keyword", "external"], + ["keyword", "feature"], ["keyword", "from"], ["keyword", "frozen"], ["keyword", "if"], + ["keyword", "implies"], ["keyword", "inherit"], ["keyword", "inspect"], + ["keyword", "invariant"], ["keyword", "like"], ["keyword", "local"], ["keyword", "loop"], + ["keyword", "not"], ["keyword", "note"], ["keyword", "obsolete"], ["keyword", "old"], + ["keyword", "once"], ["keyword", "or"], ["keyword", "Precursor"], ["keyword", "redefine"], + ["keyword", "rename"], ["keyword", "require"], ["keyword", "rescue"], ["keyword", "Result"], + ["keyword", "retry"], ["keyword", "select"], ["keyword", "separate"], ["keyword", "some"], + ["keyword", "then"], ["keyword", "undefine"], ["keyword", "until"], ["keyword", "variant"], + ["keyword", "Void"], ["keyword", "when"], ["keyword", "xor"] +] + +---------------------------------------------------- + +Checks for all keywords \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/eiffel/number_feature.test b/docs/_style/prism-master/tests/languages/eiffel/number_feature.test new file mode 100644 index 00000000..beb3cc7c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/eiffel/number_feature.test @@ -0,0 +1,29 @@ +0xbabe +0xBAD_A55 +0c7654_1234 +0b1111_0000_0101 +42 +42. +.42 +1_845.123_456 +3.14e+4 +4_2.5_7e-1_0 + +---------------------------------------------------- + +[ + ["number", "0xbabe"], + ["number", "0xBAD_A55"], + ["number", "0c7654_1234"], + ["number", "0b1111_0000_0101"], + ["number", "42"], + ["number", "42."], + ["number", ".42"], + ["number", "1_845.123_456"], + ["number", "3.14e+4"], + ["number", "4_2.5_7e-1_0"] +] + +---------------------------------------------------- + +Checks for hexadecimal, octal, binary and decimal numbers. diff --git a/docs/_style/prism-master/tests/languages/eiffel/operator_feature.test b/docs/_style/prism-master/tests/languages/eiffel/operator_feature.test new file mode 100644 index 00000000..fcba4b34 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/eiffel/operator_feature.test @@ -0,0 +1,19 @@ +\\ |..| .. // +/~ / /= +< <= > >= ++ - * +^ = ~ + +---------------------------------------------------- + +[ + ["operator", "\\\\"], ["operator", "|..|"], ["operator", ".."], ["operator", "//"], + ["operator", "/~"], ["operator", "/"], ["operator", "/="], + ["operator", "<"], ["operator", "<="], ["operator", ">"], ["operator", ">="], + ["operator", "+"], ["operator", "-"], ["operator", "*"], + ["operator", "^"], ["operator", "="], ["operator", "~"] +] + +---------------------------------------------------- + +Checks for all operators \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/eiffel/string_feature.test b/docs/_style/prism-master/tests/languages/eiffel/string_feature.test new file mode 100644 index 00000000..4b6692f8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/eiffel/string_feature.test @@ -0,0 +1,34 @@ +"" +"fo%"o" +"foo% +%bar" + +"[]" +"[fo"o +bar]" +"!-[fo"o[] +bar]!-" +"{}" +"{fo"o +bar}" +"*?{fo"o{} +bar}*?" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"fo%\"o\""], + ["string", "\"foo%\r\n%bar\""], + + ["string", "\"[]\""], + ["string", "\"[fo\"o\r\nbar]\""], + ["string", "\"!-[fo\"o[]\r\nbar]!-\""], + ["string", "\"{}\""], + ["string", "\"{fo\"o\r\nbar}\""], + ["string", "\"*?{fo\"o{}\r\nbar}*?\""] +] + +---------------------------------------------------- + +Checks for strings, multi-line strings, and aligned and non aligned verbatim strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/atom_feature.test b/docs/_style/prism-master/tests/languages/elixir/atom_feature.test new file mode 100644 index 00000000..5b1c47d2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/atom_feature.test @@ -0,0 +1,15 @@ +:true +:false +:FooBar42 + +---------------------------------------------------- + +[ + ["atom", ":true"], + ["atom", ":false"], + ["atom", ":FooBar42"] +] + +---------------------------------------------------- + +Checks for atoms. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/attr-name_feature.test b/docs/_style/prism-master/tests/languages/elixir/attr-name_feature.test new file mode 100644 index 00000000..de7cadc8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/attr-name_feature.test @@ -0,0 +1,24 @@ +[a: 1, b: 2] +do: :this, else: :that +where: foo, +select: bar + +---------------------------------------------------- + +[ + ["punctuation", "["], + ["attr-name", "a:"], + ["number", "1"], ["punctuation", ","], + ["attr-name", "b:"], + ["number", "2"], ["punctuation", "]"], + + ["attr-name", "do:"], ["atom", ":this"], + ["punctuation", ","], + ["attr-name", "else:"], ["atom", ":that"], + ["attr-name", "where:"], " foo", ["punctuation", ","], + ["attr-name", "select:"], " bar" +] + +---------------------------------------------------- + +Checks for keyword list keys. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/attribute_feature.test b/docs/_style/prism-master/tests/languages/elixir/attribute_feature.test new file mode 100644 index 00000000..273c2a40 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/attribute_feature.test @@ -0,0 +1,19 @@ +@vsn 2 +@moduledoc """ +foobar +""" +@tag :external + +---------------------------------------------------- + +[ + ["attribute", "@vsn"], ["number", "2"], + ["attribute", "@moduledoc"], ["string", [ + "\"\"\"\r\nfoobar\r\n\"\"\"" + ]], + ["attribute", "@tag"], ["atom", ":external"] +] + +---------------------------------------------------- + +Checks for module attributes. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/boolean_feature.test b/docs/_style/prism-master/tests/languages/elixir/boolean_feature.test new file mode 100644 index 00000000..aa949797 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/boolean_feature.test @@ -0,0 +1,15 @@ +true +false +nil + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"], + ["boolean", "nil"] +] + +---------------------------------------------------- + +Checks for booleans and nil. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/capture_feature.test b/docs/_style/prism-master/tests/languages/elixir/capture_feature.test new file mode 100644 index 00000000..8a64b661 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/capture_feature.test @@ -0,0 +1,28 @@ +fun = &Math.zero?/1 +(&is_function/1).(fun) +fun = &(&1 + 1) +&List.flatten(&1, &2) + +---------------------------------------------------- + +[ + "fun ", ["operator", "="], + ["capture", "&Math.zero?/1"], + ["punctuation", "("], + ["capture", "&is_function/1"], + ["punctuation", ")"], + ["punctuation", "."], + ["punctuation", "("], "fun", ["punctuation", ")"], + "\r\nfun ", ["operator", "="], + ["capture", "&"], + ["punctuation", "("], ["argument", "&1"], + ["operator", "+"], ["number", "1"], ["punctuation", ")"], + ["capture", "&List.flatten"], + ["punctuation", "("], ["argument", "&1"], + ["punctuation", ","], ["argument", "&2"], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for function capturing and arguments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/comment_feature.test b/docs/_style/prism-master/tests/languages/elixir/comment_feature.test new file mode 100644 index 00000000..7a7981d9 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/comment_feature.test @@ -0,0 +1,15 @@ +# +# Foobar +#{ This is a comment + +---------------------------------------------------- + +[ + ["comment", "#"], + ["comment", "# Foobar"], + ["comment", "#{ This is a comment"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/issue1392.test b/docs/_style/prism-master/tests/languages/elixir/issue1392.test new file mode 100644 index 00000000..c7d20a83 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/issue1392.test @@ -0,0 +1,16 @@ +String.upcase(@fixed) + +---------------------------------------------------- + +[ + "String", + ["punctuation", "."], + "upcase", + ["punctuation", "("], + ["attribute", "@fixed"], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Ensure module attributes don't consume punctuation. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/issue775.test b/docs/_style/prism-master/tests/languages/elixir/issue775.test new file mode 100644 index 00000000..d3243f80 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/issue775.test @@ -0,0 +1,17 @@ +@doc """ +## Parameters +""" + +---------------------------------------------------- + +[ + ["attribute", "@doc"], + ["string", [ + "\"\"\"\r\n## Parameters\r\n\"\"\"" + ]] +] + +---------------------------------------------------- + +Ensures that markdown headers are not highlighted as comments inside strings. +See #775 for details. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/keyword_feature.test b/docs/_style/prism-master/tests/languages/elixir/keyword_feature.test new file mode 100644 index 00000000..e1b02a1a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/keyword_feature.test @@ -0,0 +1,31 @@ +after alias and case +catch cond def +defcallback +defexception +defimpl defmodule +defp defprotocol +defstruct do else +end fn for if +import not or +require rescue try +unless use when + +---------------------------------------------------- + +[ + ["keyword", "after"], ["keyword", "alias"], ["keyword", "and"], ["keyword", "case"], + ["keyword", "catch"], ["keyword", "cond"], ["keyword", "def"], + ["keyword", "defcallback"], + ["keyword", "defexception"], + ["keyword", "defimpl"], ["keyword", "defmodule"], + ["keyword", "defp"], ["keyword", "defprotocol"], + ["keyword", "defstruct"], ["keyword", "do"], ["keyword", "else"], + ["keyword", "end"], ["keyword", "fn"], ["keyword", "for"], ["keyword", "if"], + ["keyword", "import"], ["keyword", "not"], ["keyword", "or"], + ["keyword", "require"], ["keyword", "rescue"], ["keyword", "try"], + ["keyword", "unless"], ["keyword", "use"], ["keyword", "when"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/number_feature.test b/docs/_style/prism-master/tests/languages/elixir/number_feature.test new file mode 100644 index 00000000..ae06684b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/number_feature.test @@ -0,0 +1,27 @@ +0b1111_0000 +0o754_123 +0xBadFace +42 +42_000 +3.14159 +2e6 +3.241_753E-7 +0.7e+15 + +---------------------------------------------------- + +[ + ["number", "0b1111_0000"], + ["number", "0o754_123"], + ["number", "0xBadFace"], + ["number", "42"], + ["number", "42_000"], + ["number", "3.14159"], + ["number", "2e6"], + ["number", "3.241_753E-7"], + ["number", "0.7e+15"] +] + +---------------------------------------------------- + +Checks for binary, octal, hexadecimal and decimal numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/operator_feature.test b/docs/_style/prism-master/tests/languages/elixir/operator_feature.test new file mode 100644 index 00000000..c97dcce5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/operator_feature.test @@ -0,0 +1,41 @@ +in +\\ +:: +.. +... ++ ++ +- -- -> +* +/ +^ +& && +| || |> +< <= <> <- +> >= +! != !== += =~ == === => + +---------------------------------------------------- + +[ + ["operator", "in"], + ["operator", "\\\\"], + ["operator", "::"], + ["operator", ".."], + ["operator", "..."], + ["operator", "+"], ["operator", "++"], + ["operator", "-"], ["operator", "--"], ["operator", "->"], + ["operator", "*"], + ["operator", "/"], + ["operator", "^"], + ["operator", "&"], ["operator", "&&"], + ["operator", "|"], ["operator", "||"], ["operator", "|>"], + ["operator", "<"], ["operator", "<="], ["operator", "<>"], ["operator", "<-"], + ["operator", ">"], ["operator", ">="], + ["operator", "!"], ["operator", "!="], ["operator", "!=="], + ["operator", "="], ["operator", "=~"], ["operator", "=="], ["operator", "==="], ["operator", "=>"] +] + +---------------------------------------------------- + +Checks for all operators. diff --git a/docs/_style/prism-master/tests/languages/elixir/regex_feature.test b/docs/_style/prism-master/tests/languages/elixir/regex_feature.test new file mode 100644 index 00000000..81eb31a6 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/regex_feature.test @@ -0,0 +1,29 @@ +~r"""foobar"""im +~R'''foobar'''ux +~r/fo\/obar/smfr +~R|fo\|obar|uismxfr +~r"fo\"obar"x +~R'fo\'obar's +~r(fo\)obar) +~R[fo\]obar] +~r{fo\}obar} +~Robar> + +---------------------------------------------------- + +[ + ["regex", "~r\"\"\"foobar\"\"\"im"], + ["regex", "~R'''foobar'''ux"], + ["regex", "~r/fo\\/obar/smfr"], + ["regex", "~R|fo\\|obar|uismxfr"], + ["regex", "~r\"fo\\\"obar\"x"], + ["regex", "~R'fo\\'obar's"], + ["regex", "~r(fo\\)obar)"], + ["regex", "~R[fo\\]obar]"], + ["regex", "~r{fo\\}obar}"], + ["regex", "~Robar>"] +] + +---------------------------------------------------- + +Checks for regexes. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elixir/string_feature.test b/docs/_style/prism-master/tests/languages/elixir/string_feature.test new file mode 100644 index 00000000..ca54f4be --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elixir/string_feature.test @@ -0,0 +1,115 @@ +~s/foobar/ +~s/foo#{42}bar/ +~S|foobar| +~c"foobar" +~c"foo#{42}bar" +~C'foobar' +~w(foobar)c +~w(foo#{42}bar)s +~W[foobar]a +~s{foobar} +~s{foo#{42}bar} +~S + +""" +Foo bar +""" + +''' +Foo bar +''' + +~S""" +Foo bar +""" + +~c""" +Foo bar +""" + +~w""" +Foo bar +""" + +"" +"foo" +"fo\"o\ +#{42}bar" +'' +'foo' +'fo\'o\ +bar' + +---------------------------------------------------- + +[ + ["string", ["~s/foobar/"]], + ["string", [ + "~s/foo", + ["interpolation", [ + ["delimiter", "#{"], + ["number", "42"], + ["delimiter", "}"] + ]], + "bar/" + ]], + ["string", ["~S|foobar|"]], + ["string", ["~c\"foobar\""]], + ["string", [ + "~c\"foo", + ["interpolation", [ + ["delimiter", "#{"], + ["number", "42"], + ["delimiter", "}"] + ]], + "bar\"" + ]], + ["string", ["~C'foobar'"]], + ["string", ["~w(foobar)c"]], + ["string", [ + "~w(foo", + ["interpolation", [ + ["delimiter", "#{"], + ["number", "42"], + ["delimiter", "}"] + ]], + "bar)s" + ]], + ["string", ["~W[foobar]a"]], + ["string", ["~s{foobar}"]], + ["string", [ + "~s{foo", + ["interpolation", [ + ["delimiter", "#{"], + ["number", "42"], + ["delimiter", "}"] + ]], + "bar}" + ]], + ["string", ["~S"]], + + ["string", ["\"\"\"\r\nFoo bar\r\n\"\"\""]], + ["string", ["'''\r\nFoo bar\r\n'''"]], + ["string", ["~S\"\"\"\r\nFoo bar\r\n\"\"\""]], + ["string", ["~c\"\"\"\r\nFoo bar\r\n\"\"\""]], + ["string", ["~w\"\"\"\r\nFoo bar\r\n\"\"\""]], + + ["string", ["\"\""]], + ["string", ["\"foo\""]], + ["string", [ + "\"fo\\\"o\\\r\n", + ["interpolation", [ + ["delimiter", "#{"], + ["number", "42"], + ["delimiter", "}"] + ]], + "bar\"" + ]], + ["string", ["''"]], + ["string", ["'foo'"]], + ["string", ["'fo\\'o\\\r\nbar'"]] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elm/builtin_feature.test b/docs/_style/prism-master/tests/languages/elm/builtin_feature.test new file mode 100644 index 00000000..da96c1dd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/builtin_feature.test @@ -0,0 +1,25 @@ +abs acos always asin atan atan2 +ceiling clamp compare cos curry +degrees e flip floor fromPolar +identity isInfinite isNaN +logBase max min negate never +not pi radians rem round sin +sqrt tan toFloat toPolar toString +truncate turns uncurry xor + +---------------------------------------------------- + +[ + ["builtin", "abs"], ["builtin", "acos"], ["builtin", "always"], ["builtin", "asin"], ["builtin", "atan"], ["builtin", "atan2"], + ["builtin", "ceiling"], ["builtin", "clamp"], ["builtin", "compare"], ["builtin", "cos"], ["builtin", "curry"], + ["builtin", "degrees"], ["builtin", "e"], ["builtin", "flip"], ["builtin", "floor"], ["builtin", "fromPolar"], + ["builtin", "identity"], ["builtin", "isInfinite"], ["builtin", "isNaN"], + ["builtin", "logBase"], ["builtin", "max"], ["builtin", "min"], ["builtin", "negate"], ["builtin", "never"], + ["builtin", "not"], ["builtin", "pi"], ["builtin", "radians"], ["builtin", "rem"], ["builtin", "round"], ["builtin", "sin"], + ["builtin", "sqrt"], ["builtin", "tan"], ["builtin", "toFloat"], ["builtin", "toPolar"], ["builtin", "toString"], + ["builtin", "truncate"], ["builtin", "turns"], ["builtin", "uncurry"], ["builtin", "xor"] +] + +---------------------------------------------------- + +Checks for all builtin. diff --git a/docs/_style/prism-master/tests/languages/elm/char_feature.test b/docs/_style/prism-master/tests/languages/elm/char_feature.test new file mode 100644 index 00000000..c4d33fcd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/char_feature.test @@ -0,0 +1,19 @@ +'a' +'\'' +'\n' +'\23' +'\xFE' + +---------------------------------------------------- + +[ + ["char", "'a'"], + ["char", "'\\''"], + ["char", "'\\n'"], + ["char", "'\\23'"], + ["char", "'\\xFE'"] +] + +---------------------------------------------------- + +Checks for chars. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elm/comment_feature.test b/docs/_style/prism-master/tests/languages/elm/comment_feature.test new file mode 100644 index 00000000..d8c8cdda --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/comment_feature.test @@ -0,0 +1,14 @@ +-- foo +{- foo +bar -} + +---------------------------------------------------- + +[ + ["comment", "-- foo"], + ["comment", "{- foo\r\nbar -}"] +] + +---------------------------------------------------- + +Checks for single-line and multi-line comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elm/constant_feature.test b/docs/_style/prism-master/tests/languages/elm/constant_feature.test new file mode 100644 index 00000000..06f25f10 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/constant_feature.test @@ -0,0 +1,15 @@ +Foo +Foo.Bar +Baz.Foobar_42 + +---------------------------------------------------- + +[ + ["constant", "Foo"], + ["constant", "Foo.Bar"], + ["constant", "Baz.Foobar_42"] +] + +---------------------------------------------------- + +Checks for constants. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elm/hvariable_feature.test b/docs/_style/prism-master/tests/languages/elm/hvariable_feature.test new file mode 100644 index 00000000..defa3ba7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/hvariable_feature.test @@ -0,0 +1,15 @@ +foo +Foo.bar +Baz.foobar_42 + +---------------------------------------------------- + +[ + ["hvariable", "foo"], + ["hvariable", "Foo.bar"], + ["hvariable", "Baz.foobar_42"] +] + +---------------------------------------------------- + +Checks for hvariables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/elm/import_statement_feature.test b/docs/_style/prism-master/tests/languages/elm/import_statement_feature.test new file mode 100644 index 00000000..c2940362 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/import_statement_feature.test @@ -0,0 +1,48 @@ +import Foo +import Foo_42.Bar as Foobar +import Foo.Bar as Foo.Baz +import List exposing (map) +import Json.Decode as Json exposing (Decoder) + +---------------------------------------------------- + +[ + ["import_statement", [ + ["keyword", "import"], + " Foo" + ]], + ["import_statement", [ + ["keyword", "import"], + " Foo_42.Bar ", + ["keyword", "as"], + " Foobar" + ]], + ["import_statement", [ + ["keyword", "import"], + " Foo.Bar ", + ["keyword", "as"], + " Foo.Baz" + ]], + ["import_statement", [ + ["keyword", "import"], + " List ", + ["keyword", "exposing"] + ]], + ["punctuation", "("], + ["hvariable", "map"], + ["punctuation", ")"], + ["import_statement", [ + ["keyword", "import"], + " Json.Decode ", + ["keyword", "as"], + " Json ", + ["keyword", "exposing"] + ]], + ["punctuation", "("], + ["constant", "Decoder"], + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for import statement. diff --git a/docs/_style/prism-master/tests/languages/elm/keyword_feature.test b/docs/_style/prism-master/tests/languages/elm/keyword_feature.test new file mode 100644 index 00000000..6f1132a4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/keyword_feature.test @@ -0,0 +1,19 @@ +alias as case else +exposing if in +infixl infixr let +module of then +type + +---------------------------------------------------- + +[ + ["keyword", "alias"], ["keyword", "as"], ["keyword", "case"], ["keyword", "else"], + ["keyword", "exposing"], ["keyword", "if"], ["keyword", "in"], + ["keyword", "infixl"], ["keyword", "infixr"], ["keyword", "let"], + ["keyword", "module"], ["keyword", "of"], ["keyword", "then"], + ["keyword", "type"] +] + +---------------------------------------------------- + +Checks for all keywords. diff --git a/docs/_style/prism-master/tests/languages/elm/number_feature.test b/docs/_style/prism-master/tests/languages/elm/number_feature.test new file mode 100644 index 00000000..c27dae9a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/number_feature.test @@ -0,0 +1,21 @@ +42 +3.14159 +2E3 +1.2e-4 +0.9e+1 +0xBadFace + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "2E3"], + ["number", "1.2e-4"], + ["number", "0.9e+1"], + ["number", "0xBadFace"] +] + +---------------------------------------------------- + +Checks for decimal and hexadecimal numbers. diff --git a/docs/_style/prism-master/tests/languages/elm/operator_feature.test b/docs/_style/prism-master/tests/languages/elm/operator_feature.test new file mode 100644 index 00000000..ce120ec6 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/operator_feature.test @@ -0,0 +1,33 @@ +.. +reverse . sort ++ - * / +^ ^^ ** +&& || +< <= == /= +>= > | +++ : !! +<- -> += :: => +>> >>= >@> +~ ! @ + +---------------------------------------------------- + +[ + ["operator", ".."], + ["hvariable", "reverse"], ["operator", " . "], ["hvariable", "sort"], + ["operator", "+"], ["operator", "-"], ["operator", "*"], ["operator", "/"], + ["operator", "^"], ["operator", "^^"], ["operator", "**"], + ["operator", "&&"], ["operator", "||"], + ["operator", "<"], ["operator", "<="], ["operator", "=="], ["operator", "/="], + ["operator", ">="], ["operator", ">"], ["operator", "|"], + ["operator", "++"], ["operator", ":"], ["operator", "!!"], + ["operator", "<-"], ["operator", "->"], + ["operator", "="], ["operator", "::"], ["operator", "=>"], + ["operator", ">>"], ["operator", ">>="], ["operator", ">@>"], + ["operator", "~"], ["operator", "!"], ["operator", "@"] +] + +---------------------------------------------------- + +Checks for operators. diff --git a/docs/_style/prism-master/tests/languages/elm/string_feature.test b/docs/_style/prism-master/tests/languages/elm/string_feature.test new file mode 100644 index 00000000..6b5ea8dd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/elm/string_feature.test @@ -0,0 +1,21 @@ +"" +"regular string" +"fo\"o" +"""foo + bar""" +"""foo -- comment + bar""" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"regular string\""], + ["string", "\"fo\\\"o\""], + ["string", "\"\"\"foo\r\n bar\"\"\""], + ["string", "\"\"\"foo -- comment\r\n bar\"\"\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erb/erb_feature.test b/docs/_style/prism-master/tests/languages/erb/erb_feature.test new file mode 100644 index 00000000..cb86983d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erb/erb_feature.test @@ -0,0 +1,36 @@ +<%# comment %> +<%= render @products || "empty_list" %> +<% @books.each do |book| %> + +---------------------------------------------------- + +[ + ["erb", [ + ["delimiter", "<%"], + ["comment", "# comment "], + ["delimiter", "%>"] + ]], + ["erb", [ + ["delimiter", "<%="], + " render ", + ["variable", "@products"], + ["operator", "||"], + ["string", ["\"empty_list\""]], + ["delimiter", "%>"] + ]], + ["erb", [ + ["delimiter", "<%"], + ["variable", "@books"], + ["punctuation", "."], + ["keyword", "each"], + ["keyword", "do"], + ["operator", "|"], + "book", + ["operator", "|"], + ["delimiter", "%>"] + ]] +] + +---------------------------------------------------- + +Checks for ERB tags. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erb/erb_in_markup_feature.test b/docs/_style/prism-master/tests/languages/erb/erb_in_markup_feature.test new file mode 100644 index 00000000..20719ea8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erb/erb_in_markup_feature.test @@ -0,0 +1,48 @@ +
        +___ERB1___<%= 1 %>___ERB2___<%= 2 %> + +---------------------------------------------------- + +[ + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "div" + ]], + ["attr-name", ["class"]], + ["attr-value", [ + ["punctuation", "="], + ["punctuation", "\""], + ["erb", [ + ["delimiter", "<%="], + ["builtin", "Time"], + ["punctuation", "."], + "now", + ["punctuation", "."], + "strftime", + ["punctuation", "("], + ["string", ["'%A'"]], + ["punctuation", ")"], + ["delimiter", "%>"] + ]], + ["punctuation", "\""] + ]], + ["punctuation", ">"] + ]], + "\r\n___ERB1___", + ["erb", [ + ["delimiter", "<%="], + ["number", "1"], + ["delimiter", "%>"] + ]], + "___ERB2___", + ["erb", [ + ["delimiter", "<%="], + ["number", "2"], + ["delimiter", "%>"] + ]] +] + +---------------------------------------------------- + +Checks for ERB inside Markup diff --git a/docs/_style/prism-master/tests/languages/erlang/atom_feature.test b/docs/_style/prism-master/tests/languages/erlang/atom_feature.test new file mode 100644 index 00000000..1761a8bb --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erlang/atom_feature.test @@ -0,0 +1,17 @@ +foo +foo@_bar +'foo bar' +'\'\\' + +---------------------------------------------------- + +[ + ["atom", "foo"], + ["atom", "foo@_bar"], + ["quoted-atom", "'foo bar'"], + ["quoted-atom", "'\\'\\\\'"] +] + +---------------------------------------------------- + +Checks for atoms and quoted atoms. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erlang/boolean_feature.test b/docs/_style/prism-master/tests/languages/erlang/boolean_feature.test new file mode 100644 index 00000000..4019c444 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erlang/boolean_feature.test @@ -0,0 +1,13 @@ +true +false + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erlang/comment_feature.test b/docs/_style/prism-master/tests/languages/erlang/comment_feature.test new file mode 100644 index 00000000..b879c5e5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erlang/comment_feature.test @@ -0,0 +1,11 @@ +% foo bar + +---------------------------------------------------- + +[ + ["comment", "% foo bar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erlang/function_feature.test b/docs/_style/prism-master/tests/languages/erlang/function_feature.test new file mode 100644 index 00000000..72d8857d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erlang/function_feature.test @@ -0,0 +1,17 @@ +spawn( +foo@_bar( +'foo bar'( +'\'\\'( + +---------------------------------------------------- + +[ + ["function", "spawn"], ["punctuation", "("], + ["function", "foo@_bar"], ["punctuation", "("], + ["quoted-function", "'foo bar'"], ["punctuation", "("], + ["quoted-function", "'\\'\\\\'"], ["punctuation", "("] +] + +---------------------------------------------------- + +Checks for functions and quoted functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erlang/keyword_feature.test b/docs/_style/prism-master/tests/languages/erlang/keyword_feature.test new file mode 100644 index 00000000..3af1da3d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erlang/keyword_feature.test @@ -0,0 +1,15 @@ +fun when case of +end if receive +after try catch + +---------------------------------------------------- + +[ + ["keyword", "fun"], ["keyword", "when"], ["keyword", "case"], ["keyword", "of"], + ["keyword", "end"], ["keyword", "if"], ["keyword", "receive"], + ["keyword", "after"], ["keyword", "try"], ["keyword", "catch"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erlang/number_feature.test b/docs/_style/prism-master/tests/languages/erlang/number_feature.test new file mode 100644 index 00000000..0e5890f3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erlang/number_feature.test @@ -0,0 +1,25 @@ +42 +2#101 +16#1f +2.3 +2.3e3 +2.3e-3 +$A +$\n + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "2#101"], + ["number", "16#1f"], + ["number", "2.3"], + ["number", "2.3e3"], + ["number", "2.3e-3"], + ["number", "$A"], + ["number", "$\\n"] +] + +---------------------------------------------------- + +Checks for numbers and character codes. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erlang/operator_feature.test b/docs/_style/prism-master/tests/languages/erlang/operator_feature.test new file mode 100644 index 00000000..addd5d3d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erlang/operator_feature.test @@ -0,0 +1,27 @@ +== /= >= := +=:= =/= ++ ++ - -- += * / ! +<= < > +bnot div rem band +bor bxor bsl bsr +not and or xor +orelse andalso + +---------------------------------------------------- + +[ + ["operator", "=="], ["operator", "/="], ["operator", ">="], ["operator", ":="], + ["operator", "=:="], ["operator", "=/="], + ["operator", "+"], ["operator", "++"], ["operator", "-"], ["operator", "--"], + ["operator", "="], ["operator", "*"], ["operator", "/"], ["operator", "!"], + ["operator", "<="], ["operator", "<"], ["operator", ">"], + ["operator", "bnot"], ["operator", "div"], ["operator", "rem"], ["operator", "band"], + ["operator", "bor"], ["operator", "bxor"], ["operator", "bsl"], ["operator", "bsr"], + ["operator", "not"], ["operator", "and"], ["operator", "or"], ["operator", "xor"], + ["operator", "orelse"], ["operator", "andalso"] +] + +---------------------------------------------------- + +Checks for all operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erlang/string_feature.test b/docs/_style/prism-master/tests/languages/erlang/string_feature.test new file mode 100644 index 00000000..42770f61 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erlang/string_feature.test @@ -0,0 +1,13 @@ +"" +"foo bar" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"foo bar\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/erlang/variable_feature.test b/docs/_style/prism-master/tests/languages/erlang/variable_feature.test new file mode 100644 index 00000000..f7492e44 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/erlang/variable_feature.test @@ -0,0 +1,17 @@ +Foo +?Bar +_ +Foo@_bar + +---------------------------------------------------- + +[ + ["variable", "Foo"], + ["variable", "?Bar"], + ["variable", "_"], + ["variable", "Foo@_bar"] +] + +---------------------------------------------------- + +Checks for variables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/flow/flow-punctuation_feature.test b/docs/_style/prism-master/tests/languages/flow/flow-punctuation_feature.test new file mode 100644 index 00000000..ba0c9005 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/flow/flow-punctuation_feature.test @@ -0,0 +1,12 @@ +{| foo : string |} + +---------------------------------------------------- + +[ + ["flow-punctuation", "{|"], " foo ", ["punctuation", ":"], + ["type", "string"], ["flow-punctuation", "|}"] +] + +---------------------------------------------------- + +Checks for Flow specific punctuation. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/flow/function-variable_feature.test b/docs/_style/prism-master/tests/languages/flow/function-variable_feature.test new file mode 100644 index 00000000..cda25c97 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/flow/function-variable_feature.test @@ -0,0 +1,20 @@ +foo = (a: number) : number => {} +bar = () : string => {} + +---------------------------------------------------- + +[ + ["function-variable", "foo"], ["operator", "="], + ["punctuation", "("], "a", ["punctuation", ":"], + ["type", "number"], ["punctuation", ")"], + ["punctuation", ":"], ["type", "number"], + ["operator", "=>"], ["punctuation", "{"], ["punctuation", "}"], + ["function-variable", "bar"], ["operator", "="], + ["punctuation", "("], ["punctuation", ")"], + ["punctuation", ":"], ["type", "string"], + ["operator", "=>"], ["punctuation", "{"], ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for function variables containing types. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/flow/keyword_feature.test b/docs/_style/prism-master/tests/languages/flow/keyword_feature.test new file mode 100644 index 00000000..fc1ca2ac --- /dev/null +++ b/docs/_style/prism-master/tests/languages/flow/keyword_feature.test @@ -0,0 +1,39 @@ +type +opaque +declare +Class +$await +$Diff +$Exact +$Keys +$ObjMap +$PropertyType +$Shape +$Record +$Supertype +$Subtype +$Enum + +---------------------------------------------------- + +[ + ["keyword", "type"], + ["keyword", "opaque"], + ["keyword", "declare"], + ["keyword", "Class"], + ["keyword", "$await"], + ["keyword", "$Diff"], + ["keyword", "$Exact"], + ["keyword", "$Keys"], + ["keyword", "$ObjMap"], + ["keyword", "$PropertyType"], + ["keyword", "$Shape"], + ["keyword", "$Record"], + ["keyword", "$Supertype"], + ["keyword", "$Subtype"], + ["keyword", "$Enum"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/flow/type_feature.test b/docs/_style/prism-master/tests/languages/flow/type_feature.test new file mode 100644 index 00000000..53827c35 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/flow/type_feature.test @@ -0,0 +1,31 @@ +Number +number +String +string +Boolean +boolean +Function +any +mixed +null +void + +---------------------------------------------------- + +[ + ["type", "Number"], + ["type", "number"], + ["type", "String"], + ["type", "string"], + ["type", "Boolean"], + ["type", "boolean"], + ["type", "Function"], + ["type", "any"], + ["type", "mixed"], + ["type", "null"], + ["type", "void"] +] + +---------------------------------------------------- + +Checks for types. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fortran+pure/fortran_inclusion.test b/docs/_style/prism-master/tests/languages/fortran+pure/fortran_inclusion.test new file mode 100644 index 00000000..176cad9e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fortran+pure/fortran_inclusion.test @@ -0,0 +1,18 @@ +%< -*- Fortran90 -*- +21_SHORT +%> + +---------------------------------------------------- + +[ + ["inline-lang-fortran", [ + ["delimiter", "%< "], + ["lang", "-*- Fortran90 -*-"], + ["number", "21_SHORT"], + ["delimiter", "%>"] + ]] +] + +---------------------------------------------------- + +Checks for Fortran in Pure. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fortran/boolean_feature.test b/docs/_style/prism-master/tests/languages/fortran/boolean_feature.test new file mode 100644 index 00000000..88bdb6bd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fortran/boolean_feature.test @@ -0,0 +1,13 @@ +.TRUE. +.false. + +---------------------------------------------------- + +[ + ["boolean", ".TRUE."], + ["boolean", ".false."] +] + +---------------------------------------------------- + +Checks for boolean. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fortran/comment_feature.test b/docs/_style/prism-master/tests/languages/fortran/comment_feature.test new file mode 100644 index 00000000..51b66e88 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fortran/comment_feature.test @@ -0,0 +1,15 @@ +! +! foobar +! This "string" should not be highlighted + +---------------------------------------------------- + +[ + ["comment", "!"], + ["comment", "! foobar"], + ["comment", "! This \"string\" should not be highlighted"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fortran/keyword_feature.test b/docs/_style/prism-master/tests/languages/fortran/keyword_feature.test new file mode 100644 index 00000000..e3bb493b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fortran/keyword_feature.test @@ -0,0 +1,199 @@ +INTEGER +REAL +DOUBLE PRECISION +DOUBLEPRECISION +COMPLEX +CHARACTER +LOGICAL + +ALLOCATABLE +ALLOCATE +BACKSPACE +CALL +CASE +CLOSE +COMMON +CONTAINS +CONTINUE +CYCLE +DATA +DEALLOCATE +DIMENSION +DO +END +EQUIVALENCE +EXIT +EXTERNAL +FORMAT +GO TO +GOTO +IMPLICIT +IMPLICIT NONE +INQUIRE +INTENT +INTRINSIC +MODULE PROCEDURE +NAMELIST +NULLIFY +OPEN +OPTIONAL +PARAMETER +POINTER +PRINT +PRIVATE +PUBLIC +READ +RETURN +REWIND +SAVE +SELECT +STOP +TARGET +WHILE +WRITE + +BLOCK DATA +BLOCKDATA +END BLOCK DATA +ENDBLOCKDATA +DO +ENDDO +FILE +FORALL +FUNCTION +IF +END IF +INTERFACE +MODULE +PROGRAM +SELECT +SUBROUTINE +TYPE +WHERE + +ASSIGNMENT +DEFAULT +ELEMENTAL +ELSE +ELSEWHERE +ELSEIF +ENTRY +IN +INCLUDE +INOUT +KIND +NULL +ONLY +OPERATOR +OUT +PURE +RECURSIVE +RESULT +SEQUENCE +STAT +THEN +USE + +---------------------------------------------------- + +[ + ["keyword", "INTEGER"], + ["keyword", "REAL"], + ["keyword", "DOUBLE PRECISION"], + ["keyword", "DOUBLEPRECISION"], + ["keyword", "COMPLEX"], + ["keyword", "CHARACTER"], + ["keyword", "LOGICAL"], + + ["keyword", "ALLOCATABLE"], + ["keyword", "ALLOCATE"], + ["keyword", "BACKSPACE"], + ["keyword", "CALL"], + ["keyword", "CASE"], + ["keyword", "CLOSE"], + ["keyword", "COMMON"], + ["keyword", "CONTAINS"], + ["keyword", "CONTINUE"], + ["keyword", "CYCLE"], + ["keyword", "DATA"], + ["keyword", "DEALLOCATE"], + ["keyword", "DIMENSION"], + ["keyword", "DO"], + ["keyword", "END"], + ["keyword", "EQUIVALENCE"], + ["keyword", "EXIT"], + ["keyword", "EXTERNAL"], + ["keyword", "FORMAT"], + ["keyword", "GO TO"], + ["keyword", "GOTO"], + ["keyword", "IMPLICIT"], + ["keyword", "IMPLICIT NONE"], + ["keyword", "INQUIRE"], + ["keyword", "INTENT"], + ["keyword", "INTRINSIC"], + ["keyword", "MODULE PROCEDURE"], + ["keyword", "NAMELIST"], + ["keyword", "NULLIFY"], + ["keyword", "OPEN"], + ["keyword", "OPTIONAL"], + ["keyword", "PARAMETER"], + ["keyword", "POINTER"], + ["keyword", "PRINT"], + ["keyword", "PRIVATE"], + ["keyword", "PUBLIC"], + ["keyword", "READ"], + ["keyword", "RETURN"], + ["keyword", "REWIND"], + ["keyword", "SAVE"], + ["keyword", "SELECT"], + ["keyword", "STOP"], + ["keyword", "TARGET"], + ["keyword", "WHILE"], + ["keyword", "WRITE"], + + ["keyword", "BLOCK DATA"], + ["keyword", "BLOCKDATA"], + ["keyword", "END BLOCK DATA"], + ["keyword", "ENDBLOCKDATA"], + ["keyword", "DO"], + ["keyword", "ENDDO"], + ["keyword", "FILE"], + ["keyword", "FORALL"], + ["keyword", "FUNCTION"], + ["keyword", "IF"], + ["keyword", "END IF"], + ["keyword", "INTERFACE"], + ["keyword", "MODULE"], + ["keyword", "PROGRAM"], + ["keyword", "SELECT"], + ["keyword", "SUBROUTINE"], + ["keyword", "TYPE"], + ["keyword", "WHERE"], + + ["keyword", "ASSIGNMENT"], + ["keyword", "DEFAULT"], + ["keyword", "ELEMENTAL"], + ["keyword", "ELSE"], + ["keyword", "ELSEWHERE"], + ["keyword", "ELSEIF"], + ["keyword", "ENTRY"], + ["keyword", "IN"], + ["keyword", "INCLUDE"], + ["keyword", "INOUT"], + ["keyword", "KIND"], + ["keyword", "NULL"], + ["keyword", "ONLY"], + ["keyword", "OPERATOR"], + ["keyword", "OUT"], + ["keyword", "PURE"], + ["keyword", "RECURSIVE"], + ["keyword", "RESULT"], + ["keyword", "SEQUENCE"], + ["keyword", "STAT"], + ["keyword", "THEN"], + ["keyword", "USE"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fortran/number_feature.test b/docs/_style/prism-master/tests/languages/fortran/number_feature.test new file mode 100644 index 00000000..c7b4a4cf --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fortran/number_feature.test @@ -0,0 +1,37 @@ +473 +21_2 +21_SHORT +1976354279568241_8 +1.6E3 +0.45E-4 +10.93E7_QUAD +3E4 +B'01110' +B"010" +O'047' +O"642" +Z'F41A' +Z"00BC" + +---------------------------------------------------- + +[ + ["number", "473"], + ["number", "21_2"], + ["number", "21_SHORT"], + ["number", "1976354279568241_8"], + ["number", "1.6E3"], + ["number", "0.45E-4"], + ["number", "10.93E7_QUAD"], + ["number", "3E4"], + ["quoted-number", "B'01110'"], + ["quoted-number", "B\"010\""], + ["quoted-number", "O'047'"], + ["quoted-number", "O\"642\""], + ["quoted-number", "Z'F41A'"], + ["quoted-number", "Z\"00BC\""] +] + +---------------------------------------------------- + +Checks for numbers and quoted numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fortran/operator_feature.test b/docs/_style/prism-master/tests/languages/fortran/operator_feature.test new file mode 100644 index 00000000..d2d3003f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fortran/operator_feature.test @@ -0,0 +1,25 @@ +** // => +== /= :: +< <= > >= ++ - * / = % +.EQ. .NE. .LT. .LE. +.GT. .GE. .NOT. .AND. +.OR. .EQV. .NEQV. +.foobar. + +---------------------------------------------------- + +[ + ["operator", "**"], ["operator", "//"], ["operator", "=>"], + ["operator", "=="], ["operator", "/="], ["operator", "::"], + ["operator", "<"], ["operator", "<="], ["operator", ">"], ["operator", ">="], + ["operator", "+"], ["operator", "-"], ["operator", "*"], ["operator", "/"], ["operator", "="], ["operator", "%"], + ["operator", ".EQ."], ["operator", ".NE."], ["operator", ".LT."], ["operator", ".LE."], + ["operator", ".GT."], ["operator", ".GE."], ["operator", ".NOT."], ["operator", ".AND."], + ["operator", ".OR."], ["operator", ".EQV."], ["operator", ".NEQV."], + ["operator", ".foobar."] +] + +---------------------------------------------------- + +Checks for all operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fortran/string_feature.test b/docs/_style/prism-master/tests/languages/fortran/string_feature.test new file mode 100644 index 00000000..3fa6f74a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fortran/string_feature.test @@ -0,0 +1,31 @@ +"" +'' +"foo ""bar"" baz" +'foo ''bar'' baz' +ITALICS_'foobar' +"foo & + &bar" +"foo & + ! Comment + &bar" + +---------------------------------------------------- + +[ + ["string", ["\"\""]], + ["string", ["''"]], + ["string", ["\"foo \"\"bar\"\" baz\""]], + ["string", ["'foo ''bar'' baz'"]], + ["string", ["ITALICS_'foobar'"]], + ["string", ["\"foo &\r\n\t&bar\""]], + ["string", [ + "\"foo &\r\n\t", + ["comment", "! Comment"], + "\r\n\t&bar\"" + ]] +] + +---------------------------------------------------- + +Checks for strings and line continuation. +Also checks for comments inside strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fsharp/annotation_feature.test b/docs/_style/prism-master/tests/languages/fsharp/annotation_feature.test new file mode 100644 index 00000000..3445236d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/annotation_feature.test @@ -0,0 +1,35 @@ +[] +[] + +---------------------------------------------------- + +[ + ["annotation", [ + ["punctuation", "[<"], + ["class-name", "Foo"], + ["punctuation", ">]"] + ]], + ["annotation", [ + ["punctuation", "[<"], + ["class-name", "Bar"], + ["annotation-content", [ + ["punctuation", "("], + ["string", "\"bar\""], + ["punctuation", ")"], + ["punctuation", ";"] + ]], + ["class-name", "Foo"], + ["annotation-content", [ + ["punctuation", "("], + ["number", "1"], + ["punctuation", ","], + ["number", "2"], + ["punctuation", ")"] + ]], + ["punctuation", ">]"] + ]] +] + +---------------------------------------------------- + +Checks for annotations. diff --git a/docs/_style/prism-master/tests/languages/fsharp/class-name_feature.test b/docs/_style/prism-master/tests/languages/fsharp/class-name_feature.test new file mode 100644 index 00000000..79399642 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/class-name_feature.test @@ -0,0 +1,86 @@ +let func : HttpFunc = handler (Some >> Task.FromResult) + +type Base1() = + abstract member F : unit -> unit + default u.F() = + printfn "F Base1" + +type Derived1() = + inherit Base1() + override u.F() = + printfn "F Derived1" + +let d1 : Derived1 = Derived1() + +let base1 = d1 :> Base1 +let derived1 = base1 :?> Derived1 + +type PersonName = + | FirstOnly of string + | LastOnly of string + | FirstLast of string * string + +type Shape = + | Rectangle of height : float * width : float + | Circle of radius : float + +type MyInterface = + abstract member Add: int -> int -> int + abstract member Pi : float + +exception Error1 of string +exception Error2 of string * int + +---------------------------------------------------- + +[ + ["keyword", "let"], " func ", + ["punctuation", ":"], ["class-name", ["HttpFunc"]], + ["operator", "="], " handler ", ["punctuation", "("], + "Some ", ["operator", ">>"], " Task", ["punctuation", "."], "FromResult", + ["punctuation", ")"], + + ["keyword", "type"], ["class-name", ["Base1"]], ["punctuation", "("], ["punctuation", ")"], ["operator", "="], + ["keyword", "abstract"], ["keyword", "member"], " F ", ["punctuation", ":"], + ["class-name", [ + "unit ", ["operator", "->"], " unit"] + ], + ["keyword", "default"], " u", ["punctuation", "."], ["function", "F"], ["punctuation", "("], ["punctuation", ")"], + ["operator", "="], "\n printfn ", ["string", "\"F Base1\""], + + ["keyword", "type"], ["class-name", ["Derived1"]], ["punctuation", "("], ["punctuation", ")"], ["operator", "="], + ["keyword", "inherit"], ["class-name", ["Base1"]], ["punctuation", "("], ["punctuation", ")"], + ["keyword", "override"], " u", ["punctuation", "."], ["function", "F"], ["punctuation", "("], ["punctuation", ")"], ["operator", "="], + "\n printfn ", ["string", "\"F Derived1\""], + + ["keyword", "let"], " d1 ", ["punctuation", ":"], ["class-name", ["Derived1"]], ["operator", "="], + ["function", "Derived1"], ["punctuation", "("], ["punctuation", ")"], + + ["keyword", "let"], " base1 ", ["operator", "="], " d1 ", ["operator", ":>"], ["class-name", ["Base1"]], + + ["keyword", "let"], " derived1 ", ["operator", "="], " base1 ", ["operator", ":?>"], ["class-name", ["Derived1"]], + + ["keyword", "type"], ["class-name", ["PersonName"]], ["operator", "="], + ["operator", "|"], " FirstOnly ", ["keyword", "of"], ["class-name", ["string"]], + ["operator", "|"], " LastOnly ", ["keyword", "of"], ["class-name", ["string"]], + ["operator", "|"], " FirstLast ", ["keyword", "of"], ["class-name", ["string ", ["operator", "*"], " string"]], + + ["keyword", "type"], ["class-name", ["Shape"]], ["operator", "="], + ["operator", "|"], " Rectangle ", ["keyword", "of"], + " height ", ["punctuation", ":"], ["class-name", ["float"]], ["operator", "*"], + " width ", ["punctuation", ":"], ["class-name", ["float"]], + ["operator", "|"], " Circle ", ["keyword", "of"], " radius ", ["punctuation", ":"], ["class-name", ["float"]], + + ["keyword", "type"], ["class-name", ["MyInterface"]], ["operator", "="], + ["keyword", "abstract"], ["keyword", "member"], " Add", ["punctuation", ":"], + ["class-name", ["int ", ["operator", "->"], " int ", ["operator", "->"], " int"]], + ["keyword", "abstract"], ["keyword", "member"], " Pi ", ["punctuation", ":"], ["class-name", ["float"]], + + ["keyword", "exception"], ["class-name", ["Error1"]], ["keyword", "of"], ["class-name", ["string"]], + + ["keyword", "exception"], ["class-name", ["Error2"]], ["keyword", "of"], ["class-name", ["string ", ["operator", "*"], " int"]] +] + +---------------------------------------------------- + +Checks for class-names. diff --git a/docs/_style/prism-master/tests/languages/fsharp/comment_feature.test b/docs/_style/prism-master/tests/languages/fsharp/comment_feature.test new file mode 100644 index 00000000..ff9170b6 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/comment_feature.test @@ -0,0 +1,16 @@ +// foobar +(**) +(* foo +bar *) + +---------------------------------------------------- + +[ + ["comment", "// foobar"], + ["comment", "(**)"], + ["comment", "(* foo\r\nbar *)"] +] + +---------------------------------------------------- + +Checks for single-line and multi-line comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fsharp/computation-expression_feature.test b/docs/_style/prism-master/tests/languages/fsharp/computation-expression_feature.test new file mode 100644 index 00000000..a49c6e35 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/computation-expression_feature.test @@ -0,0 +1,17 @@ +async {} +task {} +seq {} +foo {} + +---------------------------------------------------- + +[ + ["computation-expression", "async"], ["punctuation", "{"], ["punctuation", "}"], + ["computation-expression", "task"], ["punctuation", "{"], ["punctuation", "}"], + ["computation-expression", "seq"], ["punctuation", "{"], ["punctuation", "}"], + ["computation-expression", "foo"], ["punctuation", "{"], ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for computation expressions. diff --git a/docs/_style/prism-master/tests/languages/fsharp/issue1480.test b/docs/_style/prism-master/tests/languages/fsharp/issue1480.test new file mode 100644 index 00000000..2c692a33 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/issue1480.test @@ -0,0 +1,36 @@ +let foo' = failWith "foo" + +let bar' = failWith "bar" + +let map (f: 'a -> 'b) (xs: 'a list): 'b list = failWith "not implemented" + +---------------------------------------------------- + +[ + ["keyword", "let"], " foo' ", ["operator", "="], " failWith ", ["string", "\"foo\""], + ["keyword", "let"], " bar' ", ["operator", "="], " failWith ", ["string", "\"bar\""], + + ["keyword", "let"], + " map ", + ["punctuation", "("], + "f", + ["punctuation", ":"], + " 'a ", + ["operator", "->"], + " 'b", + ["punctuation", ")"], + ["punctuation", "("], + "xs", + ["punctuation", ":"], + " 'a list", + ["punctuation", ")"], + ["punctuation", ":"], + " 'b list ", + ["operator", "="], + " failWith ", + ["string", "\"not implemented\""] +] + +---------------------------------------------------- + +Checks for apostrophes in names. See #1480. diff --git a/docs/_style/prism-master/tests/languages/fsharp/keyword_feature.test b/docs/_style/prism-master/tests/languages/fsharp/keyword_feature.test new file mode 100644 index 00000000..17f058a5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/keyword_feature.test @@ -0,0 +1,73 @@ +abstract and as assert +base begin +class; +default +delegate do done downcast +downto elif else end +exception; +extern false finally +for fun function global +if in inherit; inline +interface; +internal lazy let +let! match member module +mutable namespace +new; +not +null of; open or override +private public rec return +return! select static struct +then to true try type; +upcast use use! val void +when while with yield +yield! asr land lor lsl +lsr lxor mod sig atomic +break checked component +const constraint constructor +continue eager event external +fixed functor include method +mixin object parallel process +protected pure sealed tailcall +trait; +virtual volatile + +---------------------------------------------------- + +[ + ["keyword", "abstract"], ["keyword", "and"], ["keyword", "as"], ["keyword", "assert"], + ["keyword", "base"], ["keyword", "begin"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "default"], + ["keyword", "delegate"], ["keyword", "do"], ["keyword", "done"], ["keyword", "downcast"], + ["keyword", "downto"], ["keyword", "elif"], ["keyword", "else"], ["keyword", "end"], + ["keyword", "exception"], ["punctuation", ";"], + ["keyword", "extern"], ["keyword", "false"], ["keyword", "finally"], + ["keyword", "for"], ["keyword", "fun"], ["keyword", "function"], ["keyword", "global"], + ["keyword", "if"], ["keyword", "in"], ["keyword", "inherit"], ["punctuation", ";"], ["keyword", "inline"], + ["keyword", "interface"], ["punctuation", ";"], + ["keyword", "internal"], ["keyword", "lazy"], ["keyword", "let"], + ["keyword", "let!"], ["keyword", "match"], ["keyword", "member"], ["keyword", "module"], + ["keyword", "mutable"], ["keyword", "namespace"], + ["keyword", "new"], ["punctuation", ";"], + ["keyword", "not"], + ["keyword", "null"], ["keyword", "of"], ["punctuation", ";"], ["keyword", "open"], ["keyword", "or"], ["keyword", "override"], + ["keyword", "private"], ["keyword", "public"], ["keyword", "rec"], ["keyword", "return"], + ["keyword", "return!"], ["keyword", "select"], ["keyword", "static"], ["keyword", "struct"], + ["keyword", "then"], ["keyword", "to"], ["keyword", "true"], ["keyword", "try"], ["keyword", "type"], ["punctuation", ";"], + ["keyword", "upcast"], ["keyword", "use"], ["keyword", "use!"], ["keyword", "val"], ["keyword", "void"], + ["keyword", "when"], ["keyword", "while"], ["keyword", "with"], ["keyword", "yield"], + ["keyword", "yield!"], ["keyword", "asr"], ["keyword", "land"], ["keyword", "lor"], ["keyword", "lsl"], + ["keyword", "lsr"], ["keyword", "lxor"], ["keyword", "mod"], ["keyword", "sig"], ["keyword", "atomic"], + ["keyword", "break"], ["keyword", "checked"], ["keyword", "component"], + ["keyword", "const"], ["keyword", "constraint"], ["keyword", "constructor"], + ["keyword", "continue"], ["keyword", "eager"], ["keyword", "event"], ["keyword", "external"], + ["keyword", "fixed"], ["keyword", "functor"], ["keyword", "include"], ["keyword", "method"], + ["keyword", "mixin"], ["keyword", "object"], ["keyword", "parallel"], ["keyword", "process"], + ["keyword", "protected"], ["keyword", "pure"], ["keyword", "sealed"], ["keyword", "tailcall"], + ["keyword", "trait"], ["punctuation", ";"], + ["keyword", "virtual"], ["keyword", "volatile"] +] + +---------------------------------------------------- + +Checks for all keywords. diff --git a/docs/_style/prism-master/tests/languages/fsharp/number_feature.test b/docs/_style/prism-master/tests/languages/fsharp/number_feature.test new file mode 100644 index 00000000..f2f86ed2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/number_feature.test @@ -0,0 +1,65 @@ +0xbabe +0xBABEun +0xflf +0xfLF + +0b1001 +0b1001y +0b1001uy + +42 +1.5 +2.3E+32 +2.3e-32 +4.14F +4.14f +0.7833M +0.7833m + +86y +86uy +86s +86us +86l +86u +86ul +86L +86UL +9999999999999999999999999999I + +---------------------------------------------------- + +[ + ["number", "0xbabe"], + ["number", "0xBABEun"], + ["number", "0xflf"], + ["number", "0xfLF"], + + ["number", "0b1001"], + ["number", "0b1001y"], + ["number", "0b1001uy"], + + ["number", "42"], + ["number", "1.5"], + ["number", "2.3E+32"], + ["number", "2.3e-32"], + ["number", "4.14F"], + ["number", "4.14f"], + ["number", "0.7833M"], + ["number", "0.7833m"], + + ["number", "86y"], + ["number", "86uy"], + ["number", "86s"], + ["number", "86us"], + ["number", "86l"], + ["number", "86u"], + ["number", "86ul"], + ["number", "86L"], + ["number", "86UL"], + ["number", "9999999999999999999999999999I"] +] + +---------------------------------------------------- + +Checks for decimal, hexadecimal and binary numbers, with all possible suffixes. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fsharp/operator_feature.test b/docs/_style/prism-master/tests/languages/fsharp/operator_feature.test new file mode 100644 index 00000000..7e15afc4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/operator_feature.test @@ -0,0 +1,53 @@ + >= <= <> > < = + - * / % + >=? <=? <>? >? =? ?<=? ?<>? ?>? ?= ?<= ?<> ?> ?< ?= ?+ ?- ?* ?/ ?% + +** + +<- -> +.. +:: +:= +:> :? :?> +<< >> +<<< >>> ~~~ ^^^ &&& ||| +| || +<| <|| <||| +|> ||> |||> +~~ ~- ~+ + +? ^ ! +!= == +& && + +---------------------------------------------------- + +[ + ["operator", ">="], ["operator", "<="], ["operator", "<>"], ["operator", ">"], ["operator", "<"], ["operator", "="], ["operator", "+"], ["operator", "-"], ["operator", "*"], ["operator", "/"], ["operator", "%"], + ["operator", ">=?"], ["operator", "<=?"], ["operator", "<>?"], ["operator", ">?"], ["operator", "=?"], ["operator", "?<=?"], ["operator", "?<>?"], ["operator", "?>?"], ["operator", "?="], ["operator", "?<="], ["operator", "?<>"], ["operator", "?>"], ["operator", "?<"], ["operator", "?="], ["operator", "?+"], ["operator", "?-"], ["operator", "?*"], ["operator", "?/"], ["operator", "?%"], + + ["operator", "**"], + + ["operator", "<-"], ["operator", "->"], + ["operator", ".."], + ["operator", "::"], + ["operator", ":="], + ["operator", ":>"], ["operator", ":?"], ["operator", ":?>"], + ["operator", "<<"], ["operator", ">>"], + ["operator", "<<<"], ["operator", ">>>"], ["operator", "~~~"], ["operator", "^^^"], ["operator", "&&&"], ["operator", "|||"], + ["operator", "|"], ["operator", "||"], + ["operator", "<|"], ["operator", "<||"], ["operator", "<|||"], + ["operator", "|>"], ["operator", "||>"], ["operator", "|||>"], + ["operator", "~~"], ["operator", "~-"], ["operator", "~+"], + + ["operator", "?"], ["operator", "^"], ["operator", "!"], + ["operator", "!="], ["operator", "=="], + ["operator", "&"], ["operator", "&&"] +] + +---------------------------------------------------- + +Checks for operators. diff --git a/docs/_style/prism-master/tests/languages/fsharp/preprocessor_feature.test b/docs/_style/prism-master/tests/languages/fsharp/preprocessor_feature.test new file mode 100644 index 00000000..4ee06395 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/preprocessor_feature.test @@ -0,0 +1,22 @@ +#if foo +#else +#endif + +#light +#line +#nowarn + +---------------------------------------------------- + +[ + ["preprocessor", ["#", ["directive", "if"], " foo"]], + ["preprocessor", ["#", ["directive", "else"]]], + ["preprocessor", ["#", ["directive", "endif"]]], + ["preprocessor", ["#", ["directive", "light"]]], + ["preprocessor", ["#", ["directive", "line"]]], + ["preprocessor", ["#", ["directive", "nowarn"]]] +] + +---------------------------------------------------- + +Checks for preprocessor directives. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/fsharp/string_feature.test b/docs/_style/prism-master/tests/languages/fsharp/string_feature.test new file mode 100644 index 00000000..3c984a8c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/fsharp/string_feature.test @@ -0,0 +1,47 @@ +"" +"fo\"o" +"foo\ +bar" +"foo"B + +@"" +@"foo" +@"fo""o" +@"foo"B + +"""""" +"""fo""o" +bar""" +"""foo"""B + +'a' +'a'B +'\'' +'\\' + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"fo\\\"o\""], + ["string", "\"foo\\\r\nbar\""], + ["string", "\"foo\"B"], + + ["string", "@\"\""], + ["string", "@\"foo\""], + ["string", "@\"fo\"\"o\""], + ["string", "@\"foo\"B"], + + ["string", "\"\"\"\"\"\""], + ["string", "\"\"\"fo\"\"o\"\r\nbar\"\"\""], + ["string", "\"\"\"foo\"\"\"B"], + + ["string", "'a'"], + ["string", "'a'B"], + ["string", "'\\''"], + ["string", "'\\\\'"] +] + +---------------------------------------------------- + +Checks for normal strings, verbatim strings, triple-quoted strings and character literals. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gcode/checksum_feature.test b/docs/_style/prism-master/tests/languages/gcode/checksum_feature.test new file mode 100644 index 00000000..d3ea4561 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gcode/checksum_feature.test @@ -0,0 +1,12 @@ +G28*22 + +---------------------------------------------------- + +[ + ["keyword", "G28"], + ["checksum", "*22"] +] + +---------------------------------------------------- + +Checks for checksums. diff --git a/docs/_style/prism-master/tests/languages/gcode/comment_feature.test b/docs/_style/prism-master/tests/languages/gcode/comment_feature.test new file mode 100644 index 00000000..cb2533f8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gcode/comment_feature.test @@ -0,0 +1,20 @@ +; foo +(Home some axes) +G28 (here come the axes to be homed) X + +---------------------------------------------------- + +[ + ["comment", "; foo"], + + ["comment", "(Home some axes)"], + + ["keyword", "G28"], + ["comment", "(here come the axes to be homed)"], + ["property", "X"] + +] + +---------------------------------------------------- + +Checks for comments. diff --git a/docs/_style/prism-master/tests/languages/gcode/keyword_feature.test b/docs/_style/prism-master/tests/languages/gcode/keyword_feature.test new file mode 100644 index 00000000..d72d0760 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gcode/keyword_feature.test @@ -0,0 +1,23 @@ +G00 +G200 +G84.1 + +M00 +M123 +M52.4 + +---------------------------------------------------- + +[ + ["keyword", "G00"], + ["keyword", "G200"], + ["keyword", "G84.1"], + + ["keyword", "M00"], + ["keyword", "M123"], + ["keyword", "M52.4"] +] + +---------------------------------------------------- + +Checks for G- and M-codes. diff --git a/docs/_style/prism-master/tests/languages/gcode/property_feature.test b/docs/_style/prism-master/tests/languages/gcode/property_feature.test new file mode 100644 index 00000000..9dee8868 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gcode/property_feature.test @@ -0,0 +1,17 @@ +X123 +Y0.2 +Z-3.1415 +E420:420 + +---------------------------------------------------- + +[ + ["property", "X"], "123\n", + ["property", "Y"], "0.2\n", + ["property", "Z"], "-3.1415\n", + ["property", "E"], "420", ["punctuation", ":"], "420" +] + +---------------------------------------------------- + +Checks for all other codes except G- and M-codes. diff --git a/docs/_style/prism-master/tests/languages/gcode/string_feature.test b/docs/_style/prism-master/tests/languages/gcode/string_feature.test new file mode 100644 index 00000000..d05306d7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gcode/string_feature.test @@ -0,0 +1,17 @@ +M587 S"MYROUTER" P"ABCxyz;"" 123" + +---------------------------------------------------- + +[ + ["keyword", "M587"], + + ["property", "S"], + ["string", "\"MYROUTER\""], + + ["property", "P"], + ["string", "\"ABCxyz;\"\" 123\""] +] + +---------------------------------------------------- + +Checks for strings. diff --git a/docs/_style/prism-master/tests/languages/gedcom/level_feature.test b/docs/_style/prism-master/tests/languages/gedcom/level_feature.test new file mode 100644 index 00000000..08c3963d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gedcom/level_feature.test @@ -0,0 +1,20 @@ +0 HEAD +1 CHAR ASCII +99 FOO bar + +---------------------------------------------------- + +[ + ["level", "0"], + ["tag", "HEAD"], + ["level", "1"], + ["tag", "CHAR"], + ["line-value", ["ASCII"]], + ["level", "99"], + ["tag", "FOO"], + ["line-value", ["bar"]] +] + +---------------------------------------------------- + +Checks for levels. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gedcom/line-value_feature.test b/docs/_style/prism-master/tests/languages/gedcom/line-value_feature.test new file mode 100644 index 00000000..4ab43e72 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gedcom/line-value_feature.test @@ -0,0 +1,29 @@ +1 CHIL @CHILD1@ +2 PLAC ÁĆÉǴÍ,ḰĹḾŃÓ,ṔŔŚÚẂ,ÝŹáćé,ǵíḱĺḿ,ńóṕŕś,úẃýź +1 NAME code: 0313/COMMA ABOVE/ +2 DATE @#DGREGORIAN@ 31 DEC 1997 +2 CONT Copyright gedcom@@gedcom.org + +---------------------------------------------------- + +[ + ["level", "1"], + ["tag", "CHIL"], + ["line-value", [["pointer", "@CHILD1@"]]], + ["level", "2"], + ["tag", "PLAC"], + ["line-value", ["ÁĆÉǴÍ,ḰĹḾŃÓ,ṔŔŚÚẂ,ÝŹáćé,ǵíḱĺḿ,ńóṕŕś,úẃýź"]], + ["level", "1"], + ["tag", "NAME"], + ["line-value", ["code: 0313/COMMA ABOVE/"]], + ["level", "2"], + ["tag", "DATE"], + ["line-value", ["@#DGREGORIAN@ 31 DEC 1997"]], + ["level", "2"], + ["tag", "CONT"], + ["line-value", ["Copyright gedcom@@gedcom.org"]] +] + +---------------------------------------------------- + +Checks for line values. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gedcom/pointer_feature.test b/docs/_style/prism-master/tests/languages/gedcom/pointer_feature.test new file mode 100644 index 00000000..f39ffb77 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gedcom/pointer_feature.test @@ -0,0 +1,23 @@ +@f!@ +@foo_Bar@ +@_$!"$%&'()*+,-./:;<=>?[\]^`{|}~ #foobar@ +0 @SUBMITTER@ SUBM +1 FAMS @FAMILY@ + +---------------------------------------------------- + +[ + ["pointer", "@f!@"], + ["pointer", "@foo_Bar@"], + ["pointer", "@_$!\"$%&'()*+,-./:;<=>?[\\]^`{|}~ #foobar@"], + ["level", "0"], + ["pointer", "@SUBMITTER@"], + ["tag", "SUBM"], + ["level", "1"], + ["tag", "FAMS"], + ["line-value", [["pointer", "@FAMILY@"]]] +] + +---------------------------------------------------- + +Checks for pointers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gedcom/tag_feature.test b/docs/_style/prism-master/tests/languages/gedcom/tag_feature.test new file mode 100644 index 00000000..2166f644 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gedcom/tag_feature.test @@ -0,0 +1,25 @@ +0 HEAD +1 foo_bar +2 _ +3 @pointer@ _Sometag42 +4 247 + +---------------------------------------------------- + +[ + ["level", "0"], + ["tag", "HEAD"], + ["level", "1"], + ["tag", "foo_bar"], + ["level", "2"], + ["tag", "_"], + ["level", "3"], + ["pointer", "@pointer@"], + ["tag", "_Sometag42"], + ["level", "4"], + ["tag", "247"] +] + +---------------------------------------------------- + +Checks for tags. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gherkin/atrule_feature.test b/docs/_style/prism-master/tests/languages/gherkin/atrule_feature.test new file mode 100644 index 00000000..23bc5408 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gherkin/atrule_feature.test @@ -0,0 +1,1211 @@ +Scenario: foo + 'ach foobar + 'a foobar + 'ej foobar + 7 foobar + a foobar + A také foobar + A taktiež foobar + A tiež foobar + A zároveň foobar + Aber foobar + Ac foobar + Adott foobar + Akkor foobar + Ak foobar + Aleshores foobar + Ale foobar + Ali foobar + Allora foobar + Alors foobar + Als foobar + Ama foobar + Amennyiben foobar + Amikor foobar + Ampak foobar + an foobar + AN foobar + Ananging foobar + And y'all foobar + And foobar + Angenommen foobar + Anrhegedig a foobar + An foobar + Apabila foobar + Atès foobar + Atesa foobar + Atunci foobar + Avast! foobar + Aye foobar + A foobar + awer foobar + Bagi foobar + Banjur foobar + Bet foobar + Biết foobar + Blimey! foobar + Buh foobar + But at the end of the day I reckon foobar + But y'all foobar + But foobar + BUT foobar + Cal foobar + Când foobar + Cando foobar + Cand foobar + Ce foobar + Cuando foobar + Če foobar + Ða ðe foobar + Ða foobar + Dadas foobar + Dada foobar + Dados foobar + Dado foobar + DaH ghu' bejlu' foobar + dann foobar + Dann foobar + Dano foobar + Dan foobar + Dar foobar + Dat fiind foobar + Data foobar + Date fiind foobar + Date foobar + Dati fiind foobar + Dati foobar + Daţi fiind foobar + Dați fiind foobar + Dato foobar + DEN foobar + Den youse gotta foobar + Dengan foobar + De foobar + Diberi foobar + Diyelim ki foobar + Donada foobar + Donat foobar + Donitaĵo foobar + Do foobar + Dun foobar + Duota foobar + Ðurh foobar + Eeldades foobar + Ef foobar + Eğer ki foobar + Entao foobar + Então foobar + Entón foobar + Entonces foobar + En foobar + Epi foobar + E foobar + És foobar + Etant donnée foobar + Etant donné foobar + Et foobar + Étant données foobar + Étant donnée foobar + Étant donné foobar + Etant données foobar + Etant donnés foobar + Étant donnés foobar + Fakat foobar + Gangway! foobar + Gdy foobar + Gegeben seien foobar + Gegeben sei foobar + Gegeven foobar + Gegewe foobar + ghu' noblu' foobar + Gitt foobar + Given y'all foobar + Given foobar + Givet foobar + Givun foobar + Ha foobar + Cho foobar + I CAN HAZ foobar + In foobar + Ir foobar + It's just unbelievable foobar + I foobar + Ja foobar + Jeśli foobar + Jeżeli foobar + Kadar foobar + Kada foobar + Kad foobar + Kai foobar + Kaj foobar + Když foobar + Keď foobar + Kemudian foobar + Ketika foobar + Khi foobar + Kiedy foobar + Ko foobar + Kuid foobar + Kui foobar + Kun foobar + Lan foobar + latlh foobar + Le sa a foobar + Let go and haul foobar + Le foobar + Lè sa a foobar + Lè foobar + Logo foobar + Lorsqu'< foobar + Lorsque foobar + mä foobar + Maar foobar + Mais foobar + Mając foobar + Majd foobar + Maka foobar + Manawa foobar + Mas foobar + Ma foobar + Menawa foobar + Men foobar + Mutta foobar + Nalikaning foobar + Nalika foobar + Nanging foobar + Når foobar + När foobar + Nato foobar + Nhưng foobar + Niin foobar + Njuk foobar + O zaman foobar + Og foobar + Och foobar + Oletetaan foobar + Onda foobar + Ond foobar + Oraz foobar + Pak foobar + Pero foobar + Però foobar + Podano foobar + Pokiaľ foobar + Pokud foobar + Potem foobar + Potom foobar + Privzeto foobar + Pryd foobar + qaSDI' foobar + Quando foobar + Quand foobar + Quan foobar + Så foobar + Sed foobar + Se foobar + Siis foobar + Sipoze ke foobar + Sipoze Ke foobar + Sipoze foobar + Si foobar + Şi foobar + Și foobar + Soit foobar + Stel foobar + Tada foobar + Tad foobar + Takrat foobar + Tak foobar + Tapi foobar + Ter foobar + Tetapi foobar + Tha the foobar + Tha foobar + Then y'all foobar + Then foobar + Thì foobar + Thurh foobar + Toda foobar + Too right foobar + ugeholl foobar + Und foobar + Un foobar + Và foobar + vaj foobar + Vendar foobar + Ve foobar + wann foobar + Wanneer foobar + WEN foobar + Wenn foobar + When y'all foobar + When foobar + Wtedy foobar + Wun foobar + Y'know foobar + Yeah nah foobar + Yna foobar + Youse know like when foobar + Youse know when youse got foobar + Y foobar + Za predpokladu foobar + Za předpokladu foobar + Zadani foobar + Zadano foobar + Zadan foobar + Zadate foobar + Zadato foobar + Zakładając foobar + Zaradi foobar + Zatati foobar + Þa foobar + Þá foobar + Þa þe foobar + Þegar foobar + Þurh foobar + Αλλά foobar + Δεδομένου foobar + Και foobar + Όταν foobar + Τότε foobar + А також foobar + Агар foobar + Але foobar + Али foobar + Аммо foobar + А foobar + Әгәр foobar + Әйтик foobar + Әмма foobar + Бирок foobar + Ва foobar + Вә foobar + Дадено foobar + Дано foobar + Допустим foobar + Если foobar + Задате foobar + Задати foobar + Задато foobar + И foobar + І foobar + К тому же foobar + Када foobar + Кад foobar + Когато foobar + Когда foobar + Коли foobar + Ләкин foobar + Лекин foobar + Нәтиҗәдә foobar + Нехай foobar + Но foobar + Онда foobar + Припустимо, що foobar + Припустимо foobar + Пусть foobar + Также foobar + Та foobar + Тогда foobar + Тоді foobar + То foobar + Унда foobar + Һәм foobar + Якщо foobar + אבל foobar + אזי foobar + אז foobar + בהינתן foobar + וגם foobar + כאשר foobar + آنگاه foobar + اذاً foobar + اگر foobar + اما foobar + اور foobar + با فرض foobar + بالفرض foobar + بفرض foobar + پھر foobar + تب foobar + ثم foobar + جب foobar + عندما foobar + فرض کیا foobar + لكن foobar + لیکن foobar + متى foobar + هنگامی foobar + و foobar + अगर foobar + और foobar + कदा foobar + किन्तु foobar + चूंकि foobar + जब foobar + तथा foobar + तदा foobar + तब foobar + परन्तु foobar + पर foobar + यदि foobar + ਅਤੇ foobar + ਜਦੋਂ foobar + ਜਿਵੇਂ ਕਿ foobar + ਜੇਕਰ foobar + ਤਦ foobar + ਪਰ foobar + అప్పుడు foobar + ఈ పరిస్థితిలో foobar + కాని foobar + చెప్పబడినది foobar + మరియు foobar + ಆದರೆ foobar + ನಂತರ foobar + ನೀಡಿದ foobar + ಮತ್ತು foobar + ಸ್ಥಿತಿಯನ್ನು foobar + กำหนดให้ foobar + ดังนั้น foobar + แต่ foobar + เมื่อ foobar + และ foobar + 그러면< foobar + 그리고< foobar + 단< foobar + 만약< foobar + 만일< foobar + 먼저< foobar + 조건< foobar + 하지만< foobar + かつ< foobar + しかし< foobar + ただし< foobar + ならば< foobar + もし< foobar + 並且< foobar + 但し< foobar + 但是< foobar + 假如< foobar + 假定< foobar + 假設< foobar + 假设< foobar + 前提< foobar + 同时< foobar + 同時< foobar + 并且< foobar + 当< foobar + 當< foobar + 而且< foobar + 那么< foobar + 那麼< foobar + +---------------------------------------------------- + +[ + ["scenario", [["keyword", "Scenario:"], ["important", " foo"]]], + ["atrule", "'ach"], + " foobar\r\n\t", + ["atrule", "'a"], + " foobar\r\n\t", + ["atrule", "'ej"], + " foobar\r\n\t", + ["atrule", "7"], + " foobar\r\n\t", + ["atrule", "a"], + " foobar\r\n\t", + ["atrule", "A také"], + " foobar\r\n\t", + ["atrule", "A taktiež"], + " foobar\r\n\t", + ["atrule", "A tiež"], + " foobar\r\n\t", + ["atrule", "A zároveň"], + " foobar\r\n\t", + ["atrule", "Aber"], + " foobar\r\n\t", + ["atrule", "Ac"], + " foobar\r\n\t", + ["atrule", "Adott"], + " foobar\r\n\t", + ["atrule", "Akkor"], + " foobar\r\n\t", + ["atrule", "Ak"], + " foobar\r\n\t", + ["atrule", "Aleshores"], + " foobar\r\n\t", + ["atrule", "Ale"], + " foobar\r\n\t", + ["atrule", "Ali"], + " foobar\r\n\t", + ["atrule", "Allora"], + " foobar\r\n\t", + ["atrule", "Alors"], + " foobar\r\n\t", + ["atrule", "Als"], + " foobar\r\n\t", + ["atrule", "Ama"], + " foobar\r\n\t", + ["atrule", "Amennyiben"], + " foobar\r\n\t", + ["atrule", "Amikor"], + " foobar\r\n\t", + ["atrule", "Ampak"], + " foobar\r\n\t", + ["atrule", "an"], + " foobar\r\n\t", + ["atrule", "AN"], + " foobar\r\n\t", + ["atrule", "Ananging"], + " foobar\r\n\t", + ["atrule", "And y'all"], + " foobar\r\n\t", + ["atrule", "And"], + " foobar\r\n\t", + ["atrule", "Angenommen"], + " foobar\r\n\t", + ["atrule", "Anrhegedig a"], + " foobar\r\n\t", + ["atrule", "An"], + " foobar\r\n\t", + ["atrule", "Apabila"], + " foobar\r\n\t", + ["atrule", "Atès"], + " foobar\r\n\t", + ["atrule", "Atesa"], + " foobar\r\n\t", + ["atrule", "Atunci"], + " foobar\r\n\t", + ["atrule", "Avast!"], + " foobar\r\n\t", + ["atrule", "Aye"], + " foobar\r\n\t", + ["atrule", "A"], + " foobar\r\n\t", + ["atrule", "awer"], + " foobar\r\n\t", + ["atrule", "Bagi"], + " foobar\r\n\t", + ["atrule", "Banjur"], + " foobar\r\n\t", + ["atrule", "Bet"], + " foobar\r\n\t", + ["atrule", "Biết"], + " foobar\r\n\t", + ["atrule", "Blimey!"], + " foobar\r\n\t", + ["atrule", "Buh"], + " foobar\r\n\t", + ["atrule", "But at the end of the day I reckon"], + " foobar\r\n\t", + ["atrule", "But y'all"], + " foobar\r\n\t", + ["atrule", "But"], + " foobar\r\n\t", + ["atrule", "BUT"], + " foobar\r\n\t", + ["atrule", "Cal"], + " foobar\r\n\t", + ["atrule", "Când"], + " foobar\r\n\t", + ["atrule", "Cando"], + " foobar\r\n\t", + ["atrule", "Cand"], + " foobar\r\n\t", + ["atrule", "Ce"], + " foobar\r\n\t", + ["atrule", "Cuando"], + " foobar\r\n\t", + ["atrule", "Če"], + " foobar\r\n\t", + ["atrule", "Ða ðe"], + " foobar\r\n\t", + ["atrule", "Ða"], + " foobar\r\n\t", + ["atrule", "Dadas"], + " foobar\r\n\t", + ["atrule", "Dada"], + " foobar\r\n\t", + ["atrule", "Dados"], + " foobar\r\n\t", + ["atrule", "Dado"], + " foobar\r\n\t", + ["atrule", "DaH ghu' bejlu'"], + " foobar\r\n\t", + ["atrule", "dann"], + " foobar\r\n\t", + ["atrule", "Dann"], + " foobar\r\n\t", + ["atrule", "Dano"], + " foobar\r\n\t", + ["atrule", "Dan"], + " foobar\r\n\t", + ["atrule", "Dar"], + " foobar\r\n\t", + ["atrule", "Dat fiind"], + " foobar\r\n\t", + ["atrule", "Data"], + " foobar\r\n\t", + ["atrule", "Date fiind"], + " foobar\r\n\t", + ["atrule", "Date"], + " foobar\r\n\t", + ["atrule", "Dati fiind"], + " foobar\r\n\t", + ["atrule", "Dati"], + " foobar\r\n\t", + ["atrule", "Daţi fiind"], + " foobar\r\n\t", + ["atrule", "Dați fiind"], + " foobar\r\n\t", + ["atrule", "Dato"], + " foobar\r\n\t", + ["atrule", "DEN"], + " foobar\r\n\t", + ["atrule", "Den youse gotta"], + " foobar\r\n\t", + ["atrule", "Dengan"], + " foobar\r\n\t", + ["atrule", "De"], + " foobar\r\n\t", + ["atrule", "Diberi"], + " foobar\r\n\t", + ["atrule", "Diyelim ki"], + " foobar\r\n\t", + ["atrule", "Donada"], + " foobar\r\n\t", + ["atrule", "Donat"], + " foobar\r\n\t", + ["atrule", "Donitaĵo"], + " foobar\r\n\t", + ["atrule", "Do"], + " foobar\r\n\t", + ["atrule", "Dun"], + " foobar\r\n\t", + ["atrule", "Duota"], + " foobar\r\n\t", + ["atrule", "Ðurh"], + " foobar\r\n\t", + ["atrule", "Eeldades"], + " foobar\r\n\t", + ["atrule", "Ef"], + " foobar\r\n\t", + ["atrule", "Eğer ki"], + " foobar\r\n\t", + ["atrule", "Entao"], + " foobar\r\n\t", + ["atrule", "Então"], + " foobar\r\n\t", + ["atrule", "Entón"], + " foobar\r\n\t", + ["atrule", "Entonces"], + " foobar\r\n\t", + ["atrule", "En"], + " foobar\r\n\t", + ["atrule", "Epi"], + " foobar\r\n\t", + ["atrule", "E"], + " foobar\r\n\t", + ["atrule", "És"], + " foobar\r\n\t", + ["atrule", "Etant donnée"], + " foobar\r\n\t", + ["atrule", "Etant donné"], + " foobar\r\n\t", + ["atrule", "Et"], + " foobar\r\n\t", + ["atrule", "Étant données"], + " foobar\r\n\t", + ["atrule", "Étant donnée"], + " foobar\r\n\t", + ["atrule", "Étant donné"], + " foobar\r\n\t", + ["atrule", "Etant données"], + " foobar\r\n\t", + ["atrule", "Etant donnés"], + " foobar\r\n\t", + ["atrule", "Étant donnés"], + " foobar\r\n\t", + ["atrule", "Fakat"], + " foobar\r\n\t", + ["atrule", "Gangway!"], + " foobar\r\n\t", + ["atrule", "Gdy"], + " foobar\r\n\t", + ["atrule", "Gegeben seien"], + " foobar\r\n\t", + ["atrule", "Gegeben sei"], + " foobar\r\n\t", + ["atrule", "Gegeven"], + " foobar\r\n\t", + ["atrule", "Gegewe"], + " foobar\r\n\t", + ["atrule", "ghu' noblu'"], + " foobar\r\n\t", + ["atrule", "Gitt"], + " foobar\r\n\t", + ["atrule", "Given y'all"], + " foobar\r\n\t", + ["atrule", "Given"], + " foobar\r\n\t", + ["atrule", "Givet"], + " foobar\r\n\t", + ["atrule", "Givun"], + " foobar\r\n\t", + ["atrule", "Ha"], + " foobar\r\n\t", + ["atrule", "Cho"], + " foobar\r\n\t", + ["atrule", "I CAN HAZ"], + " foobar\r\n\t", + ["atrule", "In"], + " foobar\r\n\t", + ["atrule", "Ir"], + " foobar\r\n\t", + ["atrule", "It's just unbelievable"], + " foobar\r\n\t", + ["atrule", "I"], + " foobar\r\n\t", + ["atrule", "Ja"], + " foobar\r\n\t", + ["atrule", "Jeśli"], + " foobar\r\n\t", + ["atrule", "Jeżeli"], + " foobar\r\n\t", + ["atrule", "Kadar"], + " foobar\r\n\t", + ["atrule", "Kada"], + " foobar\r\n\t", + ["atrule", "Kad"], + " foobar\r\n\t", + ["atrule", "Kai"], + " foobar\r\n\t", + ["atrule", "Kaj"], + " foobar\r\n\t", + ["atrule", "Když"], + " foobar\r\n\t", + ["atrule", "Keď"], + " foobar\r\n\t", + ["atrule", "Kemudian"], + " foobar\r\n\t", + ["atrule", "Ketika"], + " foobar\r\n\t", + ["atrule", "Khi"], + " foobar\r\n\t", + ["atrule", "Kiedy"], + " foobar\r\n\t", + ["atrule", "Ko"], + " foobar\r\n\t", + ["atrule", "Kuid"], + " foobar\r\n\t", + ["atrule", "Kui"], + " foobar\r\n\t", + ["atrule", "Kun"], + " foobar\r\n\t", + ["atrule", "Lan"], + " foobar\r\n\t", + ["atrule", "latlh"], + " foobar\r\n\t", + ["atrule", "Le sa a"], + " foobar\r\n\t", + ["atrule", "Let go and haul"], + " foobar\r\n\t", + ["atrule", "Le"], + " foobar\r\n\t", + ["atrule", "Lè sa a"], + " foobar\r\n\t", + ["atrule", "Lè"], + " foobar\r\n\t", + ["atrule", "Logo"], + " foobar\r\n\t", + ["atrule", "Lorsqu'<"], + " foobar\r\n\t", + ["atrule", "Lorsque"], + " foobar\r\n\t", + ["atrule", "mä"], + " foobar\r\n\t", + ["atrule", "Maar"], + " foobar\r\n\t", + ["atrule", "Mais"], + " foobar\r\n\t", + ["atrule", "Mając"], + " foobar\r\n\t", + ["atrule", "Majd"], + " foobar\r\n\t", + ["atrule", "Maka"], + " foobar\r\n\t", + ["atrule", "Manawa"], + " foobar\r\n\t", + ["atrule", "Mas"], + " foobar\r\n\t", + ["atrule", "Ma"], + " foobar\r\n\t", + ["atrule", "Menawa"], + " foobar\r\n\t", + ["atrule", "Men"], + " foobar\r\n\t", + ["atrule", "Mutta"], + " foobar\r\n\t", + ["atrule", "Nalikaning"], + " foobar\r\n\t", + ["atrule", "Nalika"], + " foobar\r\n\t", + ["atrule", "Nanging"], + " foobar\r\n\t", + ["atrule", "Når"], + " foobar\r\n\t", + ["atrule", "När"], + " foobar\r\n\t", + ["atrule", "Nato"], + " foobar\r\n\t", + ["atrule", "Nhưng"], + " foobar\r\n\t", + ["atrule", "Niin"], + " foobar\r\n\t", + ["atrule", "Njuk"], + " foobar\r\n\t", + ["atrule", "O zaman"], + " foobar\r\n\t", + ["atrule", "Og"], + " foobar\r\n\t", + ["atrule", "Och"], + " foobar\r\n\t", + ["atrule", "Oletetaan"], + " foobar\r\n\t", + ["atrule", "Onda"], + " foobar\r\n\t", + ["atrule", "Ond"], + " foobar\r\n\t", + ["atrule", "Oraz"], + " foobar\r\n\t", + ["atrule", "Pak"], + " foobar\r\n\t", + ["atrule", "Pero"], + " foobar\r\n\t", + ["atrule", "Però"], + " foobar\r\n\t", + ["atrule", "Podano"], + " foobar\r\n\t", + ["atrule", "Pokiaľ"], + " foobar\r\n\t", + ["atrule", "Pokud"], + " foobar\r\n\t", + ["atrule", "Potem"], + " foobar\r\n\t", + ["atrule", "Potom"], + " foobar\r\n\t", + ["atrule", "Privzeto"], + " foobar\r\n\t", + ["atrule", "Pryd"], + " foobar\r\n\t", + ["atrule", "qaSDI'"], + " foobar\r\n\t", + ["atrule", "Quando"], + " foobar\r\n\t", + ["atrule", "Quand"], + " foobar\r\n\t", + ["atrule", "Quan"], + " foobar\r\n\t", + ["atrule", "Så"], + " foobar\r\n\t", + ["atrule", "Sed"], + " foobar\r\n\t", + ["atrule", "Se"], + " foobar\r\n\t", + ["atrule", "Siis"], + " foobar\r\n\t", + ["atrule", "Sipoze ke"], + " foobar\r\n\t", + ["atrule", "Sipoze Ke"], + " foobar\r\n\t", + ["atrule", "Sipoze"], + " foobar\r\n\t", + ["atrule", "Si"], + " foobar\r\n\t", + ["atrule", "Şi"], + " foobar\r\n\t", + ["atrule", "Și"], + " foobar\r\n\t", + ["atrule", "Soit"], + " foobar\r\n\t", + ["atrule", "Stel"], + " foobar\r\n\t", + ["atrule", "Tada"], + " foobar\r\n\t", + ["atrule", "Tad"], + " foobar\r\n\t", + ["atrule", "Takrat"], + " foobar\r\n\t", + ["atrule", "Tak"], + " foobar\r\n\t", + ["atrule", "Tapi"], + " foobar\r\n\t", + ["atrule", "Ter"], + " foobar\r\n\t", + ["atrule", "Tetapi"], + " foobar\r\n\t", + ["atrule", "Tha the"], + " foobar\r\n\t", + ["atrule", "Tha"], + " foobar\r\n\t", + ["atrule", "Then y'all"], + " foobar\r\n\t", + ["atrule", "Then"], + " foobar\r\n\t", + ["atrule", "Thì"], + " foobar\r\n\t", + ["atrule", "Thurh"], + " foobar\r\n\t", + ["atrule", "Toda"], + " foobar\r\n\t", + ["atrule", "Too right"], + " foobar\r\n\t", + ["atrule", "ugeholl"], + " foobar\r\n\t", + ["atrule", "Und"], + " foobar\r\n\t", + ["atrule", "Un"], + " foobar\r\n\t", + ["atrule", "Và"], + " foobar\r\n\t", + ["atrule", "vaj"], + " foobar\r\n\t", + ["atrule", "Vendar"], + " foobar\r\n\t", + ["atrule", "Ve"], + " foobar\r\n\t", + ["atrule", "wann"], + " foobar\r\n\t", + ["atrule", "Wanneer"], + " foobar\r\n\t", + ["atrule", "WEN"], + " foobar\r\n\t", + ["atrule", "Wenn"], + " foobar\r\n\t", + ["atrule", "When y'all"], + " foobar\r\n\t", + ["atrule", "When"], + " foobar\r\n\t", + ["atrule", "Wtedy"], + " foobar\r\n\t", + ["atrule", "Wun"], + " foobar\r\n\t", + ["atrule", "Y'know"], + " foobar\r\n\t", + ["atrule", "Yeah nah"], + " foobar\r\n\t", + ["atrule", "Yna"], + " foobar\r\n\t", + ["atrule", "Youse know like when"], + " foobar\r\n\t", + ["atrule", "Youse know when youse got"], + " foobar\r\n\t", + ["atrule", "Y"], + " foobar\r\n\t", + ["atrule", "Za predpokladu"], + " foobar\r\n\t", + ["atrule", "Za předpokladu"], + " foobar\r\n\t", + ["atrule", "Zadani"], + " foobar\r\n\t", + ["atrule", "Zadano"], + " foobar\r\n\t", + ["atrule", "Zadan"], + " foobar\r\n\t", + ["atrule", "Zadate"], + " foobar\r\n\t", + ["atrule", "Zadato"], + " foobar\r\n\t", + ["atrule", "Zakładając"], + " foobar\r\n\t", + ["atrule", "Zaradi"], + " foobar\r\n\t", + ["atrule", "Zatati"], + " foobar\r\n\t", + ["atrule", "Þa"], + " foobar\r\n\t", + ["atrule", "Þá"], + " foobar\r\n\t", + ["atrule", "Þa þe"], + " foobar\r\n\t", + ["atrule", "Þegar"], + " foobar\r\n\t", + ["atrule", "Þurh"], + " foobar\r\n\t", + ["atrule", "Αλλά"], + " foobar\r\n\t", + ["atrule", "Δεδομένου"], + " foobar\r\n\t", + ["atrule", "Και"], + " foobar\r\n\t", + ["atrule", "Όταν"], + " foobar\r\n\t", + ["atrule", "Τότε"], + " foobar\r\n\t", + ["atrule", "А також"], + " foobar\r\n\t", + ["atrule", "Агар"], + " foobar\r\n\t", + ["atrule", "Але"], + " foobar\r\n\t", + ["atrule", "Али"], + " foobar\r\n\t", + ["atrule", "Аммо"], + " foobar\r\n\t", + ["atrule", "А"], + " foobar\r\n\t", + ["atrule", "Әгәр"], + " foobar\r\n\t", + ["atrule", "Әйтик"], + " foobar\r\n\t", + ["atrule", "Әмма"], + " foobar\r\n\t", + ["atrule", "Бирок"], + " foobar\r\n\t", + ["atrule", "Ва"], + " foobar\r\n\t", + ["atrule", "Вә"], + " foobar\r\n\t", + ["atrule", "Дадено"], + " foobar\r\n\t", + ["atrule", "Дано"], + " foobar\r\n\t", + ["atrule", "Допустим"], + " foobar\r\n\t", + ["atrule", "Если"], + " foobar\r\n\t", + ["atrule", "Задате"], + " foobar\r\n\t", + ["atrule", "Задати"], + " foobar\r\n\t", + ["atrule", "Задато"], + " foobar\r\n\t", + ["atrule", "И"], + " foobar\r\n\t", + ["atrule", "І"], + " foobar\r\n\t", + ["atrule", "К тому же"], + " foobar\r\n\t", + ["atrule", "Када"], + " foobar\r\n\t", + ["atrule", "Кад"], + " foobar\r\n\t", + ["atrule", "Когато"], + " foobar\r\n\t", + ["atrule", "Когда"], + " foobar\r\n\t", + ["atrule", "Коли"], + " foobar\r\n\t", + ["atrule", "Ләкин"], + " foobar\r\n\t", + ["atrule", "Лекин"], + " foobar\r\n\t", + ["atrule", "Нәтиҗәдә"], + " foobar\r\n\t", + ["atrule", "Нехай"], + " foobar\r\n\t", + ["atrule", "Но"], + " foobar\r\n\t", + ["atrule", "Онда"], + " foobar\r\n\t", + ["atrule", "Припустимо, що"], + " foobar\r\n\t", + ["atrule", "Припустимо"], + " foobar\r\n\t", + ["atrule", "Пусть"], + " foobar\r\n\t", + ["atrule", "Также"], + " foobar\r\n\t", + ["atrule", "Та"], + " foobar\r\n\t", + ["atrule", "Тогда"], + " foobar\r\n\t", + ["atrule", "Тоді"], + " foobar\r\n\t", + ["atrule", "То"], + " foobar\r\n\t", + ["atrule", "Унда"], + " foobar\r\n\t", + ["atrule", "Һәм"], + " foobar\r\n\t", + ["atrule", "Якщо"], + " foobar\r\n\t", + ["atrule", "אבל"], + " foobar\r\n\t", + ["atrule", "אזי"], + " foobar\r\n\t", + ["atrule", "אז"], + " foobar\r\n\t", + ["atrule", "בהינתן"], + " foobar\r\n\t", + ["atrule", "וגם"], + " foobar\r\n\t", + ["atrule", "כאשר"], + " foobar\r\n\t", + ["atrule", "آنگاه"], + " foobar\r\n\t", + ["atrule", "اذاً"], + " foobar\r\n\t", + ["atrule", "اگر"], + " foobar\r\n\t", + ["atrule", "اما"], + " foobar\r\n\t", + ["atrule", "اور"], + " foobar\r\n\t", + ["atrule", "با فرض"], + " foobar\r\n\t", + ["atrule", "بالفرض"], + " foobar\r\n\t", + ["atrule", "بفرض"], + " foobar\r\n\t", + ["atrule", "پھر"], + " foobar\r\n\t", + ["atrule", "تب"], + " foobar\r\n\t", + ["atrule", "ثم"], + " foobar\r\n\t", + ["atrule", "جب"], + " foobar\r\n\t", + ["atrule", "عندما"], + " foobar\r\n\t", + ["atrule", "فرض کیا"], + " foobar\r\n\t", + ["atrule", "لكن"], + " foobar\r\n\t", + ["atrule", "لیکن"], + " foobar\r\n\t", + ["atrule", "متى"], + " foobar\r\n\t", + ["atrule", "هنگامی"], + " foobar\r\n\t", + ["atrule", "و"], + " foobar\r\n\t", + ["atrule", "अगर"], + " foobar\r\n\t", + ["atrule", "और"], + " foobar\r\n\t", + ["atrule", "कदा"], + " foobar\r\n\t", + ["atrule", "किन्तु"], + " foobar\r\n\t", + ["atrule", "चूंकि"], + " foobar\r\n\t", + ["atrule", "जब"], + " foobar\r\n\t", + ["atrule", "तथा"], + " foobar\r\n\t", + ["atrule", "तदा"], + " foobar\r\n\t", + ["atrule", "तब"], + " foobar\r\n\t", + ["atrule", "परन्तु"], + " foobar\r\n\t", + ["atrule", "पर"], + " foobar\r\n\t", + ["atrule", "यदि"], + " foobar\r\n\t", + ["atrule", "ਅਤੇ"], + " foobar\r\n\t", + ["atrule", "ਜਦੋਂ"], + " foobar\r\n\t", + ["atrule", "ਜਿਵੇਂ ਕਿ"], + " foobar\r\n\t", + ["atrule", "ਜੇਕਰ"], + " foobar\r\n\t", + ["atrule", "ਤਦ"], + " foobar\r\n\t", + ["atrule", "ਪਰ"], + " foobar\r\n\t", + ["atrule", "అప్పుడు"], + " foobar\r\n\t", + ["atrule", "ఈ పరిస్థితిలో"], + " foobar\r\n\t", + ["atrule", "కాని"], + " foobar\r\n\t", + ["atrule", "చెప్పబడినది"], + " foobar\r\n\t", + ["atrule", "మరియు"], + " foobar\r\n\t", + ["atrule", "ಆದರೆ"], + " foobar\r\n\t", + ["atrule", "ನಂತರ"], + " foobar\r\n\t", + ["atrule", "ನೀಡಿದ"], + " foobar\r\n\t", + ["atrule", "ಮತ್ತು"], + " foobar\r\n\t", + ["atrule", "ಸ್ಥಿತಿಯನ್ನು"], + " foobar\r\n\t", + ["atrule", "กำหนดให้"], + " foobar\r\n\t", + ["atrule", "ดังนั้น"], + " foobar\r\n\t", + ["atrule", "แต่"], + " foobar\r\n\t", + ["atrule", "เมื่อ"], + " foobar\r\n\t", + ["atrule", "และ"], + " foobar\r\n\t", + ["atrule", "그러면<"], + " foobar\r\n\t", + ["atrule", "그리고<"], + " foobar\r\n\t", + ["atrule", "단<"], + " foobar\r\n\t", + ["atrule", "만약<"], + " foobar\r\n\t", + ["atrule", "만일<"], + " foobar\r\n\t", + ["atrule", "먼저<"], + " foobar\r\n\t", + ["atrule", "조건<"], + " foobar\r\n\t", + ["atrule", "하지만<"], + " foobar\r\n\t", + ["atrule", "かつ<"], + " foobar\r\n\t", + ["atrule", "しかし<"], + " foobar\r\n\t", + ["atrule", "ただし<"], + " foobar\r\n\t", + ["atrule", "ならば<"], + " foobar\r\n\t", + ["atrule", "もし<"], + " foobar\r\n\t", + ["atrule", "並且<"], + " foobar\r\n\t", + ["atrule", "但し<"], + " foobar\r\n\t", + ["atrule", "但是<"], + " foobar\r\n\t", + ["atrule", "假如<"], + " foobar\r\n\t", + ["atrule", "假定<"], + " foobar\r\n\t", + ["atrule", "假設<"], + " foobar\r\n\t", + ["atrule", "假设<"], + " foobar\r\n\t", + ["atrule", "前提<"], + " foobar\r\n\t", + ["atrule", "同时<"], + " foobar\r\n\t", + ["atrule", "同時<"], + " foobar\r\n\t", + ["atrule", "并且<"], + " foobar\r\n\t", + ["atrule", "当<"], + " foobar\r\n\t", + ["atrule", "當<"], + " foobar\r\n\t", + ["atrule", "而且<"], + " foobar\r\n\t", + ["atrule", "那么<"], + " foobar\r\n\t", + ["atrule", "那麼<"], + " foobar" +] + +---------------------------------------------------- + +Checks for at-rules in all languages. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gherkin/comment_feature.test b/docs/_style/prism-master/tests/languages/gherkin/comment_feature.test new file mode 100644 index 00000000..ce88cc95 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gherkin/comment_feature.test @@ -0,0 +1,15 @@ +# +# foo bar + # foobar + +---------------------------------------------------- + +[ + ["comment", "#"], + ["comment", "# foo bar"], + ["comment", "# foobar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gherkin/feature_feature.test b/docs/_style/prism-master/tests/languages/gherkin/feature_feature.test new file mode 100644 index 00000000..774dd363 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gherkin/feature_feature.test @@ -0,0 +1,196 @@ +Ability: foobar +baz +Ahoy matey!: +Arwedd: foobar +Aspekt: foobar +Besigheid Behoefte: foobar +Business Need: foobar +Caracteristica: foobar +Característica: foobar +Egenskab: foobar +Egenskap: foobar +Eiginleiki: foobar +Feature: foobar +Fīča: foobar +Fitur: foobar +Fonctionnalité: foobar +Fonksyonalite: foobar +Funcionalidade: foobar +Funcionalitat: foobar +Functionalitate: foobar +Funcţionalitate: foobar +Funcționalitate: foobar +Functionaliteit: foobar +Fungsi: foobar +Funkcia: foobar +Funkcija: foobar +Funkcionalitāte: foobar +Funkcionalnost: foobar +Funkcja: foobar +Funksie: foobar +Funktionalität: foobar +Funktionalitéit: foobar +Funzionalità: foobar +Hwaet: foobar +Hwæt: foobar +Jellemző: foobar +Karakteristik: foobar +laH: foobar +Lastnost: foobar +Mak: foobar +Mogucnost: foobar +Mogućnost: foobar +Moznosti: foobar +Možnosti: foobar +OH HAI: foobar +Omadus: foobar +Ominaisuus: foobar +Osobina: foobar +Özellik: foobar +perbogh: foobar +poQbogh malja': foobar +Potrzeba biznesowa: foobar +Požadavek: foobar +Požiadavka: foobar +Pretty much: foobar +Qap: foobar +Qu'meH 'ut: foobar +Savybė: foobar +Tính năng: foobar +Trajto: foobar +Vermoë: foobar +Vlastnosť: foobar +Właściwość: foobar +Značilnost: foobar +Δυνατότητα: foobar +Λειτουργία: foobar +Могућност: foobar +Мөмкинлек: foobar +Особина: foobar +Свойство: foobar +Үзенчәлеклелек: foobar +Функционал: foobar +Функционалност: foobar +Функция: foobar +Функціонал: foobar +תכונה: foobar +خاصية: foobar +خصوصیت: foobar +صلاحیت: foobar +کاروبار کی ضرورت: foobar +وِیژگی: foobar +रूप लेख: foobar +ਖਾਸੀਅਤ: foobar +ਨਕਸ਼ ਨੁਹਾਰ: foobar +ਮੁਹਾਂਦਰਾ: foobar +గుణము: foobar +ಹೆಚ್ಚಳ: foobar +ความต้องการทางธุรกิจ: foobar +ความสามารถ: foobar +โครงหลัก: foobar +기능: foobar +フィーチャ: foobar +功能: foobar +機能: foobar + +---------------------------------------------------- + +[ + ["feature", [["keyword", "Ability:"], ["important", " foobar"], "\r\nbaz\r\n"]], + ["feature", [["keyword", "Ahoy matey!:"]]], + ["feature", [["keyword", "Arwedd:"], ["important", " foobar"]]], + ["feature", [["keyword", "Aspekt:"], ["important", " foobar"]]], + ["feature", [["keyword", "Besigheid Behoefte:"], ["important", " foobar"]]], + ["feature", [["keyword", "Business Need:"], ["important", " foobar"]]], + ["feature", [["keyword", "Caracteristica:"], ["important", " foobar"]]], + ["feature", [["keyword", "Característica:"], ["important", " foobar"]]], + ["feature", [["keyword", "Egenskab:"], ["important", " foobar"]]], + ["feature", [["keyword", "Egenskap:"], ["important", " foobar"]]], + ["feature", [["keyword", "Eiginleiki:"], ["important", " foobar"]]], + ["feature", [["keyword", "Feature:"], ["important", " foobar"]]], + ["feature", [["keyword", "Fīča:"], ["important", " foobar"]]], + ["feature", [["keyword", "Fitur:"], ["important", " foobar"]]], + ["feature", [["keyword", "Fonctionnalité:"], ["important", " foobar"]]], + ["feature", [["keyword", "Fonksyonalite:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funcionalidade:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funcionalitat:"], ["important", " foobar"]]], + ["feature", [["keyword", "Functionalitate:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funcţionalitate:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funcționalitate:"], ["important", " foobar"]]], + ["feature", [["keyword", "Functionaliteit:"], ["important", " foobar"]]], + ["feature", [["keyword", "Fungsi:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funkcia:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funkcija:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funkcionalitāte:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funkcionalnost:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funkcja:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funksie:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funktionalität:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funktionalitéit:"], ["important", " foobar"]]], + ["feature", [["keyword", "Funzionalità:"], ["important", " foobar"]]], + ["feature", [["keyword", "Hwaet:"], ["important", " foobar"]]], + ["feature", [["keyword", "Hwæt:"], ["important", " foobar"]]], + ["feature", [["keyword", "Jellemző:"], ["important", " foobar"]]], + ["feature", [["keyword", "Karakteristik:"], ["important", " foobar"]]], + ["feature", [["keyword", "laH:"], ["important", " foobar"]]], + ["feature", [["keyword", "Lastnost:"], ["important", " foobar"]]], + ["feature", [["keyword", "Mak:"], ["important", " foobar"]]], + ["feature", [["keyword", "Mogucnost:"], ["important", " foobar"]]], + ["feature", [["keyword", "Mogućnost:"], ["important", " foobar"]]], + ["feature", [["keyword", "Moznosti:"], ["important", " foobar"]]], + ["feature", [["keyword", "Možnosti:"], ["important", " foobar"]]], + ["feature", [["keyword", "OH HAI:"], ["important", " foobar"]]], + ["feature", [["keyword", "Omadus:"], ["important", " foobar"]]], + ["feature", [["keyword", "Ominaisuus:"], ["important", " foobar"]]], + ["feature", [["keyword", "Osobina:"], ["important", " foobar"]]], + ["feature", [["keyword", "Özellik:"], ["important", " foobar"]]], + ["feature", [["keyword", "perbogh:"], ["important", " foobar"]]], + ["feature", [["keyword", "poQbogh malja':"], ["important", " foobar"]]], + ["feature", [["keyword", "Potrzeba biznesowa:"], ["important", " foobar"]]], + ["feature", [["keyword", "Požadavek:"], ["important", " foobar"]]], + ["feature", [["keyword", "Požiadavka:"], ["important", " foobar"]]], + ["feature", [["keyword", "Pretty much:"], ["important", " foobar"]]], + ["feature", [["keyword", "Qap:"], ["important", " foobar"]]], + ["feature", [["keyword", "Qu'meH 'ut:"], ["important", " foobar"]]], + ["feature", [["keyword", "Savybė:"], ["important", " foobar"]]], + ["feature", [["keyword", "Tính năng:"], ["important", " foobar"]]], + ["feature", [["keyword", "Trajto:"], ["important", " foobar"]]], + ["feature", [["keyword", "Vermoë:"], ["important", " foobar"]]], + ["feature", [["keyword", "Vlastnosť:"], ["important", " foobar"]]], + ["feature", [["keyword", "Właściwość:"], ["important", " foobar"]]], + ["feature", [["keyword", "Značilnost:"], ["important", " foobar"]]], + ["feature", [["keyword", "Δυνατότητα:"], ["important", " foobar"]]], + ["feature", [["keyword", "Λειτουργία:"], ["important", " foobar"]]], + ["feature", [["keyword", "Могућност:"], ["important", " foobar"]]], + ["feature", [["keyword", "Мөмкинлек:"], ["important", " foobar"]]], + ["feature", [["keyword", "Особина:"], ["important", " foobar"]]], + ["feature", [["keyword", "Свойство:"], ["important", " foobar"]]], + ["feature", [["keyword", "Үзенчәлеклелек:"], ["important", " foobar"]]], + ["feature", [["keyword", "Функционал:"], ["important", " foobar"]]], + ["feature", [["keyword", "Функционалност:"], ["important", " foobar"]]], + ["feature", [["keyword", "Функция:"], ["important", " foobar"]]], + ["feature", [["keyword", "Функціонал:"], ["important", " foobar"]]], + ["feature", [["keyword", "תכונה:"], ["important", " foobar"]]], + ["feature", [["keyword", "خاصية:"], ["important", " foobar"]]], + ["feature", [["keyword", "خصوصیت:"], ["important", " foobar"]]], + ["feature", [["keyword", "صلاحیت:"], ["important", " foobar"]]], + ["feature", [["keyword", "کاروبار کی ضرورت:"], ["important", " foobar"]]], + ["feature", [["keyword", "وِیژگی:"], ["important", " foobar"]]], + ["feature", [["keyword", "रूप लेख:"], ["important", " foobar"]]], + ["feature", [["keyword", "ਖਾਸੀਅਤ:"], ["important", " foobar"]]], + ["feature", [["keyword", "ਨਕਸ਼ ਨੁਹਾਰ:"], ["important", " foobar"]]], + ["feature", [["keyword", "ਮੁਹਾਂਦਰਾ:"], ["important", " foobar"]]], + ["feature", [["keyword", "గుణము:"], ["important", " foobar"]]], + ["feature", [["keyword", "ಹೆಚ್ಚಳ:"], ["important", " foobar"]]], + ["feature", [["keyword", "ความต้องการทางธุรกิจ:"], ["important", " foobar"]]], + ["feature", [["keyword", "ความสามารถ:"], ["important", " foobar"]]], + ["feature", [["keyword", "โครงหลัก:"], ["important", " foobar"]]], + ["feature", [["keyword", "기능:"], ["important", " foobar"]]], + ["feature", [["keyword", "フィーチャ:"], ["important", " foobar"]]], + ["feature", [["keyword", "功能:"], ["important", " foobar"]]], + ["feature", [["keyword", "機能:"], ["important", " foobar"]]] +] + +---------------------------------------------------- + +Checks for features in all languages. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gherkin/outline_feature.test b/docs/_style/prism-master/tests/languages/gherkin/outline_feature.test new file mode 100644 index 00000000..19fc54f9 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gherkin/outline_feature.test @@ -0,0 +1,11 @@ + + +---------------------------------------------------- + +[ + ["outline", ""] +] + +---------------------------------------------------- + +Checks for single outlines. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gherkin/pystring_feature.test b/docs/_style/prism-master/tests/languages/gherkin/pystring_feature.test new file mode 100644 index 00000000..17fd2b4d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gherkin/pystring_feature.test @@ -0,0 +1,20 @@ +""" +foo +bar +""" + +''' +foo +bar +''' + +---------------------------------------------------- + +[ + ["pystring", "\"\"\"\r\nfoo\r\nbar\r\n\"\"\""], + ["pystring", "'''\r\nfoo\r\nbar\r\n'''"] +] + +---------------------------------------------------- + +Checks for pystrings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gherkin/scenario_feature.test b/docs/_style/prism-master/tests/languages/gherkin/scenario_feature.test new file mode 100644 index 00000000..0979c698 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gherkin/scenario_feature.test @@ -0,0 +1,581 @@ +Abstract Scenario: foobar +Abstrakt Scenario: foobar +Achtergrond: foobar +Aer: foobar +Ær: foobar +Agtergrond: foobar +All y'all: foobar +Antecedentes: foobar +Antecedents: foobar +Atburðarás: foobar +Atburðarásir: foobar +Awww, look mate: foobar +B4: foobar +Background: foobar +Baggrund: foobar +Bakgrund: foobar +Bakgrunn: foobar +Bakgrunnur: foobar +Beispiele: foobar +Beispiller: foobar +Bối cảnh: foobar +Cefndir: foobar +Cenario: foobar +Cenário: foobar +Cenario de Fundo: foobar +Cenário de Fundo: foobar +Cenarios: foobar +Cenários: foobar +Contesto: foobar +Context: foobar +Contexte: foobar +Contexto: foobar +Conto: foobar +Contoh: foobar +Contone: foobar +Dæmi: foobar +Dasar: foobar +Dead men tell no tales: foobar +Delineacao do Cenario: foobar +Delineação do Cenário: foobar +Dis is what went down: foobar +Dữ liệu: foobar +Dyagram senaryo: foobar +Dyagram Senaryo: foobar +Egzanp: foobar +Ejemplos: foobar +Eksempler: foobar +Ekzemploj: foobar +Enghreifftiau: foobar +Esbozo do escenario: foobar +Escenari: foobar +Escenario: foobar +Esempi: foobar +Esquema de l'escenari: foobar +Esquema del escenario: foobar +Esquema do Cenario: foobar +Esquema do Cenário: foobar +Examples: foobar +EXAMPLZ: foobar +Exempel: foobar +Exemple: foobar +Exemples: foobar +Exemplos: foobar +First off: foobar +Fono: foobar +Forgatókönyv: foobar +Forgatókönyv vázlat: foobar +Fundo: foobar +Geçmiş: foobar +ghantoH: foobar +Grundlage: foobar +Hannergrond: foobar +Háttér: foobar +Heave to: foobar +Istorik: foobar +Juhtumid: foobar +Keadaan: foobar +Khung kịch bản: foobar +Khung tình huống: foobar +Kịch bản: foobar +Koncept: foobar +Konsep skenario: foobar +Kontèks: foobar +Kontekst: foobar +Kontekstas: foobar +Konteksts: foobar +Kontext: foobar +Konturo de la scenaro: foobar +Latar Belakang: foobar +lut: foobar +lut chovnatlh: foobar +lutmey: foobar +Lýsing Atburðarásar: foobar +Lýsing Dæma: foobar +Menggariskan Senario: foobar +MISHUN: foobar +MISHUN SRSLY: foobar +mo': foobar +Náčrt Scenára: foobar +Náčrt Scénáře: foobar +Náčrt Scenáru: foobar +Oris scenarija: foobar +Örnekler: foobar +Osnova: foobar +Osnova Scenára: foobar +Osnova scénáře: foobar +Osnutek: foobar +Ozadje: foobar +Paraugs: foobar +Pavyzdžiai: foobar +Példák: foobar +Piemēri: foobar +Plan du scénario: foobar +Plan du Scénario: foobar +Plan senaryo: foobar +Plan Senaryo: foobar +Plang vum Szenario: foobar +Pozadí: foobar +Pozadie: foobar +Pozadina: foobar +Príklady: foobar +Příklady: foobar +Primer: foobar +Primeri: foobar +Primjeri: foobar +Przykłady: foobar +Raamstsenaarium: foobar +Reckon it's like: foobar +Rerefons: foobar +Scenár: foobar +Scénář: foobar +Scenarie: foobar +Scenarij: foobar +Scenarijai: foobar +Scenarijaus šablonas: foobar +Scenariji: foobar +Scenārijs: foobar +Scenārijs pēc parauga: foobar +Scenarijus: foobar +Scenario: foobar +Scénario: foobar +Scenario Amlinellol: foobar +Scenario Outline: foobar +Scenario Template: foobar +Scenariomal: foobar +Scenariomall: foobar +Scenarios: foobar +Scenariu: foobar +Scenariusz: foobar +Scenaro: foobar +Schema dello scenario: foobar +Se ðe: foobar +Se the: foobar +Se þe: foobar +Senario: foobar +Senaryo: foobar +Senaryo deskripsyon: foobar +Senaryo Deskripsyon: foobar +Senaryo taslağı: foobar +Shiver me timbers: foobar +Situācija: foobar +Situai: foobar +Situasie: foobar +Situasie Uiteensetting: foobar +Skenario: foobar +Skenario konsep: foobar +Skica: foobar +Structura scenariu: foobar +Structură scenariu: foobar +Struktura scenarija: foobar +Stsenaarium: foobar +Swa: foobar +Swa hwaer swa: foobar +Swa hwær swa: foobar +Szablon scenariusza: foobar +Szenario: foobar +Szenariogrundriss: foobar +Tapaukset: foobar +Tapaus: foobar +Tapausaihio: foobar +Taust: foobar +Tausta: foobar +Template Keadaan: foobar +Template Senario: foobar +Template Situai: foobar +The thing of it is: foobar +Tình huống: foobar +Variantai: foobar +Voorbeelde: foobar +Voorbeelden: foobar +Wharrimean is: foobar +Yo-ho-ho: foobar +You'll wanna: foobar +Założenia: foobar +Παραδείγματα: foobar +Περιγραφή Σεναρίου: foobar +Σενάρια: foobar +Σενάριο: foobar +Υπόβαθρο: foobar +Кереш: foobar +Контекст: foobar +Концепт: foobar +Мисаллар: foobar +Мисоллар: foobar +Основа: foobar +Передумова: foobar +Позадина: foobar +Предистория: foobar +Предыстория: foobar +Приклади: foobar +Пример: foobar +Примери: foobar +Примеры: foobar +Рамка на сценарий: foobar +Скица: foobar +Структура сценарија: foobar +Структура сценария: foobar +Структура сценарію: foobar +Сценарий: foobar +Сценарий структураси: foobar +Сценарийның төзелеше: foobar +Сценарији: foobar +Сценарио: foobar +Сценарій: foobar +Тарих: foobar +Үрнәкләр: foobar +דוגמאות: foobar +רקע: foobar +תבנית תרחיש: foobar +תרחיש: foobar +الخلفية: foobar +الگوی سناریو: foobar +امثلة: foobar +پس منظر: foobar +زمینه: foobar +سناریو: foobar +سيناريو: foobar +سيناريو مخطط: foobar +مثالیں: foobar +منظر نامے کا خاکہ: foobar +منظرنامہ: foobar +نمونه ها: foobar +उदाहरण: foobar +परिदृश्य: foobar +परिदृश्य रूपरेखा: foobar +पृष्ठभूमि: foobar +ਉਦਾਹਰਨਾਂ: foobar +ਪਟਕਥਾ: foobar +ਪਟਕਥਾ ਢਾਂਚਾ: foobar +ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ: foobar +ਪਿਛੋਕੜ: foobar +ఉదాహరణలు: foobar +కథనం: foobar +నేపథ్యం: foobar +సన్నివేశం: foobar +ಉದಾಹರಣೆಗಳು: foobar +ಕಥಾಸಾರಾಂಶ: foobar +ವಿವರಣೆ: foobar +ಹಿನ್ನೆಲೆ: foobar +โครงสร้างของเหตุการณ์: foobar +ชุดของตัวอย่าง: foobar +ชุดของเหตุการณ์: foobar +แนวคิด: foobar +สรุปเหตุการณ์: foobar +เหตุการณ์: foobar +배경: foobar +시나리오: foobar +시나리오 개요: foobar +예: foobar +サンプル: foobar +シナリオ: foobar +シナリオアウトライン: foobar +シナリオテンプレ: foobar +シナリオテンプレート: foobar +テンプレ: foobar +例: foobar +例子: foobar +剧本: foobar +剧本大纲: foobar +劇本: foobar +劇本大綱: foobar +场景: foobar +场景大纲: foobar +場景: foobar +場景大綱: foobar +背景: foobar + +---------------------------------------------------- + +[ + ["scenario", [["keyword", "Abstract Scenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Abstrakt Scenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Achtergrond:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Aer:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Ær:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Agtergrond:"], ["important", " foobar"]]], + ["scenario", [["keyword", "All y'all:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Antecedentes:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Antecedents:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Atburðarás:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Atburðarásir:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Awww, look mate:"], ["important", " foobar"]]], + ["scenario", [["keyword", "B4:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Background:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Baggrund:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Bakgrund:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Bakgrunn:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Bakgrunnur:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Beispiele:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Beispiller:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Bối cảnh:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Cefndir:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Cenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Cenário:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Cenario de Fundo:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Cenário de Fundo:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Cenarios:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Cenários:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Contesto:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Context:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Contexte:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Contexto:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Conto:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Contoh:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Contone:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Dæmi:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Dasar:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Dead men tell no tales:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Delineacao do Cenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Delineação do Cenário:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Dis is what went down:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Dữ liệu:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Dyagram senaryo:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Dyagram Senaryo:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Egzanp:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Ejemplos:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Eksempler:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Ekzemploj:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Enghreifftiau:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Esbozo do escenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Escenari:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Escenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Esempi:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Esquema de l'escenari:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Esquema del escenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Esquema do Cenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Esquema do Cenário:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Examples:"], ["important", " foobar"]]], + ["scenario", [["keyword", "EXAMPLZ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Exempel:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Exemple:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Exemples:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Exemplos:"], ["important", " foobar"]]], + ["scenario", [["keyword", "First off:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Fono:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Forgatókönyv:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Forgatókönyv vázlat:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Fundo:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Geçmiş:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ghantoH:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Grundlage:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Hannergrond:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Háttér:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Heave to:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Istorik:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Juhtumid:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Keadaan:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Khung kịch bản:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Khung tình huống:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Kịch bản:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Koncept:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Konsep skenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Kontèks:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Kontekst:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Kontekstas:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Konteksts:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Kontext:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Konturo de la scenaro:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Latar Belakang:"], ["important", " foobar"]]], + ["scenario", [["keyword", "lut:"], ["important", " foobar"]]], + ["scenario", [["keyword", "lut chovnatlh:"], ["important", " foobar"]]], + ["scenario", [["keyword", "lutmey:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Lýsing Atburðarásar:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Lýsing Dæma:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Menggariskan Senario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "MISHUN:"], ["important", " foobar"]]], + ["scenario", [["keyword", "MISHUN SRSLY:"], ["important", " foobar"]]], + ["scenario", [["keyword", "mo':"], ["important", " foobar"]]], + ["scenario", [["keyword", "Náčrt Scenára:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Náčrt Scénáře:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Náčrt Scenáru:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Oris scenarija:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Örnekler:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Osnova:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Osnova Scenára:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Osnova scénáře:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Osnutek:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Ozadje:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Paraugs:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Pavyzdžiai:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Példák:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Piemēri:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Plan du scénario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Plan du Scénario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Plan senaryo:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Plan Senaryo:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Plang vum Szenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Pozadí:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Pozadie:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Pozadina:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Príklady:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Příklady:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Primer:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Primeri:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Primjeri:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Przykłady:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Raamstsenaarium:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Reckon it's like:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Rerefons:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenár:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scénář:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenarie:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenarij:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenarijai:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenarijaus šablonas:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenariji:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenārijs:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenārijs pēc parauga:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenarijus:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scénario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenario Amlinellol:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenario Outline:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenario Template:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenariomal:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenariomall:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenarios:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenariu:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenariusz:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Scenaro:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Schema dello scenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Se ðe:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Se the:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Se þe:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Senario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Senaryo:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Senaryo deskripsyon:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Senaryo Deskripsyon:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Senaryo taslağı:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Shiver me timbers:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Situācija:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Situai:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Situasie:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Situasie Uiteensetting:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Skenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Skenario konsep:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Skica:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Structura scenariu:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Structură scenariu:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Struktura scenarija:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Stsenaarium:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Swa:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Swa hwaer swa:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Swa hwær swa:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Szablon scenariusza:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Szenario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Szenariogrundriss:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Tapaukset:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Tapaus:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Tapausaihio:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Taust:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Tausta:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Template Keadaan:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Template Senario:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Template Situai:"], ["important", " foobar"]]], + ["scenario", [["keyword", "The thing of it is:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Tình huống:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Variantai:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Voorbeelde:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Voorbeelden:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Wharrimean is:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Yo-ho-ho:"], ["important", " foobar"]]], + ["scenario", [["keyword", "You'll wanna:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Założenia:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Παραδείγματα:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Περιγραφή Σεναρίου:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Σενάρια:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Σενάριο:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Υπόβαθρο:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Кереш:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Контекст:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Концепт:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Мисаллар:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Мисоллар:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Основа:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Передумова:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Позадина:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Предистория:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Предыстория:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Приклади:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Пример:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Примери:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Примеры:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Рамка на сценарий:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Скица:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Структура сценарија:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Структура сценария:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Структура сценарію:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Сценарий:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Сценарий структураси:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Сценарийның төзелеше:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Сценарији:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Сценарио:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Сценарій:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Тарих:"], ["important", " foobar"]]], + ["scenario", [["keyword", "Үрнәкләр:"], ["important", " foobar"]]], + ["scenario", [["keyword", "דוגמאות:"], ["important", " foobar"]]], + ["scenario", [["keyword", "רקע:"], ["important", " foobar"]]], + ["scenario", [["keyword", "תבנית תרחיש:"], ["important", " foobar"]]], + ["scenario", [["keyword", "תרחיש:"], ["important", " foobar"]]], + ["scenario", [["keyword", "الخلفية:"], ["important", " foobar"]]], + ["scenario", [["keyword", "الگوی سناریو:"], ["important", " foobar"]]], + ["scenario", [["keyword", "امثلة:"], ["important", " foobar"]]], + ["scenario", [["keyword", "پس منظر:"], ["important", " foobar"]]], + ["scenario", [["keyword", "زمینه:"], ["important", " foobar"]]], + ["scenario", [["keyword", "سناریو:"], ["important", " foobar"]]], + ["scenario", [["keyword", "سيناريو:"], ["important", " foobar"]]], + ["scenario", [["keyword", "سيناريو مخطط:"], ["important", " foobar"]]], + ["scenario", [["keyword", "مثالیں:"], ["important", " foobar"]]], + ["scenario", [["keyword", "منظر نامے کا خاکہ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "منظرنامہ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "نمونه ها:"], ["important", " foobar"]]], + ["scenario", [["keyword", "उदाहरण:"], ["important", " foobar"]]], + ["scenario", [["keyword", "परिदृश्य:"], ["important", " foobar"]]], + ["scenario", [["keyword", "परिदृश्य रूपरेखा:"], ["important", " foobar"]]], + ["scenario", [["keyword", "पृष्ठभूमि:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ਉਦਾਹਰਨਾਂ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ਪਟਕਥਾ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ਪਟਕਥਾ ਢਾਂਚਾ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ਪਿਛੋਕੜ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ఉదాహరణలు:"], ["important", " foobar"]]], + ["scenario", [["keyword", "కథనం:"], ["important", " foobar"]]], + ["scenario", [["keyword", "నేపథ్యం:"], ["important", " foobar"]]], + ["scenario", [["keyword", "సన్నివేశం:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ಉದಾಹರಣೆಗಳು:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ಕಥಾಸಾರಾಂಶ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ವಿವರಣೆ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ಹಿನ್ನೆಲೆ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "โครงสร้างของเหตุการณ์:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ชุดของตัวอย่าง:"], ["important", " foobar"]]], + ["scenario", [["keyword", "ชุดของเหตุการณ์:"], ["important", " foobar"]]], + ["scenario", [["keyword", "แนวคิด:"], ["important", " foobar"]]], + ["scenario", [["keyword", "สรุปเหตุการณ์:"], ["important", " foobar"]]], + ["scenario", [["keyword", "เหตุการณ์:"], ["important", " foobar"]]], + ["scenario", [["keyword", "배경:"], ["important", " foobar"]]], + ["scenario", [["keyword", "시나리오:"], ["important", " foobar"]]], + ["scenario", [["keyword", "시나리오 개요:"], ["important", " foobar"]]], + ["scenario", [["keyword", "예:"], ["important", " foobar"]]], + ["scenario", [["keyword", "サンプル:"], ["important", " foobar"]]], + ["scenario", [["keyword", "シナリオ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "シナリオアウトライン:"], ["important", " foobar"]]], + ["scenario", [["keyword", "シナリオテンプレ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "シナリオテンプレート:"], ["important", " foobar"]]], + ["scenario", [["keyword", "テンプレ:"], ["important", " foobar"]]], + ["scenario", [["keyword", "例:"], ["important", " foobar"]]], + ["scenario", [["keyword", "例子:"], ["important", " foobar"]]], + ["scenario", [["keyword", "剧本:"], ["important", " foobar"]]], + ["scenario", [["keyword", "剧本大纲:"], ["important", " foobar"]]], + ["scenario", [["keyword", "劇本:"], ["important", " foobar"]]], + ["scenario", [["keyword", "劇本大綱:"], ["important", " foobar"]]], + ["scenario", [["keyword", "场景:"], ["important", " foobar"]]], + ["scenario", [["keyword", "场景大纲:"], ["important", " foobar"]]], + ["scenario", [["keyword", "場景:"], ["important", " foobar"]]], + ["scenario", [["keyword", "場景大綱:"], ["important", " foobar"]]], + ["scenario", [["keyword", "背景:"], ["important", " foobar"]]] +] + +---------------------------------------------------- + +Checks for scenarios in all languages. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gherkin/string_feature.test b/docs/_style/prism-master/tests/languages/gherkin/string_feature.test new file mode 100644 index 00000000..bcb152f7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gherkin/string_feature.test @@ -0,0 +1,29 @@ +"" +"foobar" +"foobaz" +'' +'foobar' +'foobaz' + +---------------------------------------------------- + +[ + ["string", ["\"\""]], + ["string", ["\"foobar\""]], + ["string", [ + "\"foo", + ["outline", ""], + "baz\"" + ]], + ["string", ["''"]], + ["string", ["'foobar'"]], + ["string", [ + "'foo", + ["outline", ""], + "baz'" + ]] +] + +---------------------------------------------------- + +Checks for double-quoted and single-quoted strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gherkin/table_feature.test b/docs/_style/prism-master/tests/languages/gherkin/table_feature.test new file mode 100644 index 00000000..00eaef85 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gherkin/table_feature.test @@ -0,0 +1,40 @@ +Examples: foo +| start | eat | left | +| | 5 | 7 | + | 20 | 5 | 15 | + +---------------------------------------------------- + +[ + ["scenario", [["keyword", "Examples:"], ["important", " foo"]]], + ["table-head", [ + ["punctuation", "|"], + ["th", " start "], + ["punctuation", "|"], + ["th", " eat "], + ["punctuation", "|"], + ["th", " left "], + ["punctuation", "|"] + ]], + ["table-body", [ + ["punctuation", "|"], + ["outline", ""], + ["punctuation", "|"], + ["td", " 5 "], + ["punctuation", "|"], + ["td", " 7 "], + ["punctuation", "|"], + + ["punctuation", "|"], + ["td", " 20 "], + ["punctuation", "|"], + ["td", " 5 "], + ["punctuation", "|"], + ["td", " 15 "], + ["punctuation", "|"] + ]] +] + +---------------------------------------------------- + +Checks for table heads and table bodies. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/gherkin/tag_feature.test b/docs/_style/prism-master/tests/languages/gherkin/tag_feature.test new file mode 100644 index 00000000..51026ea1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/gherkin/tag_feature.test @@ -0,0 +1,17 @@ +@important +@billing @bicker @annoy + @foo + +---------------------------------------------------- + +[ + ["tag", "@important"], + ["tag", "@billing"], + ["tag", "@bicker"], + ["tag", "@annoy"], + ["tag", "@foo"] +] + +---------------------------------------------------- + +Checks for tags. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/git/command_feature.test b/docs/_style/prism-master/tests/languages/git/command_feature.test new file mode 100644 index 00000000..488f0be3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/git/command_feature.test @@ -0,0 +1,15 @@ +$ git add file.txt +foo@foobar ~ $ git diff --cached +$ git log -p -i + +---------------------------------------------------- + +[ + ["command", ["$ git add file.txt"]], + ["command", ["foo@foobar ~ $ git diff", ["parameter", " --cached"]]], + ["command", ["$ git log", ["parameter", " -p"], ["parameter", " -i"]]] +] + +---------------------------------------------------- + +Checks for git commands, with and without parameters. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/git/comment_feature.test b/docs/_style/prism-master/tests/languages/git/comment_feature.test new file mode 100644 index 00000000..c3d0358e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/git/comment_feature.test @@ -0,0 +1,17 @@ +# On branch gh-pages +# Changes to be committed: +# (use "git reset HEAD ..." to unstage) +# + +---------------------------------------------------- + +[ + ["comment", "# On branch gh-pages"], + ["comment", "# Changes to be committed:"], + ["comment", "# (use \"git reset HEAD ...\" to unstage)"], + ["comment", "#"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/git/commit_sha1_feature.test b/docs/_style/prism-master/tests/languages/git/commit_sha1_feature.test new file mode 100644 index 00000000..fbc58ed2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/git/commit_sha1_feature.test @@ -0,0 +1,15 @@ +commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09 +commit 87edc4ad8c71b95f6e46f736eb98b742859abd95 +commit 3102416a90c431400d2e2a14e707fb7fd6d9e06d + +---------------------------------------------------- + +[ + ["commit_sha1", "commit a11a14ef7e26f2ca62d4b35eac455ce636d0dc09"], + ["commit_sha1", "commit 87edc4ad8c71b95f6e46f736eb98b742859abd95"], + ["commit_sha1", "commit 3102416a90c431400d2e2a14e707fb7fd6d9e06d"] +] + +---------------------------------------------------- + +Checks for commit SHA1. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/git/coord_feature.test b/docs/_style/prism-master/tests/languages/git/coord_feature.test new file mode 100644 index 00000000..8d8c5e2b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/git/coord_feature.test @@ -0,0 +1,13 @@ +@@ -1 +1,2 @@ +@@@ -98,20 -98,12 +98,20 @@@ + +---------------------------------------------------- + +[ + ["coord", "@@ -1 +1,2 @@"], + ["coord", "@@@ -98,20 -98,12 +98,20 @@@"] +] + +---------------------------------------------------- + +Checks for coords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/git/diff_feature.test b/docs/_style/prism-master/tests/languages/git/diff_feature.test new file mode 100644 index 00000000..b93fb181 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/git/diff_feature.test @@ -0,0 +1,31 @@ +-Here's my tetx file ++Here's my text file ++And this is the second line + +––– a/web/js/lazy.js ++++ b/web/js/lazy.js + +- if (url !== null && url !== '' && typeof url !== 'undefined') { ++ if (url === null || url === '' || typeof url === 'undefined') { ++ return; ++ } ++ + +---------------------------------------------------- + +[ + ["deleted", "-Here's my tetx file"], + ["inserted", "+Here's my text file"], + ["inserted", "+And this is the second line"], + ["deleted", "––– a/web/js/lazy.js"], + ["inserted", "+++ b/web/js/lazy.js"], + ["deleted", "- if (url !== null && url !== '' && typeof url !== 'undefined') {"], + ["inserted", "+ if (url === null || url === '' || typeof url === 'undefined') {"], + ["inserted", "+ return;"], + ["inserted", "+ }"], + ["inserted", "+"] +] + +---------------------------------------------------- + +Checks for inserted and deleted lines in git diff output. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/git/string_feature.test b/docs/_style/prism-master/tests/languages/git/string_feature.test new file mode 100644 index 00000000..ebff3bf5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/git/string_feature.test @@ -0,0 +1,17 @@ +"" +"foo" +'' +'bar' + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"foo\""], + ["string", "''"], + ["string", "'bar'"] +] + +---------------------------------------------------- + +Checks for double-quoted and single-quoted strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/glsl/comment_feature.test b/docs/_style/prism-master/tests/languages/glsl/comment_feature.test new file mode 100644 index 00000000..b45a6bd5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/glsl/comment_feature.test @@ -0,0 +1,21 @@ +/**/ +/* foo +bar */ +// +// foo +// foo\ +bar + +---------------------------------------------------- + +[ + ["comment", "/**/"], + ["comment", "/* foo\r\nbar */"], + ["comment", "//"], + ["comment", "// foo"], + ["comment", "// foo\\\r\nbar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/glsl/keyword_feature.test b/docs/_style/prism-master/tests/languages/glsl/keyword_feature.test new file mode 100644 index 00000000..e07768ca --- /dev/null +++ b/docs/_style/prism-master/tests/languages/glsl/keyword_feature.test @@ -0,0 +1,263 @@ +attribute +const +uniform +varying +buffer +shared +coherent +volatile +restrict +readonly +writeonly +atomic_uint +layout +centroid +flat +smooth +noperspective +patch +sample +break +continue +do +for +while +switch +case +default +if +else +subroutine +in +out +inout +float +double +int +void +bool +true +false +invariant +precise +discard +return +mat2 mat3 mat4 +mat2x2 mat2x3 mat2x4 +mat3x2 mat3x3 mat3x4 +mat4x2 mat4x3 mat4x4 +dmat2 dmat3 dmat4 +dmat2x2 dmat2x3 dmat2x4 +dmat3x2 dmat3x3 dmat3x4 +dmat4x2 dmat4x3 dmat4x4 +vec2 vec3 vec4 +ivec2 ivec3 ivec4 +bvec2 bvec3 bvec4 +dvec2 dvec3 dvec4 +uvec2 uvec3 uvec4 +uint +lowp +mediump +highp +precision +sampler1D sampler2D sampler3D +isampler1D isampler2D isampler3D +usampler1D usampler2D usampler3D +samplerCube isamplerCube usamplerCube +sampler1DShadow sampler2DShadow +samplerCubeShadow +sampler1DArray sampler2DArray +isampler1DArray isampler2DArray +usampler1DArray usampler2DArray +sampler1DArrayShadow sampler2DArrayShadow +sampler2DRect isampler2DRect usampler2DRect +sampler2DRectShadow +samplerBuffer isamplerBuffer usamplerBuffer +sampler2DMS isampler2DMS usampler2DMS +sampler2DMSArray isampler2DMSArray usampler2DMSArray +samplerCubeArray isamplerCubeArray usamplerCubeArray +samplerCubeArrayShadow +image1D image2D image3D +iimage1D iimage2D iimage3D +uimage1D uimage2D uimage3D +image2DRect iimage2DRect uimage2DRect +imageCube iimageCube uimageCube +imageBuffer iimageBuffer uimageBuffer +image1DArray image2DArray +iimage1DArray iimage2DArray +uimage1DArray uimage2DArray +imageCubeArray iimageCubeArray uimageCubeArray +image2DMS iimage2DMS uimage2DMS +image2DMSArray iimage2DMSArray uimage2DMSArray +struct +common +partition +active +asm +class; +union +enum +typedef +template +this +resource +goto +inline +noinline +public +static +extern +external +interface; +long +short +half +fixed +unsigned +superp +input +output +hvec2 hvec3 hvec4 +fvec2 fvec3 fvec4 +sampler3DRect +filter +sizeof +cast +namespace +using + +---------------------------------------------------- + +[ + ["keyword", "attribute"], + ["keyword", "const"], + ["keyword", "uniform"], + ["keyword", "varying"], + ["keyword", "buffer"], + ["keyword", "shared"], + ["keyword", "coherent"], + ["keyword", "volatile"], + ["keyword", "restrict"], + ["keyword", "readonly"], + ["keyword", "writeonly"], + ["keyword", "atomic_uint"], + ["keyword", "layout"], + ["keyword", "centroid"], + ["keyword", "flat"], + ["keyword", "smooth"], + ["keyword", "noperspective"], + ["keyword", "patch"], + ["keyword", "sample"], + ["keyword", "break"], + ["keyword", "continue"], + ["keyword", "do"], + ["keyword", "for"], + ["keyword", "while"], + ["keyword", "switch"], + ["keyword", "case"], + ["keyword", "default"], + ["keyword", "if"], + ["keyword", "else"], + ["keyword", "subroutine"], + ["keyword", "in"], + ["keyword", "out"], + ["keyword", "inout"], + ["keyword", "float"], + ["keyword", "double"], + ["keyword", "int"], + ["keyword", "void"], + ["keyword", "bool"], + ["keyword", "true"], + ["keyword", "false"], + ["keyword", "invariant"], + ["keyword", "precise"], + ["keyword", "discard"], + ["keyword", "return"], + ["keyword", "mat2"], ["keyword", "mat3"], ["keyword", "mat4"], + ["keyword", "mat2x2"], ["keyword", "mat2x3"], ["keyword", "mat2x4"], + ["keyword", "mat3x2"], ["keyword", "mat3x3"], ["keyword", "mat3x4"], + ["keyword", "mat4x2"], ["keyword", "mat4x3"], ["keyword", "mat4x4"], + ["keyword", "dmat2"], ["keyword", "dmat3"], ["keyword", "dmat4"], + ["keyword", "dmat2x2"], ["keyword", "dmat2x3"], ["keyword", "dmat2x4"], + ["keyword", "dmat3x2"], ["keyword", "dmat3x3"], ["keyword", "dmat3x4"], + ["keyword", "dmat4x2"], ["keyword", "dmat4x3"], ["keyword", "dmat4x4"], + ["keyword", "vec2"], ["keyword", "vec3"], ["keyword", "vec4"], + ["keyword", "ivec2"], ["keyword", "ivec3"], ["keyword", "ivec4"], + ["keyword", "bvec2"], ["keyword", "bvec3"], ["keyword", "bvec4"], + ["keyword", "dvec2"], ["keyword", "dvec3"], ["keyword", "dvec4"], + ["keyword", "uvec2"], ["keyword", "uvec3"], ["keyword", "uvec4"], + ["keyword", "uint"], + ["keyword", "lowp"], + ["keyword", "mediump"], + ["keyword", "highp"], + ["keyword", "precision"], + ["keyword", "sampler1D"], ["keyword", "sampler2D"], ["keyword", "sampler3D"], + ["keyword", "isampler1D"], ["keyword", "isampler2D"], ["keyword", "isampler3D"], + ["keyword", "usampler1D"], ["keyword", "usampler2D"], ["keyword", "usampler3D"], + ["keyword", "samplerCube"], ["keyword", "isamplerCube"], ["keyword", "usamplerCube"], + ["keyword", "sampler1DShadow"], ["keyword", "sampler2DShadow"], + ["keyword", "samplerCubeShadow"], + ["keyword", "sampler1DArray"], ["keyword", "sampler2DArray"], + ["keyword", "isampler1DArray"], ["keyword", "isampler2DArray"], + ["keyword", "usampler1DArray"], ["keyword", "usampler2DArray"], + ["keyword", "sampler1DArrayShadow"], ["keyword", "sampler2DArrayShadow"], + ["keyword", "sampler2DRect"], ["keyword", "isampler2DRect"], ["keyword", "usampler2DRect"], + ["keyword", "sampler2DRectShadow"], + ["keyword", "samplerBuffer"], ["keyword", "isamplerBuffer"], ["keyword", "usamplerBuffer"], + ["keyword", "sampler2DMS"], ["keyword", "isampler2DMS"], ["keyword", "usampler2DMS"], + ["keyword", "sampler2DMSArray"], ["keyword", "isampler2DMSArray"], ["keyword", "usampler2DMSArray"], + ["keyword", "samplerCubeArray"], ["keyword", "isamplerCubeArray"], ["keyword", "usamplerCubeArray"], + ["keyword", "samplerCubeArrayShadow"], + ["keyword", "image1D"], ["keyword", "image2D"], ["keyword", "image3D"], + ["keyword", "iimage1D"], ["keyword", "iimage2D"], ["keyword", "iimage3D"], + ["keyword", "uimage1D"], ["keyword", "uimage2D"], ["keyword", "uimage3D"], + ["keyword", "image2DRect"], ["keyword", "iimage2DRect"], ["keyword", "uimage2DRect"], + ["keyword", "imageCube"], ["keyword", "iimageCube"], ["keyword", "uimageCube"], + ["keyword", "imageBuffer"], ["keyword", "iimageBuffer"], ["keyword", "uimageBuffer"], + ["keyword", "image1DArray"], ["keyword", "image2DArray"], + ["keyword", "iimage1DArray"], ["keyword", "iimage2DArray"], + ["keyword", "uimage1DArray"], ["keyword", "uimage2DArray"], + ["keyword", "imageCubeArray"], ["keyword", "iimageCubeArray"], ["keyword", "uimageCubeArray"], + ["keyword", "image2DMS"], ["keyword", "iimage2DMS"], ["keyword", "uimage2DMS"], + ["keyword", "image2DMSArray"], ["keyword", "iimage2DMSArray"], ["keyword", "uimage2DMSArray"], + ["keyword", "struct"], + ["keyword", "common"], + ["keyword", "partition"], + ["keyword", "active"], + ["keyword", "asm"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "union"], + ["keyword", "enum"], + ["keyword", "typedef"], + ["keyword", "template"], + ["keyword", "this"], + ["keyword", "resource"], + ["keyword", "goto"], + ["keyword", "inline"], + ["keyword", "noinline"], + ["keyword", "public"], + ["keyword", "static"], + ["keyword", "extern"], + ["keyword", "external"], + ["keyword", "interface"], ["punctuation", ";"], + ["keyword", "long"], + ["keyword", "short"], + ["keyword", "half"], + ["keyword", "fixed"], + ["keyword", "unsigned"], + ["keyword", "superp"], + ["keyword", "input"], + ["keyword", "output"], + ["keyword", "hvec2"], ["keyword", "hvec3"], ["keyword", "hvec4"], + ["keyword", "fvec2"], ["keyword", "fvec3"], ["keyword", "fvec4"], + ["keyword", "sampler3DRect"], + ["keyword", "filter"], + ["keyword", "sizeof"], + ["keyword", "cast"], + ["keyword", "namespace"], + ["keyword", "using"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/glsl/number_feature.test b/docs/_style/prism-master/tests/languages/glsl/number_feature.test new file mode 100644 index 00000000..20ac4d11 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/glsl/number_feature.test @@ -0,0 +1,31 @@ +0xBadFace +42 +3.14159 +3e8 +3.6e-7 +4.7E+12 +4u +42U +3.1l +42f +2.0LF + +---------------------------------------------------- + +[ + ["number", "0xBadFace"], + ["number", "42"], + ["number", "3.14159"], + ["number", "3e8"], + ["number", "3.6e-7"], + ["number", "4.7E+12"], + ["number", "4u"], + ["number", "42U"], + ["number", "3.1l"], + ["number", "42f"], + ["number", "2.0LF"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/glsl/preprocessor_feature.test b/docs/_style/prism-master/tests/languages/glsl/preprocessor_feature.test new file mode 100644 index 00000000..a720d350 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/glsl/preprocessor_feature.test @@ -0,0 +1,35 @@ +#define +#undef +#if +#ifdef +#ifndef +#else +#elif +#endif +#error +#pragma +#extension +#version +#line + +---------------------------------------------------- + +[ + ["preprocessor", "#define"], + ["preprocessor", "#undef"], + ["preprocessor", "#if"], + ["preprocessor", "#ifdef"], + ["preprocessor", "#ifndef"], + ["preprocessor", "#else"], + ["preprocessor", "#elif"], + ["preprocessor", "#endif"], + ["preprocessor", "#error"], + ["preprocessor", "#pragma"], + ["preprocessor", "#extension"], + ["preprocessor", "#version"], + ["preprocessor", "#line"] +] + +---------------------------------------------------- + +Checks for preprocessor instructions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/go/boolean_feature.test b/docs/_style/prism-master/tests/languages/go/boolean_feature.test new file mode 100644 index 00000000..1ee11926 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/go/boolean_feature.test @@ -0,0 +1,19 @@ +_ +iota +nil +true +false + +---------------------------------------------------- + +[ + ["boolean", "_"], + ["boolean", "iota"], + ["boolean", "nil"], + ["boolean", "true"], + ["boolean", "false"] +] + +---------------------------------------------------- + +Checks for all boolean values. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/go/builtin_feature.test b/docs/_style/prism-master/tests/languages/go/builtin_feature.test new file mode 100644 index 00000000..414018fe --- /dev/null +++ b/docs/_style/prism-master/tests/languages/go/builtin_feature.test @@ -0,0 +1,79 @@ +bool +byte +complex64 +complex128 +error +float32 +float64 +rune +string +int +int8 +int16 +int32 +int64 +uint +uint8 +uint16 +uint32 +uint64 +uintptr +append +cap +close +complex +copy +delete +imag +len +make +new +panic +print +println +real +recover + +---------------------------------------------------- + +[ + ["builtin", "bool"], + ["builtin", "byte"], + ["builtin", "complex64"], + ["builtin", "complex128"], + ["builtin", "error"], + ["builtin", "float32"], + ["builtin", "float64"], + ["builtin", "rune"], + ["builtin", "string"], + ["builtin", "int"], + ["builtin", "int8"], + ["builtin", "int16"], + ["builtin", "int32"], + ["builtin", "int64"], + ["builtin", "uint"], + ["builtin", "uint8"], + ["builtin", "uint16"], + ["builtin", "uint32"], + ["builtin", "uint64"], + ["builtin", "uintptr"], + ["builtin", "append"], + ["builtin", "cap"], + ["builtin", "close"], + ["builtin", "complex"], + ["builtin", "copy"], + ["builtin", "delete"], + ["builtin", "imag"], + ["builtin", "len"], + ["builtin", "make"], + ["builtin", "new"], + ["builtin", "panic"], + ["builtin", "print"], + ["builtin", "println"], + ["builtin", "real"], + ["builtin", "recover"] +] + +---------------------------------------------------- + +Checks for all builtins. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/go/keyword_feature.test b/docs/_style/prism-master/tests/languages/go/keyword_feature.test new file mode 100644 index 00000000..a2799f73 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/go/keyword_feature.test @@ -0,0 +1,59 @@ +break +case +chan +const +continue +default +defer +else +fallthrough +for +func +go +goto +if +import +interface +map +package +range +return +select +struct +switch +type +var + +---------------------------------------------------- + +[ + ["keyword", "break"], + ["keyword", "case"], + ["keyword", "chan"], + ["keyword", "const"], + ["keyword", "continue"], + ["keyword", "default"], + ["keyword", "defer"], + ["keyword", "else"], + ["keyword", "fallthrough"], + ["keyword", "for"], + ["keyword", "func"], + ["keyword", "go"], + ["keyword", "goto"], + ["keyword", "if"], + ["keyword", "import"], + ["keyword", "interface"], + ["keyword", "map"], + ["keyword", "package"], + ["keyword", "range"], + ["keyword", "return"], + ["keyword", "select"], + ["keyword", "struct"], + ["keyword", "switch"], + ["keyword", "type"], + ["keyword", "var"] +] + +---------------------------------------------------- + +Checks for all keywords \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/go/number_feature.test b/docs/_style/prism-master/tests/languages/go/number_feature.test new file mode 100644 index 00000000..f21b3e87 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/go/number_feature.test @@ -0,0 +1,43 @@ +42 +0600 +0xBadFace +170141183460469231731687303715884105727 +72.40 +072.40 +2.71828 +1.e+0 +6.67428e-11 +1E6 +0i +011i +0.i +2.71828i +1.e+0i +6.67428e-11i +1E6i + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "0600"], + ["number", "0xBadFace"], + ["number", "170141183460469231731687303715884105727"], + ["number", "72.40"], + ["number", "072.40"], + ["number", "2.71828"], + ["number", "1.e+0"], + ["number", "6.67428e-11"], + ["number", "1E6"], + ["number", "0i"], + ["number", "011i"], + ["number", "0.i"], + ["number", "2.71828i"], + ["number", "1.e+0i"], + ["number", "6.67428e-11i"], + ["number", "1E6i"] +] + +---------------------------------------------------- + +Checks for integers, floats and imaginary numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/go/operator_feature.test b/docs/_style/prism-master/tests/languages/go/operator_feature.test new file mode 100644 index 00000000..cda53861 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/go/operator_feature.test @@ -0,0 +1,27 @@ +* / % ^ ! = +*= /= %= ^= != == ++ += ++ +- -= -- +| |= || +& &= && &^ &^= +> >> >>= >= +< << <<= <= <- +:= ... + +---------------------------------------------------- + +[ + ["operator", "*"], ["operator", "/"], ["operator", "%"], ["operator", "^"], ["operator", "!"], ["operator", "="], + ["operator", "*="], ["operator", "/="], ["operator", "%="], ["operator", "^="], ["operator", "!="], ["operator", "=="], + ["operator", "+"], ["operator", "+="], ["operator", "++"], + ["operator", "-"], ["operator", "-="], ["operator", "--"], + ["operator", "|"], ["operator", "|="], ["operator", "||"], + ["operator", "&"], ["operator", "&="], ["operator", "&&"], ["operator", "&^"], ["operator", "&^="], + ["operator", ">"], ["operator", ">>"], ["operator", ">>="], ["operator", ">="], + ["operator", "<"], ["operator", "<<"], ["operator", "<<="], ["operator", "<="], ["operator", "<-"], + ["operator", ":="], ["operator", "..."] +] + +---------------------------------------------------- + +Checks for all operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/go/string_feature.test b/docs/_style/prism-master/tests/languages/go/string_feature.test new file mode 100644 index 00000000..97e3960b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/go/string_feature.test @@ -0,0 +1,37 @@ +'a' +'ä' +'本' +'\t' +'\xff' +'\u12e4' + +`abc` +`\n +\n` +"\n" +"\"" +"Hello, world!\n" +"日本語" +"\xff\u00FF" + +---------------------------------------------------- + +[ + ["string", "'a'"], + ["string", "'ä'"], + ["string", "'本'"], + ["string", "'\\t'"], + ["string", "'\\xff'"], + ["string", "'\\u12e4'"], + ["string", "`abc`"], + ["string", "`\\n\r\n\\n`"], + ["string", "\"\\n\""], + ["string", "\"\\\"\""], + ["string", "\"Hello, world!\\n\""], + ["string", "\"日本語\""], + ["string", "\"\\xff\\u00FF\""] +] + +---------------------------------------------------- + +Checks for runes and strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/graphql/attr-name_feature.test b/docs/_style/prism-master/tests/languages/graphql/attr-name_feature.test new file mode 100644 index 00000000..7f976e6d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/graphql/attr-name_feature.test @@ -0,0 +1,27 @@ +{ + zuck: user(id: 4) { + name + } +} + +---------------------------------------------------- + +[ + ["punctuation", "{"], + ["attr-name", "zuck"], + ["punctuation", ":"], + " user", + ["punctuation", "("], + ["attr-name", "id"], + ["punctuation", ":"], + ["number", "4"], + ["punctuation", ")"], + ["punctuation", "{"], + "\r\n\t\tname\r\n\t", + ["punctuation", "}"], + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for aliases, parameter names, etc. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/graphql/boolean_feature.test b/docs/_style/prism-master/tests/languages/graphql/boolean_feature.test new file mode 100644 index 00000000..4019c444 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/graphql/boolean_feature.test @@ -0,0 +1,13 @@ +true +false + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/graphql/comment_feature.test b/docs/_style/prism-master/tests/languages/graphql/comment_feature.test new file mode 100644 index 00000000..054d6023 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/graphql/comment_feature.test @@ -0,0 +1,13 @@ +# +# foobar + +---------------------------------------------------- + +[ + ["comment", "#"], + ["comment", "# foobar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/graphql/directive_feature.test b/docs/_style/prism-master/tests/languages/graphql/directive_feature.test new file mode 100644 index 00000000..ca9b7004 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/graphql/directive_feature.test @@ -0,0 +1,13 @@ +@skip +@include + +---------------------------------------------------- + +[ + ["directive", "@skip"], + ["directive", "@include"] +] + +---------------------------------------------------- + +Checks for directives \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/graphql/keyword_feature.test b/docs/_style/prism-master/tests/languages/graphql/keyword_feature.test new file mode 100644 index 00000000..06d16f2a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/graphql/keyword_feature.test @@ -0,0 +1,24 @@ +query +fragment +mutation +fragment foo on Bar +... on Foo + +---------------------------------------------------- + +[ + ["keyword", "query"], + ["keyword", "fragment"], + ["keyword", "mutation"], + ["keyword", "fragment"], + " foo ", + ["keyword", "on"], + " Bar\r\n", + ["operator", "..."], + ["keyword", "on"], + " Foo" +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/graphql/number_feature.test b/docs/_style/prism-master/tests/languages/graphql/number_feature.test new file mode 100644 index 00000000..c58cc24d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/graphql/number_feature.test @@ -0,0 +1,23 @@ +0 +42 +-5 +3.14159 +5e4 +6E-78 +0.3e+1 + +---------------------------------------------------- + +[ + ["number", "0"], + ["number", "42"], + ["number", "-5"], + ["number", "3.14159"], + ["number", "5e4"], + ["number", "6E-78"], + ["number", "0.3e+1"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/graphql/string_feature.test b/docs/_style/prism-master/tests/languages/graphql/string_feature.test new file mode 100644 index 00000000..a3d26be3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/graphql/string_feature.test @@ -0,0 +1,15 @@ +"" +"foo bar" +"foo\"bar\\baz" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"foo bar\""], + ["string", "\"foo\\\"bar\\\\baz\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/graphql/variable_feature.test b/docs/_style/prism-master/tests/languages/graphql/variable_feature.test new file mode 100644 index 00000000..642d173e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/graphql/variable_feature.test @@ -0,0 +1,13 @@ +$foo +$Foo_bar42 + +---------------------------------------------------- + +[ + ["variable", "$foo"], + ["variable", "$Foo_bar42"] +] + +---------------------------------------------------- + +Checks for variables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/groovy/annotation_feature.test b/docs/_style/prism-master/tests/languages/groovy/annotation_feature.test new file mode 100644 index 00000000..f956c527 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/annotation_feature.test @@ -0,0 +1,17 @@ +@BaseScript MyBaseClass baseScript +@DelegatesTo(EmailSpec) + +---------------------------------------------------- + +[ + ["annotation", "@BaseScript"], + " MyBaseClass baseScript\r\n", + ["annotation", "@DelegatesTo"], + ["punctuation", "("], + "EmailSpec", + ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for annotations. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/groovy/issue1049.js b/docs/_style/prism-master/tests/languages/groovy/issue1049.js new file mode 100644 index 00000000..2ce81537 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/issue1049.js @@ -0,0 +1,8 @@ +module.exports = { + '"&"': '"&amp;"', + '"&&"': '"&amp;&amp;"', + '"<"': '"&lt;"', + '"<<"': '"&lt;&lt;"', + '"&lt;"': '"&amp;lt;"', + '">"': '"&gt;"', +}; diff --git a/docs/_style/prism-master/tests/languages/groovy/keyword_feature.test b/docs/_style/prism-master/tests/languages/groovy/keyword_feature.test new file mode 100644 index 00000000..57b7e164 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/keyword_feature.test @@ -0,0 +1,61 @@ +as def in abstract +assert boolean break +byte case catch char +class; +const continue +default do double else +enum +extends; +final +finally float for goto +if +implements; +import +instanceof; +int +interface; +long native +new; +package private protected +public return short +static strictfp super +switch synchronized this +throw throws +trait; +transient +try void volatile while + +---------------------------------------------------- + +[ + ["keyword", "as"], ["keyword", "def"], ["keyword", "in"], ["keyword", "abstract"], + ["keyword", "assert"], ["keyword", "boolean"], ["keyword", "break"], + ["keyword", "byte"], ["keyword", "case"], ["keyword", "catch"], ["keyword", "char"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "const"], ["keyword", "continue"], + ["keyword", "default"], ["keyword", "do"], ["keyword", "double"], ["keyword", "else"], + ["keyword", "enum"], + ["keyword", "extends"], ["punctuation", ";"], + ["keyword", "final"], + ["keyword", "finally"], ["keyword", "float"], ["keyword", "for"], ["keyword", "goto"], + ["keyword", "if"], + ["keyword", "implements"], ["punctuation", ";"], + ["keyword", "import"], + ["keyword", "instanceof"], ["punctuation", ";"], + ["keyword", "int"], + ["keyword", "interface"], ["punctuation", ";"], + ["keyword", "long"], ["keyword", "native"], + ["keyword", "new"], ["punctuation", ";"], + ["keyword", "package"], ["keyword", "private"], ["keyword", "protected"], + ["keyword", "public"], ["keyword", "return"], ["keyword", "short"], + ["keyword", "static"], ["keyword", "strictfp"], ["keyword", "super"], + ["keyword", "switch"], ["keyword", "synchronized"], ["keyword", "this"], + ["keyword", "throw"], ["keyword", "throws"], + ["keyword", "trait"], ["punctuation", ";"], + ["keyword", "transient"], + ["keyword", "try"], ["keyword", "void"], ["keyword", "volatile"], ["keyword", "while"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/groovy/number_feature.test b/docs/_style/prism-master/tests/languages/groovy/number_feature.test new file mode 100644 index 00000000..bd12ff9d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/number_feature.test @@ -0,0 +1,43 @@ +0b0110 +0b0110_1111_0000 +0b01G 0b01L 0b01I +0b01D 0b01F + +0xBABE +0xBad_Face +0x1.8p1 +0xa.fp-2 + +42_000 +3.14_15_9 +1.2e3 +3E+1 +4E-2 +42g 42l 42i +42d 42f + +---------------------------------------------------- + +[ + ["number", "0b0110"], + ["number", "0b0110_1111_0000"], + ["number", "0b01G"], ["number", "0b01L"], ["number", "0b01I"], + ["number", "0b01D"], ["number", "0b01F"], + + ["number", "0xBABE"], + ["number", "0xBad_Face"], + ["number", "0x1.8p1"], + ["number", "0xa.fp-2"], + + ["number", "42_000"], + ["number", "3.14_15_9"], + ["number", "1.2e3"], + ["number", "3E+1"], + ["number", "4E-2"], + ["number", "42g"], ["number", "42l"], ["number", "42i"], + ["number", "42d"], ["number", "42f"] +] + +---------------------------------------------------- + +Checks for binary, hexadecimal and decimal numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/groovy/operator_feature.test b/docs/_style/prism-master/tests/languages/groovy/operator_feature.test new file mode 100644 index 00000000..cce07a99 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/operator_feature.test @@ -0,0 +1,45 @@ +~ += == =~ ==~ +? ?. ?: +* ** *. *= **= +. .@ .& +5..8 +5..<8 +- -- -= -> ++ ++ += +! != +< << <<= <= <=> +> >> >>> >>= >>>= >= +& && &= +| || |= +/ +/= +^ ^= +% %= + +---------------------------------------------------- + +[ + ["operator", "~"], + ["operator", "="], ["operator", "=="], ["operator", "=~"], ["operator", "==~"], + ["operator", "?"], ["operator", "?."], ["operator", "?:"], + ["operator", "*"], ["operator", "**"], ["operator", "*."], ["operator", "*="], ["operator", "**="], + ["operator", "."], ["operator", ".@"], ["operator", ".&"], + ["number", "5"], ["operator", ".."], ["number", "8"], + ["number", "5"], ["operator", "..<"], ["number", "8"], + ["operator", "-"], ["operator", "--"], ["operator", "-="], ["operator", "->"], + ["operator", "+"], ["operator", "++"], ["operator", "+="], + ["operator", "!"], ["operator", "!="], + ["operator", "<"], ["operator", "<<"], ["operator", "<<="], ["operator", "<="], ["operator", "<=>"], + ["operator", ">"], ["operator", ">>"], ["operator", ">>>"], ["operator", ">>="], ["operator", ">>>="], ["operator", ">="], + ["operator", "&"], ["operator", "&&"], ["operator", "&="], + ["operator", "|"], ["operator", "||"], ["operator", "|="], + ["operator", "/"], + ["operator", "/="], + ["operator", "^"], ["operator", "^="], + ["operator", "%"], ["operator", "%="] +] + +---------------------------------------------------- + +Checks for all operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/groovy/shebang_feature.test b/docs/_style/prism-master/tests/languages/groovy/shebang_feature.test new file mode 100644 index 00000000..c5806ebb --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/shebang_feature.test @@ -0,0 +1,13 @@ +#!foobar +#!/usr/bin/env groovy + +---------------------------------------------------- + +[ + ["shebang", "#!foobar"], + ["shebang", "#!/usr/bin/env groovy"] +] + +---------------------------------------------------- + +Check for shebang comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/groovy/spock-block_feature.test b/docs/_style/prism-master/tests/languages/groovy/spock-block_feature.test new file mode 100644 index 00000000..5cc72fe8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/spock-block_feature.test @@ -0,0 +1,25 @@ +setup: +given: +when: +then: +and: +cleanup: +expect: +where: + +---------------------------------------------------- + +[ + ["spock-block", "setup:"], + ["spock-block", "given:"], + ["spock-block", "when:"], + ["spock-block", "then:"], + ["spock-block", "and:"], + ["spock-block", "cleanup:"], + ["spock-block", "expect:"], + ["spock-block", "where:"] +] + +---------------------------------------------------- + +Checks for all spock blocks. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/groovy/string-interpolation_feature.js b/docs/_style/prism-master/tests/languages/groovy/string-interpolation_feature.js new file mode 100644 index 00000000..ddecdfd7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/string-interpolation_feature.js @@ -0,0 +1,28 @@ +module.exports = { + // Double quoted: interpolation + '"$foo"': '"$foo"', + '"${42}"': '"${42}"', + // Triple double quoted: interpolation + '"""$foo"""': '"""$foo"""', + '"""${42}"""': '"""${42}"""', + // Slashy string: interpolation + '/$foo/': '/$foo/', + '/${42}/': '/${42}/', + // Dollar slashy string: interpolation + '$/$foo/$': '$/$foo/$', + '$/${42}/$': '$/${42}/$', + + // Double quoted: no interpolation (escaped) + '"\\$foo \\${42}"': '"\\$foo \\${42}"', + // Triple double quoted: no interpolation (escaped) + '"""\\$foo \\${42}"""': '"""\\$foo \\${42}"""', + // Slashy string: no interpolation (escaped) + '/\\$foo \\${42}/': '/\\$foo \\${42}/', + // Dollar slashy string: no interpolation (escaped) + '$/$$foo $${42}/$': '$/$$foo $${42}/$', + + // Single quoted string: no interpolation + '\'$foo ${42}\'': '\'$foo ${42}\'', + // Triple single quoted string: no interpolation + '\'\'\'$foo ${42}\'\'\'': '\'\'\'$foo ${42}\'\'\'' +}; \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/groovy/string_feature.test b/docs/_style/prism-master/tests/languages/groovy/string_feature.test new file mode 100644 index 00000000..639db825 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/groovy/string_feature.test @@ -0,0 +1,60 @@ +"""""" +"""foo""" +"""foo +bar""" + +'''''' +'''foo''' +'''foo +bar''' + +"" +"fo\"o" +'' +'fo\'o' + +/foo/ +/fo\/o/ + +$/fo$/$o/$ +$/foo +bar/$ +"foo /* comment */ bar" +'foo // bar' +'''foo +/* comment */ +bar''' +"""foo +// comment +bar""" + +---------------------------------------------------- + +[ + ["string", "\"\"\"\"\"\""], + ["string", "\"\"\"foo\"\"\""], + ["string", "\"\"\"foo\r\nbar\"\"\""], + ["string", "''''''"], + ["string", "'''foo'''"], + ["string", "'''foo\r\nbar'''"], + + ["string", "\"\""], + ["string", "\"fo\\\"o\""], + ["string", "''"], + ["string", "'fo\\'o'"], + + ["string", "/foo/"], + ["string", "/fo\\/o/"], + + ["string", "$/fo$/$o/$"], + ["string", "$/foo\r\nbar/$"], + ["string", "\"foo /* comment */ bar\""], + ["string", "'foo // bar'"], + ["string", "'''foo\r\n/* comment */\r\nbar'''"], + ["string", "\"\"\"foo\r\n// comment\r\nbar\"\"\""] +] + +---------------------------------------------------- + +Checks for single quoted, triple single quoted, double quoted, +triple double quoted, slashy and dollar slashy strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haml/code_feature.test b/docs/_style/prism-master/tests/languages/haml/code_feature.test new file mode 100644 index 00000000..51315e62 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haml/code_feature.test @@ -0,0 +1,19 @@ +~ 42 +- 42 += 42 +&= 42 +!= 42 + +---------------------------------------------------- + +[ + ["punctuation", "~"], ["code", [["number", "42"]]], + ["punctuation", "-"], ["code", [["number", "42"]]], + ["punctuation", "="], ["code", [["number", "42"]]], + ["punctuation", "&="], ["code", [["number", "42"]]], + ["punctuation", "!="], ["code", [["number", "42"]]] +] + +---------------------------------------------------- + +Checks for single-line code. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haml/doctype_feature.test b/docs/_style/prism-master/tests/languages/haml/doctype_feature.test new file mode 100644 index 00000000..5f5a731b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haml/doctype_feature.test @@ -0,0 +1,15 @@ +!!! +!!! 5 +!!! Strict + +---------------------------------------------------- + +[ + ["doctype", "!!!"], + ["doctype", "!!! 5"], + ["doctype", "!!! Strict"] +] + +---------------------------------------------------- + +Checks for doctypes. diff --git a/docs/_style/prism-master/tests/languages/haml/interpolation_feature.test b/docs/_style/prism-master/tests/languages/haml/interpolation_feature.test new file mode 100644 index 00000000..ed13c87a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haml/interpolation_feature.test @@ -0,0 +1,21 @@ +#{ 42 } +#{ "foobar" } + +---------------------------------------------------- + +[ + ["interpolation", [ + ["delimiter", "#{"], + ["number", "42"], + ["delimiter", "}"] + ]], + ["interpolation", [ + ["delimiter", "#{"], + ["string", ["\"foobar\""]], + ["delimiter", "}"] + ]] +] + +---------------------------------------------------- + +Checks for interpolation in plain text. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haml/multiline-code_feature.test b/docs/_style/prism-master/tests/languages/haml/multiline-code_feature.test new file mode 100644 index 00000000..06cb2b43 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haml/multiline-code_feature.test @@ -0,0 +1,58 @@ + ~ 1, + 1, + 1 +~ 2 | + 2 | + 2 | + +- 3, + 3, + 3 + - 4 | + 4 | + 4 | + + = 5, + 5, + 5 += 6 | + 6 | + 6 | + +&= 7, + 7, + 7 + &= 8 | + 8 | + 8 | + +!= 9, + 9, + 9 +!= 10 | + 10 | + 10 | + +---------------------------------------------------- + +[ + ["punctuation", "~"], ["multiline-code", [["number", "1"], ["punctuation", ","], ["number", "1"], ["punctuation", ","], ["number", "1"]]], + ["punctuation", "~"], ["multiline-code", [["number", "2"], ["operator", "|"], ["number", "2"], ["operator", "|"], ["number", "2"], ["operator", "|"]]], + + ["punctuation", "-"], ["multiline-code", [["number", "3"], ["punctuation", ","], ["number", "3"], ["punctuation", ","], ["number", "3"]]], + ["punctuation", "-"], ["multiline-code", [["number", "4"], ["operator", "|"], ["number", "4"], ["operator", "|"], ["number", "4"], ["operator", "|"]]], + + ["punctuation", "="], ["multiline-code", [["number", "5"], ["punctuation", ","], ["number", "5"], ["punctuation", ","], ["number", "5"]]], + ["punctuation", "="], ["multiline-code", [["number", "6"], ["operator", "|"], ["number", "6"], ["operator", "|"], ["number", "6"], ["operator", "|"]]], + + ["punctuation", "&="], ["multiline-code", [["number", "7"], ["punctuation", ","], ["number", "7"], ["punctuation", ","], ["number", "7"]]], + ["punctuation", "&="], ["multiline-code", [["number", "8"], ["operator", "|"], ["number", "8"], ["operator", "|"], ["number", "8"], ["operator", "|"]]], + + ["punctuation", "!="], ["multiline-code", [["number", "9"], ["punctuation", ","], ["number", "9"], ["punctuation", ","], ["number", "9"]]], + ["punctuation", "!="], ["multiline-code", [["number", "10"], ["operator", "|"], ["number", "10"], ["operator", "|"], ["number", "10"], ["operator", "|"]]] +] + +---------------------------------------------------- + +Checks for inline code, with all possible prefixes, some not indented, some +indented with two spaces, some indented with one tab. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haml/multiline-comment_feature.test b/docs/_style/prism-master/tests/languages/haml/multiline-comment_feature.test new file mode 100644 index 00000000..809aaffa --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haml/multiline-comment_feature.test @@ -0,0 +1,46 @@ +/ + +/ foo + +/foo + bar + + /foo + bar + + /foo + bar + +-# + +-# foo + +-#foo + bar + + -#foo + bar + + -#foo + bar + +---------------------------------------------------- + +[ + ["multiline-comment", "/"], + ["multiline-comment", "/ foo"], + ["multiline-comment", "/foo\r\n bar"], + ["multiline-comment", "/foo\r\n bar"], + ["multiline-comment", "/foo\r\n\t bar"], + + ["multiline-comment", "-#"], + ["multiline-comment", "-# foo"], + ["multiline-comment", "-#foo\r\n bar"], + ["multiline-comment", "-#foo\r\n bar"], + ["multiline-comment", "-#foo\r\n\t bar"] +] + +---------------------------------------------------- + +Checks for multi-line comments, not indented, indented with two spaces and +indented with one tab. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haml/tag_feature.test b/docs/_style/prism-master/tests/languages/haml/tag_feature.test new file mode 100644 index 00000000..a1e0c0de --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haml/tag_feature.test @@ -0,0 +1,161 @@ +%one + %two + +%div#things +%div.articles +%div.article.title + +%script{:type => "text/javascript", + :src => "javascripts/script_#{42}"} + +%div{:id => [@item.type, @item.number]} + +%a(title=@title href=href) +%input(selected) + +%html{html_attrs('fr-fr')} + +%div[@user, :greeting] + %bar[290]/ + +%div#Article.article.entry{:id => @article.number} + +#collection + .item + +%br/ +%blockquote< +%img> + +---------------------------------------------------- + +[ + ["tag", ["%one"]], + ["tag", ["%two"]], + + ["tag", ["%div#things"]], + ["tag", ["%div.articles"]], + ["tag", ["%div.article.title"]], + + ["tag", [ + "%script", + ["attributes", [ + ["punctuation", "{"], + ["symbol", ":type"], + ["operator", "="], ["operator", ">"], + ["string", ["\"text/javascript\""]], + ["punctuation", ","], + ["symbol", ":src"], + ["operator", "="], ["operator", ">"], + ["string", [ + "\"javascripts/script_", + ["interpolation", [ + ["delimiter", "#{"], + ["number", "42"], + ["delimiter", "}"] + ]], + "\"" + ]], + ["punctuation", "}"] + ]] + ]], + + ["tag", [ + "%div", + ["attributes", [ + ["punctuation", "{"], + ["symbol", ":id"], + ["operator", "="], ["operator", ">"], + ["punctuation", "["], + ["variable", "@item"], + ["punctuation", "."], + "type", + ["punctuation", ","], + ["variable", "@item"], + ["punctuation", "."], + "number", + ["punctuation", "]"], + ["punctuation", "}"] + ]] + ]], + + ["tag", [ + "%a", + ["attributes", [ + ["punctuation", "("], + ["attr-name", "title"], + ["punctuation", "="], + ["attr-value", "@title"], + ["attr-name", "href"], + ["punctuation", "="], + ["attr-value", "href"], + ["punctuation", ")"] + ]] + ]], + ["tag", [ + "%input", + ["attributes", [ + ["punctuation", "("], + ["attr-name", "selected"], + ["punctuation", ")"] + ]] + ]], + + ["tag", [ + "%html", + ["attributes", [ + ["punctuation", "{"], + "html_attrs", + ["punctuation", "("], + ["string", ["'fr-fr'"]], + ["punctuation", ")"], + ["punctuation", "}"] + ]] + ]], + + ["tag", [ + "%div", + ["attributes", [ + ["punctuation", "["], + ["variable", "@user"], + ["punctuation", ","], + ["symbol", ":greeting"], + ["punctuation", "]"] + ]] + ]], + ["tag", [ + "%bar", + ["attributes", [ + ["punctuation", "["], + ["number", "290"], + ["punctuation", "]"] + ]], + "/" + ]], + + ["tag", [ + "%div#Article.article.entry", + ["attributes", [ + ["punctuation", "{"], + ["symbol", ":id"], + ["operator", "="], ["operator", ">"], + ["variable", "@article"], + ["punctuation", "."], + "number", + ["punctuation", "}"] + ]] + ]], + + ["tag", ["#collection"]], + ["tag", [".item"]], + + ["tag", ["%br/"]], + ["tag", ["%blockquote", ["punctuation", "<"]]], + ["tag", ["%img", ["punctuation", ">"]]] +] + +---------------------------------------------------- + +Checks for tags: basic element names, attributes, html-style attributes, +attribute methods, boolean attributes, class and id shortcuts, +implicit div elements, empty tags and whitespace removal. diff --git a/docs/_style/prism-master/tests/languages/handlebars+pug/handlebars_inclusion.test b/docs/_style/prism-master/tests/languages/handlebars+pug/handlebars_inclusion.test new file mode 100644 index 00000000..c69751fd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/handlebars+pug/handlebars_inclusion.test @@ -0,0 +1,15 @@ +:handlebars + {{!comment}} + +---------------------------------------------------- + +[ + ["filter-handlebars", [ + ["filter-name", ":handlebars"], + ["comment", "{{!comment}}"] + ]] +] + +---------------------------------------------------- + +Checks for handlebars filter in Jade. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/handlebars/block_feature.test b/docs/_style/prism-master/tests/languages/handlebars/block_feature.test new file mode 100644 index 00000000..dd2c74e9 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/handlebars/block_feature.test @@ -0,0 +1,23 @@ +{{#each comments}}{{/each}} +{{~#if isActive~}}{{~/if~}} + +---------------------------------------------------- + +[ + ["handlebars", [ + ["delimiter", "{{"], ["block", "#each"], ["variable", "comments"], ["delimiter", "}}"] + ]], + ["handlebars", [ + ["delimiter", "{{"], ["block", "/each"], ["delimiter", "}}"] + ]], + ["handlebars", [ + ["delimiter", "{{"], ["punctuation", "~"], ["block", "#if"], ["variable", "isActive"], ["punctuation", "~"], ["delimiter", "}}"] + ]], + ["handlebars", [ + ["delimiter", "{{"], ["punctuation", "~"], ["block", "/if"], ["punctuation", "~"], ["delimiter", "}}"] + ]] +] + +---------------------------------------------------- + +Checks for block helpers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/handlebars/boolean_feature.test b/docs/_style/prism-master/tests/languages/handlebars/boolean_feature.test new file mode 100644 index 00000000..1f252a14 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/handlebars/boolean_feature.test @@ -0,0 +1,17 @@ +{{ true }} +{{{ false }}} + +---------------------------------------------------- + +[ + ["handlebars", [ + ["delimiter", "{{"], ["boolean", "true"], ["delimiter", "}}"] + ]], + ["handlebars", [ + ["delimiter", "{{{"], ["boolean", "false"], ["delimiter", "}}}"] + ]] +] + +---------------------------------------------------- + +Checks for all booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/handlebars/comment_feature.test b/docs/_style/prism-master/tests/languages/handlebars/comment_feature.test new file mode 100644 index 00000000..c0fffb9f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/handlebars/comment_feature.test @@ -0,0 +1,19 @@ +{{! foobar}} +{{!-- foo bar baz --}} +{{! foo +bar }} +{{!-- foo +bar --}} + +---------------------------------------------------- + +[ + ["handlebars", [["comment", "{{! foobar}}"]]], + ["handlebars", [["comment", "{{!-- foo bar baz --}}"]]], + ["handlebars", [["comment", "{{! foo\r\nbar }}"]]], + ["handlebars", [["comment", "{{!-- foo\r\nbar --}}"]]] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/handlebars/handlebars_in_markup_feature.test b/docs/_style/prism-master/tests/languages/handlebars/handlebars_in_markup_feature.test new file mode 100644 index 00000000..d9591ba4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/handlebars/handlebars_in_markup_feature.test @@ -0,0 +1,59 @@ +
        {{{intro}}}
        +
        +___HANDLEBARS1___{{{intro}}} +{{!
        }} + +---------------------------------------------------- + +[ + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "div" + ]], + ["punctuation", ">"] + ]], + ["handlebars", [ + ["delimiter", "{{{"], + ["variable", "intro"], + ["delimiter", "}}}"] + ]], + ["tag", [ + ["tag", [ + ["punctuation", ""] + ]], + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "div" + ]], + ["attr-name", ["class"]], + ["attr-value", [ + ["punctuation", "="], + ["punctuation", "\""], + ["handlebars", [ + ["delimiter", "{{"], + ["variable", "foo"], + ["delimiter", "}}"] + ]], + ["punctuation", "\""] + ]], + ["punctuation", ">"] + ]], + "\r\n___HANDLEBARS1___", + ["handlebars", [ + ["delimiter", "{{{"], + ["variable", "intro"], + ["delimiter", "}}}"] + ]], + ["handlebars", [ + ["comment", "{{!
        }}"] + ]] +] + +---------------------------------------------------- + +Checks for Handlebars in Markup. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/handlebars/number_feature.test b/docs/_style/prism-master/tests/languages/handlebars/number_feature.test new file mode 100644 index 00000000..aa894ec5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/handlebars/number_feature.test @@ -0,0 +1,29 @@ +{{ 0xBadFace }} +{{{ 42 }}} +{{{ 4e2 }}} +{{ 3.5e+1 }} +{{ 0.15e-9 }} + +---------------------------------------------------- + +[ + ["handlebars", [ + ["delimiter", "{{"], ["number", "0xBadFace"], ["delimiter", "}}"] + ]], + ["handlebars", [ + ["delimiter", "{{{"], ["number", "42"], ["delimiter", "}}}"] + ]], + ["handlebars", [ + ["delimiter", "{{{"], ["number", "4e2"], ["delimiter", "}}}"] + ]], + ["handlebars", [ + ["delimiter", "{{"], ["number", "3.5e+1"], ["delimiter", "}}"] + ]], + ["handlebars", [ + ["delimiter", "{{"], ["number", "0.15e-9"], ["delimiter", "}}"] + ]] +] + +---------------------------------------------------- + +Checks for decimal and hexadecimal numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/handlebars/string_feature.test b/docs/_style/prism-master/tests/languages/handlebars/string_feature.test new file mode 100644 index 00000000..f9f9d707 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/handlebars/string_feature.test @@ -0,0 +1,25 @@ +{{ "" }} +{{{''}}} +{{{"foobar"}}} +{{ 'foobar' }} + +---------------------------------------------------- + +[ + ["handlebars", [ + ["delimiter", "{{"], ["string", "\"\""], ["delimiter", "}}"] + ]], + ["handlebars", [ + ["delimiter", "{{{"], ["string", "''"], ["delimiter", "}}}"] + ]], + ["handlebars", [ + ["delimiter", "{{{"], ["string", "\"foobar\""], ["delimiter", "}}}"] + ]], + ["handlebars", [ + ["delimiter", "{{"], ["string", "'foobar'"], ["delimiter", "}}"] + ]] +] + +---------------------------------------------------- + +Checks for strings \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/builtin_feature.test b/docs/_style/prism-master/tests/languages/haskell/builtin_feature.test new file mode 100644 index 00000000..c50ca40b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/builtin_feature.test @@ -0,0 +1,137 @@ +abs acos acosh all and +any appendFile approxRational +asTypeOf asin asinh atan +atan2 atanh basicIORun break +catch ceiling chr compare +concat concatMap const +cos cosh curry cycle +decodeFloat denominator +digitToInt div divMod +drop dropWhile either +elem encodeFloat enumFrom +enumFromThen enumFromThenTo +enumFromTo error even exp +exponent fail filter flip +floatDigits floatRadix +floatRange floor fmap +foldl foldl1 foldr foldr1 +fromDouble fromEnum fromInt +fromInteger fromIntegral +fromRational fst gcd +getChar getContents getLine +group head id inRange index +init intToDigit interact +ioError isAlpha isAlphaNum +isAscii isControl isDenormalized +isDigit isHexDigit isIEEE +isInfinite isLower isNaN +isNegativeZero isOctDigit +isPrint isSpace isUpper iterate +last lcm length lex +lexDigits lexLitChar lines +log logBase lookup map +mapM mapM_ max maxBound +maximum maybe min minBound +minimum mod negate not +notElem null numerator odd +or ord otherwise pack pi +pred primExitWith print +product properFraction +putChar putStr putStrLn quot +quotRem range rangeSize read +readDec readFile readFloat readHex +readIO readInt readList +readLitChar readLn readOct +readParen readSigned reads +readsPrec realToFrac recip +rem repeat replicate return +reverse round scaleFloat +scanl scanl1 scanr scanr1 +seq sequence sequence_ show +showChar showInt showList +showLitChar showParen showSigned +showString shows showsPrec +significand signum sin sinh +snd sort span splitAt sqrt +subtract succ sum tail take +takeWhile tan tanh threadToIOResult +toEnum toInt toInteger +toLower toRational toUpper +truncate uncurry undefined +unlines until unwords +unzip unzip3 userError words +writeFile zip zip3 zipWith +zipWith3 + +---------------------------------------------------- + +[ + ["builtin", "abs"], ["builtin", "acos"], ["builtin", "acosh"], ["builtin", "all"], ["builtin", "and"], + ["builtin", "any"], ["builtin", "appendFile"], ["builtin", "approxRational"], + ["builtin", "asTypeOf"], ["builtin", "asin"], ["builtin", "asinh"], ["builtin", "atan"], + ["builtin", "atan2"], ["builtin", "atanh"], ["builtin", "basicIORun"], ["builtin", "break"], + ["builtin", "catch"], ["builtin", "ceiling"], ["builtin", "chr"], ["builtin", "compare"], + ["builtin", "concat"], ["builtin", "concatMap"], ["builtin", "const"], + ["builtin", "cos"], ["builtin", "cosh"], ["builtin", "curry"], ["builtin", "cycle"], + ["builtin", "decodeFloat"], ["builtin", "denominator"], + ["builtin", "digitToInt"], ["builtin", "div"], ["builtin", "divMod"], + ["builtin", "drop"], ["builtin", "dropWhile"], ["builtin", "either"], + ["builtin", "elem"], ["builtin", "encodeFloat"], ["builtin", "enumFrom"], + ["builtin", "enumFromThen"], ["builtin", "enumFromThenTo"], + ["builtin", "enumFromTo"], ["builtin", "error"], ["builtin", "even"], ["builtin", "exp"], + ["builtin", "exponent"], ["builtin", "fail"], ["builtin", "filter"], ["builtin", "flip"], + ["builtin", "floatDigits"], ["builtin", "floatRadix"], + ["builtin", "floatRange"], ["builtin", "floor"], ["builtin", "fmap"], + ["builtin", "foldl"], ["builtin", "foldl1"], ["builtin", "foldr"], ["builtin", "foldr1"], + ["builtin", "fromDouble"], ["builtin", "fromEnum"], ["builtin", "fromInt"], + ["builtin", "fromInteger"], ["builtin", "fromIntegral"], + ["builtin", "fromRational"], ["builtin", "fst"], ["builtin", "gcd"], + ["builtin", "getChar"], ["builtin", "getContents"], ["builtin", "getLine"], + ["builtin", "group"], ["builtin", "head"], ["builtin", "id"], ["builtin", "inRange"], ["builtin", "index"], + ["builtin", "init"], ["builtin", "intToDigit"], ["builtin", "interact"], + ["builtin", "ioError"], ["builtin", "isAlpha"], ["builtin", "isAlphaNum"], + ["builtin", "isAscii"], ["builtin", "isControl"], ["builtin", "isDenormalized"], + ["builtin", "isDigit"], ["builtin", "isHexDigit"], ["builtin", "isIEEE"], + ["builtin", "isInfinite"], ["builtin", "isLower"], ["builtin", "isNaN"], + ["builtin", "isNegativeZero"], ["builtin", "isOctDigit"], + ["builtin", "isPrint"], ["builtin", "isSpace"], ["builtin", "isUpper"], ["builtin", "iterate"], + ["builtin", "last"], ["builtin", "lcm"], ["builtin", "length"], ["builtin", "lex"], + ["builtin", "lexDigits"], ["builtin", "lexLitChar"], ["builtin", "lines"], + ["builtin", "log"], ["builtin", "logBase"], ["builtin", "lookup"], ["builtin", "map"], + ["builtin", "mapM"], ["builtin", "mapM_"], ["builtin", "max"], ["builtin", "maxBound"], + ["builtin", "maximum"], ["builtin", "maybe"], ["builtin", "min"], ["builtin", "minBound"], + ["builtin", "minimum"], ["builtin", "mod"], ["builtin", "negate"], ["builtin", "not"], + ["builtin", "notElem"], ["builtin", "null"], ["builtin", "numerator"], ["builtin", "odd"], + ["builtin", "or"], ["builtin", "ord"], ["builtin", "otherwise"], ["builtin", "pack"], ["builtin", "pi"], + ["builtin", "pred"], ["builtin", "primExitWith"], ["builtin", "print"], + ["builtin", "product"], ["builtin", "properFraction"], + ["builtin", "putChar"], ["builtin", "putStr"], ["builtin", "putStrLn"], ["builtin", "quot"], + ["builtin", "quotRem"], ["builtin", "range"], ["builtin", "rangeSize"], ["builtin", "read"], + ["builtin", "readDec"], ["builtin", "readFile"], ["builtin", "readFloat"], ["builtin", "readHex"], + ["builtin", "readIO"], ["builtin", "readInt"], ["builtin", "readList"], + ["builtin", "readLitChar"], ["builtin", "readLn"], ["builtin", "readOct"], + ["builtin", "readParen"], ["builtin", "readSigned"], ["builtin", "reads"], + ["builtin", "readsPrec"], ["builtin", "realToFrac"], ["builtin", "recip"], + ["builtin", "rem"], ["builtin", "repeat"], ["builtin", "replicate"], ["builtin", "return"], + ["builtin", "reverse"], ["builtin", "round"], ["builtin", "scaleFloat"], + ["builtin", "scanl"], ["builtin", "scanl1"], ["builtin", "scanr"], ["builtin", "scanr1"], + ["builtin", "seq"], ["builtin", "sequence"], ["builtin", "sequence_"], ["builtin", "show"], + ["builtin", "showChar"], ["builtin", "showInt"], ["builtin", "showList"], + ["builtin", "showLitChar"], ["builtin", "showParen"], ["builtin", "showSigned"], + ["builtin", "showString"], ["builtin", "shows"], ["builtin", "showsPrec"], + ["builtin", "significand"], ["builtin", "signum"], ["builtin", "sin"], ["builtin", "sinh"], + ["builtin", "snd"], ["builtin", "sort"], ["builtin", "span"], ["builtin", "splitAt"], ["builtin", "sqrt"], + ["builtin", "subtract"], ["builtin", "succ"], ["builtin", "sum"], ["builtin", "tail"], ["builtin", "take"], + ["builtin", "takeWhile"], ["builtin", "tan"], ["builtin", "tanh"], ["builtin", "threadToIOResult"], + ["builtin", "toEnum"], ["builtin", "toInt"], ["builtin", "toInteger"], + ["builtin", "toLower"], ["builtin", "toRational"], ["builtin", "toUpper"], + ["builtin", "truncate"], ["builtin", "uncurry"], ["builtin", "undefined"], + ["builtin", "unlines"], ["builtin", "until"], ["builtin", "unwords"], + ["builtin", "unzip"], ["builtin", "unzip3"], ["builtin", "userError"], ["builtin", "words"], + ["builtin", "writeFile"], ["builtin", "zip"], ["builtin", "zip3"], ["builtin", "zipWith"], + ["builtin", "zipWith3"] +] + +---------------------------------------------------- + +Checks for all builtin. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/char_feature.test b/docs/_style/prism-master/tests/languages/haskell/char_feature.test new file mode 100644 index 00000000..e4dedc44 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/char_feature.test @@ -0,0 +1,17 @@ +'a' +'\n' +'\23' +'\xFE' + +---------------------------------------------------- + +[ + ["char", "'a'"], + ["char", "'\\n'"], + ["char", "'\\23'"], + ["char", "'\\xFE'"] +] + +---------------------------------------------------- + +Checks for chars. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/comment_feature.test b/docs/_style/prism-master/tests/languages/haskell/comment_feature.test new file mode 100644 index 00000000..d8c8cdda --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/comment_feature.test @@ -0,0 +1,14 @@ +-- foo +{- foo +bar -} + +---------------------------------------------------- + +[ + ["comment", "-- foo"], + ["comment", "{- foo\r\nbar -}"] +] + +---------------------------------------------------- + +Checks for single-line and multi-line comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/constant_feature.test b/docs/_style/prism-master/tests/languages/haskell/constant_feature.test new file mode 100644 index 00000000..06f25f10 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/constant_feature.test @@ -0,0 +1,15 @@ +Foo +Foo.Bar +Baz.Foobar_42 + +---------------------------------------------------- + +[ + ["constant", "Foo"], + ["constant", "Foo.Bar"], + ["constant", "Baz.Foobar_42"] +] + +---------------------------------------------------- + +Checks for constants. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/hvariable_feature.test b/docs/_style/prism-master/tests/languages/haskell/hvariable_feature.test new file mode 100644 index 00000000..defa3ba7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/hvariable_feature.test @@ -0,0 +1,15 @@ +foo +Foo.bar +Baz.foobar_42 + +---------------------------------------------------- + +[ + ["hvariable", "foo"], + ["hvariable", "Foo.bar"], + ["hvariable", "Baz.foobar_42"] +] + +---------------------------------------------------- + +Checks for hvariables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/import_statement_feature.test b/docs/_style/prism-master/tests/languages/haskell/import_statement_feature.test new file mode 100644 index 00000000..120fbe75 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/import_statement_feature.test @@ -0,0 +1,35 @@ +import Foo +import qualified Foobar +import Foo_42.Bar as Foobar +import Foo.Bar as Foo.Baz hiding + +---------------------------------------------------- + +[ + ["import_statement", [ + ["keyword", "import"], + " Foo" + ]], + ["import_statement", [ + ["keyword", "import"], + ["keyword", "qualified"], + " Foobar" + ]], + ["import_statement", [ + ["keyword", "import"], + " Foo_42.Bar ", + ["keyword", "as"], + " Foobar" + ]], + ["import_statement", [ + ["keyword", "import"], + " Foo.Bar ", + ["keyword", "as"], + " Foo.Baz ", + ["keyword", "hiding"] + ]] +] + +---------------------------------------------------- + +Checks for import statement. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/keyword_feature.test b/docs/_style/prism-master/tests/languages/haskell/keyword_feature.test new file mode 100644 index 00000000..0fb36579 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/keyword_feature.test @@ -0,0 +1,19 @@ +case class data deriving +do else if in infixl +infixr instance let +module newtype of +primitive then type where + +---------------------------------------------------- + +[ + ["keyword", "case"], ["keyword", "class"], ["keyword", "data"], ["keyword", "deriving"], + ["keyword", "do"], ["keyword", "else"], ["keyword", "if"], ["keyword", "in"], ["keyword", "infixl"], + ["keyword", "infixr"], ["keyword", "instance"], ["keyword", "let"], + ["keyword", "module"], ["keyword", "newtype"], ["keyword", "of"], + ["keyword", "primitive"], ["keyword", "then"], ["keyword", "type"], ["keyword", "where"] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/number_feature.test b/docs/_style/prism-master/tests/languages/haskell/number_feature.test new file mode 100644 index 00000000..f45a0f28 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/number_feature.test @@ -0,0 +1,23 @@ +42 +3.14159 +2E3 +1.2e-4 +0.9e+1 +0o47 +0xBadFace + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "2E3"], + ["number", "1.2e-4"], + ["number", "0.9e+1"], + ["number", "0o47"], + ["number", "0xBadFace"] +] + +---------------------------------------------------- + +Checks for decimal, octal and hexadecimal numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/operator_feature.test b/docs/_style/prism-master/tests/languages/haskell/operator_feature.test new file mode 100644 index 00000000..9cd8339f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/operator_feature.test @@ -0,0 +1,37 @@ +.. +reverse . sort +`foo` +`Foo.bar` ++ - * / +^ ^^ ** +&& || +< <= == /= +>= > \ | +++ : !! +\\ <- -> += :: => +>> >>= >@> +~ ! @ + +---------------------------------------------------- + +[ + ["operator", ".."], + ["builtin", "reverse"], ["operator", " . "], ["builtin", "sort"], + ["operator", "`foo`"], + ["operator", "`Foo.bar`"], + ["operator", "+"], ["operator", "-"], ["operator", "*"], ["operator", "/"], + ["operator", "^"], ["operator", "^^"], ["operator", "**"], + ["operator", "&&"], ["operator", "||"], + ["operator", "<"], ["operator", "<="], ["operator", "=="], ["operator", "/="], + ["operator", ">="], ["operator", ">"], ["operator", "\\"], ["operator", "|"], + ["operator", "++"], ["operator", ":"], ["operator", "!!"], + ["operator", "\\\\"], ["operator", "<-"], ["operator", "->"], + ["operator", "="], ["operator", "::"], ["operator", "=>"], + ["operator", ">>"], ["operator", ">>="], ["operator", ">@>"], + ["operator", "~"], ["operator", "!"], ["operator", "@"] +] + +---------------------------------------------------- + +Checks for operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haskell/string_feature.test b/docs/_style/prism-master/tests/languages/haskell/string_feature.test new file mode 100644 index 00000000..49c2cfbf --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haskell/string_feature.test @@ -0,0 +1,19 @@ +"" +"fo\"o" +"foo \ + \ bar" +"foo -- comment \ + \ bar" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"fo\\\"o\""], + ["string", "\"foo \\\r\n \\ bar\""], + ["string", "\"foo -- comment \\\r\n \\ bar\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haxe/keyword_feature.test b/docs/_style/prism-master/tests/languages/haxe/keyword_feature.test new file mode 100644 index 00000000..6a26bd09 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haxe/keyword_feature.test @@ -0,0 +1,93 @@ +this +abstract +as +break +case +cast +catch +class +continue +default +do +dynamic +else +enum +extends +extern +from +for +function +if +implements +import +in +inline +interface +macro +new +null +override +public +private +return +static +super +switch +throw +to +try +typedef +using +var +while + +---------------------------------------------------- + +[ + ["keyword", "this"], + ["keyword", "abstract"], + ["keyword", "as"], + ["keyword", "break"], + ["keyword", "case"], + ["keyword", "cast"], + ["keyword", "catch"], + ["keyword", "class"], + ["keyword", "continue"], + ["keyword", "default"], + ["keyword", "do"], + ["keyword", "dynamic"], + ["keyword", "else"], + ["keyword", "enum"], + ["keyword", "extends"], + ["keyword", "extern"], + ["keyword", "from"], + ["keyword", "for"], + ["keyword", "function"], + ["keyword", "if"], + ["keyword", "implements"], + ["keyword", "import"], + ["keyword", "in"], + ["keyword", "inline"], + ["keyword", "interface"], + ["keyword", "macro"], + ["keyword", "new"], + ["keyword", "null"], + ["keyword", "override"], + ["keyword", "public"], + ["keyword", "private"], + ["keyword", "return"], + ["keyword", "static"], + ["keyword", "super"], + ["keyword", "switch"], + ["keyword", "throw"], + ["keyword", "to"], + ["keyword", "try"], + ["keyword", "typedef"], + ["keyword", "using"], + ["keyword", "var"], + ["keyword", "while"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haxe/metadata_feature.test b/docs/_style/prism-master/tests/languages/haxe/metadata_feature.test new file mode 100644 index 00000000..312114d9 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haxe/metadata_feature.test @@ -0,0 +1,15 @@ +@author("Nicolas") +@debug +@:noCompletion + +---------------------------------------------------- + +[ + ["metadata", "@author"], ["punctuation", "("], ["string", ["\"Nicolas\""]], ["punctuation", ")"], + ["metadata", "@debug"], + ["metadata", "@:noCompletion"] +] + +---------------------------------------------------- + +Checks for metadata. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haxe/operator_feature.test b/docs/_style/prism-master/tests/languages/haxe/operator_feature.test new file mode 100644 index 00000000..6963f800 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haxe/operator_feature.test @@ -0,0 +1,29 @@ +... ++ ++ +- -- -> += == +! != +& && +| || +< <= << +> >= >> +* / % ~ ^ + +---------------------------------------------------- + +[ + ["operator", "..."], + ["operator", "+"], ["operator", "++"], + ["operator", "-"], ["operator", "--"], ["operator", "->"], + ["operator", "="], ["operator", "=="], + ["operator", "!"], ["operator", "!="], + ["operator", "&"], ["operator", "&&"], + ["operator", "|"], ["operator", "||"], + ["operator", "<"], ["operator", "<="], ["operator", "<<"], + ["operator", ">"], ["operator", ">="], ["operator", ">>"], + ["operator", "*"], ["operator", "/"], ["operator", "%"], ["operator", "~"], ["operator", "^"] +] + +---------------------------------------------------- + +Checks for operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haxe/preprocessor_feature.test b/docs/_style/prism-master/tests/languages/haxe/preprocessor_feature.test new file mode 100644 index 00000000..3cadacf6 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haxe/preprocessor_feature.test @@ -0,0 +1,17 @@ +#if +#elseif +#else +#end + +---------------------------------------------------- + +[ + ["preprocessor", "#if"], + ["preprocessor", "#elseif"], + ["preprocessor", "#else"], + ["preprocessor", "#end"] +] + +---------------------------------------------------- + +Checks for preprocessor directives. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haxe/regex_feature.test b/docs/_style/prism-master/tests/languages/haxe/regex_feature.test new file mode 100644 index 00000000..577cab7b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haxe/regex_feature.test @@ -0,0 +1,15 @@ +~/ha\/xe/i +~/[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z][A-Z][A-Z]?/i +~/(dog|fox)/igmsu + +---------------------------------------------------- + +[ + ["regex", "~/ha\\/xe/i"], + ["regex", "~/[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z][A-Z][A-Z]?/i"], + ["regex", "~/(dog|fox)/igmsu"] +] + +---------------------------------------------------- + +Checks for regexes. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haxe/reification_feature.test b/docs/_style/prism-master/tests/languages/haxe/reification_feature.test new file mode 100644 index 00000000..6d382b7c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haxe/reification_feature.test @@ -0,0 +1,16 @@ +$e +${4+2} + +---------------------------------------------------- + +[ + ["reification", "$e"], + ["reification", "$"], + ["punctuation", "{"], + ["number", "4"], ["operator", "+"], ["number", "2"], + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for reification. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/haxe/string_feature.test b/docs/_style/prism-master/tests/languages/haxe/string_feature.test new file mode 100644 index 00000000..61f1985f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/haxe/string_feature.test @@ -0,0 +1,37 @@ +"" +"Foo +\"bar\" +baz" +"$bar ${4+2}" +'' +'Foo +\'bar\' +baz' + +---------------------------------------------------- + +[ + ["string", ["\"\""]], + ["string", ["\"Foo\r\n\\\"bar\\\"\r\nbaz\""]], + ["string", [ + "\"", + ["interpolation", [ + ["interpolation", "$bar"] + ]], + ["interpolation", [ + ["interpolation", "$"], + ["punctuation", "{"], + ["number", "4"], + ["operator", "+"], + ["number", "2"], + ["punctuation", "}"] + ]], + "\"" + ]], + ["string", ["''"]], + ["string", ["'Foo\r\n\\'bar\\'\r\nbaz'"]] +] + +---------------------------------------------------- + +Checks for strings and string interpolation. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/hpkp/safe_maxage_feature.test b/docs/_style/prism-master/tests/languages/hpkp/safe_maxage_feature.test new file mode 100644 index 00000000..169f23cd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/hpkp/safe_maxage_feature.test @@ -0,0 +1,12 @@ +max-age=31536000 + +---------------------------------------------------- + +[ + ["directive", "max-age="], + ["safe", "31536000"] +] + +---------------------------------------------------- + +Checks for HPKP with a "safe" max-age. diff --git a/docs/_style/prism-master/tests/languages/hpkp/sha256_pin_feature.test b/docs/_style/prism-master/tests/languages/hpkp/sha256_pin_feature.test new file mode 100644 index 00000000..45adf1c8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/hpkp/sha256_pin_feature.test @@ -0,0 +1,11 @@ +pin-sha256="EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4=" + +---------------------------------------------------- + +[ + ["directive", "pin-sha256=\"EpOpN/ahUF6jhWShDUdy+NvvtaGcu5F7qM6+x2mfkh4=\""] +] + +---------------------------------------------------- + +Checks for HPKP with a sha256 pin. diff --git a/docs/_style/prism-master/tests/languages/hpkp/unsafe_maxage_feature.test b/docs/_style/prism-master/tests/languages/hpkp/unsafe_maxage_feature.test new file mode 100644 index 00000000..4f1ff961 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/hpkp/unsafe_maxage_feature.test @@ -0,0 +1,12 @@ +max-age=123 + +---------------------------------------------------- + +[ + ["directive", "max-age="], + ["unsafe", "123"] +] + +---------------------------------------------------- + +Checks for HPKP with an "unsafe" max-age. diff --git a/docs/_style/prism-master/tests/languages/hsts/include_subdomains_feature.test b/docs/_style/prism-master/tests/languages/hsts/include_subdomains_feature.test new file mode 100644 index 00000000..e889e84c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/hsts/include_subdomains_feature.test @@ -0,0 +1,11 @@ +includeSubDomains + +---------------------------------------------------- + +[ + ["directive", "includeSubDomains"] +] + +---------------------------------------------------- + +Checks for HSTS with the includeSubDomains directive. diff --git a/docs/_style/prism-master/tests/languages/hsts/preload_feature.test b/docs/_style/prism-master/tests/languages/hsts/preload_feature.test new file mode 100644 index 00000000..2a390a03 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/hsts/preload_feature.test @@ -0,0 +1,11 @@ +preload + +---------------------------------------------------- + +[ + ["directive", "preload"] +] + +---------------------------------------------------- + +Checks for HSTS with the preload directive. diff --git a/docs/_style/prism-master/tests/languages/hsts/safe_maxage_feature.test b/docs/_style/prism-master/tests/languages/hsts/safe_maxage_feature.test new file mode 100644 index 00000000..6797fff3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/hsts/safe_maxage_feature.test @@ -0,0 +1,12 @@ +max-age=31536000 + +---------------------------------------------------- + +[ + ["directive", "max-age="], + ["safe", "31536000"] +] + +---------------------------------------------------- + +Checks for HSTS with a "safe" max-age. diff --git a/docs/_style/prism-master/tests/languages/hsts/unsafe_maxage_feature.test b/docs/_style/prism-master/tests/languages/hsts/unsafe_maxage_feature.test new file mode 100644 index 00000000..dba69dc3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/hsts/unsafe_maxage_feature.test @@ -0,0 +1,12 @@ +max-age=123 + +---------------------------------------------------- + +[ + ["directive", "max-age="], + ["unsafe", "123"] +] + +---------------------------------------------------- + +Checks for HSTS with an "unsafe" max-age. diff --git a/docs/_style/prism-master/tests/languages/http/header-name_feature.test b/docs/_style/prism-master/tests/languages/http/header-name_feature.test new file mode 100644 index 00000000..cd2612fa --- /dev/null +++ b/docs/_style/prism-master/tests/languages/http/header-name_feature.test @@ -0,0 +1,24 @@ +Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3 +Accept-Encoding: gzip, deflate +Server: GitHub.com +Date: Mon, 22 Dec 2014 18:25:30 GMT +Content-Type: text/html; charset=utf-8 + +---------------------------------------------------- + +[ + ["header-name", "Accept-Language:"], + " fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n", + ["header-name", "Accept-Encoding:"], + " gzip, deflate\r\n", + ["header-name", "Server:"], + " GitHub.com\r\n", + ["header-name", "Date:"], + " Mon, 22 Dec 2014 18:25:30 GMT\r\n", + ["header-name", "Content-Type:"], + " text/html; charset=utf-8" +] + +---------------------------------------------------- + +Checks for header names. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/http/request-line_feature.test b/docs/_style/prism-master/tests/languages/http/request-line_feature.test new file mode 100644 index 00000000..70db1a9f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/http/request-line_feature.test @@ -0,0 +1,56 @@ +POST http://example.com HTTP/1.0 +GET http://localhost:9999/foo.html HTTP/1.1 +PUT http://www.example.com HTTP/2.0 +DELETE https://example.com HTTP/1.1 +OPTIONS https://www.example.com HTTP/1.1 +PATCH http://example.com HTTP/1.0 +TRACE http://example.com HTTP/1.0 +CONNECT http://example.com HTTP/1.0 +GET /path/to/foo.html HTTP/1.1 + +---------------------------------------------------- + +[ + ["request-line", [ + ["property", "POST"], + " http://example.com HTTP/1.0" + ]], + ["request-line", [ + ["property", "GET"], + " http://localhost", + ["attr-name", ":9999"], + "/foo.html HTTP/1.1" + ]], + ["request-line", [ + ["property", "PUT"], + " http://www.example.com HTTP/2.0" + ]], + ["request-line", [ + ["property", "DELETE"], + " https://example.com HTTP/1.1" + ]], + ["request-line", [ + ["property", "OPTIONS"], + " https://www.example.com HTTP/1.1" + ]], + ["request-line", [ + ["property", "PATCH"], + " http://example.com HTTP/1.0" + ]], + ["request-line", [ + ["property", "TRACE"], + " http://example.com HTTP/1.0" + ]], + ["request-line", [ + ["property", "CONNECT"], + " http://example.com HTTP/1.0" + ]], + ["request-line", [ + ["property", "GET"], + " /path/to/foo.html HTTP/1.1" + ]] +] + +---------------------------------------------------- + +Checks for request lines. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/http/response-status_feature.test b/docs/_style/prism-master/tests/languages/http/response-status_feature.test new file mode 100644 index 00000000..7384ff2a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/http/response-status_feature.test @@ -0,0 +1,29 @@ +HTTP/1.0 200 OK +HTTP/1.1 403 Forbidden +HTTP/1.1 404 Not Found +HTTP/1.0 418 I'm a teapot + +---------------------------------------------------- + +[ + ["response-status", [ + "HTTP/1.0 ", + ["property", "200 OK"] + ]], + ["response-status", [ + "HTTP/1.1 ", + ["property", "403 Forbidden"] + ]], + ["response-status", [ + "HTTP/1.1 ", + ["property", "404 Not Found"] + ]], + ["response-status", [ + "HTTP/1.0 ", + ["property", "418 I'm a teapot"] + ]] +] + +---------------------------------------------------- + +Checks for response statuses. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ichigojam/comment_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/comment_feature.test new file mode 100644 index 00000000..65211e27 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ichigojam/comment_feature.test @@ -0,0 +1,17 @@ +'Foobar +' Foobar +REMFoobar +REM Foobar + +---------------------------------------------------- + +[ + ["comment", "'Foobar"], + ["comment", "' Foobar"], + ["comment", "REMFoobar"], + ["comment", "REM Foobar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ichigojam/function_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/function_feature.test new file mode 100644 index 00000000..6cc325b6 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ichigojam/function_feature.test @@ -0,0 +1,59 @@ +ABS +ANA +ASC +BIN +BTN +DEC +FREE +HELP +HEX +I2CR +I2CW +IN +INKEY +LEN +LINE +PEEK +RND +SCR +SOUND +STR +TICK +USR +VER +VPEEK +ZER + +---------------------------------------------------- + +[ + ["function", "ABS"], + ["function", "ANA"], + ["function", "ASC"], + ["function", "BIN"], + ["function", "BTN"], + ["function", "DEC"], + ["function", "FREE"], + ["function", "HELP"], + ["function", "HEX"], + ["function", "I2CR"], + ["function", "I2CW"], + ["function", "IN"], + ["function", "INKEY"], + ["function", "LEN"], + ["function", "LINE"], + ["function", "PEEK"], + ["function", "RND"], + ["function", "SCR"], + ["function", "SOUND"], + ["function", "STR"], + ["function", "TICK"], + ["function", "USR"], + ["function", "VER"], + ["function", "VPEEK"], + ["function", "ZER"] +] + +---------------------------------------------------- + +Checks for functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ichigojam/keyword_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/keyword_feature.test new file mode 100644 index 00000000..71d83a48 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ichigojam/keyword_feature.test @@ -0,0 +1,119 @@ +BEEP +BPS +CASE +CLEAR +CLK +CLO +CLP +CLS +CLT +CLV +CONT +COPY +ELSE +END +FILE +FILES +FOR +GOSUB +GSB +GOTO +IF +INPUT +KBD +LED +LET +LIST +LOAD +LOCATE +LRUN +NEW +NEXT +OUT +RIGHT +PLAY +POKE +PRINT +PWM +RENUM +RESET +RETURN +RTN +RUN +SAVE +SCROLL +SLEEP +SRND +STEP +STOP +SUB +TEMPO +THEN +TO +UART +VIDEO +WAIT + +---------------------------------------------------- + +[ + ["keyword", "BEEP"], + ["keyword", "BPS"], + ["keyword", "CASE"], + ["keyword", "CLEAR"], + ["keyword", "CLK"], + ["keyword", "CLO"], + ["keyword", "CLP"], + ["keyword", "CLS"], + ["keyword", "CLT"], + ["keyword", "CLV"], + ["keyword", "CONT"], + ["keyword", "COPY"], + ["keyword", "ELSE"], + ["keyword", "END"], + ["keyword", "FILE"], + ["keyword", "FILES"], + ["keyword", "FOR"], + ["keyword", "GOSUB"], + ["keyword", "GSB"], + ["keyword", "GOTO"], + ["keyword", "IF"], + ["keyword", "INPUT"], + ["keyword", "KBD"], + ["keyword", "LED"], + ["keyword", "LET"], + ["keyword", "LIST"], + ["keyword", "LOAD"], + ["keyword", "LOCATE"], + ["keyword", "LRUN"], + ["keyword", "NEW"], + ["keyword", "NEXT"], + ["keyword", "OUT"], + ["keyword", "RIGHT"], + ["keyword", "PLAY"], + ["keyword", "POKE"], + ["keyword", "PRINT"], + ["keyword", "PWM"], + ["keyword", "RENUM"], + ["keyword", "RESET"], + ["keyword", "RETURN"], + ["keyword", "RTN"], + ["keyword", "RUN"], + ["keyword", "SAVE"], + ["keyword", "SCROLL"], + ["keyword", "SLEEP"], + ["keyword", "SRND"], + ["keyword", "STEP"], + ["keyword", "STOP"], + ["keyword", "SUB"], + ["keyword", "TEMPO"], + ["keyword", "THEN"], + ["keyword", "TO"], + ["keyword", "UART"], + ["keyword", "VIDEO"], + ["keyword", "WAIT"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ichigojam/label_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/label_feature.test new file mode 100644 index 00000000..42ad2e85 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ichigojam/label_feature.test @@ -0,0 +1,13 @@ +@PAPERNEKO +@SUKI + +---------------------------------------------------- + +[ + ["label", "@PAPERNEKO"], + ["label", "@SUKI"] +] + +---------------------------------------------------- + +Checks for labels. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ichigojam/number_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/number_feature.test new file mode 100644 index 00000000..89bfcf2c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ichigojam/number_feature.test @@ -0,0 +1,23 @@ +42 +3.14159 +2e8 +3.4E-9 +0.7E+12 +#496F726953756B69 +`11100010 + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "2e8"], + ["number", "3.4E-9"], + ["number", "0.7E+12"], + ["number", "#496F726953756B69"], + ["number", "`11100010"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ichigojam/operator_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/operator_feature.test new file mode 100644 index 00000000..59e79944 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ichigojam/operator_feature.test @@ -0,0 +1,36 @@ +< +<= +<> +> +>= ++ +- +* +/ +^ += +& +~ +! +| +AND +NOT +OR +|| +&& + +---------------------------------------------------- + +[ + ["operator", "<"], ["operator", "<="], ["operator", "<>"], + ["operator", ">"], ["operator", ">="], + ["operator", "+"], ["operator", "-"], ["operator", "*"], ["operator", "/"], + ["operator", "^"], ["operator", "="], + ["operator", "&"], ["operator", "~"], ["operator", "!"], ["operator", "|"], + ["operator", "AND"], ["operator", "NOT"], ["operator", "OR"], + ["operator", "||"], ["operator", "&&"] +] + +---------------------------------------------------- + +Checks for operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ichigojam/string_feature.test b/docs/_style/prism-master/tests/languages/ichigojam/string_feature.test new file mode 100644 index 00000000..83fea35e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ichigojam/string_feature.test @@ -0,0 +1,13 @@ +"" +"fo""obar" + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"fo\"\"obar\""] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/icon/builtin-keyword_feature.test b/docs/_style/prism-master/tests/languages/icon/builtin-keyword_feature.test new file mode 100644 index 00000000..1d257642 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/icon/builtin-keyword_feature.test @@ -0,0 +1,91 @@ +&allocated +&ascii +&clock +&collections +&cset +¤t +&date +&dateline +&digits +&dump +&e +&error +&errornumber +&errortext +&errorvalue +&errout +&fail +&features +&file +&host +&input +&lcase +&letters +&level +&line +&main +&null +&output +&phi +&pi +&pos +&progname +&random +®ions +&source +&storage +&subject +&time +&trace +&ucase +&version + +---------------------------------------------------- + +[ + ["builtin-keyword", "&allocated"], + ["builtin-keyword", "&ascii"], + ["builtin-keyword", "&clock"], + ["builtin-keyword", "&collections"], + ["builtin-keyword", "&cset"], + ["builtin-keyword", "¤t"], + ["builtin-keyword", "&date"], + ["builtin-keyword", "&dateline"], + ["builtin-keyword", "&digits"], + ["builtin-keyword", "&dump"], + ["builtin-keyword", "&e"], + ["builtin-keyword", "&error"], + ["builtin-keyword", "&errornumber"], + ["builtin-keyword", "&errortext"], + ["builtin-keyword", "&errorvalue"], + ["builtin-keyword", "&errout"], + ["builtin-keyword", "&fail"], + ["builtin-keyword", "&features"], + ["builtin-keyword", "&file"], + ["builtin-keyword", "&host"], + ["builtin-keyword", "&input"], + ["builtin-keyword", "&lcase"], + ["builtin-keyword", "&letters"], + ["builtin-keyword", "&level"], + ["builtin-keyword", "&line"], + ["builtin-keyword", "&main"], + ["builtin-keyword", "&null"], + ["builtin-keyword", "&output"], + ["builtin-keyword", "&phi"], + ["builtin-keyword", "&pi"], + ["builtin-keyword", "&pos"], + ["builtin-keyword", "&progname"], + ["builtin-keyword", "&random"], + ["builtin-keyword", "®ions"], + ["builtin-keyword", "&source"], + ["builtin-keyword", "&storage"], + ["builtin-keyword", "&subject"], + ["builtin-keyword", "&time"], + ["builtin-keyword", "&trace"], + ["builtin-keyword", "&ucase"], + ["builtin-keyword", "&version"] +] + +---------------------------------------------------- + +Checks for builtin keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/icon/comment_feature.test b/docs/_style/prism-master/tests/languages/icon/comment_feature.test new file mode 100644 index 00000000..09493ab5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/icon/comment_feature.test @@ -0,0 +1,13 @@ +# +# Foobar + +---------------------------------------------------- + +[ + ["comment", "#"], + ["comment", "# Foobar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/icon/directive_feature.test b/docs/_style/prism-master/tests/languages/icon/directive_feature.test new file mode 100644 index 00000000..ede5ebc8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/icon/directive_feature.test @@ -0,0 +1,21 @@ +$include +$line +$define +$undef +$ifdef +$ifndef + +---------------------------------------------------- + +[ + ["directive", "$include"], + ["directive", "$line"], + ["directive", "$define"], + ["directive", "$undef"], + ["directive", "$ifdef"], + ["directive", "$ifndef"] +] + +---------------------------------------------------- + +Checks for preprocessor directives. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/icon/function_feature.test b/docs/_style/prism-master/tests/languages/icon/function_feature.test new file mode 100644 index 00000000..715452f5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/icon/function_feature.test @@ -0,0 +1,15 @@ +foo() +Foobar_42{} +Foo_Bar ! [] + +---------------------------------------------------- + +[ + ["function", "foo"], ["punctuation", "("], ["punctuation", ")"], + ["function", "Foobar_42"], ["punctuation", "{"], ["punctuation", "}"], + ["function", "Foo_Bar"], ["operator", "!"], ["punctuation", "["], ["punctuation", "]"] +] + +---------------------------------------------------- + +Checks for functions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/icon/keyword_feature.test b/docs/_style/prism-master/tests/languages/icon/keyword_feature.test new file mode 100644 index 00000000..08169110 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/icon/keyword_feature.test @@ -0,0 +1,67 @@ +break +by +case +create +default +do +else +end +every +fail +global +if +initial +invocable +link +local +next +not +of +procedure +record +repeat +return +static +suspend +then +to +until +while + +---------------------------------------------------- + +[ + ["keyword", "break"], + ["keyword", "by"], + ["keyword", "case"], + ["keyword", "create"], + ["keyword", "default"], + ["keyword", "do"], + ["keyword", "else"], + ["keyword", "end"], + ["keyword", "every"], + ["keyword", "fail"], + ["keyword", "global"], + ["keyword", "if"], + ["keyword", "initial"], + ["keyword", "invocable"], + ["keyword", "link"], + ["keyword", "local"], + ["keyword", "next"], + ["keyword", "not"], + ["keyword", "of"], + ["keyword", "procedure"], + ["keyword", "record"], + ["keyword", "repeat"], + ["keyword", "return"], + ["keyword", "static"], + ["keyword", "suspend"], + ["keyword", "then"], + ["keyword", "to"], + ["keyword", "until"], + ["keyword", "while"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/icon/number_feature.test b/docs/_style/prism-master/tests/languages/icon/number_feature.test new file mode 100644 index 00000000..fc8efc84 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/icon/number_feature.test @@ -0,0 +1,33 @@ +0 +.42 +42 +3.14159 +2e8 +3.2E-7 +47E+19 + +2r11 +8R751 +16rbadface +36razerty + +---------------------------------------------------- + +[ + ["number", "0"], + ["number", ".42"], + ["number", "42"], + ["number", "3.14159"], + ["number", "2e8"], + ["number", "3.2E-7"], + ["number", "47E+19"], + + ["number", "2r11"], + ["number", "8R751"], + ["number", "16rbadface"], + ["number", "36razerty"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/icon/operator_feature.test b/docs/_style/prism-master/tests/languages/icon/operator_feature.test new file mode 100644 index 00000000..a2e29ffa --- /dev/null +++ b/docs/_style/prism-master/tests/languages/icon/operator_feature.test @@ -0,0 +1,69 @@ +! +% %:= +& &:= +* *:= ** **:= ++ ++ +:= ++:= +- -:= -- --:= +. +/ /:= +:= :=: +< <- <-> <:= +<< <<:= +<<= <<=:= +<= <=:= += =:= +== ==:= +=== ===:= +> >:= +>= >=:= +>> >>:= +>>= >>=:= +? ?:= +@ @:= +\ +^ ^:= +| || ||:= +||| |||:= +~ ~= ~=:= +~== ~==:= +~=== ~===:= +: +: -: + +---------------------------------------------------- + +[ + ["operator", "!"], + ["operator", "%"], ["operator", "%:="], + ["operator", "&"], ["operator", "&:="], + ["operator", "*"], ["operator", "*:="], ["operator", "**"], ["operator", "**:="], + ["operator", "+"], ["operator", "++"], ["operator", "+:="], ["operator", "++:="], + ["operator", "-"], ["operator", "-:="], ["operator", "--"], ["operator", "--:="], + ["operator", "."], + ["operator", "/"], ["operator", "/:="], + ["operator", ":="], ["operator", ":=:"], + ["operator", "<"], ["operator", "<-"], ["operator", "<->"], ["operator", "<:="], + ["operator", "<<"], ["operator", "<<:="], + ["operator", "<<="], ["operator", "<<=:="], + ["operator", "<="], ["operator", "<=:="], + ["operator", "="], ["operator", "=:="], + ["operator", "=="], ["operator", "==:="], + ["operator", "==="], ["operator", "===:="], + ["operator", ">"], ["operator", ">:="], + ["operator", ">="], ["operator", ">=:="], + ["operator", ">>"], ["operator", ">>:="], + ["operator", ">>="], ["operator", ">>=:="], + ["operator", "?"], ["operator", "?:="], + ["operator", "@"], ["operator", "@:="], + ["operator", "\\"], + ["operator", "^"], ["operator", "^:="], + ["operator", "|"], ["operator", "||"], ["operator", "||:="], + ["operator", "|||"], ["operator", "|||:="], + ["operator", "~"], ["operator", "~="], ["operator", "~=:="], + ["operator", "~=="], ["operator", "~==:="], + ["operator", "~==="], ["operator", "~===:="], + ["operator", ":"], ["operator", "+:"], ["operator", "-:"] +] + +---------------------------------------------------- + +Checks for operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/icon/string_feature.test b/docs/_style/prism-master/tests/languages/icon/string_feature.test new file mode 100644 index 00000000..78bc0349 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/icon/string_feature.test @@ -0,0 +1,22 @@ +"" +"Fo\"obar" +"Foo_ +bar_ +baz" + +'' +'a\'zerty' + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"Fo\\\"obar\""], + ["string", "\"Foo_\r\nbar_\r\nbaz\""], + ["string", "''"], + ["string", "'a\\'zerty'"] +] + +---------------------------------------------------- + +Checks for strings and csets. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/inform7/comment_feature.test b/docs/_style/prism-master/tests/languages/inform7/comment_feature.test new file mode 100644 index 00000000..f0aedfe0 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/inform7/comment_feature.test @@ -0,0 +1,15 @@ +[Foobar] +[Foo +bar +baz] + +---------------------------------------------------- + +[ + ["comment", "[Foobar]"], + ["comment", "[Foo\r\nbar\r\nbaz]"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/inform7/keyword_feature.test b/docs/_style/prism-master/tests/languages/inform7/keyword_feature.test new file mode 100644 index 00000000..b2497b4a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/inform7/keyword_feature.test @@ -0,0 +1,85 @@ +after +before +carry out +check +continue the action +definition : +do nothing +else +end if +end unless +end the story +every turn +if +include +instead +instead of +let +move +no +now +otherwise +repeat +report +resume the story +rule for +running through +say +saying +stop the action +test +try +trying +understand +unless +use +when +while +yes + +---------------------------------------------------- + +[ + ["keyword", "after"], + ["keyword", "before"], + ["keyword", "carry out"], + ["keyword", "check"], + ["keyword", "continue the action"], + ["keyword", "definition"], ["punctuation", ":"], + ["keyword", "do nothing"], + ["keyword", "else"], + ["keyword", "end if"], + ["keyword", "end unless"], + ["keyword", "end the story"], + ["keyword", "every turn"], + ["keyword", "if"], + ["keyword", "include"], + ["keyword", "instead"], + ["keyword", "instead of"], + ["keyword", "let"], + ["keyword", "move"], + ["keyword", "no"], + ["keyword", "now"], + ["keyword", "otherwise"], + ["keyword", "repeat"], + ["keyword", "report"], + ["keyword", "resume the story"], + ["keyword", "rule for"], + ["keyword", "running through"], + ["keyword", "say"], + ["keyword", "saying"], + ["keyword", "stop the action"], + ["keyword", "test"], + ["keyword", "try"], + ["keyword", "trying"], + ["keyword", "understand"], + ["keyword", "unless"], + ["keyword", "use"], + ["keyword", "when"], + ["keyword", "while"], + ["keyword", "yes"] +] + +---------------------------------------------------- + +Checks for keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/inform7/number_feature.test b/docs/_style/prism-master/tests/languages/inform7/number_feature.test new file mode 100644 index 00000000..cb5ca7ff --- /dev/null +++ b/docs/_style/prism-master/tests/languages/inform7/number_feature.test @@ -0,0 +1,25 @@ +42 +3.14159 +50kg +100m +one two three +four five six +seven eight nine +ten eleven twelve + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "50kg"], + ["number", "100m"], + ["number", "one"], ["number", "two"], ["number", "three"], + ["number", "four"], ["number", "five"], ["number", "six"], + ["number", "seven"], ["number", "eight"], ["number", "nine"], + ["number", "ten"], ["number", "eleven"], ["number", "twelve"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/inform7/position_feature.test b/docs/_style/prism-master/tests/languages/inform7/position_feature.test new file mode 100644 index 00000000..a2982179 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/inform7/position_feature.test @@ -0,0 +1,73 @@ +above +adjacent to +back side of +below +between +down +east +everywhere +front side +here +in +inside +inside from +north +northeast +northwest +nowhere +on +on top of +other side +outside +outside from +part of +parts of +regionally in +south +southeast +southwest +through +up +west +within + +---------------------------------------------------- + +[ + ["position", "above"], + ["position", "adjacent to"], + ["position", "back side of"], + ["position", "below"], + ["position", "between"], + ["position", "down"], + ["position", "east"], + ["position", "everywhere"], + ["position", "front side"], + ["position", "here"], + ["position", "in"], + ["position", "inside"], + ["position", "inside from"], + ["position", "north"], + ["position", "northeast"], + ["position", "northwest"], + ["position", "nowhere"], + ["position", "on"], + ["position", "on top of"], + ["position", "other side"], + ["position", "outside"], + ["position", "outside from"], + ["position", "part of"], + ["position", "parts of"], + ["position", "regionally in"], + ["position", "south"], + ["position", "southeast"], + ["position", "southwest"], + ["position", "through"], + ["position", "up"], + ["position", "west"], + ["position", "within"] +] + +---------------------------------------------------- + +Checks for positions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/inform7/property_feature.test b/docs/_style/prism-master/tests/languages/inform7/property_feature.test new file mode 100644 index 00000000..4954b9e9 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/inform7/property_feature.test @@ -0,0 +1,157 @@ +adjacent +carried +closed +concealed +contained +dark +described +edible +empty +enclosed +enterable +even +female +fixed in place +full +handled +held +improper-named +incorporated +inedible +invisible +lighted +lit +lockable +locked +male +marked for listing +mentioned +negative +neuter +non-empty +non-full +non-recurring +odd +opaque +open +openable +plural-named +portable +positive +privately-named +proper-named +provided +publically-named +pushable between rooms +recurring +related +rubbing +scenery +seen +singular-named +supported +swinging +switchable +switched +switched on +switched off +touchable +touched +transparent +unconcealed +undescribed +unlit +unlocked +unmarked for listing +unmentioned +unopenable +untouchable +unvisited +variable +visible +visited +wearable +worn + +---------------------------------------------------- + +[ + ["property", "adjacent"], + ["property", "carried"], + ["property", "closed"], + ["property", "concealed"], + ["property", "contained"], + ["property", "dark"], + ["property", "described"], + ["property", "edible"], + ["property", "empty"], + ["property", "enclosed"], + ["property", "enterable"], + ["property", "even"], + ["property", "female"], + ["property", "fixed in place"], + ["property", "full"], + ["property", "handled"], + ["property", "held"], + ["property", "improper-named"], + ["property", "incorporated"], + ["property", "inedible"], + ["property", "invisible"], + ["property", "lighted"], + ["property", "lit"], + ["property", "lockable"], + ["property", "locked"], + ["property", "male"], + ["property", "marked for listing"], + ["property", "mentioned"], + ["property", "negative"], + ["property", "neuter"], + ["property", "non-empty"], + ["property", "non-full"], + ["property", "non-recurring"], + ["property", "odd"], + ["property", "opaque"], + ["property", "open"], + ["property", "openable"], + ["property", "plural-named"], + ["property", "portable"], + ["property", "positive"], + ["property", "privately-named"], + ["property", "proper-named"], + ["property", "provided"], + ["property", "publically-named"], + ["property", "pushable between rooms"], + ["property", "recurring"], + ["property", "related"], + ["property", "rubbing"], + ["property", "scenery"], + ["property", "seen"], + ["property", "singular-named"], + ["property", "supported"], + ["property", "swinging"], + ["property", "switchable"], + ["property", "switched"], + ["property", "switched on"], + ["property", "switched off"], + ["property", "touchable"], + ["property", "touched"], + ["property", "transparent"], + ["property", "unconcealed"], + ["property", "undescribed"], + ["property", "unlit"], + ["property", "unlocked"], + ["property", "unmarked for listing"], + ["property", "unmentioned"], + ["property", "unopenable"], + ["property", "untouchable"], + ["property", "unvisited"], + ["property", "variable"], + ["property", "visible"], + ["property", "visited"], + ["property", "wearable"], + ["property", "worn"] +] + +---------------------------------------------------- + +Checks for properties. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/inform7/string_feature.test b/docs/_style/prism-master/tests/languages/inform7/string_feature.test new file mode 100644 index 00000000..56a880e1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/inform7/string_feature.test @@ -0,0 +1,49 @@ +"" +"foo" +"foo +bar" +"[if the player is in Center Ring]A magician's booth stands in the corner, painted dark blue with glittering gold stars.[otherwise if the magician's booth is closed]A crack of light indicates the way back out to the center ring.[otherwise]The door stands open to the outside.[end if]" + +---------------------------------------------------- + +[ + ["string", ["\"\""]], + ["string", ["\"foo\""]], + ["string", ["\"foo\r\nbar\""]], + ["string", [ + "\"", + ["substitution", [ + ["delimiter", "["], + ["keyword", "if"], ["text", "the"], + ["type", "player"], ["verb", "is"], + ["position", "in"], ["text", "Center Ring"], + ["delimiter", "]"] + ]], + "A magician's booth stands in the corner, painted dark blue with glittering gold stars.", + ["substitution", [ + ["delimiter", "["], + ["keyword", "otherwise"], ["keyword", "if"], + ["text", "the magician's booth"], + ["verb", "is"], + ["property", "closed"], + ["delimiter", "]"] + ]], + "A crack of light indicates the way back out to the center ring.", + ["substitution", [ + ["delimiter", "["], + ["keyword", "otherwise"], + ["delimiter", "]"] + ]], + "The door stands open to the outside.", + ["substitution", [ + ["delimiter", "["], + ["keyword", "end if"], + ["delimiter", "]"] + ]], + "\"" + ]] +] + +---------------------------------------------------- + +Checks for strings and text substitution. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/inform7/title_feature.test b/docs/_style/prism-master/tests/languages/inform7/title_feature.test new file mode 100644 index 00000000..ec3cdbfb --- /dev/null +++ b/docs/_style/prism-master/tests/languages/inform7/title_feature.test @@ -0,0 +1,21 @@ +Volume 1 - Foobar +Book 2 - Foobar +Part 3 - Foobar +Chapter 4 - Foobar +Section 5 - Foobar +Table 6 - Foobar + +---------------------------------------------------- + +[ + ["title", "Volume 1 - Foobar"], + ["title", "Book 2 - Foobar"], + ["title", "Part 3 - Foobar"], + ["title", "Chapter 4 - Foobar"], + ["title", "Section 5 - Foobar"], + ["title", "Table 6 - Foobar"] +] + +---------------------------------------------------- + +Checks for titles. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/inform7/variable_feature.test b/docs/_style/prism-master/tests/languages/inform7/variable_feature.test new file mode 100644 index 00000000..25c2f740 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/inform7/variable_feature.test @@ -0,0 +1,141 @@ +action +actions +activity +activities +actor +actors +animal +animals +backdrop +backdrops +container +containers +device +devices +direction +directions +door +doors +holder +holders +kind +kinds +list +lists +man +men +nobody +nothing +noun +nouns +number +numbers +object +objects +people +person +persons +player +player's holdall +region +regions +relation +relations +room +rooms +rule +rules +rulebook +rulebooks +scene +scenes +someone +something +supporter +supporters +table +tables +text +texts +thing +things +time +vehicle +vehicles +woman +women + +---------------------------------------------------- + +[ + ["type", "action"], + ["type", "actions"], + ["type", "activity"], + ["type", "activities"], + ["type", "actor"], + ["type", "actors"], + ["type", "animal"], + ["type", "animals"], + ["type", "backdrop"], + ["type", "backdrops"], + ["type", "container"], + ["type", "containers"], + ["type", "device"], + ["type", "devices"], + ["type", "direction"], + ["type", "directions"], + ["type", "door"], + ["type", "doors"], + ["type", "holder"], + ["type", "holders"], + ["type", "kind"], + ["type", "kinds"], + ["type", "list"], + ["type", "lists"], + ["type", "man"], + ["type", "men"], + ["type", "nobody"], + ["type", "nothing"], + ["type", "noun"], + ["type", "nouns"], + ["type", "number"], + ["type", "numbers"], + ["type", "object"], + ["type", "objects"], + ["type", "people"], + ["type", "person"], + ["type", "persons"], + ["type", "player"], + ["type", "player's holdall"], + ["type", "region"], + ["type", "regions"], + ["type", "relation"], + ["type", "relations"], + ["type", "room"], + ["type", "rooms"], + ["type", "rule"], + ["type", "rules"], + ["type", "rulebook"], + ["type", "rulebooks"], + ["type", "scene"], + ["type", "scenes"], + ["type", "someone"], + ["type", "something"], + ["type", "supporter"], + ["type", "supporters"], + ["type", "table"], + ["type", "tables"], + ["type", "text"], + ["type", "texts"], + ["type", "thing"], + ["type", "things"], + ["type", "time"], + ["type", "vehicle"], + ["type", "vehicles"], + ["type", "woman"], + ["type", "women"] +] + +---------------------------------------------------- + +Checks for variables. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/inform7/verb_feature.test b/docs/_style/prism-master/tests/languages/inform7/verb_feature.test new file mode 100644 index 00000000..3da285d3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/inform7/verb_feature.test @@ -0,0 +1,213 @@ +applying to +are +attacking +answering +asking +be +being +burning +buying +called +carries +carry +carrying +climbing +closing +conceal +conceals +concealing +consulting +contain +contains +containing +cutting +drinking +dropping +eating +enclose +encloses +enclosing +entering +examining +exiting +getting +giving +going +have +has +having +hold +holds +holding +imply +implies +incorporate +incorporates +incorporating +inserting +is +jumping +kissing +listening +locking +looking +mean +means +meaning +opening +provide +provides +providing +pulling +pushing +putting +relate +relates +relating +removing +searching +see +sees +seeing +setting +showing +singing +sleeping +smelling +squeezing +switching +support +supports +supporting +swearing +taking +tasting +telling +thinking +throwing +touching +turning +tying +unlock +unlocks +unlocking +vary +varies +varying +waiting +waking +waving +wear +wears +wearing + +---------------------------------------------------- + +[ + ["verb", "applying to"], + ["verb", "are"], + ["verb", "attacking"], + ["verb", "answering"], + ["verb", "asking"], + ["verb", "be"], + ["verb", "being"], + ["verb", "burning"], + ["verb", "buying"], + ["verb", "called"], + ["verb", "carries"], + ["verb", "carry"], + ["verb", "carrying"], + ["verb", "climbing"], + ["verb", "closing"], + ["verb", "conceal"], + ["verb", "conceals"], + ["verb", "concealing"], + ["verb", "consulting"], + ["verb", "contain"], + ["verb", "contains"], + ["verb", "containing"], + ["verb", "cutting"], + ["verb", "drinking"], + ["verb", "dropping"], + ["verb", "eating"], + ["verb", "enclose"], + ["verb", "encloses"], + ["verb", "enclosing"], + ["verb", "entering"], + ["verb", "examining"], + ["verb", "exiting"], + ["verb", "getting"], + ["verb", "giving"], + ["verb", "going"], + ["verb", "have"], + ["verb", "has"], + ["verb", "having"], + ["verb", "hold"], + ["verb", "holds"], + ["verb", "holding"], + ["verb", "imply"], + ["verb", "implies"], + ["verb", "incorporate"], + ["verb", "incorporates"], + ["verb", "incorporating"], + ["verb", "inserting"], + ["verb", "is"], + ["verb", "jumping"], + ["verb", "kissing"], + ["verb", "listening"], + ["verb", "locking"], + ["verb", "looking"], + ["verb", "mean"], + ["verb", "means"], + ["verb", "meaning"], + ["verb", "opening"], + ["verb", "provide"], + ["verb", "provides"], + ["verb", "providing"], + ["verb", "pulling"], + ["verb", "pushing"], + ["verb", "putting"], + ["verb", "relate"], + ["verb", "relates"], + ["verb", "relating"], + ["verb", "removing"], + ["verb", "searching"], + ["verb", "see"], + ["verb", "sees"], + ["verb", "seeing"], + ["verb", "setting"], + ["verb", "showing"], + ["verb", "singing"], + ["verb", "sleeping"], + ["verb", "smelling"], + ["verb", "squeezing"], + ["verb", "switching"], + ["verb", "support"], + ["verb", "supports"], + ["verb", "supporting"], + ["verb", "swearing"], + ["verb", "taking"], + ["verb", "tasting"], + ["verb", "telling"], + ["verb", "thinking"], + ["verb", "throwing"], + ["verb", "touching"], + ["verb", "turning"], + ["verb", "tying"], + ["verb", "unlock"], + ["verb", "unlocks"], + ["verb", "unlocking"], + ["verb", "vary"], + ["verb", "varies"], + ["verb", "varying"], + ["verb", "waiting"], + ["verb", "waking"], + ["verb", "waving"], + ["verb", "wear"], + ["verb", "wears"], + ["verb", "wearing"] +] + +---------------------------------------------------- + +Checks for verbs. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ini/comment_feature.test b/docs/_style/prism-master/tests/languages/ini/comment_feature.test new file mode 100644 index 00000000..85faefe7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ini/comment_feature.test @@ -0,0 +1,13 @@ +; +; foobar + +---------------------------------------------------- + +[ + ["comment", ";"], + ["comment", "; foobar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ini/key_value_feature.test b/docs/_style/prism-master/tests/languages/ini/key_value_feature.test new file mode 100644 index 00000000..5d25d9d3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ini/key_value_feature.test @@ -0,0 +1,21 @@ +foo=Bar Baz +foobar=42 + +---------------------------------------------------- + +[ + ["constant", "foo"], + ["attr-value", [ + ["punctuation", "="], + "Bar Baz" + ]], + ["constant", "foobar"], + ["attr-value", [ + ["punctuation", "="], + "42" + ]] +] + +---------------------------------------------------- + +Checks for key/value pairs. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/ini/selector_feature.test b/docs/_style/prism-master/tests/languages/ini/selector_feature.test new file mode 100644 index 00000000..3158a665 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/ini/selector_feature.test @@ -0,0 +1,13 @@ +[owner] +[foobar] + +---------------------------------------------------- + +[ + ["selector", "[owner]"], + ["selector", "[foobar]"] +] + +---------------------------------------------------- + +Checks for section titles. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/io/comment_feature.test b/docs/_style/prism-master/tests/languages/io/comment_feature.test new file mode 100644 index 00000000..fb67d07b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/io/comment_feature.test @@ -0,0 +1,19 @@ +// +// Foobar +#!/usr/bin/env io +/* multiline +comment +*/ + +---------------------------------------------------- + +[ + ["comment", "//"], + ["comment", "// Foobar"], + ["comment", "#!/usr/bin/env io"], + ["comment", "/* multiline\ncomment\n*/"] +] + +---------------------------------------------------- + +Checks for comments. diff --git a/docs/_style/prism-master/tests/languages/io/number_feature.test b/docs/_style/prism-master/tests/languages/io/number_feature.test new file mode 100644 index 00000000..371be063 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/io/number_feature.test @@ -0,0 +1,23 @@ +123 +123.456 +0.456 +123e-4 +123e4 +123.456e-7 +123.456e2 + +------------------------------ + +[ + ["number", "123"], + ["number", "123.456"], + ["number", "0.456"], + ["number", "123e-4"], + ["number", "123e4"], + ["number", "123.456e-7"], + ["number", "123.456e2"] +] + +------------------------------ + +Check numbers. diff --git a/docs/_style/prism-master/tests/languages/io/operator_feature.test b/docs/_style/prism-master/tests/languages/io/operator_feature.test new file mode 100644 index 00000000..5378bc52 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/io/operator_feature.test @@ -0,0 +1,26 @@ +::= := = +== != >= <= +&& and || or not +.. ++ - / * ** +%= &= *= += -= /= <<= >>= ^= |= +? ?? @ @@ +return + +------------------------------------------------------------------------------------------------------------------------- + +[ + ["operator", "::=" ] , ["operator", ":=" ] , ["operator", "=" ] , + ["operator", "==" ] , ["operator", "!=" ] , ["operator", ">=" ] , ["operator", "<=" ] , + ["operator", "&&" ] , ["operator", "and" ] , ["operator", "||" ] , ["operator", "or" ] , ["operator", "not" ] , + ["operator", ".." ] , + ["operator", "+" ] , ["operator", "-" ] , ["operator", "/" ] , ["operator", "*" ] , ["operator", "**" ] , + ["operator", "%=" ] , ["operator", "&=" ] , ["operator", "*=" ] , ["operator", "+=" ] , ["operator", "-=" ] , + ["operator", "/=" ] , ["operator", "<<=" ] , ["operator", ">>=" ] , ["operator", "^=" ] , ["operator", "|=" ] , + ["operator", "?" ] , ["operator", "??" ] , ["operator", "@" ] , ["operator", "@@" ] , + ["operator", "return" ] +] + +------------------------------------------------------------------------------------------------------------------------- + +Check operators. diff --git a/docs/_style/prism-master/tests/languages/io/string_feature.test b/docs/_style/prism-master/tests/languages/io/string_feature.test new file mode 100644 index 00000000..5b4f003e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/io/string_feature.test @@ -0,0 +1,18 @@ +"" +"""""" +"this is a \"test\".\nThis is only a test." +"""this is a "test". +This is only a test.""" + +------------------------------------------------------------------------- + +[ + ["string", "\"\""], + ["triple-quoted-string", "\"\"\"\"\"\""], + ["string", "\"this is a \\\"test\\\".\\nThis is only a test.\""], + ["triple-quoted-string", "\"\"\"this is a \"test\".\nThis is only a test.\"\"\""] +] + +------------------------------------------------------------------------- + +Check strings. diff --git a/docs/_style/prism-master/tests/languages/j/adverb_feature.test b/docs/_style/prism-master/tests/languages/j/adverb_feature.test new file mode 100644 index 00000000..2374d72f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/j/adverb_feature.test @@ -0,0 +1,19 @@ +~ } +/ /. +\ \. +b. f. M. +t. t: + +---------------------------------------------------- + +[ + ["adverb", "~"], ["adverb", "}"], + ["adverb", "/"], ["adverb", "/."], + ["adverb", "\\"], ["adverb", "\\."], + ["adverb", "b."], ["adverb", "f."], ["adverb", "M."], + ["adverb", "t."], ["adverb", "t:"] +] + +---------------------------------------------------- + +Checks for adverbs. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/j/comment_feature.test b/docs/_style/prism-master/tests/languages/j/comment_feature.test new file mode 100644 index 00000000..c816bf19 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/j/comment_feature.test @@ -0,0 +1,13 @@ +NB. +NB. Foo bar + +---------------------------------------------------- + +[ + ["comment", "NB."], + ["comment", "NB. Foo bar"] +] + +---------------------------------------------------- + +Checks for comments. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/j/conjunction_feature.test b/docs/_style/prism-master/tests/languages/j/conjunction_feature.test new file mode 100644 index 00000000..0fcc2e89 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/j/conjunction_feature.test @@ -0,0 +1,41 @@ +& &. &.: &: + +. .. .: +: :. :: +@ @. @: + +!. !: +D. D: + +;. d. H. T. + +` `: + +^: L: S: + +" + +---------------------------------------------------- + +[ + ["conjunction", "&"], ["conjunction", "&."], ["conjunction", "&.:"], ["conjunction", "&:"], + + ["conjunction", "."], ["conjunction", ".."], ["conjunction", ".:"], + ["conjunction", ":"], ["conjunction", ":."], ["conjunction", "::"], + ["conjunction", "@"], ["conjunction", "@."], ["conjunction", "@:"], + + ["conjunction", "!."], ["conjunction", "!:"], + ["conjunction", "D."], ["conjunction", "D:"], + + ["conjunction", ";."], ["conjunction", "d."], ["conjunction", "H."], ["conjunction", "T."], + + ["conjunction", "`"], ["conjunction", "`:"], + + ["conjunction", "^:"], ["conjunction", "L:"], ["conjunction", "S:"], + + ["conjunction", "\""] +] + +---------------------------------------------------- + +Checks for conjunctions. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/j/keyword_feature.test b/docs/_style/prism-master/tests/languages/j/keyword_feature.test new file mode 100644 index 00000000..38f982d8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/j/keyword_feature.test @@ -0,0 +1,77 @@ +adverb +conjunction +CR +def +define +dyad +LF +monad +noun +verb + +assert. +break. +case. +catch. +catchd. +catcht. +continue. +do. +else. +elseif. +end. +fcase. +for. +for_foobar. +goto_foobar. +if. +label_foobar. +return. +select. +throw. +try. +while. +whilst. + +---------------------------------------------------- + +[ + ["keyword", "adverb"], + ["keyword", "conjunction"], + ["keyword", "CR"], + ["keyword", "def"], + ["keyword", "define"], + ["keyword", "dyad"], + ["keyword", "LF"], + ["keyword", "monad"], + ["keyword", "noun"], + ["keyword", "verb"], + + ["keyword", "assert."], + ["keyword", "break."], + ["keyword", "case."], + ["keyword", "catch."], + ["keyword", "catchd."], + ["keyword", "catcht."], + ["keyword", "continue."], + ["keyword", "do."], + ["keyword", "else."], + ["keyword", "elseif."], + ["keyword", "end."], + ["keyword", "fcase."], + ["keyword", "for."], + ["keyword", "for_foobar."], + ["keyword", "goto_foobar."], + ["keyword", "if."], + ["keyword", "label_foobar."], + ["keyword", "return."], + ["keyword", "select."], + ["keyword", "throw."], + ["keyword", "try."], + ["keyword", "while."], + ["keyword", "whilst."] +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/j/number_feature.test b/docs/_style/prism-master/tests/languages/j/number_feature.test new file mode 100644 index 00000000..ecd2dc2a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/j/number_feature.test @@ -0,0 +1,41 @@ +2.3e2 2.3e_2 2j3 +230 0.023 2j3 + +2p1 1p_1 +6.28319 0.31831 + +1x2 2x1 1x_1 +7.38906 5.43656 0.367879 + +2e2j_2e2 2e2j2p1 2ad45 2ar0.785398 +200j_200 628.319j6.28319 1.41421j1.41421 1.41421j1.41421 + +16b1f 10b23 _10b23 1e2b23 2b111.111 +31 23 _17 203 7.875 + +_ __ + +---------------------------------------------------- + +[ + ["number", "2.3e2"], ["number", "2.3e_2"], ["number", "2j3"], + ["number", "230"], ["number", "0.023"], ["number", "2j3"], + + ["number", "2p1"], ["number", "1p_1"], + ["number", "6.28319"], ["number", "0.31831"], + + ["number", "1x2"], ["number", "2x1"], ["number", "1x_1"], + ["number", "7.38906"], ["number", "5.43656"], ["number", "0.367879"], + + ["number", "2e2j_2e2"], ["number", "2e2j2p1"], ["number", "2ad45"], ["number", "2ar0.785398"], + ["number", "200j_200"], ["number", "628.319j6.28319"], ["number", "1.41421j1.41421"], ["number", "1.41421j1.41421"], + + ["number", "16b1f"], ["number", "10b23"], ["number", "_10b23"], ["number", "1e2b23"], ["number", "2b111.111"], + ["number", "31"], ["number", "23"], ["number", "_17"], ["number", "203"], ["number", "7.875"], + + ["number", "_"], ["number", "__"] +] + +---------------------------------------------------- + +Checks for numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/j/string_feature.test b/docs/_style/prism-master/tests/languages/j/string_feature.test new file mode 100644 index 00000000..8cfa97fc --- /dev/null +++ b/docs/_style/prism-master/tests/languages/j/string_feature.test @@ -0,0 +1,13 @@ +'' +'fo''obar' + +---------------------------------------------------- + +[ + ["string", "''"], + ["string", "'fo''obar'"] +] + +---------------------------------------------------- + +Checks for strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/j/verb_feature.test b/docs/_style/prism-master/tests/languages/j/verb_feature.test new file mode 100644 index 00000000..55f90866 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/j/verb_feature.test @@ -0,0 +1,93 @@ +{ {. {: {:: + +p. p.. p: + += +! +] + +< <. <: +> >. >: ++ +. +: +* *. *: +- -. -: +% %. %: +$ $. $: +| |. |: +, ,. ,: +# #. #: + +^ ^. +? ?. + +; ;: +[ [: + +~. ~: +}. }: +". ": +i. i: + +A. C. e. +E. I. j. +L. o. r. + +_: /: \: +q: s: u: x: +_9: _8: _7: +_6: _5: _4: +_3: _2: _1: +1: 2: 3: +4: 5: 6: +7: 8: 9: + +---------------------------------------------------- + +[ + ["verb", "{"], ["verb", "{."], ["verb", "{:"], ["verb", "{::"], + + ["verb", "p."], ["verb", "p.."], ["verb", "p:"], + + ["verb", "="], + ["verb", "!"], + ["verb", "]"], + + ["verb", "<"], ["verb", "<."], ["verb", "<:"], + ["verb", ">"], ["verb", ">."], ["verb", ">:"], + ["verb", "+"], ["verb", "+."], ["verb", "+:"], + ["verb", "*"], ["verb", "*."], ["verb", "*:"], + ["verb", "-"], ["verb", "-."], ["verb", "-:"], + ["verb", "%"], ["verb", "%."], ["verb", "%:"], + ["verb", "$"], ["verb", "$."], ["verb", "$:"], + ["verb", "|"], ["verb", "|."], ["verb", "|:"], + ["verb", ","], ["verb", ",."], ["verb", ",:"], + ["verb", "#"], ["verb", "#."], ["verb", "#:"], + + ["verb", "^"], ["verb", "^."], + ["verb", "?"], ["verb", "?."], + + ["verb", ";"], ["verb", ";:"], + ["verb", "["], ["verb", "[:"], + + ["verb", "~."], ["verb", "~:"], + ["verb", "}."], ["verb", "}:"], + ["verb", "\"."], ["verb", "\":"], + ["verb", "i."], ["verb", "i:"], + + ["verb", "A."], ["verb", "C."], ["verb", "e."], + ["verb", "E."], ["verb", "I."], ["verb", "j."], + ["verb", "L."], ["verb", "o."], ["verb", "r."], + + ["verb", "_:"], ["verb", "/:"], ["verb", "\\:"], + ["verb", "q:"], ["verb", "s:"], ["verb", "u:"], ["verb", "x:"], + ["verb", "_9:"], ["verb", "_8:"], ["verb", "_7:"], + ["verb", "_6:"], ["verb", "_5:"], ["verb", "_4:"], + ["verb", "_3:"], ["verb", "_2:"], ["verb", "_1:"], + ["verb", "1:"], ["verb", "2:"], ["verb", "3:"], + ["verb", "4:"], ["verb", "5:"], ["verb", "6:"], + ["verb", "7:"], ["verb", "8:"], ["verb", "9:"] +] + +---------------------------------------------------- + +Checks for verbs. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/java/function_featrue.test b/docs/_style/prism-master/tests/languages/java/function_featrue.test new file mode 100644 index 00000000..2ca6169f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/java/function_featrue.test @@ -0,0 +1,32 @@ +void foo(int a) {} +foo(0); +Bar::foo; + +---------------------------------------------------- + +[ + ["keyword", "void"], + ["function", "foo"], + ["punctuation", "("], + ["keyword", "int"], + " a", + ["punctuation", ")"], + ["punctuation", "{"], + ["punctuation", "}"], + + ["function", "foo"], + ["punctuation", "("], + ["number", "0"], + ["punctuation", ")"], + ["punctuation", ";"], + + ["class-name", "Bar"], + ["operator", ":"], + ["operator", ":"], + ["function", "foo"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for functions. diff --git a/docs/_style/prism-master/tests/languages/java/generics_feature.test b/docs/_style/prism-master/tests/languages/java/generics_feature.test new file mode 100644 index 00000000..d1d5e536 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/java/generics_feature.test @@ -0,0 +1,67 @@ +public class Solo {} +Solo val = new Solo(); +Duo dual = new Duo(12.2585, 'C'); + +---------------------------------------------------- + +[ + ["keyword", "public"], + ["keyword", "class"], + ["class-name", "Solo"], + ["generics", [ + ["punctuation", "<"], + ["class-name", "T"], + ["punctuation", ">"] + ]], + ["punctuation", "{"], + ["punctuation", "}"], + + ["class-name", "Solo"], + ["generics", [ + ["punctuation", "<"], + ["class-name", "Integer"], + ["punctuation", ">"] + ]], + " val ", + ["operator", "="], + ["keyword", "new"], + ["class-name", "Solo"], + ["generics", [ + ["punctuation", "<"], + ["class-name", "Integer"], + ["punctuation", ">"] + ]], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ";"], + + ["class-name", "Duo"], + ["generics", [ + ["punctuation", "<"], + ["class-name", "Double"], + ["punctuation", ","], + ["class-name", "Character"], + ["punctuation", ">"] + ]], + " dual ", + ["operator", "="], + ["keyword", "new"], + ["class-name", "Duo"], + ["generics", [ + ["punctuation", "<"], + ["class-name", "Double"], + ["punctuation", ","], + ["class-name", "Character"], + ["punctuation", ">"] + ]], + ["punctuation", "("], + ["number", "12.2585"], + ["punctuation", ","], + ["string", "'C'"], + ["punctuation", ")"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for generics. diff --git a/docs/_style/prism-master/tests/languages/java/issue1351.test b/docs/_style/prism-master/tests/languages/java/issue1351.test new file mode 100644 index 00000000..3034e3e8 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/java/issue1351.test @@ -0,0 +1,27 @@ +public class AllChangesIndexer extends SiteIndexer { + +---------------------------------------------------- + +[ + ["keyword", "public"], + ["keyword", "class"], + ["class-name", "AllChangesIndexer"], + ["keyword", "extends"], + ["class-name", "SiteIndexer"], + ["generics", [ + ["punctuation", "<"], + ["class-name", "Change"], + ["punctuation", "."], + ["class-name", "Id"], + ["punctuation", ","], + ["class-name", "ChangeData"], + ["punctuation", ","], + ["class-name", "ChangeIndex"], + ["punctuation", ">"] + ]], + ["punctuation", "{"] +] + +---------------------------------------------------- + +Checks for generics. See #1351 diff --git a/docs/_style/prism-master/tests/languages/java/keyword_feature.test b/docs/_style/prism-master/tests/languages/java/keyword_feature.test new file mode 100644 index 00000000..5e5604d1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/java/keyword_feature.test @@ -0,0 +1,59 @@ +abstract continue for +new +switch assert default +goto package synchronized +boolean do if private +this break double +implements +protected throw byte else +import public throws case +enum +instanceof +return transient catch +extends +int short try char +final +interface +static void +class +finally long +strictfp volatile const +float native super while +var null +module requires transitive +exports uses open +opens with to provides + +---------------------------------------------------- + +[ + ["keyword", "abstract"], ["keyword", "continue"], ["keyword", "for"], + ["keyword", "new"], + ["keyword", "switch"], ["keyword", "assert"], ["keyword", "default"], + ["keyword", "goto"], ["keyword", "package"], ["keyword", "synchronized"], + ["keyword", "boolean"], ["keyword", "do"], ["keyword", "if"], ["keyword", "private"], + ["keyword", "this"], ["keyword", "break"], ["keyword", "double"], + ["keyword", "implements"], + ["keyword", "protected"], ["keyword", "throw"], ["keyword", "byte"], ["keyword", "else"], + ["keyword", "import"], ["keyword", "public"], ["keyword", "throws"], ["keyword", "case"], + ["keyword", "enum"], + ["keyword", "instanceof"], + ["keyword", "return"], ["keyword", "transient"], ["keyword", "catch"], + ["keyword", "extends"], + ["keyword", "int"], ["keyword", "short"], ["keyword", "try"], ["keyword", "char"], + ["keyword", "final"], + ["keyword", "interface"], + ["keyword", "static"], ["keyword", "void"], + ["keyword", "class"], + ["keyword", "finally"], ["keyword", "long"], + ["keyword", "strictfp"], ["keyword", "volatile"], ["keyword", "const"], + ["keyword", "float"], ["keyword", "native"], ["keyword", "super"], ["keyword", "while"], + ["keyword", "var"], ["keyword", "null"], + ["keyword", "module"], ["keyword", "requires"], ["keyword", "transitive"], + ["keyword", "exports"], ["keyword", "uses"], ["keyword", "open"], + ["keyword", "opens"], ["keyword", "with"], ["keyword", "to"], ["keyword","provides"] +] + +---------------------------------------------------- + +Checks for all keywords. diff --git a/docs/_style/prism-master/tests/languages/java/module_feature.test b/docs/_style/prism-master/tests/languages/java/module_feature.test new file mode 100644 index 00000000..983f8ece --- /dev/null +++ b/docs/_style/prism-master/tests/languages/java/module_feature.test @@ -0,0 +1,158 @@ +module com.js.prism { + exports java.net.http; + exports jdk.internal.editor.spi to jdk.jshell; + + requires java.base; + requires transitive java.xml; + + uses java.net.ContentHandlerFactory; + + opens java.time.DateTime; + opens java.time.LocalDateTime to java.logging; + + provides com.modules.hello.HelloInterface with com.modules.hello.HelloModules; + +} + + +---------------------------------------------------- + [ + ["keyword", "module"], + ["namespace", + ["com", + ["punctuation", "."], + "js", + ["punctuation", "."], + "prism" + ] + ], + ["punctuation", "{"], + + ["keyword", "exports"], + ["namespace", + [ + "java", + ["punctuation", "."], + "net", + ["punctuation", "."], + "http" + ] + ], + ["punctuation", ";"], + + ["keyword", "exports"], + ["namespace", + [ + "jdk", + ["punctuation", "."], + "internal", + ["punctuation", "."], + "editor", + ["punctuation", "."], + "spi" + ] + ], + ["keyword", "to"], + ["namespace", + [ + "jdk", + ["punctuation", "."], + "jshell" + ] + ], + ["punctuation", ";"], + + ["keyword", "requires"], + ["namespace", + [ + "java", + ["punctuation", "."], + "base" + ] + ], + ["punctuation", ";"], + + ["keyword", "requires"], + ["keyword", "transitive"], + ["namespace", + [ + "java", + ["punctuation", "."], + "xml" + ] + ], + ["punctuation", ";"], + + ["keyword", "uses"], + ["namespace", + [ + "java", + ["punctuation", "."], + "net" + ] + ], + ["punctuation", "."], + ["class-name", "ContentHandlerFactory"], + ["punctuation", ";"], + + ["keyword", "opens"], + ["namespace", + [ + "java", + ["punctuation", "."], + "time" + ] + ], + ["punctuation", "."], + ["class-name", "DateTime"], + ["punctuation", ";"], + ["keyword", "opens"], + ["namespace", + [ + "java", + ["punctuation", "."], + "time" + ] + ], + ["punctuation", "."], + ["class-name", "LocalDateTime"], + ["keyword", "to"], + ["namespace", + [ + "java", + ["punctuation", "."], + "logging" + ] + ], + ["punctuation", ";"], + ["keyword", "provides"], + ["namespace", + [ + "com", + ["punctuation", "."], + "modules", + ["punctuation", "."], + "hello" + ] + ], + ["punctuation", "."], + ["class-name", "HelloInterface"], + ["keyword", "with"], + ["namespace", + [ + "com", + ["punctuation", "."], + "modules", + ["punctuation", "."], + "hello" + ] + ], + ["punctuation", "."], + ["class-name", "HelloModules"], + ["punctuation", ";"], + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for module definition. diff --git a/docs/_style/prism-master/tests/languages/java/number_feature.test b/docs/_style/prism-master/tests/languages/java/number_feature.test new file mode 100644 index 00000000..014ed37f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/java/number_feature.test @@ -0,0 +1,60 @@ +42 +42d +42L + +1.2e3f +0.1E-4f +0.2e+1f + +0xBadFace + +0x1.8p1 +0xa.fp-2 +0xa.fp+2 +0xa.p+3f +0x.fp+3f + +0b11110000 + +1_2_3 +1_2.3_4e-5_6 + +0x1_2 +0x0_1__2_3 + +0b1_1_1_1__0_0_0_0 + + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "42d"], + ["number", "42L"], + + ["number", "1.2e3f"], + ["number", "0.1E-4f"], + ["number", "0.2e+1f"], + + ["number", "0xBadFace"], + + ["number", "0x1.8p1"], + ["number", "0xa.fp-2"], + ["number", "0xa.fp+2"], + ["number", "0xa.p+3f"], + ["number", "0x.fp+3f"], + + ["number", "0b11110000"], + + ["number", "1_2_3"], + ["number", "1_2.3_4e-5_6"], + + ["number", "0x1_2"], + ["number", "0x0_1__2_3"], + + ["number", "0b1_1_1_1__0_0_0_0"] +] + +---------------------------------------------------- + +Checks for binary, hexadecimal and decimal numbers. diff --git a/docs/_style/prism-master/tests/languages/java/operator_feature.test b/docs/_style/prism-master/tests/languages/java/operator_feature.test new file mode 100644 index 00000000..8c8eb393 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/java/operator_feature.test @@ -0,0 +1,37 @@ ++ ++ += +- -- -= +! != +< << <= <<= +> >> >>> >= >>= >>>= += == +& && &= +| || |= +? : ~ +^ ^= +* *= +/ /= +% %= +-> + +---------------------------------------------------- + +[ + ["operator", "+"], ["operator", "++"], ["operator", "+="], + ["operator", "-"], ["operator", "--"], ["operator", "-="], + ["operator", "!"], ["operator", "!="], + ["operator", "<"], ["operator", "<<"], ["operator", "<="], ["operator", "<<="], + ["operator", ">"], ["operator", ">>"], ["operator", ">>>"], ["operator", ">="], ["operator", ">>="], ["operator", ">>>="], + ["operator", "="], ["operator", "=="], + ["operator", "&"], ["operator", "&&"], ["operator", "&="], + ["operator", "|"], ["operator", "||"], ["operator", "|="], + ["operator", "?"], ["operator", ":"], ["operator", "~"], + ["operator", "^"], ["operator", "^="], + ["operator", "*"], ["operator", "*="], + ["operator", "/"], ["operator", "/="], + ["operator", "%"], ["operator", "%="], + ["operator", "->"] +] + +---------------------------------------------------- + +Checks for all operators. diff --git a/docs/_style/prism-master/tests/languages/java/package_feature.test b/docs/_style/prism-master/tests/languages/java/package_feature.test new file mode 100644 index 00000000..9fe6f1f3 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/java/package_feature.test @@ -0,0 +1,80 @@ +package java.lang; + +import java.lang.Math; +import java.lang.*; + +import static java.lang.Math.PI; +import static java.lang.Math.sin; +import static java.lang.Math.*; + +---------------------------------------------------- + +[ + ["keyword", "package"], + ["namespace", [ + "java", + ["punctuation", "."], + "lang" + ]], + ["punctuation", ";"], + + ["keyword", "import"], + ["namespace", [ + "java", + ["punctuation", "."], + "lang" + ]], + ["punctuation", "."], + ["class-name", "Math"], + ["punctuation", ";"], + + ["keyword", "import"], + ["namespace", [ + "java", + ["punctuation", "."], + "lang" + ]], + ["punctuation", "."], + "*", + ["punctuation", ";"], + + ["keyword", "import"], + ["keyword", "static"], + ["namespace", [ + "java", + ["punctuation", "."], + "lang" + ]], + ["punctuation", "."], + ["class-name", "Math"], + ["punctuation", "."], + "PI", + ["punctuation", ";"], + + ["keyword", "import"], + ["keyword", "static"], + ["namespace", [ + "java", + ["punctuation", "."], + "lang" + ]], + ["punctuation", "."], + ["class-name", "Math"], + ["punctuation", "."], + "sin", + ["punctuation", ";"], + ["keyword", "import"], + ["keyword", "static"], + ["namespace", [ + "java", + ["punctuation", "."], "lang" + ]], ["punctuation", "."], + ["class-name", "Math"], + ["punctuation", "."], + "*", + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for packages. diff --git a/docs/_style/prism-master/tests/languages/javascript+haml/javascript_inclusion.test b/docs/_style/prism-master/tests/languages/javascript+haml/javascript_inclusion.test new file mode 100644 index 00000000..2420e60f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript+haml/javascript_inclusion.test @@ -0,0 +1,24 @@ +:javascript + 0xBadFace + +~ + :javascript + 0xBadFace + +---------------------------------------------------- + +[ + ["filter-javascript", [ + ["filter-name", ":javascript"], + ["number", "0xBadFace"] + ]], + ["punctuation", "~"], + ["filter-javascript", [ + ["filter-name", ":javascript"], + ["number", "0xBadFace"] + ]] +] + +---------------------------------------------------- + +Checks for JavaScript filter in Haml. The tilde serves only as a separator. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javascript+http/javascript_inclusion.test b/docs/_style/prism-master/tests/languages/javascript+http/javascript_inclusion.test new file mode 100644 index 00000000..f7977c55 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript+http/javascript_inclusion.test @@ -0,0 +1,21 @@ +Content-type: application/javascript + +var a = true; + +---------------------------------------------------- + +[ + ["header-name", "Content-type:"], + " application/javascript", + ["application/javascript", [ + ["keyword", "var"], + " a ", + ["operator", "="], + ["boolean", "true"], + ["punctuation", ";"] + ]] +] + +---------------------------------------------------- + +Checks for JavaScript content in HTTP. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javascript/boolean_feature.test b/docs/_style/prism-master/tests/languages/javascript/boolean_feature.test new file mode 100644 index 00000000..4019c444 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/boolean_feature.test @@ -0,0 +1,13 @@ +true +false + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javascript/class-method_feature.test b/docs/_style/prism-master/tests/languages/javascript/class-method_feature.test new file mode 100644 index 00000000..303f481f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/class-method_feature.test @@ -0,0 +1,59 @@ +class Test { + foo( x, y = 0) {} + async bar(x, y = 0 ) {} + $ ( ) {} + awaitFoo(){} +} + +---------------------------------------------------- + +[ + ["keyword", "class"], + ["class-name", ["Test"]], + ["punctuation", "{"], + + ["function", "foo"], + ["punctuation", "("], + ["parameter", [ + "x", + ["punctuation", ","], + " y ", + ["operator", "="], + ["number", "0"] + ]], + ["punctuation", ")"], + ["punctuation", "{"], + ["punctuation", "}"], + + ["keyword", "async"], + ["function", "bar"], + ["punctuation", "("], + ["parameter", [ + "x", + ["punctuation", ","], + " y ", + ["operator", "="], + ["number", "0"] + ]], + ["punctuation", ")"], + ["punctuation", "{"], + ["punctuation", "}"], + + ["function", "$"], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", "{"], + ["punctuation", "}"], + + ["function", "awaitFoo"], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", "{"], + ["punctuation", "}"], + + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for class methods. diff --git a/docs/_style/prism-master/tests/languages/javascript/constant_feature.test b/docs/_style/prism-master/tests/languages/javascript/constant_feature.test new file mode 100644 index 00000000..e17f2855 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/constant_feature.test @@ -0,0 +1,21 @@ +var FOO; +const FOO_BAR; +const BAZ42; + +---------------------------------------------------- + +[ + ["keyword", "var"], + ["constant", "FOO"], + ["punctuation", ";"], + ["keyword", "const"], + ["constant", "FOO_BAR"], + ["punctuation", ";"], + ["keyword", "const"], + ["constant", "BAZ42"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for constants. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javascript/function-variable_feature.test b/docs/_style/prism-master/tests/languages/javascript/function-variable_feature.test new file mode 100644 index 00000000..f3916f71 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/function-variable_feature.test @@ -0,0 +1,104 @@ +foo = function ( x, y) {} +{foo: function () {}} +bar = async function baz (x ) {} +baz = async(x) => x +fooBar = x => x +fooBar = ( x, y ) => x +ಠ_ಠ = () => {} +Ƞȡ_҇ = async (ಠ, Ƞ = 2) => {} + +---------------------------------------------------- + +[ + ["function-variable", "foo"], + ["operator", "="], + ["keyword", "function"], + ["punctuation", "("], + ["parameter", [ + "x", + ["punctuation", ","], + " y" + ]], + ["punctuation", ")"], + ["punctuation", "{"], + ["punctuation", "}"], + + ["punctuation", "{"], + ["function-variable", "foo"], + ["punctuation", ":"], + ["keyword", "function"], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", "{"], + ["punctuation","}"], + ["punctuation","}"], + + ["function-variable", "bar"], + ["operator", "="], + ["keyword", "async"], + ["keyword", "function"], + ["function", "baz"], + ["punctuation", "("], + ["parameter", [ + "x" + ]], + ["punctuation", ")"], + ["punctuation", "{"], + ["punctuation", "}"], + + ["function-variable", "baz"], + ["operator", "="], + ["keyword", "async"], + ["punctuation", "("], + ["parameter", [ + "x" + ]], + ["punctuation", ")"], + ["operator", "=>"], " x\r\n", + + ["function-variable", "fooBar"], + ["operator", "="], + ["parameter", [ + "x" + ]], + ["operator", "=>"], " x\r\n", + + ["function-variable", "fooBar"], + ["operator", "="], + ["punctuation", "("], + ["parameter", [ + "x", + ["punctuation", ","], + " y" + ]], + ["punctuation", ")"], + ["operator", "=>"], " x\r\n", + + ["function-variable", "ಠ_ಠ"], + ["operator", "="], + ["punctuation", "("], + ["punctuation", ")"], + ["operator", "=>"], + ["punctuation", "{"], + ["punctuation", "}"], + + ["function-variable", "Ƞȡ_҇"], + ["operator", "="], + ["keyword", "async"], + ["punctuation", "("], + ["parameter", [ + "ಠ", + ["punctuation", ","], + " Ƞ ", + ["operator", "="], + ["number", "2"] + ]], + ["punctuation", ")"], + ["operator", "=>"], + ["punctuation", "{"], + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for variables obviously containing functions. diff --git a/docs/_style/prism-master/tests/languages/javascript/function_feature.test b/docs/_style/prism-master/tests/languages/javascript/function_feature.test new file mode 100644 index 00000000..35fa9e92 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/function_feature.test @@ -0,0 +1,29 @@ +foo() +foo () +foo_bar() +foo_bar ( ) +f42() +_() +$() +ಠ_ಠ() +Ƞȡ_҇() +if(notAFunction) + +---------------------------------------------------- + +[ + ["function", "foo"], ["punctuation", "("], ["punctuation", ")"], + ["function", "foo"], ["punctuation", "("], ["punctuation", ")"], + ["function", "foo_bar"], ["punctuation", "("], ["punctuation", ")"], + ["function", "foo_bar"], ["punctuation", "("], ["punctuation", ")"], + ["function", "f42"], ["punctuation", "("], ["punctuation", ")"], + ["function", "_"], ["punctuation", "("], ["punctuation", ")"], + ["function", "$"], ["punctuation", "("], ["punctuation", ")"], + ["function", "ಠ_ಠ"], ["punctuation", "("], ["punctuation", ")"], + ["function", "Ƞȡ_҇"], ["punctuation", "("], ["punctuation", ")"], + ["keyword", "if"], ["punctuation", "("], "notAFunction", ["punctuation", ")"] +] + +---------------------------------------------------- + +Checks for functions. Also checks for unicode characters in identifiers. diff --git a/docs/_style/prism-master/tests/languages/javascript/issue1337.test b/docs/_style/prism-master/tests/languages/javascript/issue1337.test new file mode 100644 index 00000000..e49f78d1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/issue1337.test @@ -0,0 +1,11 @@ +// gulp.watch('./src/**/*.js', ['move']); + +---------------------------------------------------- + +[ + ["comment", "// gulp.watch('./src/**/*.js', ['move']);"] +] + +---------------------------------------------------- + +Checks for multi-line comment inside single-line comment. See #1337 \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javascript/issue1340.test b/docs/_style/prism-master/tests/languages/javascript/issue1340.test new file mode 100644 index 00000000..3e340344 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/issue1340.test @@ -0,0 +1,15 @@ +/* + * ([{}]) + * // <= double slash comment + * ([{}]) <= punctuation + */ + +---------------------------------------------------- + +[ + ["comment", "/*\r\n * ([{}])\r\n * // <= double slash comment\r\n * ([{}]) <= punctuation\r\n */"] +] + +---------------------------------------------------- + +Checks for single-line comment inside multi-line comment. See #1340 \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javascript/issue1397.test b/docs/_style/prism-master/tests/languages/javascript/issue1397.test new file mode 100644 index 00000000..6f9b5fb2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/issue1397.test @@ -0,0 +1,21 @@ +`${`a string`}` + +---------------------------------------------------- + +[ + ["template-string", [ + ["string", "`"], + ["interpolation", [ + ["interpolation-punctuation", "${"], + ["template-string", [ + ["string", "`a string`"] + ]], + ["interpolation-punctuation", "}"] + ]], + ["string", "`"] + ]] +] + +---------------------------------------------------- + +Checks for nested template strings. See #1397 \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javascript/issue1526.test b/docs/_style/prism-master/tests/languages/javascript/issue1526.test new file mode 100644 index 00000000..320219cb --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/issue1526.test @@ -0,0 +1,35 @@ +fetch('some-resource.json') + .then(response => response.json()) + .catch(console.error); + +---------------------------------------------------- + +[ + ["function", "fetch"], + ["punctuation", "("], + ["string", "'some-resource.json'"], + ["punctuation", ")"], + ["punctuation", "."], + ["function", "then"], + ["punctuation", "("], + ["parameter", ["response"]], + ["operator", "=>"], + " response", + ["punctuation", "."], + ["function", "json"], + ["punctuation", "("], + ["punctuation", ")"], + ["punctuation", ")"], + ["punctuation", "."], + ["function", "catch"], + ["punctuation", "("], + "console", + ["punctuation", "."], + "error", + ["punctuation", ")"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for catch function which is not a keyword. See #1526 diff --git a/docs/_style/prism-master/tests/languages/javascript/keyword_feature.test b/docs/_style/prism-master/tests/languages/javascript/keyword_feature.test new file mode 100644 index 00000000..8053f2b1 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/keyword_feature.test @@ -0,0 +1,73 @@ +catch finally; + +as; async; await; break; case; +class; const; continue; debugger; +default; delete; do; else; enum; +export; extends; for; +from; function; get; if; implements; +import; in; instanceof; interface; let; +new; null; of; package; private; +protected; public; return; set; static; +super; switch; this; throw; try; +typeof; var; void; while; +with; yield; + +---------------------------------------------------- + +[ + ["keyword", "catch"], + ["keyword", "finally"], ["punctuation", ";"], + + ["keyword", "as"], ["punctuation", ";"], + ["keyword", "async"], ["punctuation", ";"], + ["keyword", "await"], ["punctuation", ";"], + ["keyword", "break"], ["punctuation", ";"], + ["keyword", "case"], ["punctuation", ";"], + ["keyword", "class"], ["punctuation", ";"], + ["keyword", "const"], ["punctuation", ";"], + ["keyword", "continue"], ["punctuation", ";"], + ["keyword", "debugger"], ["punctuation", ";"], + ["keyword", "default"], ["punctuation", ";"], + ["keyword", "delete"], ["punctuation", ";"], + ["keyword", "do"], ["punctuation", ";"], + ["keyword", "else"], ["punctuation", ";"], + ["keyword", "enum"], ["punctuation", ";"], + ["keyword", "export"], ["punctuation", ";"], + ["keyword", "extends"], ["punctuation", ";"], + ["keyword", "for"], ["punctuation", ";"], + ["keyword", "from"], ["punctuation", ";"], + ["keyword", "function"], ["punctuation", ";"], + ["keyword", "get"], ["punctuation", ";"], + ["keyword", "if"], ["punctuation", ";"], + ["keyword", "implements"], ["punctuation", ";"], + ["keyword", "import"], ["punctuation", ";"], + ["keyword", "in"], ["punctuation", ";"], + ["keyword", "instanceof"], ["punctuation", ";"], + ["keyword", "interface"], ["punctuation", ";"], + ["keyword", "let"], ["punctuation", ";"], + ["keyword", "new"], ["punctuation", ";"], + ["keyword", "null"], ["punctuation", ";"], + ["keyword", "of"], ["punctuation", ";"], + ["keyword", "package"], ["punctuation", ";"], + ["keyword", "private"], ["punctuation", ";"], + ["keyword", "protected"], ["punctuation", ";"], + ["keyword", "public"], ["punctuation", ";"], + ["keyword", "return"], ["punctuation", ";"], + ["keyword", "set"], ["punctuation", ";"], + ["keyword", "static"], ["punctuation", ";"], + ["keyword", "super"], ["punctuation", ";"], + ["keyword", "switch"], ["punctuation", ";"], + ["keyword", "this"], ["punctuation", ";"], + ["keyword", "throw"], ["punctuation", ";"], + ["keyword", "try"], ["punctuation", ";"], + ["keyword", "typeof"], ["punctuation", ";"], + ["keyword", "var"], ["punctuation", ";"], + ["keyword", "void"], ["punctuation", ";"], + ["keyword", "while"], ["punctuation", ";"], + ["keyword", "with"], ["punctuation", ";"], + ["keyword", "yield"], ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for all keywords. diff --git a/docs/_style/prism-master/tests/languages/javascript/number_feature.test b/docs/_style/prism-master/tests/languages/javascript/number_feature.test new file mode 100644 index 00000000..16f0e5fd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/number_feature.test @@ -0,0 +1,36 @@ +42 +3.14159 +4e10 +3.2E+6 +2.1e-10 +0b1101 +0o571 +0xbabe +0xBABE +NaN +Infinity +123n +0x123n + +---------------------------------------------------- + +[ + ["number", "42"], + ["number", "3.14159"], + ["number", "4e10"], + ["number", "3.2E+6"], + ["number", "2.1e-10"], + ["number", "0b1101"], + ["number", "0o571"], + ["number", "0xbabe"], + ["number", "0xBABE"], + ["number", "NaN"], + ["number", "Infinity"], + ["number", "123n"], + ["number", "0x123n"] +] + +---------------------------------------------------- + +Checks for decimal numbers, binary numbers, octal numbers, hexadecimal numbers. +Also checks for keywords representing numbers. diff --git a/docs/_style/prism-master/tests/languages/javascript/operator_feature.test b/docs/_style/prism-master/tests/languages/javascript/operator_feature.test new file mode 100644 index 00000000..eb46bc49 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/operator_feature.test @@ -0,0 +1,33 @@ +- -- -= ++ ++ += +< <= << <<= +> >= >> >>= >>> >>>= += == === => +! != !== +& && &= +| || |= +* ** *= **= +/ /= ~ +^ ^= % %= +? ... + +---------------------------------------------------- + +[ + ["operator", "-"], ["operator", "--"], ["operator", "-="], + ["operator", "+"], ["operator", "++"], ["operator", "+="], + ["operator", "<"], ["operator", "<="], ["operator", "<<"], ["operator", "<<="], + ["operator", ">"], ["operator", ">="], ["operator", ">>"], ["operator", ">>="], ["operator", ">>>"], ["operator", ">>>="], + ["operator", "="], ["operator", "=="], ["operator", "==="], ["operator", "=>"], + ["operator", "!"], ["operator", "!="], ["operator", "!=="], + ["operator", "&"], ["operator", "&&"], ["operator", "&="], + ["operator", "|"], ["operator", "||"], ["operator", "|="], + ["operator", "*"], ["operator", "**"], ["operator", "*="], ["operator", "**="], + ["operator", "/"], ["operator", "/="], ["operator", "~"], + ["operator", "^"], ["operator", "^="], ["operator", "%"], ["operator", "%="], + ["operator", "?"], ["operator", "..."] +] + +---------------------------------------------------- + +Checks for all operators. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javascript/regex_feature.test b/docs/_style/prism-master/tests/languages/javascript/regex_feature.test new file mode 100644 index 00000000..e08db8a2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/regex_feature.test @@ -0,0 +1,29 @@ +/foo bar/; +/foo/gimyu, +/[\[\]]{2,4}(?:foo)*/; +/foo"test"bar/; +/foo\//; +/[]/; +/[\]/]/; +1 / 4 + "/, not a regex"; +/ '1' '2' '3' '4' '5' / +[/foo/] + +---------------------------------------------------- + +[ + ["regex", "/foo bar/"], ["punctuation", ";"], + ["regex", "/foo/gimyu"], ["punctuation", ","], + ["regex", "/[\\[\\]]{2,4}(?:foo)*/"], ["punctuation", ";"], + ["regex", "/foo\"test\"bar/"], ["punctuation", ";"], + ["regex", "/foo\\//"], ["punctuation", ";"], + ["regex", "/[]/"], ["punctuation", ";"], + ["regex", "/[\\]/]/"], ["punctuation", ";"], + ["number", "1"], ["operator", "/"], ["number", "4"], ["operator", "+"], ["string", "\"/, not a regex\""], ["punctuation", ";"], + ["regex", "/ '1' '2' '3' '4' '5' /"], + ["punctuation", "["], ["regex", "/foo/"], ["punctuation", "]"] +] + +---------------------------------------------------- + +Checks for regex. diff --git a/docs/_style/prism-master/tests/languages/javascript/supposed-classes_feature.test b/docs/_style/prism-master/tests/languages/javascript/supposed-classes_feature.test new file mode 100644 index 00000000..df85fd4f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/supposed-classes_feature.test @@ -0,0 +1,30 @@ +Foo.prototype.bar; +Bar.constructor; +fooBar.prototype.bar; + +---------------------------------------------------- + +[ + ["class-name", "Foo"], + ["punctuation", "."], + "prototype", + ["punctuation", "."], + "bar", + ["punctuation", ";"], + + ["class-name", "Bar"], + ["punctuation", "."], + "constructor", + ["punctuation", ";"], + + "\nfooBar", + ["punctuation", "."], + "prototype", + ["punctuation", "."], + "bar", + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for supposed function variables based on standard function invocations or modifications. diff --git a/docs/_style/prism-master/tests/languages/javascript/supposed-function_feature.test b/docs/_style/prism-master/tests/languages/javascript/supposed-function_feature.test new file mode 100644 index 00000000..7568de9b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/supposed-function_feature.test @@ -0,0 +1,38 @@ +foo.apply(thisArg, args); +bar.call(...args); +fooBar.bind(thisArg); + +---------------------------------------------------- + +[ + ["function", "foo"], + ["punctuation", "."], + ["function", "apply"], + ["punctuation", "("], + "thisArg", + ["punctuation", ","], + " args", + ["punctuation", ")"], + ["punctuation", ";"], + + ["function", "bar"], + ["punctuation", "."], + ["function", "call"], + ["punctuation", "("], + ["operator", "..."], + "args", + ["punctuation", ")"], + ["punctuation", ";"], + + ["function", "fooBar"], + ["punctuation", "."], + ["function", "bind"], + ["punctuation", "("], + "thisArg", + ["punctuation", ")"], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks for supposed function variables based on standard function invocations or modifications. diff --git a/docs/_style/prism-master/tests/languages/javascript/template-string_feature.test b/docs/_style/prism-master/tests/languages/javascript/template-string_feature.test new file mode 100644 index 00000000..664c056d --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/template-string_feature.test @@ -0,0 +1,49 @@ +`foo bar` +`foo +bar` +`40+2=${40+2}` +`${foo()}` +"foo `a` `b` `c` `d` bar" +"test // test" `template` + +---------------------------------------------------- + +[ + ["template-string", [ + ["string", "`foo bar`"] + ]], + ["template-string", [ + ["string", "`foo\r\nbar`"] + ]], + ["template-string", [ + ["string", "`40+2="], + ["interpolation", [ + ["interpolation-punctuation", "${"], + ["number", "40"], + ["operator", "+"], + ["number", "2"], + ["interpolation-punctuation", "}"] + ]], + ["string", "`"] + ]], + ["template-string", [ + ["string", "`"], + ["interpolation", [ + ["interpolation-punctuation", "${"], + ["function", "foo"], + ["punctuation", "("], + ["punctuation", ")"], + ["interpolation-punctuation", "}"] + ]], + ["string", "`"] + ]], + ["string", "\"foo `a` `b` `c` `d` bar\""], + ["string", "\"test // test\""], + ["template-string", [ + ["string", "`template`"] + ]] +] + +---------------------------------------------------- + +Checks for single-line and multi-line template strings. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javascript/try-catch_feature.test b/docs/_style/prism-master/tests/languages/javascript/try-catch_feature.test new file mode 100644 index 00000000..c4bbd8b2 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javascript/try-catch_feature.test @@ -0,0 +1,22 @@ +try { } catch (e) { } finally { } + +---------------------------------------------------- + +[ + ["keyword", "try"], + ["punctuation", "{"], + ["punctuation", "}"], + ["keyword", "catch"], + ["punctuation", "("], + "e", + ["punctuation", ")"], + ["punctuation", "{"], + ["punctuation", "}"], + ["keyword", "finally"], + ["punctuation", "{"], + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for try statements. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/javastacktrace/more_feature.test b/docs/_style/prism-master/tests/languages/javastacktrace/more_feature.test new file mode 100644 index 00000000..8f9dc6ae --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javastacktrace/more_feature.test @@ -0,0 +1,22 @@ +... 6 more + ... 6 common frames omitted + +---------------------------------------------------- + +[ + ["more", [ + ["punctuation", "..."], + ["number", "6"], + ["keyword", "more"] + ]], + + ["more", [ + ["punctuation", "..."], + ["number", "6"], + ["keyword", "common frames omitted"] + ]] +] + +---------------------------------------------------- + +Checks for the message that some frames were omitted. diff --git a/docs/_style/prism-master/tests/languages/javastacktrace/stack-frame_feature.test b/docs/_style/prism-master/tests/languages/javastacktrace/stack-frame_feature.test new file mode 100644 index 00000000..b4c400e4 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javastacktrace/stack-frame_feature.test @@ -0,0 +1,71 @@ +at Main.main(Main.java:13) +at Main.main(Main.java:13) Same but with some additional notes +at com.foo.bar.Main$FooBar.main(Native Method) +at Main$FooBar.(Unknown Source) + +---------------------------------------------------- + +[ + ["stack-frame", [ + ["keyword", "at"], + ["class-name", "Main"], + ["punctuation", "."], + ["function", "main"], + ["punctuation", "("], + ["source", [ + ["file", "Main.java"], + ["punctuation", ":"], + ["line-number", "13"] + ]], + ["punctuation", ")"] + ]], + + ["stack-frame", [ + ["keyword", "at"], + ["class-name", "Main"], + ["punctuation", "."], + ["function", "main"], + ["punctuation", "("], + ["source", [ + ["file", "Main.java"], + ["punctuation", ":"], + ["line-number", "13"] + ]], + ["punctuation", ")"] + ]], + " Same but with some additional notes\n", + + ["stack-frame", [ + ["keyword", "at"], + ["namespace", "com"], + ["punctuation", "."], + ["namespace", "foo"], + ["punctuation", "."], + ["namespace", "bar"], + ["punctuation", "."], + ["class-name", "Main$FooBar"], + ["punctuation", "."], + ["function", "main"], + ["punctuation", "("], + ["source", [ + ["keyword", "Native Method"] + ]], + ["punctuation", ")"] + ]], + + ["stack-frame", [ + ["keyword", "at"], + ["class-name", "Main$FooBar"], + ["punctuation", "."], + ["function", ""], + ["punctuation", "("], + ["source", [ + ["keyword", "Unknown Source"] + ]], + ["punctuation", ")"] + ]] +] + +---------------------------------------------------- + +Checks for stack frames. diff --git a/docs/_style/prism-master/tests/languages/javastacktrace/summary_feature.test b/docs/_style/prism-master/tests/languages/javastacktrace/summary_feature.test new file mode 100644 index 00000000..01497f85 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/javastacktrace/summary_feature.test @@ -0,0 +1,155 @@ +java.lang.NullPointerException +java.lang.NullPointerException: This is bad +HighLevelException: MidLevelException: LowLevelException +HighLevelException: MidLevelException: LowLevelException: This is bad + +Exception in thread "main" java.lang.RuntimeException: A test exception +Exception in thread "main" HighLevelException: MidLevelException: LowLevelException: This is bad + +Caused by: Exception: This also includes causes and suppressed exceptions +Caused by: MidLevelException: LowLevelException +Caused by: com.example.myproject.MyProjectServletException + +Suppressed: java.lang.RuntimeException: could not insert: [com.example.myproject.MyEntity] + +---------------------------------------------------- + +[ + ["summary", [ + ["exceptions", [ + ["namespace", "java"], + ["punctuation", "."], + ["namespace", "lang"], + ["punctuation", "."], + ["class-name", "NullPointerException"] + ]] + ]], + + ["summary", [ + ["exceptions", [ + ["namespace", "java"], + ["punctuation", "."], + ["namespace", "lang"], + ["punctuation", "."], + ["class-name", "NullPointerException"] + ]], + ["punctuation", ":"], + ["message", "This is bad"] + ]], + + ["summary", [ + ["exceptions", [ + ["class-name", "HighLevelException"] + ]], + ["punctuation", ":"], + ["exceptions", [ + ["class-name", "MidLevelException"] + ]], + ["punctuation", ":"], + ["exceptions", [ + ["class-name", "LowLevelException"] + ]] + ]], + + ["summary", [ + ["exceptions", [ + ["class-name", "HighLevelException"] + ]], + ["punctuation", ":"], + ["exceptions", [ + ["class-name", "MidLevelException"] + ]], + ["punctuation", ":"], + ["exceptions", [ + ["class-name", "LowLevelException"] + ]], + ["punctuation", ":"], + ["message", "This is bad"] + ]], + + ["summary", [ + ["keyword", "Exception in thread"], + ["string", "\"main\""], + ["exceptions", [ + ["namespace", "java"], + ["punctuation", "."], + ["namespace", "lang"], + ["punctuation", "."], + ["class-name", "RuntimeException"] + ]], + ["punctuation", ":"], + ["message", "A test exception"] + ]], + + ["summary", [ + ["keyword", "Exception in thread"], + ["string", "\"main\""], + ["exceptions", [ + ["class-name", "HighLevelException"] + ]], + ["punctuation", ":"], + ["exceptions", [ + ["class-name", "MidLevelException"] + ]], + ["punctuation", ":"], + ["exceptions", [ + ["class-name", "LowLevelException"] + ]], + ["punctuation", ":"], + ["message", "This is bad"] + ]], + + ["summary", [ + ["keyword", "Caused by"], + ["punctuation", ":"], + ["exceptions", [ + ["class-name", "Exception"] + ]], + ["punctuation", ":"], + ["message", "This also includes causes and suppressed exceptions"] + ]], + + ["summary", [ + ["keyword", "Caused by"], + ["punctuation", ":"], + ["exceptions", [ + ["class-name", "MidLevelException"] + ]], + ["punctuation", ":"], + ["exceptions", [ + ["class-name", "LowLevelException"] + ]] + ]], + + ["summary", [ + ["keyword", "Caused by"], + ["punctuation", ":"], + ["exceptions", [ + ["namespace", "com"], + ["punctuation", "."], + ["namespace", "example"], + ["punctuation", "."], + ["namespace", "myproject"], + ["punctuation", "."], + ["class-name", "MyProjectServletException"] + ]] + ]], + + ["summary", [ + ["keyword", "Suppressed"], + ["punctuation", ":"], + ["exceptions", [ + ["namespace", "java"], + ["punctuation", "."], + ["namespace", "lang"], + ["punctuation", "."], + ["class-name", "RuntimeException"] + ]], + ["punctuation", ":"], + ["message", "could not insert: [com.example.myproject.MyEntity]"] + ]] +] + +---------------------------------------------------- + +Checks for exception summaries. diff --git a/docs/_style/prism-master/tests/languages/jolie/deployment_features.test b/docs/_style/prism-master/tests/languages/jolie/deployment_features.test new file mode 100644 index 00000000..ebcd86a7 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/jolie/deployment_features.test @@ -0,0 +1,43 @@ +Aggregates: First, Second with Third +Redirects: First => Second, Third => Fourth +Jolie: "logger.ol" in LoggerService +log@LoggerService( new )(); +println @ Console( "none" )() +---------------------------------------------------- + [ + [ "keyword", "Aggregates" ], + [ "operator", ":" ], + [ "aggregates", [ + [ "function", "First" ], [ "punctuation", ","], + [ "function", "Second" ], + [ "withExtension", [ + [ "keyword", "with" ], " Third" ] + ] + ] + ], + [ "keyword", "Redirects" ], + [ "operator", ":" ], + [ "redirects", + [ + [ "function", "First" ], + [ "symbol", "=>" ], + [ "function", "Second" ], [ "punctuation", ","], + [ "function", "Third" ], + [ "symbol", "=>" ], + [ "function", "Fourth" ] + ] + ], + [ "keyword", "Jolie" ], + [ "operator", ":" ], + [ "string", "\"logger.ol\"" ], + [ "keyword", "in" ], + [ "function", "LoggerService" ], + "\nlog", [ "symbol", "@" ], [ "function", "LoggerService" ], + "( ", [ "keyword", "new" ], " )()", [ "symbol", ";" ], + "\nprintln ", [ "symbol", "@" ], [ "function", "Console" ], + "( ", [ "string", "\"none\"" ], " )()" +] + +---------------------------------------------------- + +Checks for outputPorts and Aggregates and Redirect constructs. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/jolie/keyword_feature.test b/docs/_style/prism-master/tests/languages/jolie/keyword_feature.test new file mode 100644 index 00000000..55a95cab --- /dev/null +++ b/docs/_style/prism-master/tests/languages/jolie/keyword_feature.test @@ -0,0 +1,129 @@ +include +define +is_defined +undef +main +init +outputPort ; +inputPort ; +Location +Protocol +Interfaces +RequestResponse +OneWay +type +interface +extender +throws +cset +csets +forward +courier ; +Aggregates +Redirects +embedded +extender +execution +sequential +concurrent +single +scope +install +throw +comp +cH +default +global +linkIn +linkOut +synchronized +this +new +for +if +else +while +in ; +Jolie +Java +Javascript +nullProcess +spawn +constants +with +provide +until +exit +foreach +instanceof +over +service + +---------------------------------------------------- +[ + ["keyword", "include" ], + ["keyword", "define" ], + ["keyword", "is_defined" ], + ["keyword", "undef" ], + ["keyword", "main" ], + ["keyword", "init" ], + ["keyword", "outputPort" ], [ "symbol", ";" ], + ["keyword", "inputPort" ], [ "symbol", ";" ], + ["keyword", "Location" ], + ["keyword", "Protocol" ], + ["keyword", "Interfaces" ], + ["keyword", "RequestResponse" ], + ["keyword", "OneWay" ], + ["keyword", "type" ], + ["keyword", "interface" ], + ["keyword", "extender" ], + ["keyword", "throws" ], + ["keyword", "cset" ], + ["keyword", "csets" ], + ["keyword", "forward" ], + ["keyword", "courier" ], [ "symbol", ";" ], + ["keyword", "Aggregates" ], + ["keyword", "Redirects" ], + ["keyword", "embedded" ], + ["keyword", "extender" ], + ["keyword", "execution" ], + ["keyword", "sequential" ], + ["keyword", "concurrent" ], + ["keyword", "single" ], + ["keyword", "scope" ], + ["keyword", "install" ], + ["keyword", "throw" ], + ["keyword", "comp" ], + ["keyword", "cH" ], + ["keyword", "default" ], + ["keyword", "global" ], + ["keyword", "linkIn" ], + ["keyword", "linkOut" ], + ["keyword", "synchronized" ], + ["keyword", "this" ], + ["keyword", "new" ], + ["keyword", "for" ], + ["keyword", "if" ], + ["keyword", "else" ], + ["keyword", "while" ], + ["keyword", "in" ], [ "symbol", ";" ], + ["keyword", "Jolie" ], + ["keyword", "Java" ], + ["keyword", "Javascript" ], + ["keyword", "nullProcess" ], + ["keyword", "spawn" ], + ["keyword", "constants" ], + ["keyword", "with" ], + ["keyword", "provide" ], + ["keyword", "until" ], + ["keyword", "exit" ], + ["keyword", "foreach" ], + ["keyword", "instanceof" ], + ["keyword", "over" ], + ["keyword", "service" ] + +] + +---------------------------------------------------- + +Checks for all keywords. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/jolie/number_feature.test b/docs/_style/prism-master/tests/languages/jolie/number_feature.test new file mode 100644 index 00000000..90d5c96f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/jolie/number_feature.test @@ -0,0 +1,19 @@ +42 +42L +1.2e3 +0.1E-4 +0.2e+1 + +---------------------------------------------------- + +[ + ["number", "42" ], + ["number", "42L" ], + ["number", "1.2e3" ], + ["number", "0.1E-4" ], + ["number", "0.2e+1" ] +] + +---------------------------------------------------- + +Checks for decimal numbers. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/jolie/operator_feature.test b/docs/_style/prism-master/tests/languages/jolie/operator_feature.test new file mode 100644 index 00000000..963acc2f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/jolie/operator_feature.test @@ -0,0 +1,42 @@ ++ ++ += +- -- -= +! != +< <= > >= -> << += == +&& +? * / % ; : | @ + +---------------------------------------------------- + +[ + ["operator", "+"], + ["operator", "++"], + ["operator", "+="], + ["operator", "-"], + ["operator", "--"], + ["operator", "-="], + ["operator", "!"], + ["operator", "!="], + ["operator", "<" ], + ["operator", "<=" ], + ["operator", ">" ], + ["operator", ">=" ], + ["operator", "->" ], + ["operator", "<<" ], + ["operator", "=" ], + ["operator", "==" ], + ["operator", "&&" ], + [ "operator", "?" ], + [ "operator", "*" ], + [ "operator", "/" ], + [ "operator", "%" ], + [ "symbol", ";" ], + [ "operator", ":" ], + [ "symbol", "|" ], + [ "symbol", "@" ] + +] + +---------------------------------------------------- + +Checks for all operators and symbols. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/json+http/json-suffix_inclusion.test b/docs/_style/prism-master/tests/languages/json+http/json-suffix_inclusion.test new file mode 100644 index 00000000..b2400978 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json+http/json-suffix_inclusion.test @@ -0,0 +1,21 @@ +Content-type: application/x.foo+bar+json + +{"foo":"bar"} + +---------------------------------------------------- + +[ + ["header-name", "Content-type:"], + " application/x.foo+bar+json", + ["application/json", [ + ["punctuation", "{"], + ["property", "\"foo\""], + ["operator", ":"], + ["string", "\"bar\""], + ["punctuation", "}"] + ]] +] + +---------------------------------------------------- + +Checks for content with JSON suffix in HTTP. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/json+http/json_inclusion.test b/docs/_style/prism-master/tests/languages/json+http/json_inclusion.test new file mode 100644 index 00000000..2282637f --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json+http/json_inclusion.test @@ -0,0 +1,21 @@ +Content-type: application/json + +{"foo":"bar"} + +---------------------------------------------------- + +[ + ["header-name", "Content-type:"], + " application/json", + ["application/json", [ + ["punctuation", "{"], + ["property", "\"foo\""], + ["operator", ":"], + ["string", "\"bar\""], + ["punctuation", "}"] + ]] +] + +---------------------------------------------------- + +Checks for JSON content in HTTP. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/json/boolean_feature.test b/docs/_style/prism-master/tests/languages/json/boolean_feature.test new file mode 100644 index 00000000..4019c444 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json/boolean_feature.test @@ -0,0 +1,13 @@ +true +false + +---------------------------------------------------- + +[ + ["boolean", "true"], + ["boolean", "false"] +] + +---------------------------------------------------- + +Checks for booleans. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/json/comment_feature.test b/docs/_style/prism-master/tests/languages/json/comment_feature.test new file mode 100644 index 00000000..50341d39 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json/comment_feature.test @@ -0,0 +1,27 @@ +{ + // Line comment + "//": "//", + + /* Block comment */ + "/*": "*/" +} + +---------------------------------------------------- + +[ + ["punctuation", "{"], + ["comment", "// Line comment"], + ["property", "\"//\""], + ["operator", ":"], + ["string", "\"//\""], + ["punctuation", ","], + ["comment", "/* Block comment */"], + ["property", "\"/*\""], + ["operator", ":"], + ["string", "\"*/\""], + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for single-line and multi-line comments. diff --git a/docs/_style/prism-master/tests/languages/json/null_feature.test b/docs/_style/prism-master/tests/languages/json/null_feature.test new file mode 100644 index 00000000..1283944a --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json/null_feature.test @@ -0,0 +1,11 @@ +null + +---------------------------------------------------- + +[ + ["null", "null"] +] + +---------------------------------------------------- + +Checks for null. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/json/number_feature.test b/docs/_style/prism-master/tests/languages/json/number_feature.test new file mode 100644 index 00000000..ca87a480 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json/number_feature.test @@ -0,0 +1,27 @@ +0 +123 +3.14159 +5.0e8 +0.2E+2 +47e-5 +-1.23 +-2.34E33 +-4.34E-33 + +---------------------------------------------------- + +[ + ["number", "0"], + ["number", "123"], + ["number", "3.14159"], + ["number", "5.0e8"], + ["number", "0.2E+2"], + ["number", "47e-5"], + ["number", "-1.23"], + ["number", "-2.34E33"], + ["number", "-4.34E-33"] +] + +---------------------------------------------------- + +Checks for numbers. diff --git a/docs/_style/prism-master/tests/languages/json/operator_feature.test b/docs/_style/prism-master/tests/languages/json/operator_feature.test new file mode 100644 index 00000000..9d30b2e5 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json/operator_feature.test @@ -0,0 +1,11 @@ +: + +---------------------------------------------------- + +[ + ["operator", ":"] +] + +---------------------------------------------------- + +Checks for all operators. diff --git a/docs/_style/prism-master/tests/languages/json/property_feature.test b/docs/_style/prism-master/tests/languages/json/property_feature.test new file mode 100644 index 00000000..3880ad73 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json/property_feature.test @@ -0,0 +1,33 @@ +{"foo\"bar\"baz":1,"foo":2} +{ + "foo": 1, + "b\"ar": 2 +} + +---------------------------------------------------- + +[ + ["punctuation", "{"], + ["property", "\"foo\\\"bar\\\"baz\""], + ["operator", ":"], + ["number", "1"], + ["punctuation", ","], + ["property", "\"foo\""], + ["operator", ":"], + ["number", "2"], + ["punctuation", "}"], + + ["punctuation", "{"], + ["property", "\"foo\""], + ["operator", ":"], + ["number", "1"], + ["punctuation", ","], + ["property", "\"b\\\"ar\""], + ["operator", ":"], + ["number", "2"], + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for features. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/json/punctuation_feature.test b/docs/_style/prism-master/tests/languages/json/punctuation_feature.test new file mode 100644 index 00000000..b8e351cd --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json/punctuation_feature.test @@ -0,0 +1,20 @@ +{} +{ } +[] +], +}, +, + +---------------------------------------------------- + +[ + ["punctuation", "{"], ["punctuation", "}"], + ["punctuation", "{"], ["punctuation", "}"], + ["punctuation", "["], ["punctuation", "]"], + ["punctuation", "]"], ["punctuation", ","], + ["punctuation", "}"], ["punctuation", ","], + ["punctuation", ","] +] +---------------------------------------------------- + +Checks for punctuation. diff --git a/docs/_style/prism-master/tests/languages/json/string_feature.test b/docs/_style/prism-master/tests/languages/json/string_feature.test new file mode 100644 index 00000000..8dddae58 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/json/string_feature.test @@ -0,0 +1,27 @@ +"" +"foo" +"foo\"bar\"baz" +"\u2642\\ " +{"foo":"bar","baz":"\""} + +---------------------------------------------------- + +[ + ["string", "\"\""], + ["string", "\"foo\""], + ["string", "\"foo\\\"bar\\\"baz\""], + ["string", "\"\\u2642\\\\ \""], + ["punctuation", "{"], + ["property", "\"foo\""], + ["operator", ":"], + ["string", "\"bar\""], + ["punctuation", ","], + ["property", "\"baz\""], + ["operator", ":"], + ["string", "\"\\\"\""], + ["punctuation", "}"] +] + +---------------------------------------------------- + +Checks for strings. diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1103.test b/docs/_style/prism-master/tests/languages/jsx/issue1103.test new file mode 100644 index 00000000..fdb4030c --- /dev/null +++ b/docs/_style/prism-master/tests/languages/jsx/issue1103.test @@ -0,0 +1,29 @@ +var myDivElement =
        ; + +---------------------------------------------------- + +[ + ["keyword", "var"], + " myDivElement ", + ["operator", "="], + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "div" + ]], + ["attr-name", ["foo"]], + ["attr-value", [ + ["punctuation", "="], + ["punctuation", "\""], + "bar baz", + ["punctuation", "\""] + ]], + ["punctuation", "/>"] + ]], + ["punctuation", ";"] +] + +---------------------------------------------------- + +Checks that quoted attribute values can contain spaces. +See #1103. \ No newline at end of file diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1235.test b/docs/_style/prism-master/tests/languages/jsx/issue1235.test new file mode 100644 index 00000000..d28d61ff --- /dev/null +++ b/docs/_style/prism-master/tests/languages/jsx/issue1235.test @@ -0,0 +1,29 @@ + + +---------------------------------------------------- + +[ + ["tag", [ + ["tag", [ + ["punctuation", "<"], + ["class-name", "Child"] + ]], + ["attr-name", ["options"]], + ["script", [ + ["script-punctuation", "="], + ["punctuation", "{"], + ["punctuation", "{"], + " track", + ["punctuation", ":"], + ["boolean", "true"], + ["punctuation", "}"], + ["punctuation", "}"] + ]], + ["punctuation", ">"] + ]] +] + +---------------------------------------------------- + +Checks that attribute can contain an simple object. +See #1235. diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1236.test b/docs/_style/prism-master/tests/languages/jsx/issue1236.test new file mode 100644 index 00000000..3cc3ae2b --- /dev/null +++ b/docs/_style/prism-master/tests/languages/jsx/issue1236.test @@ -0,0 +1,26 @@ + + +---------------------------------------------------- + +[ + ["tag", [ + ["tag", [ + ["punctuation", "<"], + ["class-name", "Child"] + ]], + ["spread", [ + ["punctuation", "{"], + ["punctuation", "..."], + ["attr-value", "this"], + ["punctuation", "."], + ["attr-value", "props"], + ["punctuation", "}"] + ]], + ["punctuation", ">"] + ]] +] + +---------------------------------------------------- + +Checks that spread can contain an object property. +See #1236. diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1294.test b/docs/_style/prism-master/tests/languages/jsx/issue1294.test new file mode 100644 index 00000000..4d167f14 --- /dev/null +++ b/docs/_style/prism-master/tests/languages/jsx/issue1294.test @@ -0,0 +1,71 @@ +export default () => ( +
        +

        Hi! I'm building a fake Gatsby site as part of a tutorial!

        +

        + What do I like to do? Lots of course but definitely enjoy building + websites. +

        +
        +); + +---------------------------------------------------- + +[ + ["keyword", "export"], + ["keyword", "default"], + ["punctuation", "("], + ["punctuation", ")"], + ["operator", "=>"], ["punctuation", "("], + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "div" + ]], + ["punctuation", ">"] + ]], + ["plain-text", "\r\n\t\t"], + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "h1" + ]], + ["punctuation", ">"] + ]], + ["plain-text", "Hi! I'm building a fake Gatsby site as part of a tutorial!"], + ["tag", [ + ["tag", [ + ["punctuation", ""] + ]], + ["plain-text", "\r\n\t\t"], + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "p" + ]], + ["punctuation", ">"] + ]], + ["plain-text", "\r\n\t\t\tWhat do I like to do? Lots of course but definitely enjoy building\r\n\t\t\twebsites.\r\n\t\t"], + ["tag", [ + ["tag", [ + ["punctuation", ""] + ]], + ["plain-text", "\r\n\t"], + ["tag", [ + ["tag", [ + ["punctuation", ""] + ]], + ["punctuation", ")"], ["punctuation", ";"] +] + +---------------------------------------------------- + +See #1294. diff --git a/docs/_style/prism-master/tests/languages/jsx/issue1335.test b/docs/_style/prism-master/tests/languages/jsx/issue1335.test new file mode 100644 index 00000000..35c2704e --- /dev/null +++ b/docs/_style/prism-master/tests/languages/jsx/issue1335.test @@ -0,0 +1,126 @@ +