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

Closed
opened 10 months 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.

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) 10 months ago

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

Ok, už vidím, co myslíš, fair point.
jan closed this issue 10 months 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.