From 189efd48b025a0494c7dd1c4fbdd70bd9dac2dd2 Mon Sep 17 00:00:00 2001 From: Leonardo Matos Date: Mon, 10 Sep 2018 13:35:12 -0300 Subject: [PATCH 1/4] Simple version for browser compatibility with vanilla JS --- src/browser-vanilla.js | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/browser-vanilla.js diff --git a/src/browser-vanilla.js b/src/browser-vanilla.js new file mode 100644 index 0000000..28f5d90 --- /dev/null +++ b/src/browser-vanilla.js @@ -0,0 +1,49 @@ +// Simple version for browser compatibility with vanilla JS +// Original (with Lodash 3): ./index.js + +(function () { + 'use strict' + + /** + * Queries the whole Refract tree and finds a respective + * element(s) which matches the query. + */ + var query = function (element, elementQuery) { + if (typeof element !== 'object' || element === null || !Array.isArray(element.content)) { + return [] + } + + var results = [] + // find elements + for (var i = 0; i < element.content.length; i++) { + var el = element.content[i] + // go deep + var nested = query(el, elementQuery) + for (var ii = 0; ii < nested.length; ii++) { + results.push(nested[ii]) + } + + var skip = false + for (var prop in elementQuery) { + if (elementQuery.hasOwnProperty(prop) && el[prop] !== elementQuery[prop]) { + skip = true + break + } + } + if (!skip) { + // matched + results.push(el) + } + } + + return results + } + + if (typeof module !== 'undefined' && module.exports) { + // NodeJS + module.exports = query + } else { + // declare globally + window.refractQuery = query + } +}()) From a97f6aa54c9d0feb60841112b445a734ff401f57 Mon Sep 17 00:00:00 2001 From: Leonardo Matos Date: Mon, 10 Sep 2018 15:45:07 -0300 Subject: [PATCH 2/4] set find function for recursion, support checking string or number within array --- src/browser-vanilla.js | 57 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/src/browser-vanilla.js b/src/browser-vanilla.js index 28f5d90..c253795 100644 --- a/src/browser-vanilla.js +++ b/src/browser-vanilla.js @@ -1,5 +1,15 @@ // Simple version for browser compatibility with vanilla JS -// Original (with Lodash 3): ./index.js + +/* +Original (with Lodash 3): +https://github.com/apiaryio/refract-query/blob/master/src/index.js +*/ + +/* +Supported element query samples: +elementQuery = { element: 'category' } +elementQuery = { element: 'category', 'meta': { 'classes': 'api' } } +*/ (function () { 'use strict' @@ -23,13 +33,8 @@ results.push(nested[ii]) } - var skip = false - for (var prop in elementQuery) { - if (elementQuery.hasOwnProperty(prop) && el[prop] !== elementQuery[prop]) { - skip = true - break - } - } + // test query at the current level + var skip = !find(el, elementQuery) if (!skip) { // matched results.push(el) @@ -39,6 +44,42 @@ return results } + // set find function for recursion + var find = function (el, elementQuery) { + for (var prop in elementQuery) { + if (elementQuery.hasOwnProperty(prop)) { + var val = elementQuery[prop] + var obj = el[prop] + + // check type first + if (typeof val === 'object' && val !== null) { + if (obj) { + // try recursion + return find(obj, val) + } + } + // support checking string or number within array + var match = false + if (!Array.isArray(obj)) { + obj = [ obj ] + } + for (var i = 0; i < obj.length; i++) { + if (obj[i] === val) { + match = true + break + } + } + if (!match) { + // not matched + return false + } + } + } + + // goes here if matched + return true + } + if (typeof module !== 'undefined' && module.exports) { // NodeJS module.exports = query From 31e541d5b0f669a34de9648e4337ddaf66f7d65a Mon Sep 17 00:00:00 2001 From: Leonardo Matos Date: Mon, 10 Sep 2018 16:06:51 -0300 Subject: [PATCH 3/4] fixes for nested find (recursive match) --- src/browser-vanilla.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/browser-vanilla.js b/src/browser-vanilla.js index c253795..106a0da 100644 --- a/src/browser-vanilla.js +++ b/src/browser-vanilla.js @@ -48,29 +48,35 @@ elementQuery = { element: 'category', 'meta': { 'classes': 'api' } } var find = function (el, elementQuery) { for (var prop in elementQuery) { if (elementQuery.hasOwnProperty(prop)) { + var match = false var val = elementQuery[prop] var obj = el[prop] // check type first if (typeof val === 'object' && val !== null) { - if (obj) { + if (typeof obj === 'object' && obj !== null) { // try recursion - return find(obj, val) + match = find(obj, val) + } else { + // element has not current property + return false } - } - // support checking string or number within array - var match = false - if (!Array.isArray(obj)) { - obj = [ obj ] - } - for (var i = 0; i < obj.length; i++) { - if (obj[i] === val) { - match = true - break + } else { + // support checking string or number within array + if (!Array.isArray(obj)) { + obj = [ obj ] + } + for (var i = 0; i < obj.length; i++) { + if (obj[i] === val) { + match = true + break + } } } + if (!match) { // not matched + // does not need to continue return false } } From 8f205369240aa75b4d50b80fe21d78d5c9d54dcf Mon Sep 17 00:00:00 2001 From: Leonardo Matos Date: Tue, 11 Sep 2018 09:40:00 -0300 Subject: [PATCH 4/4] change results order (deeper after), option (noDeep param) to query on current level only --- src/browser-vanilla.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/browser-vanilla.js b/src/browser-vanilla.js index 106a0da..77b732f 100644 --- a/src/browser-vanilla.js +++ b/src/browser-vanilla.js @@ -18,7 +18,7 @@ elementQuery = { element: 'category', 'meta': { 'classes': 'api' } } * Queries the whole Refract tree and finds a respective * element(s) which matches the query. */ - var query = function (element, elementQuery) { + var query = function (element, elementQuery, noDeep) { if (typeof element !== 'object' || element === null || !Array.isArray(element.content)) { return [] } @@ -27,18 +27,20 @@ elementQuery = { element: 'category', 'meta': { 'classes': 'api' } } // find elements for (var i = 0; i < element.content.length; i++) { var el = element.content[i] - // go deep - var nested = query(el, elementQuery) - for (var ii = 0; ii < nested.length; ii++) { - results.push(nested[ii]) - } - // test query at the current level var skip = !find(el, elementQuery) if (!skip) { // matched results.push(el) } + + if (!noDeep) { + // go deep + var nested = query(el, elementQuery) + for (var ii = 0; ii < nested.length; ii++) { + results.push(nested[ii]) + } + } } return results