Jan Černohorský
1 year ago
15 changed files with 116 additions and 81 deletions
@ -1,62 +0,0 @@ |
|||
#!/usr/bin/env python3 |
|||
|
|||
import argparse |
|||
import re |
|||
import sys |
|||
from typing import List |
|||
import os |
|||
|
|||
# Import local files |
|||
from transform import transform |
|||
from util import * |
|||
from context import Context, Group |
|||
from katex import KatexClient |
|||
from html import html |
|||
from tex import tex |
|||
from images import ImageProcessor |
|||
|
|||
from mj_show import show |
|||
|
|||
# Initialize command line arguments |
|||
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) |
|||
parser.add_argument("-l", "--img-lookup-dirs", help="Image lookup directories. When processing images, the program will try to find the image in them first. Always looks for images in the same folder as the markdown file.", nargs="+", default=[]) |
|||
parser.add_argument("-p", "--img-public-dir", help="Directory to put processed images into. The program will not overwrite existing images.", default="public") |
|||
parser.add_argument("-i", "--img-web-path", help="Path where the processed images are available on the website.", default="/") |
|||
parser.add_argument("-w", "--output-html", help="The HTML file (for Web) to write into.", default="output.html") |
|||
parser.add_argument("-t", "--output-tex", help="The TEX file to write into.", default="output.tex") |
|||
parser.add_argument("input_filename", help="The markdown file to process.") |
|||
parser.add_argument("--debug", action='store_true') |
|||
args = parser.parse_args() |
|||
# TODO: Accept path to unix socket for katexClient, then don't init our own, |
|||
# just connect to an existing one. For formátíking many files in a row. |
|||
|
|||
# Use panflute to parse the input MD file |
|||
doc = import_md(open(args.input_filename, "r").read()) |
|||
|
|||
if args.debug: |
|||
print(show(doc)) |
|||
|
|||
# The language metadatum is important, so it's read before transformation and |
|||
# then attached to a group inside the Doc |
|||
language = doc.get_metadata("language", None, True) |
|||
context = Context(doc, args.input_filename) |
|||
|
|||
# Transform the document. This includes all the fancy formatting this software does. |
|||
doc = doc.walk(transform, context) |
|||
|
|||
# Now wrap the document contents in a group, which is able to pop its language |
|||
# setting out to TeX |
|||
doc.content = [Group(*doc.content, metadata={"language":language})] |
|||
|
|||
# Initialize the image processor (this just keeps some basic state) |
|||
imageProcessor = ImageProcessor(args.img_public_dir, args.img_web_path, *args.img_lookup_dirs) |
|||
|
|||
# Initialize KaTeX client (this runs the node app and connects to a unix socket) |
|||
with KatexClient() as katexClient: |
|||
# Generate HTML and TeX out of the transformed document |
|||
open(args.output_html, "w").write(html(doc, katexClient, imageProcessor)) |
|||
open(args.output_tex, "w").write(tex(doc, imageProcessor)) |
|||
|
|||
if args.debug: |
|||
print(show(doc)) |
|||
|
@ -0,0 +1,26 @@ |
|||
[build-system] |
|||
requires = ["setuptools>=61.0"] |
|||
build-backend = "setuptools.build_meta" |
|||
|
|||
[project] |
|||
name = "formatitko" |
|||
version = "0.0.1" |
|||
authors = [ |
|||
{ name="Greenscreener ", email="gs@grsc.cz" }, |
|||
{ name="Organizers of KSP", email="ksp-tech@ksp.mff.cuni.cz" } |
|||
] |
|||
description = "A python program based on pandoc and its python library panflute for converting from markdown to TeX and HTML with added fancy features like image processing, python-based macros and much more." |
|||
readme = "README.md" |
|||
requires-python = ">=3.9" |
|||
classifiers = [ |
|||
"Programming Language :: Python :: 3", |
|||
"License :: OSI Approved :: MIT License", |
|||
"Operating System :: Linux", |
|||
] |
|||
|
|||
[project.urls] |
|||
"Homepage" = "https://gitea.ks.matfyz.cz/KSP/formatitko" |
|||
"Bug Tracker" = "https://gitea.ks.matfyz.cz/KSP/formatitko/issues" |
|||
|
|||
[project.scripts] |
|||
formatitko = "formatitko.formatitko:main" |
@ -0,0 +1,67 @@ |
|||
#!/usr/bin/env python3 |
|||
|
|||
import argparse |
|||
import re |
|||
import sys |
|||
from typing import List |
|||
import os |
|||
|
|||
# Import local files |
|||
from .transform import transform |
|||
from .util import * |
|||
from .context import Context, Group |
|||
from .katex import KatexClient |
|||
from .html import html |
|||
from .tex import tex |
|||
from .images import ImageProcessor |
|||
|
|||
from .mj_show import show |
|||
|
|||
def main(): |
|||
# Initialize command line arguments |
|||
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) |
|||
parser.add_argument("-l", "--img-lookup-dirs", help="Image lookup directories. When processing images, the program will try to find the image in them first. Always looks for images in the same folder as the markdown file.", nargs="+", default=[]) |
|||
parser.add_argument("-p", "--img-public-dir", help="Directory to put processed images into. The program will not overwrite existing images.", default="public") |
|||
parser.add_argument("-i", "--img-web-path", help="Path where the processed images are available on the website.", default="/") |
|||
parser.add_argument("-w", "--output-html", help="The HTML file (for Web) to write into.", default="output.html") |
|||
parser.add_argument("-t", "--output-tex", help="The TEX file to write into.", default="output.tex") |
|||
parser.add_argument("input_filename", help="The markdown file to process.") |
|||
parser.add_argument("--debug", action='store_true') |
|||
args = parser.parse_args() |
|||
# TODO: Accept path to unix socket for katexClient, then don't init our own, |
|||
# just connect to an existing one. For formátíking many files in a row. |
|||
|
|||
# Use panflute to parse the input MD file |
|||
doc = import_md(open(args.input_filename, "r").read()) |
|||
|
|||
if args.debug: |
|||
print(show(doc)) |
|||
|
|||
# The language metadatum is important, so it's read before transformation and |
|||
# then attached to a group inside the Doc |
|||
language = doc.get_metadata("language", None, True) |
|||
context = Context(doc, args.input_filename) |
|||
|
|||
# Transform the document. This includes all the fancy formatting this software does. |
|||
doc = doc.walk(transform, context) |
|||
|
|||
# Now wrap the document contents in a group, which is able to pop its language |
|||
# setting out to TeX |
|||
doc.content = [Group(*doc.content, metadata={"language":language})] |
|||
|
|||
# Initialize the image processor (this just keeps some basic state) |
|||
imageProcessor = ImageProcessor(args.img_public_dir, args.img_web_path, *args.img_lookup_dirs) |
|||
|
|||
# Initialize KaTeX client (this runs the node app and connects to a unix socket) |
|||
with KatexClient() as katexClient: |
|||
# Generate HTML and TeX out of the transformed document |
|||
open(args.output_html, "w").write(html(doc, katexClient, imageProcessor)) |
|||
open(args.output_tex, "w").write(tex(doc, imageProcessor)) |
|||
|
|||
if args.debug: |
|||
print(show(doc)) |
|||
|
|||
|
|||
if __name__ == "__main__": |
|||
main() |
|||
|
@ -1,11 +1,11 @@ |
|||
from panflute import * |
|||
import os |
|||
|
|||
from whitespace import NBSP |
|||
from transform import FQuoted |
|||
from util import inlinify |
|||
from context import Group |
|||
from images import ImageProcessor |
|||
from .whitespace import NBSP |
|||
from .transform import FQuoted |
|||
from .util import inlinify |
|||
from .context import Group |
|||
from .images import ImageProcessor |
|||
|
|||
# Heavily inspired by: git://git.ucw.cz/labsconf2022.git |
|||
def tex(e: Element, i: ImageProcessor, indent_level: int=0, indent_str: str="\t") -> str: |
Loading…
Reference in new issue