summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-11-14 20:52:26 +0000
committerMichael Williamson <mike@zwobble.org>2016-11-14 20:52:26 +0000
commitacc7639ea2f58df6059ab00dc3c9620460a03083 (patch)
tree54c08f220540deb4107c63b67b48160ebe9eb06a
parent6554612c305bfd75116b00ed89d0f3b104b1a3ca (diff)
Read separators in HTML paths
-rw-r--r--lib/html-paths.js1
-rw-r--r--lib/style-reader.js35
-rw-r--r--test/style-reader.tests.js7
3 files changed, 34 insertions, 9 deletions
diff --git a/lib/html-paths.js b/lib/html-paths.js
index 5a00cd8..8906329 100644
--- a/lib/html-paths.js
+++ b/lib/html-paths.js
@@ -52,6 +52,7 @@ function Element(tagName, attributes, options) {
this.tagNames = tagNames;
this.attributes = attributes || {};
this.fresh = options.fresh;
+ this.separator = options.separator;
}
Element.prototype.matchesElement = function(element) {
diff --git a/lib/style-reader.js b/lib/style-reader.js
index 95fe81d..370b5b6 100644
--- a/lib/style-reader.js
+++ b/lib/style-reader.js
@@ -64,13 +64,6 @@ function documentMatcherRule() {
}
);
- var stringRule = lop.rules.then(
- lop.rules.tokenOfType("string"),
- function(value) {
- return value;
- }
- );
-
var styleNameRule = lop.rules.then(
lop.rules.sequence(
lop.rules.tokenOfType("open-square-bracket"),
@@ -157,6 +150,19 @@ function htmlPathRule() {
}
);
+ var separatorRule = lop.rules.then(
+ lop.rules.optional(lop.rules.sequence(
+ lop.rules.tokenOfType("colon"),
+ lop.rules.token("identifier", "separator"),
+ lop.rules.tokenOfType("open-paren"),
+ capture(stringRule),
+ lop.rules.tokenOfType("close-paren")
+ ).head()),
+ function(option) {
+ return option.valueOrElse("");
+ }
+ );
+
var tagNamesRule = lop.rules.oneOrMoreWithSeparator(
identifierRule,
lop.rules.tokenOfType("choice")
@@ -165,8 +171,9 @@ function htmlPathRule() {
var styleElementRule = lop.rules.sequence(
capture(tagNamesRule),
capture(lop.rules.zeroOrMore(classRule)),
- capture(freshRule)
- ).map(function(tagName, classNames, fresh) {
+ capture(freshRule),
+ capture(separatorRule)
+ ).map(function(tagName, classNames, fresh, separator) {
var attributes = {};
var options = {};
if (classNames.length > 0) {
@@ -175,6 +182,9 @@ function htmlPathRule() {
if (fresh) {
options.fresh = true;
}
+ if (separator) {
+ options.separator = separator;
+ }
return htmlPaths.element(tagName, attributes, options);
});
@@ -199,6 +209,13 @@ function htmlPathRule() {
var identifierRule = lop.rules.tokenOfType("identifier");
var integerRule = lop.rules.tokenOfType("integer");
+var stringRule = lop.rules.then(
+ lop.rules.tokenOfType("string"),
+ function(value) {
+ return value;
+ }
+);
+
var classRule = lop.rules.then(
lop.rules.tokenOfType("cssClassName"),
function(text) {
diff --git a/test/style-reader.tests.js b/test/style-reader.tests.js
index 46c2ace..b4363f0 100644
--- a/test/style-reader.tests.js
+++ b/test/style-reader.tests.js
@@ -61,6 +61,13 @@ test('styleReader.readHtmlPath', {
assertHtmlPath("p:fresh", expected);
},
+ 'reads separator for elements': function() {
+ var expected = htmlPaths.elements([
+ htmlPaths.element("p", {}, {separator: "x"})
+ ]);
+ assertHtmlPath("p:separator('x')", expected);
+ },
+
'reads ignore element': function() {
assertHtmlPath("!", htmlPaths.ignore);
}