Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 21x 21x 18x 3x 3x 15x 3x 3x 1x 11x 3x 11x 2x 2x 1x 1x 11x 11x 11x 11x 11x 11x 11x 11x | /**
* @license MIT
* @author IFYates <https://github.com/ifyates/pow.js>
* @description A very small and lightweight templating framework.
* @version 3.7.3
*/
import pow from "./pow.js"
/**
* Provides basic interpolation of values
*
* Supports property walking and 0-argument functions
*/
function _eval(template, data, root) {
const period = template.indexOf('.')
if (period < 0) {
if (template.endsWith('()')) {
const fn = _eval(template.slice(0, -2), data, root ??= data)
return typeof fn == 'function' ? fn(root.$data, root) : undefined
}
return data?.hasOwnProperty(template) ? data[template]
: template == 'length' && typeof data == 'object' ? Object.keys(data).length
: !root ? window[template] : undefined
}
const value = _eval(template.slice(0, period), data, root ??= data)
return _eval(template.slice(period + 1), value, root)
}
pow._eval = _eval
/**
* Rebinds event listeners on bound range after each apply
*/
function rebindEvents(element) {
const attrs = [...element.querySelectorAll('*')].map($ => [...$.attributes]).flat()
.filter($ => $.name.startsWith('on'))
for (const { ownerElement, name, value } of attrs) {
const match = /^(\$pow.+?)\.(.*?)\(/.exec(value)
if (match) {
ownerElement.addEventListener(name.slice(2), () => window[match[1]][match[2]](ownerElement))
ownerElement.removeAttribute(name)
}
}
}
function bind(element) {
const binding = pow.bind(element)
const apply = binding.apply
binding.apply = (data) => {
const result = apply(data)
rebindEvents(element)
return result
}
return binding
}
// pow.safe
export default {
apply: (element, data) => bind(element).apply(data),
bind,
_eval
} |