octo-deno/lib/utils/common.js

135 lines
3.2 KiB
JavaScript
Raw Normal View History

2017-04-22 22:49:49 +00:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const entities = new (require('html-entities').XmlEntities)()
2018-03-21 21:04:57 +00:00
const jsesc = require('jsesc')
2018-03-19 04:54:40 +00:00
const utils = require('../utils')
class common extends utils {
/**
* Escape and quote a string
2018-08-13 14:59:05 +00:00
* @param s - String to be quoted
* @param {boolean} html - Identifies whether the string must be HTML safe
* @returns {*}
*/
static quote (s, html = false) {
const options = {
minimal: true,
isScriptContext: html
}
2018-04-07 15:14:40 +00:00
if (typeof s === 'string') {
return `'${jsesc(s, options)}'`
2018-04-07 15:14:40 +00:00
} else {
return jsesc(s, options)
2018-04-07 15:14:40 +00:00
}
}
2018-08-29 21:46:46 +00:00
/**
* Remove quotes and escape sequence from string
* @param {string} s
* @returns {string}
*/
static unquote (s) {
return s.replace(/\\'/g, '\'')
.replace(/\\"/g, '"')
.replace(/\\0/g, '\0')
.replace(/\\\\/g, '\\')
.replace(/(^['|"])(.*)\1$/gm, '$2')
}
2018-08-13 14:59:05 +00:00
/**
* Unicode safe b64 encoding
* https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
* @param {string} str
* @returns {*}
*/
static b64encode (str) {
2018-05-14 17:49:08 +00:00
if (process.browser) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
function toSolidBytes (match, p1) {
// noinspection JSCheckFunctionSignatures
2018-08-29 22:05:55 +00:00
return String.fromCharCode(`0x${p1}`)
2018-05-14 17:49:08 +00:00
})
)
} else {
return Buffer.from(str).toString('base64')
}
}
2018-08-13 14:59:05 +00:00
/**
* Unicode safe b64 decoding
* https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
* @param {string} str
* @returns {*}
*/
static b64decode (str) {
2018-05-14 17:49:08 +00:00
if (process.browser) {
return decodeURIComponent(atob(str).split('').map(function (c) {
2018-05-21 15:50:44 +00:00
return `%${('00' + c.charCodeAt(0).toString(16)).slice(-2)}`
2018-05-14 17:49:08 +00:00
}).join(''))
} else {
return Buffer.from(str, 'base64').toString('ascii')
}
}
2018-08-29 21:51:20 +00:00
/**
* Escape special characters using HTML entities
* @param {string} str
* @returns {string}
*/
2018-08-29 22:06:10 +00:00
static htmlEscape (str) {
return entities.encode(str)
2018-08-29 21:51:20 +00:00
}
/**
* Remove HTML entities from string
* @param {string} str
* @returns {string}
*/
2018-08-29 22:06:10 +00:00
static htmlUnescape (str) {
return entities.decode(str)
2018-08-29 21:51:20 +00:00
}
2018-08-13 14:59:05 +00:00
/**
* Remove duplicate items from a list
* @param {Array} list
* @returns {Array}
*/
static uniqueList (list) {
2018-08-29 22:06:27 +00:00
return list.filter((v, i, a) => a.indexOf(v) === i)
}
2018-08-13 14:59:05 +00:00
/**
* Merge two objects recursively
* @param {Object} obj1
* @param {Object} obj2
* @returns {*}
*/
static mergeHash (obj1, obj2) {
2017-04-22 22:49:49 +00:00
for (let p in obj2) {
try {
2017-04-25 15:22:15 +00:00
if (obj2[p].constructor === Object) {
obj1[p] = utils.common.mergeHash(obj1[p], obj2[p])
2017-04-22 22:49:49 +00:00
} else {
obj1[p] = obj2[p]
2017-04-22 22:49:49 +00:00
}
} catch (e) {
obj1[p] = obj2[p]
2017-04-22 22:49:49 +00:00
}
}
return obj1
}
2018-08-13 14:59:05 +00:00
/**
* Template string beautifier
* @param {Object} obj
* @returns {string}
*/
static mockup (obj) {
return obj.split('\n').map((ln) => ln.trim()).join('')
}
}
module.exports = common