From f02e03b4ca614f220f0a705cd34f31ff5661ce2f Mon Sep 17 00:00:00 2001 From: silverwind Date: Tue, 8 Nov 2022 20:08:14 +0100 Subject: [PATCH 1/2] Ignore line anchor links with leading zeroes Fixes: https://github.com/go-gitea/gitea/issues/21722 --- web_src/js/features/repo-code.js | 36 ++++++++++++++++----------- web_src/js/features/repo-code.test.js | 18 ++++++++++++++ 2 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 web_src/js/features/repo-code.test.js diff --git a/web_src/js/features/repo-code.js b/web_src/js/features/repo-code.js index ad27036372fac..06f9e6322afc4 100644 --- a/web_src/js/features/repo-code.js +++ b/web_src/js/features/repo-code.js @@ -5,6 +5,8 @@ import {createTippy, showTemporaryTooltip} from '../modules/tippy.js'; import {copyToClipboard} from './clipboard.js'; const {i18n} = window.config; +export const singleRe = /^#(L|n)([1-9][0-9]*)$/; +export const rangeRe = /^#(L[1-9][0-9]*)-(L[1-9][0-9]*)$/; function changeHash(hash) { if (window.history.pushState) { @@ -149,7 +151,7 @@ export function initRepoCodeView() { }); $(window).on('hashchange', () => { - let m = window.location.hash.match(/^#(L\d+)-(L\d+)$/); + let m = window.location.hash.match(rangeRe); let $list; if ($('div.blame').length) { $list = $('.code-view td.lines-code.blame-code'); @@ -159,27 +161,31 @@ export function initRepoCodeView() { let $first; if (m) { $first = $list.filter(`[rel=${m[1]}]`); - selectRange($list, $first, $list.filter(`[rel=${m[2]}]`)); + if ($first.length) { + selectRange($list, $first, $list.filter(`[rel=${m[2]}]`)); - // show code view menu marker (don't show in blame page) - if ($('div.blame').length === 0) { - showLineButton(); - } + // show code view menu marker (don't show in blame page) + if ($('div.blame').length === 0) { + showLineButton(); + } - $('html, body').scrollTop($first.offset().top - 200); - return; + $('html, body').scrollTop($first.offset().top - 200); + return; + } } - m = window.location.hash.match(/^#(L|n)(\d+)$/); + m = window.location.hash.match(singleRe); if (m) { $first = $list.filter(`[rel=L${m[2]}]`); - selectRange($list, $first); + if ($first.length) { + selectRange($list, $first); - // show code view menu marker (don't show in blame page) - if ($('div.blame').length === 0) { - showLineButton(); - } + // show code view menu marker (don't show in blame page) + if ($('div.blame').length === 0) { + showLineButton(); + } - $('html, body').scrollTop($first.offset().top - 200); + $('html, body').scrollTop($first.offset().top - 200); + } } }).trigger('hashchange'); } diff --git a/web_src/js/features/repo-code.test.js b/web_src/js/features/repo-code.test.js new file mode 100644 index 0000000000000..bcf209e64af35 --- /dev/null +++ b/web_src/js/features/repo-code.test.js @@ -0,0 +1,18 @@ +import {test, expect} from 'vitest'; +import {singleRe, rangeRe} from './repo-code.js'; + +test('singleRe', () => { + expect(singleRe.test('#L0')).toEqual(false); + expect(singleRe.test('#L1')).toEqual(true); + expect(singleRe.test('#L01')).toEqual(false); + expect(singleRe.test('#n0')).toEqual(false); + expect(singleRe.test('#n1')).toEqual(true); + expect(singleRe.test('#n01')).toEqual(false); +}); + +test('rangeRe', () => { + expect(rangeRe.test('#L0-L10')).toEqual(false); + expect(rangeRe.test('#L1-L10')).toEqual(true); + expect(rangeRe.test('#L01-L10')).toEqual(false); + expect(rangeRe.test('#L1-L01')).toEqual(false); +}); From 0fc612cadb5818ecbe48e8b48614dd988032c01c Mon Sep 17 00:00:00 2001 From: silverwind Date: Wed, 9 Nov 2022 19:23:31 +0100 Subject: [PATCH 2/2] rename variables --- web_src/js/features/repo-code.js | 8 ++++---- web_src/js/features/repo-code.test.js | 26 +++++++++++++------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/web_src/js/features/repo-code.js b/web_src/js/features/repo-code.js index 06f9e6322afc4..ef6b61196b73e 100644 --- a/web_src/js/features/repo-code.js +++ b/web_src/js/features/repo-code.js @@ -5,8 +5,8 @@ import {createTippy, showTemporaryTooltip} from '../modules/tippy.js'; import {copyToClipboard} from './clipboard.js'; const {i18n} = window.config; -export const singleRe = /^#(L|n)([1-9][0-9]*)$/; -export const rangeRe = /^#(L[1-9][0-9]*)-(L[1-9][0-9]*)$/; +export const singleAnchorRegex = /^#(L|n)([1-9][0-9]*)$/; +export const rangeAnchorRegex = /^#(L[1-9][0-9]*)-(L[1-9][0-9]*)$/; function changeHash(hash) { if (window.history.pushState) { @@ -151,7 +151,7 @@ export function initRepoCodeView() { }); $(window).on('hashchange', () => { - let m = window.location.hash.match(rangeRe); + let m = window.location.hash.match(rangeAnchorRegex); let $list; if ($('div.blame').length) { $list = $('.code-view td.lines-code.blame-code'); @@ -173,7 +173,7 @@ export function initRepoCodeView() { return; } } - m = window.location.hash.match(singleRe); + m = window.location.hash.match(singleAnchorRegex); if (m) { $first = $list.filter(`[rel=L${m[2]}]`); if ($first.length) { diff --git a/web_src/js/features/repo-code.test.js b/web_src/js/features/repo-code.test.js index bcf209e64af35..3bd1973c1f217 100644 --- a/web_src/js/features/repo-code.test.js +++ b/web_src/js/features/repo-code.test.js @@ -1,18 +1,18 @@ import {test, expect} from 'vitest'; -import {singleRe, rangeRe} from './repo-code.js'; +import {singleAnchorRegex, rangeAnchorRegex} from './repo-code.js'; -test('singleRe', () => { - expect(singleRe.test('#L0')).toEqual(false); - expect(singleRe.test('#L1')).toEqual(true); - expect(singleRe.test('#L01')).toEqual(false); - expect(singleRe.test('#n0')).toEqual(false); - expect(singleRe.test('#n1')).toEqual(true); - expect(singleRe.test('#n01')).toEqual(false); +test('singleAnchorRegex', () => { + expect(singleAnchorRegex.test('#L0')).toEqual(false); + expect(singleAnchorRegex.test('#L1')).toEqual(true); + expect(singleAnchorRegex.test('#L01')).toEqual(false); + expect(singleAnchorRegex.test('#n0')).toEqual(false); + expect(singleAnchorRegex.test('#n1')).toEqual(true); + expect(singleAnchorRegex.test('#n01')).toEqual(false); }); -test('rangeRe', () => { - expect(rangeRe.test('#L0-L10')).toEqual(false); - expect(rangeRe.test('#L1-L10')).toEqual(true); - expect(rangeRe.test('#L01-L10')).toEqual(false); - expect(rangeRe.test('#L1-L01')).toEqual(false); +test('rangeAnchorRegex', () => { + expect(rangeAnchorRegex.test('#L0-L10')).toEqual(false); + expect(rangeAnchorRegex.test('#L1-L10')).toEqual(true); + expect(rangeAnchorRegex.test('#L01-L10')).toEqual(false); + expect(rangeAnchorRegex.test('#L1-L01')).toEqual(false); });