diff --git a/.eslintrc b/.eslintrc.json
similarity index 92%
rename from .eslintrc
rename to .eslintrc.json
index 91288aa9..590d3ad4 100644
--- a/.eslintrc
+++ b/.eslintrc.json
@@ -1,4 +1,4 @@
-{
- "extends": "hexo",
- "root": true
+{
+ "extends": "hexo",
+ "root": true
}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index fc156669..1406785e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,5 +3,5 @@ node_modules/
tmp/
*.log
.idea/
-coverage/
+.nyc_output/
highlight_alias.json
diff --git a/.jscsrc b/.jscsrc
deleted file mode 100644
index 6cdb7d06..00000000
--- a/.jscsrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "excludeFiles": ["node_modules/**", "coverage/**", "tmp/**"],
- "preset": "hexo"
-}
\ No newline at end of file
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index 23f6a506..00000000
--- a/.npmignore
+++ /dev/null
@@ -1,9 +0,0 @@
-test/
-tmp/
-coverage/
-*.log
-.jshintrc
-.travis.yml
-gulpfile.js
-.idea/
-appveyor.yml
diff --git a/.travis.yml b/.travis.yml
index 8d5d1da4..42cf8d2c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,24 +1,21 @@
-language: node_js
-
-sudo: false
-
-cache:
- apt: true
- directories:
- - node_modules
-
-node_js:
- - "6"
- - "node"
-
-script:
- # For older versions of npm (ie. the one bundled with Node 6), we need to manually run `prepare`
- # to build the project. You can still install and consume the package without any issue.
- - if [[ "$TRAVIS_NODE_VERSION" == "6" ]]; then npm run prepare; fi
- - npm run eslint
- - npm run jscs
- - npm run test-cov
-
-after_script:
- - npm install coveralls
- - cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
+language: node_js
+
+sudo: false
+
+cache:
+ apt: true
+ directories:
+ - node_modules
+
+node_js:
+ - "8"
+ - "10"
+ - "node"
+
+script:
+ - npm run eslint
+ - npm run test-cov
+
+after_script:
+ - npm install coveralls
+ - nyc report --reporter=text-lcov | coveralls
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 9389aa1d..00000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Next
-
-- **[Fix]** Remove postinstall step, fixes installations issues for some systems. [#24](https://github.com/hexojs/hexo-util/issues/24)
diff --git a/README.md b/README.md
index 947334f9..112d5ef2 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,10 @@
# hexo-util
-[](https://travis-ci.org/hexojs/hexo-util) [](http://badge.fury.io/js/hexo-util) [](https://coveralls.io/github/hexojs/hexo-util?branch=master)
+[](https://travis-ci.org/hexojs/hexo-util)
+[](https://www.npmjs.com/package/hexo-util)
+[](https://coveralls.io/github/hexojs/hexo-util?branch=master)
+[](https://david-dm.org/hexojs/hexo-util)
+[](https://david-dm.org/hexojs/hexo-util?type=dev)
Utilities for [Hexo].
@@ -67,6 +71,7 @@ hash('123456');
```
### HashStream()
+**\[deprecated\]** use `createSha1Hash()`.
Generates SHA1 hash with a transform stream.
@@ -80,6 +85,18 @@ fs.createReadStream('/path/to/file')
});
```
+### createSha1Hash()
+return SHA1 hash object.
+ This is the same as calling `createHash('utf8')` in the node.js native module crypto.
+ ``` js
+const sha1 = createSha1Hash();
+ fs.createReadStream('/path/to/file')
+ .pipe(sha1)
+ .on('finish', () => {
+ console.log(sha1.read());
+ });
+```
+
### highlight(str, [options])
Syntax highlighting for a code block.
diff --git a/lib/cache_stream.js b/lib/cache_stream.js
index d60368bb..91e65124 100644
--- a/lib/cache_stream.js
+++ b/lib/cache_stream.js
@@ -1,6 +1,6 @@
'use strict';
-var Transform = require('stream').Transform;
+const { Transform } = require('stream');
function CacheStream() {
Transform.call(this);
@@ -11,7 +11,7 @@ function CacheStream() {
require('util').inherits(CacheStream, Transform);
CacheStream.prototype._transform = function(chunk, enc, callback) {
- var buf = chunk instanceof Buffer ? chunk : new Buffer(chunk, enc);
+ const buf = chunk instanceof Buffer ? chunk : Buffer.from(chunk, enc);
this._cache.push(buf);
this.push(buf);
diff --git a/lib/camel_case_keys.js b/lib/camel_case_keys.js
index 40b0badf..55e04f3e 100644
--- a/lib/camel_case_keys.js
+++ b/lib/camel_case_keys.js
@@ -1,8 +1,6 @@
'use strict';
-var camelCase = require('camel-case');
-
-var rPrefixUnderscore = /^(_+)/;
+const camelCase = require('camel-case');
function getter(key) {
return function() {
@@ -16,31 +14,37 @@ function setter(key) {
};
}
+function toCamelCase(str) {
+ let prefixLength = -1;
+
+ while (str[++prefixLength] === '_');
+
+ if (!prefixLength) {
+ return camelCase(str);
+ }
+ return str.substring(0, prefixLength) + camelCase(str.substring(prefixLength));
+}
+
function camelCaseKeys(obj) {
if (typeof obj !== 'object') throw new TypeError('obj must be an object!');
- var keys = Object.keys(obj);
- var result = {};
+ const keys = Object.keys(obj);
+ const { length } = keys;
+ const result = {};
- for (var i = 0, len = keys.length; i < len; i++) {
- var key = keys[i];
- var value = obj[key];
- var match = key.match(rPrefixUnderscore);
- var newKey;
+ for (let i = 0; i < length; i++) {
+ const oldKey = keys[i];
+ const newKey = toCamelCase(oldKey);
- if (match) {
- var underscore = match[1];
- newKey = underscore + camelCase(key.substring(underscore.length));
- } else {
- newKey = camelCase(key);
- }
+ result[newKey] = obj[oldKey];
- if (newKey === key) {
- result[key] = value;
- } else {
- result[newKey] = value;
- result.__defineGetter__(key, getter(newKey));
- result.__defineSetter__(key, setter(newKey));
+ if (newKey !== oldKey) {
+ Object.defineProperty(result, oldKey, {
+ get: getter(newKey),
+ set: setter(newKey),
+ configurable: true,
+ enumerable: true
+ });
}
}
diff --git a/lib/color.js b/lib/color.js
new file mode 100644
index 00000000..0cae20d0
--- /dev/null
+++ b/lib/color.js
@@ -0,0 +1,336 @@
+'use strict';
+
+// https://github.com/imathis/hsl-picker/blob/master/assets/javascripts/modules/color.coffee
+const rHex3 = /^#[0-9a-f]{3}$/;
+const rHex6 = /^#[0-9a-f]{6}$/;
+const rRGB = /^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,?\s*(0?\.?\d+)?\s*\)$/;
+const rHSL = /^hsla?\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*,?\s*(0?\.?\d+)?\s*\)$/;
+
+// https://www.w3.org/TR/css3-color/#svg-color
+const colorNames = {
+ aliceblue: {r: 240, g: 248, b: 255, a: 1},
+ antiquewhite: {r: 250, g: 235, b: 215, a: 1},
+ aqua: {r: 0, g: 255, b: 255, a: 1},
+ aquamarine: {r: 127, g: 255, b: 212, a: 1},
+ azure: {r: 240, g: 255, b: 255, a: 1},
+ beige: {r: 245, g: 245, b: 220, a: 1},
+ bisque: {r: 255, g: 228, b: 196, a: 1},
+ black: {r: 0, g: 0, b: 0, a: 1},
+ blanchedalmond: {r: 255, g: 235, b: 205, a: 1},
+ blue: {r: 0, g: 0, b: 255, a: 1},
+ blueviolet: {r: 138, g: 43, b: 226, a: 1},
+ brown: {r: 165, g: 42, b: 42, a: 1},
+ burlywood: {r: 222, g: 184, b: 135, a: 1},
+ cadetblue: {r: 95, g: 158, b: 160, a: 1},
+ chartreuse: {r: 127, g: 255, b: 0, a: 1},
+ chocolate: {r: 210, g: 105, b: 30, a: 1},
+ coral: {r: 255, g: 127, b: 80, a: 1},
+ cornflowerblue: {r: 100, g: 149, b: 237, a: 1},
+ cornsilk: {r: 255, g: 248, b: 220, a: 1},
+ crimson: {r: 220, g: 20, b: 60, a: 1},
+ cyan: {r: 0, g: 255, b: 255, a: 1},
+ darkblue: {r: 0, g: 0, b: 139, a: 1},
+ darkcyan: {r: 0, g: 139, b: 139, a: 1},
+ darkgoldenrod: {r: 184, g: 134, b: 11, a: 1},
+ darkgray: {r: 169, g: 169, b: 169, a: 1},
+ darkgreen: {r: 0, g: 100, b: 0, a: 1},
+ darkgrey: {r: 169, g: 169, b: 169, a: 1},
+ darkkhaki: {r: 189, g: 183, b: 107, a: 1},
+ darkmagenta: {r: 139, g: 0, b: 139, a: 1},
+ darkolivegreen: {r: 85, g: 107, b: 47, a: 1},
+ darkorange: {r: 255, g: 140, b: 0, a: 1},
+ darkorchid: {r: 153, g: 50, b: 204, a: 1},
+ darkred: {r: 139, g: 0, b: 0, a: 1},
+ darksalmon: {r: 233, g: 150, b: 122, a: 1},
+ darkseagreen: {r: 143, g: 188, b: 143, a: 1},
+ darkslateblue: {r: 72, g: 61, b: 139, a: 1},
+ darkslategray: {r: 47, g: 79, b: 79, a: 1},
+ darkslategrey: {r: 47, g: 79, b: 79, a: 1},
+ darkturquoise: {r: 0, g: 206, b: 209, a: 1},
+ darkviolet: {r: 148, g: 0, b: 211, a: 1},
+ deeppink: {r: 255, g: 20, b: 147, a: 1},
+ deepskyblue: {r: 0, g: 191, b: 255, a: 1},
+ dimgray: {r: 105, g: 105, b: 105, a: 1},
+ dimgrey: {r: 105, g: 105, b: 105, a: 1},
+ dodgerblue: {r: 30, g: 144, b: 255, a: 1},
+ firebrick: {r: 178, g: 34, b: 34, a: 1},
+ floralwhite: {r: 255, g: 250, b: 240, a: 1},
+ forestgreen: {r: 34, g: 139, b: 34, a: 1},
+ fuchsia: {r: 255, g: 0, b: 255, a: 1},
+ gainsboro: {r: 220, g: 220, b: 220, a: 1},
+ ghostwhite: {r: 248, g: 248, b: 255, a: 1},
+ gold: {r: 255, g: 215, b: 0, a: 1},
+ goldenrod: {r: 218, g: 165, b: 32, a: 1},
+ gray: {r: 128, g: 128, b: 128, a: 1},
+ green: {r: 0, g: 128, b: 0, a: 1},
+ greenyellow: {r: 173, g: 255, b: 47, a: 1},
+ grey: {r: 128, g: 128, b: 128, a: 1},
+ honeydew: {r: 240, g: 255, b: 240, a: 1},
+ hotpink: {r: 255, g: 105, b: 180, a: 1},
+ indianred: {r: 205, g: 92, b: 92, a: 1},
+ indigo: {r: 75, g: 0, b: 130, a: 1},
+ ivory: {r: 255, g: 255, b: 240, a: 1},
+ khaki: {r: 240, g: 230, b: 140, a: 1},
+ lavender: {r: 230, g: 230, b: 250, a: 1},
+ lavenderblush: {r: 255, g: 240, b: 245, a: 1},
+ lawngreen: {r: 124, g: 252, b: 0, a: 1},
+ lemonchiffon: {r: 255, g: 250, b: 205, a: 1},
+ lightblue: {r: 173, g: 216, b: 230, a: 1},
+ lightcoral: {r: 240, g: 128, b: 128, a: 1},
+ lightcyan: {r: 224, g: 255, b: 255, a: 1},
+ lightgoldenrodyellow: {r: 250, g: 250, b: 210, a: 1},
+ lightgray: {r: 211, g: 211, b: 211, a: 1},
+ lightgreen: {r: 144, g: 238, b: 144, a: 1},
+ lightgrey: {r: 211, g: 211, b: 211, a: 1},
+ lightpink: {r: 255, g: 182, b: 193, a: 1},
+ lightsalmon: {r: 255, g: 160, b: 122, a: 1},
+ lightseagreen: {r: 32, g: 178, b: 170, a: 1},
+ lightskyblue: {r: 135, g: 206, b: 250, a: 1},
+ lightslategray: {r: 119, g: 136, b: 153, a: 1},
+ lightslategrey: {r: 119, g: 136, b: 153, a: 1},
+ lightsteelblue: {r: 176, g: 196, b: 222, a: 1},
+ lightyellow: {r: 255, g: 255, b: 224, a: 1},
+ lime: {r: 0, g: 255, b: 0, a: 1},
+ limegreen: {r: 50, g: 205, b: 50, a: 1},
+ linen: {r: 250, g: 240, b: 230, a: 1},
+ magenta: {r: 255, g: 0, b: 255, a: 1},
+ maroon: {r: 128, g: 0, b: 0, a: 1},
+ mediumaquamarine: {r: 102, g: 205, b: 170, a: 1},
+ mediumblue: {r: 0, g: 0, b: 205, a: 1},
+ mediumorchid: {r: 186, g: 85, b: 211, a: 1},
+ mediumpurple: {r: 147, g: 112, b: 219, a: 1},
+ mediumseagreen: {r: 60, g: 179, b: 113, a: 1},
+ mediumslateblue: {r: 123, g: 104, b: 238, a: 1},
+ mediumspringgreen: {r: 0, g: 250, b: 154, a: 1},
+ mediumturquoise: {r: 72, g: 209, b: 204, a: 1},
+ mediumvioletred: {r: 199, g: 21, b: 133, a: 1},
+ midnightblue: {r: 25, g: 25, b: 112, a: 1},
+ mintcream: {r: 245, g: 255, b: 250, a: 1},
+ mistyrose: {r: 255, g: 228, b: 225, a: 1},
+ moccasin: {r: 255, g: 228, b: 181, a: 1},
+ navajowhite: {r: 255, g: 222, b: 173, a: 1},
+ navy: {r: 0, g: 0, b: 128, a: 1},
+ oldlace: {r: 253, g: 245, b: 230, a: 1},
+ olive: {r: 128, g: 128, b: 0, a: 1},
+ olivedrab: {r: 107, g: 142, b: 35, a: 1},
+ orange: {r: 255, g: 165, b: 0, a: 1},
+ orangered: {r: 255, g: 69, b: 0, a: 1},
+ orchid: {r: 218, g: 112, b: 214, a: 1},
+ palegoldenrod: {r: 238, g: 232, b: 170, a: 1},
+ palegreen: {r: 152, g: 251, b: 152, a: 1},
+ paleturquoise: {r: 175, g: 238, b: 238, a: 1},
+ palevioletred: {r: 219, g: 112, b: 147, a: 1},
+ papayawhip: {r: 255, g: 239, b: 213, a: 1},
+ peachpuff: {r: 255, g: 218, b: 185, a: 1},
+ peru: {r: 205, g: 133, b: 63, a: 1},
+ pink: {r: 255, g: 192, b: 203, a: 1},
+ plum: {r: 221, g: 160, b: 221, a: 1},
+ powderblue: {r: 176, g: 224, b: 230, a: 1},
+ purple: {r: 128, g: 0, b: 128, a: 1},
+ red: {r: 255, g: 0, b: 0, a: 1},
+ rosybrown: {r: 188, g: 143, b: 143, a: 1},
+ royalblue: {r: 65, g: 105, b: 225, a: 1},
+ saddlebrown: {r: 139, g: 69, b: 19, a: 1},
+ salmon: {r: 250, g: 128, b: 114, a: 1},
+ sandybrown: {r: 244, g: 164, b: 96, a: 1},
+ seagreen: {r: 46, g: 139, b: 87, a: 1},
+ seashell: {r: 255, g: 245, b: 238, a: 1},
+ sienna: {r: 160, g: 82, b: 45, a: 1},
+ silver: {r: 192, g: 192, b: 192, a: 1},
+ skyblue: {r: 135, g: 206, b: 235, a: 1},
+ slateblue: {r: 106, g: 90, b: 205, a: 1},
+ slategray: {r: 112, g: 128, b: 144, a: 1},
+ slategrey: {r: 112, g: 128, b: 144, a: 1},
+ snow: {r: 255, g: 250, b: 250, a: 1},
+ springgreen: {r: 0, g: 255, b: 127, a: 1},
+ steelblue: {r: 70, g: 130, b: 180, a: 1},
+ tan: {r: 210, g: 180, b: 140, a: 1},
+ teal: {r: 0, g: 128, b: 128, a: 1},
+ thistle: {r: 216, g: 191, b: 216, a: 1},
+ tomato: {r: 255, g: 99, b: 71, a: 1},
+ turquoise: {r: 64, g: 224, b: 208, a: 1},
+ violet: {r: 238, g: 130, b: 238, a: 1},
+ wheat: {r: 245, g: 222, b: 179, a: 1},
+ white: {r: 255, g: 255, b: 255, a: 1},
+ whitesmoke: {r: 245, g: 245, b: 245, a: 1},
+ yellow: {r: 255, g: 255, b: 0, a: 1},
+ yellowgreen: {r: 154, g: 205, b: 50, a: 1}
+};
+
+const convertHue = (p, q, h) => {
+ if (h < 0) h++;
+ if (h > 1) h--;
+
+ let color;
+
+ if (h * 6 < 1) {
+ color = p + ((q - p) * h * 6);
+ } else if (h * 2 < 1) {
+ color = q;
+ } else if (h * 3 < 2) {
+ color = p + ((q - p) * ((2 / 3) - h) * 6);
+ } else {
+ color = p;
+ }
+
+ return Math.round(color * 255);
+};
+
+const convertRGB = value => {
+ const str = value.toString(16);
+ if (value < 16) return `0${str}`;
+
+ return str;
+};
+
+const mixValue = (a, b, ratio) => a + ((b - a) * ratio);
+
+class Color {
+
+ /**
+ * @param {string|{ r: number; g: number; b: number; a: number;}} color
+ */
+ constructor(color) {
+ if (typeof color === 'string') {
+ this._parse(color);
+ } else if (color != null && typeof color === 'object') {
+ this.r = color.r | 0;
+ this.g = color.g | 0;
+ this.b = color.b | 0;
+ this.a = +color.a;
+ } else {
+ throw new TypeError('color is required!');
+ }
+
+ if (this.r < 0 || this.r > 255
+ || this.g < 0 || this.g > 255
+ || this.b < 0 || this.b > 255
+ || this.a < 0 || this.a > 1) {
+ throw new RangeError(`{r: ${this.r}, g: ${this.g}, b: ${this.b}, a: ${this.a}} is invalid.`);
+ }
+ }
+
+ /**
+ * @param {string} color
+ */
+ _parse(color) {
+ color = color.toLowerCase();
+
+ if (Object.prototype.hasOwnProperty.call(colorNames, color)) {
+ const obj = colorNames[color];
+
+ this.r = obj.r;
+ this.g = obj.g;
+ this.b = obj.b;
+ this.a = obj.a;
+
+ return;
+ }
+
+ if (rHex3.test(color)) {
+ const txt = color.substring(1);
+ const code = parseInt(txt, 16);
+
+ this.r = ((code & 0xF00) >> 8) * 17;
+ this.g = ((code & 0xF0) >> 4) * 17;
+ this.b = (code & 0xF) * 17;
+ this.a = 1;
+
+ return;
+ }
+
+ if (rHex6.test(color)) {
+ const txt = color.substring(1);
+ const code = parseInt(txt, 16);
+
+ this.r = (code & 0xFF0000) >> 16;
+ this.g = (code & 0xFF00) >> 8;
+ this.b = code & 0xFF;
+ this.a = 1;
+
+ return;
+ }
+
+ let match = color.match(rRGB);
+
+ if (match) {
+ this.r = match[1] | 0;
+ this.g = match[2] | 0;
+ this.b = match[3] | 0;
+ this.a = match[4] ? +match[4] : 1;
+
+ return;
+ }
+
+ match = color.match(rHSL);
+
+ if (match) {
+ const h = +match[1] / 360;
+ const s = +match[2] / 100;
+ const l = +match[3] / 100;
+
+ this.a = match[4] ? +match[4] : 1;
+
+ if (!s) {
+ this.r = this.g = this.b = l * 255;
+ }
+
+ const q = l < 0.5 ? l * (1 + s) : l + s - (l * s);
+ const p = (2 * l) - q;
+
+ const rt = h + (1 / 3);
+ const gt = h;
+ const bt = h - (1 / 3);
+
+ this.r = convertHue(p, q, rt);
+ this.g = convertHue(p, q, gt);
+ this.b = convertHue(p, q, bt);
+
+ return;
+ }
+
+ throw new Error(`${color} is not a supported color format.`);
+ }
+
+ toString() {
+ if (this.a === 1) {
+ const r = convertRGB(this.r);
+ const g = convertRGB(this.g);
+ const b = convertRGB(this.b);
+
+ if (this.r % 17 || this.g % 17 || this.b % 17) {
+ return `#${r}${g}${b}`;
+ }
+
+ return `#${r[0]}${g[0]}${b[0]}`;
+ }
+
+ return `rgba(${this.r}, ${this.g}, ${this.b}, ${parseFloat(this.a.toFixed(2))})`;
+ }
+
+ /**
+ * @param {string|{ r: number; g: number; b: number; a: number;}} color
+ * @param {number} ratio
+ */
+ mix(color, ratio) {
+ if (ratio > 1 || ratio < 0) {
+ throw new RangeError('Valid numbers is only between 0 and 1.');
+ }
+ switch (ratio) {
+ case 0:
+ return new Color(this);
+
+ case 1:
+ return new Color(color);
+ }
+
+ return new Color({
+ r: Math.round(mixValue(this.r, color.r, ratio)),
+ g: Math.round(mixValue(this.g, color.g, ratio)),
+ b: Math.round(mixValue(this.b, color.b, ratio)),
+ a: mixValue(this.a, color.a, ratio)
+ });
+ }
+}
+
+module.exports = Color;
diff --git a/lib/escape_diacritic.js b/lib/escape_diacritic.js
index 1800dd8a..5e94465d 100644
--- a/lib/escape_diacritic.js
+++ b/lib/escape_diacritic.js
@@ -1,100 +1,100 @@
'use strict';
-var defaultDiacriticsRemovalap = [
- {'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'},
- {'base':'AA','letters':'\uA732'},
- {'base':'AE','letters':'\u00C6\u01FC\u01E2'},
- {'base':'AO','letters':'\uA734'},
- {'base':'AU','letters':'\uA736'},
- {'base':'AV','letters':'\uA738\uA73A'},
- {'base':'AY','letters':'\uA73C'},
- {'base':'B', 'letters':'\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181'},
- {'base':'C', 'letters':'\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E'},
- {'base':'D', 'letters':'\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779'},
- {'base':'DZ','letters':'\u01F1\u01C4'},
- {'base':'Dz','letters':'\u01F2\u01C5'},
- {'base':'E', 'letters':'\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'},
- {'base':'F', 'letters':'\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'},
- {'base':'G', 'letters':'\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'},
- {'base':'H', 'letters':'\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D'},
- {'base':'I', 'letters':'\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'},
- {'base':'J', 'letters':'\u004A\u24BF\uFF2A\u0134\u0248'},
- {'base':'K', 'letters':'\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2'},
- {'base':'L', 'letters':'\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'},
- {'base':'LJ','letters':'\u01C7'},
- {'base':'Lj','letters':'\u01C8'},
- {'base':'M', 'letters':'\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'},
- {'base':'N', 'letters':'\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'},
- {'base':'NJ','letters':'\u01CA'},
- {'base':'Nj','letters':'\u01CB'},
- {'base':'O', 'letters':'\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'},
- {'base':'OI','letters':'\u01A2'},
- {'base':'OO','letters':'\uA74E'},
- {'base':'OU','letters':'\u0222'},
- {'base':'OE','letters':'\u008C\u0152'},
- {'base':'oe','letters':'\u009C\u0153'},
- {'base':'P', 'letters':'\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754'},
- {'base':'Q', 'letters':'\u0051\u24C6\uFF31\uA756\uA758\u024A'},
- {'base':'R', 'letters':'\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'},
- {'base':'S', 'letters':'\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'},
- {'base':'T', 'letters':'\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'},
- {'base':'TZ','letters':'\uA728'},
- {'base':'U', 'letters':'\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'},
- {'base':'V', 'letters':'\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'},
- {'base':'VY','letters':'\uA760'},
- {'base':'W', 'letters':'\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72'},
- {'base':'X', 'letters':'\u0058\u24CD\uFF38\u1E8A\u1E8C'},
- {'base':'Y', 'letters':'\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'},
- {'base':'Z', 'letters':'\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762'},
- {'base':'a', 'letters':'\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'},
- {'base':'aa','letters':'\uA733'},
- {'base':'ae','letters':'\u00E6\u01FD\u01E3'},
- {'base':'ao','letters':'\uA735'},
- {'base':'au','letters':'\uA737'},
- {'base':'av','letters':'\uA739\uA73B'},
- {'base':'ay','letters':'\uA73D'},
- {'base':'b', 'letters':'\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253'},
- {'base':'c', 'letters':'\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184'},
- {'base':'d', 'letters':'\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A'},
- {'base':'dz','letters':'\u01F3\u01C6'},
- {'base':'e', 'letters':'\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'},
- {'base':'f', 'letters':'\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'},
- {'base':'g', 'letters':'\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'},
- {'base':'h', 'letters':'\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'},
- {'base':'hv','letters':'\u0195'},
- {'base':'i', 'letters':'\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'},
- {'base':'j', 'letters':'\u006A\u24D9\uFF4A\u0135\u01F0\u0249'},
- {'base':'k', 'letters':'\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3'},
- {'base':'l', 'letters':'\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'},
- {'base':'lj','letters':'\u01C9'},
- {'base':'m', 'letters':'\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'},
- {'base':'n', 'letters':'\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'},
- {'base':'nj','letters':'\u01CC'},
- {'base':'o', 'letters':'\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'},
- {'base':'oi','letters':'\u01A3'},
- {'base':'ou','letters':'\u0223'},
- {'base':'oo','letters':'\uA74F'},
- {'base':'p', 'letters':'\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755'},
- {'base':'q', 'letters':'\u0071\u24E0\uFF51\u024B\uA757\uA759'},
- {'base':'r', 'letters':'\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'},
- {'base':'s', 'letters':'\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'},
- {'base':'t', 'letters':'\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'},
- {'base':'tz','letters':'\uA729'},
- {'base':'u', 'letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'},
- {'base':'v', 'letters':'\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'},
- {'base':'vy','letters':'\uA761'},
- {'base':'w', 'letters':'\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73'},
- {'base':'x', 'letters':'\u0078\u24E7\uFF58\u1E8B\u1E8D'},
- {'base':'y', 'letters':'\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'},
- {'base':'z', 'letters':'\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763'}
+const defaultDiacriticsRemovalap = [
+ {'base': 'A', 'letters': '\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'},
+ {'base': 'AA', 'letters': '\uA732'},
+ {'base': 'AE', 'letters': '\u00C6\u01FC\u01E2'},
+ {'base': 'AO', 'letters': '\uA734'},
+ {'base': 'AU', 'letters': '\uA736'},
+ {'base': 'AV', 'letters': '\uA738\uA73A'},
+ {'base': 'AY', 'letters': '\uA73C'},
+ {'base': 'B', 'letters': '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181'},
+ {'base': 'C', 'letters': '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E'},
+ {'base': 'D', 'letters': '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779'},
+ {'base': 'DZ', 'letters': '\u01F1\u01C4'},
+ {'base': 'Dz', 'letters': '\u01F2\u01C5'},
+ {'base': 'E', 'letters': '\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'},
+ {'base': 'F', 'letters': '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'},
+ {'base': 'G', 'letters': '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'},
+ {'base': 'H', 'letters': '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D'},
+ {'base': 'I', 'letters': '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'},
+ {'base': 'J', 'letters': '\u004A\u24BF\uFF2A\u0134\u0248'},
+ {'base': 'K', 'letters': '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2'},
+ {'base': 'L', 'letters': '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'},
+ {'base': 'LJ', 'letters': '\u01C7'},
+ {'base': 'Lj', 'letters': '\u01C8'},
+ {'base': 'M', 'letters': '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'},
+ {'base': 'N', 'letters': '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'},
+ {'base': 'NJ', 'letters': '\u01CA'},
+ {'base': 'Nj', 'letters': '\u01CB'},
+ {'base': 'O', 'letters': '\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'},
+ {'base': 'OI', 'letters': '\u01A2'},
+ {'base': 'OO', 'letters': '\uA74E'},
+ {'base': 'OU', 'letters': '\u0222'},
+ {'base': 'OE', 'letters': '\u008C\u0152'},
+ {'base': 'oe', 'letters': '\u009C\u0153'},
+ {'base': 'P', 'letters': '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754'},
+ {'base': 'Q', 'letters': '\u0051\u24C6\uFF31\uA756\uA758\u024A'},
+ {'base': 'R', 'letters': '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'},
+ {'base': 'S', 'letters': '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'},
+ {'base': 'T', 'letters': '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'},
+ {'base': 'TZ', 'letters': '\uA728'},
+ {'base': 'U', 'letters': '\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'},
+ {'base': 'V', 'letters': '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'},
+ {'base': 'VY', 'letters': '\uA760'},
+ {'base': 'W', 'letters': '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72'},
+ {'base': 'X', 'letters': '\u0058\u24CD\uFF38\u1E8A\u1E8C'},
+ {'base': 'Y', 'letters': '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'},
+ {'base': 'Z', 'letters': '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762'},
+ {'base': 'a', 'letters': '\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'},
+ {'base': 'aa', 'letters': '\uA733'},
+ {'base': 'ae', 'letters': '\u00E6\u01FD\u01E3'},
+ {'base': 'ao', 'letters': '\uA735'},
+ {'base': 'au', 'letters': '\uA737'},
+ {'base': 'av', 'letters': '\uA739\uA73B'},
+ {'base': 'ay', 'letters': '\uA73D'},
+ {'base': 'b', 'letters': '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253'},
+ {'base': 'c', 'letters': '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184'},
+ {'base': 'd', 'letters': '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A'},
+ {'base': 'dz', 'letters': '\u01F3\u01C6'},
+ {'base': 'e', 'letters': '\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'},
+ {'base': 'f', 'letters': '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'},
+ {'base': 'g', 'letters': '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'},
+ {'base': 'h', 'letters': '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'},
+ {'base': 'hv', 'letters': '\u0195'},
+ {'base': 'i', 'letters': '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'},
+ {'base': 'j', 'letters': '\u006A\u24D9\uFF4A\u0135\u01F0\u0249'},
+ {'base': 'k', 'letters': '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3'},
+ {'base': 'l', 'letters': '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'},
+ {'base': 'lj', 'letters': '\u01C9'},
+ {'base': 'm', 'letters': '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'},
+ {'base': 'n', 'letters': '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'},
+ {'base': 'nj', 'letters': '\u01CC'},
+ {'base': 'o', 'letters': '\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'},
+ {'base': 'oi', 'letters': '\u01A3'},
+ {'base': 'ou', 'letters': '\u0223'},
+ {'base': 'oo', 'letters': '\uA74F'},
+ {'base': 'p', 'letters': '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755'},
+ {'base': 'q', 'letters': '\u0071\u24E0\uFF51\u024B\uA757\uA759'},
+ {'base': 'r', 'letters': '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'},
+ {'base': 's', 'letters': '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'},
+ {'base': 't', 'letters': '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'},
+ {'base': 'tz', 'letters': '\uA729'},
+ {'base': 'u', 'letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'},
+ {'base': 'v', 'letters': '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'},
+ {'base': 'vy', 'letters': '\uA761'},
+ {'base': 'w', 'letters': '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73'},
+ {'base': 'x', 'letters': '\u0078\u24E7\uFF58\u1E8B\u1E8D'},
+ {'base': 'y', 'letters': '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'},
+ {'base': 'z', 'letters': '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763'}
];
-var diacriticsMap = {};
+const diacriticsMap = {};
-for (var i = 0; i < defaultDiacriticsRemovalap.length; i++) {
- var letters = defaultDiacriticsRemovalap[i].letters.split('');
+for (let i = 0; i < defaultDiacriticsRemovalap.length; i++) {
+ const letters = defaultDiacriticsRemovalap[i].letters.split('');
- for (var j = 0; j < letters.length; j++) {
+ for (let j = 0; j < letters.length; j++) {
diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;
}
}
@@ -103,9 +103,8 @@ function escapeDiacritic(str) {
if (typeof str !== 'string') throw new TypeError('str must be a string!');
// http://stackoverflow.com/a/18391901
- return str.replace(/[^\u0000-\u007E]/g, function(a) {
- return diacriticsMap[a] || a;
- });
+ // eslint-disable-next-line no-control-regex
+ return str.replace(/[^\u0000-\u007E]/g, a => diacriticsMap[a] || a);
}
module.exports = escapeDiacritic;
diff --git a/lib/escape_html.js b/lib/escape_html.js
index c80d804c..8c51211b 100644
--- a/lib/escape_html.js
+++ b/lib/escape_html.js
@@ -1,6 +1,6 @@
'use strict';
-var htmlEntityMap = {
+const htmlEntityMap = {
'&': '&',
'<': '<',
'>': '>',
@@ -13,9 +13,7 @@ function escapeHTML(str) {
if (typeof str !== 'string') throw new TypeError('str must be a string!');
// http://stackoverflow.com/a/12034334
- return str.replace(/[&<>"'\/]/g, function(a) {
- return htmlEntityMap[a];
- });
+ return str.replace(/[&<>"'/]/g, a => htmlEntityMap[a]);
}
module.exports = escapeHTML;
diff --git a/lib/escape_regexp.js b/lib/escape_regexp.js
index 8aa505f6..f2f2f193 100644
--- a/lib/escape_regexp.js
+++ b/lib/escape_regexp.js
@@ -4,7 +4,7 @@ function escapeRegExp(str) {
if (typeof str !== 'string') throw new TypeError('str must be a string!');
// http://stackoverflow.com/a/6969486
- return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
+ return str.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&');
}
module.exports = escapeRegExp;
diff --git a/lib/hash.js b/lib/hash.js
index 72d2cea1..57a1547e 100644
--- a/lib/hash.js
+++ b/lib/hash.js
@@ -1,25 +1,27 @@
'use strict';
-var Stream = require('stream');
-var Transform = Stream.Transform;
-var crypto = require('crypto');
+const { Transform } = require('stream');
+const crypto = require('crypto');
-var ALGORITHM = 'sha1';
+const ALGORITHM = 'sha1';
-function HashStream() {
- Transform.call(this, {
- objectMode: true
- });
+function createSha1Hash() {
+ return crypto.createHash(ALGORITHM);
+}
- this._hash = crypto.createHash(ALGORITHM);
+/**
+ * @deprecated
+ * createHash() is stream class.
+ */
+function HashStream() {
+ Transform.call(this);
+ this._hash = createSha1Hash();
}
require('util').inherits(HashStream, Transform);
HashStream.prototype._transform = function(chunk, enc, callback) {
- var buffer = chunk instanceof Buffer ? chunk : new Buffer(chunk, enc);
-
- this._hash.update(buffer);
+ this._hash.update(chunk);
callback();
};
@@ -28,10 +30,11 @@ HashStream.prototype._flush = function(callback) {
callback();
};
-exports.hash = function(content) {
- var hash = crypto.createHash(ALGORITHM);
+exports.hash = content => {
+ const hash = createSha1Hash();
hash.update(content);
return hash.digest();
};
exports.HashStream = HashStream;
+exports.createSha1Hash = createSha1Hash;
diff --git a/lib/highlight.js b/lib/highlight.js
index 46c3647b..106f222d 100644
--- a/lib/highlight.js
+++ b/lib/highlight.js
@@ -1,72 +1,71 @@
'use strict';
-var hljs = require('highlight.js/lib/highlight');
-var Entities = require('html-entities').XmlEntities;
-var entities = new Entities();
-var alias = require('../highlight_alias.json');
+const hljs = require('highlight.js/lib/highlight');
+const Entities = require('html-entities').XmlEntities;
+const entities = new Entities();
+const alias = require('../highlight_alias.json'); //eslint-disable-line
-function highlightUtil(str, options) {
+function highlightUtil(str, options = {}) {
if (typeof str !== 'string') throw new TypeError('str must be a string!');
- options = options || {};
- var useHljs = options.hasOwnProperty('hljs') ? options.hljs : false;
- var gutter = options.hasOwnProperty('gutter') ? options.gutter : true;
- var wrap = options.hasOwnProperty('wrap') ? options.wrap : true;
- var firstLine = options.hasOwnProperty('firstLine') ? +options.firstLine : 1;
- var caption = options.caption;
- var mark = options.hasOwnProperty('mark') ? options.mark : [];
- var tab = options.tab;
+ const useHljs = Object.prototype.hasOwnProperty.call(options, 'hljs') ? options.hljs : false;
+ const {
+ gutter = true,
+ firstLine = 1,
+ caption,
+ mark = [],
+ tab
+ } = options;
+ let { wrap = true } = options;
hljs.configure({ classPrefix: useHljs ? 'hljs-' : ''});
- var data = highlight(str, options);
+ const data = highlight(str, options);
if (useHljs && !gutter) wrap = false;
- var before = useHljs ? '
' : '';
- var after = useHljs ? '
' : '';
+ const before = useHljs ? `` : '';
+ const after = useHljs ? '
' : '';
if (!wrap) return useHljs ? before + data.value + after : data.value;
- var lines = data.value.split('\n');
- var numbers = '';
- var content = '';
- var result = '';
- var line;
+ const lines = data.value.split('\n');
+ let numbers = '';
+ let content = '';
- for (var i = 0, len = lines.length; i < len; i++) {
- line = lines[i];
+ for (let i = 0, len = lines.length; i < len; i++) {
+ let line = lines[i];
if (tab) line = replaceTabs(line, tab);
- numbers += '' + (firstLine + i) + '
';
- content += formatLine(line, firstLine + i, mark, options);
+ numbers += `${Number(firstLine) + i}
`;
+ content += formatLine(line, Number(firstLine) + i, mark, options);
}
- result += '';
+ let result = ``;
if (caption) {
- result += '' + caption + '';
+ result += `${caption}`;
}
result += '';
if (gutter) {
- result += '' + numbers + ' | ';
+ result += `${numbers} | `;
}
- result += '' + before + content + after + ' | ';
+ result += `${before}${content}${after} | `;
result += '
';
return result;
}
function formatLine(line, lineno, marked, options) {
- var useHljs = options.hljs || false;
- var res = useHljs ? '' : '' + line + '' : ' marked">' + line + '';
+ res += useHljs ? `${line}` : ` marked">${line}`;
} else {
- res += useHljs ? line : '">' + line + '';
+ res += useHljs ? line : `">${line}`;
}
res += '
';
@@ -78,10 +77,10 @@ function encodePlainString(str) {
}
function replaceTabs(str, tab) {
- return str.replace(/^\t+/, function(match) {
- var result = '';
+ return str.replace(/^\t+/, match => {
+ let result = '';
- for (var i = 0, len = match.length; i < len; i++) {
+ for (let i = 0, len = match.length; i < len; i++) {
result += tab;
}
@@ -90,7 +89,7 @@ function replaceTabs(str, tab) {
}
function loadLanguage(lang) {
- hljs.registerLanguage(lang, require('highlight.js/lib/languages/' + lang));
+ hljs.registerLanguage(lang, require(`highlight.js/lib/languages/${lang}`));
}
function tryLanguage(lang) {
@@ -102,29 +101,25 @@ function tryLanguage(lang) {
}
function loadAllLanguages() {
- alias.languages.filter(function(lang) {
- return !hljs.getLanguage(lang);
- }).forEach(loadLanguage);
+ alias.languages.filter(lang => !hljs.getLanguage(lang)).forEach(loadLanguage);
}
function highlight(str, options) {
- var lang = options.lang;
- var autoDetect = options.hasOwnProperty('autoDetect') ? options.autoDetect : false;
+ let { lang } = options;
+ const { autoDetect = false } = options;
if (!lang && autoDetect) {
loadAllLanguages();
- lang = (function() {
- var result = hljs.highlightAuto(str);
- if (result.relevance > 0 && result.language) return result.language;
- return;
- })();
+ const result = hljs.highlightAuto(str);
+ if (result.relevance > 0 && result.language) lang = result.language;
+
}
if (!lang) {
lang = 'plain';
}
- var result = {
+ const result = {
value: encodePlainString(str),
language: lang.toLowerCase()
};
@@ -145,11 +140,11 @@ function highlight(str, options) {
function tryHighlight(str, lang) {
try {
- var matching = str.match(/(\r?\n)/);
- var separator = matching ? matching[1] : '';
- var lines = matching ? str.split(separator) : [str];
- var result = hljs.highlight(lang, lines.shift());
- var html = result.value;
+ const matching = str.match(/(\r?\n)/);
+ const separator = matching ? matching[1] : '';
+ const lines = matching ? str.split(separator) : [str];
+ let result = hljs.highlight(lang, lines.shift());
+ let html = result.value;
while (lines.length > 0) {
result = hljs.highlight(lang, lines.shift(), false, result.top);
html += separator + result.value;
@@ -158,7 +153,7 @@ function tryHighlight(str, lang) {
result.value = html;
return result;
} catch (err) {
- return;
+
}
}
diff --git a/lib/html_tag.js b/lib/html_tag.js
index 173f9077..8c7541f2 100644
--- a/lib/html_tag.js
+++ b/lib/html_tag.js
@@ -3,13 +3,13 @@
function htmlTag(tag, attrs, text) {
if (!tag) throw new TypeError('tag is required!');
- var result = '<' + tag;
+ let result = `<${tag}`;
- for (var i in attrs) {
- if (attrs[i]) result += ' ' + i + '="' + attrs[i] + '"';
+ for (const i in attrs) {
+ if (attrs[i] != null) result += ` ${i}="${attrs[i]}"`;
}
- result += text == null ? '>' : '>' + text + '' + tag + '>';
+ result += text == null ? '>' : `>${text}${tag}>`;
return result;
}
diff --git a/lib/index.js b/lib/index.js
index eb8fd2ea..f38eac88 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -1,6 +1,6 @@
'use strict';
-var hash = require('./hash');
+const hash = require('./hash');
exports.escapeDiacritic = require('./escape_diacritic');
exports.escapeHTML = require('./escape_html');
@@ -16,5 +16,6 @@ exports.truncate = require('./truncate');
exports.wordWrap = require('./word_wrap');
exports.hash = hash.hash;
exports.HashStream = hash.HashStream;
+exports.createSha1Hash = hash.createSha1Hash;
exports.CacheStream = require('./cache_stream');
exports.camelCaseKeys = require('./camel_case_keys');
diff --git a/lib/pattern.js b/lib/pattern.js
index 06cab93a..c2eecf8c 100644
--- a/lib/pattern.js
+++ b/lib/pattern.js
@@ -1,8 +1,8 @@
'use strict';
-var escapeRegExp = require('./escape_regexp');
+const escapeRegExp = require('./escape_regexp');
-var rParam = /([:\*])([\w\?]*)?/g;
+const rParam = /([:*])([\w?]*)?/g;
function Pattern(rule) {
if (rule instanceof Pattern) {
@@ -23,18 +23,16 @@ Pattern.prototype.test = function(str) {
};
function regexFilter(rule) {
- return function(str) {
- return str.match(rule);
- };
+ return str => str.match(rule);
}
function stringFilter(rule) {
- var params = [];
+ const params = [];
- var regex = escapeRegExp(rule)
- .replace(/\\([\*\?])/g, '$1')
- .replace(rParam, function(match, operator, name) {
- var str = '';
+ const regex = escapeRegExp(rule)
+ .replace(/\\([*?])/g, '$1')
+ .replace(rParam, (match, operator, name) => {
+ let str = '';
if (operator === '*') {
str = '(.*)?';
@@ -54,15 +52,14 @@ function stringFilter(rule) {
return str;
});
- return function(str) {
- var match = str.match(regex);
+ return str => {
+ const match = str.match(regex);
if (!match) return;
- var result = {};
- var name;
+ const result = {};
- for (var i = 0, len = match.length; i < len; i++) {
- name = params[i - 1];
+ for (let i = 0, len = match.length; i < len; i++) {
+ const name = params[i - 1];
result[i] = match[i];
if (name) result[name] = match[i];
}
diff --git a/lib/permalink.js b/lib/permalink.js
index 96684579..4e31353e 100644
--- a/lib/permalink.js
+++ b/lib/permalink.js
@@ -1,22 +1,22 @@
'use strict';
-var escapeRegExp = require('./escape_regexp');
+const escapeRegExp = require('./escape_regexp');
-var rParam = /:(\w+)/g;
+const rParam = /:(\w+)/g;
function Permalink(rule, options) {
if (!rule) throw new TypeError('rule is required!');
options = options || {};
- var segments = options.segments || {};
- var params = [];
+ const segments = options.segments || {};
+ const params = [];
- var regex = escapeRegExp(rule)
- .replace(rParam, function(match, name) {
+ const regex = escapeRegExp(rule)
+ .replace(rParam, (match, name) => {
params.push(name);
- if (segments.hasOwnProperty(name)) {
- var segment = segments[name];
+ if (Object.prototype.hasOwnProperty.call(segments, name)) {
+ const segment = segments[name];
if (segment instanceof RegExp) {
return segment.source;
@@ -29,7 +29,7 @@ function Permalink(rule, options) {
});
this.rule = rule;
- this.regex = new RegExp('^' + regex + '$');
+ this.regex = new RegExp(`^${regex}$`);
this.params = params;
}
@@ -38,13 +38,13 @@ Permalink.prototype.test = function(str) {
};
Permalink.prototype.parse = function(str) {
- var match = str.match(this.regex);
- var params = this.params;
- var result = {};
+ const match = str.match(this.regex);
+ const { params } = this;
+ const result = {};
if (!match) return;
- for (var i = 1, len = match.length; i < len; i++) {
+ for (let i = 1, len = match.length; i < len; i++) {
result[params[i - 1]] = match[i];
}
@@ -52,9 +52,7 @@ Permalink.prototype.parse = function(str) {
};
Permalink.prototype.stringify = function(data) {
- return this.rule.replace(rParam, function(match, name) {
- return data[name];
- });
+ return this.rule.replace(rParam, (match, name) => data[name]);
};
module.exports = Permalink;
diff --git a/lib/slugize.js b/lib/slugize.js
index 46113aa0..0a749a7c 100644
--- a/lib/slugize.js
+++ b/lib/slugize.js
@@ -1,28 +1,28 @@
'use strict';
-var escapeDiacritic = require('./escape_diacritic');
-var escapeRegExp = require('./escape_regexp');
-var rControl = /[\u0000-\u001f]/g;
-var rSpecial = /[\s~`!@#\$%\^&\*\(\)\-_\+=\[\]\{\}\|\\;:"'<>,\.\?\/]+/g;
+const escapeDiacritic = require('./escape_diacritic');
+const escapeRegExp = require('./escape_regexp');
+// eslint-disable-next-line no-control-regex
+const rControl = /[\u0000-\u001f]/g;
+const rSpecial = /[\s~`!@#$%^&*()\-_+=[\]{}|\\;:"'<>,.?/]+/g;
-function slugize(str, options) {
+function slugize(str, options = {}) {
if (typeof str !== 'string') throw new TypeError('str must be a string!');
- options = options || {};
- var separator = options.separator || '-';
- var escapedSep = escapeRegExp(separator);
+ const separator = options.separator || '-';
+ const escapedSep = escapeRegExp(separator);
- var result = escapeDiacritic(str)
+ const result = escapeDiacritic(str)
// Remove control characters
.replace(rControl, '')
// Replace special characters
.replace(rSpecial, separator)
// Remove continous separators
- .replace(new RegExp(escapedSep + '{2,}', 'g'), separator)
+ .replace(new RegExp(`${escapedSep}{2,}`, 'g'), separator)
// Remove prefixing and trailing separtors
- .replace(new RegExp('^' + escapedSep + '+|' + escapedSep + '+$', 'g'), '');
+ .replace(new RegExp(`^${escapedSep}+|${escapedSep}+$`, 'g'), '');
- switch (options.transform){
+ switch (options.transform) {
case 1:
return result.toLowerCase();
diff --git a/lib/spawn.js b/lib/spawn.js
index d8ebd0ad..13d2c4af 100644
--- a/lib/spawn.js
+++ b/lib/spawn.js
@@ -1,40 +1,39 @@
'use strict';
-var spawn = require('cross-spawn');
-var Promise = require('bluebird');
-var CacheStream = require('./cache_stream');
+const spawn = require('cross-spawn');
+const Promise = require('bluebird');
+const CacheStream = require('./cache_stream');
-function promiseSpawn(command, args, options) {
+function promiseSpawn(command, args = [], options) {
if (!command) throw new TypeError('command is required!');
- if (!options && args && !Array.isArray(args)) {
+ if (!options && !Array.isArray(args)) {
options = args;
args = [];
}
- args = args || [];
options = options || {};
- return new Promise(function(resolve, reject) {
- var task = spawn(command, args, options);
- var verbose = options.verbose;
- var encoding = options.hasOwnProperty('encoding') ? options.encoding : 'utf8';
- var stdoutCache = new CacheStream();
- var stderrCache = new CacheStream();
+ return new Promise((resolve, reject) => {
+ const task = spawn(command, args, options);
+ const verbose = options.verbose;
+ const { encoding = 'utf8' } = options;
+ const stdoutCache = new CacheStream();
+ const stderrCache = new CacheStream();
if (task.stdout) {
- var stdout = task.stdout.pipe(stdoutCache);
+ const stdout = task.stdout.pipe(stdoutCache);
if (verbose) stdout.pipe(process.stdout);
}
if (task.stderr) {
- var stderr = task.stderr.pipe(stderrCache);
+ const stderr = task.stderr.pipe(stderrCache);
if (verbose) stderr.pipe(process.stderr);
}
- task.on('close', function(code) {
+ task.on('close', code => {
if (code) {
- var e = new Error(getCache(stderrCache, encoding));
+ const e = new Error(getCache(stderrCache, encoding));
e.code = code;
return reject(e);
@@ -47,9 +46,9 @@ function promiseSpawn(command, args, options) {
// Listen to exit events if neither stdout and stderr exist (inherit stdio)
if (!task.stdout && !task.stderr) {
- task.on('exit', function(code) {
+ task.on('exit', code => {
if (code) {
- var e = new Error('Spawn failed');
+ const e = new Error('Spawn failed');
e.code = code;
return reject(e);
@@ -62,7 +61,7 @@ function promiseSpawn(command, args, options) {
}
function getCache(stream, encoding) {
- var buf = stream.getCache();
+ const buf = stream.getCache();
stream.destroy();
if (!encoding) return buf;
diff --git a/lib/truncate.js b/lib/truncate.js
index 50775712..0dbd1dac 100644
--- a/lib/truncate.js
+++ b/lib/truncate.js
@@ -1,24 +1,22 @@
'use strict';
-function truncate(str, options) {
+function truncate(str, options = {}) {
if (typeof str !== 'string') throw new TypeError('str must be a string!');
- options = options || {};
- var length = options.length || 30;
- var omission = options.omission || '...';
- var separator = options.separator;
- var omissionLength = omission.length;
+ const length = options.length || 30;
+ const omission = options.omission || '...';
+ const { separator } = options;
+ const omissionLength = omission.length;
if (str.length < length) return str;
if (separator) {
- var words = str.split(separator);
- var word = '';
- var result = '';
- var resultLength = 0;
+ const words = str.split(separator);
+ let result = '';
+ let resultLength = 0;
- for (var i = 0, len = words.length; i < len; i++) {
- word = words[i];
+ for (let i = 0, len = words.length; i < len; i++) {
+ const word = words[i];
if (resultLength + word.length + omissionLength < length) {
result += word + separator;
diff --git a/lib/word_wrap.js b/lib/word_wrap.js
index 9a552727..23fb6df6 100644
--- a/lib/word_wrap.js
+++ b/lib/word_wrap.js
@@ -1,17 +1,15 @@
'use strict';
// https://github.com/rails/rails/blob/v4.2.0/actionview/lib/action_view/helpers/text_helper.rb#L240
-function wordWrap(str, options) {
+function wordWrap(str, options = {}) {
if (typeof str !== 'string') throw new TypeError('str must be a string!');
- options = options || {};
- var width = options.width || 80;
- var regex = new RegExp('(.{1,' + width + '})(\\s+|$)', 'g');
- var lines = str.split('\n');
- var line = '';
+ const width = options.width || 80;
+ const regex = new RegExp(`(.{1,${width}})(\\s+|$)`, 'g');
+ const lines = str.split('\n');
- for (var i = 0, len = lines.length; i < len; i++) {
- line = lines[i];
+ for (let i = 0, len = lines.length; i < len; i++) {
+ const line = lines[i];
if (line.length > width) {
lines[i] = line.replace(regex, '$1\n').trim();
@@ -22,4 +20,3 @@ function wordWrap(str, options) {
}
module.exports = wordWrap;
-
diff --git a/package.json b/package.json
index a042f8ef..471e3eb4 100644
--- a/package.json
+++ b/package.json
@@ -1,19 +1,24 @@
{
"name": "hexo-util",
- "version": "0.6.3",
+ "version": "1.0.0",
"description": "Utilities for Hexo.",
"main": "lib/index",
"scripts": {
"eslint": "eslint .",
- "jscs": "jscs .",
"test": "mocha test/index.js",
- "test-cov": "istanbul cover --print both _mocha -- test/index.js",
- "build:highlight": "node scripts/build_highlight_alias.js > highlight_alias.json",
+ "test-cov": "nyc npm run test",
+ "build:highlight": "node scripts/build_highlight_alias.js",
"prepare": "npm run build:highlight"
},
"directories": {
- "lib": "./lib"
+ "lib": "./lib",
+ "scripts": "./scripts"
},
+ "files": [
+ "lib/",
+ "scripts/",
+ "highlight_alias.json"
+ ],
"repository": "hexojs/hexo-util",
"homepage": "https://hexo.io/",
"keywords": [
@@ -27,22 +32,23 @@
],
"license": "MIT",
"devDependencies": {
- "chai": "^3.5.0",
- "eslint": "^2.12.0",
- "eslint-config-hexo": "^1.0.3",
+ "chai": "^4.2.0",
+ "eslint": "^6.0.1",
+ "eslint-config-hexo": "^3.0.0",
"html-tag-validator": "^1.5.0",
- "istanbul": "^0.4.3",
- "jscs": "^3.0.4",
- "jscs-preset-hexo": "^1.0.1",
- "mocha": "^2.5.3",
- "rewire": "^2.5.1"
+ "mocha": "^6.0.1",
+ "nyc": "^14.1.1",
+ "rewire": "^4.0.1"
},
"dependencies": {
- "bluebird": "^3.4.0",
+ "bluebird": "^3.5.2",
"camel-case": "^3.0.0",
- "cross-spawn": "^4.0.0",
- "highlight.js": "^9.4.0",
- "html-entities": "^1.2.0",
- "striptags": "^2.1.1"
+ "cross-spawn": "^6.0.5",
+ "highlight.js": "^9.13.1",
+ "html-entities": "^1.2.1",
+ "striptags": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=8.6.0"
}
}
diff --git a/scripts/build_highlight_alias.js b/scripts/build_highlight_alias.js
index 6f1b6184..c2e97419 100644
--- a/scripts/build_highlight_alias.js
+++ b/scripts/build_highlight_alias.js
@@ -1,24 +1,29 @@
'use strict';
-var hljs = require('highlight.js');
-var languages = hljs.listLanguages();
+const hljs = require('highlight.js');
+const languages = hljs.listLanguages();
+const fs = require('fs');
-var result = {
+const result = {
languages: languages,
aliases: {}
};
-languages.forEach(function(lang) {
+languages.forEach(lang => {
result.aliases[lang] = lang;
- var def = require('highlight.js/lib/languages/' + lang)(hljs);
- var aliases = def.aliases;
+ const def = require('highlight.js/lib/languages/' + lang)(hljs);
+ const aliases = def.aliases;
if (aliases) {
- aliases.forEach(function(alias) {
+ aliases.forEach(alias => {
result.aliases[alias] = lang;
});
}
});
-console.log(JSON.stringify(result));
+const stream = fs.createWriteStream('highlight_alias.json');
+stream.write(JSON.stringify(result));
+stream.on('end', () => {
+ stream.end();
+});
diff --git a/test/.eslintrc b/test/.eslintrc.json
similarity index 93%
rename from test/.eslintrc
rename to test/.eslintrc.json
index 82825e53..5682a2ba 100644
--- a/test/.eslintrc
+++ b/test/.eslintrc.json
@@ -1,3 +1,3 @@
-{
- "extends": "hexo/test"
+{
+ "extends": "hexo/test"
}
\ No newline at end of file
diff --git a/test/index.js b/test/index.js
index 855b61c8..117491df 100644
--- a/test/index.js
+++ b/test/index.js
@@ -1,8 +1,9 @@
'use strict';
-describe('util', function() {
+describe('util', () => {
require('./scripts/cache_stream');
require('./scripts/camel_case_keys');
+ require('./scripts/color');
require('./scripts/escape_diacritic');
require('./scripts/escape_html');
require('./scripts/escape_regexp');
diff --git a/test/scripts/cache_stream.js b/test/scripts/cache_stream.js
index 936bfca1..6fab3f1b 100644
--- a/test/scripts/cache_stream.js
+++ b/test/scripts/cache_stream.js
@@ -1,27 +1,27 @@
'use strict';
-var Readable = require('stream').Readable;
+const { Readable } = require('stream');
-describe('CacheStream', function() {
- var CacheStream = require('../../lib/cache_stream');
+describe('CacheStream', () => {
+ const CacheStream = require('../../lib/cache_stream');
- it('default', function() {
- var src = new Readable();
- var cacheStream = new CacheStream();
- var content = new Buffer('test');
+ it('default', () => {
+ const src = new Readable();
+ const cacheStream = new CacheStream();
+ const content = Buffer.from('test');
src.push(content);
src.push(null);
src.pipe(cacheStream);
- cacheStream.on('finish', function() {
+ cacheStream.on('finish', () => {
cacheStream.getCache().should.eql(content);
});
});
- it('destroy', function() {
- var cacheStream = new CacheStream();
- cacheStream._cache = [new Buffer(1)];
+ it('destroy', () => {
+ const cacheStream = new CacheStream();
+ cacheStream._cache = [Buffer.alloc(1)];
cacheStream.destroy();
cacheStream._cache.should.have.length(0);
diff --git a/test/scripts/camel_case_keys.js b/test/scripts/camel_case_keys.js
index 94dc2aaf..e8b0ba6a 100644
--- a/test/scripts/camel_case_keys.js
+++ b/test/scripts/camel_case_keys.js
@@ -1,12 +1,12 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('camelCaseKeys', function() {
- var camelCaseKeys = require('../../lib/camel_case_keys');
+describe('camelCaseKeys', () => {
+ const camelCaseKeys = require('../../lib/camel_case_keys');
- it('default', function() {
- var result = camelCaseKeys({
+ it('default', () => {
+ const result = camelCaseKeys({
foo_bar: 'test'
});
@@ -16,7 +16,7 @@ describe('camelCaseKeys', function() {
});
});
- it('obj must be an object', function() {
+ it('obj must be an object', () => {
try {
camelCaseKeys();
} catch (err) {
@@ -24,8 +24,8 @@ describe('camelCaseKeys', function() {
}
});
- it('setter', function() {
- var result = camelCaseKeys({
+ it('setter', () => {
+ const result = camelCaseKeys({
foo_bar: 'test'
});
@@ -33,8 +33,8 @@ describe('camelCaseKeys', function() {
result.fooBar.should.eql('new');
});
- it('ignore prefixing underscore', function() {
- var result = camelCaseKeys({
+ it('ignore prefixing underscore', () => {
+ const result = camelCaseKeys({
_foo_bar: 'test',
__bar_baz: 'foo'
});
@@ -47,8 +47,8 @@ describe('camelCaseKeys', function() {
});
});
- it('do nothing if the key is camelCase', function() {
- var result = camelCaseKeys({
+ it('do nothing if the key is camelCase', () => {
+ const result = camelCaseKeys({
fooBar: 'test'
});
diff --git a/test/scripts/color.js b/test/scripts/color.js
new file mode 100644
index 00000000..898777f7
--- /dev/null
+++ b/test/scripts/color.js
@@ -0,0 +1,53 @@
+'use strict';
+
+describe('color', () => {
+ const Color = require('../../lib/color');
+
+ it('name', () => {
+ const red = new Color('red');
+ const pink = new Color('pink');
+ const mid1 = red.mix(pink, 1 / 3);
+ const mid2 = red.mix(pink, 2 / 3);
+
+ `${red}`.should.eql('#f00');
+ `${pink}`.should.eql('#ffc0cb');
+ `${mid1}`.should.eql('#ff4044');
+ `${mid2}`.should.eql('#ff8087');
+ });
+
+ it('hex', () => {
+ const red = new Color('#f00');
+ const pink = new Color('#ffc0cb');
+ const mid1 = red.mix(pink, 1 / 3);
+ const mid2 = red.mix(pink, 2 / 3);
+
+ `${red}`.should.eql('#f00');
+ `${pink}`.should.eql('#ffc0cb');
+ `${mid1}`.should.eql('#ff4044');
+ `${mid2}`.should.eql('#ff8087');
+ });
+
+ it('RGBA', () => {
+ const steelblueA = new Color('rgba(70, 130, 180, 0.3)');
+ const steelblue = new Color('rgb(70, 130, 180)');
+ const mid1 = steelblueA.mix(steelblue, 1 / 3);
+ const mid2 = steelblueA.mix(steelblue, 2 / 3);
+
+ `${steelblueA}`.should.eql('rgba(70, 130, 180, 0.3)');
+ `${steelblue}`.should.eql('#4682b4');
+ `${mid1}`.should.eql('rgba(70, 130, 180, 0.53)');
+ `${mid2}`.should.eql('rgba(70, 130, 180, 0.77)');
+ });
+
+ it('HSLA', () => {
+ const steelblueA = new Color('hsla(207, 44%, 49%, 0.3)');
+ const steelblue = new Color('hsl(207, 44%, 49%)');
+ const mid1 = steelblueA.mix(steelblue, 1 / 3);
+ const mid2 = steelblueA.mix(steelblue, 2 / 3);
+
+ `${steelblueA}`.should.eql('rgba(70, 130, 180, 0.3)');
+ `${steelblue}`.should.eql('#4682b4');
+ `${mid1}`.should.eql('rgba(70, 130, 180, 0.53)');
+ `${mid2}`.should.eql('rgba(70, 130, 180, 0.77)');
+ });
+});
diff --git a/test/scripts/escape_diacritic.js b/test/scripts/escape_diacritic.js
index 225ac4d4..60751910 100644
--- a/test/scripts/escape_diacritic.js
+++ b/test/scripts/escape_diacritic.js
@@ -1,15 +1,15 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('escapeDiacritic', function() {
- var escapeDiacritic = require('../../lib/escape_diacritic');
+describe('escapeDiacritic', () => {
+ const escapeDiacritic = require('../../lib/escape_diacritic');
- it('default', function() {
+ it('default', () => {
escapeDiacritic('Hell\u00F2 w\u00F2rld').should.eql('Hello world');
});
- it('str must be a string', function() {
+ it('str must be a string', () => {
try {
escapeDiacritic();
} catch (err) {
diff --git a/test/scripts/escape_html.js b/test/scripts/escape_html.js
index 68fc6ede..0207fc6f 100644
--- a/test/scripts/escape_html.js
+++ b/test/scripts/escape_html.js
@@ -1,15 +1,15 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('escapeHTML', function() {
- var escapeHTML = require('../../lib/escape_html');
+describe('escapeHTML', () => {
+ const escapeHTML = require('../../lib/escape_html');
- it('default', function() {
+ it('default', () => {
escapeHTML('Hello "world".
').should.eql('<p>Hello "world".</p>');
});
- it('str must be a string', function() {
+ it('str must be a string', () => {
try {
escapeHTML();
} catch (err) {
diff --git a/test/scripts/escape_regexp.js b/test/scripts/escape_regexp.js
index f74b6deb..7c3c5116 100644
--- a/test/scripts/escape_regexp.js
+++ b/test/scripts/escape_regexp.js
@@ -1,15 +1,15 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('escapeRegExp', function() {
- var escapeRegExp = require('../../lib/escape_regexp');
+describe('escapeRegExp', () => {
+ const escapeRegExp = require('../../lib/escape_regexp');
- it('default', function() {
+ it('default', () => {
escapeRegExp('hello*world').should.eql('hello\\*world');
});
- it('str must be a string', function() {
+ it('str must be a string', () => {
try {
escapeRegExp();
} catch (err) {
diff --git a/test/scripts/hash.js b/test/scripts/hash.js
index 062c1d3f..820eb254 100644
--- a/test/scripts/hash.js
+++ b/test/scripts/hash.js
@@ -1,30 +1,49 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
-var crypto = require('crypto');
+const should = require('chai').should(); // eslint-disable-line
+const crypto = require('crypto');
function sha1(content) {
- var hash = crypto.createHash('sha1');
+ const hash = crypto.createHash('sha1');
hash.update(content);
return hash.digest();
}
-describe('hash', function() {
- var hash = require('../../lib/hash');
+describe('hash', () => {
+ const hash = require('../../lib/hash');
- it('hash', function() {
- var content = '123456';
+ it('hash', () => {
+ const content = '123456';
hash.hash(content).should.eql(sha1(content));
});
- it('HashStream', function() {
- var content = '123456';
- var stream = new hash.HashStream();
+ it('HashStream', () => {
+ const content = '123456';
+ const stream = new hash.HashStream();
- stream.write(new Buffer(content));
+ stream.write(Buffer.from(content));
stream.end();
stream.read().should.eql(sha1(content));
});
+
+ it('createSha1Hash', function() {
+ var _sha1 = hash.createSha1Hash();
+ var content = '123456';
+ _sha1.update(content);
+ _sha1.digest().should.eql(sha1(content));
+ });
+
+ it('createSha1Hash - streamMode', function() {
+ var content1 = '123456';
+ var content2 = '654321';
+ var stream = hash.createSha1Hash();
+ // explicit convert
+ stream.write(Buffer.from(content1));
+ // implicit convert
+ stream.write(content2);
+ stream.end();
+ stream.read().should.eql(sha1(content1 + content2));
+ });
});
diff --git a/test/scripts/highlight.js b/test/scripts/highlight.js
index 5553b23b..3fb23900 100644
--- a/test/scripts/highlight.js
+++ b/test/scripts/highlight.js
@@ -1,32 +1,32 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
-var hljs = require('highlight.js');
-var Entities = require('html-entities').XmlEntities;
-var entities = new Entities();
-var validator = require('html-tag-validator');
+const should = require('chai').should(); // eslint-disable-line
+const hljs = require('highlight.js');
+const Entities = require('html-entities').XmlEntities;
+const entities = new Entities();
+const validator = require('html-tag-validator');
-var testJson = {
+const testJson = {
foo: 1,
bar: 2
};
-var testString = JSON.stringify(testJson, null, ' ');
+const testString = JSON.stringify(testJson, null, ' ');
-var start = '';
+const start = '';
-var gutterStart = '';
-var gutterEnd = ' | ';
+const gutterStart = '';
+const gutterEnd = ' | ';
-var codeStart = '';
-var codeEnd = ' | ';
+const codeStart = '';
+const codeEnd = ' | ';
function gutter(start, end) {
- var result = gutterStart;
+ let result = gutterStart;
- for (var i = start; i <= end; i++) {
- result += '' + i + '
';
+ for (let i = start; i <= end; i++) {
+ result += `${i}
`;
}
result += gutterEnd;
@@ -35,7 +35,7 @@ function gutter(start, end) {
}
function code(str, lang) {
- var data;
+ let data;
if (lang) {
data = hljs.highlight(lang.toLowerCase(), str);
@@ -45,11 +45,11 @@ function code(str, lang) {
data = {value: entities.encode(str)};
}
- var lines = data.value.split('\n');
- var result = codeStart;
+ const lines = data.value.split('\n');
+ let result = codeStart;
- for (var i = 0, len = lines.length; i < len; i++) {
- result += '' + lines[i] + '
';
+ for (let i = 0, len = lines.length; i < len; i++) {
+ result += `${lines[i]}
`;
}
result += codeEnd;
@@ -58,9 +58,9 @@ function code(str, lang) {
}
function assertResult(result) {
- var expected = start;
+ let expected = start;
- for (var i = 1, len = arguments.length; i < len; i++) {
+ for (let i = 1, len = arguments.length; i < len; i++) {
expected += arguments[i];
}
@@ -70,7 +70,7 @@ function assertResult(result) {
}
function validateHtmlAsync(str, done) {
- validator(str, function(err, ast) {
+ validator(str, (err, ast) => {
if (err) {
done(err);
} else {
@@ -79,16 +79,16 @@ function validateHtmlAsync(str, done) {
});
}
-describe('highlight', function() {
- var highlight = require('../../lib/highlight');
+describe('highlight', () => {
+ const highlight = require('../../lib/highlight');
- it('default', function(done) {
- var result = highlight(testString);
+ it('default', done => {
+ const result = highlight(testString);
assertResult(result, gutter(1, 4), code(testString));
validateHtmlAsync(result, done);
});
- it('str must be a string', function() {
+ it('str must be a string', () => {
try {
highlight();
} catch (err) {
@@ -96,26 +96,26 @@ describe('highlight', function() {
}
});
- it('gutter: false', function(done) {
- var result = highlight(testString, {gutter: false});
+ it('gutter: false', done => {
+ const result = highlight(testString, {gutter: false});
assertResult(result, code(testString));
validateHtmlAsync(result, done);
});
- it('wrap: false', function(done) {
- var result = highlight(testString, {wrap: false});
+ it('wrap: false', done => {
+ const result = highlight(testString, {wrap: false});
result.should.eql(entities.encode(testString));
validateHtmlAsync(result, done);
});
- it('firstLine', function(done) {
- var result = highlight(testString, {firstLine: 3});
+ it('firstLine', done => {
+ const result = highlight(testString, {firstLine: 3});
assertResult(result, gutter(3, 6), code(testString));
validateHtmlAsync(result, done);
});
- it('lang = json', function(done) {
- var result = highlight(testString, {lang: 'json'});
+ it('lang = json', done => {
+ const result = highlight(testString, {lang: 'json'});
result.should.eql([
'',
@@ -126,8 +126,8 @@ describe('highlight', function() {
validateHtmlAsync(result, done);
});
- it('auto detect', function(done) {
- var result = highlight(testString, {autoDetect: true});
+ it('auto detect', done => {
+ const result = highlight(testString, {autoDetect: true});
result.should.eql([
'',
@@ -138,16 +138,16 @@ describe('highlight', function() {
validateHtmlAsync(result, done);
});
- it('don\'t highlight if language not found', function(done) {
- var result = highlight('test', {lang: 'jrowiejrowi'});
+ it('don\'t highlight if language not found', done => {
+ const result = highlight('test', {lang: 'jrowiejrowi'});
assertResult(result, gutter(1, 1), code('test'));
validateHtmlAsync(result, done);
});
it('don\'t highlight if parse failed');
- it('caption', function(done) {
- var result = highlight(testString, {
+ it('caption', done => {
+ const result = highlight(testString, {
caption: 'hello world'
});
@@ -160,15 +160,15 @@ describe('highlight', function() {
validateHtmlAsync(result, done);
});
- it('tab', function(done) {
- var str = [
+ it('tab', done => {
+ const str = [
'function fib(i){',
'\tif (i <= 1) return i;',
'\treturn fib(i - 1) + fib(i - 2);',
'}'
].join('\n');
- var result = highlight(str, {tab: ' ', lang: 'js'});
+ const result = highlight(str, {tab: ' ', lang: 'js'});
result.should.eql([
'',
@@ -179,8 +179,8 @@ describe('highlight', function() {
validateHtmlAsync(result, done);
});
- it('escape html entity', function(done) {
- var str = [
+ it('escape html entity', done => {
+ const str = [
'deploy:',
' type: git',
' repo: ',
@@ -188,13 +188,13 @@ describe('highlight', function() {
' message: [message]'
].join('\n');
- var result = highlight(str);
+ const result = highlight(str);
result.should.include('<repository url>');
validateHtmlAsync(result, done);
});
- it('parse multi-line strings correctly', function(done) {
- var str = [
+ it('parse multi-line strings correctly', done => {
+ const str = [
'var string = `',
' Multi',
' line',
@@ -202,7 +202,7 @@ describe('highlight', function() {
'`'
].join('\n');
- var result = highlight(str, {lang: 'js'});
+ const result = highlight(str, {lang: 'js'});
result.should.eql([
'',
gutter(1, 5),
@@ -212,8 +212,8 @@ describe('highlight', function() {
validateHtmlAsync(result, done);
});
- it('parse multi-line strings including empty line', function(done) {
- var str = [
+ it('parse multi-line strings including empty line', done => {
+ const str = [
'var string = `',
' Multi',
'',
@@ -221,7 +221,7 @@ describe('highlight', function() {
'`'
].join('\n');
- var result = highlight(str, {lang: 'js'});
+ const result = highlight(str, {lang: 'js'});
result.should.eql([
'',
gutter(1, 5),
@@ -231,8 +231,8 @@ describe('highlight', function() {
validateHtmlAsync(result, done);
});
- it('auto detect of multi-line statement', function(done) {
- var str = [
+ it('auto detect of multi-line statement', done => {
+ const str = [
'"use strict";',
'var string = `',
' Multi',
@@ -241,7 +241,7 @@ describe('highlight', function() {
'`'
].join('\n');
- var result = highlight(str, {autoDetect: true});
+ const result = highlight(str, {autoDetect: true});
result.should.eql([
'',
gutter(1, 6),
@@ -251,15 +251,15 @@ describe('highlight', function() {
validateHtmlAsync(result, done);
});
- it('gives the highlight class to marked lines', function(done) {
- var str = [
+ it('gives the highlight class to marked lines', done => {
+ const str = [
'roses are red',
'violets are blue',
'sugar is sweet',
'and so are you'
].join('\n');
- var result = highlight(str, {mark: [1, 3, 5]});
+ const result = highlight(str, {mark: [1, 3, 5]});
result.should.include('class="line marked">roses');
result.should.include('class="line">violets');
@@ -269,14 +269,14 @@ describe('highlight', function() {
});
it('hljs compatibility - with lines', (done) => {
- var str = [
+ const str = [
'function (a) {',
' if (a > 3)',
' return true;',
' return false;',
'}'
].join('\n');
- var result = highlight(str, {hljs: true, lang: 'javascript' });
+ const result = highlight(str, {hljs: true, lang: 'javascript' });
result.should.include(gutterStart);
result.should.include(codeStart);
result.should.include('code class="hljs javascript"');
@@ -286,14 +286,14 @@ describe('highlight', function() {
});
it('hljs compatibility - no lines', (done) => {
- var str = [
+ const str = [
'function (a) {',
' if (a > 3)',
' return true;',
' return false;',
'}'
].join('\n');
- var result = highlight(str, {hljs: true, gutter: false, lang: 'javascript' });
+ const result = highlight(str, {hljs: true, gutter: false, lang: 'javascript' });
result.should.not.include(gutterStart);
result.should.not.include(codeStart);
result.should.include('code class="hljs javascript"');
diff --git a/test/scripts/html_tag.js b/test/scripts/html_tag.js
index b079b81e..67b2470b 100644
--- a/test/scripts/html_tag.js
+++ b/test/scripts/html_tag.js
@@ -1,15 +1,15 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('htmlTag', function() {
- var htmlTag = require('../../lib/html_tag');
+describe('htmlTag', () => {
+ const htmlTag = require('../../lib/html_tag');
- it('tag', function() {
+ it('tag', () => {
htmlTag('hr').should.eql('
');
});
- it('tag + attrs', function() {
+ it('tag + attrs', () => {
htmlTag('img', {
src: 'http://placekitten.com/200/300'
}).should.eql('
');
@@ -21,13 +21,41 @@ describe('htmlTag', function() {
}).should.eql('
');
});
- it('tag + attrs + text', function() {
+ it('tag + attrs + text', () => {
htmlTag('a', {
href: 'http://zespia.tw'
}, 'My blog').should.eql('My blog');
});
- it('tag is required', function() {
+ it('tag + empty ALT attr', () => {
+ htmlTag('img', {
+ src: 'http://placekitten.com/200/300',
+ alt: ''
+ }).should.eql('
');
+ });
+
+ it('passing a zero as attribute', () => {
+ htmlTag('a', {
+ href: 'http://zespia.tw',
+ tabindex: 0
+ }, 'My blog').should.eql('My blog');
+ });
+
+ it('passing a null alt attribute', () => {
+ htmlTag('a', {
+ href: 'http://zespia.tw',
+ alt: null
+ }, 'My blog').should.eql('My blog');
+ });
+
+ it('passing a undefined alt attribute', () => {
+ htmlTag('a', {
+ href: 'http://zespia.tw',
+ alt: undefined
+ }, 'My blog').should.eql('My blog');
+ });
+
+ it('tag is required', () => {
try {
htmlTag();
} catch (err) {
diff --git a/test/scripts/pattern.js b/test/scripts/pattern.js
index 5e95bcc1..a21010d9 100644
--- a/test/scripts/pattern.js
+++ b/test/scripts/pattern.js
@@ -1,13 +1,13 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('Pattern', function() {
- var Pattern = require('../../lib/pattern');
+describe('Pattern', () => {
+ const Pattern = require('../../lib/pattern');
- it('String - posts/:id', function() {
- var pattern = new Pattern('posts/:id');
- var result = pattern.match('/posts/89');
+ it('String - posts/:id', () => {
+ const pattern = new Pattern('posts/:id');
+ const result = pattern.match('/posts/89');
result.should.eql({
0: 'posts/89',
@@ -16,9 +16,9 @@ describe('Pattern', function() {
});
});
- it('String - posts/*path', function() {
- var pattern = new Pattern('posts/*path');
- var result = pattern.match('posts/2013/hello-world');
+ it('String - posts/*path', () => {
+ const pattern = new Pattern('posts/*path');
+ const result = pattern.match('posts/2013/hello-world');
result.should.eql({
0: 'posts/2013/hello-world',
@@ -27,8 +27,8 @@ describe('Pattern', function() {
});
});
- it('String - posts/:id?', function() {
- var pattern = new Pattern('posts/:id?');
+ it('String - posts/:id?', () => {
+ const pattern = new Pattern('posts/:id?');
pattern.match('posts/').should.eql({
0: 'posts/',
@@ -43,15 +43,15 @@ describe('Pattern', function() {
});
});
- it('RegExp', function() {
- var pattern = new Pattern(/ab?cd/);
+ it('RegExp', () => {
+ const pattern = new Pattern(/ab?cd/);
pattern.match('abcd').should.be.ok;
pattern.match('acd').should.be.ok;
});
- it('Function', function() {
- var pattern = new Pattern(function(str) {
+ it('Function', () => {
+ const pattern = new Pattern(str => {
str.should.eql('foo');
return {};
});
@@ -59,8 +59,9 @@ describe('Pattern', function() {
pattern.match('foo').should.eql({});
});
- it('rule is required', function() {
+ it('rule is required', () => {
try {
+ // eslint-disable-next-line no-new
new Pattern();
} catch (err) {
err.should.have.property('message', 'rule must be a function, a string or a regular expression.');
diff --git a/test/scripts/permalink.js b/test/scripts/permalink.js
index 0e87ce97..dbad6837 100644
--- a/test/scripts/permalink.js
+++ b/test/scripts/permalink.js
@@ -1,12 +1,12 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('Permalink', function() {
- var Permalink = require('../../lib/permalink');
- var permalink;
+describe('Permalink', () => {
+ const Permalink = require('../../lib/permalink');
+ let permalink;
- it('constructor', function() {
+ it('constructor', () => {
permalink = new Permalink(':year/:month/:day/:title');
permalink.rule.should.eql(':year/:month/:day/:title');
@@ -26,20 +26,21 @@ describe('Permalink', function() {
permalink.params.should.eql(['year', 'month', 'day', 'title']);
});
- it('rule is required', function() {
+ it('rule is required', () => {
try {
+ // eslint-disable-next-line no-new
new Permalink();
} catch (err) {
err.should.have.property('message', 'rule is required!');
}
});
- it('test()', function() {
+ it('test()', () => {
permalink.test('2014/01/31/test').should.be.true;
permalink.test('foweirojwoier').should.be.false;
});
- it('parse()', function() {
+ it('parse()', () => {
permalink.parse('2014/01/31/test').should.eql({
year: '2014',
month: '01',
@@ -48,7 +49,7 @@ describe('Permalink', function() {
});
});
- it('stringify()', function() {
+ it('stringify()', () => {
permalink.stringify({
year: '2014',
month: '01',
diff --git a/test/scripts/slugize.js b/test/scripts/slugize.js
index 324f859a..e4ddde89 100644
--- a/test/scripts/slugize.js
+++ b/test/scripts/slugize.js
@@ -1,47 +1,47 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('slugize', function() {
- var slugize = require('../../lib/slugize');
+describe('slugize', () => {
+ const slugize = require('../../lib/slugize');
- it('spaces', function() {
+ it('spaces', () => {
slugize('Hello World').should.eql('Hello-World');
});
- it('diacritic', function() {
+ it('diacritic', () => {
slugize('Hell\u00F2 w\u00F2rld').should.eql('Hello-world');
});
- it('continous dashes', function() {
+ it('continous dashes', () => {
slugize('Hello World').should.eql('Hello-World');
});
- it('prefixing and trailing dashes', function() {
+ it('prefixing and trailing dashes', () => {
slugize('~Hello World~').should.eql('Hello-World');
});
- it('other special characters', function() {
+ it('other special characters', () => {
slugize('Hello ~`!@#$%^&*()-_+=[]{}|\\;:"\'<>,.?/World').should.eql('Hello-World');
});
- it('custom separator', function() {
+ it('custom separator', () => {
slugize('Hello World', {separator: '_'}).should.eql('Hello_World');
});
- it('lower case', function() {
+ it('lower case', () => {
slugize('Hello World', {transform: 1}).should.eql('hello-world');
});
- it('upper case', function() {
+ it('upper case', () => {
slugize('Hello World', {transform: 2}).should.eql('HELLO-WORLD');
});
- it('non-english', function() {
+ it('non-english', () => {
slugize('遊戲').should.eql('遊戲');
});
- it('str must be a string', function() {
+ it('str must be a string', () => {
try {
slugize();
} catch (err) {
diff --git a/test/scripts/spawn.js b/test/scripts/spawn.js
index a2f5c2d8..f215c3db 100644
--- a/test/scripts/spawn.js
+++ b/test/scripts/spawn.js
@@ -1,31 +1,29 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
-var pathFn = require('path');
-var fs = require('fs');
-var rewire = require('rewire');
-
-describe('spawn', function() {
- var spawn = require('../../lib/spawn');
- var CacheStream = require('../../lib/cache_stream');
- var fixturePath = pathFn.join(__dirname, 'spawn_test.txt');
- var fixture = 'test content';
-
- before(function(done) {
+const should = require('chai').should(); // eslint-disable-line
+const pathFn = require('path');
+const fs = require('fs');
+const rewire = require('rewire');
+
+describe('spawn', () => {
+ const spawn = require('../../lib/spawn');
+ const CacheStream = require('../../lib/cache_stream');
+ const fixturePath = pathFn.join(__dirname, 'spawn_test.txt');
+ const fixture = 'test content';
+
+ before(done => {
fs.writeFile(fixturePath, fixture, done);
});
- after(function(done) {
+ after(done => {
fs.unlink(fixturePath, done);
});
- it('default', function() {
- return spawn('cat', [fixturePath]).then(function(content) {
- content.should.eql(fixture);
- });
- });
+ it('default', () => spawn('cat', [fixturePath]).then(content => {
+ content.should.eql(fixture);
+ }));
- it('command is required', function() {
+ it('command is required', () => {
try {
spawn();
} catch (err) {
@@ -33,64 +31,62 @@ describe('spawn', function() {
}
});
- it('error', function() {
- return spawn('cat', ['nothing']).catch(function(err) {
- err.message.trim().should.eql('cat: nothing: No such file or directory');
- err.code.should.eql(1);
- });
- });
+ it('error', () => spawn('cat', ['nothing']).catch(err => {
+ err.message.trim().should.eql('cat: nothing: No such file or directory');
+ err.code.should.eql(1);
+ }));
- it('verbose - stdout', function() {
- var spawn = rewire('../../lib/spawn');
- var stdoutCache = new CacheStream();
- var stderrCache = new CacheStream();
- var content = 'something';
+ it('verbose - stdout', () => {
+ const spawn = rewire('../../lib/spawn');
+ const stdoutCache = new CacheStream();
+ const stderrCache = new CacheStream();
+ const content = 'something';
spawn.__set__('process', {
stdout: stdoutCache,
- stderr: stderrCache
+ stderr: stderrCache,
+ removeListener: () => {},
+ on: () => {},
+ exit: () => {}
});
return spawn('echo', [content], {
verbose: true
- }).then(function() {
+ }).then(() => {
stdoutCache.getCache().toString('utf8').trim().should.eql(content);
});
});
- it('verbose - stderr', function() {
- var spawn = rewire('../../lib/spawn');
- var stdoutCache = new CacheStream();
- var stderrCache = new CacheStream();
+ it('verbose - stderr', () => {
+ const spawn = rewire('../../lib/spawn');
+ const stdoutCache = new CacheStream();
+ const stderrCache = new CacheStream();
spawn.__set__('process', {
stdout: stdoutCache,
- stderr: stderrCache
+ stderr: stderrCache,
+ removeListener: () => {},
+ on: () => {},
+ exit: () => {}
});
return spawn('cat', ['nothing'], {
verbose: true
- }).catch(function() {
+ }).catch(() => {
stderrCache.getCache().toString('utf8').trim().should
.eql('cat: nothing: No such file or directory');
});
});
- it('custom encoding', function() {
- return spawn('cat', [fixturePath], {encoding: 'hex'}).then(function(content) {
- content.should.eql(new Buffer(fixture).toString('hex'));
- });
- });
+ it('custom encoding', () => spawn('cat', [fixturePath], {encoding: 'hex'}).then(content => {
+ content.should.eql(Buffer.from(fixture).toString('hex'));
+ }));
- it('encoding = null', function() {
- return spawn('cat', [fixturePath], {encoding: null}).then(function(content) {
- content.should.eql(new Buffer(fixture));
- });
- });
+ it('encoding = null', () => spawn('cat', [fixturePath], {encoding: null}).then(content => {
+ content.should.eql(Buffer.from(fixture));
+ }));
- it('stdio = inherit', function() {
- return spawn('echo', ['something'], {
- stdio: 'inherit'
- });
- });
+ it('stdio = inherit', () => spawn('echo', ['something'], {
+ stdio: 'inherit'
+ }));
});
diff --git a/test/scripts/truncate.js b/test/scripts/truncate.js
index cc29b062..a5f633fe 100644
--- a/test/scripts/truncate.js
+++ b/test/scripts/truncate.js
@@ -1,36 +1,36 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('truncate', function() {
- var truncate = require('../../lib/truncate');
+describe('truncate', () => {
+ const truncate = require('../../lib/truncate');
- it('default', function() {
+ it('default', () => {
truncate('Once upon a time in a world far far away')
.should.eql('Once upon a time in a world...');
});
- it('shorter string', function() {
+ it('shorter string', () => {
truncate('Once upon')
.should.eql('Once upon');
});
- it('truncate', function() {
+ it('truncate', () => {
truncate('Once upon a time in a world far far away', {length: 17})
.should.eql('Once upon a ti...');
});
- it('separator', function() {
+ it('separator', () => {
truncate('Once upon a time in a world far far away', {length: 17, separator: ' '})
.should.eql('Once upon a...');
});
- it('omission', function() {
+ it('omission', () => {
truncate('And they found that many people were sleeping better.', {length: 25, omission: '... (continued)'})
.should.eql('And they f... (continued)');
});
- it('str must be a string', function() {
+ it('str must be a string', () => {
try {
truncate();
} catch (err) {
diff --git a/test/scripts/word_wrap.js b/test/scripts/word_wrap.js
index ec89aed3..96a52d89 100644
--- a/test/scripts/word_wrap.js
+++ b/test/scripts/word_wrap.js
@@ -1,28 +1,28 @@
'use strict';
-var should = require('chai').should(); // eslint-disable-line
+const should = require('chai').should(); // eslint-disable-line
-describe('wordWrap', function() {
- var wordWrap = require('../../lib/word_wrap');
+describe('wordWrap', () => {
+ const wordWrap = require('../../lib/word_wrap');
- it('default', function() {
+ it('default', () => {
wordWrap('Once upon a time').should.eql('Once upon a time');
});
- it('default width', function() {
+ it('default width', () => {
wordWrap('Once upon a time, in a kingdom called Far Far Away, a king fell ill, and finding a successor to the throne turned out to be more trouble than anyone could have imagined...')
.should.eql('Once upon a time, in a kingdom called Far Far Away, a king fell ill, and finding\na successor to the throne turned out to be more trouble than anyone could have\nimagined...');
});
- it('width = 8', function() {
+ it('width = 8', () => {
wordWrap('Once upon a time', {width: 8}).should.eql('Once\nupon a\ntime');
});
- it('width = 1', function() {
+ it('width = 1', () => {
wordWrap('Once upon a time', {width: 1}).should.eql('Once\nupon\na\ntime');
});
- it('str must be a string', function() {
+ it('str must be a string', () => {
try {
wordWrap();
} catch (err) {