diff options
Diffstat (limited to 'src/node_modules/reflect-metadata/docs/ecmarkup.js')
-rw-r--r-- | src/node_modules/reflect-metadata/docs/ecmarkup.js | 893 |
1 files changed, 893 insertions, 0 deletions
diff --git a/src/node_modules/reflect-metadata/docs/ecmarkup.js b/src/node_modules/reflect-metadata/docs/ecmarkup.js new file mode 100644 index 0000000..6ad1a1f --- /dev/null +++ b/src/node_modules/reflect-metadata/docs/ecmarkup.js @@ -0,0 +1,893 @@ +"use strict"; + +function Search(menu) { + this.menu = menu; + this.$search = document.getElementById('menu-search'); + this.$searchBox = document.getElementById('menu-search-box'); + this.$searchResults = document.getElementById('menu-search-results'); + + this.loadBiblio(); + + document.addEventListener('keydown', this.documentKeydown.bind(this)); + + this.$searchBox.addEventListener('keydown', debounce(this.searchBoxKeydown.bind(this), { stopPropagation: true })); + this.$searchBox.addEventListener('keyup', debounce(this.searchBoxKeyup.bind(this), { stopPropagation: true })); +} + +Search.prototype.loadBiblio = function () { + var $biblio = document.getElementById('menu-search-biblio'); + if (!$biblio) { + this.biblio = []; + } else { + this.biblio = JSON.parse($biblio.textContent); + this.biblio.clauses = this.biblio.filter(function (e) { return e.type === 'clause' }); + this.biblio.byId = this.biblio.reduce(function (map, entry) { + map[entry.id] = entry; + return map; + }, {}); + } +} + +Search.prototype.documentKeydown = function (e) { + if (e.keyCode === 191) { + e.preventDefault(); + e.stopPropagation(); + this.triggerSearch(); + } +} + +Search.prototype.searchBoxKeydown = function (e) { + e.stopPropagation(); + e.preventDefault(); + if (e.keyCode === 191 && e.target.value.length === 0) { + e.preventDefault(); + } else if (e.keyCode === 13) { + e.preventDefault(); + this.selectResult(); + } +} + +Search.prototype.searchBoxKeyup = function (e) { + if (e.keyCode === 13 || e.keyCode === 9) { + return; + } + + this.search(e.target.value); +} + + +Search.prototype.triggerSearch = function (e) { + if (this.menu.isVisible()) { + this._closeAfterSearch = false; + } else { + this._closeAfterSearch = true; + this.menu.show(); + } + + this.$searchBox.focus(); + this.$searchBox.select(); +} +// bit 12 - Set if the result starts with searchString +// bits 8-11: 8 - number of chunks multiplied by 2 if cases match, otherwise 1. +// bits 1-7: 127 - length of the entry +// General scheme: prefer case sensitive matches with fewer chunks, and otherwise +// prefer shorter matches. +function relevance(result, searchString) { + var relevance = 0; + + relevance = Math.max(0, 8 - result.match.chunks) << 7; + + if (result.match.caseMatch) { + relevance *= 2; + } + + if (result.match.prefix) { + relevance += 2048 + } + + relevance += Math.max(0, 255 - result.entry.key.length); + + return relevance; +} + +Search.prototype.search = function (searchString) { + var s = Date.now(); + + if (searchString === '') { + this.displayResults([]); + this.hideSearch(); + return; + } else { + this.showSearch(); + } + + if (searchString.length === 1) { + this.displayResults([]); + return; + } + + var results; + + if (/^[\d\.]*$/.test(searchString)) { + results = this.biblio.clauses.filter(function (clause) { + return clause.number.substring(0, searchString.length) === searchString; + }).map(function (clause) { + return { entry: clause }; + }); + } else { + results = []; + + for (var i = 0; i < this.biblio.length; i++) { + var entry = this.biblio[i]; + if (!entry.key) { + // biblio entries without a key aren't searchable + continue; + } + + var match = fuzzysearch(searchString, entry.key); + if (match) { + results.push({ entry: entry, match: match }); + } + } + + results.forEach(function (result) { + result.relevance = relevance(result, searchString); + }); + + results = results.sort(function (a, b) { return b.relevance - a.relevance }); + + } + + if (results.length > 50) { + results = results.slice(0, 50); + } + + this.displayResults(results); +} +Search.prototype.hideSearch = function () { + this.$search.classList.remove('active'); +} + +Search.prototype.showSearch = function () { + this.$search.classList.add('active'); +} + +Search.prototype.selectResult = function () { + var $first = this.$searchResults.querySelector('li:first-child a'); + + if ($first) { + document.location = $first.getAttribute('href'); + } + + this.$searchBox.value = ''; + this.$searchBox.blur(); + this.displayResults([]); + this.hideSearch(); + + if (this._closeAfterSearch) { + this.menu.hide(); + } +} + +Search.prototype.displayResults = function (results) { + if (results.length > 0) { + this.$searchResults.classList.remove('no-results'); + + var html = '<ul>'; + + results.forEach(function (result) { + var entry = result.entry; + var id = entry.id; + var cssClass = ''; + var text = ''; + + if (entry.type === 'clause') { + var number = entry.number ? entry.number + ' ' : ''; + text = number + entry.key; + cssClass = 'clause'; + id = entry.id; + } else if (entry.type === 'production') { + text = entry.key; + cssClass = 'prod'; + id = entry.id; + } else if (entry.type === 'op') { + text = entry.key; + cssClass = 'op'; + id = entry.id || entry.refId; + } else if (entry.type === 'term') { + text = entry.key; + cssClass = 'term'; + id = entry.id || entry.refId; + } + + if (text) { + html += '<li class=menu-search-result-' + cssClass + '><a href="#' + id + '">' + text + '</a></li>' + } + }); + + html += '</ul>' + + this.$searchResults.innerHTML = html; + } else { + this.$searchResults.innerHTML = ''; + this.$searchResults.classList.add('no-results'); + } +} + + +function Menu() { + this.$toggle = document.getElementById('menu-toggle'); + this.$menu = document.getElementById('menu'); + this.$toc = document.querySelector('menu-toc > ol'); + this.$pins = document.querySelector('#menu-pins'); + this.$pinList = document.getElementById('menu-pins-list'); + this.$toc = document.querySelector('#menu-toc > ol'); + this.$specContainer = document.getElementById('spec-container'); + this.search = new Search(this); + + this._pinnedIds = {}; + this.loadPinEntries(); + + // toggle menu + this.$toggle.addEventListener('click', this.toggle.bind(this)); + + // keydown events for pinned clauses + document.addEventListener('keydown', this.documentKeydown.bind(this)); + + // toc expansion + var tocItems = this.$menu.querySelectorAll('#menu-toc li'); + for (var i = 0; i < tocItems.length; i++) { + var $item = tocItems[i]; + $item.addEventListener('click', function($item, event) { + $item.classList.toggle('active'); + event.stopPropagation(); + }.bind(null, $item)); + } + + // close toc on toc item selection + var tocLinks = this.$menu.querySelectorAll('#menu-toc li > a'); + for (var i = 0; i < tocLinks.length; i++) { + var $link = tocLinks[i]; + $link.addEventListener('click', function(event) { + this.toggle(); + event.stopPropagation(); + }.bind(this)); + } + + // update active clause on scroll + window.addEventListener('scroll', debounce(this.updateActiveClause.bind(this))); + this.updateActiveClause(); + + // prevent menu scrolling from scrolling the body + this.$toc.addEventListener('wheel', function (e) { + var target = e.currentTarget; + var offTop = e.deltaY < 0 && target.scrollTop === 0; + if (offTop) { + e.preventDefault(); + } + var offBottom = e.deltaY > 0 + && target.offsetHeight + target.scrollTop >= target.scrollHeight; + + if (offBottom) { + e.preventDefault(); + } + }) +} + +Menu.prototype.documentKeydown = function (e) { + e.stopPropagation(); + if (e.keyCode === 80) { + this.togglePinEntry(); + } else if (e.keyCode > 48 && e.keyCode < 58) { + this.selectPin(e.keyCode - 49); + } +} + +Menu.prototype.updateActiveClause = function () { + this.setActiveClause(findActiveClause(this.$specContainer)) +} + +Menu.prototype.setActiveClause = function (clause) { + this.$activeClause = clause; + this.revealInToc(this.$activeClause); +} + +Menu.prototype.revealInToc = function (path) { + var current = this.$toc.querySelectorAll('li.revealed'); + for (var i = 0; i < current.length; i++) { + current[i].classList.remove('revealed'); + current[i].classList.remove('revealed-leaf'); + } + + var current = this.$toc; + var index = 0; + while (index < path.length) { + var children = current.children; + for (var i = 0; i < children.length; i++) { + if ('#' + path[index].id === children[i].children[1].getAttribute('href') ) { + children[i].classList.add('revealed'); + if (index === path.length - 1) { + children[i].classList.add('revealed-leaf'); + var rect = children[i].getBoundingClientRect(); + this.$toc.getBoundingClientRect().top + var tocRect = this.$toc.getBoundingClientRect(); + if (rect.top + 10 > tocRect.bottom) { + this.$toc.scrollTop = this.$toc.scrollTop + (rect.top - tocRect.bottom) + (rect.bottom - rect.top); + } else if (rect.top < tocRect.top) { + this.$toc.scrollTop = this.$toc.scrollTop - (tocRect.top - rect.top); + } + } + current = children[i].querySelector('ol'); + index++; + break; + } + } + + } +} + +function findActiveClause(root, path) { + var clauses = new ClauseWalker(root); + var $clause; + var found = false; + var path = path || []; + + while ($clause = clauses.nextNode()) { + var rect = $clause.getBoundingClientRect(); + var $header = $clause.children[0]; + var marginTop = parseInt(getComputedStyle($header)["margin-top"]); + + if ((rect.top - marginTop) <= 0 && rect.bottom > 0) { + found = true; + return findActiveClause($clause, path.concat($clause)) || path; + } + } + + return path; +} + +function ClauseWalker(root) { + var previous; + var treeWalker = document.createTreeWalker( + root, + NodeFilter.SHOW_ELEMENT, + { + acceptNode: function (node) { + if (previous === node.parentNode) { + return NodeFilter.FILTER_REJECT; + } else { + previous = node; + } + if (node.nodeName === 'EMU-CLAUSE' || node.nodeName === 'EMU-INTRO' || node.nodeName === 'EMU-ANNEX') { + return NodeFilter.FILTER_ACCEPT; + } else { + return NodeFilter.FILTER_SKIP; + } + } + }, + false + ); + + return treeWalker; +} + +Menu.prototype.toggle = function () { + this.$menu.classList.toggle('active'); +} + +Menu.prototype.show = function () { + this.$menu.classList.add('active'); +} + +Menu.prototype.hide = function () { + this.$menu.classList.remove('active'); +} + +Menu.prototype.isVisible = function() { + return this.$menu.classList.contains('active'); +} + +Menu.prototype.showPins = function () { + this.$pins.classList.add('active'); +} + +Menu.prototype.hidePins = function () { + this.$pins.classList.remove('active'); +} + +Menu.prototype.addPinEntry = function (id) { + var entry = this.search.biblio.byId[id]; + if (!entry) { + // id was deleted after pin (or something) so remove it + delete this._pinnedIds[id]; + this.persistPinEntries(); + return; + } + + if (entry.type === 'clause') { + var prefix; + if (entry.number) { + prefix = entry.number + ' '; + } else { + prefix = ''; + } + this.$pinList.innerHTML += '<li><a href="#' + entry.id + '">' + prefix + entry.titleHTML + '</a></li>'; + } else { + this.$pinList.innerHTML += '<li><a href="#' + entry.id + '">' + entry.key + '</a></li>'; + } + + if (Object.keys(this._pinnedIds).length === 0) { + this.showPins(); + } + this._pinnedIds[id] = true; + this.persistPinEntries(); +} + +Menu.prototype.removePinEntry = function (id) { + var item = this.$pinList.querySelector('a[href="#' + id + '"]').parentNode; + this.$pinList.removeChild(item); + delete this._pinnedIds[id]; + if (Object.keys(this._pinnedIds).length === 0) { + this.hidePins(); + } + + this.persistPinEntries(); +} + +Menu.prototype.persistPinEntries = function () { + try { + if (!window.localStorage) return; + } catch (e) { + return; + } + + localStorage.pinEntries = JSON.stringify(Object.keys(this._pinnedIds)); +} + +Menu.prototype.loadPinEntries = function () { + try { + if (!window.localStorage) return; + } catch (e) { + return; + } + + var pinsString = window.localStorage.pinEntries; + if (!pinsString) return; + var pins = JSON.parse(pinsString); + for(var i = 0; i < pins.length; i++) { + this.addPinEntry(pins[i]); + } +} + +Menu.prototype.togglePinEntry = function (id) { + if (!id) { + id = this.$activeClause[this.$activeClause.length - 1].id; + } + + if (this._pinnedIds[id]) { + this.removePinEntry(id); + } else { + this.addPinEntry(id); + } +} + +Menu.prototype.selectPin = function (num) { + document.location = this.$pinList.children[num].children[0].href; +} + +var menu; +function init() { + menu = new Menu(); + var $container = document.getElementById('spec-container'); + $container.addEventListener('mouseover', debounce(function (e) { + Toolbox.activateIfMouseOver(e); + })); +} + +document.addEventListener('DOMContentLoaded', init); + +function debounce(fn, opts) { + opts = opts || {}; + var timeout; + return function(e) { + if (opts.stopPropagation) { + e.stopPropagation(); + } + var args = arguments; + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(function() { + timeout = null; + fn.apply(this, args); + }.bind(this), 150); + } +} + +var CLAUSE_NODES = ['EMU-CLAUSE', 'EMU-INTRO', 'EMU-ANNEX']; +function findLocalReferences ($elem) { + var name = $elem.innerHTML; + var references = []; + + var parentClause = $elem.parentNode; + while (parentClause && CLAUSE_NODES.indexOf(parentClause.nodeName) === -1) { + parentClause = parentClause.parentNode; + } + + if(!parentClause) return; + + var vars = parentClause.querySelectorAll('var'); + + for (var i = 0; i < vars.length; i++) { + var $var = vars[i]; + + if ($var.innerHTML === name) { + references.push($var); + } + } + + return references; +} + +function toggleFindLocalReferences($elem) { + var references = findLocalReferences($elem); + if ($elem.classList.contains('referenced')) { + references.forEach(function ($reference) { + $reference.classList.remove('referenced'); + }); + } else { + references.forEach(function ($reference) { + $reference.classList.add('referenced'); + }); + } +} + +function installFindLocalReferences () { + document.addEventListener('click', function (e) { + if (e.target.nodeName === 'VAR') { + toggleFindLocalReferences(e.target); + } + }); +} + +document.addEventListener('DOMContentLoaded', installFindLocalReferences); + + + + +// The following license applies to the fuzzysearch function +// The MIT License (MIT) +// Copyright © 2015 Nicolas Bevacqua +// Copyright © 2016 Brian Terlson +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +function fuzzysearch (searchString, haystack, caseInsensitive) { + var tlen = haystack.length; + var qlen = searchString.length; + var chunks = 1; + var finding = false; + var prefix = true; + + if (qlen > tlen) { + return false; + } + + if (qlen === tlen) { + if (searchString === haystack) { + return { caseMatch: true, chunks: 1, prefix: true }; + } else if (searchString.toLowerCase() === haystack.toLowerCase()) { + return { caseMatch: false, chunks: 1, prefix: true }; + } else { + return false; + } + } + + outer: for (var i = 0, j = 0; i < qlen; i++) { + var nch = searchString[i]; + while (j < tlen) { + var targetChar = haystack[j++]; + if (targetChar === nch) { + finding = true; + continue outer; + } + if (finding) { + chunks++; + finding = false; + } + } + + if (caseInsensitive) { return false } + + return fuzzysearch(searchString.toLowerCase(), haystack.toLowerCase(), true); + } + + return { caseMatch: !caseInsensitive, chunks: chunks, prefix: j <= qlen }; +} + +var Toolbox = { + init: function () { + this.$container = document.createElement('div'); + this.$container.classList.add('toolbox'); + this.$permalink = document.createElement('a'); + this.$permalink.textContent = 'Permalink'; + this.$pinLink = document.createElement('a'); + this.$pinLink.textContent = 'Pin'; + this.$pinLink.setAttribute('href', '#'); + this.$pinLink.addEventListener('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + menu.togglePinEntry(this.entry.id); + }.bind(this)); + + this.$refsLink = document.createElement('a'); + this.$refsLink.setAttribute('href', '#'); + this.$refsLink.addEventListener('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + referencePane.showReferencesFor(this.entry); + }.bind(this)); + this.$container.appendChild(this.$permalink); + this.$container.appendChild(this.$pinLink); + this.$container.appendChild(this.$refsLink); + document.body.appendChild(this.$container); + }, + + activate: function (el, entry, target) { + if (el === this._activeEl) return; + this.active = true; + this.entry = entry; + this.$container.classList.add('active'); + this.top = el.offsetTop - this.$container.offsetHeight - 10; + this.left = el.offsetLeft; + this.$container.setAttribute('style', 'left: ' + this.left + 'px; top: ' + this.top + 'px'); + this.updatePermalink(); + this.updateReferences(); + this._activeEl = el; + if (this.top < document.body.scrollTop && el === target) { + // don't scroll unless it's a small thing (< 200px) + this.$container.scrollIntoView(); + } + }, + + updatePermalink: function () { + this.$permalink.setAttribute('href', '#' + this.entry.id); + }, + + updateReferences: function () { + this.$refsLink.textContent = 'References (' + this.entry.referencingIds.length + ')'; + }, + + activateIfMouseOver: function (e) { + var ref = this.findReferenceUnder(e.target); + if (ref && (!this.active || e.pageY > this._activeEl.offsetTop)) { + var entry = menu.search.biblio.byId[ref.id]; + this.activate(ref.element, entry, e.target); + } else if (this.active && ((e.pageY < this.top) || e.pageY > (this._activeEl.offsetTop + this._activeEl.offsetHeight))) { + this.deactivate(); + } + }, + + findReferenceUnder: function (el) { + while (el) { + var parent = el.parentNode; + if (el.nodeName === 'H1' && parent.nodeName.match(/EMU-CLAUSE|EMU-ANNEX|EMU-INTRO/) && parent.id) { + return { element: el, id: parent.id }; + } else if (el.nodeName.match(/EMU-(?!CLAUSE|XREF|ANNEX|INTRO)|DFN/) && + el.id && el.id[0] !== '_') { + if (el.nodeName === 'EMU-FIGURE' || el.nodeName === 'EMU-TABLE' || el.nodeName === 'EMU-EXAMPLE') { + // return the figcaption element + return { element: el.children[0].children[0], id: el.id }; + } else if (el.nodeName === 'EMU-PRODUCTION') { + // return the LHS non-terminal element + return { element: el.children[0], id: el.id }; + } else { + return { element: el, id: el.id }; + } + } + el = parent; + } + }, + + deactivate: function () { + this.$container.classList.remove('active'); + this._activeEl = null; + this.activeElBounds = null; + this.active = false; + } +} + +var referencePane = { + init: function() { + this.$container = document.createElement('div'); + this.$container.setAttribute('id', 'references-pane-container'); + + var $spacer = document.createElement('div'); + $spacer.setAttribute('id', 'references-pane-spacer'); + + this.$pane = document.createElement('div'); + this.$pane.setAttribute('id', 'references-pane'); + + this.$container.appendChild($spacer); + this.$container.appendChild(this.$pane); + + this.$header = document.createElement('div'); + this.$header.classList.add('menu-pane-header'); + this.$header.textContent = 'References to '; + this.$headerRefId = document.createElement('a'); + this.$header.appendChild(this.$headerRefId); + this.$closeButton = document.createElement('span'); + this.$closeButton.setAttribute('id', 'references-pane-close'); + this.$closeButton.addEventListener('click', function (e) { + this.deactivate(); + }.bind(this)); + this.$header.appendChild(this.$closeButton); + + this.$pane.appendChild(this.$header); + var tableContainer = document.createElement('div'); + tableContainer.setAttribute('id', 'references-pane-table-container'); + + this.$table = document.createElement('table'); + this.$table.setAttribute('id', 'references-pane-table'); + + this.$tableBody = this.$table.createTBody(); + + tableContainer.appendChild(this.$table); + this.$pane.appendChild(tableContainer); + + menu.$specContainer.appendChild(this.$container); + }, + + activate: function () { + this.$container.classList.add('active'); + }, + + deactivate: function () { + this.$container.classList.remove('active'); + }, + + showReferencesFor(entry) { + this.activate(); + var newBody = document.createElement('tbody'); + var previousId; + var previousCell; + var dupCount = 0; + this.$headerRefId.textContent = '#' + entry.id; + this.$headerRefId.setAttribute('href', '#' + entry.id); + entry.referencingIds.map(function (id) { + var target = document.getElementById(id); + var cid = findParentClauseId(target); + var clause = menu.search.biblio.byId[cid]; + var dupCount = 0; + return { id: id, clause: clause } + }).sort(function (a, b) { + return sortByClauseNumber(a.clause, b.clause); + }).forEach(function (record, i) { + if (previousId === record.clause.id) { + previousCell.innerHTML += ' (<a href="#' + record.id + '">' + (dupCount + 2) + '</a>)'; + dupCount++; + } else { + var row = newBody.insertRow(); + var cell = row.insertCell(); + cell.innerHTML = record.clause.number; + cell = row.insertCell(); + cell.innerHTML = '<a href="#' + record.id + '">' + record.clause.titleHTML + '</a>'; + previousCell = cell; + previousId = record.clause.id; + dupCount = 0; + } + }, this); + this.$table.removeChild(this.$tableBody); + this.$tableBody = newBody; + this.$table.appendChild(this.$tableBody); + } +} +function findParentClauseId(node) { + while (node && node.nodeName !== 'EMU-CLAUSE' && node.nodeName !== 'EMU-INTRO' && node.nodeName !== 'EMU-ANNEX') { + node = node.parentNode; + } + if (!node) return null; + return node.getAttribute('id'); +} + +function sortByClauseNumber(c1, c2) { + var c1c = c1.number.split('.'); + var c2c = c2.number.split('.'); + + for (var i = 0; i < c1c.length; i++) { + if (i >= c2c.length) { + return 1; + } + + var c1 = c1c[i]; + var c2 = c2c[i]; + var c1cn = Number(c1); + var c2cn = Number(c2); + + if (Number.isNaN(c1cn) && Number.isNaN(c2cn)) { + if (c1 > c2) { + return 1; + } else if (c1 < c2) { + return -1; + } + } else if (!Number.isNaN(c1cn) && Number.isNaN(c2cn)) { + return -1; + } else if (Number.isNaN(c1cn) && !Number.isNaN(c2cn)) { + return 1; + } else if(c1cn > c2cn) { + return 1; + } else if (c1cn < c2cn) { + return -1; + } + } + + if (c1c.length === c2c.length) { + return 0; + } + return -1; +} + +document.addEventListener('DOMContentLoaded', function () { + Toolbox.init(); + referencePane.init(); +}) +var CLAUSE_NODES = ['EMU-CLAUSE', 'EMU-INTRO', 'EMU-ANNEX']; +function findLocalReferences ($elem) { + var name = $elem.innerHTML; + var references = []; + + var parentClause = $elem.parentNode; + while (parentClause && CLAUSE_NODES.indexOf(parentClause.nodeName) === -1) { + parentClause = parentClause.parentNode; + } + + if(!parentClause) return; + + var vars = parentClause.querySelectorAll('var'); + + for (var i = 0; i < vars.length; i++) { + var $var = vars[i]; + + if ($var.innerHTML === name) { + references.push($var); + } + } + + return references; +} + +function toggleFindLocalReferences($elem) { + var references = findLocalReferences($elem); + if ($elem.classList.contains('referenced')) { + references.forEach(function ($reference) { + $reference.classList.remove('referenced'); + }); + } else { + references.forEach(function ($reference) { + $reference.classList.add('referenced'); + }); + } +} + +function installFindLocalReferences () { + document.addEventListener('click', function (e) { + if (e.target.nodeName === 'VAR') { + toggleFindLocalReferences(e.target); + } + }); +} + +document.addEventListener('DOMContentLoaded', installFindLocalReferences); |