|
|
|
@ -29,10 +29,13 @@ function recurseTags(tag) {
|
|
|
|
|
|
|
|
|
|
function createQuery(query) {
|
|
|
|
|
let {riotQuery, domQuery} = queryParser.parse(query);
|
|
|
|
|
let tagObtainer;
|
|
|
|
|
|
|
|
|
|
if (riotQuery != null) {
|
|
|
|
|
let flattenedQueries = flatten(riotQuery);
|
|
|
|
|
tagQueries(flattenedQueries);
|
|
|
|
|
|
|
|
|
|
return function traverse(tag) {
|
|
|
|
|
tagObtainer = function(tag) {
|
|
|
|
|
let results = [];
|
|
|
|
|
|
|
|
|
|
flattenedQueries.forEach((subQuery) => {
|
|
|
|
@ -64,17 +67,57 @@ function createQuery(query) {
|
|
|
|
|
|
|
|
|
|
return dedupe(results, result => result._riot_id);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
tagObtainer = function(tag) {
|
|
|
|
|
return [tag];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return function traverse(tag) {
|
|
|
|
|
let riotResults = tagObtainer(tag);
|
|
|
|
|
|
|
|
|
|
if (domQuery == null) {
|
|
|
|
|
return riotResults;
|
|
|
|
|
} else {
|
|
|
|
|
let domElements = [];
|
|
|
|
|
|
|
|
|
|
riotResults.forEach((foundTag) => {
|
|
|
|
|
domElements = domElements.concat(Array.from(foundTag.root.querySelectorAll(domQuery)));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return domElements;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let queryCache = {};
|
|
|
|
|
|
|
|
|
|
module.exports = function(tag, query) {
|
|
|
|
|
if (queryCache[query] == null) {
|
|
|
|
|
queryCache[query] = createQuery(query);
|
|
|
|
|
function query(tag, queryString) {
|
|
|
|
|
if (queryCache[queryString] == null) {
|
|
|
|
|
queryCache[queryString] = createQuery(queryString);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: DOM traversal
|
|
|
|
|
|
|
|
|
|
return queryCache[query](tag);
|
|
|
|
|
return queryCache[queryString](tag);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
query.one = function queryOne(tag, queryString) {
|
|
|
|
|
let results = query(tag, queryString);
|
|
|
|
|
|
|
|
|
|
if (results.length === 0) {
|
|
|
|
|
throw new Error(`No matches found for query ${queryString}`);
|
|
|
|
|
} else {
|
|
|
|
|
return results[0];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* For use with `riot.mixin(query.mixin)`: */
|
|
|
|
|
query.mixin = {
|
|
|
|
|
init: function() {
|
|
|
|
|
this.query = query.bind(null, this);
|
|
|
|
|
this.queryOne = query.one.bind(null, this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = query;
|