# mdrun [![Crates.io](https://img.shields.io/crates/v/mdrun.svg)](https://crates.io/crates/mdrun) [![Docs.rs](https://docs.rs/mdrun/badge.svg)](https://docs.rs/mdrun/) Markdown notebook runner ## Work in progress This tool is not yet ready for use, as at present time no code for it has yet been written. ## Table of contents Table of contents will be added as soon as `mdrun` is able to generate it. ## Introduction `mdrun` is a tool that reads Markdown and CommonMark documents and: - Runs shell commands from one or more specified sections of your document. - Captures the output of said shell commands. - Inserts the output of the shell commands into the document. - Updates the output of the shell commands in the document. Additionally, it performs the following tasks: - Generates a table of contents for your document. - Updates the table of contents in your document. ## Dogfooding We wrote this tool to scratch an itch, and we use it ourselves. Both in other projects, and on the very README you are presently reading. (Also, when I say "we" I actually mean "I", because there is only me working on this as of yet. Contributions are welcome though, as long as they stick to the essence of the project. So perhaps one day it really will be "we".) ## Use cases The foremost usecase for `mdrun` lies in keeping documentation up to date, by capturing and updating the output of shell commands that your docmuents contain. Aside from this, one of many other possible use cases include using `mdrun` with a Markdown or CommonMark document in the style of what IPython provides when you choose to "Run all cells" on an IPython notebook. Albeit more simple and less interactive compared to IPython of course. Simpler and less interactive for the time being, at least. ## Usage Since one might not want to execute all commands in any given document, the tool requires that you specify which section(s) of the document to run shell commands from. By default, no commands will be executed unless sections are specified, and furthermore, only the commands that belong to the section itself, and not any commands inside of any subsections will be executed. Additionally, for safety and convenience, `mdrun` will only execute fenced commands that satisfy the following conditions: 1. The code block containing the command is fenced and has an info string indicating which shell the command is to be run in. 2. The aforementioned info string has a value corresponding to either of the following: `zsh`, `fish`, `bash`, `sh`, `ksh`, `tcsh` or `csh`. 3. The code block containing the command is immediatelly followed by a code block that has an info string with a value of `text`. As such, assuming `mdrun` has been installed to a directory that is in your `$PATH`, and you were to run the following command in this directory, specifying that `mdrun` run on the section titled "Usage" of this README: ```zsh mdrun -s Usage README.md ``` And further assuming that you have `zsh` installed on your system, then you will find that the following commands will execute and the output will be updated correspondingly. ```zsh date +%s ``` ```text ``` ```zsh uname -a ``` ```text ``` Whereas the following command will not be executed, because there is no corresponding fenced code block with info string `text` immediatelly following it. ```zsh echo This command is not executed. ``` Likewise, the following command will not be executed either, because the info string for the command code block has a value that is different from the set of accepted values for the info string of a command code block: ```python3 print("Hello from Python 3.") ``` ```text ``` Although... Python may be considered to be in scope. So in that case we'll have to come up with another example instead. This one may be a safer bet for something that will probably remain considered out of scope: ```sql select current_date; ``` ```text ``` Since in order for that command to really make sense, we'd at the very least need to know which sql client to use (PostgreSQL here), and usually we'd need to know which database to run the sql command on etc. Either way, in both the case of Python 3 and any command-line capable sql client, if you wanted to run commands and capture output you could specify a shell command that invokes the tool in question. So for example Python 3: ```zsh python3 -c "print('Hello from Python 3.')" ``` ```text ``` and a multi-line Python 3 example: ```zsh python3 <