Markdown to Script Converter

By bamr87

Python utilities to convert markdown files to executable scripts

Estimated reading time: 2 minutes

Edit on Github
Table of Contents
def convert_md_to_bash(md_file_path, bash_file_path):
    with open(md_file_path, 'r') as md_file, open(bash_file_path, 'w') as bash_file:
        bash_file.write('#!/bin/bash\n')  # add shebang line
        shell_script_mode = False
        for line in md_file:
            if '```shell' in line:
                shell_script_mode = True
                continue
            elif '```' in line and shell_script_mode:
                shell_script_mode = False
                continue
            if shell_script_mode:
                bash_file.write(line)
            else:
                bash_file.write(f'# {line}')

convert_md_to_bash('zer0.md', 'zer0.sh')
def convert_md_to_files(md_file_path):
    language_files = {}
    language_mode = None
    language_extensions = {'python': '.py', 'shell': '.sh'}
    shebang_lines = {'python': '#!/usr/bin/env python3\n', 'shell': '#!/bin/bash\n'}

    with open(md_file_path, 'r') as md_file:
        for line in md_file:
            if line.startswith('```'):
                if language_mode:
                    # End of a language block, switch back to markdown mode
                    language_mode = None
                else:
                    # Start of a language block, open a new file for this language if not already open
                    language = line.strip('`\n')
                    if language in language_extensions:
                        language_mode = language
                        if language not in language_files:
                            language_file = open(md_file_path.replace('.md', language_extensions[language]), 'w')
                            if language in shebang_lines:
                                language_file.write(shebang_lines[language])
                            language_files[language] = language_file
                continue

            if language_mode:
                language_files[language_mode].write(line)

    # Close all open language files
    for language_file in language_files.values():
        language_file.close()

convert_md_to_files('zer0.md')