aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/literasc.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/literasc.py')
-rwxr-xr-xplugins/literasc.py143
1 files changed, 0 insertions, 143 deletions
diff --git a/plugins/literasc.py b/plugins/literasc.py
deleted file mode 100755
index 74b13a7..0000000
--- a/plugins/literasc.py
+++ /dev/null
@@ -1,143 +0,0 @@
-#!/usr/bin/env python3
-
-# Copyright 2012-2022 David Robillard <d@drobilla.net>
-# SPDX-License-Identifier: ISC
-
-"""
-A simple literate programming tool for C, C++, and Turtle.
-
-Unlike many LP tools, this tool uses normal source code as input, there is no
-tangle/weave and no special file format. The literate parts of the program are
-written in comments, which are emitted as paragraphs of regular text
-interleaved with code. Asciidoc is both the comment and output syntax.
-"""
-
-import os
-import re
-import sys
-
-
-def format_text(text):
- "Format a text (comment) fragment and return it as a marked up string."
- return "\n\n" + re.sub("\n *", "\n", text.strip()) + "\n\n"
-
-
-def format_code(lang, code):
- "Format a block of code and return it as a marked up string."
-
- if code.strip() == "":
- return code
-
- head = f"[source,{lang}]"
- code = code.strip("\n")
- sep = "-" * len(head)
- return "\n".join([head, sep, code, sep]) + "\n"
-
-
-def format_c_source(filename, in_file):
- "Format an annotated C source file as a marked up string."
-
- output = f"=== {os.path.basename(filename)} ===\n"
- chunk = ""
- prev_c = 0
- in_comment = False
- in_comment_start = False
- n_stars = 0
- code = "".join(in_file)
-
- # Skip initial license comment
- if code[0:2] == "/*":
- end = code.find("*/") + 2
- code = code[end:]
-
- def last_chunk(chunk):
- length = len(chunk) - 1
- return chunk[0:length]
-
- for char in code:
- if prev_c == "/" and char == "*":
- in_comment_start = True
- n_stars = 1
- elif in_comment_start:
- if char == "*":
- n_stars += 1
- else:
- if n_stars > 1:
- output += format_code("c", last_chunk(chunk))
- chunk = ""
- in_comment = True
- else:
- chunk += "*" + char
- in_comment_start = False
- elif in_comment and prev_c == "*" and char == "/":
- if n_stars > 1:
- output += format_text(last_chunk(chunk))
- else:
- output += format_code("c", "/* " + last_chunk(chunk) + "*/")
- in_comment = False
- in_comment_start = False
- chunk = ""
- else:
- chunk += char
-
- prev_c = char
-
- return output + format_code("c", chunk)
-
-
-def format_ttl_source(filename, in_file):
- "Format an annotated Turtle source file as a marked up string."
-
- output = f"=== {os.path.basename(filename)} ===\n"
-
- in_comment = False
- chunk = ""
- for line in in_file:
- is_comment = line.strip().startswith("#")
- if in_comment:
- if is_comment:
- chunk += line.strip().lstrip("# ") + " \n"
- else:
- output += format_text(chunk)
- in_comment = False
- chunk = line
- else:
- if is_comment:
- output += format_code("turtle", chunk)
- in_comment = True
- chunk = line.strip().lstrip("# ") + " \n"
- else:
- chunk += line
-
- if in_comment:
- return output + format_text(chunk)
-
- return output + format_code("turtle", chunk)
-
-
-def gen(out, filenames):
- "Write markup generated from filenames to an output file."
-
- for filename in filenames:
- with open(filename, "r", encoding="utf-8") as in_file:
- if filename.endswith(".c") or filename.endswith(".h"):
- out.write(format_c_source(filename, in_file))
- elif filename.endswith(".ttl") or filename.endswith(".ttl.in"):
- out.write(format_ttl_source(filename, in_file))
- elif filename.endswith(".txt"):
- for line in in_file:
- out.write(line)
- out.write("\n")
- else:
- sys.stderr.write(
- f"Unknown source format `{filename.splitext()[1]}`\n"
- )
-
-
-if __name__ == "__main__":
- if len(sys.argv) < 2:
- sys.stderr.write(f"Usage: {sys.argv[0]} OUT_FILE IN_FILE...\n")
- sys.exit(1)
-
- with open(sys.argv[1], "w", encoding="utf-8") as out_file:
- gen(out_file, sys.argv[2:])