83 lines
2.0 KiB
Typst
83 lines
2.0 KiB
Typst
// Helpers for code block displaying
|
|
|
|
#import "@preview/based:0.2.0": base64
|
|
|
|
#let code_font_scale = 0.6em
|
|
|
|
#let cell_matcher(cell, cell_tag) = {
|
|
// Matching function to check if a cell has a specific tag
|
|
if cell.cell_type != "code" {
|
|
return false
|
|
}
|
|
let metadata = cell.metadata
|
|
if metadata.keys().contains("tags") == false {
|
|
return false
|
|
}
|
|
return cell.metadata.tags.contains(cell_tag)
|
|
}
|
|
|
|
|
|
#let code_cell(fcontent, cell_tag) = {
|
|
// Extract the content of a cell and display it as a code block
|
|
let cells = fcontent.cells
|
|
let matching_cell = cells.find(x => cell_matcher(x, cell_tag))
|
|
|
|
let cell_content = matching_cell.source
|
|
let single_line = cell_content.fold("", (acc, x) => acc + x)
|
|
|
|
text(
|
|
raw(
|
|
single_line,
|
|
lang: "python",
|
|
block: true
|
|
),
|
|
size: code_font_scale
|
|
)
|
|
}
|
|
|
|
|
|
#let image_cell(fcontent, cell_tag) = {
|
|
// Extract the output (image) of a cell and display it as an image
|
|
let cells = fcontent.cells
|
|
let matching_cell = cells.find(x => cell_matcher(x, cell_tag))
|
|
|
|
let outputs = matching_cell.outputs
|
|
for output in outputs {
|
|
let image_data = output.at("data", default: (:)).at("image/png", default: none)
|
|
if image_data != none {
|
|
align(
|
|
center,
|
|
image.decode(
|
|
base64.decode(image_data),
|
|
// height: 70% // the height should be set by the caller. This gives the flexibility to adjust the height of the image
|
|
)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#let code_reference_cell(fcontent, cell_tag) = {
|
|
// Extract the output (text) of a cell and display it as a code block
|
|
// This is useful for showing the code of imported functions
|
|
let cells = fcontent.cells
|
|
let matching_cell = cells.find(x => cell_matcher(x, cell_tag))
|
|
|
|
let outputs = matching_cell.outputs
|
|
for output in outputs {
|
|
let cell_output = output.at("text", default: (:))
|
|
if cell_output != none {
|
|
let single_line = cell_output.join("")
|
|
text(
|
|
raw(
|
|
single_line,
|
|
lang: "python",
|
|
block: true
|
|
),
|
|
size: code_font_scale
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|