-
-
Save jg-you/aa6ce468601fc11c3d0b to your computer and use it in GitHub Desktop.
#!/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) |
> 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) |
If you then run the script, it means it will generate TOCs for all the files in there, right?
No, I setup the main to parse a single file python mdown_toc.py file.md
.
You cannot run it on a single file, unless you make a separate folder with just that one test file in it, right?
See above.
Where are the TOCs stored? In a newly created file?
The TOC is generated in the shell, you can copy paste it at the top of the file.
This is my set-up.
I ran the script, python mdown_toc.py
, which seems to go well.
Now, when you say "The TOC is generated in the shell, you can copy paste it at the top of the file", I assume by "shell" you mean the terminal, but it is not there.
This is what the terminal shows after running the script:
Last login: Sat Jul 4 13:04:38 on ttys000
Peters-MacBook-Air:~ peter$ cd /Volumes/NO\ NAME/Test
Peters-MacBook-Air:Test peter$ python mdown_toc.py
usage: mdown_toc.py [-h] markdown_file
Generate TOC for a markdown file.
positional arguments:
markdown_file Markdown file
optional arguments:
-h, --help show this help message and exit
Peters-MacBook-Air:Test peter$
as I showed in my previous reply.
So, what is not working?
Many thanks, that worked.
In my case, running ./mdown_toc.py
does not work, but python mdown_toc.py
does.
Thanks also for your patience.
I hope you'll answer.
I installed Python 3, then open a separate test folder, with 1 markdown file that contains # headers.
I placed a copy of your script in that folder, opened a terminal, cd to the test folder, ran the script with
python mdown_toc.py
, and got this as the output:There is no new file in the test folder, there is no TOC at the top of the test file.
Please advise on corrections.