hgweb: rename linerangelog.js as followlines.js
authorDenis Laxalde <denis.laxalde@logilab.fr>
Mon, 03 Apr 2017 10:02:55 +0200
changeset 31785 d15c9feb4399
parent 31784 02eb52e9d413
child 31786 0e4f70f63aaa
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).
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
--- 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>