diff --git a/lib/cache_stream.js b/lib/cache_stream.js index 640d9412..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 : Buffer.from(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..6008b910 100644 --- a/lib/camel_case_keys.js +++ b/lib/camel_case_keys.js @@ -1,8 +1,8 @@ 'use strict'; -var camelCase = require('camel-case'); +const camelCase = require('camel-case'); -var rPrefixUnderscore = /^(_+)/; +const rPrefixUnderscore = /^(_+)/; function getter(key) { return function() { @@ -19,17 +19,17 @@ function setter(key) { 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 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, len = keys.length; i < len; i++) { + const key = keys[i]; + const value = obj[key]; + const match = key.match(rPrefixUnderscore); + let newKey; if (match) { - var underscore = match[1]; + const underscore = match[1]; newKey = underscore + camelCase(key.substring(underscore.length)); } else { newKey = camelCase(key); @@ -39,8 +39,12 @@ function camelCaseKeys(obj) { result[key] = value; } else { result[newKey] = value; - result.__defineGetter__(key, getter(newKey)); - result.__defineSetter__(key, setter(newKey)); + Object.defineProperty(result, key, { + get: getter(newKey), + set: setter(newKey), + configurable: true, + enumerable: true + }); } } diff --git a/lib/escape_diacritic.js b/lib/escape_diacritic.js index 2b39d827..5e94465d 100644 --- a/lib/escape_diacritic.js +++ b/lib/escape_diacritic.js @@ -1,6 +1,6 @@ 'use strict'; -var defaultDiacriticsRemovalap = [ +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'}, @@ -89,12 +89,12 @@ var defaultDiacriticsRemovalap = [ {'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; } } @@ -104,9 +104,7 @@ function escapeDiacritic(str) { // http://stackoverflow.com/a/18391901 // eslint-disable-next-line no-control-regex - return str.replace(/[^\u0000-\u007E]/g, function(a) { - return diacriticsMap[a] || a; - }); + 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 f094eb66..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/hash.js b/lib/hash.js index 4a7197e6..3112a588 100644 --- a/lib/hash.js +++ b/lib/hash.js @@ -1,9 +1,9 @@ 'use strict'; -var Transform = require('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); @@ -23,8 +23,8 @@ HashStream.prototype._flush = function(callback) { callback(); }; -exports.hash = function(content) { - var hash = crypto.createHash(ALGORITHM); +exports.hash = content => { + const hash = crypto.createHash(ALGORITHM); hash.update(content); return hash.digest(); }; diff --git a/lib/highlight.js b/lib/highlight.js index f97d73fd..42fa2aa9 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'); -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 = options.hasOwnProperty('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) + '
'; + numbers += `${firstLine + i}
`; content += formatLine(line, firstLine + i, mark, options); } - result += '
'; + let result = `
`; if (caption) { - result += '
' + caption + '
'; + result += `
${caption}
`; } result += ''; if (gutter) { - result += ''; + result += ``; } - result += ''; + result += ``; result += '
' + numbers + '
${numbers}
' + before + content + after + '${before}${content}${after}
'; 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; + 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; diff --git a/lib/html_tag.js b/lib/html_tag.js index 85510fa7..8c7541f2 100644 --- a/lib/html_tag.js +++ b/lib/html_tag.js @@ -3,16 +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] !== undefined - && attrs[i] !== null - ) result += ' ' + i + '="' + attrs[i] + '"'; + for (const i in attrs) { + if (attrs[i] != null) result += ` ${i}="${attrs[i]}"`; } - result += text == null ? '>' : '>' + text + ''; + result += text == null ? '>' : `>${text}`; return result; } diff --git a/lib/index.js b/lib/index.js index eb8fd2ea..1ec2f755 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'); diff --git a/lib/pattern.js b/lib/pattern.js index f9d07756..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) + const regex = escapeRegExp(rule) .replace(/\\([*?])/g, '$1') - .replace(rParam, function(match, operator, name) { - var str = ''; + .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..d574866e 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]; + 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 73755c46..0a749a7c 100644 --- a/lib/slugize.js +++ b/lib/slugize.js @@ -1,27 +1,26 @@ 'use strict'; -var escapeDiacritic = require('./escape_diacritic'); -var escapeRegExp = require('./escape_regexp'); +const escapeDiacritic = require('./escape_diacritic'); +const escapeRegExp = require('./escape_regexp'); // eslint-disable-next-line no-control-regex -var rControl = /[\u0000-\u001f]/g; -var rSpecial = /[\s~`!@#$%^&*()\-_+=[\]{}|\\;:"'<>,.?/]+/g; +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) { case 1: 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; -