md2bbc/md2bbc.py

89 lines
2.7 KiB
Python
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# Maintainer: Darks
# Disclaimer: this script has been done as a quick n' dirty way to convert
# markdown to Planète Casio's BBcode. As it, it does support only those
# features:
# - # H1 title
# - ## H2 title
# - ### H3 title
# - *emphasis text*
# - **strong text**
# - [link](https://domain.tld)
# - {{ tableofcontents }}
#
# More features may be added in the future, but this script is provided as it.
import argparse, re, sys
# Manage arguments
parser = argparse.ArgumentParser(
description="Convert Markdown to PC's BBcode")
parser.add_argument("input", type=argparse.FileType('r'), help="input file")
args = parser.parse_args()
# Useful regex
r_h1 = re.compile("^# (.+)$", re.I|re.M)
r_h2 = re.compile("^## (.+)$", re.I|re.M)
r_h3 = re.compile("^### (.+)$", re.I|re.M)
r_link = re.compile("(\W)\[(.+?)\]\((.+?)\)(\W)", re.I|re.M)
r_strong = re.compile("(\W|^)\*{2}(\w.+?)\*{2}(\W|$)", re.I|re.M)
r_em = re.compile("(\W|^)\*(\w.+?)\*(\W|$)", re.I|re.M)
# Open and extract document
markdown = args.input.read().splitlines()
# Manage titles
table_of_contents = ""
n_h1 = 0
n_h2 = 0
n_h3 = 0
output = []
# TODO: factorize this pile of shit
for line in markdown:
if (res := r_h1.search(line)):
n_h1 += 1
n_h2 = 0
n_h3 = 0
header = res.group(1)
index = f"{n_h1}"
label = index.replace(".", "_")
table_of_contents += f"[target={label}]{index} {header}[/target]\n"
output.append(f"[big][brown][b]{index} {header}[/b][/brown][/big]"
f"[label={index}]")
elif (res := r_h2.search(line)):
n_h2 += 1
n_h3 = 0
header = res.group(1)
index = f"{n_h1}.{n_h2}"
label = index.replace(".", "_")
table_of_contents += f"    [target={label}]{index} {header}[/target]\n"
output.append(f"[brown][b]{index} {header}[/b][/brown]"
f"[label={label}]")
elif (res := r_h3.search(line)):
n_h3 += 1
header = res.group(1)
index = f"{n_h1}.{n_h2}.{n_h3}"
label = index.replace(".", "_")
table_of_contents += f"        [target={label}]{index} {header}[/target]\n"
output.append(f"[b]{index} {header}[/b]"
f"[label={label}]")
else:
res = r_link.sub(
lambda m: f"{m.group(1)}[url={m.group(3)}]{m.group(2)}[/url]{m.group(4)}", line)
res = r_strong.sub(
lambda m: f"{m.group(1)}[b]{m.group(2)}[/b]{m.group(3)}", res)
res = r_em.sub(
lambda m: f"{m.group(1)}[i]{m.group(2)}[/i]{m.group(3)}", res)
output.append(res)
# Add table of content
output = '\n'.join(output)
output = re.sub("{{ tableofcontents }}", table_of_contents, output)
# Print output on stdout
print(output)