58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
|
import io, typing
|
||
|
|
||
|
COMMENT_TYPES = ["#", "//"]
|
||
|
def hashflags(filename: str) -> typing.List[typing.Tuple[str, str]]:
|
||
|
hashflags = {}
|
||
|
with io.open(filename, mode="r", encoding="utf8") as f:
|
||
|
for line in f:
|
||
|
line = line.strip("\n")
|
||
|
found = False
|
||
|
for comment_type in COMMENT_TYPES:
|
||
|
if line.startswith(comment_type):
|
||
|
line = line.replace(comment_type, "", 1).lstrip()
|
||
|
found = True
|
||
|
break
|
||
|
|
||
|
if not found:
|
||
|
break
|
||
|
elif line.startswith("--"):
|
||
|
hashflag, sep, value = line[2:].partition(" ")
|
||
|
hashflags[hashflag] = value if sep else None
|
||
|
return list(hashflags.items())
|
||
|
|
||
|
class Docstring(object):
|
||
|
def __init__(self, description: str, items: dict, var_items: dict):
|
||
|
self.description = description
|
||
|
self.items = items
|
||
|
self.var_items = var_items
|
||
|
|
||
|
def docstring(s: str) -> Docstring:
|
||
|
description = ""
|
||
|
last_item = None
|
||
|
items = {}
|
||
|
var_items = {}
|
||
|
if s:
|
||
|
for line in s.split("\n"):
|
||
|
line = line.strip()
|
||
|
|
||
|
if line:
|
||
|
if line[0] == ":":
|
||
|
key, _, value = line[1:].partition(": ")
|
||
|
last_item = key
|
||
|
|
||
|
if key in var_items:
|
||
|
var_items[key].append(value)
|
||
|
elif key in items:
|
||
|
var_items[key] = [items.pop(key), value]
|
||
|
else:
|
||
|
items[key] = value
|
||
|
else:
|
||
|
if last_item:
|
||
|
items[last_item] += " %s" % line
|
||
|
else:
|
||
|
if description:
|
||
|
description += " "
|
||
|
description += line
|
||
|
return Docstring(description, items, var_items)
|
||
|
|