From 68d8c8140fb6ef1118fa2815243817f8e4f55b59 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 19 Nov 2016 11:54:43 +0000 Subject: Move html-paths and document-matchers to styles module --- lib/document-matchers.js | 40 ------------------ lib/document-to-html.js | 2 +- lib/html-paths.js | 75 ---------------------------------- lib/html/ast.js | 2 +- lib/style-reader.js | 4 +- lib/styles/document-matchers.js | 40 ++++++++++++++++++ lib/styles/html-paths.js | 75 ++++++++++++++++++++++++++++++++++ lib/underline.js | 2 +- test/document-matchers.tests.js | 50 ----------------------- test/document-to-html.tests.js | 4 +- test/html-paths.tests.js | 20 --------- test/html/simplify.tests.js | 2 +- test/style-reader.tests.js | 4 +- test/styles/document-matchers.tests.js | 50 +++++++++++++++++++++++ test/styles/html-paths.tests.js | 20 +++++++++ 15 files changed, 195 insertions(+), 195 deletions(-) delete mode 100644 lib/document-matchers.js delete mode 100644 lib/html-paths.js create mode 100644 lib/styles/document-matchers.js create mode 100644 lib/styles/html-paths.js delete mode 100644 test/document-matchers.tests.js delete mode 100644 test/html-paths.tests.js create mode 100644 test/styles/document-matchers.tests.js create mode 100644 test/styles/html-paths.tests.js diff --git a/lib/document-matchers.js b/lib/document-matchers.js deleted file mode 100644 index bdc213c..0000000 --- a/lib/document-matchers.js +++ /dev/null @@ -1,40 +0,0 @@ -exports.paragraph = paragraph; -exports.run = run; -exports.bold = new Matcher("bold"); -exports.italic = new Matcher("italic"); -exports.underline = new Matcher("underline"); -exports.strikethrough = new Matcher("strikethrough"); -exports.commentReference = new Matcher("commentReference"); - - -function paragraph(options) { - return new Matcher("paragraph", options); -} - -function run(options) { - return new Matcher("run", options); -} - -function Matcher(elementType, options) { - options = options || {}; - this._elementType = elementType; - this._styleId = options.styleId; - this._styleName = options.styleName; - if (options.list) { - this._listIndex = options.list.levelIndex; - this._listIsOrdered = options.list.isOrdered; - } -} - -Matcher.prototype.matches = function(element) { - return element.type === this._elementType && - (this._styleId === undefined || element.styleId === this._styleId) && - (this._styleName === undefined || (element.styleName && element.styleName.toUpperCase() === this._styleName.toUpperCase())) && - (this._listIndex === undefined || isList(element, this._listIndex, this._listIsOrdered)); -}; - -function isList(element, levelIndex, isOrdered) { - return element.numbering && - element.numbering.level == levelIndex && - element.numbering.isOrdered == isOrdered; -} diff --git a/lib/document-to-html.js b/lib/document-to-html.js index 6094803..61797a1 100644 --- a/lib/document-to-html.js +++ b/lib/document-to-html.js @@ -2,7 +2,7 @@ var _ = require("underscore"); var promises = require("./promises"); var documents = require("./documents"); -var htmlPaths = require("./html-paths"); +var htmlPaths = require("./styles/html-paths"); var results = require("./results"); var images = require("./images"); var Html = require("./html"); diff --git a/lib/html-paths.js b/lib/html-paths.js deleted file mode 100644 index 8906329..0000000 --- a/lib/html-paths.js +++ /dev/null @@ -1,75 +0,0 @@ -var _ = require("underscore"); - -var html = require("./html"); - -exports.topLevelElement = topLevelElement; -exports.elements = elements; -exports.element = element; - -function topLevelElement(tagName, attributes) { - return elements([element(tagName, attributes, {fresh: true})]); -} - -function elements(elementStyles) { - return new HtmlPath(elementStyles.map(function(elementStyle) { - if (_.isString(elementStyle)) { - return element(elementStyle); - } else { - return elementStyle; - } - })); -} - -function HtmlPath(elements) { - this._elements = elements; -} - -HtmlPath.prototype.wrap = function wrap(children) { - var result = children(); - for (var index = this._elements.length - 1; index >= 0; index--) { - result = this._elements[index].wrapNodes(result); - } - return result; -}; - -function element(tagName, attributes, options) { - options = options || {}; - return new Element(tagName, attributes, options); -} - -function Element(tagName, attributes, options) { - var tagNames = {}; - if (_.isArray(tagName)) { - tagName.forEach(function(tagName) { - tagNames[tagName] = true; - }); - tagName = tagName[0]; - } else { - tagNames[tagName] = true; - } - - this.tagName = tagName; - this.tagNames = tagNames; - this.attributes = attributes || {}; - this.fresh = options.fresh; - this.separator = options.separator; -} - -Element.prototype.matchesElement = function(element) { - return this.tagNames[element.tagName] && _.isEqual(this.attributes || {}, element.attributes || {}); -}; - -Element.prototype.wrap = function wrap(generateNodes) { - return this.wrapNodes(generateNodes()); -}; - -Element.prototype.wrapNodes = function wrapNodes(nodes) { - return [html.elementWithTag(this, nodes)]; -}; - -exports.empty = elements([]); -exports.ignore = { - wrap: function() { - return []; - } -}; diff --git a/lib/html/ast.js b/lib/html/ast.js index db9e690..0dd8120 100644 --- a/lib/html/ast.js +++ b/lib/html/ast.js @@ -1,4 +1,4 @@ -var htmlPaths = require("../html-paths"); +var htmlPaths = require("../styles/html-paths"); function nonFreshElement(tagName, attributes, children) { diff --git a/lib/style-reader.js b/lib/style-reader.js index ba453bd..2889554 100644 --- a/lib/style-reader.js +++ b/lib/style-reader.js @@ -1,8 +1,8 @@ var _ = require("underscore"); var lop = require("lop"); -var documentMatchers = require("./document-matchers"); -var htmlPaths = require("./html-paths"); +var documentMatchers = require("./styles/document-matchers"); +var htmlPaths = require("./styles/html-paths"); var tokenise = require("./styles/parser/tokeniser").tokenise; var results = require("./results"); diff --git a/lib/styles/document-matchers.js b/lib/styles/document-matchers.js new file mode 100644 index 0000000..bdc213c --- /dev/null +++ b/lib/styles/document-matchers.js @@ -0,0 +1,40 @@ +exports.paragraph = paragraph; +exports.run = run; +exports.bold = new Matcher("bold"); +exports.italic = new Matcher("italic"); +exports.underline = new Matcher("underline"); +exports.strikethrough = new Matcher("strikethrough"); +exports.commentReference = new Matcher("commentReference"); + + +function paragraph(options) { + return new Matcher("paragraph", options); +} + +function run(options) { + return new Matcher("run", options); +} + +function Matcher(elementType, options) { + options = options || {}; + this._elementType = elementType; + this._styleId = options.styleId; + this._styleName = options.styleName; + if (options.list) { + this._listIndex = options.list.levelIndex; + this._listIsOrdered = options.list.isOrdered; + } +} + +Matcher.prototype.matches = function(element) { + return element.type === this._elementType && + (this._styleId === undefined || element.styleId === this._styleId) && + (this._styleName === undefined || (element.styleName && element.styleName.toUpperCase() === this._styleName.toUpperCase())) && + (this._listIndex === undefined || isList(element, this._listIndex, this._listIsOrdered)); +}; + +function isList(element, levelIndex, isOrdered) { + return element.numbering && + element.numbering.level == levelIndex && + element.numbering.isOrdered == isOrdered; +} diff --git a/lib/styles/html-paths.js b/lib/styles/html-paths.js new file mode 100644 index 0000000..27bb777 --- /dev/null +++ b/lib/styles/html-paths.js @@ -0,0 +1,75 @@ +var _ = require("underscore"); + +var html = require("../html"); + +exports.topLevelElement = topLevelElement; +exports.elements = elements; +exports.element = element; + +function topLevelElement(tagName, attributes) { + return elements([element(tagName, attributes, {fresh: true})]); +} + +function elements(elementStyles) { + return new HtmlPath(elementStyles.map(function(elementStyle) { + if (_.isString(elementStyle)) { + return element(elementStyle); + } else { + return elementStyle; + } + })); +} + +function HtmlPath(elements) { + this._elements = elements; +} + +HtmlPath.prototype.wrap = function wrap(children) { + var result = children(); + for (var index = this._elements.length - 1; index >= 0; index--) { + result = this._elements[index].wrapNodes(result); + } + return result; +}; + +function element(tagName, attributes, options) { + options = options || {}; + return new Element(tagName, attributes, options); +} + +function Element(tagName, attributes, options) { + var tagNames = {}; + if (_.isArray(tagName)) { + tagName.forEach(function(tagName) { + tagNames[tagName] = true; + }); + tagName = tagName[0]; + } else { + tagNames[tagName] = true; + } + + this.tagName = tagName; + this.tagNames = tagNames; + this.attributes = attributes || {}; + this.fresh = options.fresh; + this.separator = options.separator; +} + +Element.prototype.matchesElement = function(element) { + return this.tagNames[element.tagName] && _.isEqual(this.attributes || {}, element.attributes || {}); +}; + +Element.prototype.wrap = function wrap(generateNodes) { + return this.wrapNodes(generateNodes()); +}; + +Element.prototype.wrapNodes = function wrapNodes(nodes) { + return [html.elementWithTag(this, nodes)]; +}; + +exports.empty = elements([]); +exports.ignore = { + wrap: function() { + return []; + } +}; diff --git a/lib/underline.js b/lib/underline.js index fd5dc0f..3c59d0d 100644 --- a/lib/underline.js +++ b/lib/underline.js @@ -1,4 +1,4 @@ -var htmlPaths = require("./html-paths"); +var htmlPaths = require("./styles/html-paths"); var Html = require("./html"); diff --git a/test/document-matchers.tests.js b/test/document-matchers.tests.js deleted file mode 100644 index b989b2d..0000000 --- a/test/document-matchers.tests.js +++ /dev/null @@ -1,50 +0,0 @@ -var assert = require("assert"); - -var test = require("./test")(module); -var documentMatchers = require("../lib/document-matchers"); -var documents = require("../lib/documents"); -var Paragraph = documents.Paragraph; - -test("paragraph with no options matches any paragraph", function() { - var matcher = documentMatchers.paragraph(); - assert.ok(matcher.matches(new Paragraph())); - assert.ok(matcher.matches(paragraphWithStyle("Heading1", "Heading 1"))); -}); - -test("paragraph style ID only matches paragraphs with that style ID", function() { - var matcher = documentMatchers.paragraph({styleId: "Heading1"}); - assert.ok(!matcher.matches(new Paragraph())); - assert.ok(matcher.matches(paragraphWithStyle("Heading1", "Heading 1"))); - assert.ok(!matcher.matches(paragraphWithStyle("Heading2", "Heading 2"))); -}); - -test("paragraph style name only matches paragraphs with that style name", function() { - var matcher = documentMatchers.paragraph({styleName: "Heading 1"}); - assert.ok(!matcher.matches(new Paragraph())); - assert.ok(matcher.matches(paragraphWithStyle("Heading1", "Heading 1"))); - assert.ok(!matcher.matches(paragraphWithStyle("Heading2", "Heading 2"))); -}); - -test("ordered-list(index) matches an ordered list with specified level index", function() { - var matcher = documentMatchers.paragraph({list: {isOrdered: true, levelIndex: 1}}); - assert.ok(!matcher.matches(new Paragraph())); - assert.ok(matcher.matches(new Paragraph([], {numbering: {level: 1, isOrdered: true}}))); - assert.ok(!matcher.matches(new Paragraph([], {numbering: {level: 0, isOrdered: true}}))); - assert.ok(!matcher.matches(new Paragraph([], {numbering: {level: 1, isOrdered: false}}))); -}); - -test("unordered-list(index) matches an unordered list with specified level index", function() { - var matcher = documentMatchers.paragraph({list: {isOrdered: false, levelIndex: 1}}); - assert.ok(!matcher.matches(new Paragraph())); - assert.ok(matcher.matches(new Paragraph([], {numbering: {level: 1, isOrdered: false}}))); - assert.ok(!matcher.matches(new Paragraph([], {numbering: {level: 1, isOrdered: true}}))); -}); - -test("matchers for lists with index 0 do not match elements that are not lists", function() { - var matcher = documentMatchers.paragraph({list: {isOrdered: true, levelIndex: 0}}); - assert.ok(!matcher.matches(new Paragraph())); -}); - -function paragraphWithStyle(styleId, styleName) { - return new Paragraph([], {styleId: styleId, styleName: styleName}); -} diff --git a/test/document-to-html.tests.js b/test/document-to-html.tests.js index 6283b1a..b7a0251 100644 --- a/test/document-to-html.tests.js +++ b/test/document-to-html.tests.js @@ -6,10 +6,10 @@ var documentToHtml = require("../lib/document-to-html"); var DocumentConverter = documentToHtml.DocumentConverter; var commentAuthorLabel = documentToHtml.commentAuthorLabel; var test = require("./test")(module); -var htmlPaths = require("../lib/html-paths"); +var htmlPaths = require("../lib/styles/html-paths"); var xml = require("../lib/xml"); var results = require("../lib/results"); -var documentMatchers = require("../lib/document-matchers"); +var documentMatchers = require("../lib/styles/document-matchers"); var Html = require("../lib/html"); diff --git a/test/html-paths.tests.js b/test/html-paths.tests.js deleted file mode 100644 index 8d75b7c..0000000 --- a/test/html-paths.tests.js +++ /dev/null @@ -1,20 +0,0 @@ -var assert = require("assert"); - -var test = require("./test")(module); -var htmlPaths = require("../lib/html-paths"); - - -test("element can match multiple tag names", function() { - var pathPart = htmlPaths.element(["ul", "ol"]); - assert.ok(pathPart.matchesElement({tagName: "ul"})); - assert.ok(pathPart.matchesElement({tagName: "ol"})); - assert.ok(!pathPart.matchesElement({tagName: "p"})); -}); - -test("element matches if attributes are the same", function() { - var pathPart = htmlPaths.element(["p"], {"class": "tip"}); - assert.ok(!pathPart.matchesElement({tagName: "p"})); - assert.ok(!pathPart.matchesElement({tagName: "p", attributes: {"class": "tip help"}})); - assert.ok(pathPart.matchesElement({tagName: "p", attributes: {"class": "tip"}})); -}); - diff --git a/test/html/simplify.tests.js b/test/html/simplify.tests.js index cec4dc5..85d2eb9 100644 --- a/test/html/simplify.tests.js +++ b/test/html/simplify.tests.js @@ -4,7 +4,7 @@ var _ = require("underscore"); var test = require("../test")(module); var html = require("../../lib/html"); -var htmlPaths = require("../../lib/html-paths"); +var htmlPaths = require("../../lib/styles/html-paths"); var nonFreshElement = html.nonFreshElement; var text = html.text; diff --git a/test/style-reader.tests.js b/test/style-reader.tests.js index 3fb5f1f..372e649 100644 --- a/test/style-reader.tests.js +++ b/test/style-reader.tests.js @@ -1,6 +1,6 @@ var assert = require("assert"); -var htmlPaths = require("../lib/html-paths"); -var documentMatchers = require("../lib/document-matchers"); +var htmlPaths = require("../lib/styles/html-paths"); +var documentMatchers = require("../lib/styles/document-matchers"); var styleReader = require("../lib/style-reader"); var results = require("../lib/results"); var test = require("./test")(module); diff --git a/test/styles/document-matchers.tests.js b/test/styles/document-matchers.tests.js new file mode 100644 index 0000000..e36298c --- /dev/null +++ b/test/styles/document-matchers.tests.js @@ -0,0 +1,50 @@ +var assert = require("assert"); + +var test = require("../test")(module); +var documentMatchers = require("../../lib/styles/document-matchers"); +var documents = require("../../lib/documents"); +var Paragraph = documents.Paragraph; + +test("paragraph with no options matches any paragraph", function() { + var matcher = documentMatchers.paragraph(); + assert.ok(matcher.matches(new Paragraph())); + assert.ok(matcher.matches(paragraphWithStyle("Heading1", "Heading 1"))); +}); + +test("paragraph style ID only matches paragraphs with that style ID", function() { + var matcher = documentMatchers.paragraph({styleId: "Heading1"}); + assert.ok(!matcher.matches(new Paragraph())); + assert.ok(matcher.matches(paragraphWithStyle("Heading1", "Heading 1"))); + assert.ok(!matcher.matches(paragraphWithStyle("Heading2", "Heading 2"))); +}); + +test("paragraph style name only matches paragraphs with that style name", function() { + var matcher = documentMatchers.paragraph({styleName: "Heading 1"}); + assert.ok(!matcher.matches(new Paragraph())); + assert.ok(matcher.matches(paragraphWithStyle("Heading1", "Heading 1"))); + assert.ok(!matcher.matches(paragraphWithStyle("Heading2", "Heading 2"))); +}); + +test("ordered-list(index) matches an ordered list with specified level index", function() { + var matcher = documentMatchers.paragraph({list: {isOrdered: true, levelIndex: 1}}); + assert.ok(!matcher.matches(new Paragraph())); + assert.ok(matcher.matches(new Paragraph([], {numbering: {level: 1, isOrdered: true}}))); + assert.ok(!matcher.matches(new Paragraph([], {numbering: {level: 0, isOrdered: true}}))); + assert.ok(!matcher.matches(new Paragraph([], {numbering: {level: 1, isOrdered: false}}))); +}); + +test("unordered-list(index) matches an unordered list with specified level index", function() { + var matcher = documentMatchers.paragraph({list: {isOrdered: false, levelIndex: 1}}); + assert.ok(!matcher.matches(new Paragraph())); + assert.ok(matcher.matches(new Paragraph([], {numbering: {level: 1, isOrdered: false}}))); + assert.ok(!matcher.matches(new Paragraph([], {numbering: {level: 1, isOrdered: true}}))); +}); + +test("matchers for lists with index 0 do not match elements that are not lists", function() { + var matcher = documentMatchers.paragraph({list: {isOrdered: true, levelIndex: 0}}); + assert.ok(!matcher.matches(new Paragraph())); +}); + +function paragraphWithStyle(styleId, styleName) { + return new Paragraph([], {styleId: styleId, styleName: styleName}); +} diff --git a/test/styles/html-paths.tests.js b/test/styles/html-paths.tests.js new file mode 100644 index 0000000..ab24cec --- /dev/null +++ b/test/styles/html-paths.tests.js @@ -0,0 +1,20 @@ +var assert = require("assert"); + +var test = require("../test")(module); +var htmlPaths = require("../../lib/styles/html-paths"); + + +test("element can match multiple tag names", function() { + var pathPart = htmlPaths.element(["ul", "ol"]); + assert.ok(pathPart.matchesElement({tagName: "ul"})); + assert.ok(pathPart.matchesElement({tagName: "ol"})); + assert.ok(!pathPart.matchesElement({tagName: "p"})); +}); + +test("element matches if attributes are the same", function() { + var pathPart = htmlPaths.element(["p"], {"class": "tip"}); + assert.ok(!pathPart.matchesElement({tagName: "p"})); + assert.ok(!pathPart.matchesElement({tagName: "p", attributes: {"class": "tip help"}})); + assert.ok(pathPart.matchesElement({tagName: "p", attributes: {"class": "tip"}})); +}); + -- cgit v1.2.3