Author

Shafayet Khan Shafee

Published

February 11, 2023

DISCLAIMER: The main focus of this extension is to enable code-folding for code chunk with added content from external files. Show all code, Hide all code from code-tools still would not work.

Note: View the source code of this document by clicking </> Code on top-right corner.

You can add content from external file using either Pandoc Divs ::: (easier) or using code chunk.

Using Pandoc Divs

add-from

To add codes using pandoc divs, use the add-from attribute to denote the path of the external file, relative to this qmd file. And within that Div, use a codeblock along with the name of the language of the content to be added to get correct syntax highlighting. (You can run quarto pandoc --list-highlight-languages to know for which languages, syntax highlighting is supported).

Code
class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

You can also pass options start-line, end-line to add a specific range of lines, code-line-numbers to enable source code line numbering, code-filename or filename to show a name of the file the added code is associated with.

start-line & end-line

Code
import Html exposing (text)

main =
  text "Hello, World!"

Note that, we have used code-line-numbers: true to add line numbers in code chunk.

Also We can change the text Code to something nicer using code-filename.

filename and code-filename

Using filename does not align properly with code-folding. Instead use code-filename when using code-fold: true.

Code
with Text_IO;
procedure Hello_World is

begin
  Text_IO.Put_Line("Hello, World!");
end Hello_World;

code-filename only works with code-folding. For othercases, use filename

Using Code chunk

Now there is a way to use code chunk instead of pandoc divs to add contents from external file. But there are two things to note,

  • Since Quarto so far uses two types rendering engine, knitr and jupyter, we need to use code chunk accordingly.If you are rendering the quarto document using jupyter along with python kernel use {python} chunk to add code, similary if you are using julia kernel, you need to use {julia} and on the other hand if you are rendering the quarto document using knitr (i.e. engine: knitr) then use {r} chunk to add code, Or to avoid thinking about rendering engine, jupyter or knitr, you also can follow pandoc Div approach described above.

  • You also need to use a chunk option source-lang to give the name of the language of the content to be added to get correct syntax highlighting.

Note: View the source code of this document by clicking </> Code on top-right corner to see how code chunk is used.

add-from

Code
function capString = capitalize(string)
    if(nargin==0)
        fprintf("Usage: please provide a string\n");
    else
        if(strlength(string)==0)
            fprintf("Usage: please provide a string\n");
        else
            string = char(string);
            capString = convertCharsToStrings(strcat(upper(string(1:1)),string(2:end)));
        end
    end
end

One very important detail to note that, you must put a random comment in code chunk so that the code chunk is not treated as empty, to make this filter work.

start-line & end-line

You can specify from which line to which line you want to add,

Code
const myStr: string = "hello world";

const capitalize = (str: string = "no input was provided") => str[0].toUpperCase() + str.slice(1);

console.log(capitalize(myStr));

Note that, we have used code-line-numbers: true to add line numbers in code chunk.

Some more examples

Code
<?php

if (count($argv) == 2 && strlen($argv[1])) {
    $inputString = $argv[1];
    $capitalized = ucfirst($inputString);
    echo $capitalized;
} else {
    echo "Usage: please provide a string";
}
Code
fn main() {
    for number in 1..101 {
        if number % 3 == 0 && number % 5 == 0 {
            println!("FizzBuzz");
        } else if number % 3 == 0 {
            println!("Fizz");
        } else if number % 5 == 0 {
            println!("Buzz");
        } else {
            println!("{}", number);
        }
    }
}
Code
#!/usr/bin/julia

for i = 1:100
    str = i % 3 == 0 ? "Fizz" : ""
    str *= i % 5 == 0 ? "Buzz" : ""
    if isempty(str)
        str = i
    end
    println(str)
end