From 0ed611fb8549ebb808b01ccc31ecb91929fced01 Mon Sep 17 00:00:00 2001
From: Antoine Lambert <antoine.lambert@inria.fr>
Date: Tue, 23 Jan 2018 14:03:41 +0100
Subject: [PATCH] browse: Fix highligting of multi-line comments and strings

See https://github.com/wcoder/highlightjs-line-numbers.js/pull/22
for more details.
---
 .../dist/highlightjs-line-numbers.min.js      |  3 +-
 .../src/highlightjs-line-numbers.js           | 43 ++++++++++++++++---
 2 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/swh/web/static/js/highlightjs-line-numbers/dist/highlightjs-line-numbers.min.js b/swh/web/static/js/highlightjs-line-numbers/dist/highlightjs-line-numbers.min.js
index 50c76d7f2..f5f5ca5b1 100644
--- a/swh/web/static/js/highlightjs-line-numbers/dist/highlightjs-line-numbers.min.js
+++ b/swh/web/static/js/highlightjs-line-numbers/dist/highlightjs-line-numbers.min.js
@@ -1,2 +1 @@
-/*! © 2017 Yauheni Pakala | MIT License | https://github.com/wcoder/highlightjs-line-numbers.js/ */
-!function(t,e){"use strict";function n(){var t=e.createElement("style");t.type="text/css",t.innerHTML=f(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[o,h,u]),e.getElementsByTagName("head")[0].appendChild(t)}function r(n){"complete"===e.readyState?l(n):t.addEventListener("DOMContentLoaded",function(){l(n)})}function l(n){try{var r=e.querySelectorAll("code.hljs");for(var l in r)r.hasOwnProperty(l)&&s(r[l],n)}catch(i){t.console.error("LineNumbers error: ",i)}}function s(t,e){if("object"==typeof t){e=e||{singleLine:!1};var n=e.singleLine?0:1,r=i(t.innerHTML);if(r.length>n){for(var l="",s=0,g=r.length;s<g;s++)l+=f('<tr><td class="{0}"><div class="{1} {2}" {3}="{5}"></div></td><td class="{4}"><div class="{1}">{6}</div></td></tr>',[d,c,h,u,a,s+1,r[s].length>0?r[s]:" "]);t.innerHTML=f('<table class="{0}">{1}</table>',[o,l])}}}function i(t){return 0===t.length?[]:t.split(/\r\n|\r|\n/g)}var o="hljs-ln",c="hljs-ln-line",a="hljs-ln-code",d="hljs-ln-numbers",h="hljs-ln-n",u="data-line-number",f=function(t,e){return t.replace(/\{(\d+)\}/g,function(t,n){return e[n]?e[n]:t})};t.hljs?(t.hljs.initLineNumbersOnLoad=r,t.hljs.lineNumbersBlock=s,n()):t.console.error("highlight.js not detected!")}(window,document);
\ No newline at end of file
+!function(t,e){"use strict";function n(){var t=e.createElement("style");t.type="text/css",t.innerHTML=m(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[c,f,g]),e.getElementsByTagName("head")[0].appendChild(t)}function r(n){"complete"===e.readyState?l(n):t.addEventListener("DOMContentLoaded",function(){l(n)})}function l(n){try{var r=e.querySelectorAll("code.hljs");for(var l in r)r.hasOwnProperty(l)&&s(r[l],n)}catch(o){t.console.error("LineNumbers error: ",o)}}function s(t,e){if("object"==typeof t){e=e||{singleLine:!1};var n=e.singleLine?0:1,r=i(t),l=a(r);if(l.length>n){for(var s="",o=0,v=l.length;o<v;o++)s+=m('<tr><td class="{0}"><div class="{1} {2}" {3}="{5}"></div></td><td class="{4}"><div class="{1}">{6}</div></td></tr>',[u,d,f,g,h,o+1,l[o].length>0?l[o]:" "]);t.innerHTML=m('<table class="{0}">{1}</table>',[c,s])}}}function o(t){for(var e="",n=t.innerText.split(/\r\n|\r|\n/g),r=0;r<n.length;r++)t.innerText=n[r],e+=t.outerHTML,r<n.length-1&&(e+="\n");return e}function i(t){var e="",n=t.childNodes;for(var r in n)n.hasOwnProperty(r)&&(e+="hljs-comment"===n[r].className||"hljs-string"===n[r].className?o(n[r]):n[r].childNodes.length?n[r].outerHTML:n[r].textContent);return e}function a(t){return 0===t.length?[]:t.split(/\r\n|\r|\n/g)}var c="hljs-ln",d="hljs-ln-line",h="hljs-ln-code",u="hljs-ln-numbers",f="hljs-ln-n",g="data-line-number",m=function(t,e){return t.replace(/\{(\d+)\}/g,function(t,n){return e[n]?e[n]:t})};t.hljs?(t.hljs.initLineNumbersOnLoad=r,t.hljs.lineNumbersBlock=s,n()):t.console.error("highlight.js not detected!")}(window,document);
\ No newline at end of file
diff --git a/swh/web/static/js/highlightjs-line-numbers/src/highlightjs-line-numbers.js b/swh/web/static/js/highlightjs-line-numbers/src/highlightjs-line-numbers.js
index 8fcd3e2bf..4e3737184 100644
--- a/swh/web/static/js/highlightjs-line-numbers/src/highlightjs-line-numbers.js
+++ b/swh/web/static/js/highlightjs-line-numbers/src/highlightjs-line-numbers.js
@@ -2,10 +2,10 @@
 	'use strict';
 
 	var TABLE_NAME = 'hljs-ln',
-	    LINE_NAME = 'hljs-ln-line',
-	    CODE_BLOCK_NAME = 'hljs-ln-code',
-	    NUMBERS_BLOCK_NAME = 'hljs-ln-numbers',
-	    NUMBER_LINE_NAME = 'hljs-ln-n',
+		LINE_NAME = 'hljs-ln-line',
+		CODE_BLOCK_NAME = 'hljs-ln-code',
+		NUMBERS_BLOCK_NAME = 'hljs-ln-numbers',
+		NUMBER_LINE_NAME = 'hljs-ln-n',
 		DATA_ATTR_NAME = 'data-line-number';
 
 	// string format
@@ -75,7 +75,8 @@
 		// convert options
 		var firstLineIndex = !!options.singleLine ? 0 : 1;
 
-		var lines = getLines(element.innerHTML);
+		var text = changeMultilineComments(element);
+		var lines = getLines(text);
 
 		if (lines.length > firstLineIndex) {
 			var html = '';
@@ -105,6 +106,38 @@
 		}
 	}
 
+	function duplicateMultilineTag(element){
+		var result = '';
+		var lines = element.innerText.split(/\r\n|\r|\n/g);
+		for(var i = 0; i<lines.length; i++){
+			element.innerText = lines[i];
+			result += element.outerHTML;
+			if(i < lines.length -1)
+				result += '\n';
+		}
+		return result;
+	}
+
+	function changeMultilineComments(element) {
+		var result = '';
+		var children = element.childNodes;
+		for(var child in children){
+			if(children.hasOwnProperty(child)) {
+                if(children[child].className === "hljs-comment" ||
+                   children[child].className === "hljs-string") {
+					result += duplicateMultilineTag(children[child]);
+				}
+				else if(children[child].childNodes.length) {
+					result += children[child].outerHTML;
+				}
+				else {
+					result += children[child].textContent;
+				}
+			}
+		}
+		return result;
+	}
+
 	function getLines(text) {
 		if (text.length === 0) return [];
 		return text.split(/\r\n|\r|\n/g);
-- 
GitLab