---
title: "Markdown To Application"
date: 2023-06-12T20:59:24-05:00
draft: false
---

[**mdotapp**](https://chiselapp.com/user/bit4bit/repository/bit4bit_website/file?name=code/mdtoapp.rb) es otra herramienta más para la programación literaria,
pero con un objetivo practico: hacer ejecutable los post de este sitio, la diferencia fundamental con otras herramientas es que fácilmente
podemos crear una aplicación de software es decir múltiples archivos con código ejecutable.

# Uso

se permiten los siguientes atributos en el bloque:
*  `@mdtoapp` marcar el bloque para ser procesado por `mdtoapp`
*  `file:<archivo>` escribir contenido en el archivo indicado, se puede indicar una ruta de directorios.
*  `@execute` el bloque se debe ejecutar
*  `executable:<command>` indicar un comando diferente a `sh` para ejecutar el bloque
*  `@silence` no imprimir salida de la ejecución del bloque
*  `@tdd` el bloque se debe ejecutar en modo TDD
*  `@artifact` el bloque se ejecutar en modo ARTIFACT

la ejecución de los bloques es en el orden declarados en el documento.

## Ejemplos

ejecutar un script

<pre>
```sh @mdtoapp file:date.sh @execute
date
```
</pre>

se puede crear una jerarquía de archivos

<pre>
```sh @mdtoapp file:demo/demo.sh
echo 'hola'
```
</pre>

<pre>
```sh @mdtoapp file:run.sh @execute
bash demo/demo.sh
```
</pre>

para agrupar diferentes bloques en un mismo archivo usar el mismo nombre de archivo

<pre>
```sh @mdtoapp file:demo.sh
NAME=mdtoapp
```
</pre>

<pre>
```sh @mdtoapp file:demo.sh @execute
echo $NAME
```
</pre>

crear un archivo de python y ejecutar las pruebas
<pre>
```python @mdtoapp file:test.py @execute executable:python3
import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()
```
</pre>



`ruby mdtoapp.rb <mi archivo markdown a ejecutar>`

los post de este sitio pueden ser ejecutados usando **mdtoapp.rb**, ejemplo

`ruby mdtoapp.rb 'https://chiselapp.com/user/bit4bit/repository/bit4bit_website/raw?ci=tip&filename=content/post%2fmdtoapp.md'`

si solo el interes es generar los archivos puedes usar

`TO=/tmp/out ARTIFACT=1 ruby mdtoapp.rb 'https://chiselapp.com/user/bit4bit/repository/bit4bit_website/raw?ci=tip&filename=content/post%2fmdtoapp.md'`
