Browse Source

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

pull/28/head
Jan Černohorský 10 months ago
parent
commit
6982b31996
  1. 4
      .gitignore
  2. 62
      formatitko.py
  3. 26
      pyproject.toml
  4. 0
      src/formatitko/__init__.py
  5. 6
      src/formatitko/command.py
  6. 0
      src/formatitko/context.py
  7. 67
      src/formatitko/formatitko.py
  8. 12
      src/formatitko/html.py
  9. 0
      src/formatitko/images.py
  10. 0
      src/formatitko/katex.py
  11. 0
      src/formatitko/mj_show.py
  12. 10
      src/formatitko/tex.py
  13. 8
      src/formatitko/transform.py
  14. 0
      src/formatitko/util.py
  15. 2
      src/formatitko/whitespace.py

4
.gitignore

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

62
formatitko.py

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

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

6
command.py → src/formatitko/command.py

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

0
context.py → src/formatitko/context.py

67
src/formatitko/formatitko.py

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

12
html.py → src/formatitko/html.py

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

0
images.py → src/formatitko/images.py

0
katex.py → src/formatitko/katex.py

0
mj_show.py → src/formatitko/mj_show.py

10
tex.py → src/formatitko/tex.py

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

8
transform.py → src/formatitko/transform.py

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

0
util.py → src/formatitko/util.py

2
whitespace.py → src/formatitko/whitespace.py

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