První pokus o #1, zabalíčkování.

This commit is contained in:
Jan Černohorský 2023-07-18 14:51:53 +02:00
parent f3309d6569
commit 6982b31996
15 changed files with 116 additions and 81 deletions

4
.gitignore vendored
View file

@ -10,3 +10,7 @@ public/
*.jpeg *.jpeg
*.svg *.svg
!test/1px.png !test/1px.png
**/.mypy_cache
**/*.egg-info
build/
dist/

View file

@ -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))

26
pyproject.toml Normal file
View file

@ -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"

View file

View file

@ -2,9 +2,9 @@ from panflute import Div,Span,Para
from typing import List from typing import List
# Import local files # Import local files
from util import * from .util import *
from context import Context from .context import Context
from mj_show import show from .mj_show import show
class Command: class Command:
pass pass

67
src/formatitko/formatitko.py Executable file
View file

@ -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()

View file

@ -5,12 +5,12 @@ from pygments.formatters import HtmlFormatter
from pygments.util import ClassNotFound from pygments.util import ClassNotFound
import os import os
from whitespace import NBSP from .whitespace import NBSP
from transform import FQuoted from .transform import FQuoted
from katex import KatexClient from .katex import KatexClient
from util import inlinify from .util import inlinify
from context import Group from .context import Group
from images import ImageProcessor from .images import ImageProcessor
def html(e: Element, k: KatexClient, i: ImageProcessor, indent_level: int=0, indent_str: str="\t") -> str: def html(e: Element, k: KatexClient, i: ImageProcessor, indent_level: int=0, indent_str: str="\t") -> str:

View file

@ -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:

View file

@ -2,10 +2,10 @@ from panflute import *
import re import re
# Import local files # Import local files
from whitespace import * from .whitespace import *
from command import * from .command import *
from util import * from .util import *
from context import * from .context import *
# This is a small extension to the Quoted panflute elements which allows to # This is a small extension to the Quoted panflute elements which allows to

View file

@ -2,7 +2,7 @@ from panflute import Space, SoftBreak, Str, Math
from typing import Union from typing import Union
# Import local files # Import local files
from context import Context from .context import Context
Whitespace = Union[Space,SoftBreak] Whitespace = Union[Space,SoftBreak]