mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-11-24 02:36:10 +01:00
parent
f321cdced7
commit
e609ef9585
|
@ -2,6 +2,9 @@ import $ from 'jquery';
|
||||||
import {svg} from '../svg.js';
|
import {svg} from '../svg.js';
|
||||||
import {invertFileFolding} from './file-fold.js';
|
import {invertFileFolding} from './file-fold.js';
|
||||||
|
|
||||||
|
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) {
|
function changeHash(hash) {
|
||||||
if (window.history.pushState) {
|
if (window.history.pushState) {
|
||||||
window.history.pushState(null, null, hash);
|
window.history.pushState(null, null, hash);
|
||||||
|
@ -114,7 +117,7 @@ export function initRepoCodeView() {
|
||||||
});
|
});
|
||||||
|
|
||||||
$(window).on('hashchange', () => {
|
$(window).on('hashchange', () => {
|
||||||
let m = window.location.hash.match(/^#(L\d+)-(L\d+)$/);
|
let m = window.location.hash.match(rangeAnchorRegex);
|
||||||
let $list;
|
let $list;
|
||||||
if ($('div.blame').length) {
|
if ($('div.blame').length) {
|
||||||
$list = $('.code-view td.lines-code.blame-code');
|
$list = $('.code-view td.lines-code.blame-code');
|
||||||
|
@ -124,27 +127,31 @@ export function initRepoCodeView() {
|
||||||
let $first;
|
let $first;
|
||||||
if (m) {
|
if (m) {
|
||||||
$first = $list.filter(`[rel=${m[1]}]`);
|
$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)
|
// show code view menu marker (don't show in blame page)
|
||||||
if ($('div.blame').length === 0) {
|
if ($('div.blame').length === 0) {
|
||||||
showLineButton();
|
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(singleAnchorRegex);
|
||||||
if (m) {
|
if (m) {
|
||||||
$first = $list.filter(`[rel=L${m[2]}]`);
|
$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)
|
// show code view menu marker (don't show in blame page)
|
||||||
if ($('div.blame').length === 0) {
|
if ($('div.blame').length === 0) {
|
||||||
showLineButton();
|
showLineButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
$('html, body').scrollTop($first.offset().top - 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
$('html, body').scrollTop($first.offset().top - 200);
|
|
||||||
}
|
}
|
||||||
}).trigger('hashchange');
|
}).trigger('hashchange');
|
||||||
}
|
}
|
||||||
|
|
17
web_src/js/features/repo-code.test.js
Normal file
17
web_src/js/features/repo-code.test.js
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import {singleAnchorRegex, rangeAnchorRegex} from './repo-code.js';
|
||||||
|
|
||||||
|
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('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);
|
||||||
|
});
|
Loading…
Reference in a new issue