Definice příkazů před spuštěním TP (když se formátítko volá jako knihovna) #31

Closed
opened 1 year ago by jirikalvoda · 5 comments
Owner

Když používám formátítko jako knihovnu, mohlo by se hodit, kdybych mohl v pythonním kódu říct, že nějaká funkce je formátítový příkaz.

Když používám formátítko jako knihovnu, mohlo by se hodit, kdybych mohl v pythonním kódu říct, že nějaká funkce je formátítový příkaz.
jan commented 1 year ago

Jakože mít na to explicitní typ? Máme CommandCallable. Nebo nějaký dekorátor (nemám nejmenší tušení, jak fungují)?

Jakože mít na to explicitní typ? Máme `CommandCallable`. Nebo nějaký dekorátor (nemám nejmenší tušení, jak fungují)?
Poster
Owner

No můj probléĺ je v tom, že nemám moc jak zvenku říct definice funkcí.

Momentálně používám tuto konfigureci:

parsed_doc = import_md(raw_doc, standalone=True, bibliography=bibliography)
parsed_doc = formatitko.transform_processor.TransformProcessor(path+".md").transform(parsed_doc)
image_processor = formatitko.images.ImageProcessor(tmpdirname+"/pics", basename(path)+".pics", ".", dirname(path))

title = parsed_doc.get_metadata("title", None, True)

with io.StringIO() as f:
    formatitko.html_generator.HTMLGenerator(f, web.katexClient, image_processor).generate(parsed_doc)
    f.seek(0)
    html = b._bucket(b._parse(f.read()))

with io.StringIO() as f:
    formatitko.latex_generator.LaTeXGenerator(f, image_processor).generate(parsed_doc)
    f.seek(0)
    tex = f.read()

Moc tedy nemám jak si žáhnout na context a přidat si tam vlastní funkce.

Čistě teoreticky bych mohl vytvořit vlastní TransformProcessor a v něm přepsat výboru contextu, ale připadá mi, že je to až moc složité na to, že chci docela triviální věc.

No můj probléĺ je v tom, že nemám moc jak zvenku říct definice funkcí. Momentálně používám tuto konfigureci: ``` parsed_doc = import_md(raw_doc, standalone=True, bibliography=bibliography) parsed_doc = formatitko.transform_processor.TransformProcessor(path+".md").transform(parsed_doc) image_processor = formatitko.images.ImageProcessor(tmpdirname+"/pics", basename(path)+".pics", ".", dirname(path)) title = parsed_doc.get_metadata("title", None, True) with io.StringIO() as f: formatitko.html_generator.HTMLGenerator(f, web.katexClient, image_processor).generate(parsed_doc) f.seek(0) html = b._bucket(b._parse(f.read())) with io.StringIO() as f: formatitko.latex_generator.LaTeXGenerator(f, image_processor).generate(parsed_doc) f.seek(0) tex = f.read() ``` Moc tedy nemám jak si žáhnout na `context` a přidat si tam vlastní funkce. Čistě teoreticky bych mohl vytvořit vlastní `TransformProcessor` a v něm přepsat výboru contextu, ale připadá mi, že je to až moc složité na to, že chci docela triviální věc.
Poster
Owner

No můj probléĺ je v tom, že nemám moc jak zvenku říct definice funkcí.

Momentálně používám tuto konfigureci:

parsed_doc = import_md(raw_doc, standalone=True, bibliography=bibliography)
parsed_doc = formatitko.transform_processor.TransformProcessor(path+".md").transform(parsed_doc)
image_processor = formatitko.images.ImageProcessor(tmpdirname+"/pics", basename(path)+".pics", ".", dirname(path))

title = parsed_doc.get_metadata("title", None, True)

with io.StringIO() as f:
    formatitko.html_generator.HTMLGenerator(f, web.katexClient, image_processor).generate(parsed_doc)
    f.seek(0)
    html = b._bucket(b._parse(f.read()))

with io.StringIO() as f:
    formatitko.latex_generator.LaTeXGenerator(f, image_processor).generate(parsed_doc)
    f.seek(0)
    tex = f.read()

Moc tedy nemám jak si šáhnout na context a přidat si tam vlastní funkce.

Čistě teoreticky bych mohl vytvořit vlastní TransformProcessor a v něm přepsat výboru contextu, ale připadá mi, že je to až moc složité na to, že chci docela triviální věc.

No můj probléĺ je v tom, že nemám moc jak zvenku říct definice funkcí. Momentálně používám tuto konfigureci: ``` parsed_doc = import_md(raw_doc, standalone=True, bibliography=bibliography) parsed_doc = formatitko.transform_processor.TransformProcessor(path+".md").transform(parsed_doc) image_processor = formatitko.images.ImageProcessor(tmpdirname+"/pics", basename(path)+".pics", ".", dirname(path)) title = parsed_doc.get_metadata("title", None, True) with io.StringIO() as f: formatitko.html_generator.HTMLGenerator(f, web.katexClient, image_processor).generate(parsed_doc) f.seek(0) html = b._bucket(b._parse(f.read())) with io.StringIO() as f: formatitko.latex_generator.LaTeXGenerator(f, image_processor).generate(parsed_doc) f.seek(0) tex = f.read() ``` Moc tedy nemám jak si šáhnout na `context` a přidat si tam vlastní funkce. Čistě teoreticky bych mohl vytvořit vlastní `TransformProcessor` a v něm přepsat výboru contextu, ale připadá mi, že je to až moc složité na to, že chci docela triviální věc.
Poster
Owner

Můj aktuáľní fixup:

diff --git a/src/formatitko/transform_processor.py b/src/formatitko/transform_processor.py
index b0032cf..8e20b96 100644
--- a/src/formatitko/transform_processor.py
+++ b/src/formatitko/transform_processor.py
@@ -28,10 +28,11 @@ class DoubleDocError(Exception):

 class TransformProcessor:

-       def __init__(self, root_file_path: str):
+       def __init__(self, root_file_path: str, commands={}):
                self.context: Context = None
                self.root_file_path = root_file_path
                self.root_highlight_style = "default"
+               self.commands = commands

                self.TYPE_DICT = {
                        TableRow: self.transform_TableRow,
@@ -313,6 +314,8 @@ class TransformProcessor:
                if self.context is not None:
                        raise DoubleDocError()
                self.context = Context(e, self.root_file_path)
+               for k, v in self.commands.items():
+                       self.context.set_command(k, v)
                e.content = self.transform(e.content)
                e.content = [Group(*e.content, context=self.context)]
                return e

Pak mi to umožnuje psát věci jako:

formatitko_commands = {}

def formatitko_command(f):
	name = f.__name__
	assert name not in formatitko_commands
	formatitko_commands[name] = f
	return f

@formatitko_command
def bash(element, context):
	import subprocess
	import panflute as pf
	c = subprocess.run(["bash", "-c", element.text], stdout=subprocess.PIPE, check=True, encoding="utf-8")
	return [pf.Para(pf.Str(c.stdout))]
    






parsed_doc = import_md(raw_doc, standalone=True, bibliography=bibliography)
parsed_doc = formatitko.transform_processor.TransformProcessor(path+".md", commands=formatitko_commands).transform(parsed_doc)
image_processor = formatitko.images.ImageProcessor(tmpdirname+"/pics", basename(path)+".pics", ".", dirname(path))

title = parsed_doc.get_metadata("title", None, True)

with io.StringIO() as f:
    formatitko.html_generator.HTMLGenerator(f, web.katexClient, image_processor).generate(parsed_doc)
    f.seek(0)
    html = b._bucket(b._parse(f.read()))

with io.StringIO() as f:
    formatitko.latex_generator.LaTeXGenerator(f, image_processor).generate(parsed_doc)
    f.seek(0)
    tex = f.read()

Můj aktuáľní fixup: ```diff diff --git a/src/formatitko/transform_processor.py b/src/formatitko/transform_processor.py index b0032cf..8e20b96 100644 --- a/src/formatitko/transform_processor.py +++ b/src/formatitko/transform_processor.py @@ -28,10 +28,11 @@ class DoubleDocError(Exception): class TransformProcessor: - def __init__(self, root_file_path: str): + def __init__(self, root_file_path: str, commands={}): self.context: Context = None self.root_file_path = root_file_path self.root_highlight_style = "default" + self.commands = commands self.TYPE_DICT = { TableRow: self.transform_TableRow, @@ -313,6 +314,8 @@ class TransformProcessor: if self.context is not None: raise DoubleDocError() self.context = Context(e, self.root_file_path) + for k, v in self.commands.items(): + self.context.set_command(k, v) e.content = self.transform(e.content) e.content = [Group(*e.content, context=self.context)] return e ``` Pak mi to umožnuje psát věci jako: ``` formatitko_commands = {} def formatitko_command(f): name = f.__name__ assert name not in formatitko_commands formatitko_commands[name] = f return f @formatitko_command def bash(element, context): import subprocess import panflute as pf c = subprocess.run(["bash", "-c", element.text], stdout=subprocess.PIPE, check=True, encoding="utf-8") return [pf.Para(pf.Str(c.stdout))] parsed_doc = import_md(raw_doc, standalone=True, bibliography=bibliography) parsed_doc = formatitko.transform_processor.TransformProcessor(path+".md", commands=formatitko_commands).transform(parsed_doc) image_processor = formatitko.images.ImageProcessor(tmpdirname+"/pics", basename(path)+".pics", ".", dirname(path)) title = parsed_doc.get_metadata("title", None, True) with io.StringIO() as f: formatitko.html_generator.HTMLGenerator(f, web.katexClient, image_processor).generate(parsed_doc) f.seek(0) html = b._bucket(b._parse(f.read())) with io.StringIO() as f: formatitko.latex_generator.LaTeXGenerator(f, image_processor).generate(parsed_doc) f.seek(0) tex = f.read() ```
jan changed title from Definice příkazů to Definice příkazů před spuštěním TP (když se formátítko volá jako knihovna) 1 year ago
jan commented 1 year ago

Ok, už vidím, co myslíš, fair point.

Ok, už vidím, co myslíš, fair point.
jan closed this issue 1 year ago
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.