/* @flow */

const fnExpRE = /^\s*([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/
const simplePathRE = /^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?']|\[".*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*\s*$/ // keyCode aliases
const keyCodes = {
esc: 27,
tab: 9,
enter: 13,
space: 32,
up: 38,
left: 37,
right: 39,
down: 40,
'delete': [8, 46]
} const modifierCode = {
stop: '$event.stopPropagation();',
prevent: '$event.preventDefault();',
self: 'if($event.target !== $event.currentTarget)return;'
} const isMouseEventRE = /^mouse|^pointer|^(click|dblclick|contextmenu|wheel)$/
const mouseEventModifierCode = {
ctrl: 'if(!$event.ctrlKey)return;',
shift: 'if(!$event.shiftKey)return;',
alt: 'if(!$event.altKey)return;',
meta: 'if(!$event.metaKey)return;'
} export function genHandlers (events: ASTElementHandlers, native?: boolean): string {
let res = native ? 'nativeOn:{' : 'on:{'
for (const name in events) {
res += `"${name}":${genHandler(name, events[name])},`
}
return res.slice(0, -1) + '}'
} function genHandler (
name: string,
handler: ASTElementHandler | Array<ASTElementHandler>
): string {
if (!handler) {
return 'function(){}'
} else if (Array.isArray(handler)) {
return `[${handler.map(handler => genHandler(name, handler)).join(',')}]`
} else if (!handler.modifiers) {
return fnExpRE.test(handler.value) || simplePathRE.test(handler.value)
? handler.value
: `function($event){${handler.value}}`
} else {
let code = ''
const keys = []
const isMouseEvnet = isMouseEventRE.test(name)
for (const key in handler.modifiers) {
if (modifierCode[key]) {
code += modifierCode[key]
} else if (isMouseEvnet && mouseEventModifierCode[key]) {
code += mouseEventModifierCode[key]
} else {
keys.push(key)
}
}
if (keys.length) {
code = genKeyFilter(keys) + code
}
const handlerCode = simplePathRE.test(handler.value)
? handler.value + '($event)'
: handler.value
return 'function($event){' + code + handlerCode + '}'
}
} function genKeyFilter (keys: Array<string>): string {
const code = keys.length === 1
? normalizeKeyCode(keys[0])
: Array.prototype.concat.apply([], keys.map(normalizeKeyCode))
if (Array.isArray(code)) {
return `if(${code.map(c => `$event.keyCode!==${c}`).join('&&')})return;`
} else {
return `if($event.keyCode!==${code})return;`
}
} function normalizeKeyCode (key) {
return (
parseInt(key, 10) || // number keyCode
keyCodes[key] || // built-in alias
`_k(${JSON.stringify(key)})` // custom alias
)
}

最新文章

  1. Android使用静默安装时碰见的问题
  2. Java三大框架之——Hibernate
  3. ppmoney
  4. JavaWeb笔记——JSTL标签
  5. easyui-dialog中文件上传处理
  6. 【hadoop代码笔记】Mapreduce shuffle过程之Map输出过程
  7. python3之序列化(pickle&amp;json&amp;shelve)
  8. Codeforces 768A Oath of the Night&#39;s Watch
  9. Problem : (1.2.1) Text Reverse
  10. Jvm垃圾回收器(终结篇)
  11. MDK5报错missing closing quote
  12. 一起学习造轮子(二):从零开始写一个Redux
  13. BIM 3D 数据交换格式 ----张建平(清华女)
  14. 线性判别分析(Linear Discriminant Analysis, LDA)算法分析
  15. 获取FirefoxProfile配置文件以及使用方法介绍
  16. ubuntu13.10更换源
  17. Iterator 和 Iterable 区别和联系
  18. docker微服务部署之:三,搭建Zuul微服务项目
  19. Unity 游戏框架搭建 (八) 减少加班利器-QLog
  20. Ubuntu 16.04.5下FFmpeg编译与开发环境搭建

热门文章

  1. 4.windows如何导入python包
  2. PHP指定概率算法
  3. 【pycharm】pycharm中设置virtualenv的虚拟环境为开发环境
  4. php中0与空 Null false的区别
  5. Rails的HashWithIndifferentAccess
  6. WebApi_返回Post格式数据
  7. qq空间相册下载
  8. 20145118 《Java程序设计》第1周学习总结
  9. CSS3动画库——animate.css
  10. Kubernetes证书相关(CFSSL)