140 lines
2.9 KiB
JavaScript
140 lines
2.9 KiB
JavaScript
|
|
import { getRegExp } from './runtime/wxs-polyfill';
|
||
|
|
/* utils */
|
||
|
|
|
||
|
|
/**
|
||
|
|
* addUnit */
|
||
|
|
// 为 css 添加单位
|
||
|
|
function addUnit(value) {
|
||
|
|
const REGEXP = getRegExp('^-?\\d+(.\\d+)?$');
|
||
|
|
if (value == null) {
|
||
|
|
return undefined;
|
||
|
|
}
|
||
|
|
return REGEXP.test(`${value}`) ? `${value}px` : value;
|
||
|
|
}
|
||
|
|
|
||
|
|
function isString(string) {
|
||
|
|
return typeof string === 'string';
|
||
|
|
}
|
||
|
|
|
||
|
|
function isArray(array) {
|
||
|
|
return Array.isArray(array);
|
||
|
|
}
|
||
|
|
|
||
|
|
function isObject(x) {
|
||
|
|
const type = typeof x;
|
||
|
|
return x !== null && (type === 'object' || type === 'function');
|
||
|
|
}
|
||
|
|
|
||
|
|
function isBoolean(value) {
|
||
|
|
return typeof value === 'boolean';
|
||
|
|
}
|
||
|
|
|
||
|
|
const isNoEmptyObj = function (obj) {
|
||
|
|
return isObject(obj) && JSON.stringify(obj) !== '{}';
|
||
|
|
};
|
||
|
|
|
||
|
|
function includes(arr, value) {
|
||
|
|
if (!arr || !isArray(arr)) return false;
|
||
|
|
|
||
|
|
let i = 0;
|
||
|
|
const len = arr.length;
|
||
|
|
|
||
|
|
for (; i < len; i++) {
|
||
|
|
if (arr[i] === value) return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function cls(base, arr) {
|
||
|
|
const res = [base];
|
||
|
|
let i = 0;
|
||
|
|
for (let size = arr.length; i < size; i++) {
|
||
|
|
const item = arr[i];
|
||
|
|
|
||
|
|
if (item && Array.isArray(item)) {
|
||
|
|
const key = arr[i][0];
|
||
|
|
const value = arr[i][1];
|
||
|
|
|
||
|
|
if (value) {
|
||
|
|
res.push(`${base}--${key}`);
|
||
|
|
}
|
||
|
|
} else if (typeof item === 'string' || typeof item === 'number') {
|
||
|
|
if (item) {
|
||
|
|
res.push(`${base}--${item}`);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return res.join(' ');
|
||
|
|
}
|
||
|
|
|
||
|
|
function getBadgeAriaLabel(options) {
|
||
|
|
const maxCount = options.maxCount || 99;
|
||
|
|
if (options.dot) {
|
||
|
|
return '有新的消息';
|
||
|
|
}
|
||
|
|
if (options.count === '...') {
|
||
|
|
return '有很多消息';
|
||
|
|
}
|
||
|
|
if (isNaN(options.count)) {
|
||
|
|
return options.count;
|
||
|
|
}
|
||
|
|
const str1 = `有${maxCount}+条消息`;
|
||
|
|
const str2 = `有${options.count}条消息`;
|
||
|
|
return Number(options.count) > maxCount ? str1 : str2;
|
||
|
|
}
|
||
|
|
|
||
|
|
function endsWith(str, endStr) {
|
||
|
|
return str.slice(-endStr.length) === endStr ? str : str + endStr;
|
||
|
|
}
|
||
|
|
|
||
|
|
function keys(obj) {
|
||
|
|
return JSON.stringify(obj)
|
||
|
|
.replace(getRegExp('{|}|"', 'g'), '')
|
||
|
|
.split(',')
|
||
|
|
.map(item => item.split(':')[0]);
|
||
|
|
}
|
||
|
|
|
||
|
|
function kebabCase(str) {
|
||
|
|
return str
|
||
|
|
.replace(getRegExp('[A-Z]', 'g'), ele => `-${ele}`)
|
||
|
|
.toLowerCase();
|
||
|
|
}
|
||
|
|
|
||
|
|
// eslint-disable-next-line no-underscore-dangle
|
||
|
|
function _style(styles) {
|
||
|
|
if (isArray(styles)) {
|
||
|
|
return styles
|
||
|
|
.filter(item => item != null && item !== '')
|
||
|
|
.map(item => ((isArray(item) || isObject(item)) ? _style(item) : endsWith(item, ';')))
|
||
|
|
.join(' ');
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isObject(styles)) {
|
||
|
|
return keys(styles)
|
||
|
|
.filter(key => styles[key] != null && styles[key] !== '')
|
||
|
|
.map(key => [kebabCase(key), [styles[key]]].join(':'))
|
||
|
|
.join(';');
|
||
|
|
}
|
||
|
|
|
||
|
|
return styles;
|
||
|
|
}
|
||
|
|
|
||
|
|
function isValidIconName(str) {
|
||
|
|
// prettier-ignore
|
||
|
|
return getRegExp('^[A-Za-z0-9-_]+$').test(str);
|
||
|
|
}
|
||
|
|
|
||
|
|
export default {
|
||
|
|
addUnit,
|
||
|
|
isString,
|
||
|
|
isArray,
|
||
|
|
isObject,
|
||
|
|
isBoolean,
|
||
|
|
isNoEmptyObj,
|
||
|
|
includes,
|
||
|
|
cls,
|
||
|
|
getBadgeAriaLabel,
|
||
|
|
_style,
|
||
|
|
isValidIconName,
|
||
|
|
};
|