Merge pull request #2 from LingCoder/master

update
This commit is contained in:
KIDlty
2019-04-09 20:36:33 +08:00
committed by GitHub
1831 changed files with 105720 additions and 3178 deletions

41
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,41 @@
## 如何贡献项目
领取或创建新的 [Issue](https://github.com/lingcoder/OnJava8/issues),如 [issue 14](https://github.com/lingcoder/OnJava8/issues/14) ,在编辑栏的右侧添加自己为 `Assignee`
在 [GitHub](https://github.com/lingcoder/OnJava8/fork) 上 `fork` 项目到自己的仓库,你的如 `user_name/OnJava8`,然后 `clone` 到本地,并设置用户信息。
```bash
$ git clone git@github.com:user_name/OnJava8.git
$ cd OnJava8
```
修改代码后提交,并推送到自己的仓库,注意修改提交消息为对应 Issue 号和描述。
```bash
# 更新内容
$ git commit -a -s
# 在提交对话框里添加类似如下内容 "Fix issue #14: 描述你的修改内容"
$ git push
```
在 [GitHub](https://github.com/lingcoder/OnJava8/pulls) 上提交 `Pull Request`,添加标签,并邀请维护者进行 `Review`
定期使用源项目仓库内容同步更新自己仓库的内容。
```bash
$ git remote add upstream https://github.com/lingcoder/OnJava8
$ git fetch upstream
$ git rebase upstream/master
$ git push -f origin master
```
## 排版规范
本开源书籍排版布局和翻译风格上参考**阮一峰**老师的 [中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide)

107
README.md
View File

@@ -2,64 +2,87 @@
## 书籍简介
* 本书原作者为 \[美\] [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://github.com/LingCoder/OnJava8/blob/master/SUMMARY.md)
- Gitee 快速阅读:[进入目录](https://gitee.com/lingcoder/OnJava8/blob/master/SUMMARY.md)
- GitHub Pages 完整阅读:[进入](https://lingcoder.github.io/OnJava8/)
- GitBook 完整阅读:[进入Gitbook](https://lingcoder.gitbook.io/onjava8)
- Gitee Pages 完整阅读:[进入](https://lingcoder.gitee.io/onjava8/)
## 翻译进度
- [x] 前言
- [x] 简介
- [x] 第一章 对象的概念
- [x] 第二章 安装Java和本书用例
- [x] 第三章 万物皆对象
- [ ] 第四章 运算符 (正在翻译中……)
- [x] 第五章 控制流
- [ ] 第六章 初始化和清理 (正在翻译中……)
- [ ] 第七章 封装 (正在翻译中……)
- [x] 第十三章 函数式编程
- [x] 附录:新IO
- [ ] 待续······
- [x] [前言](docs/book/00-Preface.md)
- [x] [简介](docs/book/00-Introduction.md)
- [x] [第一章 对象的概念](docs/book/01-What-is-an-Object.md)
- [x] [第二章 安装Java和本书用例](docs/book/02-Installing-Java-and-the-Book-Examples.md)
- [x] [第三章 万物皆对象](docs/book/03-Objects-Everywhere.md)
- [x] [第四章 运算符](docs/book/04-Operators.md)
- [x] [第五章 控制流](docs/book/05-Control-Flow.md)
- [ ] [第六章 初始化和清理](docs/book/06-Housekeeping.md) (正在翻译中……)
- [ ] [第七章 封装](docs/book/07-Implementation-Hiding.md) (正在翻译中……)
- [ ] [第八章 复用](docs/book/08-Reuse.md)
- [ ] [第九章 多态](docs/book/09-Polymorphism.md)
- [ ] [第十章 接口](docs/book/10-Interfaces.md)
- [ ] [第十一章 内部类](docs/book/11-Inner-Classes.md)
- [ ] [第十二章 集合](docs/book/12-Collections.md)
- [x] [第十三章 函数式编程](docs/book/13-Functional-Programming.md)
- [ ] [第十四章 流式编程](docs/book/14-Streams.md)
- [ ] [第十五章 异常](docs/book/15-Exceptions.md)
- [ ] [第十六章 代码校验](docs/book/16-Validating-Your-Code.md)
- [ ] [第十七章 文件](docs/book/17-Files.md)
- [ ] [第十八章 字符串](docs/book/18-Strings.md)
- [ ] [第十九章 类型信息](docs/book/19-Type-Information.md)
- [ ] [第二十章 泛型](docs/book/20-Generics.md)
- [ ] [第二十一章 数组](docs/book/21-Arrays.md)
- [ ] [第二十二章 枚举](docs/book/22-Enumerations.md)
- [ ] [第二十三章 注解](docs/book/23-Annotations.md)
- [ ] [第二十四章 并发编程](docs/book/24-Concurrent-Programming.md)
- [ ] [第二十五章 设计模式](docs/book/25-Patterns.md)
- [ ] [附录:补充](docs/book/Appendix-Supplements.md)
- [ ] [附录:编程指南](docs/book/Appendix-Programming-Guidelines.md)
- [ ] [附录:文档注释](docs/book/Appendix-Javadoc.md)
- [ ] [附录:对象传递和返回](docs/book/Appendix-Passing-and-Returning-Objects.md)
- [ ] [附录:流式IO](docs/book/Appendix-IO-Streams.md)
- [ ] [附录:标准IO](docs/book/Appendix-Standard-IO.md)
- [x] [附录:新IO](docs/book/Appendix-New-IO.md)
- [ ] [附录:理解equals和hashCode方法](docs/book/Appendix-Understanding-equals-and-hashCode.md)
- [ ] [附录:集合主题](docs/book/Appendix-Collection-Topics.md)
- [ ] [附录:并发底层原理](docs/book/Appendix-Low-Level-Concurrency.md)
- [ ] [附录:数据压缩](docs/book/Appendix-Data-Compression.md)
- [ ] [附录:对象序列化](docs/book/Appendix-Object-Serialization.md)
- [ ] [附录:静态语言类型检查](docs/book/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md)
- [ ] [附录:成为一名程序员](docs/book/Appendix-Becoming-a-Programmer.md)
## 一起交流
交流群721698221 <a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=4cb8bdc26879e544a0e1c2027305afef699029d5c0f314099a239b7c4f309c5f"><img border="0" src="https://raw.githubusercontent.com/LingCoder/OnJava8/master/images/qqgroup.png" alt="OnJava8翻译交流" title="OnJava8翻译交流"></a>( 点击图标即可加入 )<br>
交流群721698221 <a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=4cb8bdc26879e544a0e1c2027305afef699029d5c0f314099a239b7c4f309c5f"><img border="0" src="https://raw.githubusercontent.com/LingCoder/OnJava8/master/docs/images/qqgroup.png" alt="OnJava8翻译交流" title="OnJava8翻译交流"></a>( 点击图标即可加入 )<br>
<div align="left">
<img src="https://raw.githubusercontent.com/LingCoder/OnJava8/master/images/QQGroupQRCode.png" alt="QQGroupQRCode"/>
<img src="https://raw.githubusercontent.com/LingCoder/OnJava8/master/assets/QQGroupQRCode.png" alt="QQGroupQRCode"/>
</div>
## 更新记录
## 大事记
- 2018-11-20 初始化项目
- 2018-12-20 前言,简介翻译完成
- 2019-01-01 第一章 对象的概念翻译完成
- 2019-01-06 第二章 安装Java和本书用例翻译完成
- 2019-03-14 第三章 万物皆对象翻译完成
- 2019-03-17 第五章 控制流翻译完成
- 2019-03-20 第十三章 函数式编程翻译完成
- 2019-03-24 附录:新IO翻译完成
## 原书作者
## 原书资料
<div align="left">
<img src="https://raw.githubusercontent.com/LingCoder/OnJava8/master/cover_small.jpg" alt="cover_small"/>
@@ -67,17 +90,19 @@
* 作者: Bruce Eckel
* ISBN: 9780981872520
* 页数2038
* 发行:仅电子版
## 贡献者
* 主译: LingCoder,LortSir
* 参译:
* 校对nickChenyx
* 主译: [LingCoder](https://github.com/LingCoder)
* 参译: [LortSir](https://github.com/LortSir)
* 校对:[nickChenyx](https://github.com/nickChenyx)
## 翻译说明
1. 本书排版布局和翻译风格上参考**阮一峰**老师的[中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide)
1. 本书排版布局和翻译风格上参考**阮一峰**老师的 [中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide)
2. 采用第一人称叙述。
3. 由于中英行文差异,完全的逐字逐句翻译会很冗余啰嗦。所以本人在翻译过程中,去除了部分主题无关内容、重复描写。
4. 译者在翻译中同时参考了谷歌、百度、有道翻译的译文以及《Java编程思想》第四版中文版的部分内容对其翻译死板生造名词语言精炼度差问题进行规避和改正。最后结合译者自己的理解进行本地化尽量做到专业和言简意赅方便大家更好的理解学习。
@@ -92,9 +117,9 @@
可以把一些不尽人意的语句翻译的更好更有趣
对于以上各类建议,请以 issue 或 pr 的形式发送,我看到之后会尽快处理
使用 MarkDown 编辑器md 语法格式进行文档翻译及排版工作
完成之后 Pull Request
完成之后 PullRequest
如没问题的话,我会合并到主分支
果不太明白 md 排版,可不必太过纠结,我会在合并提交时代为排版
不熟悉 md 排版,可不必纠结,我会在合并 pr 时代为排版
如还有其它问题,欢迎发送 issue谢谢~

View File

@@ -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)

BIN
assets/LogoMark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -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": {
@@ -11,9 +11,6 @@
"mobi": "styles/mobi.css",
"epub": "styles/epub.css"
},
"structure": {
"readme": "Introduction.md"
},
"plugins": [
"splitter",
"edit-link",

View File

@@ -1,681 +0,0 @@
[TOC]
<!-- Operators -->
# 第四章 运算符
>运算符操纵数据。
Java 是从 C++ 的基础上做了一些改进和简化发展而成的。对于 C/C++ 程序员来说Java 的运算符并不陌生。如果你已了解 C 或 C++,大可以跳过本章和下一章,直接阅读 Java 与 C/C++ 不同的地方。
如果理解这两章的内容对你来说还有点困难,那么我推荐你先了解下 *Thinking in C* 再继续后面的学习。 这本书现在可以在 [www.OnJava8.com](http://www.OnJava8.com]) 上免费下载。它的内容包含音频讲座、幻灯片、练习和解决方案,专门用于帮助你快速掌握学习 Java 所需的基础知识。
<!-- Using-Java-Operators -->
## 使用说明
运算符接受一个或多个参数并生成新值。这个参数与普通方法调用的形式是不同的,但效果是相同的。加法 `+`,减法 `-`,乘法 `*`,除法 `/` 以及赋值 `=` 在任何编程语言中的工作方式都是类似的。所有运算符都能根据自己的运算对象生成一个值。除此以外,一个运算符可改变运算对象的值,这叫作“副作用”(**Side Effect**)。运算符最常见的用途就是修改自己的运算对象,从而产生副作用。但要注意生成的值亦可由没有副作用的运算符生成。
几乎所有运算符都只能操作基本类型(*Primitives*)。唯一的例外是 `=``==``!=`,它们能操作所有对象(这也是令人混淆的一个地方)。除此以外,**String** 类支持 `+``+=`
<!-- Precedence -->
## 优先级
运算符的优先级决定了存在多个运算符时一个表达式各部分的计算顺序。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 都已经被转化成了字符串。
<!-- Assignment -->
## 赋值
运算符的赋值是由符号 `=` 完成的。它代表着获取 `=` 右边的值并赋给左边的变量。右边可以是任何常量、变量或者是可产生一个返回值的表达式。但左边必须是一个明确的、已命名的变量。也就是说,必须要有一个物理的空间来存放右边的值。举个例子来说,可将一个常数赋给一个变量( 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 的设计原则。对象的赋值是个需要重视的环节,否则你可能收获意外的“惊喜”。
<!-- Aliasing During Method Calls -->
### 方法调用中的别名现象
当我们把对象传递给方法时,会发生别名现象。
```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)。意识到这一点,我们可以警惕类似的陷阱。
<!-- Mathematical Operators -->
## 算术运算符
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。
<!-- Unary Minus and Plus Operators -->
### 一元加减运算符
一元加 `+` 减 `-` 运算符的操作和二元是相同的。编译器可自动识别使用何种方式解析运算:
```JAVA
x = -a;
```
上例的代码表意清晰,编译器可正确识别。下面再看一个示例:
```JAVA
x = a * -b;
```
虽然编译器可以正确的识别,但是程序员可能会迷惑。为了避免混淆,推荐下面的写法:
```JAVA
x = a * (-b);
```
一元减号可以得到数据的负值。一元加号的作用相反,不过它唯一能影响的就是把较小的数值类型自动转换为了 **int** 类型。
<!-- Auto-Increment-and-Decrement -->
## 递增和递减
和 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++ 小多少。
<!-- Relational-Operators -->
## 关系运算符
关系运算符会通过产生一个布尔(**boolean**)结果来表示被操作的数值之间的关系。如果关系为真,则结果为 **true**,如果关系非真,则结果为 **false**。关系运算符包括小于 `<`,大于 `>`,小于或等于 `<=`,大于或等于 `>=`,等价 `==` 和不等价 `=`。`==` 和 `!=` 可与所有基本类型搭配使用。但与其他类型的比较就不太适合了,因为布尔值只能表示 **true** 或 **false**,所以比较它们之间的“大于”或“小于”没有意义。
<!-- Testing Object Equivalence -->
### 测试对象等价
关系运算符 `==` 和 `!=` 同样适用于所有对象之间的比较运算,但产生的结果却经常混淆 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()** 方法比较对象的内容而不是其引用。
<!-- Logical-Operators -->
## 逻辑运算符
每个逻辑运算符 `&&` **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 -->
### 短路
逻辑运算符支持一种称为“短路”(*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
test10&& test22&& test32
```
可能你的预期是程序会执行 3 个 **test** 方法并返回。我们来分析一下:第一个方法的结果返回 `true`,因此表达式会继续走下去。紧接着,第二个方法的返回结果是 `false`。这就代表这整个表达式的结果肯定为 `false`,所以就没有必要再判断剩下的表达式部分了。
所以,运用“短路”可以节省部分不必要的运算,从而提高程序潜在的性能。
<!-- Literals -->
## 字面值常量
通常,当我们向程序中插入一个字面值常量(**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**。
<!-- Underscores in Literals -->
### 下划线
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` 而不是换行符。
<!-- Exponential Notation -->
### 指数计数法
指数总是采用一种我认为很不直观的记号方法:
```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]。但不管怎样,这种特别的表达方法在 CC++ 以及现在的 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** 型。
<!-- Bitwise-Operators -->
## 按位运算符
<!-- Shift Operators -->
## 移位运算符
<!-- Ternary-if-else-Operator -->
## 三元运算符
<!-- String-Operator-+-and-+= -->
## 字符串运算符
<!-- Common-Pitfalls-When-Using-Operators -->
## 常见陷阱
<!-- Casting-Operators -->
## 类型转换
<!-- Java-Has-No-sizeof -->
## Java没有sizeof
<!-- A-Compendium-of-Operators -->
## 运算符总结
<!-- Summary -->
## 本章小结
<!-- 分页 -->
<div style="page-break-after: always;"></div>

View File

@@ -1,789 +0,0 @@
[TOC]
# 第五章 控制流
> 程序操纵它的世界并做出选择。 在Java中您可以使用执行控制语句进行选择。
Java 使用 C 的所有执行控制语句,因此如果您使用 C 或 C++ 进行编程,那么您所看到的大部分内容都是熟悉的。 大多数过程编程语言都有某种控制语句,并且语言之间经常存在重叠。在 Java 中,关键字包括 **if-elsewhiledo-whileforreturnbreak** 和名为 **switch** 的选择语句。 但是Java 并不支持备受诟病的 **goto**(它仍然是解决某些类型问题的最有效方法)。 你仍然可以进行类似goto的跳转但它比其他语言中的 **goto** 更受限制。
[TOC]
## true和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++)是一种“自由格式”语言,但通常会缩进控件流语句的主体,以便读者可以轻松确定它的开始和结束位置。
<!--Iteration Statements-->
## 迭代语句
循环由 **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()** 方法来检查问题中的字符是否为小写字母。
<!--The Comma Operator-->
#### 逗号操作符
逗号运算符(不是逗号分隔符,逗号作为分隔符用于分隔定义和方法参数)在 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和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因为 09 产生0。
无限循环的另一种形式是 **for;;**。 编译器以同样的方式处理 **whiletrue****for;;**,因此使用哪种取决于编程品味。
<!--The Infamous “Goto”-->
## 臭名昭著的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 -->
## switch字符串
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。 您必须小心分析您的实验并了解它们的局限性。
## 本章小结
本章总结了我们对大多数编程语言中出现的基本特征的探索:计算,运算符优先级,类型转换,选择和迭代。 现在,您已准备好开始采取措施,使您更接近面向对象和函数式编程的世界。 下一章将介绍初始化和清理对象的重要问题接下来的章节将介绍隐藏实现细节implementation hiding的这一核心概念。
<!--下面是脚注-->
1. 在早期的语言中,大量的决策都是基于使编译器编写者的生活更轻松。 你会发现,在现代语言中,大多数设计决策都会让语言用户的生活更轻松,尽管有时会有妥协 - 这通常会让语言设计师感到后悔。
2. 请注意,这似乎是一个难以支持的主张,并且很可能是称为相关因果关系谬误的认知偏差的一个例子。
<!-- 分页 -->
<div style="page-break-after: always;"></div>

View File

@@ -1,49 +0,0 @@
[TOC]
<!-- Reuse -->
# 第八章 复用
<!-- Composition Syntax -->
## 组合语法
<!-- Inheritance Syntax -->
## 继承语法
<!-- Delegation -->
## 委托
<!-- Combining Composition and Inheritance -->
## 结合组合与继承
<!-- Choosing Composition vs. Inheritance -->
## 组合与继承的选择
<!-- protected -->
## protected
<!-- Upcasting -->
## 向上转型
<!-- The final Keyword -->
## final关键字
<!-- Initialization and Class Loading -->
## 类初始化和加载
<!-- Summary -->
## 本章小结
<!-- 分页 -->
<div style="page-break-after: always;"></div>

View File

@@ -1,32 +0,0 @@
[TOC]
<!-- Streams -->
# 第十四章 流式编程
<!-- Java 8 Stream Support -->
## 流支持
<!-- Stream Creation -->
## 流创建
<!-- Intermediate Operations -->
## 中级流操作
<!-- Optional -->
## Optional类
<!-- Terminal Operations -->
## 终端操作
<!-- Summary -->
## 本章小结
<!-- 分页 -->
<div style="page-break-after: always;"></div>

View File

@@ -1,998 +0,0 @@
[TOC]
<!-- Appendix: New I/O -->
# 附录:新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
直接与通道通信的缓冲区只有一个类型,就是 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);
}
}
}
```
你不会经常这样做,但知道这一点很好。
<!-- Converting Data -->
## 转换数据
**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<String,Charset> 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的表示中如输出所示。
<!-- Fetching Primitives -->
## 获取原始类型
虽然 **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()** 方法中强制转换。
<!-- View Buffers -->
## 视图缓冲区
“视图缓冲区”通过特定原始类型的窗口来查看底层 **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)
<!-- Endians -->
### 端
不同的机器可以使用不同的字节顺序方法来存储数据。“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 **中。当显示底层字节时,默认顺序与随后的大端序相同,而小端序则交换字节。
<!-- Data Manipulation with Buffers -->
## 使用缓冲区进行数据操作
下图说明了 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** 将经历相同的过程并恢复到原始状态。
<!-- Memory-Mapped Files -->
## 内存映射文件
内存映射文件允许您创建和修改太大而无法放入内存的文件。使用内存映射文件,您可以假装整个文件都在内存中,并将其视为一个非常大的数组来访问它。这种方法大大简化了您编写的修改文件的代码:
```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相比总体收益非常可观。
<!-- File Locking -->
## 文件锁定
文件锁定同步访问因此文件可以是共享资源。但是争用同一个文件的两个线程可能位于不同的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()** 查询锁的类型 (共享或独占)。
<!-- Locking Portions of a Mapped File -->
### 锁定映射文件的某些部分
文件映射通常用于非常大的文件。您可能需要锁定此类文件的某些部分,以便其他进程可以修改未锁定的部分。例如,数据库必须同时对许多用户可用。这里你可以看到两个线程,每个线程都锁定文件的不同部分:
```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. 您可以在附录:低级并发中找到关于线程的更多细节。
=======
<!-- 分页 -->
<div style="page-break-after: always;"></div>

0
docs/.nojekyll Normal file
View File

View File

@@ -2,55 +2,44 @@
[![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)
如果您在阅读本书的过程中有发现不明白或者错误的地方请随时到项目地址发布issue或者fork项目后发布pr帮助译者改善不胜感激
本翻译项目的 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** 版本。
## 翻译说明
1. 本书排版布局和翻译风格上参考了**阮一峰**老师的[中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide)
1. 本书排版布局和翻译风格上参考了**阮一峰**老师的 [中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide)
2. 采用第一人称叙述。
3. 由于中英行文差异,完全的逐字逐句翻译会很冗余啰嗦。所以本人在翻译过程中,去除了部分主题无关内容、重复描写。
4. 译者在翻译中同时参考了谷歌、百度、有道翻译的译文以及《Java编程思想》第四版中文版的部分内容对其翻译死板生造名词语言精炼度差问题进行规避和改正。最后结合译者自己的理解进行本地化尽量做到专业和言简意赅方便大家更好的理解学习。
5. 由于译者个人能力、时间有限,如有翻译错误和笔误的地方,还请大家批评指正!
## 如何参与
如果你想对本书做出一些贡献的话
可以在阅读本书过程中帮忙校对,找 bug 错别字等等
可以提出专业方面的修改建议
可以把一些不尽人意的语句翻译的更好更有趣
对于以上各类建议,请以 issue 或 pr 的形式发送,我看到之后会尽快处理
使用 MarkDown 编辑器md 语法格式进行文档翻译及排版工作
完成之后 Pull Request
完成之后 PullRequest
如没问题的话,我会合并到主分支
果不太明白 md 排版,可以把翻译好的内容发送给我,我代为排版并提交
如还有其它问题,欢迎发送 issue谢谢~
不熟悉 md 排版,可不必纠结,我会在合并 pr 时代为排版
如还有其它问题,欢迎发送 issue谢谢~
## 开源协议
本项目基于 MIT 协议开源。
## 联系方式
* E-mail : <lingcoder@gmail.com>
- E-mail : <lingcoder@gmail.com>
<div style="page-break-after: always;"></div>
<div style="page-break-after: always;"></div>

22
docs/_coverpage.md Normal file
View File

@@ -0,0 +1,22 @@
<img width="180px" src="https://raw.githubusercontent.com/LingCoder/OnJava8/master/assets/LogoMark.png">
# 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)
<span id="busuanzi_container_site_pv">
本页总访问次数:<span id="busuanzi_value_site_pv"></span>
</span>
[GitHub](https://github.com/lingcoder/onJava8/)
[Get Started](README.md)

392
docs/_sidebar.md Normal file
View File

@@ -0,0 +1,392 @@
* [译者的话](README.md)
* [封面](book/00-On-Java-8.md)
* [前言](book/00-Preface.md)
* [简介](book/00-Introduction.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#做你喜欢的事)
* [词汇表](book/GLOSSARY.md)

View File

@@ -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

View File

@@ -0,0 +1,4 @@
* text=auto
# Test files should not have their line endings modified by git
/tests/languages/**/*.test binary

4
docs/_style/prism-master/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
hide-*.js
node_modules
.idea/
.DS_Store

View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
prismjs.com

View File

@@ -0,0 +1,21 @@
MIT LICENSE
Copyright (c) 2012 Lea Verou
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,30 @@
# [Prism](http://prismjs.com/)
[![Build Status](https://travis-ci.org/PrismJS/prism.svg?branch=master)](https://travis-ci.org/PrismJS/prism)
Prism is a lightweight, robust, elegant syntax highlighting library. It's a spin-off project from [Dabblet](http://dabblet.com/).
You can learn more on http://prismjs.com/.
Why another syntax highlighter?: http://lea.verou.me/2012/07/introducing-prism-an-awesome-new-syntax-highlighter/#more-1841
More themes for Prism: https://github.com/PrismJS/prism-themes
## Contribute to Prism!
Prism depends on community contributions to expand and cover a wider array of use cases. If you like it, considering giving back by sending a pull request. Here are a few tips:
- Read the [documentation](http://prismjs.com/extending.html). Prism was designed to be extensible.
- Do not edit `prism.js`, its just the version of Prism used by the Prism website and is built automatically. Limit your changes to the unminified files in the components/ folder. The minified files are also generated automatically.
- The build system uses [gulp](https://github.com/gulpjs/gulp) to minify the files and build `prism.js`. Having gulp installed, you just need to run the command `gulp`.
- Please follow the code conventions used in the files already. For example, I use [tabs for indentation and spaces for alignment](http://lea.verou.me/2012/01/why-tabs-are-clearly-superior/). Opening braces are on the same line, closing braces on their own line regardless of construct. There is a space before the opening brace. etc etc.
- Please try to err towards more smaller PRs rather than few huge PRs. If a PR includes changes I want to merge and changes I don't, handling it becomes difficult.
- My time is very limited these days, so it might take a long time to review longer PRs (short ones are usually merged very quickly), especially those modifying the Prism Core. This doesn't mean your PR is rejected.
- If you contribute a new language definition, you will be responsible for handling bug reports about that language definition.
- If you add a new language definition, theme or plugin, you need to add it to `components.json` as well and rebuild Prism by running `gulp`, so that it becomes available to the download build page.
Thank you so much for contributing!!
## Translations
* [![中文说明](http://awesomes.oss-cn-beijing.aliyuncs.com/readme.png)](http://www.awesomes.cn/repo/PrismJS/prism)

View File

@@ -0,0 +1,30 @@
{
"name": "prism",
"main": [
"prism.js",
"themes/prism.css"
],
"homepage": "http://prismjs.com",
"authors": "Lea Verou",
"description": "Lightweight, robust, elegant syntax highlighting. A spin-off project from Dabblet.",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/PrismJS/prism.git"
},
"ignore": [
"**/.*",
"img",
"templates",
"tests",
"CNAME",
"*.html",
"style.css",
"favicon.png",
"logo.svg",
"download.js",
"prefixfree.min.js",
"utopia.js",
"code.js"
]
}

View File

@@ -0,0 +1,213 @@
(function(){
if(!document.body.addEventListener) {
return;
}
$$('[data-src][data-type="text/html"]').forEach(function(element) {
var src = element.getAttribute('data-src'),
html = element.getAttribute('data-type') === 'text/html',
contentProperty = html? 'innerHTML' : 'textContent';
$u.xhr({
url: src,
callback: function(xhr) {
try {
element[contentProperty] = xhr.responseText;
// Run JS
$$('script', element).forEach(function (script) {
var after = script.nextSibling, parent = script.parentNode;
parent.removeChild(script);
document.head.appendChild(script);
});
}
catch (e) {}
}
});
});
})();
/**
* Table of contents
*/
(function(){
var toc = document.createElement('ol');
$$('body > section > h1').forEach(function(h1) {
var section = h1.parentNode,
text = h1.textContent,
id = h1.id || section.id;
// Assign id if one does not exist
if (!id) {
id = text.toLowerCase();
// Replace spaces with hyphens, only keep first 10 words
id = id.split(/\s+/g, 10).join('-');
// Remove non-word characters
id = id.replace(/[^\w-]/g, '');
section.id = id;
}
// Linkify heading text
if (h1.children.length === 0) {
h1.innerHTML = '';
$u.element.create('a', {
properties: {
href: window.location.pathname + '#' + id
},
contents: text,
inside: h1
});
}
$u.element.create('li', {
contents: {
tag: 'a',
properties: {
href: window.location.pathname + '#' + (h1.id || section.id)
},
contents: text
},
inside: toc
});
});
if (toc.children.length > 0) {
$u.element.create('section', {
properties: {
id: 'toc'
},
contents: [{
tag: 'h1',
contents: 'On this page'
}, toc],
before: $('body > section')
});
}
})();
// calc()
(function(){
if(!window.PrefixFree) return;
if (PrefixFree.functions.indexOf('calc') == -1) {
var style = document.createElement('_').style;
style.width = 'calc(1px + 1%)'
if(!style.width) {
// calc not supported
var header = $('header'),
footer = $('footer');
function calculatePadding() {
header.style.padding =
footer.style.padding = '30px ' + (innerWidth/2 - 450) + 'px';
}
addEventListener('resize', calculatePadding);
calculatePadding();
}
}
})();
// setTheme is intentionally global,
// so it can be accessed from download.js
var setTheme;
(function() {
var p = $u.element.create('p', {
properties: {
id: 'theme'
},
contents: {
tag: 'p',
contents: 'Theme:'
},
after: '.intro'
});
var themes = components.themes;
var current = (location.search.match(/theme=([\w-]+)/) || [])[1];
if (!(current in themes)) {
current = undefined;
}
if (current === undefined) {
var stored = localStorage.getItem('theme');
current = stored in themes? stored : 'prism';
}
setTheme = function (id) {
var link = $$('link[href^="themes/prism"]')[0];
link.href = themes.meta.path.replace(/\{id}/g, id);
localStorage.setItem('theme', id);
};
for (var id in themes) {
if (id === 'meta') {
continue;
}
$u.element.create('input', {
properties: {
type: 'radio',
name: "theme",
id: 'theme=' + id,
checked: current === id,
value: id,
onclick: function () {
setTheme(this.value);
}
},
inside: p
});
$u.element.create('label', {
properties: {
htmlFor: 'theme=' + id
},
contents: themes[id].title || themes[id],
inside: p
});
}
setTheme(current);
})();
(function(){
function listPlugins(ul) {
for (var id in components.plugins) {
if (id == 'meta') {
continue;
}
var plugin = components.plugins[id];
$u.element.create('li', {
contents: {
tag: 'a',
prop: {
href: 'plugins/' + id
},
contents: plugin.title || plugin
},
inside: ul
});
}
}
$$('.plugin-list').forEach(listPlugins);
})();

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,913 @@
{
"core": {
"meta": {
"path": "components/prism-core.js",
"option": "mandatory"
},
"core": "Core"
},
"themes": {
"meta": {
"path": "themes/{id}.css",
"link": "index.html?theme={id}",
"exclusive": true
},
"prism": {
"title": "Default",
"option": "default"
},
"prism-dark": "Dark",
"prism-funky": "Funky",
"prism-okaidia": {
"title": "Okaidia",
"owner": "ocodia"
},
"prism-twilight": {
"title": "Twilight",
"owner": "remybach"
},
"prism-coy": {
"title": "Coy",
"owner": "tshedor"
},
"prism-solarizedlight": {
"title": "Solarized Light",
"owner": "hectormatos2011 "
},
"prism-tomorrow": {
"title": "Tomorrow Night",
"owner": "Rosey"
}
},
"languages": {
"meta": {
"path": "components/prism-{id}",
"noCSS": true,
"examplesPath": "examples/prism-{id}",
"addCheckAll": true
},
"markup": {
"title": "Markup",
"alias": ["html", "xml", "svg", "mathml"],
"aliasTitles": {
"html": "HTML",
"xml": "XML",
"svg": "SVG",
"mathml": "MathML"
},
"option": "default"
},
"css": {
"title": "CSS",
"option": "default",
"peerDependencies": "markup"
},
"clike": {
"title": "C-like",
"option": "default",
"overrideExampleHeader": true
},
"javascript": {
"title": "JavaScript",
"require": "clike",
"peerDependencies": "markup",
"alias": "js",
"option": "default"
},
"abap": {
"title": "ABAP",
"owner": "dellagustin"
},
"actionscript": {
"title": "ActionScript",
"require": "javascript",
"peerDependencies": "markup",
"owner": "Golmote"
},
"ada": {
"title": "Ada",
"owner": "Lucretia"
},
"apacheconf": {
"title": "Apache Configuration",
"owner": "GuiTeK"
},
"apl": {
"title": "APL",
"owner": "ngn"
},
"applescript": {
"title": "AppleScript",
"owner": "Golmote"
},
"arduino": {
"title": "Arduino",
"require": "cpp",
"owner": "eisbehr-"
},
"arff": {
"title": "ARFF",
"owner": "Golmote"
},
"asciidoc": {
"title": "AsciiDoc",
"owner": "Golmote"
},
"asm6502": {
"title": "6502 Assembly",
"owner": "kzurawel"
},
"aspnet": {
"title": "ASP.NET (C#)",
"require": ["markup", "csharp"],
"owner": "nauzilus"
},
"autohotkey": {
"title": "AutoHotkey",
"owner": "aviaryan"
},
"autoit": {
"title": "AutoIt",
"owner": "Golmote"
},
"bash": {
"title": "Bash",
"alias": "shell",
"aliasTitles": {
"shell": "Shell"
},
"owner": "zeitgeist87"
},
"basic": {
"title": "BASIC",
"owner": "Golmote"
},
"batch": {
"title": "Batch",
"owner": "Golmote"
},
"bison": {
"title": "Bison",
"require": "c",
"owner": "Golmote"
},
"brainfuck": {
"title": "Brainfuck",
"owner": "Golmote"
},
"bro": {
"title": "Bro",
"owner": "wayward710"
},
"c": {
"title": "C",
"require": "clike",
"owner": "zeitgeist87"
},
"csharp": {
"title": "C#",
"require": "clike",
"alias": "dotnet",
"owner": "mvalipour"
},
"cpp": {
"title": "C++",
"require": "c",
"owner": "zeitgeist87"
},
"cil": {
"title": "CIL",
"owner": "sbrl"
},
"coffeescript": {
"title": "CoffeeScript",
"require": "javascript",
"owner": "R-osey"
},
"clojure": {
"title": "Clojure",
"owner": "troglotit"
},
"crystal": {
"title": "Crystal",
"require": "ruby",
"owner": "MakeNowJust"
},
"csp": {
"title": "Content-Security-Policy",
"owner": "ScottHelme"
},
"css-extras": {
"title": "CSS Extras",
"require": "css",
"owner": "milesj"
},
"d": {
"title": "D",
"require": "clike",
"owner": "Golmote"
},
"dart": {
"title": "Dart",
"require": "clike",
"owner": "Golmote"
},
"diff": {
"title": "Diff",
"owner": "uranusjr"
},
"django": {
"title": "Django/Jinja2",
"require": "markup",
"peerDependencies": [
"css",
"javascript"
],
"alias": "jinja2",
"owner": "romanvm"
},
"docker": {
"title": "Docker",
"alias": "dockerfile",
"owner": "JustinBeckwith"
},
"eiffel": {
"title": "Eiffel",
"owner": "Conaclos"
},
"elixir": {
"title": "Elixir",
"owner": "Golmote"
},
"elm": {
"title": "Elm",
"owner": "zwilias"
},
"erb": {
"title": "ERB",
"require": ["ruby", "markup-templating"],
"owner": "Golmote"
},
"erlang": {
"title": "Erlang",
"owner": "Golmote"
},
"fsharp": {
"title": "F#",
"require": "clike",
"owner": "simonreynolds7"
},
"flow": {
"title": "Flow",
"require": "javascript",
"owner": "Golmote"
},
"fortran": {
"title": "Fortran",
"owner": "Golmote"
},
"gcode": {
"title": "G-code",
"owner": "RunDevelopment"
},
"gedcom": {
"title": "GEDCOM",
"owner": "Golmote"
},
"gherkin": {
"title": "Gherkin",
"owner": "hason"
},
"git": {
"title": "Git",
"owner": "lgiraudel"
},
"glsl": {
"title": "GLSL",
"require": "clike",
"owner": "Golmote"
},
"gml": {
"title": "GameMaker Language",
"alias": "gamemakerlanguage",
"require": "clike",
"owner": "LiarOnce"
},
"go": {
"title": "Go",
"require": "clike",
"owner": "arnehormann"
},
"graphql": {
"title": "GraphQL",
"owner": "Golmote"
},
"groovy": {
"title": "Groovy",
"require": "clike",
"owner": "robfletcher"
},
"haml": {
"title": "Haml",
"require": "ruby",
"peerDependencies": [
"css",
"coffeescript",
"erb",
"javascript",
"less",
"markdown",
"ruby",
"scss",
"textile"
],
"owner": "Golmote"
},
"handlebars": {
"title": "Handlebars",
"require": "markup-templating",
"owner": "Golmote"
},
"haskell": {
"title": "Haskell",
"owner": "bholst"
},
"haxe": {
"title": "Haxe",
"require": "clike",
"owner": "Golmote"
},
"http": {
"title": "HTTP",
"peerDependencies": [
"javascript",
"markup"
],
"owner": "danielgtaylor"
},
"hpkp": {
"title": "HTTP Public-Key-Pins",
"owner": "ScottHelme"
},
"hsts": {
"title": "HTTP Strict-Transport-Security",
"owner": "ScottHelme"
},
"ichigojam": {
"title": "IchigoJam",
"owner": "BlueCocoa"
},
"icon": {
"title": "Icon",
"owner": "Golmote"
},
"inform7": {
"title": "Inform 7",
"owner": "Golmote"
},
"ini": {
"title": "Ini",
"owner": "aviaryan"
},
"io": {
"title": "Io",
"owner": "AlesTsurko"
},
"j": {
"title": "J",
"owner": "Golmote"
},
"java": {
"title": "Java",
"require": "clike",
"owner": "sherblot"
},
"javastacktrace": {
"title": "Java stack trace",
"owner": "RunDevelopment"
},
"jolie": {
"title": "Jolie",
"require": "clike",
"owner": "thesave"
},
"json": {
"title": "JSON",
"alias": "jsonp",
"aliasTitles": {
"jsonp": "JSONP"
},
"owner": "CupOfTea696"
},
"julia": {
"title": "Julia",
"owner": "cdagnino"
},
"keyman": {
"title": "Keyman",
"owner": "mcdurdin"
},
"kotlin": {
"title": "Kotlin",
"require": "clike",
"owner": "Golmote"
},
"latex": {
"title": "LaTeX",
"owner": "japborst"
},
"less": {
"title": "Less",
"require": "css",
"owner": "Golmote"
},
"liquid": {
"title": "Liquid",
"owner": "cinhtau"
},
"lisp": {
"title": "Lisp",
"alias": ["emacs", "elisp", "emacs-lisp"],
"owner": "JuanCaicedo"
},
"livescript": {
"title": "LiveScript",
"owner": "Golmote"
},
"lolcode": {
"title": "LOLCODE",
"owner": "Golmote"
},
"lua": {
"title": "Lua",
"owner": "Golmote"
},
"makefile": {
"title": "Makefile",
"owner": "Golmote"
},
"markdown": {
"title": "Markdown",
"require": "markup",
"owner": "Golmote"
},
"markup-templating": {
"title": "Markup templating",
"require": "markup",
"owner": "Golmote"
},
"matlab": {
"title": "MATLAB",
"owner": "Golmote"
},
"mel": {
"title": "MEL",
"owner": "Golmote"
},
"mizar": {
"title": "Mizar",
"owner": "Golmote"
},
"monkey": {
"title": "Monkey",
"owner": "Golmote"
},
"n4js": {
"title": "N4JS",
"require": "javascript",
"alias": "n4jsd",
"owner": "bsmith-n4"
},
"nasm": {
"title": "NASM",
"owner": "rbmj"
},
"nginx": {
"title": "nginx",
"owner": "westonganger",
"require": "clike"
},
"nim": {
"title": "Nim",
"owner": "Golmote"
},
"nix": {
"title": "Nix",
"owner": "Golmote"
},
"nsis": {
"title": "NSIS",
"owner": "idleberg"
},
"objectivec": {
"title": "Objective-C",
"require": "c",
"owner": "uranusjr"
},
"ocaml": {
"title": "OCaml",
"owner": "Golmote"
},
"opencl": {
"title": "OpenCL",
"require": "cpp",
"peerDependencies": [
"c",
"cpp"
],
"overrideExampleHeader": true,
"owner": "Milania1"
},
"oz": {
"title": "Oz",
"owner": "Golmote"
},
"parigp": {
"title": "PARI/GP",
"owner": "Golmote"
},
"parser": {
"title": "Parser",
"require": "markup",
"owner": "Golmote"
},
"pascal": {
"title": "Pascal",
"alias": "objectpascal",
"aliasTitles": {
"objectpascal": "Object Pascal"
},
"owner": "Golmote"
},
"perl": {
"title": "Perl",
"owner": "Golmote"
},
"php": {
"title": "PHP",
"require": ["clike", "markup-templating"],
"owner": "milesj"
},
"php-extras": {
"title": "PHP Extras",
"require": "php",
"owner": "milesj"
},
"plsql": {
"title": "PL/SQL",
"require": "sql",
"owner": "Golmote"
},
"powershell": {
"title": "PowerShell",
"owner": "nauzilus"
},
"processing": {
"title": "Processing",
"require": "clike",
"owner": "Golmote"
},
"prolog": {
"title": "Prolog",
"owner": "Golmote"
},
"properties": {
"title": ".properties",
"owner": "Golmote"
},
"protobuf": {
"title": "Protocol Buffers",
"require": "clike",
"owner": "just-boris"
},
"pug": {
"title": "Pug",
"require": "javascript",
"peerDependencies": [
"coffeescript",
"ejs",
"handlebars",
"hogan",
"less",
"livescript",
"markdown",
"mustache",
"plates",
"scss",
"stylus",
"swig"
],
"owner": "Golmote"
},
"puppet": {
"title": "Puppet",
"owner": "Golmote"
},
"pure": {
"title": "Pure",
"peerDependencies": [
"c",
"cpp",
"fortran",
"ats",
"dsp"
],
"owner": "Golmote"
},
"python": {
"title": "Python",
"owner": "multipetros"
},
"q": {
"title": "Q (kdb+ database)",
"owner": "Golmote"
},
"qore": {
"title": "Qore",
"require": "clike",
"owner": "temnroegg"
},
"r": {
"title": "R",
"owner": "Golmote"
},
"jsx": {
"title": "React JSX",
"require": ["markup", "javascript"],
"owner": "vkbansal"
},
"tsx": {
"title": "React TSX",
"require": ["jsx", "typescript"]
},
"renpy": {
"title": "Ren'py",
"owner": "HyuchiaDiego"
},
"reason": {
"title": "Reason",
"require": "clike",
"owner": "Golmote"
},
"rest": {
"title": "reST (reStructuredText)",
"owner": "Golmote"
},
"rip": {
"title": "Rip",
"owner": "ravinggenius"
},
"roboconf": {
"title": "Roboconf",
"owner": "Golmote"
},
"ruby": {
"title": "Ruby",
"require": "clike",
"owner": "samflores"
},
"rust": {
"title": "Rust",
"owner": "Golmote"
},
"sas": {
"title": "SAS",
"owner": "Golmote"
},
"sass": {
"title": "Sass (Sass)",
"require": "css",
"owner": "Golmote"
},
"scss": {
"title": "Sass (Scss)",
"require": "css",
"owner": "MoOx"
},
"scala": {
"title": "Scala",
"require": "java",
"owner": "jozic"
},
"scheme": {
"title": "Scheme",
"owner": "bacchus123"
},
"smalltalk": {
"title": "Smalltalk",
"owner": "Golmote"
},
"smarty": {
"title": "Smarty",
"require": "markup-templating",
"owner": "Golmote"
},
"sql": {
"title": "SQL",
"owner": "multipetros"
},
"soy": {
"title": "Soy (Closure Template)",
"require": "markup-templating",
"owner": "Golmote"
},
"stylus": {
"title": "Stylus",
"owner": "vkbansal"
},
"swift": {
"title": "Swift",
"require": "clike",
"owner": "chrischares"
},
"tap": {
"title": "TAP",
"owner": "isaacs",
"require": "yaml"
},
"tcl": {
"title": "Tcl",
"owner": "PeterChaplin"
},
"textile": {
"title": "Textile",
"require": "markup",
"peerDependencies": "css",
"owner": "Golmote"
},
"toml": {
"title": "TOML",
"owner": "RunDevelopment"
},
"tt2": {
"title": "Template Toolkit 2",
"require": ["clike", "markup-templating"],
"owner": "gflohr"
},
"twig": {
"title": "Twig",
"require": "markup",
"owner": "brandonkelly"
},
"typescript": {
"title": "TypeScript",
"require": "javascript",
"alias": "ts",
"owner": "vkbansal"
},
"vala": {
"title": "Vala",
"require": "clike",
"owner": "TemplarVolk"
},
"vbnet": {
"title": "VB.Net",
"require": "basic",
"owner": "Bigsby"
},
"velocity": {
"title": "Velocity",
"require": "markup",
"owner": "Golmote"
},
"verilog": {
"title": "Verilog",
"owner": "a-rey"
},
"vhdl": {
"title": "VHDL",
"owner": "a-rey"
},
"vim": {
"title": "vim",
"owner": "westonganger"
},
"visual-basic": {
"title": "Visual Basic",
"alias": "vb",
"owner": "Golmote"
},
"wasm": {
"title": "WebAssembly",
"owner": "Golmote"
},
"wiki": {
"title": "Wiki markup",
"require": "markup",
"owner": "Golmote"
},
"xeora": {
"title": "Xeora",
"require": "markup",
"alias": "xeoracube",
"aliasTitles": {
"xeoracube": "XeoraCube"
},
"owner": "freakmaxi"
},
"xojo": {
"title": "Xojo (REALbasic)",
"owner": "Golmote"
},
"xquery": {
"title": "XQuery",
"require": "markup",
"owner": "Golmote"
},
"yaml": {
"title": "YAML",
"owner": "hason"
}
},
"plugins": {
"meta": {
"path": "plugins/{id}/prism-{id}",
"link": "plugins/{id}/"
},
"line-highlight": "Line Highlight",
"line-numbers": {
"title": "Line Numbers",
"owner": "kuba-kubula"
},
"show-invisibles": {
"title": "Show Invisibles",
"after": [
"autolinker",
"data-uri-highlight"
]
},
"autolinker": "Autolinker",
"wpd": "WebPlatform Docs",
"custom-class": {
"title": "Custom Class",
"owner": "dvkndn",
"noCSS": true
},
"file-highlight": {
"title": "File Highlight",
"noCSS": true
},
"show-language": {
"title": "Show Language",
"owner": "nauzilus",
"noCSS": true,
"require": "toolbar"
},
"jsonp-highlight": {
"title": "JSONP Highlight",
"noCSS": true,
"owner": "nauzilus"
},
"highlight-keywords": {
"title": "Highlight Keywords",
"owner": "vkbansal",
"noCSS": true
},
"remove-initial-line-feed": {
"title": "Remove initial line feed",
"owner": "Golmote",
"noCSS": true
},
"previewers": {
"title": "Previewers",
"owner": "Golmote"
},
"autoloader": {
"title": "Autoloader",
"owner": "Golmote",
"noCSS": true
},
"keep-markup": {
"title": "Keep Markup",
"owner": "Golmote",
"after": "normalize-whitespace",
"noCSS": true
},
"command-line": {
"title": "Command Line",
"owner": "chriswells0"
},
"unescaped-markup": "Unescaped Markup",
"normalize-whitespace": {
"title": "Normalize Whitespace",
"owner": "zeitgeist87",
"after": "unescaped-markup",
"noCSS": true
},
"data-uri-highlight": {
"title": "Data-URI Highlight",
"owner": "Golmote",
"noCSS": true
},
"toolbar": {
"title": "Toolbar",
"owner": "mAAdhaTTah"
},
"copy-to-clipboard": {
"title": "Copy to Clipboard Button",
"owner": "mAAdhaTTah",
"require": "toolbar",
"noCSS": true
}
}
}

View File

@@ -0,0 +1,82 @@
var components = require('../components.js');
var peerDependentsMap = null;
function getPeerDependentsMap() {
var peerDependentsMap = {};
Object.keys(components.languages).forEach(function (language) {
if (language === 'meta') {
return false;
}
if (components.languages[language].peerDependencies) {
var peerDependencies = components.languages[language].peerDependencies;
if (!Array.isArray(peerDependencies)) {
peerDependencies = [peerDependencies];
}
peerDependencies.forEach(function (peerDependency) {
if (!peerDependentsMap[peerDependency]) {
peerDependentsMap[peerDependency] = [];
}
peerDependentsMap[peerDependency].push(language);
});
}
});
return peerDependentsMap;
}
function getPeerDependents(mainLanguage) {
if (!peerDependentsMap) {
peerDependentsMap = getPeerDependentsMap();
}
return peerDependentsMap[mainLanguage] || [];
}
function loadLanguages(arr, withoutDependencies) {
// If no argument is passed, load all components
if (!arr) {
arr = Object.keys(components.languages).filter(function (language) {
return language !== 'meta';
});
}
if (arr && !arr.length) {
return;
}
if (!Array.isArray(arr)) {
arr = [arr];
}
arr.forEach(function (language) {
if (!components.languages[language]) {
console.warn('Language does not exist ' + language);
return;
}
// Load dependencies first
if (!withoutDependencies && components.languages[language].require) {
loadLanguages(components.languages[language].require);
}
var pathToLanguage = './prism-' + language;
delete require.cache[require.resolve(pathToLanguage)];
delete Prism.languages[language];
require(pathToLanguage);
// Reload dependents
var dependents = getPeerDependents(language).filter(function (dependent) {
// If dependent language was already loaded,
// we want to reload it.
if (Prism.languages[dependent]) {
delete Prism.languages[dependent];
return true;
}
return false;
});
if (dependents.length) {
loadLanguages(dependents, true);
}
});
}
module.exports = function (arr) {
// Don't expose withoutDependencies
loadLanguages(arr);
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,17 @@
Prism.languages.actionscript = Prism.languages.extend('javascript', {
'keyword': /\b(?: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)\b/,
'operator': /\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/
});
Prism.languages.actionscript['class-name'].alias = 'function';
if (Prism.languages.markup) {
Prism.languages.insertBefore('actionscript', 'string', {
'xml': {
pattern: /(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,
lookbehind: true,
inside: {
rest: Prism.languages.markup
}
}
});
}

View File

@@ -0,0 +1 @@
Prism.languages.actionscript=Prism.languages.extend("javascript",{keyword:/\b(?: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)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript["class-name"].alias="function",Prism.languages.markup&&Prism.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:{rest:Prism.languages.markup}}});

View File

@@ -0,0 +1,19 @@
Prism.languages.ada = {
'comment': /--.*/,
'string': /"(?:""|[^"\r\f\n])*"/i,
'number': [
{
pattern: /\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i
},
{
pattern: /\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i
}
],
'attr-name': /\b'\w+/i,
'keyword': /\b(?: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)\b/i,
'boolean': /\b(?:true|false)\b/i,
'operator': /<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,
'punctuation': /\.\.?|[,;():]/,
'char': /'.'/,
'variable': /\b[a-z](?:[_a-z\d])*\b/i
};

View File

@@ -0,0 +1 @@
Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/i,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],"attr-name":/\b'\w+/i,keyword:/\b(?: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)\b/i,"boolean":/\b(?:true|false)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,"char":/'.'/,variable:/\b[a-z](?:[_a-z\d])*\b/i};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,32 @@
Prism.languages.apl = {
'comment': /(?:⍝|#[! ]).*$/m,
'string': {
pattern: /'(?:[^'\r\n]|'')*'/,
greedy: true
},
'number': /¯?(?:\d*\.?\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:\d*\.?\d+(?:e[+¯]?\d+)?|¯|∞))?/i,
'statement': /:[A-Z][a-z][A-Za-z]*\b/,
'system-function': {
pattern: /⎕[A-Z]+/i,
alias: 'function'
},
'constant': /[⍬⌾#⎕⍞]/,
'function': /[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,
'monadic-operator': {
pattern: /[\\\/⌿⍀¨⍨⌶&∥]/,
alias: 'operator'
},
'dyadic-operator': {
pattern: /[.⍣⍠⍤∘⌸@⌺]/,
alias: 'operator'
},
'assignment': {
pattern: /←/,
alias: 'keyword'
},
'punctuation': /[\[;\]()◇⋄]/,
'dfn': {
pattern: /[{}⍺⍵⍶⍹∇⍫:]/,
alias: 'builtin'
}
};

View File

@@ -0,0 +1 @@
Prism.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:{pattern:/'(?:[^'\r\n]|'')*'/,greedy:!0},number:/¯?(?:\d*\.?\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:\d*\.?\d+(?:e[+¯]?\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\b/,"system-function":{pattern:/⎕[A-Z]+/i,alias:"function"},constant:/[⍬⌾#⎕⍞]/,"function":/[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,"monadic-operator":{pattern:/[\\\/⌿⍀¨⍨⌶&∥]/,alias:"operator"},"dyadic-operator":{pattern:/[.⍣⍠⍤∘⌸@⌺]/,alias:"operator"},assignment:{pattern:/←/,alias:"keyword"},punctuation:/[\[;\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:"builtin"}};

View File

@@ -0,0 +1,20 @@
Prism.languages.applescript = {
'comment': [
// Allow one level of nesting
/\(\*(?:\(\*[\s\S]*?\*\)|[\s\S])*?\*\)/,
/--.+/,
/#.+/
],
'string': /"(?:\\.|[^"\\\r\n])*"/,
'number': /(?:\b\d+\.?\d*|\B\.\d+)(?:e-?\d+)?\b/i,
'operator': [
/[&=≠≤≥*+\-\/÷^]|[<>]=?/,
/\b(?:(?:start|begin|end)s? with|(?:(?:does not|doesn't) contain|contains?)|(?:is|isn't|is not) (?:in|contained by)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:(?:does not|doesn't) come|comes) (?:before|after)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equals|equal to|isn't|is not)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|or|div|mod|as|not))\b/
],
'keyword': /\b(?: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)\b/,
'class': {
pattern: /\b(?: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)\b/,
alias: 'builtin'
},
'punctuation': /[{}():,¬«»《》]/
};

View File

@@ -0,0 +1 @@
Prism.languages.applescript={comment:[/\(\*(?:\(\*[\s\S]*?\*\)|[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+\.?\d*|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:start|begin|end)s? with|(?:(?:does not|doesn't) contain|contains?)|(?:is|isn't|is not) (?:in|contained by)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:(?:does not|doesn't) come|comes) (?:before|after)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equals|equal to|isn't|is not)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|or|div|mod|as|not))\b/],keyword:/\b(?: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)\b/,"class":{pattern:/\b(?: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)\b/,alias:"builtin"},punctuation:/[{}():,¬«»《》]/};

View File

@@ -0,0 +1,5 @@
Prism.languages.arduino = Prism.languages.extend('cpp', {
'keyword': /\b(?:setup|if|else|while|do|for|return|in|instanceof|default|function|loop|goto|switch|case|new|try|throw|catch|finally|null|break|continue|boolean|bool|void|byte|word|string|String|array|int|long|integer|double)\b/,
'builtin': /\b(?:KeyboardController|MouseController|SoftwareSerial|EthernetServer|EthernetClient|LiquidCrystal|LiquidCrystal_I2C|RobotControl|GSMVoiceCall|EthernetUDP|EsploraTFT|HttpClient|RobotMotor|WiFiClient|GSMScanner|FileSystem|Scheduler|GSMServer|YunClient|YunServer|IPAddress|GSMClient|GSMModem|Keyboard|Ethernet|Console|GSMBand|Esplora|Stepper|Process|WiFiUDP|GSM_SMS|Mailbox|USBHost|Firmata|PImage|Client|Server|GSMPIN|FileIO|Bridge|Serial|EEPROM|Stream|Mouse|Audio|Servo|File|Task|GPRS|WiFi|Wire|TFT|GSM|SPI|SD|runShellCommandAsynchronously|analogWriteResolution|retrieveCallingNumber|printFirmwareVersion|analogReadResolution|sendDigitalPortPair|noListenOnLocalhost|readJoystickButton|setFirmwareVersion|readJoystickSwitch|scrollDisplayRight|getVoiceCallStatus|scrollDisplayLeft|writeMicroseconds|delayMicroseconds|beginTransmission|getSignalStrength|runAsynchronously|getAsynchronously|listenOnLocalhost|getCurrentCarrier|readAccelerometer|messageAvailable|sendDigitalPorts|lineFollowConfig|countryNameWrite|runShellCommand|readStringUntil|rewindDirectory|readTemperature|setClockDivider|readLightSensor|endTransmission|analogReference|detachInterrupt|countryNameRead|attachInterrupt|encryptionType|readBytesUntil|robotNameWrite|readMicrophone|robotNameRead|cityNameWrite|userNameWrite|readJoystickY|readJoystickX|mouseReleased|openNextFile|scanNetworks|noInterrupts|digitalWrite|beginSpeaker|mousePressed|isActionDone|mouseDragged|displayLogos|noAutoscroll|addParameter|remoteNumber|getModifiers|keyboardRead|userNameRead|waitContinue|processInput|parseCommand|printVersion|readNetworks|writeMessage|blinkVersion|cityNameRead|readMessage|setDataMode|parsePacket|isListening|setBitOrder|beginPacket|isDirectory|motorsWrite|drawCompass|digitalRead|clearScreen|serialEvent|rightToLeft|setTextSize|leftToRight|requestFrom|keyReleased|compassRead|analogWrite|interrupts|WiFiServer|disconnect|playMelody|parseFloat|autoscroll|getPINUsed|setPINUsed|setTimeout|sendAnalog|readSlider|analogRead|beginWrite|createChar|motorsStop|keyPressed|tempoWrite|readButton|subnetMask|debugPrint|macAddress|writeGreen|randomSeed|attachGPRS|readString|sendString|remotePort|releaseAll|mouseMoved|background|getXChange|getYChange|answerCall|getResult|voiceCall|endPacket|constrain|getSocket|writeJSON|getButton|available|connected|findUntil|readBytes|exitValue|readGreen|writeBlue|startLoop|IPAddress|isPressed|sendSysex|pauseMode|gatewayIP|setCursor|getOemKey|tuneWrite|noDisplay|loadImage|switchPIN|onRequest|onReceive|changePIN|playFile|noBuffer|parseInt|overflow|checkPIN|knobRead|beginTFT|bitClear|updateIR|bitWrite|position|writeRGB|highByte|writeRed|setSpeed|readBlue|noStroke|remoteIP|transfer|shutdown|hangCall|beginSMS|endWrite|attached|maintain|noCursor|checkReg|checkPUK|shiftOut|isValid|shiftIn|pulseIn|connect|println|localIP|pinMode|getIMEI|display|noBlink|process|getBand|running|beginSD|drawBMP|lowByte|setBand|release|bitRead|prepare|pointTo|readRed|setMode|noFill|remove|listen|stroke|detach|attach|noTone|exists|buffer|height|bitSet|circle|config|cursor|random|IRread|setDNS|endSMS|getKey|micros|millis|begin|print|write|ready|flush|width|isPIN|blink|clear|press|mkdir|rmdir|close|point|yield|image|BSSID|click|delay|read|text|move|peek|beep|rect|line|open|seek|fill|size|turn|stop|home|find|step|tone|sqrt|RSSI|SSID|end|bit|tan|cos|sin|pow|map|abs|max|min|get|run|put)\b/,
'constant': /\b(?:DIGITAL_MESSAGE|FIRMATA_STRING|ANALOG_MESSAGE|REPORT_DIGITAL|REPORT_ANALOG|INPUT_PULLUP|SET_PIN_MODE|INTERNAL2V56|SYSTEM_RESET|LED_BUILTIN|INTERNAL1V1|SYSEX_START|INTERNAL|EXTERNAL|DEFAULT|OUTPUT|INPUT|HIGH|LOW)\b/
});

View File

@@ -0,0 +1 @@
Prism.languages.arduino=Prism.languages.extend("cpp",{keyword:/\b(?:setup|if|else|while|do|for|return|in|instanceof|default|function|loop|goto|switch|case|new|try|throw|catch|finally|null|break|continue|boolean|bool|void|byte|word|string|String|array|int|long|integer|double)\b/,builtin:/\b(?:KeyboardController|MouseController|SoftwareSerial|EthernetServer|EthernetClient|LiquidCrystal|LiquidCrystal_I2C|RobotControl|GSMVoiceCall|EthernetUDP|EsploraTFT|HttpClient|RobotMotor|WiFiClient|GSMScanner|FileSystem|Scheduler|GSMServer|YunClient|YunServer|IPAddress|GSMClient|GSMModem|Keyboard|Ethernet|Console|GSMBand|Esplora|Stepper|Process|WiFiUDP|GSM_SMS|Mailbox|USBHost|Firmata|PImage|Client|Server|GSMPIN|FileIO|Bridge|Serial|EEPROM|Stream|Mouse|Audio|Servo|File|Task|GPRS|WiFi|Wire|TFT|GSM|SPI|SD|runShellCommandAsynchronously|analogWriteResolution|retrieveCallingNumber|printFirmwareVersion|analogReadResolution|sendDigitalPortPair|noListenOnLocalhost|readJoystickButton|setFirmwareVersion|readJoystickSwitch|scrollDisplayRight|getVoiceCallStatus|scrollDisplayLeft|writeMicroseconds|delayMicroseconds|beginTransmission|getSignalStrength|runAsynchronously|getAsynchronously|listenOnLocalhost|getCurrentCarrier|readAccelerometer|messageAvailable|sendDigitalPorts|lineFollowConfig|countryNameWrite|runShellCommand|readStringUntil|rewindDirectory|readTemperature|setClockDivider|readLightSensor|endTransmission|analogReference|detachInterrupt|countryNameRead|attachInterrupt|encryptionType|readBytesUntil|robotNameWrite|readMicrophone|robotNameRead|cityNameWrite|userNameWrite|readJoystickY|readJoystickX|mouseReleased|openNextFile|scanNetworks|noInterrupts|digitalWrite|beginSpeaker|mousePressed|isActionDone|mouseDragged|displayLogos|noAutoscroll|addParameter|remoteNumber|getModifiers|keyboardRead|userNameRead|waitContinue|processInput|parseCommand|printVersion|readNetworks|writeMessage|blinkVersion|cityNameRead|readMessage|setDataMode|parsePacket|isListening|setBitOrder|beginPacket|isDirectory|motorsWrite|drawCompass|digitalRead|clearScreen|serialEvent|rightToLeft|setTextSize|leftToRight|requestFrom|keyReleased|compassRead|analogWrite|interrupts|WiFiServer|disconnect|playMelody|parseFloat|autoscroll|getPINUsed|setPINUsed|setTimeout|sendAnalog|readSlider|analogRead|beginWrite|createChar|motorsStop|keyPressed|tempoWrite|readButton|subnetMask|debugPrint|macAddress|writeGreen|randomSeed|attachGPRS|readString|sendString|remotePort|releaseAll|mouseMoved|background|getXChange|getYChange|answerCall|getResult|voiceCall|endPacket|constrain|getSocket|writeJSON|getButton|available|connected|findUntil|readBytes|exitValue|readGreen|writeBlue|startLoop|IPAddress|isPressed|sendSysex|pauseMode|gatewayIP|setCursor|getOemKey|tuneWrite|noDisplay|loadImage|switchPIN|onRequest|onReceive|changePIN|playFile|noBuffer|parseInt|overflow|checkPIN|knobRead|beginTFT|bitClear|updateIR|bitWrite|position|writeRGB|highByte|writeRed|setSpeed|readBlue|noStroke|remoteIP|transfer|shutdown|hangCall|beginSMS|endWrite|attached|maintain|noCursor|checkReg|checkPUK|shiftOut|isValid|shiftIn|pulseIn|connect|println|localIP|pinMode|getIMEI|display|noBlink|process|getBand|running|beginSD|drawBMP|lowByte|setBand|release|bitRead|prepare|pointTo|readRed|setMode|noFill|remove|listen|stroke|detach|attach|noTone|exists|buffer|height|bitSet|circle|config|cursor|random|IRread|setDNS|endSMS|getKey|micros|millis|begin|print|write|ready|flush|width|isPIN|blink|clear|press|mkdir|rmdir|close|point|yield|image|BSSID|click|delay|read|text|move|peek|beep|rect|line|open|seek|fill|size|turn|stop|home|find|step|tone|sqrt|RSSI|SSID|end|bit|tan|cos|sin|pow|map|abs|max|min|get|run|put)\b/,constant:/\b(?:DIGITAL_MESSAGE|FIRMATA_STRING|ANALOG_MESSAGE|REPORT_DIGITAL|REPORT_ANALOG|INPUT_PULLUP|SET_PIN_MODE|INTERNAL2V56|SYSTEM_RESET|LED_BUILTIN|INTERNAL1V1|SYSEX_START|INTERNAL|EXTERNAL|DEFAULT|OUTPUT|INPUT|HIGH|LOW)\b/});

View File

@@ -0,0 +1,10 @@
Prism.languages.arff = {
'comment': /%.*/,
'string': {
pattern: /(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
'keyword': /@(?:attribute|data|end|relation)\b/i,
'number': /\b\d+(?:\.\d+)?\b/,
'punctuation': /[{},]/
};

View File

@@ -0,0 +1 @@
Prism.languages.arff={comment:/%.*/,string:{pattern:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/@(?:attribute|data|end|relation)\b/i,number:/\b\d+(?:\.\d+)?\b/,punctuation:/[{},]/};

View File

@@ -0,0 +1,271 @@
(function (Prism) {
var attributes = {
pattern: /(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\]\\]|\\.)*\]|[^\]\\]|\\.)*\]/m,
lookbehind: true,
inside: {
'quoted': {
pattern: /([$`])(?:(?!\1)[^\\]|\\.)*\1/,
inside: {
'punctuation': /^[$`]|[$`]$/
}
},
'interpreted': {
pattern: /'(?:[^'\\]|\\.)*'/,
inside: {
'punctuation': /^'|'$/
// See rest below
}
},
'string': /"(?:[^"\\]|\\.)*"/,
'variable': /\w+(?==)/,
'punctuation': /^\[|\]$|,/,
'operator': /=/,
// The negative look-ahead prevents blank matches
'attr-value': /(?!^\s+$).+/
}
};
Prism.languages.asciidoc = {
'comment-block': {
pattern: /^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,
alias: 'comment'
},
'table': {
pattern: /^\|={3,}(?:(?:\r?\n|\r).*)*?(?:\r?\n|\r)\|={3,}$/m,
inside: {
'specifiers': {
pattern: /(?!\|)(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*])?(?:[<^>](?:\.[<^>])?|\.[<^>])?[a-z]*)(?=\|)/,
alias: 'attr-value'
},
'punctuation': {
pattern: /(^|[^\\])[|!]=*/,
lookbehind: true
}
// See rest below
}
},
'passthrough-block': {
pattern: /^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
inside: {
'punctuation': /^\++|\++$/
// See rest below
}
},
// Literal blocks and listing blocks
'literal-block': {
pattern: /^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
inside: {
'punctuation': /^(?:-+|\.+)|(?:-+|\.+)$/
// See rest below
}
},
// Sidebar blocks, quote blocks, example blocks and open blocks
'other-block': {
pattern: /^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
inside: {
'punctuation': /^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/
// See rest below
}
},
// list-punctuation and list-label must appear before indented-block
'list-punctuation': {
pattern: /(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,
lookbehind: true,
alias: 'punctuation'
},
'list-label': {
pattern: /(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,
lookbehind: true,
alias: 'symbol'
},
'indented-block': {
pattern: /((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,
lookbehind: true
},
'comment': /^\/\/.*/m,
'title': {
pattern: /^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} +.+|^\.(?![\s.]).*/m,
alias: 'important',
inside: {
'punctuation': /^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/
// See rest below
}
},
'attribute-entry': {
pattern: /^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,
alias: 'tag'
},
'attributes': attributes,
'hr': {
pattern: /^'{3,}$/m,
alias: 'punctuation'
},
'page-break': {
pattern: /^<{3,}$/m,
alias: 'punctuation'
},
'admonition': {
pattern: /^(?:TIP|NOTE|IMPORTANT|WARNING|CAUTION):/m,
alias: 'keyword'
},
'callout': [
{
pattern: /(^[ \t]*)<?\d*>/m,
lookbehind: true,
alias: 'symbol'
},
{
pattern: /<\d+>/,
alias: 'symbol'
}
],
'macro': {
pattern: /\b[a-z\d][a-z\d-]*::?(?:(?:\S+)??\[(?:[^\]\\"]|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
inside: {
'function': /^[a-z\d-]+(?=:)/,
'punctuation': /^::?/,
'attributes': {
pattern: /(?:\[(?:[^\]\\"]|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
inside: attributes.inside
}
}
},
'inline': {
/*
The initial look-behind prevents the highlighting of escaped quoted text.
Quoted text can be multi-line but cannot span an empty line.
All quoted text can have attributes before [foobar, 'foobar', baz="bar"].
First, we handle the constrained quotes.
Those must be bounded by non-word chars and cannot have spaces between the delimiter and the first char.
They are, in order: _emphasis_, ``double quotes'', `single quotes', `monospace`, 'emphasis', *strong*, +monospace+ and #unquoted#
Then we handle the unconstrained quotes.
Those do not have the restrictions of the constrained quotes.
They are, in order: __emphasis__, **strong**, ++monospace++, +++passthrough+++, ##unquoted##, $$passthrough$$, ~subscript~, ^superscript^, {attribute-reference}, [[anchor]], [[[bibliography anchor]]], <<xref>>, (((indexes))) and ((indexes))
*/
pattern: /(^|[^\\])(?:(?:\B\[(?:[^\]\\"]|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?: ['`]|.)+?(?:(?:\r?\n|\r)(?: ['`]|.)+?)*['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"]|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,
lookbehind: true,
inside: {
'attributes': attributes,
'url': {
pattern: /^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,
inside: {
'punctuation': /^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/
}
},
'attribute-ref': {
pattern: /^\{.+\}$/,
inside: {
'variable': {
pattern: /(^\{)[a-z\d,+_-]+/,
lookbehind: true
},
'operator': /^[=?!#%@$]|!(?=[:}])/,
'punctuation': /^\{|\}$|::?/
}
},
'italic': {
pattern: /^(['_])[\s\S]+\1$/,
inside: {
'punctuation': /^(?:''?|__?)|(?:''?|__?)$/
}
},
'bold': {
pattern: /^\*[\s\S]+\*$/,
inside: {
punctuation: /^\*\*?|\*\*?$/
}
},
'punctuation': /^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/
}
},
'replacement': {
pattern: /\((?:C|TM|R)\)/,
alias: 'builtin'
},
'entity': /&#?[\da-z]{1,8};/i,
'line-continuation': {
pattern: /(^| )\+$/m,
lookbehind: true,
alias: 'punctuation'
}
};
// Allow some nesting. There is no recursion though, so cloning should not be needed.
attributes.inside['interpreted'].inside.rest = {
'macro': Prism.languages.asciidoc['macro'],
'inline': Prism.languages.asciidoc['inline'],
'replacement': Prism.languages.asciidoc['replacement'],
'entity': Prism.languages.asciidoc['entity']
};
Prism.languages.asciidoc['passthrough-block'].inside.rest = {
'macro': Prism.languages.asciidoc['macro']
};
Prism.languages.asciidoc['literal-block'].inside.rest = {
'callout': Prism.languages.asciidoc['callout']
};
Prism.languages.asciidoc['table'].inside.rest = {
'comment-block': Prism.languages.asciidoc['comment-block'],
'passthrough-block': Prism.languages.asciidoc['passthrough-block'],
'literal-block': Prism.languages.asciidoc['literal-block'],
'other-block': Prism.languages.asciidoc['other-block'],
'list-punctuation': Prism.languages.asciidoc['list-punctuation'],
'indented-block': Prism.languages.asciidoc['indented-block'],
'comment': Prism.languages.asciidoc['comment'],
'title': Prism.languages.asciidoc['title'],
'attribute-entry': Prism.languages.asciidoc['attribute-entry'],
'attributes': Prism.languages.asciidoc['attributes'],
'hr': Prism.languages.asciidoc['hr'],
'page-break': Prism.languages.asciidoc['page-break'],
'admonition': Prism.languages.asciidoc['admonition'],
'list-label': Prism.languages.asciidoc['list-label'],
'callout': Prism.languages.asciidoc['callout'],
'macro': Prism.languages.asciidoc['macro'],
'inline': Prism.languages.asciidoc['inline'],
'replacement': Prism.languages.asciidoc['replacement'],
'entity': Prism.languages.asciidoc['entity'],
'line-continuation': Prism.languages.asciidoc['line-continuation']
};
Prism.languages.asciidoc['other-block'].inside.rest = {
'table': Prism.languages.asciidoc['table'],
'list-punctuation': Prism.languages.asciidoc['list-punctuation'],
'indented-block': Prism.languages.asciidoc['indented-block'],
'comment': Prism.languages.asciidoc['comment'],
'attribute-entry': Prism.languages.asciidoc['attribute-entry'],
'attributes': Prism.languages.asciidoc['attributes'],
'hr': Prism.languages.asciidoc['hr'],
'page-break': Prism.languages.asciidoc['page-break'],
'admonition': Prism.languages.asciidoc['admonition'],
'list-label': Prism.languages.asciidoc['list-label'],
'macro': Prism.languages.asciidoc['macro'],
'inline': Prism.languages.asciidoc['inline'],
'replacement': Prism.languages.asciidoc['replacement'],
'entity': Prism.languages.asciidoc['entity'],
'line-continuation': Prism.languages.asciidoc['line-continuation']
};
Prism.languages.asciidoc['title'].inside.rest = {
'macro': Prism.languages.asciidoc['macro'],
'inline': Prism.languages.asciidoc['inline'],
'replacement': Prism.languages.asciidoc['replacement'],
'entity': Prism.languages.asciidoc['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(/&amp;/, '&');
}
});
}(Prism));

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,28 @@
Prism.languages.asm6502 = {
'comment': /;.*/,
'directive': {
pattern: /\.\w+(?= )/,
alias: 'keyword'
},
'string': /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
'opcode': {
pattern: /\b(?:adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya|ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA)\b/,
alias: 'property'
},
'hexnumber': {
pattern: /#?\$[\da-f]{2,4}/i,
alias: 'string'
},
'binarynumber': {
pattern: /#?%[01]+/,
alias: 'string'
},
'decimalnumber': {
pattern: /#?\d+/,
alias: 'string'
},
'register': {
pattern: /\b[xya]\b/i,
alias: 'variable'
}
};

View File

@@ -0,0 +1 @@
Prism.languages.asm6502={comment:/;.*/,directive:{pattern:/\.\w+(?= )/,alias:"keyword"},string:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,opcode:{pattern:/\b(?:adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya|ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA)\b/,alias:"property"},hexnumber:{pattern:/#?\$[\da-f]{2,4}/i,alias:"string"},binarynumber:{pattern:/#?%[01]+/,alias:"string"},decimalnumber:{pattern:/#?\d+/,alias:"string"},register:{pattern:/\b[xya]\b/i,alias:"variable"}};

View File

@@ -0,0 +1,36 @@
Prism.languages.aspnet = Prism.languages.extend('markup', {
'page-directive tag': {
pattern: /<%\s*@.*%>/i,
inside: {
'page-directive tag': /<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,
rest: Prism.languages.markup.tag.inside
}
},
'directive tag': {
pattern: /<%.*%>/i,
inside: {
'directive tag': /<%\s*?[$=%#:]{0,2}|%>/i,
rest: Prism.languages.csharp
}
}
});
// Regexp copied from prism-markup, with a negative look-ahead added
Prism.languages.aspnet.tag.pattern = /<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;
// match directives of attribute value foo="<% Bar %>"
Prism.languages.insertBefore('inside', 'punctuation', {
'directive tag': Prism.languages.aspnet['directive tag']
}, Prism.languages.aspnet.tag.inside["attr-value"]);
Prism.languages.insertBefore('aspnet', 'comment', {
'asp comment': /<%--[\s\S]*?--%>/
});
// script runat="server" contains csharp, not javascript
Prism.languages.insertBefore('aspnet', Prism.languages.javascript ? 'script' : 'tag', {
'asp script': {
pattern: /(<script(?=.*runat=['"]?server['"]?)[\s\S]*?>)[\s\S]*?(?=<\/script>)/i,
lookbehind: true,
inside: Prism.languages.csharp || {}
}
});

View File

@@ -0,0 +1 @@
Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive tag":{pattern:/<%\s*@.*%>/i,inside:{"page-directive tag":/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,rest:Prism.languages.markup.tag.inside}},"directive tag":{pattern:/<%.*%>/i,inside:{"directive tag":/<%\s*?[$=%#:]{0,2}|%>/i,rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,Prism.languages.insertBefore("inside","punctuation",{"directive tag":Prism.languages.aspnet["directive tag"]},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp comment":/<%--[\s\S]*?--%>/}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp script":{pattern:/(<script(?=.*runat=['"]?server['"]?)[\s\S]*?>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.csharp||{}}});

View File

@@ -0,0 +1,27 @@
// NOTES - follows first-first highlight method, block is locked after highlight, different from SyntaxHl
Prism.languages.autohotkey= {
'comment': {
pattern: /(^[^";\n]*("[^"\n]*?"[^"\n]*?)*)(?:;.*$|^\s*\/\*[\s\S]*\n\*\/)/m,
lookbehind: true
},
'string': /"(?:[^"\n\r]|"")*"/m,
'function': /[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+?(?=\()/m, //function - don't use .*\) in the end bcoz string locks it
'tag': /^[ \t]*[^\s:]+?(?=:(?:[^:]|$))/m, //labels
'variable': /%\w+%/,
'number': /\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,
'operator': /\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,
'punctuation': /[{}[\]():,]/,
'boolean': /\b(?:true|false)\b/,
'selector': /\b(?: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)\b/i,
'constant': /\b(?: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)\b/i,
'builtin': /\b(?: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)\b/i,
'symbol': /\b(?: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)\b/i,
'important': /#\b(?: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)\b/i,
'keyword': /\b(?: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)\b/i
};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,34 @@
Prism.languages.autoit = {
"comment": [
/;.*/,
{
// The multi-line comments delimiters can actually be commented out with ";"
pattern: /(^\s*)#(?:comments-start|cs)[\s\S]*?^\s*#(?:comments-end|ce)/m,
lookbehind: true
}
],
"url": {
pattern: /(^\s*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,
lookbehind: true
},
"string": {
pattern: /(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,
greedy: true,
inside: {
"variable": /([%$@])\w+\1/
}
},
"directive": {
pattern: /(^\s*)#\w+/m,
lookbehind: true,
alias: 'keyword'
},
"function": /\b\w+(?=\()/,
// Variables and macros
"variable": /[$@]\w+/,
"keyword": /\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,
"number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,
"boolean": /\b(?:True|False)\b/i,
"operator": /<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Or|Not)\b/i,
"punctuation": /[\[\]().,:]/
};

View File

@@ -0,0 +1 @@
Prism.languages.autoit={comment:[/;.*/,{pattern:/(^\s*)#(?:comments-start|cs)[\s\S]*?^\s*#(?:comments-end|ce)/m,lookbehind:!0}],url:{pattern:/(^\s*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,lookbehind:!0},string:{pattern:/(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,greedy:!0,inside:{variable:/([%$@])\w+\1/}},directive:{pattern:/(^\s*)#\w+/m,lookbehind:!0,alias:"keyword"},"function":/\b\w+(?=\()/,variable:/[$@]\w+/,keyword:/\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,"boolean":/\b(?:True|False)\b/i,operator:/<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Or|Not)\b/i,punctuation:/[\[\]().,:]/};

View File

@@ -0,0 +1,84 @@
(function(Prism) {
var insideString = {
variable: [
// Arithmetic Environment
{
pattern: /\$?\(\([\s\S]+?\)\)/,
inside: {
// If there is a $ sign at the beginning highlight $(( and )) as variable
variable: [{
pattern: /(^\$\(\([\s\S]+)\)\)/,
lookbehind: true
},
/^\$\(\(/
],
number: /\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,
// Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic
operator: /--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,
// If there is no $ sign at the beginning highlight (( and )) as punctuation
punctuation: /\(\(?|\)\)?|,|;/
}
},
// Command Substitution
{
pattern: /\$\([^)]+\)|`[^`]+`/,
greedy: true,
inside: {
variable: /^\$\(|^`|\)$|`$/
}
},
/\$(?:[\w#?*!@]+|\{[^}]+\})/i
]
};
Prism.languages.bash = {
'shebang': {
pattern: /^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,
alias: 'important'
},
'comment': {
pattern: /(^|[^"{\\])#.*/,
lookbehind: true
},
'string': [
//Support for Here-Documents https://en.wikipedia.org/wiki/Here_document
{
pattern: /((?:^|[^<])<<\s*)["']?(\w+?)["']?\s*\r?\n(?:[\s\S])*?\r?\n\2/,
lookbehind: true,
greedy: true,
inside: insideString
},
{
pattern: /(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,
greedy: true,
inside: insideString
}
],
'variable': insideString.variable,
// Originally based on http://ss64.com/bash/
'function': {
pattern: /(^|[\s;|&])(?:alias|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chkconfig|chmod|chown|chroot|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|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|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|top|touch|tr|traceroute|trap|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip|zypper)(?=$|[\s;|&])/,
lookbehind: true
},
'keyword': {
pattern: /(^|[\s;|&])(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|[\s;|&])/,
lookbehind: true
},
'boolean': {
pattern: /(^|[\s;|&])(?:true|false)(?=$|[\s;|&])/,
lookbehind: true
},
'operator': /&&?|\|\|?|==?|!=?|<<<?|>>|<=?|>=?|=~/,
'punctuation': /\$?\(\(?|\)\)?|\.\.|[{}[\];]/
};
var inside = insideString.variable[1].inside;
inside.string = Prism.languages.bash.string;
inside['function'] = Prism.languages.bash['function'];
inside.keyword = Prism.languages.bash.keyword;
inside['boolean'] = Prism.languages.bash['boolean'];
inside.operator = Prism.languages.bash.operator;
inside.punctuation = Prism.languages.bash.punctuation;
Prism.languages.shell = Prism.languages.bash;
})(Prism);

View File

@@ -0,0 +1 @@
!function(e){var t={variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\([^)]+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},/\$(?:[\w#?*!@]+|\{[^}]+\})/i]};e.languages.bash={shebang:{pattern:/^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,alias:"important"},comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},string:[{pattern:/((?:^|[^<])<<\s*)["']?(\w+?)["']?\s*\r?\n(?:[\s\S])*?\r?\n\2/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,greedy:!0,inside:t}],variable:t.variable,"function":{pattern:/(^|[\s;|&])(?:alias|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chkconfig|chmod|chown|chroot|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|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|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|top|touch|tr|traceroute|trap|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip|zypper)(?=$|[\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&])(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|[\s;|&])/,lookbehind:!0},"boolean":{pattern:/(^|[\s;|&])(?:true|false)(?=$|[\s;|&])/,lookbehind:!0},operator:/&&?|\|\|?|==?|!=?|<<<?|>>|<=?|>=?|=~/,punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];]/};var a=t.variable[1].inside;a.string=e.languages.bash.string,a["function"]=e.languages.bash["function"],a.keyword=e.languages.bash.keyword,a["boolean"]=e.languages.bash["boolean"],a.operator=e.languages.bash.operator,a.punctuation=e.languages.bash.punctuation,e.languages.shell=e.languages.bash}(Prism);

View File

@@ -0,0 +1,17 @@
Prism.languages.basic = {
'comment': {
pattern: /(?:!|REM\b).+/i,
inside: {
'keyword': /^REM/i
}
},
'string': {
pattern: /"(?:""|[!#$%&'()*,\/:;<=>?^_ +\-.A-Z\d])*"/i,
greedy: true
},
'number': /(?:\b\d+\.?\d*|\B\.\d+)(?:E[+-]?\d+)?/i,
'keyword': /\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|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(?: COM| ERROR| KEY| 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)(?:\$|\b)/i,
'function': /\b(?: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)(?:\$|\b)/i,
'operator': /<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,
'punctuation': /[,;:()]/
};

View File

@@ -0,0 +1 @@
Prism.languages.basic={comment:{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^_ +\-.A-Z\d])*"/i,greedy:!0},number:/(?:\b\d+\.?\d*|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|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(?: COM| ERROR| KEY| 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)(?:\$|\b)/i,"function":/\b(?: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)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/};

View File

@@ -0,0 +1,99 @@
(function (Prism) {
var variable = /%%?[~:\w]+%?|!\S+!/;
var parameter = {
pattern: /\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,
alias: 'attr-name',
inside: {
'punctuation': /:/
}
};
var string = /"[^"]*"/;
var number = /(?:\b|-)\d+\b/;
Prism.languages.batch = {
'comment': [
/^::.*/m,
{
pattern: /((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
lookbehind: true
}
],
'label': {
pattern: /^:.*/m,
alias: 'property'
},
'command': [
{
// FOR command
pattern: /((?:^|[&(])[ \t]*)for(?: ?\/[a-z?](?:[ :](?:"[^"]*"|\S+))?)* \S+ in \([^)]+\) do/im,
lookbehind: true,
inside: {
'keyword': /^for\b|\b(?:in|do)\b/i,
'string': string,
'parameter': parameter,
'variable': variable,
'number': number,
'punctuation': /[()',]/
}
},
{
// IF command
pattern: /((?:^|[&(])[ \t]*)if(?: ?\/[a-z?](?:[ :](?:"[^"]*"|\S+))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|\S+)?(?:==| (?:equ|neq|lss|leq|gtr|geq) )(?:"[^"]*"|\S+))/im,
lookbehind: true,
inside: {
'keyword': /^if\b|\b(?:not|cmdextversion|defined|errorlevel|exist)\b/i,
'string': string,
'parameter': parameter,
'variable': variable,
'number': number,
'operator': /\^|==|\b(?:equ|neq|lss|leq|gtr|geq)\b/i
}
},
{
// ELSE command
pattern: /((?:^|[&()])[ \t]*)else\b/im,
lookbehind: true,
inside: {
'keyword': /^else\b/i
}
},
{
// SET command
pattern: /((?:^|[&(])[ \t]*)set(?: ?\/[a-z](?:[ :](?:"[^"]*"|\S+))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
lookbehind: true,
inside: {
'keyword': /^set\b/i,
'string': string,
'parameter': parameter,
'variable': [
variable,
/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/
],
'number': number,
'operator': /[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,
'punctuation': /[()',]/
}
},
{
// Other commands
pattern: /((?:^|[&(])[ \t]*@?)\w+\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
lookbehind: true,
inside: {
'keyword': /^\w+\b/i,
'string': string,
'parameter': parameter,
'label': {
pattern: /(^\s*):\S+/m,
lookbehind: true,
alias: 'property'
},
'variable': variable,
'number': number,
'operator': /\^/
}
}
],
'operator': /[&@]/,
'punctuation': /[()']/
};
}(Prism));

View File

@@ -0,0 +1 @@
!function(e){var r=/%%?[~:\w]+%?|!\S+!/,t={pattern:/\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,alias:"attr-name",inside:{punctuation:/:/}},n=/"[^"]*"/,i=/(?:\b|-)\d+\b/;e.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:"property"},command:[{pattern:/((?:^|[&(])[ \t]*)for(?: ?\/[a-z?](?:[ :](?:"[^"]*"|\S+))?)* \S+ in \([^)]+\) do/im,lookbehind:!0,inside:{keyword:/^for\b|\b(?:in|do)\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*)if(?: ?\/[a-z?](?:[ :](?:"[^"]*"|\S+))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|\S+)?(?:==| (?:equ|neq|lss|leq|gtr|geq) )(?:"[^"]*"|\S+))/im,lookbehind:!0,inside:{keyword:/^if\b|\b(?:not|cmdextversion|defined|errorlevel|exist)\b/i,string:n,parameter:t,variable:r,number:i,operator:/\^|==|\b(?:equ|neq|lss|leq|gtr|geq)\b/i}},{pattern:/((?:^|[&()])[ \t]*)else\b/im,lookbehind:!0,inside:{keyword:/^else\b/i}},{pattern:/((?:^|[&(])[ \t]*)set(?: ?\/[a-z](?:[ :](?:"[^"]*"|\S+))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^set\b/i,string:n,parameter:t,variable:[r,/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/],number:i,operator:/[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \t]*@?)\w+\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,lookbehind:!0,inside:{keyword:/^\w+\b/i,string:n,parameter:t,label:{pattern:/(^\s*):\S+/m,lookbehind:!0,alias:"property"},variable:r,number:i,operator:/\^/}}],operator:/[&@]/,punctuation:/[()']/}}(Prism);

View File

@@ -0,0 +1,39 @@
Prism.languages.bison = Prism.languages.extend('c', {});
Prism.languages.insertBefore('bison', 'comment', {
'bison': {
// This should match all the beginning of the file
// including the prologue(s), the bison declarations and
// the grammar rules.
pattern: /^[\s\S]*?%%[\s\S]*?%%/,
inside: {
'c': {
// Allow for one level of nested braces
pattern: /%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,
inside: {
'delimiter': {
pattern: /^%?\{|%?\}$/,
alias: 'punctuation'
},
'bison-variable': {
pattern: /[$@](?:<[^\s>]+>)?[\w$]+/,
alias: 'variable',
inside: {
'punctuation': /<|>/
}
},
rest: Prism.languages.c
}
},
'comment': Prism.languages.c.comment,
'string': Prism.languages.c.string,
'property': /\S+(?=:)/,
'keyword': /%\w+/,
'number': {
pattern: /(^|[^@])\b(?:0x[\da-f]+|\d+)/i,
lookbehind: true
},
'punctuation': /%[%?]|[|:;\[\]<>]/
}
}
});

View File

@@ -0,0 +1 @@
Prism.languages.bison=Prism.languages.extend("c",{}),Prism.languages.insertBefore("bison","comment",{bison:{pattern:/^[\s\S]*?%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:Prism.languages.c}},comment:Prism.languages.c.comment,string:Prism.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}});

View File

@@ -0,0 +1,20 @@
Prism.languages.brainfuck = {
'pointer': {
pattern: /<|>/,
alias: 'keyword'
},
'increment': {
pattern: /\+/,
alias: 'inserted'
},
'decrement': {
pattern: /-/,
alias: 'deleted'
},
'branching': {
pattern: /\[|\]/,
alias: 'important'
},
'operator': /[.,]/,
'comment': /\S+/
};

View File

@@ -0,0 +1 @@
Prism.languages.brainfuck={pointer:{pattern:/<|>/,alias:"keyword"},increment:{pattern:/\+/,alias:"inserted"},decrement:{pattern:/-/,alias:"deleted"},branching:{pattern:/\[|\]/,alias:"important"},operator:/[.,]/,comment:/\S+/};

View File

@@ -0,0 +1,48 @@
Prism.languages.bro = {
'comment': {
pattern: /(^|[^\\$])#.*/,
lookbehind: true,
inside: {
'italic': /\b(?:TODO|FIXME|XXX)\b/
}
},
'string': {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
'boolean': /\b[TF]\b/,
'function': {
pattern: /(?:function|hook|event) \w+(?:::\w+)?/,
inside: {
keyword: /^(?:function|hook|event)/
}
},
'variable': {
pattern: /(?:global|local) \w+/i,
inside: {
keyword: /(?:global|local)/
}
},
'builtin': /(?:@(?:load(?:-(?:sigs|plugin))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:redef|priority|log|optional|default|add_func|delete_func|expire_func|read_expire|write_expire|create_expire|synchronized|persistent|rotate_interval|rotate_size|encrypt|raw_output|mergeable|group|error_handler|type_column))/,
'constant': {
pattern: /const \w+/i,
inside: {
keyword: /const/
}
},
'keyword': /\b(?: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)\b/,
'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,
'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,
'punctuation': /[{}[\];(),.:]/
};

View File

@@ -0,0 +1 @@
Prism.languages.bro={comment:{pattern:/(^|[^\\$])#.*/,lookbehind:!0,inside:{italic:/\b(?:TODO|FIXME|XXX)\b/}},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"boolean":/\b[TF]\b/,"function":{pattern:/(?:function|hook|event) \w+(?:::\w+)?/,inside:{keyword:/^(?:function|hook|event)/}},variable:{pattern:/(?:global|local) \w+/i,inside:{keyword:/(?:global|local)/}},builtin:/(?:@(?:load(?:-(?:sigs|plugin))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:redef|priority|log|optional|default|add_func|delete_func|expire_func|read_expire|write_expire|create_expire|synchronized|persistent|rotate_interval|rotate_size|encrypt|raw_output|mergeable|group|error_handler|type_column))/,constant:{pattern:/const \w+/i,inside:{keyword:/const/}},keyword:/\b(?: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)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,punctuation:/[{}[\];(),.:]/};

View File

@@ -0,0 +1,33 @@
Prism.languages.c = Prism.languages.extend('clike', {
'keyword': /\b(?:_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)\b/,
'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,
'number': /(?:\b0x[\da-f]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i
});
Prism.languages.insertBefore('c', 'string', {
'macro': {
// allow for multiline macro definitions
// spaces after the # character compile fine with gcc
pattern: /(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,
lookbehind: true,
alias: 'property',
inside: {
// highlight the path of the include statement as a string
'string': {
pattern: /(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,
lookbehind: true
},
// highlight macro directives as keywords
'directive': {
pattern: /(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,
lookbehind: true,
alias: 'keyword'
}
}
},
// highlight predefined macros as constants
'constant': /\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/
});
delete Prism.languages.c['class-name'];
delete Prism.languages.c['boolean'];

View File

@@ -0,0 +1 @@
Prism.languages.c=Prism.languages.extend("clike",{keyword:/\b(?:_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)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*\/%&|^!=<>]=?/,number:/(?:\b0x[\da-f]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["class-name"],delete Prism.languages.c["boolean"];

View File

@@ -0,0 +1,27 @@
Prism.languages.cil = {
'comment': /\/\/.*/,
'string': {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
'directive': {
pattern: /(^|\W)\.[a-z]+(?=\s)/,
lookbehind: true,
alias: 'class-name'
},
// Actually an assembly reference
'variable': /\[[\w\.]+\]/,
'keyword': /\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|iant|idispatch|implements|import|initonly|instance|u?int(?:8|16|32|64)?|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,
'function': /\b(?:(?:constrained|unaligned|volatile|readonly|tail|no)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.[0-9]+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.[0-9]+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|ldvirtftn|castclass|beq(?:\.s)?|mkrefany|localloc|ckfinite|rethrow|ldtoken|ldsflda|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stloc|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|clt|cgt|ceq|box|and|or|br)\b/,
'boolean': /\b(?:true|false)\b/,
'number': /\b-?(?:0x[0-9a-fA-F]+|[0-9]+)(?:\.[0-9a-fA-F]+)?\b/i,
'punctuation': /[{}[\];(),:=]|IL_[0-9A-Za-z]+/
}

View File

@@ -0,0 +1 @@
Prism.languages.cil={comment:/\/\/.*/,string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},directive:{pattern:/(^|\W)\.[a-z]+(?=\s)/,lookbehind:!0,alias:"class-name"},variable:/\[[\w\.]+\]/,keyword:/\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|iant|idispatch|implements|import|initonly|instance|u?int(?:8|16|32|64)?|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,"function":/\b(?:(?:constrained|unaligned|volatile|readonly|tail|no)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.[0-9]+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.[0-9]+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|ldvirtftn|castclass|beq(?:\.s)?|mkrefany|localloc|ckfinite|rethrow|ldtoken|ldsflda|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stloc|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|clt|cgt|ceq|box|and|or|br)\b/,"boolean":/\b(?:true|false)\b/,number:/\b-?(?:0x[0-9a-fA-F]+|[0-9]+)(?:\.[0-9a-fA-F]+)?\b/i,punctuation:/[{}[\];(),:=]|IL_[0-9A-Za-z]+/};

View File

@@ -0,0 +1,30 @@
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': /[{}[\];(),.:]/
};

View File

@@ -0,0 +1 @@
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,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:/[{}[\];(),.:]/};

View File

@@ -0,0 +1,13 @@
// Copied from https://github.com/jeluard/prism-clojure
Prism.languages.clojure = {
comment: /;+.*/,
string: /"(?:\\.|[^\\"\r\n])*"/,
operator: /(?:::|[:|'])\b[a-z][\w*+!?-]*\b/i, //used for symbols and keywords
keyword: {
pattern: /([^\w+*'?-])(?:def|if|do|let|\.\.|quote|var|->>|->|fn|loop|recur|throw|try|monitor-enter|\.|new|set!|def\-|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|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|conj|cons|constantly|cond|if-not|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|deref|difference|disj|dissoc|distinct|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|for|fnseq|frest|gensym|get-proxy-class|get|hash-map|hash-set|identical\?|identity|if-let|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|line-seq|list\*|list|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|time|to-array|to-array-2d|tree-seq|true\?|union|up|update-proxy|val|vals|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[^\w+*'?-])/,
lookbehind: true
},
boolean: /\b(?:true|false|nil)\b/,
number: /\b[0-9A-Fa-f]+\b/,
punctuation: /[{}\[\](),]/
};

View File

@@ -0,0 +1 @@
Prism.languages.clojure={comment:/;+.*/,string:/"(?:\\.|[^\\"\r\n])*"/,operator:/(?:::|[:|'])\b[a-z][\w*+!?-]*\b/i,keyword:{pattern:/([^\w+*'?-])(?:def|if|do|let|\.\.|quote|var|->>|->|fn|loop|recur|throw|try|monitor-enter|\.|new|set!|def\-|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|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|conj|cons|constantly|cond|if-not|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|deref|difference|disj|dissoc|distinct|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|for|fnseq|frest|gensym|get-proxy-class|get|hash-map|hash-set|identical\?|identity|if-let|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|line-seq|list\*|list|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|time|to-array|to-array-2d|tree-seq|true\?|union|up|update-proxy|val|vals|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[^\w+*'?-])/,lookbehind:!0},"boolean":/\b(?:true|false|nil)\b/,number:/\b[0-9A-Fa-f]+\b/,punctuation:/[{}\[\](),]/};

View File

@@ -0,0 +1,92 @@
(function(Prism) {
// Ignore comments starting with { to privilege string interpolation highlighting
var comment = /#(?!\{).+/,
interpolation = {
pattern: /#\{[^}]+\}/,
alias: 'variable'
};
Prism.languages.coffeescript = Prism.languages.extend('javascript', {
'comment': comment,
'string': [
// Strings are multiline
{
pattern: /'(?:\\[\s\S]|[^\\'])*'/,
greedy: true
},
{
// Strings are multiline
pattern: /"(?:\\[\s\S]|[^\\"])*"/,
greedy: true,
inside: {
'interpolation': interpolation
}
}
],
'keyword': /\b(?: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)\b/,
'class-member': {
pattern: /@(?!\d)\w+/,
alias: 'variable'
}
});
Prism.languages.insertBefore('coffeescript', 'comment', {
'multiline-comment': {
pattern: /###[\s\S]+?###/,
alias: 'comment'
},
// Block regexp can contain comments and interpolation
'block-regex': {
pattern: /\/{3}[\s\S]*?\/{3}/,
alias: 'regex',
inside: {
'comment': comment,
'interpolation': interpolation
}
}
});
Prism.languages.insertBefore('coffeescript', 'string', {
'inline-javascript': {
pattern: /`(?:\\[\s\S]|[^\\`])*`/,
inside: {
'delimiter': {
pattern: /^`|`$/,
alias: 'punctuation'
},
rest: Prism.languages.javascript
}
},
// Block strings
'multiline-string': [
{
pattern: /'''[\s\S]*?'''/,
greedy: true,
alias: 'string'
},
{
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: 'string',
inside: {
interpolation: interpolation
}
}
]
});
Prism.languages.insertBefore('coffeescript', 'keyword', {
// Object property
'property': /(?!\d)\w+(?=\s*:(?!:))/
});
delete Prism.languages.coffeescript['template-string'];
Prism.languages.coffee = Prism.languages.coffeescript;
}(Prism));

View File

@@ -0,0 +1 @@
!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?: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)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},rest:e.languages.javascript}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism);

View File

@@ -0,0 +1,548 @@
var _self = (typeof window !== 'undefined')
? window // if in browser
: (
(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
? self // if in worker
: {} // if in node js
);
/**
* Prism: Lightweight, robust, elegant syntax highlighting
* MIT license http://www.opensource.org/licenses/mit-license.php/
* @author Lea Verou http://lea.verou.me
*/
var Prism = (function(){
// Private helper vars
var lang = /\blang(?:uage)?-([\w-]+)\b/i;
var uniqueId = 0;
var _ = _self.Prism = {
manual: _self.Prism && _self.Prism.manual,
disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,
util: {
encode: function (tokens) {
if (tokens instanceof Token) {
return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
} else if (_.util.type(tokens) === 'Array') {
return tokens.map(_.util.encode);
} else {
return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
}
},
type: function (o) {
return Object.prototype.toString.call(o).slice(8, -1);
},
objId: function (obj) {
if (!obj['__id']) {
Object.defineProperty(obj, '__id', { value: ++uniqueId });
}
return obj['__id'];
},
// Deep clone a language definition (e.g. to extend it)
clone: function (o, visited) {
var type = _.util.type(o);
visited = visited || {};
switch (type) {
case 'Object':
if (visited[_.util.objId(o)]) {
return visited[_.util.objId(o)];
}
var clone = {};
visited[_.util.objId(o)] = clone;
for (var key in o) {
if (o.hasOwnProperty(key)) {
clone[key] = _.util.clone(o[key], visited);
}
}
return clone;
case 'Array':
if (visited[_.util.objId(o)]) {
return visited[_.util.objId(o)];
}
var clone = [];
visited[_.util.objId(o)] = clone;
o.forEach(function (v, i) {
clone[i] = _.util.clone(v, visited);
});
return clone;
}
return o;
}
},
languages: {
extend: function (id, redef) {
var lang = _.util.clone(_.languages[id]);
for (var key in redef) {
lang[key] = redef[key];
}
return lang;
},
/**
* Insert a token before another token in a language literal
* As this needs to recreate the object (we cannot actually insert before keys in object literals),
* we cannot just provide an object, we need an object and a key.
* @param inside The key (or language id) of the parent
* @param before The key to insert before.
* @param insert Object with the key/value pairs to insert
* @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
*/
insertBefore: function (inside, before, insert, root) {
root = root || _.languages;
var grammar = root[inside];
var ret = {};
for (var token in grammar) {
if (grammar.hasOwnProperty(token)) {
if (token == before) {
for (var newToken in insert) {
if (insert.hasOwnProperty(newToken)) {
ret[newToken] = insert[newToken];
}
}
}
// Do not insert token which also occur in insert. See #1525
if (!insert.hasOwnProperty(token)) {
ret[token] = grammar[token];
}
}
}
var old = root[inside];
root[inside] = ret;
// Update references in other language definitions
_.languages.DFS(_.languages, function(key, value) {
if (value === old && key != inside) {
this[key] = ret;
}
});
return ret;
},
// Traverse a language definition with Depth First Search
DFS: function(o, callback, type, visited) {
visited = visited || {};
for (var i in o) {
if (o.hasOwnProperty(i)) {
callback.call(o, i, o[i], type || i);
if (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {
visited[_.util.objId(o[i])] = true;
_.languages.DFS(o[i], callback, null, visited);
}
else if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {
visited[_.util.objId(o[i])] = true;
_.languages.DFS(o[i], callback, i, visited);
}
}
}
}
},
plugins: {},
highlightAll: function(async, callback) {
_.highlightAllUnder(document, async, callback);
},
highlightAllUnder: function(container, async, callback) {
var env = {
callback: callback,
selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
};
_.hooks.run("before-highlightall", env);
var elements = env.elements || container.querySelectorAll(env.selector);
for (var i=0, element; element = elements[i++];) {
_.highlightElement(element, async === true, env.callback);
}
},
highlightElement: function(element, async, callback) {
// Find language
var language, grammar, parent = element;
while (parent && !lang.test(parent.className)) {
parent = parent.parentNode;
}
if (parent) {
language = (parent.className.match(lang) || [,''])[1].toLowerCase();
grammar = _.languages[language];
}
// Set language on the element, if not present
element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
if (element.parentNode) {
// Set language on the parent, for styling
parent = element.parentNode;
if (/pre/i.test(parent.nodeName)) {
parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
}
}
var code = element.textContent;
var env = {
element: element,
language: language,
grammar: grammar,
code: code
};
_.hooks.run('before-sanity-check', env);
if (!env.code || !env.grammar) {
if (env.code) {
_.hooks.run('before-highlight', env);
env.element.textContent = env.code;
_.hooks.run('after-highlight', env);
}
_.hooks.run('complete', env);
return;
}
_.hooks.run('before-highlight', env);
if (async && _self.Worker) {
var worker = new Worker(_.filename);
worker.onmessage = function(evt) {
env.highlightedCode = evt.data;
_.hooks.run('before-insert', env);
env.element.innerHTML = env.highlightedCode;
_.hooks.run('after-highlight', env);
_.hooks.run('complete', env);
callback && callback.call(env.element);
};
worker.postMessage(JSON.stringify({
language: env.language,
code: env.code,
immediateClose: true
}));
}
else {
env.highlightedCode = _.highlight(env.code, env.grammar, env.language);
_.hooks.run('before-insert', env);
env.element.innerHTML = env.highlightedCode;
_.hooks.run('after-highlight', env);
_.hooks.run('complete', env);
callback && callback.call(element);
}
},
highlight: function (text, grammar, language) {
var env = {
code: text,
grammar: grammar,
language: language
};
_.hooks.run('before-tokenize', env);
env.tokens = _.tokenize(env.code, env.grammar);
_.hooks.run('after-tokenize', env);
return Token.stringify(_.util.encode(env.tokens), env.language);
},
matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) {
var Token = _.Token;
for (var token in grammar) {
if(!grammar.hasOwnProperty(token) || !grammar[token]) {
continue;
}
if (token == target) {
return;
}
var patterns = grammar[token];
patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
for (var j = 0; j < patterns.length; ++j) {
var pattern = patterns[j],
inside = pattern.inside,
lookbehind = !!pattern.lookbehind,
greedy = !!pattern.greedy,
lookbehindLength = 0,
alias = pattern.alias;
if (greedy && !pattern.pattern.global) {
// Without the global flag, lastIndex won't work
var flags = pattern.pattern.toString().match(/[imuy]*$/)[0];
pattern.pattern = RegExp(pattern.pattern.source, flags + "g");
}
pattern = pattern.pattern || pattern;
// Dont cache length as it changes during the loop
for (var i = index, pos = startPos; i < strarr.length; pos += strarr[i].length, ++i) {
var str = strarr[i];
if (strarr.length > 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, '&quot;') + '"';
}).join(' ');
return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '</' + env.tag + '>';
};
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;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,20 @@
Prism.languages.cpp = Prism.languages.extend('c', {
'keyword': /\b(?: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|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|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)\b/,
'boolean': /\b(?:true|false)\b/,
'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/
});
Prism.languages.insertBefore('cpp', 'keyword', {
'class-name': {
pattern: /(class\s+)\w+/i,
lookbehind: true
}
});
Prism.languages.insertBefore('cpp', 'string', {
'raw-string': {
pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,
alias: 'string',
greedy: true
}
});

View File

@@ -0,0 +1 @@
Prism.languages.cpp=Prism.languages.extend("c",{keyword:/\b(?: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|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|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)\b/,"boolean":/\b(?:true|false)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*\/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),Prism.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)\w+/i,lookbehind:!0}}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}});

View File

@@ -0,0 +1,51 @@
(function(Prism) {
Prism.languages.crystal = Prism.languages.extend('ruby', {
keyword: [
/\b(?:abstract|alias|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|rescue|return|require|select|self|sizeof|struct|super|then|type|typeof|uninitialized|union|unless|until|when|while|with|yield|__DIR__|__END_LINE__|__FILE__|__LINE__)\b/,
{
pattern: /(\.\s*)(?:is_a|responds_to)\?/,
lookbehind: true
}
],
number: /\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/
});
Prism.languages.insertBefore('crystal', 'string', {
attribute: {
pattern: /@\[.+?\]/,
alias: 'attr-name',
inside: {
delimiter: {
pattern: /^@\[|\]$/,
alias: 'tag'
},
rest: Prism.languages.crystal
}
},
expansion: [
{
pattern: /\{\{.+?\}\}/,
inside: {
delimiter: {
pattern: /^\{\{|\}\}$/,
alias: 'tag'
},
rest: Prism.languages.crystal
}
},
{
pattern: /\{%.+?%\}/,
inside: {
delimiter: {
pattern: /^\{%|%\}$/,
alias: 'tag'
},
rest: Prism.languages.crystal
}
}
]
});
}(Prism));

View File

@@ -0,0 +1 @@
!function(e){e.languages.crystal=e.languages.extend("ruby",{keyword:[/\b(?:abstract|alias|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|rescue|return|require|select|self|sizeof|struct|super|then|type|typeof|uninitialized|union|unless|until|when|while|with|yield|__DIR__|__END_LINE__|__FILE__|__LINE__)\b/,{pattern:/(\.\s*)(?:is_a|responds_to)\?/,lookbehind:!0}],number:/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/}),e.languages.insertBefore("crystal","string",{attribute:{pattern:/@\[.+?\]/,alias:"attr-name",inside:{delimiter:{pattern:/^@\[|\]$/,alias:"tag"},rest:e.languages.crystal}},expansion:[{pattern:/\{\{.+?\}\}/,inside:{delimiter:{pattern:/^\{\{|\}\}$/,alias:"tag"},rest:e.languages.crystal}},{pattern:/\{%.+?%\}/,inside:{delimiter:{pattern:/^\{%|%\}$/,alias:"tag"},rest:e.languages.crystal}}]})}(Prism);

View File

@@ -0,0 +1,81 @@
Prism.languages.csharp = Prism.languages.extend('clike', {
'keyword': /\b(?: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)\b/,
'string': [
{
pattern: /@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,
greedy: true
},
{
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,
greedy: true
}
],
'class-name': [
{
// (Foo bar, Bar baz)
pattern: /\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,
inside: {
punctuation: /\./
}
},
{
// [Foo]
pattern: /(\[)[A-Z]\w*(?:\.\w+)*\b/,
lookbehind: true,
inside: {
punctuation: /\./
}
},
{
// class Foo : Bar
pattern: /(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,
lookbehind: true,
inside: {
punctuation: /\./
}
},
{
// class Foo
pattern: /((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,
lookbehind: true,
inside: {
punctuation: /\./
}
}
],
'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i,
'operator': />>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/,
'punctuation': /\?\.?|::|[{}[\];(),.:]/
});
Prism.languages.insertBefore('csharp', 'class-name', {
'generic-method': {
pattern: /\w+\s*<[^>\r\n]+?>\s*(?=\()/,
inside: {
function: /^\w+/,
'class-name': {
pattern: /\b[A-Z]\w*(?:\.\w+)*\b/,
inside: {
punctuation: /\./
}
},
keyword: Prism.languages.csharp.keyword,
punctuation: /[<>(),.:]/
}
},
'preprocessor': {
pattern: /(^\s*)#.*/m,
lookbehind: true,
alias: 'property',
inside: {
// highlight preprocessor directives as keywords
'directive': {
pattern: /(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,
lookbehind: true,
alias: 'keyword'
}
}
}
});
Prism.languages.dotnet = Prism.languages.csharp;

View File

@@ -0,0 +1 @@
Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(?: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)\b/,string:[{pattern:/@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,greedy:!0}],"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i,operator:/>>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*\/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),Prism.languages.insertBefore("csharp","class-name",{"generic-method":{pattern:/\w+\s*<[^>\r\n]+?>\s*(?=\()/,inside:{"function":/^\w+/,"class-name":{pattern:/\b[A-Z]\w*(?:\.\w+)*\b/,inside:{punctuation:/\./}},keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.dotnet=Prism.languages.csharp;

View File

@@ -0,0 +1,25 @@
/**
* Original by Scott Helme.
*
* Reference: https://scotthelme.co.uk/csp-cheat-sheet/
*
* Supports the following:
* - CSP Level 1
* - CSP Level 2
* - CSP Level 3
*/
Prism.languages.csp = {
'directive': {
pattern: /\b(?:(?:base-uri|form-action|frame-ancestors|plugin-types|referrer|reflected-xss|report-to|report-uri|require-sri-for|sandbox) |(?:block-all-mixed-content|disown-opener|upgrade-insecure-requests)(?: |;)|(?:child|connect|default|font|frame|img|manifest|media|object|script|style|worker)-src )/i,
alias: 'keyword'
},
'safe': {
pattern: /'(?:self|none|strict-dynamic|(?:nonce-|sha(?:256|384|512)-)[a-zA-Z\d+=/]+)'/,
alias: 'selector'
},
'unsafe': {
pattern: /(?:'unsafe-inline'|'unsafe-eval'|'unsafe-hashed-attributes'|\*)/,
alias: 'function'
}
};

View File

@@ -0,0 +1 @@
Prism.languages.csp={directive:{pattern:/\b(?:(?:base-uri|form-action|frame-ancestors|plugin-types|referrer|reflected-xss|report-to|report-uri|require-sri-for|sandbox) |(?:block-all-mixed-content|disown-opener|upgrade-insecure-requests)(?: |;)|(?:child|connect|default|font|frame|img|manifest|media|object|script|style|worker)-src )/i,alias:"keyword"},safe:{pattern:/'(?:self|none|strict-dynamic|(?:nonce-|sha(?:256|384|512)-)[a-zA-Z\d+=\/]+)'/,alias:"selector"},unsafe:{pattern:/(?:'unsafe-inline'|'unsafe-eval'|'unsafe-hashed-attributes'|\*)/,alias:"function"}};

View File

@@ -0,0 +1,31 @@
Prism.languages.css.selector = {
pattern: Prism.languages.css.selector,
inside: {
'pseudo-element': /:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,
'pseudo-class': /:[-\w]+(?:\(.*\))?/,
'class': /\.[-:.\w]+/,
'id': /#[-:.\w]+/,
'attribute': /\[[^\]]+\]/
}
};
Prism.languages.insertBefore('css', 'property', {
'variable': {
pattern: /(^|[^-\w\xA0-\uFFFF])--[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*/i,
lookbehind: true
}
});
Prism.languages.insertBefore('css', 'function', {
'operator': {
pattern: /(\s)[+\-*\/](?=\s)/,
lookbehind: true
},
'hexcode': /#[\da-f]{3,8}/i,
'entity': /\\[\da-f]{1,8}/i,
'unit': {
pattern: /(\d)(?:%|[a-z]+)/,
lookbehind: true
},
'number': /-?[\d.]+/
});

View File

@@ -0,0 +1 @@
Prism.languages.css.selector={pattern:Prism.languages.css.selector,inside:{"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+(?:\(.*\))?/,"class":/\.[-:.\w]+/,id:/#[-:.\w]+/,attribute:/\[[^\]]+\]/}},Prism.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*/i,lookbehind:!0}}),Prism.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:/#[\da-f]{3,8}/i,entity:/\\[\da-f]{1,8}/i,unit:{pattern:/(\d)(?:%|[a-z]+)/,lookbehind:!0},number:/-?[\d.]+/});

View File

@@ -0,0 +1,52 @@
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: /(<style[\s\S]*?>)[\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);
}

View File

@@ -0,0 +1 @@
Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},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:!0},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,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<style[\s\S]*?>)[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),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));

View File

@@ -0,0 +1,64 @@
Prism.languages.d = Prism.languages.extend('clike', {
'string': [
// r"", x""
/\b[rx]"(?:\\[\s\S]|[^\\"])*"[cwd]?/,
// q"[]", q"()", q"<>", q"{}"
/\bq"(?:\[[\s\S]*?\]|\([\s\S]*?\)|<[\s\S]*?>|\{[\s\S]*?\})"/,
// q"IDENT
// ...
// IDENT"
/\bq"([_a-zA-Z][_a-zA-Z\d]*)(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\1"/,
// q"//", q"||", etc.
/\bq"(.)[\s\S]*?\1"/,
// Characters
/'(?:\\'|\\?[^']+)'/,
/(["`])(?:\\[\s\S]|(?!\1)[^\\])*\1[cwd]?/
],
'number': [
// The lookbehind and the negative look-ahead try to prevent bad highlighting of the .. operator
// Hexadecimal numbers must be handled separately to avoid problems with exponent "e"
/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]*/i,
{
pattern: /((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]*/i,
lookbehind: true
}
],
// In order: $, keywords and special tokens, globally defined symbols
'keyword': /\$|\b(?: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)\b/,
'operator': /\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/
});
Prism.languages.d.comment = [
// Shebang
/^\s*#!.+/,
// /+ +/
{
// Allow one level of nesting
pattern: /(^|[^\\])\/\+(?:\/\+[\s\S]*?\+\/|[\s\S])*?\+\//,
lookbehind: true
}
].concat(Prism.languages.d.comment);
Prism.languages.insertBefore('d', 'comment', {
'token-string': {
// Allow one level of nesting
pattern: /\bq\{(?:\{[^}]*\}|[^}])*\}/,
alias: 'string'
}
});
Prism.languages.insertBefore('d', 'keyword', {
'property': /\B@\w*/
});
Prism.languages.insertBefore('d', 'function', {
'register': {
// Iasm registers
pattern: /\b(?:[ABCD][LHX]|E[ABCD]X|E?(?:BP|SP|DI|SI)|[ECSDGF]S|CR[0234]|DR[012367]|TR[3-7]|X?MM[0-7]|R[ABCD]X|[BS]PL|R[BS]P|[DS]IL|R[DS]I|R(?:[89]|1[0-5])[BWD]?|XMM(?:[89]|1[0-5])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,
alias: 'variable'
}
});

View File

@@ -0,0 +1 @@
Prism.languages.d=Prism.languages.extend("clike",{string:[/\b[rx]"(?:\\[\s\S]|[^\\"])*"[cwd]?/,/\bq"(?:\[[\s\S]*?\]|\([\s\S]*?\)|<[\s\S]*?>|\{[\s\S]*?\})"/,/\bq"([_a-zA-Z][_a-zA-Z\d]*)(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\1"/,/\bq"(.)[\s\S]*?\1"/,/'(?:\\'|\\?[^']+)'/,/(["`])(?:\\[\s\S]|(?!\1)[^\\])*\1[cwd]?/],number:[/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]*/i,{pattern:/((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]*/i,lookbehind:!0}],keyword:/\$|\b(?: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)\b/,operator:/\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/}),Prism.languages.d.comment=[/^\s*#!.+/,{pattern:/(^|[^\\])\/\+(?:\/\+[\s\S]*?\+\/|[\s\S])*?\+\//,lookbehind:!0}].concat(Prism.languages.d.comment),Prism.languages.insertBefore("d","comment",{"token-string":{pattern:/\bq\{(?:\{[^}]*\}|[^}])*\}/,alias:"string"}}),Prism.languages.insertBefore("d","keyword",{property:/\B@\w*/}),Prism.languages.insertBefore("d","function",{register:{pattern:/\b(?:[ABCD][LHX]|E[ABCD]X|E?(?:BP|SP|DI|SI)|[ECSDGF]S|CR[0234]|DR[012367]|TR[3-7]|X?MM[0-7]|R[ABCD]X|[BS]PL|R[BS]P|[DS]IL|R[DS]I|R(?:[89]|1[0-5])[BWD]?|XMM(?:[89]|1[0-5])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,alias:"variable"}});

View File

@@ -0,0 +1,24 @@
Prism.languages.dart = Prism.languages.extend('clike', {
'string': [
{
pattern: /r?("""|''')[\s\S]*?\1/,
greedy: true
},
{
pattern: /r?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
}
],
'keyword': [
/\b(?:async|sync|yield)\*/,
/\b(?: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)\b/
],
'operator': /\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/
});
Prism.languages.insertBefore('dart','function',{
'metadata': {
pattern: /@\w+/,
alias: 'symbol'
}
});

View File

@@ -0,0 +1 @@
Prism.languages.dart=Prism.languages.extend("clike",{string:[{pattern:/r?("""|''')[\s\S]*?\1/,greedy:!0},{pattern:/r?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],keyword:[/\b(?:async|sync|yield)\*/,/\b(?: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)\b/],operator:/\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/}),Prism.languages.insertBefore("dart","function",{metadata:{pattern:/@\w+/,alias:"symbol"}});

View File

@@ -0,0 +1,20 @@
Prism.languages.diff = {
'coord': [
// Match all kinds of coord lines (prefixed by "+++", "---" or "***").
/^(?:\*{3}|-{3}|\+{3}).*$/m,
// Match "@@ ... @@" coord lines in unified diff.
/^@@.*@@$/m,
// Match coord lines in normal diff (starts with a number).
/^\d+.*$/m
],
// Match inserted and deleted lines. Support both +/- and >/< styles.
'deleted': /^[-<].*$/m,
'inserted': /^[+>].*$/m,
// Match "different" lines (prefixed with "!") in context diff.
'diff': {
'pattern': /^!(?!!).+$/m,
'alias': 'important'
}
};

View File

@@ -0,0 +1 @@
Prism.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d+.*$/m],deleted:/^[-<].*$/m,inserted:/^[+>].*$/m,diff:{pattern:/^!(?!!).+$/m,alias:"important"}};

View File

@@ -0,0 +1,41 @@
// Django/Jinja2 syntax definition for Prism.js <http://prismjs.com> syntax highlighter.
// Mostly it works OK but can paint code incorrectly on complex html/template tag combinations.
var _django_template = {
'property': {
pattern: /(?:{{|{%)[\s\S]*?(?:%}|}})/g,
greedy: true,
inside: {
'string': {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
'keyword': /\b(?:\||load|verbatim|widthratio|ssi|firstof|for|url|ifchanged|csrf_token|lorem|ifnotequal|autoescape|now|templatetag|debug|cycle|ifequal|regroup|comment|filter|endfilter|if|spaceless|with|extends|block|include|else|empty|endif|endfor|as|endblock|endautoescape|endverbatim|trans|endtrans|[Tt]rue|[Ff]alse|[Nn]one|in|is|static|macro|endmacro|call|endcall|set|endset|raw|endraw)\b/,
'operator' : /[-+=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,
'function': /\b(?:_|abs|add|addslashes|attr|batch|callable|capfirst|capitalize|center|count|cut|d|date|default|default_if_none|defined|dictsort|dictsortreversed|divisibleby|e|equalto|escape|escaped|escapejs|even|filesizeformat|first|float|floatformat|force_escape|forceescape|format|get_digit|groupby|indent|int|iriencode|iterable|join|last|length|length_is|linebreaks|linebreaksbr|linenumbers|list|ljust|lower|make_list|map|mapping|number|odd|phone2numeric|pluralize|pprint|random|reject|rejectattr|removetags|replace|reverse|rjust|round|safe|safeseq|sameas|select|selectattr|sequence|slice|slugify|sort|string|stringformat|striptags|sum|time|timesince|timeuntil|title|trim|truncate|truncatechars|truncatechars_html|truncatewords|truncatewords_html|undefined|unordered_list|upper|urlencode|urlize|urlizetrunc|wordcount|wordwrap|xmlattr|yesno)\b/,
'important': /\b-?\d+(?:\.\d+)?\b/,
'variable': /\b\w+?\b/,
'punctuation' : /[[\];(),.:]/
}
}
};
Prism.languages.django = Prism.languages.extend('markup', {'comment': /(?:<!--|{#)[\s\S]*?(?:#}|-->)/});
// Updated html tag pattern to allow template tags inside html tags
Prism.languages.django.tag.pattern = /<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^>=]+))?)*\s*\/?>/i;
Prism.languages.insertBefore('django', 'entity', _django_template);
Prism.languages.insertBefore('inside', 'tag', _django_template, Prism.languages.django.tag);
if (Prism.languages.javascript) {
// Combine js code and template tags painting inside <script> blocks
Prism.languages.insertBefore('inside', 'string', _django_template, Prism.languages.django.script);
Prism.languages.django.script.inside.string.inside = _django_template;
}
if (Prism.languages.css) {
// Combine css code and template tags painting inside <style> blocks
Prism.languages.insertBefore('inside', 'atrule', {'tag': _django_template.property}, Prism.languages.django.style);
Prism.languages.django.style.inside.string.inside = _django_template;
}
// Add an Jinja2 alias
Prism.languages.jinja2 = Prism.languages.django;

View File

@@ -0,0 +1 @@
var _django_template={property:{pattern:/(?:{{|{%)[\s\S]*?(?:%}|}})/g,greedy:!0,inside:{string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/\b(?:\||load|verbatim|widthratio|ssi|firstof|for|url|ifchanged|csrf_token|lorem|ifnotequal|autoescape|now|templatetag|debug|cycle|ifequal|regroup|comment|filter|endfilter|if|spaceless|with|extends|block|include|else|empty|endif|endfor|as|endblock|endautoescape|endverbatim|trans|endtrans|[Tt]rue|[Ff]alse|[Nn]one|in|is|static|macro|endmacro|call|endcall|set|endset|raw|endraw)\b/,operator:/[-+=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,"function":/\b(?:_|abs|add|addslashes|attr|batch|callable|capfirst|capitalize|center|count|cut|d|date|default|default_if_none|defined|dictsort|dictsortreversed|divisibleby|e|equalto|escape|escaped|escapejs|even|filesizeformat|first|float|floatformat|force_escape|forceescape|format|get_digit|groupby|indent|int|iriencode|iterable|join|last|length|length_is|linebreaks|linebreaksbr|linenumbers|list|ljust|lower|make_list|map|mapping|number|odd|phone2numeric|pluralize|pprint|random|reject|rejectattr|removetags|replace|reverse|rjust|round|safe|safeseq|sameas|select|selectattr|sequence|slice|slugify|sort|string|stringformat|striptags|sum|time|timesince|timeuntil|title|trim|truncate|truncatechars|truncatechars_html|truncatewords|truncatewords_html|undefined|unordered_list|upper|urlencode|urlize|urlizetrunc|wordcount|wordwrap|xmlattr|yesno)\b/,important:/\b-?\d+(?:\.\d+)?\b/,variable:/\b\w+?\b/,punctuation:/[[\];(),.:]/}}};Prism.languages.django=Prism.languages.extend("markup",{comment:/(?:<!--|{#)[\s\S]*?(?:#}|-->)/}),Prism.languages.django.tag.pattern=/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^>=]+))?)*\s*\/?>/i,Prism.languages.insertBefore("django","entity",_django_template),Prism.languages.insertBefore("inside","tag",_django_template,Prism.languages.django.tag),Prism.languages.javascript&&(Prism.languages.insertBefore("inside","string",_django_template,Prism.languages.django.script),Prism.languages.django.script.inside.string.inside=_django_template),Prism.languages.css&&(Prism.languages.insertBefore("inside","atrule",{tag:_django_template.property},Prism.languages.django.style),Prism.languages.django.style.inside.string.inside=_django_template),Prism.languages.jinja2=Prism.languages.django;

View File

@@ -0,0 +1,11 @@
Prism.languages.docker = {
'keyword': {
pattern: /(^\s*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)/mi,
lookbehind: true
},
'string': /("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,
'comment': /#.*/,
'punctuation': /---|\.\.\.|[:[\]{}\-,|>?]/
};
Prism.languages.dockerfile = Prism.languages.docker;

Some files were not shown because too many files have changed in this diff Show More