summaryrefslogtreecommitdiff
path: root/roff.py
diff options
context:
space:
mode:
Diffstat (limited to 'roff.py')
-rw-r--r--roff.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/roff.py b/roff.py
new file mode 100644
index 0000000..2690e2f
--- /dev/null
+++ b/roff.py
@@ -0,0 +1,57 @@
+"""
+Library for generating roff markup.
+
+This library is FAR from complete, and supports exactly what these
+scripts require.
+
+For information about roff commands meaning, see groff_man(7).
+"""
+
+import os
+from datetime import datetime
+from typing import TypeAlias, Literal
+
+
+Align: TypeAlias = Literal['R', 'L']
+
+
+def title_heading(topic: str,
+ section: int,
+ *,
+ footer_middle: str | None = None,
+ footer_inside: str | None = None,
+ header_middle: str | None = None):
+ print(f'.TH "{topic.upper()}" {section} "{footer_middle}"')
+
+
+def section_heading(s: str):
+ print(f'.SH "{s.upper()}"')
+
+
+def subsection_heading(s: str):
+ print(f'.SS "{s}"')
+
+
+def roff_table(headers: list[tuple[str, Align]],
+ keys: list[str],
+ entries: list[dict[str, str]]):
+ print(".TS")
+ print("tab(@);")
+ print(' '.join([a for (_, a) in headers] + ['.']))
+
+ print("@".join(h for (h, _) in headers))
+
+ for entry in entries:
+ print("@".join(entry[key] for key in keys))
+
+ print(".TE")
+
+
+def now():
+ if ct := os.getenv("CURRENT_TIME"):
+ if ct.isnumeric():
+ return datetime.fromtimestamp(int(ct))
+ else:
+ return datetime.fromisoformat(ct)
+ else:
+ return datetime.now()