index.jsView |
---|
39 | 39 … | this.queryLen = str.length; |
40 | 40 … | this.query = new RegExp(addAccents(str), "i"); |
41 | 41 … | }; |
42 | 42 … | |
| 43 … | +function log() { |
| 44 … | + var str; |
| 45 … | + try { |
| 46 … | + str = [].slice.call(arguments).join(", "); |
| 47 … | + } catch(e) { |
| 48 … | + str = e.message; |
| 49 … | + } |
| 50 … | + document.body.appendChild(document.createElement("pre")) |
| 51 … | + .appendChild(document.createTextNode(str)); |
| 52 … | +} |
| 53 … | +window.log = log; |
| 54 … | + |
| 55 … | +function getFirstTextNode(container) { |
| 56 … | + return getNextTextNode(container, container); |
| 57 … | +} |
| 58 … | + |
| 59 … | +function getNextTextNode(node, container) { |
| 60 … | + do { |
| 61 … | + if (node.firstChild) { |
| 62 … | + console.log('firstchild') |
| 63 … | + node = node.firstChild; |
| 64 … | + } else if (node.nextSibling) { |
| 65 … | + console.log('nextsib') |
| 66 … | + node = node.nextSibling; |
| 67 … | + } else { |
| 68 … | + do { |
| 69 … | + if (node == container) |
|
| 70 … | + return null; |
| 71 … | + console.log('parent') |
| 72 … | + node = node.parentNode; |
| 73 … | + } while (!node.nextSibling); |
| 74 … | + console.log('next sib') |
| 75 … | + node = node.nextSibling; |
| 76 … | + } |
| 77 … | + } while (node.nodeType != Node.TEXT_NODE); |
| 78 … | + console.log('ret', node.nodeValue) |
| 79 … | + return node; |
| 80 … | +} |
| 81 … | + |
| 82 … | +function nodeValue(node) { |
| 83 … | + return node.nodeValue; |
| 84 … | +} |
| 85 … | + |
| 86 … | +function textNodesToString(nodes) { |
| 87 … | + return nodes.map(nodeValue).join(""); |
| 88 … | +} |
| 89 … | + |
43 | 90 … | Searcher.prototype.selectNext = function () { |
44 | | - |
| 91 … | + if (!this.queryLen) |
| 92 … | + return; |
| 93 … | + |
45 | 94 … | var sel = window.getSelection(); |
46 | | - |
| 95 … | + var startNode = sel.extentNode || getFirstTextNode(this.container); |
| 96 … | + var startOffset = sel.extentOffset; |
| 97 … | + var textNodesTextLen = startNode.nodeValue.length - startOffset; |
| 98 … | + var textNodes = [startNode]; |
| 99 … | + var lastTextNode = startNode; |
| 100 … | + while (textNodesTextLen < this.queryLen) { |
| 101 … | + |
| 102 … | + lastTextNode = getNextTextNode(lastTextNode, this.container); |
| 103 … | + if (!lastTextNode) |
| 104 … | + return; |
| 105 … | + textNodes.push(lastTextNode); |
| 106 … | + textNodesTextLen += lastTextNode.nodeValue.length; |
| 107 … | + } |
| 108 … | + var str = textNodesToString(textNodes); |
| 109 … | + log(textNodesTextLen, textNodes.length, str); |
| 110 … | + textNodesToString(textNodes); |
| 111 … | + var m = str.search(this.query); |
| 112 … | + if (m) { |
| 113 … | + var i = m.index; |
| 114 … | + var firstNodeLen = textNodes[0].nodeValue.length; |
| 115 … | + while (i > firstNodeLen) { |
| 116 … | + textNodesTextLen -= firstNodeLen; |
| 117 … | + i -= firstNodeLen; |
| 118 … | + textNodes.shift(); |
| 119 … | + } |
| 120 … | + startNode = textNodes[0]; |
| 121 … | + startOffset = i; |
| 122 … | + |
| 123 … | + setSelection(startNode, startOffset, |
| 124 … | + startNode, startOffset + 1); |
| 125 … | + } |
| 126 … | + |
| 127 … | + |
| 128 … | + |
| 129 … | + |
| 130 … | + |
| 131 … | + |
47 | 132 … | setSelection(sel.anchorNode, sel.anchorOffset + 1, |
48 | 133 … | sel.extentNode, sel.extentOffset + 1); |
| 134 … | + */ |
49 | 135 … | }; |
50 | 136 … | |
51 | 137 … | Searcher.prototype.selectPrev = function () { |
52 | 138 … | }; |