A lot of things, ifn, WIP commands.
This commit is contained in:
parent
51ec48bf05
commit
f04ce0693b
5 changed files with 62 additions and 5 deletions
5
builtin_commands.py
Normal file
5
builtin_commands.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
from panflute import Element
|
||||||
|
|
||||||
|
class commands:
|
||||||
|
def woah(e: Element) -> Element:
|
||||||
|
return e
|
18
command.py
Normal file
18
command.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
from panflute import Div,Span
|
||||||
|
from util import *
|
||||||
|
from typing import Callable
|
||||||
|
|
||||||
|
class Command:
|
||||||
|
pass
|
||||||
|
|
||||||
|
class InlineCommand(Span, Command):
|
||||||
|
def call(self, f: Callable) -> Span:
|
||||||
|
r = f(self)
|
||||||
|
return replaceEl(self, Span(*r.content, identifier=r.identifier, classes=r.classes, attributes=r.attributes))
|
||||||
|
pass
|
||||||
|
|
||||||
|
class MultilineCommand(Div, Command):
|
||||||
|
def call(self, f: Callable) -> Div:
|
||||||
|
r = f(self)
|
||||||
|
return replaceEl(self, Div(*r.content, identifier=r.identifier, classes=r.classes, attributes=r.attributes))
|
||||||
|
pass
|
|
@ -2,26 +2,52 @@
|
||||||
|
|
||||||
# Import local files
|
# Import local files
|
||||||
from whitespace import *
|
from whitespace import *
|
||||||
|
from command import *
|
||||||
|
from util import *
|
||||||
|
from builtin_commands import commands
|
||||||
|
|
||||||
from panflute import *
|
from panflute import *
|
||||||
|
import re
|
||||||
|
|
||||||
from mj_show import show
|
from mj_show import show
|
||||||
|
|
||||||
ifs = ["dog"]
|
flags = ["dog"]
|
||||||
|
|
||||||
def transform(e: Element):
|
def transform(e: Element):
|
||||||
"""Transform the AST, making format-agnostic changes."""
|
"""Transform the AST, making format-agnostic changes."""
|
||||||
if isinstance(e, Whitespace) and bavlna(e):
|
if isinstance(e, Whitespace) and bavlna(e):
|
||||||
e.parent.content[e.index] = NBSP()
|
e = replaceEl(e, NBSP())
|
||||||
|
|
||||||
if hasattr(e, "attributes"):
|
if hasattr(e, "attributes"):
|
||||||
|
# `if` attribute. Only show this element if flag is set.
|
||||||
if "if" in e.attributes:
|
if "if" in e.attributes:
|
||||||
if not e.attributes["if"] in ifs:
|
if not e.attributes["if"] in flags:
|
||||||
del e.parent.content[e.index]
|
deleteEl(e)
|
||||||
|
return
|
||||||
|
# `ifn` attribute. Only show this element if flag is NOT set
|
||||||
|
if "ifn" in e.attributes:
|
||||||
|
if e.attributes["ifn"] in flags:
|
||||||
|
deleteEl(e)
|
||||||
|
return
|
||||||
|
|
||||||
|
# `c` attribute. Execute a command with the name saved in this attribute.
|
||||||
|
if (isinstance(e, Div) or isinstance(e, Span)) and "c" in e.attributes:
|
||||||
|
if isinstance(e, Div):
|
||||||
|
e = replaceEl(e, MultilineCommand(*e.content, identifier=e.identifier, classes=e.classes, attributes=e.attributes))
|
||||||
|
else:
|
||||||
|
e = replaceEl(e, InlineCommand(*e.content, identifier=e.identifier, classes=e.classes, attributes=e.attributes))
|
||||||
|
|
||||||
|
# Handle special command shorthand [!commandname]{}
|
||||||
|
if isinstance(e, Span) and len(e.content) == 1 and isinstance(e.content[0], Str) and re.match(r"^!\w+$", e.content[0].text):
|
||||||
|
e = replaceEl(e, InlineCommand(identifier=e.identifier, classes=e.classes, attributes={**e.attributes, "c": e.content[0].text[1:]}))
|
||||||
|
|
||||||
if hasattr(e, "content"):
|
if hasattr(e, "content"):
|
||||||
for c in e.content:
|
for c in e.content:
|
||||||
transform(c)
|
transform(c)
|
||||||
|
|
||||||
|
# All commands on the inside execute first while being transformed
|
||||||
|
if isinstance(e, Command):
|
||||||
|
pass # TODO: Dodělat tohle
|
||||||
|
|
||||||
|
|
||||||
doc = load()
|
doc = load()
|
||||||
|
@ -30,6 +56,5 @@ print(show(doc))
|
||||||
transform(doc)
|
transform(doc)
|
||||||
print("---------------------")
|
print("---------------------")
|
||||||
print(show(doc))
|
print(show(doc))
|
||||||
print(vars(doc))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
2
test.md
2
test.md
|
@ -14,6 +14,8 @@ This should be seen by all.
|
||||||
|
|
||||||
[This too!]{if=cat}
|
[This too!]{if=cat}
|
||||||
|
|
||||||
|
[An inline command with contents and **bold** and another [!command]{} inside!]{c=bro}
|
||||||
|
|
||||||
[!woah]{a=b} <!-- A special command! WOW -->
|
[!woah]{a=b} <!-- A special command! WOW -->
|
||||||
|
|
||||||
|
|
||||||
|
|
7
util.py
Normal file
7
util.py
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
from panflute import Element
|
||||||
|
|
||||||
|
def replaceEl(e: Element, r: Element) -> Element:
|
||||||
|
e.parent.content[e.index] = r
|
||||||
|
return r
|
||||||
|
def deleteEl(e: Element):
|
||||||
|
del e.parent.content[e.index]
|
Loading…
Reference in a new issue