Skip to content

Instantly share code, notes, and snippets.

@XiongJingzhi
Last active June 21, 2020 16:49
Show Gist options
  • Save XiongJingzhi/52c1a9b2338bd18526bc186db958a118 to your computer and use it in GitHub Desktop.
Save XiongJingzhi/52c1a9b2338bd18526bc186db958a118 to your computer and use it in GitHub Desktop.
JavaScript utils 代码
https://github.com/cdoco/common-regex
'1231231.4314'.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
会切割小数点后
'1231231.4314'.replace(/(?<!\.\d*)\B(?=(\d{3})+(?!\d))/g, ",")
px 转成 vw
" margin: 42px 15px 15px 15px;".replace(/(\s)(?=\d*px)/g, ' \(').replace(/px/g, 'vw\/3.75\)')
const fs = require('fs')
const path = require('path')
const changeName = (old, removeStirng) => {
const index = old.indexOf(removeStirng)
if (index > 0) {
const suffix = old.slice(old.lastIndexOf('.'))
const newName = old.slice(0, index) + suffix
fs.rename(old, newName, function(err) {
if ( err ) console.log('changeName ERROR: ' + err);
})
}
}
function isFile(dir) {
return fs.statSync(dir).isFile()
}
const getNames = dir => {
return new Promise((res, rej) => {
fs.readdir(dir, (err, files) => {
if (err) {
rej(err)
} else {
const names = files.map(i => path.join(dir, i))
res(names)
}
})
})
}
const parseDir = () => {
const args = process.argv.slice(2)
return [args[0], args[1]]
}
const changeNameAll = (dir, removeStirng) => {
getNames(dir)
.then(names => {
names.forEach(item => {
if (isFile(item)) {
changeName(item, removeStirng)
} else {
changeNameAll(item, removeStirng)
}
})
})
.catch(err => {
console.log('getNames err: ', err)
})
}
const main = () => {
const [dir, removeStirng] = parseDir()
changeNameAll(dir, removeStirng)
}
// 批量改名软件,args 绝对路径 去除特殊字符串
main()
function encodeUTF8(s) {
var i, r = [], c, x;
for (i = 0; i < s.length; i++)
if ((c = s.charCodeAt(i)) < 0x80) r.push(c);
else if (c < 0x800) r.push(0xC0 + (c >> 6 & 0x1F), 0x80 + (c & 0x3F));
else {
if ((x = c ^ 0xD800) >> 10 == 0) //对四字节UTF-16转换为Unicode
c = (x << 10) + (s.charCodeAt(++i) ^ 0xDC00) + 0x10000,
r.push(0xF0 + (c >> 18 & 0x7), 0x80 + (c >> 12 & 0x3F));
else r.push(0xE0 + (c >> 12 & 0xF));
r.push(0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
};
return r;
};
function sha1(s) {
var data = new Uint8Array(encodeUTF8(s))
var i, j, t;
var l = ((data.length + 8) >>> 6 << 4) + 16, s = new Uint8Array(l << 2);
s.set(new Uint8Array(data.buffer)), s = new Uint32Array(s.buffer);
for (t = new DataView(s.buffer), i = 0; i < l; i++)s[i] = t.getUint32(i << 2);
s[data.length >> 2] |= 0x80 << (24 - (data.length & 3) * 8);
s[l - 1] = data.length << 3;
var w = [], f = [
function () { return m[1] & m[2] | ~m[1] & m[3]; },
function () { return m[1] ^ m[2] ^ m[3]; },
function () { return m[1] & m[2] | m[1] & m[3] | m[2] & m[3]; },
function () { return m[1] ^ m[2] ^ m[3]; }
], rol = function (n, c) { return n << c | n >>> (32 - c); },
k = [1518500249, 1859775393, -1894007588, -899497514],
m = [1732584193, -271733879, null, null, -1009589776];
m[2] = ~m[0], m[3] = ~m[1];
for (i = 0; i < s.length; i += 16) {
var o = m.slice(0);
for (j = 0; j < 80; j++)
w[j] = j < 16 ? s[i + j] : rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1),
t = rol(m[0], 5) + f[j / 20 | 0]() + m[4] + w[j] + k[j / 20 | 0] | 0,
m[1] = rol(m[1], 30), m.pop(), m.unshift(t);
for (j = 0; j < 5; j++)m[j] = m[j] + o[j] | 0;
};
t = new DataView(new Uint32Array(m).buffer);
for (var i = 0; i < 5; i++)m[i] = t.getUint32(i << 2);
var hex = Array.prototype.map.call(new Uint8Array(new Uint32Array(m).buffer), function (e) {
return (e < 16 ? "0" : "") + e.toString(16);
}).join("");
return hex;
};
function compress(img) {
// 图片压缩
var canvas = document.createElement('canvas')
var ctx = canvas.getContext('2d')
// 瓦片canvas
var tCanvas = document.createElement('canvas')
var tctx = tCanvas.getContext('2d')
var width = img.width
var height = img.height
// 如果图片大于四百万像素,计算压缩比并将大小压至400万以下
var ratio
if ((ratio = (width * height) / 4000000) > 1) {
ratio = Math.sqrt(ratio)
width /= ratio
height /= ratio
} else {
ratio = 1
}
canvas.width = width
canvas.height = height
// 铺底色
ctx.fillStyle = '#fff'
ctx.fillRect(0, 0, canvas.width, canvas.height)
// 如果图片像素大于100万则使用瓦片绘制
var count
if ((count = (width * height) / 1000000) > 1) {
count = ~~(Math.sqrt(count) + 1) // 计算要分成多少块瓦片
// 计算每块瓦片的宽和高
var nw = ~~(width / count)
var nh = ~~(height / count)
tCanvas.width = nw
tCanvas.height = nh
for (var i = 0; i < count; i++) {
for (var j = 0; j < count; j++) {
tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh)
ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh)
}
}
} else {
ctx.drawImage(img, 0, 0, width, height)
}
// 进行最小压缩
var ndata = canvas.toDataURL('image/jpeg', 0.8)
// console.log('压缩前:' + initSize);
// console.log('压缩后:' + ndata.length);
// console.log('压缩率:' + ~~(100 * (initSize - ndata.length) / initSize) + "%");
tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0
return ndata
}
function getBlob(buffer, format) {
try {
return new Blob(buffer, { type: format })
} catch (e) {
var bb = new (window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MSBlobBuilder)()
buffer.forEach(function(buf) {
bb.append(buf)
})
return bb.getBlob(format)
}
}
function upimg(db) {
return new Promise((resolve, reject) => {
var img = new Image()
img.onload = () => {
db.content.length
var base64 = compress(img)
if (base64.length / db.content.length < 0.02) {
return reject('请控制上传图片大小')
}
var text = window.atob(base64.split(',')[1])
var buffer = new Uint8Array(text.length)
for (var i = 0; i < text.length; i++) {
buffer[i] = text.charCodeAt(i)
}
var blob = getBlob([buffer], db.file.type)
resolve(blob)
}
img.src = db.content
})
}
[...Array(n).keys()]
function ajax(method, url, data, reseponseCallback) {
var r = new XMLHttpRequest()
// 设置请求方法和请求地址
r.open(method, url, true)
// 设置发送的数据的格式
r.setRequestHeader('Content-Type', 'application/json')
// 注册响应函数
r.onreadystatechange = function() {
if (r.readyState === 4) {
// console.log('ready state == 4')
var data = JSON.parse(r.response)
// console.log('ready state. data', data)
reseponseCallback(data)
}
// console.log('on state change', r)
}
// 发送请求
data = JSON.stringify(data)
r.send(data)
}
function timeFormat(timestamp) {
const format = (data) => data > 10 ? data : '0' + data
const time = new Date(timestamp)
const year = time.getFullYear()
let month = time.getMonth() + 1
month = format(month)
let day = time.getDate()
day = format(day)
let hour = time.getHours()
hour = format(hour)
let minute = time.getMinutes()
minute = format(minute)
let second = time.getSeconds()
second = format(second)
return `${year}-${month}-${day} ${hour}:${minute}:${second}`
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment