Browse Source

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

pull/28/head
Jan Černohorský 1 year 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 *.jpeg
*.svg *.svg
!test/1px.png !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 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

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

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

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

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

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 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…
Cancel
Save