From 4821735ba242fb0c00b2afa2f144a85dff9c0e56 Mon Sep 17 00:00:00 2001 From: Dustin Cass Date: Thu, 26 Jul 2012 15:47:53 -0700 Subject: [PATCH 1/2] Adjust attribute selector regex to allow for numbers and underscores in attribute names (fixes #863, fixes #876). --- lib/less/parser.js | 8 ++++---- test/css/css-3.css | 3 +++ test/less/css-3.less | 9 ++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/less/parser.js b/lib/less/parser.js index d732e1b1..3aa54882 100644 --- a/lib/less/parser.js +++ b/lib/less/parser.js @@ -542,7 +542,7 @@ less.Parser = function Parser(env) { keyword: function () { var k; - if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { + if (k = $(/^[_A-Za-z-][_A-Za-z0-9-]*/)) { if (tree.colors.hasOwnProperty(k)) { // detect named color return new(tree.Color)(tree.colors[k].slice(1)); @@ -995,7 +995,7 @@ less.Parser = function Parser(env) { if (! $('[')) return; - if (key = $(/^[a-zA-Z-]+/) || $(this.entities.quoted)) { + if (key = $(/^[a-zA-Z0-9_-]+/) || $(this.entities.quoted)) { if ((op = $(/^[|~*$^]?=/)) && (val = $(this.entities.quoted) || $(/^[\w-]+/))) { attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); @@ -1117,7 +1117,7 @@ less.Parser = function Parser(env) { mediaFeatures: function () { var e, features = []; - + do { if (e = $(this.mediaFeature)) { features.push(e); @@ -1127,7 +1127,7 @@ less.Parser = function Parser(env) { if (! $(',')) { break } } } while (e); - + return features.length > 0 ? features : null; }, diff --git a/test/css/css-3.css b/test/css/css-3.css index 45bdc40d..a4497d40 100644 --- a/test/css/css-3.css +++ b/test/css/css-3.css @@ -10,6 +10,9 @@ .other { -moz-transform: translate(0, 11em) rotate(-90deg); } +.item[data-cra_zy-attr1b-ut3=bold] { + font-weight: bold; +} p:not([class*="lead"]) { color: black; } diff --git a/test/less/css-3.less b/test/less/css-3.less index bdda76d0..e8e4c836 100644 --- a/test/less/css-3.less +++ b/test/less/css-3.less @@ -1,4 +1,4 @@ -.comma-delimited { +.comma-delimited { background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg); text-shadow: -1px -1px 1px red, 6px 5px 5px yellow; -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, @@ -12,8 +12,11 @@ .other { -moz-transform: translate(0, 11em) rotate(-90deg); } +.item[data-cra_zy-attr1b-ut3=bold] { + font-weight: bold; +} p:not([class*="lead"]) { - color: black; + color: black; } input[type="text"].class#id[attr=32]:not(1) { @@ -24,7 +27,7 @@ div#id.class[a=1][b=2].class:not(1) { color: white; } -ul.comma > li:not(:only-child)::after { +ul.comma > li:not(:only-child)::after { color: white; } From cb8856fe6f228484b994caa4450af1a502b06791 Mon Sep 17 00:00:00 2001 From: Dustin Cass Date: Thu, 26 Jul 2012 16:28:10 -0700 Subject: [PATCH 2/2] Adjust all regexes in parser.js to use similar style for character classes --- lib/less/parser.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/less/parser.js b/lib/less/parser.js index 3aa54882..e09ce072 100644 --- a/lib/less/parser.js +++ b/lib/less/parser.js @@ -670,7 +670,7 @@ less.Parser = function Parser(env) { color: function () { var rgb; - if (input.charAt(i) === '#' && (rgb = $(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { + if (input.charAt(i) === '#' && (rgb = $(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/))) { return new(tree.Color)(rgb[1]); } }, @@ -756,7 +756,7 @@ less.Parser = function Parser(env) { if (s !== '.' && s !== '#') { return } - while (e = $(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)) { + while (e = $(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)) { elements.push(new(tree.Element)(c, e, i)); c = $('>'); } @@ -821,7 +821,7 @@ less.Parser = function Parser(env) { save(); - if (match = $(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)) { + if (match = $(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)) { name = match[1]; do { @@ -917,7 +917,7 @@ less.Parser = function Parser(env) { var e, t, c, v; c = $(this.combinator); - e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/) || + e = $(/^(?:\d+\.\d+|\d+)%/) || $(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || $('*') || $(this.attribute) || $(/^\([^)@]+\)/); if (! e) { @@ -988,14 +988,14 @@ less.Parser = function Parser(env) { if (elements.length > 0) { return new(tree.Selector)(elements) } }, tag: function () { - return $(/^[a-zA-Z][a-zA-Z-]*[0-9]?/) || $('*'); + return $(/^[A-Za-z][A-Za-z-]*[0-9]?/) || $('*'); }, attribute: function () { var attr = '', key, val, op; if (! $('[')) return; - if (key = $(/^[a-zA-Z0-9_-]+/) || $(this.entities.quoted)) { + if (key = $(/^[_A-Za-z0-9-]+/) || $(this.entities.quoted)) { if ((op = $(/^[|~*$^]?=/)) && (val = $(this.entities.quoted) || $(/^[\w-]+/))) { attr = [key, op, val.toCSS ? val.toCSS() : val].join(''); @@ -1160,7 +1160,7 @@ less.Parser = function Parser(env) { if (rules = $(this.block)) { return new(tree.Directive)(name + " " + types, rules); } - } else if (name = $(/^@[-a-z]+/)) { + } else if (name = $(/^@[a-z-]+/)) { if (name === '@font-face') { if (rules = $(this.block)) { return new(tree.Directive)(name, rules); @@ -1303,7 +1303,7 @@ less.Parser = function Parser(env) { property: function () { var name; - if (name = $(/^(\*?-?[-a-z_0-9]+)\s*:/)) { + if (name = $(/^(\*?-?[_a-z0-9-]+)\s*:/)) { return name[1]; } }