Skip to content

Commit e7c5cdc

Browse files
authored
Merge pull request #160 from WebCoder49/prism-plugin-scroll
Allow scrolling to FindAndReplace match with Prism Line Numbers plugin
2 parents 8af07e7 + 0b45d55 commit e7c5cdc

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

plugins/prism-line-numbers.css

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@ code-input.line-numbers, .line-numbers code-input {
1616
}
1717

1818
/* Make keyboard navigation still fill width */
19-
code-input .code-input_dialog-container .code-input_keyboard-navigation-instructions {
19+
code-input.line-numbers .code-input_dialog-container .code-input_keyboard-navigation-instructions, .line-numbers code-input .code-input_dialog-container .code-input_keyboard-navigation-instructions {
2020
width: calc(100% + max(3.8em, var(--padding, 16px)))!important;
2121
}
22+
23+
/* Override Prism styles so there's no display:inline, relatively-positioned code element which breaks offsetTop, used in FindAndReplace, in Firefox. */
24+
code-input pre[class*=language-].line-numbers>code {
25+
position: static;
26+
}
27+
/* Line numbers now positioned relative to the pre element not the code element. */
28+
code-input .line-numbers .line-numbers-rows {
29+
left: 0;
30+
top: var(--padding);
31+
}
32+
/* Things with padding when instructions are present */
33+
code-input:not(:has(.code-input_keyboard-navigation-instructions:empty)):has(textarea:focus):not(.code-input_mouse-focused) .line-numbers .line-numbers-rows {
34+
top: calc(var(--padding) + 3em);
35+
}

tests/tester.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ console.log("I've got another line!", 2 < 3, "should be true.");
398398
textarea.selectionStart = 0;
399399
textarea.selectionEnd = textarea.value.length;
400400
backspace(textarea);
401-
addText(textarea, "// hello /\\S/g\nhe('llo', /\\s/g);\nhello");
401+
addText(textarea, "// hello /\\S/g\nhe('llo', /\\s/g);\nhello\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\na very very very very very very very very very very very very long line with many many many many many many many many many many many words\nline\nline\nline\nline\nline\nline\nline");
402402
textarea.selectionStart = textarea.selectionEnd = 0; // So focuses on first match
403403

404404
await waitAsync(50); // Wait for highlighting so text updates
@@ -437,7 +437,7 @@ console.log("I've got another line!", 2 < 3, "should be true.");
437437
replaceInput.value = "do('hello";
438438
replaceButton.click();
439439
await waitAsync(50); // Wait for buttons to work
440-
assertEqual("FindAndReplace", "Replaces Once Correctly", textarea.value, "// hello /\\S/g\ndo('hello', /\\s/g);\nhello");
440+
assertEqual("FindAndReplace", "Replaces Once Correctly", textarea.value, "// hello /\\S/g\ndo('hello', /\\s/g);\nhello\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\na very very very very very very very very very very very very long line with many many many many many many many many many many many words\nline\nline\nline\nline\nline\nline\nline");
441441
nextMatchButton.click(); // Back to first match
442442

443443
// Exit find input box
@@ -458,7 +458,26 @@ console.log("I've got another line!", 2 < 3, "should be true.");
458458

459459
replaceInput.value = "hi";
460460
replaceAllButton.click();
461-
assertEqual("FindAndReplace", "Replaces All Correctly", textarea.value, "// hi /\\S/g\ndo('hi', /\\s/g);\nhi");
461+
assertEqual("FindAndReplace", "Replaces All Correctly", textarea.value, "// hi /\\S/g\ndo('hi', /\\s/g);\nhi\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\nline\na very very very very very very very very very very very very long line with many many many many many many many many many many many words\nline\nline\nline\nline\nline\nline\nline");
462+
463+
findInput.value = "line";
464+
regExpCheckbox.click(); // Now no regex
465+
await waitAsync(200); // Wait for value to update
466+
467+
// Go to "line" on very long line
468+
codeInputElement.style = "height: 100px; width: 1000px;";
469+
previousMatchButton.click();
470+
previousMatchButton.click();
471+
previousMatchButton.click();
472+
previousMatchButton.click();
473+
previousMatchButton.click();
474+
previousMatchButton.click();
475+
previousMatchButton.click();
476+
previousMatchButton.click();
477+
478+
await waitAsync(200); // Wait for highlighting so matches update
479+
testAssertion("FindAndReplace", "Scrolls to Match Correctly", confirm("Is the match on the very long line highlighted orange and near the centre of the element?"), "user-judged");
480+
codeInputElement.style = "";
462481

463482
// Exit find input box
464483
codeInputElement.querySelector(".code-input_find-and-replace_dialog").dispatchEvent(new KeyboardEvent("keydown", { "key": "Escape" }));

0 commit comments

Comments
 (0)