From c4c19d1aa7b00a07301f2baeb7373f0a8f2dd543 Mon Sep 17 00:00:00 2001 From: autodocs Date: Sat, 11 Aug 2018 10:52:42 +0000 Subject: [PATCH] build based on 5bbdddc --- latest/assets/logo.png | Bin 0 -> 36913 bytes latest/assets/search.js | 2 +- latest/customprocessing.html | 2 +- latest/documenter.html | 2 +- latest/fileformat.html | 2 +- latest/generated/example.html | 86 +++++++-------- latest/generated/example.ipynb | 186 +++++++++++++++----------------- latest/generated/notebook.ipynb | 6 +- latest/index.html | 2 +- latest/outputformats.html | 6 +- latest/pipeline.html | 2 +- latest/search.html | 2 +- 12 files changed, 143 insertions(+), 155 deletions(-) create mode 100644 latest/assets/logo.png diff --git a/latest/assets/logo.png b/latest/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..73e1c94d32831ddaa2ac06c0b976e32adf1ea898 GIT binary patch literal 36913 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 -5. Custom pre- and post-processing · Literate.jl

5. Custom pre- and post-processing

5. Custom pre- and post-processing

Since all packages are different, and may have different demands on how to create a nice example for the documentation it is important that the package maintainer does not feel limited by the by default provided syntax that this package offers. While you can generally come a long way by utilizing line filtering there might be situations where you need to manually hook into the generation and change things. In Literate this is done by letting the user supply custom pre- and post-processing functions that may do transformation of the content.

All of the generators (Literate.markdown, Literate.notebook and Literate.script) accepts preprocess and postprocess keyword arguments. The default "transformation" is the identity function. The input to the transformation functions is a String, and the output should be the transformed String.

preprocess is sent the raw input that is read from the source file (modulo the default line ending transformation). postprocess is given different things depending on the output: For markdown and script output postprocess is given the content String just before writing it to the output file, but for notebook output postprocess is given the dictionary representing the notebook, since, in general, this is more useful.

As an example, lets say we want to splice the date of generation into the output. We could of course update our source file before generating the docs, but we could instead use a preprocess function that splices the date into the source for us. Consider the following source file:

# # Example
+5. Custom pre- and post-processing · Literate.jl

5. Custom pre- and post-processing

5. Custom pre- and post-processing

Since all packages are different, and may have different demands on how to create a nice example for the documentation it is important that the package maintainer does not feel limited by the by default provided syntax that this package offers. While you can generally come a long way by utilizing line filtering there might be situations where you need to manually hook into the generation and change things. In Literate this is done by letting the user supply custom pre- and post-processing functions that may do transformation of the content.

All of the generators (Literate.markdown, Literate.notebook and Literate.script) accepts preprocess and postprocess keyword arguments. The default "transformation" is the identity function. The input to the transformation functions is a String, and the output should be the transformed String.

preprocess is sent the raw input that is read from the source file (modulo the default line ending transformation). postprocess is given different things depending on the output: For markdown and script output postprocess is given the content String just before writing it to the output file, but for notebook output postprocess is given the dictionary representing the notebook, since, in general, this is more useful.

As an example, lets say we want to splice the date of generation into the output. We could of course update our source file before generating the docs, but we could instead use a preprocess function that splices the date into the source for us. Consider the following source file:

# # Example
 # This example was generated DATEOFTODAY
 
 x = 1 // 3

where DATEOFTODAY is a placeholder, to make it easier for our preprocess function to find the location. Now, lets define the preprocess function, for example

function update_date(content)
diff --git a/latest/documenter.html b/latest/documenter.html
index 56f688d..7a431f3 100644
--- a/latest/documenter.html
+++ b/latest/documenter.html
@@ -1,5 +1,5 @@
 
-6. Interaction with Documenter.jl · Literate.jl

6. Interaction with Documenter.jl

6. Interaction with Documenter.jl

Literate can be used for any purpose, it spits out regular markdown files, and notebooks. Typically, though, these files will be used to render documentation for your package. The generators (Literate.markdown, Literate.notebook and Literate.script) supports a keyword argument documenter that lets the generator perform some extra things, keeping in mind that the source code have been written with Documenter.jl in mind. So lets take a look at what will happen if we set documenter = true:

Literate.markdown:

  • The default code fence will change from
    ```julia
    +6. Interaction with Documenter.jl · Literate.jl

    6. Interaction with Documenter.jl

    6. Interaction with Documenter.jl

    Literate can be used for any purpose, it spits out regular markdown files, and notebooks. Typically, though, these files will be used to render documentation for your package. The generators (Literate.markdown, Literate.notebook and Literate.script) supports a keyword argument documenter that lets the generator perform some extra things, keeping in mind that the source code have been written with Documenter.jl in mind. So lets take a look at what will happen if we set documenter = true:

    Literate.markdown:

    • The default code fence will change from
      ```julia
       # code
       ```
      to Documenters @example blocks:
      ```@examples $(name)
       # code
      diff --git a/latest/fileformat.html b/latest/fileformat.html
      index a1d454a..8a24e34 100644
      --- a/latest/fileformat.html
      +++ b/latest/fileformat.html
      @@ -1,5 +1,5 @@
       
      -2. File Format · Literate.jl

      2. File Format

      2. File Format

      The source file format for Literate is a regular, commented, julia (.jl) scripts. The idea is that the scripts also serve as documentation on their own and it is also simple to include them in the test-suite, with e.g. include, to make sure the examples stay up do date with other changes in your package.

      2.1. Syntax

      The basic syntax is simple:

      • lines starting with # are treated as markdown,
      • all other lines are treated as julia code.

      Leading whitespace is allowed before #, but it will be removed when generating the output. Since #-lines is treated as markdown we can not use that for regular julia comments, for this you can instead use ##, which will render as # in the output.

      Lets look at a simple example:

      # # Rational numbers
      +2. File Format · Literate.jl

      2. File Format

      2. File Format

      The source file format for Literate is a regular, commented, julia (.jl) scripts. The idea is that the scripts also serve as documentation on their own and it is also simple to include them in the test-suite, with e.g. include, to make sure the examples stay up do date with other changes in your package.

      2.1. Syntax

      The basic syntax is simple:

      • lines starting with # are treated as markdown,
      • all other lines are treated as julia code.

      Leading whitespace is allowed before #, but it will be removed when generating the output. Since #-lines is treated as markdown we can not use that for regular julia comments, for this you can instead use ##, which will render as # in the output.

      Lets look at a simple example:

      # # Rational numbers
       #
       # In julia rational numbers can be constructed with the `//` operator.
       # Lets define two rational numbers, `x` and `y`:
      diff --git a/latest/generated/example.html b/latest/generated/example.html
      index 35104b6..ac7a575 100644
      --- a/latest/generated/example.html
      +++ b/latest/generated/example.html
      @@ -1,5 +1,5 @@
       
      -7. Example · Literate.jl

      7. Example

      7. Example

      This is an example generated with Literate based on this source file: example.jl. You are seeing the html-output which Documenter have generated based on a markdown file generated with Literate. The corresponding notebook can be found here: example.ipynb, and the plain script output can be found here: example.jl.

      It is recommended to have the source file available when reading this, to better understand how the syntax in the source file corresponds to the output you are seeing.

      Basic syntax

      The basic syntax for Literate is simple, lines starting with # is interpreted as markdown, and all the other lines are interpreted as code. Here is some code:

      x = 1//3
      +7. Example · Literate.jl

      7. Example

      7. Example

      This is an example generated with Literate based on this source file: example.jl. You are seeing the html-output which Documenter have generated based on a markdown file generated with Literate. The corresponding notebook can be found here: example.ipynb, and the plain script output can be found here: example.jl.

      It is recommended to have the source file available when reading this, to better understand how the syntax in the source file corresponds to the output you are seeing.

      Basic syntax

      The basic syntax for Literate is simple, lines starting with # is interpreted as markdown, and all the other lines are interpreted as code. Here is some code:

      x = 1//3
       y = 2//5
      2//5

      In markdown sections we can use markdown syntax. For example, we can write text in italic font, text in bold font and use links.

      It is possible to filter out lines depending on the output using the #md, #nb, #jl and #src tags (see Filtering Lines):

      • This line starts with #md and is thus only visible in the markdown output.

      The source file is parsed in chunks of markdown and code. Starting a line with #- manually inserts a chunk break. For example, if we want to display the output of the following operations we may insert #- in between. These two code blocks will now end up in different @example-blocks in the markdown output, and two different notebook cells in the notebook output.

      x + y
      11//15
      x * y
      2//15

      Output Capturing

      Code chunks are by default placed in Documenter @example blocks in the generated markdown. This means that the output will be captured in a block when Documenter is building the docs. In notebooks the output is captured in output cells, if the execute keyword argument is set to true. Output to stdout/stderr is also captured.

      function foo()
           println("This string is printed to stdout.")
           return [1, 2, 3, 4]
      @@ -17,114 +17,114 @@ y2 = cos.(x)
       plot(x, [y1, y2])
      - + - - + - - + - - - - - - - - - - - - - - - - - - - - - + 0 - + 5 - + 10 - + 15 - + -1.0 - + -0.5 - + 0.0 - + 0.5 - + 1.0 - 559.828,227.723 560.354,224.45 560.88,221.169 561.405,217.879 561.931,214.582 562.457,211.279 562.982,207.972 563.508,204.661 564.034,201.347 564.56,198.032 "/> - 559.828,24.8788 560.354,24.3495 560.88,23.8819 561.405,23.4764 561.931,23.133 562.457,22.8519 562.982,22.6332 563.508,22.4769 564.034,22.3831 564.56,22.3518 "/> - - - - + y1 - - + y2 diff --git a/latest/generated/example.ipynb b/latest/generated/example.ipynb index 97d9bc9..282cb69 100644 --- a/latest/generated/example.ipynb +++ b/latest/generated/example.ipynb @@ -178,18 +178,6 @@ }, { "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "┌ Warning: `Array{T}(d::NTuple{N, Int}) where {T, N}` is deprecated, use `Array{T}(undef, d)` instead.\n", - "│ caller = plot_color(::Array{ColorTypes.RGB{FixedPointNumbers.Normed{UInt8,8}},1}) at colors.jl:24\n", - "└ @ PlotUtils /home/travis/.julia/packages/PlotUtils/xQ9vp/src/colors.jl:24\n", - "┌ Warning: `a::Number + b::AbstractArray` is deprecated, use `a .+ b` instead.\n", - "│ caller = get_zvalues(::Int64) at color_utils.jl:104\n", - "└ @ PlotUtils /home/travis/.julia/packages/PlotUtils/xQ9vp/src/color_utils.jl:104\n" - ] - }, { "output_type": "execute_result", "data": { @@ -199,114 +187,114 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", "0\n", "\n", - "\n", + "\n", "5\n", "\n", - "\n", + "\n", "10\n", "\n", - "\n", + "\n", "15\n", "\n", - "\n", + "\n", "-1.0\n", "\n", - "\n", + "\n", "-0.5\n", "\n", - "\n", + "\n", "0.0\n", "\n", - "\n", + "\n", "0.5\n", "\n", - "\n", + "\n", "1.0\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", "y1\n", "\n", - "\n", - "\n", + "\n", "y2\n", "\n", "\n" @@ -536,114 +524,114 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", "0\n", "\n", - "\n", + "\n", "5\n", "\n", - "\n", + "\n", "10\n", "\n", - "\n", + "\n", "15\n", "\n", - "\n", + "\n", "-1.0\n", "\n", - "\n", + "\n", "-0.5\n", "\n", - "\n", + "\n", "0.0\n", "\n", - "\n", + "\n", "0.5\n", "\n", - "\n", + "\n", "1.0\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", "y1\n", "\n", - "\n", - "\n", + "\n", "y2\n", "\n", "\n" @@ -952,11 +940,11 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "0.7.0-beta2.204" + "version": "1.0.0" }, "kernelspec": { - "name": "julia-0.7", - "display_name": "Julia 0.7.0-beta2.204", + "name": "julia-1.0", + "display_name": "Julia 1.0.0", "language": "julia" } }, diff --git a/latest/generated/notebook.ipynb b/latest/generated/notebook.ipynb index 7f4ba90..44380f6 100644 --- a/latest/generated/notebook.ipynb +++ b/latest/generated/notebook.ipynb @@ -88,11 +88,11 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "0.7.0-beta2.204" + "version": "1.0.0" }, "kernelspec": { - "name": "julia-0.7", - "display_name": "Julia 0.7.0-beta2.204", + "name": "julia-1.0", + "display_name": "Julia 1.0.0", "language": "julia" } }, diff --git a/latest/index.html b/latest/index.html index 19e53bb..89d2480 100644 --- a/latest/index.html +++ b/latest/index.html @@ -1,2 +1,2 @@ -1. Introduction · Literate.jl

      1. Introduction

      1. Introduction

      Welcome to the documentation for Literate – a simplistic package for Literate Programming.

      What?

      Literate is a package that generates markdown pages (for e.g. Documenter.jl), and Jupyter notebooks, from the same source file. There is also an option to "clean" the source from all metadata, and produce a pure Julia script.

      The main design goal is simplicity. It should be simple to use, and the syntax should be simple. In short, all you have to do is to write a commented julia script!

      The public interface consists mainly of three functions, all of which take the same script file as input, but generate different output:

      Why?

      Examples are (probably) the best way to showcase your awesome package, and examples are often the best way for a new user to learn how to use it. It is therefore important that the documentation of your package contains examples for users to read and study. However, people are different, and we all prefer different ways of trying out a new package. Some people wants to RTFM, others want to explore the package interactively in, for example, a notebook, and some people wants to study the source code. The aim of Literate is to make it easy to give the user all of these options, while still keeping maintenance to a minimum.

      It is quite common that packages have "example notebooks" to showcase the package. Notebooks are great for showcasing a package, but they are not so great with version control, like git. The reason being that a notebook is a very "rich" format since it contains output and other metadata. Changes to the notebook thus result in large diffs, which makes it harder to review the actual changes.

      It is also common that packages include examples in the documentation, for example by using Documenter.jl @example-blocks. This is also great, but it is not quite as interactive as a notebook, for the users who prefer that.

      Literate tries to solve the problems above by creating the output as a part of the doc build. Literate generates the output based on a single source file which makes it easier to maintain, test, and keep the manual and your example notebooks in sync.

      +1. Introduction · Literate.jl

      1. Introduction

      1. Introduction

      Welcome to the documentation for Literate – a simplistic package for Literate Programming.

      What?

      Literate is a package that generates markdown pages (for e.g. Documenter.jl), and Jupyter notebooks, from the same source file. There is also an option to "clean" the source from all metadata, and produce a pure Julia script.

      The main design goal is simplicity. It should be simple to use, and the syntax should be simple. In short, all you have to do is to write a commented julia script!

      The public interface consists mainly of three functions, all of which take the same script file as input, but generate different output:

      Why?

      Examples are (probably) the best way to showcase your awesome package, and examples are often the best way for a new user to learn how to use it. It is therefore important that the documentation of your package contains examples for users to read and study. However, people are different, and we all prefer different ways of trying out a new package. Some people wants to RTFM, others want to explore the package interactively in, for example, a notebook, and some people wants to study the source code. The aim of Literate is to make it easy to give the user all of these options, while still keeping maintenance to a minimum.

      It is quite common that packages have "example notebooks" to showcase the package. Notebooks are great for showcasing a package, but they are not so great with version control, like git. The reason being that a notebook is a very "rich" format since it contains output and other metadata. Changes to the notebook thus result in large diffs, which makes it harder to review the actual changes.

      It is also common that packages include examples in the documentation, for example by using Documenter.jl @example-blocks. This is also great, but it is not quite as interactive as a notebook, for the users who prefer that.

      Literate tries to solve the problems above by creating the output as a part of the doc build. Literate generates the output based on a single source file which makes it easier to maintain, test, and keep the manual and your example notebooks in sync.

      diff --git a/latest/outputformats.html b/latest/outputformats.html index 7f0574e..0449206 100644 --- a/latest/outputformats.html +++ b/latest/outputformats.html @@ -1,5 +1,5 @@ -4. Output Formats · Literate.jl

      4. Output Formats

      4. Output Formats

      When the source is parsed, and have been processed it is time to render the output. We will consider the following source snippet:

      # # Rational numbers
      +4. Output Formats · Literate.jl

      4. Output Formats

      4. Output Formats

      When the source is parsed, and have been processed it is time to render the output. We will consider the following source snippet:

      # # Rational numbers
       #
       # In julia rational numbers can be constructed with the `//` operator.
       # Lets define two rational numbers, `x` and `y`:
      @@ -31,8 +31,8 @@ When adding `x` and `y` together we obtain a new rational number:
       
       ```@example name
       z = x + y
      -```

      We note that lines starting with # are printed as regular markdown, and the code lines have been wrapped in @example blocks. We also note that an @meta block have been added, that sets the EditURL variable. This is used by Documenter to redirect the "Edit on GitHub" link for the page, see Interaction with Documenter.

      Some of the output rendering can be controlled with keyword arguments to Literate.markdown:

      Literate.markdownFunction.
      Literate.markdown(inputfile, outputdir; kwargs...)

      Generate a markdown file from inputfile and write the result to the directoryoutputdir.

      Keyword arguments:

      • name: name of the output file, excluding .md. name is also used to name all the @example blocks, and to replace @__NAME__. Defaults to the filename of inputfile.
      • preprocess, postprocess: custom pre- and post-processing functions, see the Custom pre- and post-processing section of the manual. Defaults to identity.
      • documenter: boolean that tells if the output is intended to use with Documenter.jl. Defaults to true. See the the manual section on Interaction with Documenter.
      • codefence: A Pair of opening and closing code fence. Defaults to
        "```@example $(name)" => "```"
        if documenter = true and
        "```julia" => "```"
        if documenter = false.
      source

      4.2. Notebook Output

      The (default) notebook output of the source snippet can be seen here: notebook.ipynb.

      We note that lines starting with # are placed in markdown cells, and the code lines have been placed in code cells. By default the notebook is also executed and output cells populated. The current working directory is set to the specified output directory the notebook is executed. Some of the output rendering can be controlled with keyword arguments to Literate.notebook:

      Literate.notebookFunction.
      Literate.notebook(inputfile, outputdir; kwargs...)

      Generate a notebook from inputfile and write the result to outputdir.

      Keyword arguments:

      • name: name of the output file, excluding .ipynb. name is also used to replace @__NAME__. Defaults to the filename of inputfile.
      • preprocess, postprocess: custom pre- and post-processing functions, see the Custom pre- and post-processing section of the manual. Defaults to identity.
      • execute: a boolean deciding if the generated notebook should also be executed or not. Defaults to true. The current working directory is set to outputdir when executing the notebook.
      • documenter: boolean that says if the source contains Documenter.jl specific things to filter out during notebook generation. Defaults to true. See the the manual section on Interaction with Documenter.
      source

      4.3. Script Output

      The (default) script output of the source snippet above is as follows

      x = 1//3
      +```

      We note that lines starting with # are printed as regular markdown, and the code lines have been wrapped in @example blocks. We also note that an @meta block have been added, that sets the EditURL variable. This is used by Documenter to redirect the "Edit on GitHub" link for the page, see Interaction with Documenter.

      Some of the output rendering can be controlled with keyword arguments to Literate.markdown:

      Literate.markdownFunction.
      Literate.markdown(inputfile, outputdir; kwargs...)

      Generate a markdown file from inputfile and write the result to the directoryoutputdir.

      Keyword arguments:

      • name: name of the output file, excluding .md. name is also used to name all the @example blocks, and to replace @__NAME__. Defaults to the filename of inputfile.
      • preprocess, postprocess: custom pre- and post-processing functions, see the Custom pre- and post-processing section of the manual. Defaults to identity.
      • documenter: boolean that tells if the output is intended to use with Documenter.jl. Defaults to true. See the the manual section on Interaction with Documenter.
      • codefence: A Pair of opening and closing code fence. Defaults to
        "```@example $(name)" => "```"
        if documenter = true and
        "```julia" => "```"
        if documenter = false.
      source

      4.2. Notebook Output

      The (default) notebook output of the source snippet can be seen here: notebook.ipynb.

      We note that lines starting with # are placed in markdown cells, and the code lines have been placed in code cells. By default the notebook is also executed and output cells populated. The current working directory is set to the specified output directory the notebook is executed. Some of the output rendering can be controlled with keyword arguments to Literate.notebook:

      Literate.notebookFunction.
      Literate.notebook(inputfile, outputdir; kwargs...)

      Generate a notebook from inputfile and write the result to outputdir.

      Keyword arguments:

      • name: name of the output file, excluding .ipynb. name is also used to replace @__NAME__. Defaults to the filename of inputfile.
      • preprocess, postprocess: custom pre- and post-processing functions, see the Custom pre- and post-processing section of the manual. Defaults to identity.
      • execute: a boolean deciding if the generated notebook should also be executed or not. Defaults to true. The current working directory is set to outputdir when executing the notebook.
      • documenter: boolean that says if the source contains Documenter.jl specific things to filter out during notebook generation. Defaults to true. See the the manual section on Interaction with Documenter.
      source

      4.3. Script Output

      The (default) script output of the source snippet above is as follows

      x = 1//3
       
       y = 2//5
       
      -z = x + y

      We note that lines starting with # are removed and only the code lines have been kept. Some of the output rendering can be controlled with keyword arguments to Literate.script:

      Literate.scriptFunction.
      Literate.script(inputfile, outputdir; kwargs...)

      Generate a plain script file from inputfile and write the result to outputdir.

      Keyword arguments:

      • name: name of the output file, excluding .jl. name is also used to replace @__NAME__. Defaults to the filename of inputfile.
      • preprocess, postprocess: custom pre- and post-processing functions, see the Custom pre- and post-processing section of the manual. Defaults to identity.
      • documenter: boolean that says if the source contains Documenter.jl specific things to filter out during script generation. Defaults to true. See the the manual section on Interaction with Documenter.
      • keep_comments: boolean that, if set to true, keeps markdown lines as comments in the output script. Defaults to false.
      source
      +z = x + y

      We note that lines starting with # are removed and only the code lines have been kept. Some of the output rendering can be controlled with keyword arguments to Literate.script:

      Literate.scriptFunction.
      Literate.script(inputfile, outputdir; kwargs...)

      Generate a plain script file from inputfile and write the result to outputdir.

      Keyword arguments:

      • name: name of the output file, excluding .jl. name is also used to replace @__NAME__. Defaults to the filename of inputfile.
      • preprocess, postprocess: custom pre- and post-processing functions, see the Custom pre- and post-processing section of the manual. Defaults to identity.
      • documenter: boolean that says if the source contains Documenter.jl specific things to filter out during script generation. Defaults to true. See the the manual section on Interaction with Documenter.
      • keep_comments: boolean that, if set to true, keeps markdown lines as comments in the output script. Defaults to false.
      source
      diff --git a/latest/pipeline.html b/latest/pipeline.html index f2071db..14c7c0f 100644 --- a/latest/pipeline.html +++ b/latest/pipeline.html @@ -1,5 +1,5 @@ -3. Processing pipeline · Literate.jl

      3. Processing pipeline

      3. Processing pipeline

      The generation of output follows the same pipeline for all output formats:

      1. Pre-processing
      2. Parsing
      3. Document generation
      4. Post-processing
      5. Writing to file

      3.1. Pre-processing

      The first step is pre-processing of the input file. The file is read to a String. The first processing step is to apply the user specified pre-processing function, see Custom pre- and post-processing.

      The next step is to perform all of the built-in default replacements. CRLF style line endings ("\r\n") are replaced with LF line endings ("\n") to simplify internal processing. Next, line filtering is performed, see Filtering Lines, meaning that lines starting with #md, #nb or #jl are handled (either just the token itself is removed, or the full line, depending on the output target). The last pre-processing step is to expand the convenience "macros" described in Default Replacements is expanded.

      3.2. Parsing

      After the preprocessing the file is parsed. The first step is to categorize each line and mark them as either markdown or code according to the rules described in the Syntax section. Lets consider the example from the previous section with each line categorized:

      # # Rational numbers                                                     <- markdown
      +3. Processing pipeline · Literate.jl

      3. Processing pipeline

      3. Processing pipeline

      The generation of output follows the same pipeline for all output formats:

      1. Pre-processing
      2. Parsing
      3. Document generation
      4. Post-processing
      5. Writing to file

      3.1. Pre-processing

      The first step is pre-processing of the input file. The file is read to a String. The first processing step is to apply the user specified pre-processing function, see Custom pre- and post-processing.

      The next step is to perform all of the built-in default replacements. CRLF style line endings ("\r\n") are replaced with LF line endings ("\n") to simplify internal processing. Next, line filtering is performed, see Filtering Lines, meaning that lines starting with #md, #nb or #jl are handled (either just the token itself is removed, or the full line, depending on the output target). The last pre-processing step is to expand the convenience "macros" described in Default Replacements is expanded.

      3.2. Parsing

      After the preprocessing the file is parsed. The first step is to categorize each line and mark them as either markdown or code according to the rules described in the Syntax section. Lets consider the example from the previous section with each line categorized:

      # # Rational numbers                                                     <- markdown
       #                                                                        <- markdown
       # In julia rational numbers can be constructed with the `//` operator.   <- markdown
       # Lets define two rational numbers, `x` and `y`:                         <- markdown
      diff --git a/latest/search.html b/latest/search.html
      index 674f80b..67a457d 100644
      --- a/latest/search.html
      +++ b/latest/search.html
      @@ -1,2 +1,2 @@
       
      -Search · Literate.jl

      Search

      Search

      Number of results: loading...

        +Search · Literate.jl

        Search

        Search

        Number of results: loading...