2021-10-17 19:35:48 +00:00
|
|
|
#!/usr/bin/env python3.8
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
import sys
|
|
|
|
import re
|
|
|
|
from typing import Dict, List, Pattern, Union, TypedDict
|
|
|
|
|
|
|
|
from emoji.core import emojize, demojize, replace_emoji
|
|
|
|
|
|
|
|
|
2021-10-17 20:44:44 +00:00
|
|
|
ITEM_FORMAT = "+ {title} (#{issue}) @{username}"
|
2021-10-17 19:35:48 +00:00
|
|
|
OUTPUT_EMOJI = False
|
|
|
|
|
|
|
|
ITEM_PATTERN: Pattern = re.compile(
|
|
|
|
r"^\s*(?P<old_listchar>[-*+])\s*(?P<title>.*?)\s*\(#(?P<issue>[0-9]+)\)\s*@(?P<username>[^\s]*)$"
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class SectionType(TypedDict):
|
|
|
|
title: str
|
|
|
|
items: List[Dict[str, str]]
|
|
|
|
|
|
|
|
|
|
|
|
def reformat(item_format: str, output_emoji: bool) -> None:
|
|
|
|
data = [
|
2022-07-19 14:36:17 +00:00
|
|
|
emojize(x.strip(), variant="emoji_type")
|
2021-10-17 19:35:48 +00:00
|
|
|
for x in sys.stdin.readlines()
|
|
|
|
if x.strip()
|
|
|
|
]
|
|
|
|
|
|
|
|
sections = []
|
|
|
|
|
|
|
|
section: Union[SectionType, Dict] = {}
|
|
|
|
for line in data:
|
|
|
|
if line.startswith("## "):
|
|
|
|
pass
|
|
|
|
if line.startswith("### "):
|
|
|
|
if section:
|
|
|
|
sections.append(section)
|
|
|
|
_section: SectionType = {
|
|
|
|
"title": line.strip("# "),
|
|
|
|
"items": [],
|
|
|
|
}
|
|
|
|
section = _section
|
|
|
|
|
|
|
|
m = ITEM_PATTERN.match(line)
|
|
|
|
if m:
|
|
|
|
gd = m.groupdict()
|
|
|
|
section["items"].append(gd)
|
|
|
|
|
|
|
|
sections.append(section)
|
|
|
|
|
|
|
|
first = True
|
|
|
|
|
|
|
|
for section in sections:
|
|
|
|
if not section:
|
|
|
|
continue
|
|
|
|
if first:
|
|
|
|
first = False
|
|
|
|
else:
|
|
|
|
print()
|
|
|
|
|
|
|
|
title = section["title"]
|
|
|
|
if not output_emoji:
|
|
|
|
title = replace_emoji(title).strip()
|
|
|
|
|
|
|
|
print(title)
|
|
|
|
print("-" * len(title))
|
|
|
|
|
|
|
|
for item in section["items"]:
|
|
|
|
formatted_item = item_format.format(**item)
|
|
|
|
if not output_emoji:
|
|
|
|
formatted_item = demojize(formatted_item)
|
|
|
|
print(formatted_item)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument("--format", type=str, default=ITEM_FORMAT)
|
|
|
|
|
|
|
|
parser.add_argument("--no-emoji", dest="emoji", action="store_false")
|
|
|
|
parser.add_argument("--emoji", dest="emoji", action="store_true")
|
|
|
|
parser.set_defaults(emoji=OUTPUT_EMOJI)
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
reformat(args.format, args.emoji)
|