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 * |
from panflute import * |
||||
import os |
import os |
||||
|
|
||||
from whitespace import NBSP |
from .whitespace import NBSP |
||||
from transform import FQuoted |
from .transform import FQuoted |
||||
from util import inlinify |
from .util import inlinify |
||||
from context import Group |
from .context import Group |
||||
from images import ImageProcessor |
from .images import ImageProcessor |
||||
|
|
||||
# Heavily inspired by: git://git.ucw.cz/labsconf2022.git |
# Heavily inspired by: git://git.ucw.cz/labsconf2022.git |
||||
def tex(e: Element, i: ImageProcessor, indent_level: int=0, indent_str: str="\t") -> str: |
def tex(e: Element, i: ImageProcessor, indent_level: int=0, indent_str: str="\t") -> str: |
Loading…
Reference in new issue