Created
October 19, 2022 09:01
-
-
Save grimbough/6014ec0a5aeeac49487536db68074dfb to your computer and use it in GitHub Desktop.
Adding anchor links to equations in Quarto
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## expects to be passed HTML that has already been read with readLines() | |
insert_anchor_JS <- function(lines) { | |
## we'll look for this JavaScript entry in the html | |
pattern <- "const anchorJS = new window.AnchorJS();" | |
## this is the new JavaScript to insert | |
insert <- " const anchorJS_eq = new window.AnchorJS(); | |
anchorJS_eq.options = { | |
placement: 'left', | |
class: 'eq-link', | |
icon: icon | |
}; | |
anchorJS_eq.add('.anchored-eq');" | |
## Look for the existing JS line, and if we find it | |
## insert the new JS before the original declaration | |
line <- grep(pattern = pattern, x = lines, fixed = TRUE) | |
if(length(line) == 1) { | |
lines[line] <- paste(insert, lines[line], sep = "\n") | |
} | |
return(lines) | |
} | |
## input is the path to an HTML file | |
add_equation_links <- function(input) { | |
## read HTML file and add the second AnchorJS declaration | |
lines <- readLines(input, warn = FALSE) |> | |
insert_anchor_JS() | |
## find all spans that have an equation identifier | |
equation_lines <- grep(x = lines, "span.*eq-") | |
## iterate over equation lines and add the new class | |
for(j in seq_along(equation_lines)) { | |
## extract only the equation id from the line | |
equation_id <- sub(lines[equation_lines[j]], | |
pattern = ".*(eq-[[:alnum:]]*).*", | |
replacement = "\\1") | |
## create a new span with additional class and data-anchor-id attributes | |
new_line <- sub(x = lines[equation_lines[j]], | |
pattern = "span", | |
replacement = sprintf('span class="anchored-eq" data-anchor-id="%s"', equation_id)) | |
## replace the old equation line | |
lines[equation_lines[j]] <- new_line | |
} | |
## overwrite the input HTML file | |
writeLines(text = lines, con = input) | |
} | |
html_files <- list.files(path = Sys.getenv("QUARTO_PROJECT_OUTPUT_DIR"), | |
pattern = ".html", | |
full.names = TRUE) | |
invisible(lapply(html_files, FUN = add_equation_links)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment