První pokus o #1, zabalíčkování.
This commit is contained in:
parent
f3309d6569
commit
6982b31996
15 changed files with 116 additions and 81 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -10,3 +10,7 @@ public/
|
||||||
*.jpeg
|
*.jpeg
|
||||||
*.svg
|
*.svg
|
||||||
!test/1px.png
|
!test/1px.png
|
||||||
|
**/.mypy_cache
|
||||||
|
**/*.egg-info
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
|
|
@ -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
26
pyproject.toml
Normal 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"
|
0
src/formatitko/__init__.py
Normal file
0
src/formatitko/__init__.py
Normal 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
67
src/formatitko/formatitko.py
Executable 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()
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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:
|
|
@ -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
|
|
@ -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]
|
||||||
|
|
Loading…
Reference in a new issue