Mercurial > hg
changeset 31785:d15c9feb4399
hgweb: rename linerangelog.js as followlines.js
So that the file name matches both the feature name and user facing vocabulary
(e.g. the revset function).
author | Denis Laxalde <denis.laxalde@logilab.fr> |
---|---|
date | Mon, 03 Apr 2017 10:02:55 +0200 |
parents | 02eb52e9d413 |
children | 0e4f70f63aaa |
files | contrib/wix/templates.wxs mercurial/templates/paper/filerevision.tmpl mercurial/templates/static/followlines.js mercurial/templates/static/linerangelog.js tests/test-hgweb-commands.t tests/test-highlight.t |
diffstat | 6 files changed, 171 insertions(+), 171 deletions(-) [+] |
line wrap: on
line diff
--- a/contrib/wix/templates.wxs Mon Apr 03 09:58:36 2017 +0200 +++ b/contrib/wix/templates.wxs Mon Apr 03 10:02:55 2017 +0200 @@ -226,7 +226,7 @@ <File Id="static.coal.file.png" Name="coal-file.png" /> <File Id="static.coal.folder.png" Name="coal-folder.png" /> <File Id="static.excanvas.js" Name="excanvas.js" /> - <File Id="static.linerangelog.js" Name="linerangelog.js" /> + <File Id="static.followlines.js" Name="followlines.js" /> <File Id="static.mercurial.js" Name="mercurial.js" /> <File Id="static.hgicon.png" Name="hgicon.png" /> <File Id="static.hglogo.png" Name="hglogo.png" />
--- a/mercurial/templates/paper/filerevision.tmpl Mon Apr 03 09:58:36 2017 +0200 +++ b/mercurial/templates/paper/filerevision.tmpl Mon Apr 03 10:02:55 2017 +0200 @@ -74,7 +74,7 @@ <pre class="sourcelines stripes4 wrap bottomline" data-logurl="{url|urlescape}log/{symrev}/{file|urlescape}">{text%fileline}</pre> </div> -<script type="text/javascript" src="{staticurl|urlescape}linerangelog.js"></script> +<script type="text/javascript" src="{staticurl|urlescape}followlines.js"></script> </div> </div>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial/templates/static/followlines.js Mon Apr 03 10:02:55 2017 +0200 @@ -0,0 +1,166 @@ +// followlines.js - JavaScript utilities for followlines UI +// +// Copyright 2017 Logilab SA <contact@logilab.fr> +// +// This software may be used and distributed according to the terms of the +// GNU General Public License version 2 or any later version. + +//** Install event listeners for line block selection and followlines action */ +document.addEventListener('DOMContentLoaded', function() { + var sourcelines = document.getElementsByClassName('sourcelines')[0]; + if (typeof sourcelines === 'undefined') { + return; + } + // URL to complement with "linerange" query parameter + var targetUri = sourcelines.dataset.logurl; + if (typeof targetUri === 'undefined') { + return; + } + + // retrieve all direct <span> children of <pre class="sourcelines"> + var spans = Array.prototype.filter.call( + sourcelines.children, + function(x) { return x.tagName === 'SPAN' }); + + // add a "followlines-select" class to change cursor type in CSS + for (var i = 0; i < spans.length; i++) { + spans[i].classList.add('followlines-select'); + } + + var lineSelectedCSSClass = 'followlines-selected'; + + //** add CSS class on <span> element in `from`-`to` line range */ + function addSelectedCSSClass(from, to) { + for (var i = from; i <= to; i++) { + spans[i].classList.add(lineSelectedCSSClass); + } + } + + //** remove CSS class from previously selected lines */ + function removeSelectedCSSClass() { + var elements = sourcelines.getElementsByClassName( + lineSelectedCSSClass); + while (elements.length) { + elements[0].classList.remove(lineSelectedCSSClass); + } + } + + // ** return the <span> element parent of `element` */ + function findParentSpan(element) { + var parent = element.parentElement; + if (parent === null) { + return null; + } + if (element.tagName == 'SPAN' && parent.isSameNode(sourcelines)) { + return element; + } + return findParentSpan(parent); + } + + //** event handler for "click" on the first line of a block */ + function lineSelectStart(e) { + var startElement = findParentSpan(e.target); + if (startElement === null) { + // not a <span> (maybe <a>): abort, keeping event listener + // registered for other click with <span> target + return; + } + var startId = parseInt(startElement.id.slice(1)); + startElement.classList.add(lineSelectedCSSClass); // CSS + + // remove this event listener + sourcelines.removeEventListener('click', lineSelectStart); + + //** event handler for "click" on the last line of the block */ + function lineSelectEnd(e) { + var endElement = findParentSpan(e.target); + if (endElement === null) { + // not a <span> (maybe <a>): abort, keeping event listener + // registered for other click with <span> target + return; + } + + // remove this event listener + sourcelines.removeEventListener('click', lineSelectEnd); + + // compute line range (startId, endId) + var endId = parseInt(endElement.id.slice(1)); + if (endId == startId) { + // clicked twice the same line, cancel and reset initial state + // (CSS and event listener for selection start) + removeSelectedCSSClass(); + sourcelines.addEventListener('click', lineSelectStart); + return; + } + var inviteElement = endElement; + if (endId < startId) { + var tmp = endId; + endId = startId; + startId = tmp; + inviteElement = startElement; + } + + addSelectedCSSClass(startId - 1, endId -1); // CSS + + // append the <div id="followlines"> element to last line of the + // selection block + var divAndButton = followlinesBox(targetUri, startId, endId); + var div = divAndButton[0], + button = divAndButton[1]; + inviteElement.appendChild(div); + + //** event handler for cancelling selection */ + function cancel() { + // remove invite box + div.parentNode.removeChild(div); + // restore initial event listeners + sourcelines.addEventListener('click', lineSelectStart); + sourcelines.removeEventListener('click', cancel); + // remove styles on selected lines + removeSelectedCSSClass(); + } + + // bind cancel event to click on <button> + button.addEventListener('click', cancel); + // as well as on an click on any source line + sourcelines.addEventListener('click', cancel); + } + + sourcelines.addEventListener('click', lineSelectEnd); + + } + + sourcelines.addEventListener('click', lineSelectStart); + + //** return a <div id="followlines"> and inner cancel <button> elements */ + function followlinesBox(targetUri, fromline, toline) { + // <div id="followlines"> + var div = document.createElement('div'); + div.id = 'followlines'; + + // <div class="followlines-cancel"> + var buttonDiv = document.createElement('div'); + buttonDiv.classList.add('followlines-cancel'); + + // <button>x</button> + var button = document.createElement('button'); + button.textContent = 'x'; + buttonDiv.appendChild(button); + div.appendChild(buttonDiv); + + // <div class="followlines-link"> + var aDiv = document.createElement('div'); + aDiv.classList.add('followlines-link'); + + // <a href="/log/<rev>/<file>?patch=&linerange=..."> + var a = document.createElement('a'); + var url = targetUri + '?patch=&linerange=' + fromline + ':' + toline; + a.setAttribute('href', url); + a.textContent = 'follow lines ' + fromline + ':' + toline; + aDiv.appendChild(a); + div.appendChild(aDiv); + + return [div, button]; + } + +}, false);
--- a/mercurial/templates/static/linerangelog.js Mon Apr 03 09:58:36 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,166 +0,0 @@ -// linerangelog.js - JavaScript utilities for followlines UI -// -// Copyright 2017 Logilab SA <contact@logilab.fr> -// -// This software may be used and distributed according to the terms of the -// GNU General Public License version 2 or any later version. - -//** Install event listeners for line block selection and followlines action */ -document.addEventListener('DOMContentLoaded', function() { - var sourcelines = document.getElementsByClassName('sourcelines')[0]; - if (typeof sourcelines === 'undefined') { - return; - } - // URL to complement with "linerange" query parameter - var targetUri = sourcelines.dataset.logurl; - if (typeof targetUri === 'undefined') { - return; - } - - // retrieve all direct <span> children of <pre class="sourcelines"> - var spans = Array.prototype.filter.call( - sourcelines.children, - function(x) { return x.tagName === 'SPAN' }); - - // add a "followlines-select" class to change cursor type in CSS - for (var i = 0; i < spans.length; i++) { - spans[i].classList.add('followlines-select'); - } - - var lineSelectedCSSClass = 'followlines-selected'; - - //** add CSS class on <span> element in `from`-`to` line range */ - function addSelectedCSSClass(from, to) { - for (var i = from; i <= to; i++) { - spans[i].classList.add(lineSelectedCSSClass); - } - } - - //** remove CSS class from previously selected lines */ - function removeSelectedCSSClass() { - var elements = sourcelines.getElementsByClassName( - lineSelectedCSSClass); - while (elements.length) { - elements[0].classList.remove(lineSelectedCSSClass); - } - } - - // ** return the <span> element parent of `element` */ - function findParentSpan(element) { - var parent = element.parentElement; - if (parent === null) { - return null; - } - if (element.tagName == 'SPAN' && parent.isSameNode(sourcelines)) { - return element; - } - return findParentSpan(parent); - } - - //** event handler for "click" on the first line of a block */ - function lineSelectStart(e) { - var startElement = findParentSpan(e.target); - if (startElement === null) { - // not a <span> (maybe <a>): abort, keeping event listener - // registered for other click with <span> target - return; - } - var startId = parseInt(startElement.id.slice(1)); - startElement.classList.add(lineSelectedCSSClass); // CSS - - // remove this event listener - sourcelines.removeEventListener('click', lineSelectStart); - - //** event handler for "click" on the last line of the block */ - function lineSelectEnd(e) { - var endElement = findParentSpan(e.target); - if (endElement === null) { - // not a <span> (maybe <a>): abort, keeping event listener - // registered for other click with <span> target - return; - } - - // remove this event listener - sourcelines.removeEventListener('click', lineSelectEnd); - - // compute line range (startId, endId) - var endId = parseInt(endElement.id.slice(1)); - if (endId == startId) { - // clicked twice the same line, cancel and reset initial state - // (CSS and event listener for selection start) - removeSelectedCSSClass(); - sourcelines.addEventListener('click', lineSelectStart); - return; - } - var inviteElement = endElement; - if (endId < startId) { - var tmp = endId; - endId = startId; - startId = tmp; - inviteElement = startElement; - } - - addSelectedCSSClass(startId - 1, endId -1); // CSS - - // append the <div id="followlines"> element to last line of the - // selection block - var divAndButton = followlinesBox(targetUri, startId, endId); - var div = divAndButton[0], - button = divAndButton[1]; - inviteElement.appendChild(div); - - //** event handler for cancelling selection */ - function cancel() { - // remove invite box - div.parentNode.removeChild(div); - // restore initial event listeners - sourcelines.addEventListener('click', lineSelectStart); - sourcelines.removeEventListener('click', cancel); - // remove styles on selected lines - removeSelectedCSSClass(); - } - - // bind cancel event to click on <button> - button.addEventListener('click', cancel); - // as well as on an click on any source line - sourcelines.addEventListener('click', cancel); - } - - sourcelines.addEventListener('click', lineSelectEnd); - - } - - sourcelines.addEventListener('click', lineSelectStart); - - //** return a <div id="followlines"> and inner cancel <button> elements */ - function followlinesBox(targetUri, fromline, toline) { - // <div id="followlines"> - var div = document.createElement('div'); - div.id = 'followlines'; - - // <div class="followlines-cancel"> - var buttonDiv = document.createElement('div'); - buttonDiv.classList.add('followlines-cancel'); - - // <button>x</button> - var button = document.createElement('button'); - button.textContent = 'x'; - buttonDiv.appendChild(button); - div.appendChild(buttonDiv); - - // <div class="followlines-link"> - var aDiv = document.createElement('div'); - aDiv.classList.add('followlines-link'); - - // <a href="/log/<rev>/<file>?patch=&linerange=..."> - var a = document.createElement('a'); - var url = targetUri + '?patch=&linerange=' + fromline + ':' + toline; - a.setAttribute('href', url); - a.textContent = 'follow lines ' + fromline + ':' + toline; - aDiv.appendChild(a); - div.appendChild(aDiv); - - return [div, button]; - } - -}, false);
--- a/tests/test-hgweb-commands.t Mon Apr 03 09:58:36 2017 +0200 +++ b/tests/test-hgweb-commands.t Mon Apr 03 10:02:55 2017 +0200 @@ -1347,7 +1347,7 @@ <span id="l1">foo</span><a href="#l1"></a></pre> </div> - <script type="text/javascript" src="/static/linerangelog.js"></script> + <script type="text/javascript" src="/static/followlines.js"></script> </div> </div> @@ -1475,7 +1475,7 @@ <span id="l1">another</span><a href="#l1"></a></pre> </div> - <script type="text/javascript" src="/static/linerangelog.js"></script> + <script type="text/javascript" src="/static/followlines.js"></script> </div> </div>
--- a/tests/test-highlight.t Mon Apr 03 09:58:36 2017 +0200 +++ b/tests/test-highlight.t Mon Apr 03 10:02:55 2017 +0200 @@ -185,7 +185,7 @@ <span id="l33"></span><a href="#l33"></a></pre> </div> - <script type="text/javascript" src="/static/linerangelog.js"></script> + <script type="text/javascript" src="/static/followlines.js"></script> </div> </div>