diff --git a/dist/raw/spatial-navigation.js b/js/spatial-navigation.js old mode 100755 new mode 100644 similarity index 99% rename from dist/raw/spatial-navigation.js rename to js/spatial-navigation.js index 92b9cc5..0a2aef5 --- a/dist/raw/spatial-navigation.js +++ b/js/spatial-navigation.js @@ -1,18 +1,18 @@ -/** - * - * spatial-navigation - * - * @name spatial-navigation - * @version 0.4.7 - * --- - * @author falsandtru https://github.com/falsandtru/spatial-navigation - * @copyright 2015, falsandtru - * @license MIT - * - */ - -!new function(NAME, VERSION) { -"use strict"; +/** + * + * spatial-navigation + * + * @name spatial-navigation + * @version 0.4.7 + * --- + * @author falsandtru https://github.com/falsandtru/spatial-navigation + * @copyright 2015, falsandtru + * @license MIT + * + */ + +!new function(NAME, VERSION) { +"use strict"; (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0; }) - .reduce(function (_, group) { return group; }, findLeftTops(targets)) - .map(shiftVisibleImg) - .sort(compareLeftTopDistance); - } - function findLeftColumn(targets) { - var mainColumn = findMainColumn(targets); - var left = mainColumn.length > 0 ? mainColumn[0].parentElement.getBoundingClientRect().left : Infinity; - return columns(targets.filter(function (target) { return target.getBoundingClientRect().right < left; })) - .map(function (group) { return group.filter(isInWindow); }) - .filter(function (group) { return group.length > 0; }) - .sort(compareGroupsByTextWeightAverage) - .reduce(function (_, group) { return group; }, mainColumn) - .map(shiftVisibleImg) - .sort(compareLeftTopDistance); - } - function findRightColumn(targets) { - var mainColumn = findMainColumn(targets); - var right = mainColumn.length > 0 ? mainColumn[0].parentElement.getBoundingClientRect().right : -Infinity; - return columns(targets.filter(function (target) { return target.getBoundingClientRect().left > right; })) - .map(function (group) { return group.filter(isInWindow); }) - .filter(function (group) { return group.length > 0; }) - .sort(compareGroupsByTextWeightAverage) - .reduce(function (_, group) { return group; }, mainColumn) - .map(shiftVisibleImg) - .sort(compareLeftTopDistance); - } - function findCursorTops(targets, cursor) { - var margin = 3; - return targets - .map(shiftVisibleImg) - .filter(isInRange(Math.max(winTop - (winHeight * 3), 0), winLeft, winLeft + winWidth, Offset(cursor).top + margin)) - .sort(compareCursorVerticalDistance(cursor)); - } - function findCursorBottoms(targets, cursor) { - var margin = 3; - return targets - .map(shiftVisibleImg) - .filter(isInRange(Offset(cursor).bottom - margin, winLeft, winLeft + winWidth, winTop + (winHeight * 4))) - .sort(compareCursorVerticalDistance(cursor)); - } - function findCursorLefts(targets, cursor) { - var margin = 3; - return targets - .map(shiftVisibleImg) - .filter(isInRange(winTop, 0, Offset(cursor).left + margin, winTop + winHeight)) - .sort(compareCursorLeftDistance(cursor)); - } - function findCursorRights(targets, cursor) { - var margin = 3; - return targets - .map(shiftVisibleImg) - .filter(isInRange(winTop, Offset(cursor).right - margin, Infinity, winTop + winHeight)) - .sort(compareCursorRightDistance(cursor)); - } - function findCursorNeerTargets(targets, cursor) { - return targets - .map(shiftVisibleImg) - .filter(isInWindow) - .sort(compareCursorDistance(cursor)); - } - function findCursorColumn(targets, cursor) { - var left = cursor.getBoundingClientRect().left; - return columns(targets.filter(isCursorColumn).filter(hasVisibleTextNode)) - .reduce(function (_, group) { return group; }, targets) - .map(shiftVisibleImg) - .sort(function (a, b) { return compareGroupsByTextWeightAverage([b], [a]) || compareLeftTopDistance(a, b); }); - function isCursorColumn(elem) { - return elem.getBoundingClientRect().left === left; - } - } - function isCursorActive(cursor) { - var rect = cursor && cursor.getBoundingClientRect(); - return !(!rect || - rect.bottom < 0 || - rect.top > winHeight || - rect.right < 0 || - rect.left > winWidth); - } - function columns(targets) { - return targets - .sort(compareLeftDistance) - .reduce(groupsByLeftDistance, []) - .map(filterFewNodesGroup) - .filter(function (group) { return group.length > 1; }); - } - function groupsByLeftDistance(groups, elem) { - if (groups.length === 0) { - return [[elem]]; - } - var group = groups.slice(-1)[0]; - return isSameGroup(group, elem) ? groups.slice(0, -1).concat([group.concat(elem)]) : groups.concat([[elem]]); - function isSameGroup(group, elem) { - return Math.floor(group[0].getBoundingClientRect().left) === Math.floor(elem.getBoundingClientRect().left); - } - } - function compareGroupsByTextWeightAverage(a, b) { - return calWeightAverage(a.filter(hasText).slice(0, 10)) - calWeightAverage(b.filter(hasText).slice(0, 10)) - || -compareLeftDistance(a[0], b[0]); - function calWeightAverage(elems) { - return calTextWeightAverage(elems); - } - function calTextWeightAverage(elems) { - return elems.length === 0 - ? 0 - : elems.reduce(function (r, elem) { return r + calTextWeight(elem); }, 0) / elems.length * (Math.min(elems.length, 10) / 10 + 0.5); - } - function calTextWeight(elem) { - var fontSize = parseInt(window.getComputedStyle(elem).fontSize, 10) - || parseInt(window.getComputedStyle(document.documentElement).fontSize, 10) - || 16, fullTextNodeParents = findVisibleTextNodes(elem) - .map(function (text) { return text.parentElement; }), fontWeightAverage = calFontWeightRateAverage(fullTextNodeParents), length = fullTextNodeParents - .reduce(function (r, elem) { return r + elem.textContent.trim().length; }, 0); - return fontSize * fontWeightAverage * +(length > 3); - } - function calFontWeightRateAverage(textNodeParents) { - //const sum = textNodeParents.reduce((r, elem) => r + elem.textContent.trim().length * calFontWeightRate(elem), 0), - // len = textNodeParents.reduce((r, elem) => r + elem.textContent.trim().length, 0); - //return len === 0 ? 0 : sum / len; - return textNodeParents - .sort(function (a, b) { return a.textContent.trim().length - b.textContent.trim().length; }) - .slice(-1) - .map(function (elem) { return calFontWeightRate(elem); }) - .pop(); - } - function calFontWeightRate(elem) { - var fontWeight = window.getComputedStyle(elem).fontWeight; - var weight; - switch (fontWeight) { - case 'normal': - weight = 400; - break; - case 'bold': - weight = 700; - break; - default: - weight = parseInt(fontWeight, 10); - } - return 1 + ((weight / 400 - 1) / 3); - } - } - function filterFewNodesGroup(group) { - return groupsByNodeDistanceFromRoot(group) - .filter(function (group) { return group.length > 1; }) - .reduce(function (r, group) { return r.concat(group); }, []); - } - function groupsByNodeDistanceFromRoot(group) { - return group - .sort(compareByNodeDistanceFromRoot) - .reduce(function (r, elem) { return r.length === 0 ? [[elem]] - : compareByNodeDistanceFromRoot(r[0][0], elem) === 0 ? [[elem].concat(r[0])].concat(r.slice(1)) - : [[elem]].concat(r); }, []); - } - function compareByNodeDistanceFromRoot(a, b) { - return countNodeDistanceFromRoot(a) - countNodeDistanceFromRoot(b); - function countNodeDistanceFromRoot(elem) { - var count = 0, parent = elem; - while (parent = parent.parentElement) { - ++count; - } - return count; - } - } - function compareLeftDistance(a, b) { - return Math.floor(a.getBoundingClientRect().left) - Math.floor(b.getBoundingClientRect().left); - } - function compareLeftTopDistance(a, b) { - return distance(a) - distance(b); - function distance(elem) { - var rect = elem.getBoundingClientRect(); - return Math.floor(rect.left - + rect.top * 5); - } - } - function compareCursorDistance(cursor) { - var weight = 10; - var cursorOffset = Offset(cursor); - return function (a, b) { - return distance(a) - distance(b); - }; - function distance(elem) { - var targetOffset = Offset(elem); - return Math.floor(Math.abs(targetOffset.left - cursorOffset.left) - + Math.abs(targetOffset.top - cursorOffset.top) * weight); - } - } - function compareCursorVerticalDistance(cursor) { - var weight = 3; - var cursorOffset = Offset(cursor); - return function (a, b) { - return distance(a) - distance(b); - }; - function distance(elem) { - var targetOffset = Offset(elem), hdistance = targetOffset.left <= cursorOffset.left && cursorOffset.left <= targetOffset.right - ? 0 - : targetOffset.left - cursorOffset.left; - return Math.floor(Math.abs(hdistance) * weight - + Math.abs(targetOffset.top - cursorOffset.top)); - } - } - function compareCursorLeftDistance(cursor) { - var weight = 5; - var cursorOffset = Offset(cursor); - return function (a, b) { - return distance(a) - distance(b); - }; - function distance(elem) { - var targetOffset = Offset(elem); - return Math.floor(Math.abs(targetOffset.right - cursorOffset.left) - + Math.abs(targetOffset.top - cursorOffset.top) * weight); - } - } - function compareCursorRightDistance(cursor) { - var weight = 5; - var cursorOffset = Offset(cursor); - return function (a, b) { - return distance(a) - distance(b); - }; - function distance(elem) { - var targetOffset = Offset(elem); - return Math.floor(Math.abs(targetOffset.left - cursorOffset.right) - + Math.abs(targetOffset.top - cursorOffset.top) * weight); - } - } - } - function isInWindow(elem) { - return !!elem && isInRange(winTop, winLeft, winLeft + winWidth, winTop + winHeight)(elem); - } - function isInRange(top, left, right, bottom) { - return function (elem) { - var offset = Offset(elem); - return top <= offset.top && offset.top <= bottom - 10 - && left <= offset.left && offset.left <= right - 10; - }; - } - function hasVisibleTextNode(elem) { - return findVisibleTextNodes(elem).length > 0; - } - function findVisibleTextNodes(elem) { - return findTextNodes(elem) - .filter(hasText) - .filter(function (text) { return isVisible(text.parentElement); }); - } - function findTextNodes(elem) { - return Array.apply(null, elem.childNodes) - .map(function (elem) { return isTextNode(elem) ? [elem] : findTextNodes(elem); }) - .reduce(function (r, elems) { return r.concat(elems); }, []); - } - function isTextNode(elem) { - return elem.nodeName === '#text'; - } - function hasText(elem) { - return elem.textContent.trim().length > 0; - } - function shiftVisibleImg(elem) { - return Array.apply(null, elem.querySelectorAll('img')) - .filter(isVisible) - .shift() || elem; - } - function isVisible(elem) { - var rect = elem.getBoundingClientRect(), point = document.elementFromPoint(Math.ceil(rect.left + (rect.width / 2)), Math.ceil(rect.top + Math.min(rect.height / 2, 10))); - return point - ? isVisibleSize(elem) && (point === elem || isChild(elem, point)) - : isVisibleSize(elem) && isVisibleStyle(elem); - function isChild(parent, child) { - return child ? child.parentElement === parent || isChild(parent, child.parentElement) : false; - } - function isVisibleSize(elem) { - return elem.offsetWidth > 9 && elem.offsetHeight > 9; - } - function isVisibleStyle(elem) { - var style = window.getComputedStyle(elem); - return (style.display.split(' ')[0] !== 'none' || - style.visibility.split(' ')[0] !== 'hidden' || - !(parseInt(style.zIndex.split(' ')[0], 10) < 0)); - } - } - function Offset(elem) { - var offset = elem.getBoundingClientRect(); - return { - top: winTop + offset.top, - left: winLeft + offset.left, - right: winLeft + offset.right, - bottom: winTop + offset.bottom, - width: offset.right - offset.left, - height: offset.bottom - offset.top - }; - } -} -exports.analyze = analyze; +var ATTRIBUTE = require('../attribute/attribute'); +var SELECTOR = [ + 'a', + 'input', + 'select', + 'option', + 'datalist', + 'textarea', + 'button', + 'audio', + 'video', + 'embed', + '[onclick]', + '[tabindex]:not([role="tablist"]):not(ul):not(#hdtb):not(#hdtbMenus)', + //'[role="link"]', + '[role="button"]', + '[role="checkbox"]', + '[role="option"]', + '[role="tab"]', + '[role="menuitem"]' +] + .join(','); +var queried, linkcount = 0; +function analyze(data) { + if (!queried || !data.attribute.cursor || linkcount !== document.links.length) { + queried = Array.apply(null, document.querySelectorAll(SELECTOR)); + linkcount = document.links.length; + } + var winWidth = window.innerWidth, winHeight = window.innerHeight, winTop = window.scrollY, winLeft = window.scrollX; + var targets = findTargets(queried.filter(function (target) { return isVisible(shiftVisibleImg(target)); }), data.attribute.command, data.attribute.cursor); + queried = isInWindow(targets[0]) ? queried : null; + return { + entity: data.entity, + attribute: data.attribute, + result: { + targets: targets + } + }; + function findTargets(targets, command, cursor) { + cursor = isCursorActive(cursor) ? cursor : null; + switch (command) { + case 0 /* UP */: + return !cursor + ? findLeftTops(targets) + : findCursorTops(targets, cursor); + case 1 /* UP_S */: + return !cursor + ? findLeftTops(targets) + : findCursorColumn(findCursorTops(targets, cursor), cursor); + case 2 /* DOWN */: + return !cursor + ? findMainColumn(targets) + : findCursorBottoms(targets, cursor); + case 3 /* DOWN_S */: + return !cursor + ? findMainColumn(targets) + : findCursorColumn(findCursorBottoms(targets, cursor), cursor); + case 4 /* LEFT */: + return !cursor + ? findLeftColumn(targets) + : findCursorLefts(targets, cursor); + case 5 /* RIGHT */: + return !cursor + ? findRightColumn(targets) + : findCursorRights(targets, cursor); + case 6 /* EXPAND */: + return findCursorNeerTargets(targets, cursor || findMainColumn(targets)[0] || document.body) + .filter(isInWindow); + case 7 /* CONTRACT */: + return findCursorNeerTargets(targets, cursor || findMainColumn(targets)[0] || document.body) + .filter(isInWindow) + .reverse(); + default: + return []; + } + function findLeftTops(targets) { + return targets + .filter(isInWindow) + .map(shiftVisibleImg) + .sort(compareLeftTopDistance); + } + function findMainColumn(targets) { + return columns(targets.filter(function (target) { return target.getBoundingClientRect().left < (winWidth / 2); }).filter(hasVisibleTextNode)) + .sort(compareGroupsByTextWeightAverage) + .map(function (group) { return group.filter(isInWindow); }) + .filter(function (group) { return group.length > 0; }) + .reduce(function (_, group) { return group; }, findLeftTops(targets)) + .map(shiftVisibleImg) + .sort(compareLeftTopDistance); + } + function findLeftColumn(targets) { + var mainColumn = findMainColumn(targets); + var left = mainColumn.length > 0 ? mainColumn[0].parentElement.getBoundingClientRect().left : Infinity; + return columns(targets.filter(function (target) { return target.getBoundingClientRect().right < left; })) + .map(function (group) { return group.filter(isInWindow); }) + .filter(function (group) { return group.length > 0; }) + .sort(compareGroupsByTextWeightAverage) + .reduce(function (_, group) { return group; }, mainColumn) + .map(shiftVisibleImg) + .sort(compareLeftTopDistance); + } + function findRightColumn(targets) { + var mainColumn = findMainColumn(targets); + var right = mainColumn.length > 0 ? mainColumn[0].parentElement.getBoundingClientRect().right : -Infinity; + return columns(targets.filter(function (target) { return target.getBoundingClientRect().left > right; })) + .map(function (group) { return group.filter(isInWindow); }) + .filter(function (group) { return group.length > 0; }) + .sort(compareGroupsByTextWeightAverage) + .reduce(function (_, group) { return group; }, mainColumn) + .map(shiftVisibleImg) + .sort(compareLeftTopDistance); + } + function findCursorTops(targets, cursor) { + var margin = 3; + return targets + .map(shiftVisibleImg) + .filter(isInRange(Math.max(winTop - (winHeight * 3), 0), winLeft, winLeft + winWidth, Offset(cursor).top + margin)) + .sort(compareCursorVerticalDistance(cursor)); + } + function findCursorBottoms(targets, cursor) { + var margin = 3; + return targets + .map(shiftVisibleImg) + .filter(isInRange(Offset(cursor).bottom - margin, winLeft, winLeft + winWidth, winTop + (winHeight * 4))) + .sort(compareCursorVerticalDistance(cursor)); + } + function findCursorLefts(targets, cursor) { + var margin = 3; + return targets + .map(shiftVisibleImg) + .filter(isInRange(winTop, 0, Offset(cursor).left + margin, winTop + winHeight)) + .sort(compareCursorLeftDistance(cursor)); + } + function findCursorRights(targets, cursor) { + var margin = 3; + return targets + .map(shiftVisibleImg) + .filter(isInRange(winTop, Offset(cursor).right - margin, Infinity, winTop + winHeight)) + .sort(compareCursorRightDistance(cursor)); + } + function findCursorNeerTargets(targets, cursor) { + return targets + .map(shiftVisibleImg) + .filter(isInWindow) + .sort(compareCursorDistance(cursor)); + } + function findCursorColumn(targets, cursor) { + var left = cursor.getBoundingClientRect().left; + return columns(targets.filter(isCursorColumn).filter(hasVisibleTextNode)) + .reduce(function (_, group) { return group; }, targets) + .map(shiftVisibleImg) + .sort(function (a, b) { return compareGroupsByTextWeightAverage([b], [a]) || compareLeftTopDistance(a, b); }); + function isCursorColumn(elem) { + return elem.getBoundingClientRect().left === left; + } + } + function isCursorActive(cursor) { + var rect = cursor && cursor.getBoundingClientRect(); + return !(!rect || + rect.bottom < 0 || + rect.top > winHeight || + rect.right < 0 || + rect.left > winWidth); + } + function columns(targets) { + return targets + .sort(compareLeftDistance) + .reduce(groupsByLeftDistance, []) + .map(filterFewNodesGroup) + .filter(function (group) { return group.length > 1; }); + } + function groupsByLeftDistance(groups, elem) { + if (groups.length === 0) { + return [[elem]]; + } + var group = groups.slice(-1)[0]; + return isSameGroup(group, elem) ? groups.slice(0, -1).concat([group.concat(elem)]) : groups.concat([[elem]]); + function isSameGroup(group, elem) { + return Math.floor(group[0].getBoundingClientRect().left) === Math.floor(elem.getBoundingClientRect().left); + } + } + function compareGroupsByTextWeightAverage(a, b) { + return calWeightAverage(a.filter(hasText).slice(0, 10)) - calWeightAverage(b.filter(hasText).slice(0, 10)) + || -compareLeftDistance(a[0], b[0]); + function calWeightAverage(elems) { + return calTextWeightAverage(elems); + } + function calTextWeightAverage(elems) { + return elems.length === 0 + ? 0 + : elems.reduce(function (r, elem) { return r + calTextWeight(elem); }, 0) / elems.length * (Math.min(elems.length, 10) / 10 + 0.5); + } + function calTextWeight(elem) { + var fontSize = parseInt(window.getComputedStyle(elem).fontSize, 10) + || parseInt(window.getComputedStyle(document.documentElement).fontSize, 10) + || 16, fullTextNodeParents = findVisibleTextNodes(elem) + .map(function (text) { return text.parentElement; }), fontWeightAverage = calFontWeightRateAverage(fullTextNodeParents), length = fullTextNodeParents + .reduce(function (r, elem) { return r + elem.textContent.trim().length; }, 0); + return fontSize * fontWeightAverage * +(length > 3); + } + function calFontWeightRateAverage(textNodeParents) { + //const sum = textNodeParents.reduce((r, elem) => r + elem.textContent.trim().length * calFontWeightRate(elem), 0), + // len = textNodeParents.reduce((r, elem) => r + elem.textContent.trim().length, 0); + //return len === 0 ? 0 : sum / len; + return textNodeParents + .sort(function (a, b) { return a.textContent.trim().length - b.textContent.trim().length; }) + .slice(-1) + .map(function (elem) { return calFontWeightRate(elem); }) + .pop(); + } + function calFontWeightRate(elem) { + var fontWeight = window.getComputedStyle(elem).fontWeight; + var weight; + switch (fontWeight) { + case 'normal': + weight = 400; + break; + case 'bold': + weight = 700; + break; + default: + weight = parseInt(fontWeight, 10); + } + return 1 + ((weight / 400 - 1) / 3); + } + } + function filterFewNodesGroup(group) { + return groupsByNodeDistanceFromRoot(group) + .filter(function (group) { return group.length > 1; }) + .reduce(function (r, group) { return r.concat(group); }, []); + } + function groupsByNodeDistanceFromRoot(group) { + return group + .sort(compareByNodeDistanceFromRoot) + .reduce(function (r, elem) { return r.length === 0 ? [[elem]] + : compareByNodeDistanceFromRoot(r[0][0], elem) === 0 ? [[elem].concat(r[0])].concat(r.slice(1)) + : [[elem]].concat(r); }, []); + } + function compareByNodeDistanceFromRoot(a, b) { + return countNodeDistanceFromRoot(a) - countNodeDistanceFromRoot(b); + function countNodeDistanceFromRoot(elem) { + var count = 0, parent = elem; + while (parent = parent.parentElement) { + ++count; + } + return count; + } + } + function compareLeftDistance(a, b) { + return Math.floor(a.getBoundingClientRect().left) - Math.floor(b.getBoundingClientRect().left); + } + function compareLeftTopDistance(a, b) { + return distance(a) - distance(b); + function distance(elem) { + var rect = elem.getBoundingClientRect(); + return Math.floor(rect.left + + rect.top * 5); + } + } + function compareCursorDistance(cursor) { + var weight = 10; + var cursorOffset = Offset(cursor); + return function (a, b) { + return distance(a) - distance(b); + }; + function distance(elem) { + var targetOffset = Offset(elem); + return Math.floor(Math.abs(targetOffset.left - cursorOffset.left) + + Math.abs(targetOffset.top - cursorOffset.top) * weight); + } + } + function compareCursorVerticalDistance(cursor) { + var weight = 3; + var cursorOffset = Offset(cursor); + return function (a, b) { + return distance(a) - distance(b); + }; + function distance(elem) { + var targetOffset = Offset(elem), hdistance = targetOffset.left <= cursorOffset.left && cursorOffset.left <= targetOffset.right + ? 0 + : targetOffset.left - cursorOffset.left; + return Math.floor(Math.abs(hdistance) * weight + + Math.abs(targetOffset.top - cursorOffset.top)); + } + } + function compareCursorLeftDistance(cursor) { + var weight = 5; + var cursorOffset = Offset(cursor); + return function (a, b) { + return distance(a) - distance(b); + }; + function distance(elem) { + var targetOffset = Offset(elem); + return Math.floor(Math.abs(targetOffset.right - cursorOffset.left) + + Math.abs(targetOffset.top - cursorOffset.top) * weight); + } + } + function compareCursorRightDistance(cursor) { + var weight = 5; + var cursorOffset = Offset(cursor); + return function (a, b) { + return distance(a) - distance(b); + }; + function distance(elem) { + var targetOffset = Offset(elem); + return Math.floor(Math.abs(targetOffset.left - cursorOffset.right) + + Math.abs(targetOffset.top - cursorOffset.top) * weight); + } + } + } + function isInWindow(elem) { + return !!elem && isInRange(winTop, winLeft, winLeft + winWidth, winTop + winHeight)(elem); + } + function isInRange(top, left, right, bottom) { + return function (elem) { + var offset = Offset(elem); + return top <= offset.top && offset.top <= bottom - 10 + && left <= offset.left && offset.left <= right - 10; + }; + } + function hasVisibleTextNode(elem) { + return findVisibleTextNodes(elem).length > 0; + } + function findVisibleTextNodes(elem) { + return findTextNodes(elem) + .filter(hasText) + .filter(function (text) { return isVisible(text.parentElement); }); + } + function findTextNodes(elem) { + return Array.apply(null, elem.childNodes) + .map(function (elem) { return isTextNode(elem) ? [elem] : findTextNodes(elem); }) + .reduce(function (r, elems) { return r.concat(elems); }, []); + } + function isTextNode(elem) { + return elem.nodeName === '#text'; + } + function hasText(elem) { + return elem.textContent.trim().length > 0; + } + function shiftVisibleImg(elem) { + return Array.apply(null, elem.querySelectorAll('img')) + .filter(isVisible) + .shift() || elem; + } + function isVisible(elem) { + var rect = elem.getBoundingClientRect(), point = document.elementFromPoint(Math.ceil(rect.left + (rect.width / 2)), Math.ceil(rect.top + Math.min(rect.height / 2, 10))); + return point + ? isVisibleSize(elem) && (point === elem || isChild(elem, point)) + : isVisibleSize(elem) && isVisibleStyle(elem); + function isChild(parent, child) { + return child ? child.parentElement === parent || isChild(parent, child.parentElement) : false; + } + function isVisibleSize(elem) { + return elem.offsetWidth > 9 && elem.offsetHeight > 9; + } + function isVisibleStyle(elem) { + var style = window.getComputedStyle(elem); + return (style.display.split(' ')[0] !== 'none' || + style.visibility.split(' ')[0] !== 'hidden' || + !(parseInt(style.zIndex.split(' ')[0], 10) < 0)); + } + } + function Offset(elem) { + var offset = elem.getBoundingClientRect(); + return { + top: winTop + offset.top, + left: winLeft + offset.left, + right: winLeft + offset.right, + bottom: winTop + offset.bottom, + width: offset.right - offset.left, + height: offset.bottom - offset.top + }; + } +} +exports.analyze = analyze; },{"../attribute/attribute":2}],8:[function(require,module,exports){ "use strict"; -/// -var VIEW = require('../view/view'); -var CONTROLLER = require('../controller/controller'); -var STORE = require('../store/store'); -exports.store = STORE.create(); -var ANALYSIS = require('./analysis'); -//import MAP = require('./map'); -var LazyChain = require('lazychain'); -var views = []; -function main() { - if (document.readyState === "loading") { - return window.addEventListener("DOMContentLoaded", register); - } - else { - return register(); - } - function register() { - window.removeEventListener("DOMContentLoaded", register); - CONTROLLER.Controller([window]) - .forEach(function (view) { return views.unshift(view); }); - } -} -exports.main = main; -var stream = LazyChain(); -stream - .lazy(10) - .reduceRight(function (v) { return v; }) - .map(ANALYSIS.analyze) - .stream(output); -function input(entity, attribute) { - stream.notify({ entity: entity, attribute: attribute, result: null }); -} -exports.input = input; -function output(data) { - exports.store.update(data.entity.viewId, data.result); - VIEW.emit(data.entity, data.attribute); -} +/// +var VIEW = require('../view/view'); +var CONTROLLER = require('../controller/controller'); +var STORE = require('../store/store'); +exports.store = STORE.create(); +var ANALYSIS = require('./analysis'); +//import MAP = require('./map'); +var LazyChain = require('lazychain'); +var views = []; +function main() { + if (document.readyState === "loading") { + return window.addEventListener("DOMContentLoaded", register); + } + else { + return register(); + } + function register() { + window.removeEventListener("DOMContentLoaded", register); + CONTROLLER.Controller([window]) + .forEach(function (view) { return views.unshift(view); }); + } +} +exports.main = main; +var stream = LazyChain(); +stream + .lazy(10) + .reduceRight(function (v) { return v; }) + .map(ANALYSIS.analyze) + .stream(output); +function input(entity, attribute) { + stream.notify({ entity: entity, attribute: attribute, result: null }); +} +exports.input = input; +function output(data) { + exports.store.update(data.entity.viewId, data.result); + VIEW.emit(data.entity, data.attribute); +} },{"../controller/controller":3,"../store/store":10,"../view/view":12,"./analysis":7,"lazychain":1}],9:[function(require,module,exports){ "use strict"; -var state_ = 0 /* ENABLE */; -function state(enable) { - switch (enable) { - case true: - state_ = 0 /* ENABLE */; - break; - case false: - state_ = 1 /* DISABLE */; - break; - } - return state_ === 0 /* ENABLE */; -} -exports.state = state; +var state_ = 0 /* ENABLE */; +function state(enable) { + switch (enable) { + case true: + state_ = 0 /* ENABLE */; + break; + case false: + state_ = 1 /* DISABLE */; + break; + } + return state_ === 0 /* ENABLE */; +} +exports.state = state; },{}],10:[function(require,module,exports){ "use strict"; -function create() { - return new Store(); -} -exports.create = create; -var Store = (function () { - function Store() { - this.state_ = {}; - this.diff_ = {}; - } - Store.prototype.update = function (id, diff) { - var curState = this.state_[id] = this.state_[id] || {}, curDiff = this.diff_[id] = this.diff_[id] || []; - Object.keys(diff) - .forEach(function (v) { - var key = v, val = diff[key]; - if (val === curState[key]) { - return; - } - curState[key] = val; - curDiff.push(key); - }); - }; - Store.prototype.state = function (id) { - return this.state_[id] = this.state_[id] || {}; - }; - Store.prototype.diff = function (id) { - var diff = this.diff_[id] = this.diff_[id] || [], uniq = diff.sort().reduce(function (r, v, i) { return i === 0 ? [v] : r[0] === v ? r : [v].concat(r); }, []).reverse(); - [].splice.apply(diff, [0, diff.length].concat(uniq)); - return diff; - }; - return Store; -})(); +function create() { + return new Store(); +} +exports.create = create; +var Store = (function () { + function Store() { + this.state_ = {}; + this.diff_ = {}; + } + Store.prototype.update = function (id, diff) { + var curState = this.state_[id] = this.state_[id] || {}, curDiff = this.diff_[id] = this.diff_[id] || []; + Object.keys(diff) + .forEach(function (v) { + var key = v, val = diff[key]; + if (val === curState[key]) { + return; + } + curState[key] = val; + curDiff.push(key); + }); + }; + Store.prototype.state = function (id) { + return this.state_[id] = this.state_[id] || {}; + }; + Store.prototype.diff = function (id) { + var diff = this.diff_[id] = this.diff_[id] || [], uniq = diff.sort().reduce(function (r, v, i) { return i === 0 ? [v] : r[0] === v ? r : [v].concat(r); }, []).reverse(); + [].splice.apply(diff, [0, diff.length].concat(uniq)); + return diff; + }; + return Store; +})(); },{}],11:[function(require,module,exports){ "use strict"; -var ATTRIBUTE = require('../attribute/attribute'); -function map(targets, callback, reverse, stack) { - if (stack === void 0) { stack = []; } - if (targets.length === 0) { - return []; - } - var scrollTop = window.scrollY, scrollLeft = window.scrollX; - var keys = 'dsawgvcxlohnmzbptuy'.split(''), container = document.createElement('div'), observer = document.createElement('input'), table = {}; - observer.style.cssText = [ - 'position: fixed;', - 'width: 0px;', - 'height: 0px;', - 'bottom: 0px;', - 'right: 0px;', - 'margin: 0px;', - 'border-width: 0px;', - 'padding: 0px;', - 'z-index: -1;' - ] - .map(function (str) { return str.split(';')[0] + ' !important;'; }) - .join(''); - observer.addEventListener('input', handler); - observer.addEventListener('blur', handler); - document.body.appendChild(observer); - observer.focus(); - setTimeout(function () { return observer.focus(); }, 1000); - var markers = targets.slice(0, keys.length) - .map(function (target, i) { - var marker = document.createElement('span'), key = keys[i], offset = calOffset(target); - marker.classList.add(ATTRIBUTE.MARKER_TAG); - marker.classList.add(ATTRIBUTE.MARKER_TAG + '-' + key); - marker.style.cssText = [ - 'position: absolute;', - 'overflow: visible;', - 'z-index: 9999;', - 'top: ' + (offset.top - 3) + 'px;', - 'left: ' + (offset.left - 12) + 'px;', - 'min-width: 5px;', - 'margin: 0px;', - 'border: 0px;', - 'padding: 1px 3px;', - 'border-radius: 3px;', - 'box-shadow: 1px 1px 1px 0px;', - 'background-color: gold;', - 'font-family: Helvetica, Arial, sans-serif;', - 'font-size: 13px;', - 'font-weight: bold;', - 'line-height: normal;', - 'color: black;' - ] - .map(function (str) { return str.split(';')[0] + ' !important;'; }) - .join(''); - marker.textContent = key; - table[key] = target; - container.appendChild(marker); - return target; - }); - document.body.appendChild(container); - return markers; - function handler(event) { - event.preventDefault(); - event.stopImmediatePropagation(); - var key = ja2en(event.target.value), shiftKey = key === key.toUpperCase(), target = table[key.toLowerCase()]; - observer.removeEventListener('keydown', handler); - observer.removeEventListener('blur', handler); - container.remove(); - if (key && target) { - callback(target, shiftKey); - } - observer.blur(); - observer.remove(); - switch (key) { - case !reverse ? 'e' : 'E': - if (targets.length > keys.length) { - map(targets.slice(keys.length), callback, reverse, stack.concat(targets.slice(0, keys.length))); - } - else { - map(stack.concat(targets), callback, reverse); - } - break; - case !reverse ? 'E' : 'e': - if (stack.length === 0) { - stack = targets; - targets = []; - } - if (stack.length > keys.length) { - map(stack.slice(-keys.length).concat(targets), callback, reverse, stack.slice(0, Math.max(stack.length - keys.length, 0))); - } - else { - map(stack.concat(targets), callback, reverse); - } - break; - } - } - function calOffset(elem) { - var offset = elem.getBoundingClientRect(); - return { - top: scrollTop + offset.top, - left: scrollLeft + offset.left, - right: scrollLeft + offset.right, - bottom: scrollTop + offset.bottom - }; - } -} -exports.map = map; -function ja2en(char) { - switch (char) { - case 'q': - return 'q'; - case 'Q': - return 'Q'; - case 'w': - return 'w'; - case 'W': - return 'W'; - case 'え': - return 'e'; - case 'E': - return 'E'; - case 'r': - return 'r'; - case 'R': - return 'R'; - case 't': - return 't'; - case 'T': - return 'T'; - case 'y': - return 'y'; - case 'Y': - return 'Y'; - case 'う': - return 'u'; - case 'U': - return 'U'; - case 'い': - return 'i'; - case 'I': - return 'I'; - case 'お': - return 'o'; - case 'O': - return 'O'; - case 'p': - return 'p'; - case 'P': - return 'P'; - case 'あ': - return 'a'; - case 'A': - return 'A'; - case 's': - return 's'; - case 'S': - return 'S'; - case 'd': - return 'd'; - case 'D': - return 'D'; - case 'f': - return 'f'; - case 'F': - return 'F'; - case 'g': - return 'g'; - case 'G': - return 'G'; - case 'h': - return 'h'; - case 'H': - return 'H'; - case 'j': - return 'j'; - case 'J': - return 'J'; - case 'k': - return 'k'; - case 'K': - return 'K'; - case 'l': - return 'l'; - case 'L': - return 'L'; - case 'z': - return 'z'; - case 'Z': - return 'Z'; - case 'x': - return 'x'; - case 'X': - return 'X'; - case 'c': - return 'c'; - case 'C': - return 'C'; - case 'v': - return 'v'; - case 'V': - return 'V'; - case 'b': - return 'b'; - case 'B': - return 'B'; - case 'n': - return 'n'; - case 'N': - return 'N'; - case 'm': - return 'm'; - case 'M': - return 'M'; - default: - return char; - } -} +var ATTRIBUTE = require('../attribute/attribute'); +function map(targets, callback, reverse, stack) { + if (stack === void 0) { stack = []; } + if (targets.length === 0) { + return []; + } + var scrollTop = window.scrollY, scrollLeft = window.scrollX; + var keys = 'dsawgvcxlohnmzbptuy'.split(''), container = document.createElement('div'), observer = document.createElement('input'), table = {}; + observer.style.cssText = [ + 'position: fixed;', + 'width: 0px;', + 'height: 0px;', + 'bottom: 0px;', + 'right: 0px;', + 'margin: 0px;', + 'border-width: 0px;', + 'padding: 0px;', + 'z-index: -1;' + ] + .map(function (str) { return str.split(';')[0] + ' !important;'; }) + .join(''); + observer.addEventListener('input', handler); + observer.addEventListener('blur', handler); + document.body.appendChild(observer); + observer.focus(); + setTimeout(function () { return observer.focus(); }, 1000); + var markers = targets.slice(0, keys.length) + .map(function (target, i) { + var marker = document.createElement('span'), key = keys[i], offset = calOffset(target); + marker.classList.add(ATTRIBUTE.MARKER_TAG); + marker.classList.add(ATTRIBUTE.MARKER_TAG + '-' + key); + marker.style.cssText = [ + 'position: absolute;', + 'overflow: visible;', + 'z-index: 9999;', + 'top: ' + (offset.top - 3) + 'px;', + 'left: ' + (offset.left - 12) + 'px;', + 'min-width: 5px;', + 'margin: 0px;', + 'border: 0px;', + 'padding: 1px 3px;', + 'border-radius: 3px;', + 'box-shadow: 1px 1px 1px 0px;', + 'background-color: gold;', + 'font-family: Helvetica, Arial, sans-serif;', + 'font-size: 13px;', + 'font-weight: bold;', + 'line-height: normal;', + 'color: black;' + ] + .map(function (str) { return str.split(';')[0] + ' !important;'; }) + .join(''); + marker.textContent = key; + table[key] = target; + container.appendChild(marker); + return target; + }); + document.body.appendChild(container); + return markers; + function handler(event) { + event.preventDefault(); + event.stopImmediatePropagation(); + var key = ja2en(event.target.value), shiftKey = key === key.toUpperCase(), target = table[key.toLowerCase()]; + observer.removeEventListener('keydown', handler); + observer.removeEventListener('blur', handler); + container.remove(); + if (key && target) { + callback(target, shiftKey); + } + observer.blur(); + observer.remove(); + switch (key) { + case !reverse ? 'e' : 'E': + if (targets.length > keys.length) { + map(targets.slice(keys.length), callback, reverse, stack.concat(targets.slice(0, keys.length))); + } + else { + map(stack.concat(targets), callback, reverse); + } + break; + case !reverse ? 'E' : 'e': + if (stack.length === 0) { + stack = targets; + targets = []; + } + if (stack.length > keys.length) { + map(stack.slice(-keys.length).concat(targets), callback, reverse, stack.slice(0, Math.max(stack.length - keys.length, 0))); + } + else { + map(stack.concat(targets), callback, reverse); + } + break; + } + } + function calOffset(elem) { + var offset = elem.getBoundingClientRect(); + return { + top: scrollTop + offset.top, + left: scrollLeft + offset.left, + right: scrollLeft + offset.right, + bottom: scrollTop + offset.bottom + }; + } +} +exports.map = map; +function ja2en(char) { + switch (char) { + case 'q': + return 'q'; + case 'Q': + return 'Q'; + case 'w': + return 'w'; + case 'W': + return 'W'; + case 'え': + return 'e'; + case 'E': + return 'E'; + case 'r': + return 'r'; + case 'R': + return 'R'; + case 't': + return 't'; + case 'T': + return 'T'; + case 'y': + return 'y'; + case 'Y': + return 'Y'; + case 'う': + return 'u'; + case 'U': + return 'U'; + case 'い': + return 'i'; + case 'I': + return 'I'; + case 'お': + return 'o'; + case 'O': + return 'O'; + case 'p': + return 'p'; + case 'P': + return 'P'; + case 'あ': + return 'a'; + case 'A': + return 'A'; + case 's': + return 's'; + case 'S': + return 'S'; + case 'd': + return 'd'; + case 'D': + return 'D'; + case 'f': + return 'f'; + case 'F': + return 'F'; + case 'g': + return 'g'; + case 'G': + return 'G'; + case 'h': + return 'h'; + case 'H': + return 'H'; + case 'j': + return 'j'; + case 'J': + return 'J'; + case 'k': + return 'k'; + case 'K': + return 'K'; + case 'l': + return 'l'; + case 'L': + return 'L'; + case 'z': + return 'z'; + case 'Z': + return 'Z'; + case 'x': + return 'x'; + case 'X': + return 'X'; + case 'c': + return 'c'; + case 'C': + return 'C'; + case 'v': + return 'v'; + case 'V': + return 'V'; + case 'b': + return 'b'; + case 'B': + return 'B'; + case 'n': + return 'n'; + case 'N': + return 'N'; + case 'm': + return 'm'; + case 'M': + return 'M'; + default: + return char; + } +} },{"../attribute/attribute":2}],12:[function(require,module,exports){ "use strict"; -var ENTITY = require('../entity/entity'); -var ATTRIBUTE = require('../attribute/attribute'); -var MODEL = require('../model/model'); -var CONTROLLER = require('../controller/controller'); -var STATE = require('../state/module'); -var MAP = require('./map'); -var id = 0; -var views = {}; -exports.state = STATE.state; -var View = (function () { - function View(target) { - this.id_ = ++id; - this.style = document.createElement('style'); - views[this.id_] = this; - this.target_ = target; - this.handler_ = this.handler_.bind(this); - this.observe_(); - this.style.innerHTML = [ - '.' + ATTRIBUTE.CURSOR_ID + ' {', - ' outline: 3px solid gold !important;', - ' outline-offset: -3px !important;', - ' background-color: rgba(255, 255, 0, 0.4) !important;', - '}', - 'img.' + ATTRIBUTE.CURSOR_ID + ' {', - ' outline-offset: -3px !important;', - '}' - ].join('\n'); - } - View.prototype.handler_ = function (event) { - undisplayUrl(); - if (!exports.state()) { - return; - } - if (event.defaultPrevented) { - return; - } - if (isInserting(event.srcElement)) { - return; - } - var cursor = document.querySelector('.' + ATTRIBUTE.CURSOR_ID), entity = new ENTITY.Entity(this.id_), attribute = ATTRIBUTE.attribute(event, cursor); - if (attribute.command === 11 /* INVALID */) { - return; - } - if (!cursor && attribute.command === 8 /* ENTER */) { - return; - } - if (!cursor && attribute.command === 9 /* ENTER_S */) { - return; - } - event.preventDefault(); - event.stopImmediatePropagation(); - CONTROLLER.command(entity, attribute); - return; - function isInserting(elem) { - switch (elem.tagName.toLowerCase()) { - case 'input': - switch (elem.getAttribute('type')) { - case 'checkbox': - case 'radio': - case 'file': - case 'submit': - case 'reset': - case 'button': - case 'image': - case 'range': - case 'color': - return false; - } - return true; - case 'select': - return false; - case 'datalist': - case 'option': - case 'textarea': - return true; - } - switch (elem.getAttribute('role')) { - case 'textbox': - return true; - } - do { - if (elem.contentEditable === 'true') { - return true; - } - } while (elem = elem.parentElement); - return false; - } - }; - View.prototype.observe_ = function () { - this.target_.addEventListener('keydown', this.handler_, true); - }; - View.prototype.release_ = function () { - this.target_.removeEventListener('keydown', this.handler_, true); - }; - View.prototype.destructor = function () { - this.release_(); - delete views[this.id_]; - }; - View.prototype.update = function (command) { - if (!this.style.parentElement) { - document.head.appendChild(this.style); - } - var state = MODEL.store.state(this.id_), diff = MODEL.store.diff(this.id_); - var key; - while (key = diff.shift()) { - switch (key) { - case 'targets': - markTarget(state.targets); - } - } - function markTarget(targets) { - switch (command) { - case 0 /* UP */: - case 1 /* UP_S */: - case 2 /* DOWN */: - case 3 /* DOWN_S */: - case 4 /* LEFT */: - case 5 /* RIGHT */: - var target = targets[0]; - if (!target) { - break; - } - select(target); - target.scrollIntoViewIfNeeded(); - break; - case 6 /* EXPAND */: - MAP.map(targets, trigger, false); - break; - case 7 /* ENTER_C */: - trigger(document.querySelector('.' + ATTRIBUTE.CURSOR_ID), false, true); - break; - case 8 /* ENTER */: - trigger(document.querySelector('.' + ATTRIBUTE.CURSOR_ID), false, false); - break; - case 9 /* ENTER_S */: - trigger(document.querySelector('.' + ATTRIBUTE.CURSOR_ID), true, false); - break; - default: - unselect(); - } - return; - function select(elem) { - unselect(); - displayUrl(elem); - elem.classList.add(ATTRIBUTE.CURSOR_ID); - } - function unselect() { - var selector = document.querySelector('.' + ATTRIBUTE.CURSOR_ID); - if (!selector) { - return; - } - selector.classList.remove(ATTRIBUTE.CURSOR_ID); - undisplayUrl(); - } - function trigger(cursor, shiftKey, ctrlKey) { - if (!cursor) { - return; - } - if (!document.elementFromPoint(cursor.getBoundingClientRect().left, cursor.getBoundingClientRect().top)) { - return; - } - if (cursor.tagName.toLowerCase() === 'a' - || cursor.parentElement.tagName.toLowerCase() === 'a' - || cursor.onclick - || cursor.tagName.toLowerCase() === 'option' - || -1 < ['button'].indexOf(cursor.getAttribute('role'))) { - select(cursor); - } - else { - unselect(); - } - cursor.focus(); - click(cursor, shiftKey, ctrlKey); - } - } - }; - View.prototype.destroy = function () { - this.destructor(); - }; - return View; -})(); -exports.View = View; -function emit(entity, attribute) { - var viewId = entity.viewId; - if (viewId in views) { - views[viewId].update(attribute.command); - return true; - } - else { - return false; - } -} -exports.emit = emit; -function displayUrl(cursor) { - if (!cursor) { - return; - } - if (cursor.tagName.toLowerCase() !== 'a') { - return displayUrl(cursor.parentElement); - } - var display = document.createElement('span'); - display.id = ATTRIBUTE.URLDISPLAY_ID; - display.style.cssText = [ - 'position: fixed;', - 'z-index: 9999;', - 'left: 0px;', - 'bottom: 0px;', - 'min-width: 35%;', - 'padding: 3px 3px 0 3px;', - 'color: #ececec;', - 'background-color: #26272A;', - 'border-radius: 0;', - 'font-family: Meiryo, Helvetica, sans-serif;', - 'font-size: 11.5px;', - 'text-align: left;' - ] - .map(function (str) { return str.split(';')[0] + ' !important;'; }) - .join(''); - display.textContent = cursor.href; - document.body.appendChild(display); -} -function undisplayUrl() { - var display = document.querySelector('#' + ATTRIBUTE.URLDISPLAY_ID); - if (!display) { - return; - } - display.remove(); -} -function click(elem, shiftKey, ctrlKey) { - var target = elem.hasAttribute('target') && elem.getAttribute('target'); - if (elem.tagName.toLowerCase() === 'a') { - elem.removeAttribute('target'); - } - ["mouseover", "mousedown", "mouseup", "click"] - .forEach(function (sequence) { - var mouseEvent = document.createEvent("MouseEvents"); - mouseEvent.initMouseEvent(sequence, true, true, window, 1, 0, 0, 0, 0, ctrlKey, false, shiftKey, false, 0, null); - elem.dispatchEvent(mouseEvent); - }); - if (elem.tagName.toLowerCase() === 'a') { - typeof target === 'boolean' ? elem.removeAttribute('target') : elem.setAttribute('target', target); - } -} +var ENTITY = require('../entity/entity'); +var ATTRIBUTE = require('../attribute/attribute'); +var MODEL = require('../model/model'); +var CONTROLLER = require('../controller/controller'); +var STATE = require('../state/module'); +var MAP = require('./map'); +var id = 0; +var views = {}; +exports.state = STATE.state; +var View = (function () { + function View(target) { + this.id_ = ++id; + this.style = document.createElement('style'); + views[this.id_] = this; + this.target_ = target; + this.handler_ = this.handler_.bind(this); + this.observe_(); + this.style.innerHTML = [ + '.' + ATTRIBUTE.CURSOR_ID + ' {', + ' outline: 3px solid gold !important;', + ' outline-offset: -3px !important;', + ' background-color: rgba(255, 255, 0, 0.4) !important;', + '}', + 'img.' + ATTRIBUTE.CURSOR_ID + ' {', + ' outline-offset: -3px !important;', + '}' + ].join('\n'); + } + View.prototype.handler_ = function (event) { + undisplayUrl(); + if (!exports.state()) { + return; + } + if (event.defaultPrevented) { + return; + } + if (isInserting(event.srcElement)) { + return; + } + var cursor = document.querySelector('.' + ATTRIBUTE.CURSOR_ID), entity = new ENTITY.Entity(this.id_), attribute = ATTRIBUTE.attribute(event, cursor); + if (attribute.command === 11 /* INVALID */) { + return; + } + if (!cursor && attribute.command === 8 /* ENTER */) { + return; + } + if (!cursor && attribute.command === 9 /* ENTER_S */) { + return; + } + event.preventDefault(); + event.stopImmediatePropagation(); + CONTROLLER.command(entity, attribute); + return; + function isInserting(elem) { + switch (elem.tagName.toLowerCase()) { + case 'input': + switch (elem.getAttribute('type')) { + case 'checkbox': + case 'radio': + case 'file': + case 'submit': + case 'reset': + case 'button': + case 'image': + case 'range': + case 'color': + return false; + } + return true; + case 'select': + return false; + case 'datalist': + case 'option': + case 'textarea': + return true; + } + switch (elem.getAttribute('role')) { + case 'textbox': + return true; + } + do { + if (elem.contentEditable === 'true') { + return true; + } + } while (elem = elem.parentElement); + return false; + } + }; + View.prototype.observe_ = function () { + this.target_.addEventListener('keydown', this.handler_, true); + }; + View.prototype.release_ = function () { + this.target_.removeEventListener('keydown', this.handler_, true); + }; + View.prototype.destructor = function () { + this.release_(); + delete views[this.id_]; + }; + View.prototype.update = function (command) { + if (!this.style.parentElement) { + document.head.appendChild(this.style); + } + var state = MODEL.store.state(this.id_), diff = MODEL.store.diff(this.id_); + var key; + while (key = diff.shift()) { + switch (key) { + case 'targets': + markTarget(state.targets); + } + } + function markTarget(targets) { + switch (command) { + case 0 /* UP */: + case 1 /* UP_S */: + case 2 /* DOWN */: + case 3 /* DOWN_S */: + case 4 /* LEFT */: + case 5 /* RIGHT */: + var target = targets[0]; + if (!target) { + break; + } + select(target); + target.scrollIntoViewIfNeeded(); + break; + case 6 /* EXPAND */: + MAP.map(targets, trigger, false); + break; + case 7 /* ENTER_C */: + trigger(document.querySelector('.' + ATTRIBUTE.CURSOR_ID), false, true); + break; + case 8 /* ENTER */: + trigger(document.querySelector('.' + ATTRIBUTE.CURSOR_ID), false, false); + break; + case 9 /* ENTER_S */: + trigger(document.querySelector('.' + ATTRIBUTE.CURSOR_ID), true, false); + break; + default: + unselect(); + } + return; + function select(elem) { + unselect(); + displayUrl(elem); + elem.classList.add(ATTRIBUTE.CURSOR_ID); + } + function unselect() { + var selector = document.querySelector('.' + ATTRIBUTE.CURSOR_ID); + if (!selector) { + return; + } + selector.classList.remove(ATTRIBUTE.CURSOR_ID); + undisplayUrl(); + } + function trigger(cursor, shiftKey, ctrlKey) { + if (!cursor) { + return; + } + if (!document.elementFromPoint(cursor.getBoundingClientRect().left, cursor.getBoundingClientRect().top)) { + return; + } + if (cursor.tagName.toLowerCase() === 'a' + || cursor.parentElement.tagName.toLowerCase() === 'a' + || cursor.onclick + || cursor.tagName.toLowerCase() === 'option' + || -1 < ['button'].indexOf(cursor.getAttribute('role'))) { + select(cursor); + } + else { + unselect(); + } + cursor.focus(); + click(cursor, shiftKey, ctrlKey); + } + } + }; + View.prototype.destroy = function () { + this.destructor(); + }; + return View; +})(); +exports.View = View; +function emit(entity, attribute) { + var viewId = entity.viewId; + if (viewId in views) { + views[viewId].update(attribute.command); + return true; + } + else { + return false; + } +} +exports.emit = emit; +function displayUrl(cursor) { + if (!cursor) { + return; + } + if (cursor.tagName.toLowerCase() !== 'a') { + return displayUrl(cursor.parentElement); + } + var display = document.createElement('span'); + display.id = ATTRIBUTE.URLDISPLAY_ID; + display.style.cssText = [ + 'position: fixed;', + 'z-index: 9999;', + 'left: 0px;', + 'bottom: 0px;', + 'min-width: 35%;', + 'padding: 3px 3px 0 3px;', + 'color: #ececec;', + 'background-color: #26272A;', + 'border-radius: 0;', + 'font-family: Meiryo, Helvetica, sans-serif;', + 'font-size: 11.5px;', + 'text-align: left;' + ] + .map(function (str) { return str.split(';')[0] + ' !important;'; }) + .join(''); + display.textContent = cursor.href; + document.body.appendChild(display); +} +function undisplayUrl() { + var display = document.querySelector('#' + ATTRIBUTE.URLDISPLAY_ID); + if (!display) { + return; + } + display.remove(); +} +function click(elem, shiftKey, ctrlKey) { + var target = elem.hasAttribute('target') && elem.getAttribute('target'); + if (elem.tagName.toLowerCase() === 'a') { + elem.removeAttribute('target'); + } + ["mouseover", "mousedown", "mouseup", "click"] + .forEach(function (sequence) { + var mouseEvent = document.createEvent("MouseEvents"); + mouseEvent.initMouseEvent(sequence, true, true, window, 1, 0, 0, 0, 0, ctrlKey, false, shiftKey, false, 0, null); + elem.dispatchEvent(mouseEvent); + }); + if (elem.tagName.toLowerCase() === 'a') { + typeof target === 'boolean' ? elem.removeAttribute('target') : elem.setAttribute('target', target); + } +} },{"../attribute/attribute":2,"../controller/controller":3,"../entity/entity":5,"../model/model":8,"../state/module":9,"./map":11}]},{},[2,3,4,5,6,7,8,9,10,11,12]); -}("spatial-navigation", "0.4.7"); +}("spatial-navigation", "0.4.7"); diff --git a/manifest.json b/manifest.json index c2b5e6e..aed84ff 100755 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,8 @@ { - "content_scripts": [ { - "js": [ "dist/raw/spatial-navigation.js" ], - "matches": [ "\u003Call_urls>" ], + "content_scripts": [ + { + "js": ["js/spatial-navigation.js"], + "matches": ["\u003Call_urls>"], "run_at": "document_end" } ],