parse pattern attribute correctly
This commit is contained in:
parent
d4e8911c9c
commit
b2b0ab34dd
2 changed files with 39 additions and 3 deletions
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
var Node = require("../render/node")
|
||||
|
||||
var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[.+?\])/g, attrParser = /\[(.+?)(?:\s*=\s*("|'|)(.*?)\2)?\]/
|
||||
var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g
|
||||
var selectorCache = {}
|
||||
function hyperscript(selector) {
|
||||
if (typeof selector === "string") {
|
||||
|
|
@ -14,8 +14,9 @@ function hyperscript(selector) {
|
|||
else if (type === "#") attributes.id = value
|
||||
else if (type === ".") classes.push(value)
|
||||
else if (match[3][0] === "[") {
|
||||
var pair = attrParser.exec(match[3])
|
||||
attributes[pair[1]] = pair[3] || true
|
||||
var attrValue = match[6]
|
||||
if (attrValue) attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\")
|
||||
attributes[match[4]] = attrValue || true
|
||||
}
|
||||
}
|
||||
if (classes.length > 0) attributes.className = classes.join(" ")
|
||||
|
|
|
|||
|
|
@ -51,6 +51,41 @@ o.spec("hyperscript", function() {
|
|||
o(vnode.tag).equals("div")
|
||||
o(vnode.attrs.a).equals("b")
|
||||
})
|
||||
o("handles attr w/ quoted square bracket", function() {
|
||||
var vnode = m("[a='[b]'].c")
|
||||
|
||||
o(vnode.tag).equals("div")
|
||||
o(vnode.attrs.a).equals("[b]")
|
||||
o(vnode.attrs.className).equals("c")
|
||||
})
|
||||
o("handles attr w/ unmatched square bracket", function() {
|
||||
var vnode = m("[a=']'].c")
|
||||
|
||||
o(vnode.tag).equals("div")
|
||||
o(vnode.attrs.a).equals("]")
|
||||
o(vnode.attrs.className).equals("c")
|
||||
})
|
||||
o("handles attr w/ quoted square bracket and quote", function() {
|
||||
var vnode = m("[a='[b\"\\']'].c") // `[a='[b"\']']`
|
||||
|
||||
o(vnode.tag).equals("div")
|
||||
o(vnode.attrs.a).equals("[b\"']") // `[b"']`
|
||||
o(vnode.attrs.className).equals("c")
|
||||
})
|
||||
o("handles attr w/ quoted square containing escaped square bracket", function() {
|
||||
var vnode = m("[a='[\\]]'].c") // `[a='[\]]']`
|
||||
|
||||
o(vnode.tag).equals("div")
|
||||
o(vnode.attrs.a).equals("[\\]]") // `[\]]`
|
||||
o(vnode.attrs.className).equals("c")
|
||||
})
|
||||
o("handles attr w/ backslashes", function() {
|
||||
var vnode = m("[a='\\\\'].c") // `[a='\\']`
|
||||
|
||||
o(vnode.tag).equals("div")
|
||||
o(vnode.attrs.a).equals("\\")
|
||||
o(vnode.attrs.className).equals("c")
|
||||
})
|
||||
o("handles attr w/ quotes and spaces in selector", function() {
|
||||
var vnode = m("[a = 'b']")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue