BeamerReveal
view release on metacpan or search on metacpan
beamer-reveal-example_files/libs/revealjs/plugin/quarto-line-highlight/line-highlight.js view on Meta::CPAN
function isPrintView() {
return /print-pdf/gi.test(window.location.search) || /view=print/gi.test(window.location.search);
}
const delimiters = {
step: "|",
line: ",",
lineRange: "-",
};
const regex = new RegExp(
"^[\\d" + Object.values(delimiters).join("") + "]+$"
);
function handleLinesSelector(deck, attr) {
// if we are in printview with pdfSeparateFragments: false
// then we'll also want to supress
if (regex.test(attr)) {
if (isPrintView() && deck.getConfig().pdfSeparateFragments !== true) {
return false;
} else {
return true;
}
} else {
return false;
}
}
const kCodeLineNumbersAttr = "data-code-line-numbers";
const kFragmentIndex = "data-fragment-index";
function initQuartoLineHighlight(deck) {
const divSourceCode = deck
.getRevealElement()
.querySelectorAll("div.sourceCode");
// Process each div created by Pandoc highlighting - numbered line are already included.
divSourceCode.forEach((el) => {
if (el.hasAttribute(kCodeLineNumbersAttr)) {
const codeLineAttr = el.getAttribute(kCodeLineNumbersAttr);
el.removeAttribute(kCodeLineNumbersAttr);
if (handleLinesSelector(deck, codeLineAttr)) {
// Only process if attr is a string to select lines to highlights
// e.g "1|3,6|8-11"
const codeBlock = el.querySelectorAll("pre code");
codeBlock.forEach((code) => {
// move attributes on code block
code.setAttribute(kCodeLineNumbersAttr, codeLineAttr);
const scrollState = { currentBlock: code };
// Check if there are steps and duplicate code block accordingly
const highlightSteps = splitLineNumbers(codeLineAttr);
if (highlightSteps.length > 1) {
// If the original code block has a fragment-index,
// each clone should follow in an incremental sequence
let fragmentIndex = parseInt(
code.getAttribute(kFragmentIndex),
10
);
fragmentIndex =
typeof fragmentIndex !== "number" || isNaN(fragmentIndex)
? null
: fragmentIndex;
let stepN = 1;
highlightSteps.slice(1).forEach(
// Generate fragments for all steps except the original block
(step) => {
var fragmentBlock = code.cloneNode(true);
fragmentBlock.setAttribute(
"data-code-line-numbers",
joinLineNumbers([step])
);
fragmentBlock.classList.add("fragment");
// Pandoc sets id on spans we need to keep unique
fragmentBlock
.querySelectorAll(":scope > span")
.forEach((span) => {
if (span.hasAttribute("id")) {
span.setAttribute(
"id",
span.getAttribute("id").concat("-" + stepN)
);
}
});
stepN = ++stepN;
// Add duplicated <code> element after existing one
code.parentNode.appendChild(fragmentBlock);
// Each new <code> element is highlighted based on the new attributes value
highlightCodeBlock(fragmentBlock);
if (typeof fragmentIndex === "number") {
fragmentBlock.setAttribute(kFragmentIndex, fragmentIndex);
fragmentIndex += 1;
} else {
fragmentBlock.removeAttribute(kFragmentIndex);
}
// Scroll highlights into view as we step through them
fragmentBlock.addEventListener(
"visible",
scrollHighlightedLineIntoView.bind(
this,
fragmentBlock,
scrollState
)
);
fragmentBlock.addEventListener(
"hidden",
scrollHighlightedLineIntoView.bind(
this,
fragmentBlock.previousSibling,
scrollState
)
);
}
);
code.removeAttribute(kFragmentIndex);
( run in 1.087 second using v1.01-cache-2.11-cpan-364913b4093 )