blob: 57ec1ab66b68097d31b858718c02faf273fa3a14 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global Image */
'use strict'
// const WEAPP_STYLE_ID = 'weapp-style'
import '../../../shared/objectAssign'
export {
extend,
def,
remove,
hasOwn,
bind,
toArray,
isObject,
isPlainObject,
typof
} from '../../../frameworks/legacy/util'
import { isArray, slice } from './array'
export { isArray, slice }
export const vendors = ['ms', 'moz', 'webkit', 'o']
let _isWebpSupported = false
; (function isSupportWebp () {
try {
const webP = new Image()
webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdA'
+ 'SoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'
webP.onload = function () {
if (webP.height === 2) {
_isWebpSupported = true
}
}
}
catch (e) {
// do nothing.
}
})()
let _isStickySupported = false
; (function isSupportSticky () {
const element = document.createElement('div')
const elementStyle = element.style
elementStyle.cssText = vendors.concat(['']).map(function (vendor) {
return 'position:'
+ (vendor ? '-' + vendor + '-' : '')
+ 'sticky'
}).join(';') + ';'
_isStickySupported = elementStyle.position.indexOf('sticky') !== -1
})()
// export function extend (to, from) {
// for (const key in from) {
// to[key] = from[key]
// }
// return to
// }
// export function isPlainObject (obj) {
// return Object.prototype.toString.call(obj)
// .slice(8, -1).toLowerCase() === 'object'
// }
export function getType (obj) {
return Object.prototype.toString.call(obj)
.slice(8, -1).toLowerCase()
}
export function appendStyle (css, styleId, replace) {
let style = document.getElementById(styleId)
if (style && replace) {
style.parentNode.removeChild(style)
style = null
}
if (!style) {
style = document.createElement('style')
style.type = 'text/css'
styleId && (style.id = styleId)
document.getElementsByTagName('head')[0].appendChild(style)
}
style.appendChild(document.createTextNode(css))
}
export function getUniqueFromArray (arr) {
if (!isArray(arr)) {
return []
}
const res = []
const unique = {}
let val
for (let i = 0, l = arr.length; i < l; i++) {
val = arr[i]
if (unique[val]) {
continue
}
unique[val] = true
res.push(val)
}
return res
}
export function detectWebp () {
return _isWebpSupported
}
export function detectSticky () {
return _isStickySupported
}
export function getRandom (num) {
const _defaultNum = 10
if (typeof num !== 'number' || num <= 0) {
num = _defaultNum
}
const _max = Math.pow(10, num)
return Math.floor(Date.now() + Math.random() * _max) % _max
}
export function getRgb (color) {
let match
color = color + ''
match = color.match(/#([\da-fA-F]{2})([\da-fA-F]{2})([\da-fA-F]{2})/)
if (match) {
return {
r: parseInt(match[1], 16),
g: parseInt(match[2], 16),
b: parseInt(match[3], 16)
}
}
match = color.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/)
if (match) {
return {
r: parseInt(match[1]),
g: parseInt(match[2]),
b: parseInt(match[3])
}
}
}
// direction: 'l' | 'r', default is 'r'
// num: how many times to loop, should be a positive integer
export function loopArray (arr, num, direction) {
if (!isArray(arr)) {
return
}
let isLeft = (direction + '').toLowerCase() === 'l'
const len = arr.length
num = num % len
if (num < 0) {
num = -num
isLeft = !isLeft
}
if (num === 0) {
return arr
}
let lp, rp
if (isLeft) {
lp = arr.slice(0, num)
rp = arr.slice(num)
}
else {
lp = arr.slice(0, len - num)
rp = arr.slice(len - num)
}
return rp.concat(lp)
}
export function throttle (func, wait) {
let result
let timerId = null
let previous = 0
let context
let args
const later = function () {
previous = Date.now()
timerId = null
result = func.apply(context, args)
}
return function () {
const now = Date.now()
const remaining = wait - (now - previous)
context = this
args = Array.prototype.slice.call(arguments)
if (remaining <= 0) {
clearTimeout(timerId)
timerId = null
previous = now
result = func.apply(context, args)
}
else if (!timerId) {
timerId = setTimeout(later, remaining)
}
return result
}
}
export function camelToKebab (name) {
if (!name) { return '' }
return name.replace(/([A-Z])/g, function (g, g1) {
return `-${g1.toLowerCase()}`
})
}
export function kebabToCamel (name) {
if (!name) { return '' }
return name.replace(/-([a-z])/g, function (g, g1) {
console.log(g1)
return `${g1.toUpperCase()}`
})
}
export function findEnterKeyType (key) {
const keys = ['default', 'go', 'next', 'search', 'send']
if (keys.indexOf(key) > -1) {
return key
}
return 'done'
}