Last active
July 7, 2020 06:05
-
-
Save jg-you/aa6ce468601fc11c3d0b to your computer and use it in GitHub Desktop.
Generate TOC for a markdown file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
# -*- coding: utf-8 -*- | |
# @author: Jean-Gabriel Young <[email protected]> | |
"""Generate TOC for a markdown file.""" | |
import re | |
# Match between 1 and 4 # | |
section = re.compile('^\s*(#){1,4}\s?') | |
strip_url = re.compile('[\W_]+', re.UNICODE) | |
def gen_toc(markdown_file): | |
"""Generate TOC for a markdown file.""" | |
toc_content = [] | |
for l in markdown_file: | |
match = section.match(l) | |
if match is not None: | |
level = match.group().count('#') - 1 | |
title = strip_url.sub(' ', section.sub('', l)).strip() | |
url = title.replace(' ', '-').lower() | |
toc_content.append((level, title, url)) | |
toc = [] | |
numerotation = [1, 1, 1, 1] | |
for item in toc_content: | |
toc.append(' ' * (item[0]) + str(numerotation[item[0]]) + | |
". " + "[" + item[1] + "](#" + item[2] + ")") | |
numerotation[item[0]] += 1 | |
numerotation[item[0] + 1:] = [1] * (3 - item[0]) | |
return toc | |
if __name__ == "__main__": | |
# Options parser. | |
import argparse as ap | |
import sys | |
prs = ap.ArgumentParser(description="Generate TOC for a markdown file.") | |
prs.add_argument('markdown_file', type=str, | |
help='Markdown file') | |
if len(sys.argv) == 1: | |
prs.print_help() | |
sys.exit(1) | |
args = prs.parse_args() | |
with open(args.markdown_file, 'r') as f: | |
toc = gen_toc(f) | |
for item in toc: | |
print(item) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
> python mdown_toc.py mdown_toc_example.md | |
1. [Top level](#top-level) | |
1. [Sub section A](#sub-section-a) | |
2. [Sub section B](#sub-section-b) | |
1. [Sub sub section B 1](#sub-sub-section-b-1) | |
3. [Sub section C](#sub-section-c) | |
1. [Sub sub section C 1](#sub-sub-section-c-1) | |
2. [Sub sub section C 2](#sub-sub-section-c-2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Many thanks, that worked.
In my case, running
./mdown_toc.py
does not work, butpython mdown_toc.py
does.Thanks also for your patience.