From 25bee9793b6011c0de8158b076d7260c9b5d836b Mon Sep 17 00:00:00 2001 From: Ryan Lerch Date: Sep 26 2018 12:20:15 +0000 Subject: [PATCH 1/3] add hilightjs-line-numbers plugin --- diff --git a/pagure/static/vendor/highlightjs-line-numbers/INFO b/pagure/static/vendor/highlightjs-line-numbers/INFO new file mode 100644 index 0000000..1eaef34 --- /dev/null +++ b/pagure/static/vendor/highlightjs-line-numbers/INFO @@ -0,0 +1,2 @@ +This Plugin is from: +https://github.com/wcoder/highlightjs-line-numbers.js/blob/59f905d3634e09bfd0cb2f4a6efbc3dde1e2f7c5/dist/highlightjs-line-numbers.min.js \ No newline at end of file diff --git a/pagure/static/vendor/highlightjs-line-numbers/highlightjs-line-numbers.min.js b/pagure/static/vendor/highlightjs-line-numbers/highlightjs-line-numbers.min.js new file mode 100644 index 0000000..6112cb6 --- /dev/null +++ b/pagure/static/vendor/highlightjs-line-numbers/highlightjs-line-numbers.min.js @@ -0,0 +1 @@ +!function(n,e){"use strict";function t(){var n=e.createElement("style");n.type="text/css",n.innerHTML=h(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[f,m,j]),e.getElementsByTagName("head")[0].appendChild(n)}function r(t){"complete"===e.readyState?l(t):n.addEventListener("DOMContentLoaded",function(){l(t)})}function l(t){try{var r=e.querySelectorAll("code.hljs");for(var l in r)r.hasOwnProperty(l)&&i(r[l],t)}catch(o){n.console.error("LineNumbers error: ",o)}}function i(n,e){if("object"==typeof n){e=e||{singleLine:!1};var t=e.singleLine?0:1;u(function(){s(n),n.innerHTML=o(n.innerHTML,t)})}}function o(n,e){var t=c(n);if(""===t[t.length-1].trim()&&t.pop(),t.length>e){for(var r="",l=0,i=t.length;l
{6}
',[v,g,m,j,p,l+1,t[l].length>0?t[l]:" "]);return h('{1}
',[f,r])}return n}function s(n){var e=n.childNodes;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];d(r.textContent)>0&&(r.childNodes.length>0?s(r):a(r.parentNode))}}function a(n){var e=n.className;if(/hljs-/.test(e)){for(var t=c(n.innerHTML),r=0,l="";r{1}\n',[e,t[r]]);n.innerHTML=l.trim()}}function c(n){return 0===n.length?[]:n.split(L)}function d(n){return(n.trim().match(L)||[]).length}function u(e){n.setTimeout(e,0)}function h(n,e){return n.replace(/\{(\d+)\}/g,function(n,t){return e[t]?e[t]:n})}var f="hljs-ln",g="hljs-ln-line",p="hljs-ln-code",v="hljs-ln-numbers",m="hljs-ln-n",j="data-line-number",L=/\r\n|\r|\n/g;n.hljs?(n.hljs.initLineNumbersOnLoad=r,n.hljs.lineNumbersBlock=i,t()):n.console.error("highlight.js not detected!")}(window,document); \ No newline at end of file From 4d2cd9d272213d610da6f78a6627f632a4e7abac Mon Sep 17 00:00:00 2001 From: Ryan Lerch Date: Sep 26 2018 12:20:15 +0000 Subject: [PATCH 2/3] Fix syntax highlighting of files. This updates the file display to use just highlight.js Previously, highlight.js was run over the old style codetable that was generated for when we used pygments, and this was causing each line to be rendered seperately. This caused hilight.js to determine some strange filetypes for these fragments, and typically hilight them as bash output. --- diff --git a/pagure/static/vendor/highlightjs-line-numbers/INFO b/pagure/static/vendor/highlightjs-line-numbers/INFO index 1eaef34..56b6b91 100644 --- a/pagure/static/vendor/highlightjs-line-numbers/INFO +++ b/pagure/static/vendor/highlightjs-line-numbers/INFO @@ -1,2 +1,8 @@ -This Plugin is from: +This is a slightly patched version of the Highlightjs-line-numbers plugin from +https://github.com/wcoder/highlightjs-line-numbers.js + +It adds some additional classes and links on the line numbers to get some stuff +in Pagure working. + +This was patched over this version of the upstream file: https://github.com/wcoder/highlightjs-line-numbers.js/blob/59f905d3634e09bfd0cb2f4a6efbc3dde1e2f7c5/dist/highlightjs-line-numbers.min.js \ No newline at end of file diff --git a/pagure/static/vendor/highlightjs-line-numbers/highlightjs-line-numbers.min.js b/pagure/static/vendor/highlightjs-line-numbers/highlightjs-line-numbers.min.js index 6112cb6..f98c85b 100644 --- a/pagure/static/vendor/highlightjs-line-numbers/highlightjs-line-numbers.min.js +++ b/pagure/static/vendor/highlightjs-line-numbers/highlightjs-line-numbers.min.js @@ -1 +1 @@ -!function(n,e){"use strict";function t(){var n=e.createElement("style");n.type="text/css",n.innerHTML=h(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[f,m,j]),e.getElementsByTagName("head")[0].appendChild(n)}function r(t){"complete"===e.readyState?l(t):n.addEventListener("DOMContentLoaded",function(){l(t)})}function l(t){try{var r=e.querySelectorAll("code.hljs");for(var l in r)r.hasOwnProperty(l)&&i(r[l],t)}catch(o){n.console.error("LineNumbers error: ",o)}}function i(n,e){if("object"==typeof n){e=e||{singleLine:!1};var t=e.singleLine?0:1;u(function(){s(n),n.innerHTML=o(n.innerHTML,t)})}}function o(n,e){var t=c(n);if(""===t[t.length-1].trim()&&t.pop(),t.length>e){for(var r="",l=0,i=t.length;l
{6}
',[v,g,m,j,p,l+1,t[l].length>0?t[l]:" "]);return h('{1}
',[f,r])}return n}function s(n){var e=n.childNodes;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];d(r.textContent)>0&&(r.childNodes.length>0?s(r):a(r.parentNode))}}function a(n){var e=n.className;if(/hljs-/.test(e)){for(var t=c(n.innerHTML),r=0,l="";r{1}\n',[e,t[r]]);n.innerHTML=l.trim()}}function c(n){return 0===n.length?[]:n.split(L)}function d(n){return(n.trim().match(L)||[]).length}function u(e){n.setTimeout(e,0)}function h(n,e){return n.replace(/\{(\d+)\}/g,function(n,t){return e[t]?e[t]:n})}var f="hljs-ln",g="hljs-ln-line",p="hljs-ln-code",v="hljs-ln-numbers",m="hljs-ln-n",j="data-line-number",L=/\r\n|\r|\n/g;n.hljs?(n.hljs.initLineNumbersOnLoad=r,n.hljs.lineNumbersBlock=i,t()):n.console.error("highlight.js not detected!")}(window,document); \ No newline at end of file +!function(n,e){"use strict";function t(){var n=e.createElement("style");n.type="text/css",n.innerHTML=h(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[f,m,j]),e.getElementsByTagName("head")[0].appendChild(n)}function r(t){"complete"===e.readyState?l(t):n.addEventListener("DOMContentLoaded",function(){l(t)})}function l(t){try{var r=e.querySelectorAll("code.hljs");for(var l in r)r.hasOwnProperty(l)&&i(r[l],t)}catch(o){n.console.error("LineNumbers error: ",o)}}function i(n,e){if("object"==typeof n){e=e||{singleLine:!1};var t=e.singleLine?0:1;u(function(){s(n),n.innerHTML=o(n.innerHTML,t)})}}function o(n,e){var t=c(n);if(""===t[t.length-1].trim()&&t.pop(),t.length>e){for(var r="",l=0,i=t.length;l
{6}
',[v,g,m,j,p,l+1,t[l].length>0?t[l]:" "]);return h('{1}
',[f,r])}return n}function s(n){var e=n.childNodes;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];d(r.textContent)>0&&(r.childNodes.length>0?s(r):a(r.parentNode))}}function a(n){var e=n.className;if(/hljs-/.test(e)){for(var t=c(n.innerHTML),r=0,l="";r{1}\n',[e,t[r]]);n.innerHTML=l.trim()}}function c(n){return 0===n.length?[]:n.split(L)}function d(n){return(n.trim().match(L)||[]).length}function u(e){n.setTimeout(e,0)}function h(n,e){return n.replace(/\{(\d+)\}/g,function(n,t){return e[t]?e[t]:n})}var f="hljs-ln",g="hljs-ln-line notblue text-muted",p="hljs-ln-code pl-2",v="hljs-ln-numbers bg-light text-right pr-2 pl-2 border-right mr-3",m="hljs-ln-n",j="data-line-number",L=/\r\n|\r|\n/g;n.hljs?(n.hljs.initLineNumbersOnLoad=r,n.hljs.lineNumbersBlock=i,t()):n.console.error("highlight.js not detected!")}(window,document); diff --git a/pagure/templates/file.html b/pagure/templates/file.html index 300bc43..7a88740 100644 --- a/pagure/templates/file.html +++ b/pagure/templates/file.html @@ -173,13 +173,7 @@ {% endif %} {% if output_type=='file' %} - {% autoescape false %} - {% if huge %} - {{ content | e | format_loc }} - {% else %} - {{ content | format_loc }} - {% endif %} - {% endautoescape %} +
{{ content }}
{% elif output_type == 'markup' %}
{% autoescape false %} @@ -265,47 +259,49 @@ No content found in this repository {{ super() }} + - + - var hash = '_' + selected[0]; - if (selected.length === 2) { - hash = '_' + Math.min(selected[0], selected[1]) + '-' + Math.max(selected[0], selected[1]); - } - window.location.hash = hash; - return false; -}); - {% endblock %} From 2d982934f2c7fea6935853601344dc49480391d2 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sep 26 2018 12:20:15 +0000 Subject: [PATCH 3/3] Fix the unit-tests for the change in the way the files are highlighted Signed-off-by: Pierre-Yves Chibon --- diff --git a/tests/test_pagure_flask_ui_no_master_branch.py b/tests/test_pagure_flask_ui_no_master_branch.py index 8700210..af288c7 100644 --- a/tests/test_pagure_flask_ui_no_master_branch.py +++ b/tests/test_pagure_flask_ui_no_master_branch.py @@ -226,7 +226,8 @@ class PagureFlaskNoMasterBranchtests(tests.SimplePagureTest): ''', output_text) self.assertIn( - '
foo
', output_text + '
foo\n bar
', + output_text ) @patch('pagure.lib.notify.send_email') diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 311df42..f60746a 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -2227,12 +2227,9 @@ class PagureFlaskRepotests(tests.Modeltests): output = self.app.get('/test/blob/master/f/sources') self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) - self.assertIn('', output_text) self.assertIn( - '', + '
foo\n bar
', output_text) - self.assertIn( - '', output_text) # Empty files should also be displayed tests.add_content_to_git( @@ -2327,12 +2324,8 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertIn( '  Šource', output_text) - self.assertIn('
 bar
', output_text) - self.assertIn( - '', output_text) self.assertIn( - '', + '
Row 0\n
', output_text ) @@ -2371,13 +2364,10 @@ class PagureFlaskRepotests(tests.Modeltests): output = self.app.get('/fork/pingou/test3/blob/master/f/sources') self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) - self.assertIn('
Row 0
', output_text) - self.assertIn( - '', - output_text) self.assertIn( - '', - output_text) + '
foo\n barRow 0\n'
+            'Row 1\nRow 2\nRow 3\nRow 4\nRow 5\nRow 6\nRow 7\nRow 8\n'
+            'Row 9\n
', output_text) @patch( 'pagure.lib.encoding_utils.decode', diff --git a/tests/test_pagure_flask_ui_repo_view_file.py b/tests/test_pagure_flask_ui_repo_view_file.py index cd551b3..06baca2 100644 --- a/tests/test_pagure_flask_ui_repo_view_file.py +++ b/tests/test_pagure_flask_ui_repo_view_file.py @@ -99,14 +99,10 @@ class PagureFlaskRepoViewFiletests(LocalBasetests): output = self.app.get('/test/blob/master/f/sources') self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) - self.assertTrue('
 barRow 0
' in output_text) - self.assertTrue( - '' - in output_text) self.assertIn( - '', - output_text) + '
foo\n bar
', + output_text + ) def test_view_file_empty_file(self): """ Test the view_file with an empty file. """ @@ -217,12 +213,8 @@ class PagureFlaskRepoViewFiletests(LocalBasetests): self.assertEqual(output.headers['Content-Type'].lower(), 'text/html; charset=utf-8') self.assertIn('  Šource', output_text) - self.assertIn('
 bar
', output_text) - self.assertIn( - '', output_text) self.assertIn( - '', + '
Row 0\n
', output_text ) @@ -321,14 +313,11 @@ class PagureFlaskRepoViewFileForktests(LocalBasetests): output = self.app.get('/fork/pingou/test/blob/master/f/sources') self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) - self.assertIn('
Row 0
', output_text) self.assertIn( - '', - output_text) - self.assertIn( - '', - output_text) + '
foo\n barRow 0\n'
+            'Row 1\nRow 2\nRow 3\nRow 4\nRow 5\nRow 6\nRow 7\nRow 8\n'
+            'Row 9\n
', output_text + ) def test_view_file_fork_and_edit_on_fork_logged_out(self): """ Test the view_file on a text file on a fork when logged out. """ diff --git a/tests/test_pagure_flask_ui_slash_branch_name.py b/tests/test_pagure_flask_ui_slash_branch_name.py index 43f657f..56421d3 100644 --- a/tests/test_pagure_flask_ui_slash_branch_name.py +++ b/tests/test_pagure_flask_ui_slash_branch_name.py @@ -228,7 +228,9 @@ class PagureFlaskSlashInBranchtests(tests.SimplePagureTest): ''', output_text) self.assertIn( - '', output_text) + '
*~
', + output_text + ) @patch('pagure.lib.notify.send_email') def test_view_raw_file(self, send_email):
 barRow 0
*~