Skip to content

Commit 2d1642b

Browse files
authored
Merge pull request #5 from R5dan/pandas
Redo tables, adding pandas
2 parents b529699 + 8066c17 commit 2d1642b

File tree

19 files changed

+541
-174
lines changed

19 files changed

+541
-174
lines changed

BetterMD/elements/a.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
import typing as t
66

77
class MD(CustomMarkdown['A']):
8-
def to_md(self, inner, symbol, parent):
9-
return f"[{" ".join([e.to_md() for e in inner])}]({symbol.get_prop("href")})"
8+
def to_md(self, inner, symbol, parent, **kwargs):
9+
return f"[{" ".join([e.to_md(**kwargs) for e in inner])}]({symbol.get_prop("href")})"
1010

1111
class HTML(CustomHTML['A']):
12-
def to_html(self, inner, symbol, parent):
13-
return f"<a href={symbol.get_prop('href')}>{" ".join([e.to_html() for e in inner])}</a>"
12+
def to_html(self, inner, symbol, parent, **kwargs):
13+
return f"<a href={symbol.get_prop('href')}>{" ".join([e.to_html(**kwargs) for e in inner])}</a>"
1414

1515
class RST(CustomRst['A']):
16-
def to_rst(self, inner, symbol, parent):
17-
return f"`{' '.join([e.to_rst() for e in inner])} <{symbol.get_prop('href')}>`_"
16+
def to_rst(self, inner, symbol, parent, **kwargs):
17+
return f"`{' '.join([e.to_rst(**kwargs) for e in inner])} <{symbol.get_prop('href')}>`_"
1818

1919
class A(Symbol):
2020
prop_list = ["href"]

BetterMD/elements/blockquote.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from .symbol import Symbol
33

44
class RST(CustomRst):
5-
def to_rst(self, inner, symbol, parent):
6-
return " \n".join([e.to_rst() for e in inner])
5+
def to_rst(self, inner, symbol, parent, **kwargs):
6+
return " \n".join([e.to_rst(**kwargs) for e in inner])
77

88

99
class Blockquote(Symbol):

BetterMD/elements/br.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
from ..rst import CustomRst
44

55
class MD(CustomMarkdown):
6-
def to_md(self, inner, symbol, parent):
6+
def to_md(self, inner, symbol, parent, **kwargs):
7+
if inner:
8+
raise ValueError("Br element must not have any children")
79
return "\n\n"
810

911
class RST(CustomRst):
10-
def to_rst(self, inner, symbol, parent):
12+
def to_rst(self, inner, symbol, parent, **kwargs):
13+
if inner:
14+
raise ValueError("Br element must not have any children")
1115
return "\n\n"
1216

1317
class Br(Symbol):

BetterMD/elements/code.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,32 @@
33
from ..markdown import CustomMarkdown
44
from ..html import CustomHTML
55

6-
class MD(CustomMarkdown):
7-
def to_md(self, inner, symbol, parent):
6+
class MD(CustomMarkdown['Code']):
7+
def to_md(self, inner, symbol, parent, **kwargs):
88
language = symbol.get_prop("language", "")
9-
if isinstance(inner, Text):
10-
inner = inner.to_md()
9+
10+
content = " ".join([e.to_md(**kwargs) for e in inner])
1111

1212
# If it's a code block (has language or multiline)
1313
if language or "\n" in inner:
14-
return f"```{language}\n{inner}\n```\n"
14+
return f"```{language}\n{content}\n```\n"
1515

1616
# Inline code
17-
return f"`{inner}`"
17+
return f"`{content}`"
1818

1919
class HTML(CustomHTML):
20-
def to_html(self, inner, symbol, parent):
20+
def to_html(self, inner, symbol, parent, **kwargs):
2121
language = symbol.get_prop("language", "")
22-
if isinstance(inner, Text):
23-
inner = inner.to_html()
22+
23+
content = " ".join([e.to_html(**kwargs) for e in inner])
2424

2525
if language:
26-
return f'<pre><code class="language-{language}">{inner}</code></pre>'
26+
return f'<pre><code class="language-{language}">{content}</code></pre>'
2727

28-
return f"<code>{inner}</code>"
28+
return f"<code>{content}</code>"
2929

3030
class Code(Symbol):
31-
props = ["language"]
31+
prop_list = ["language"]
3232
html = HTML()
3333
md = MD()
3434
rst = "``"

BetterMD/elements/h.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ def __init__(self, character:'str') -> None:
66
self.character = character
77
super().__init__()
88

9-
def to_rst(self, inner: list[Symbol], symbol: Symbol, parent: Symbol) -> str:
10-
list_rst = [e.to_rst() for e in inner]
9+
def to_rst(self, inner: list[Symbol], symbol: Symbol, parent: Symbol, **kwargs) -> str:
10+
list_rst = [e.to_rst(**kwargs) for e in inner]
1111
content = "\n".join(list_rst)
1212
max_length = len(max(list_rst, key=lambda l: len(l)))
1313

BetterMD/elements/hr.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
from ..markdown import CustomMarkdown
44

55
class MD(CustomMarkdown):
6-
def to_md(self, inner, symbol, parent):
6+
def to_md(self, inner, symbol, parent, **kwargs):
7+
if inner:
8+
raise ValueError("Hr element must not have any children")
79
return f"---\n"
810

911
class RST(CustomRst):
10-
def to_rst(self, inner, symbol, parent):
12+
def to_rst(self, inner, symbol, parent, **kwargs):
13+
if inner:
14+
raise ValueError("Hr element must not have any children")
1115
return "----\n"
1216

1317
class Hr(Symbol):

BetterMD/elements/img.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
from ..rst import CustomRst
55

66
class MD(CustomMarkdown):
7-
def to_md(self, inner, symbol, parent):
7+
def to_md(self, inner, symbol, parent, **kwargs):
88
alt = symbol.get_prop("alt", "")
99
return f"![{alt}]({symbol.get_prop('src')})"
1010

1111
class HTML(CustomHTML):
12-
def to_html(self, inner, symbol, parent):
12+
def to_html(self, inner, symbol, parent, **kwargs):
1313
return f"<img src={symbol.get_prop('src')} alt={symbol.get_prop('alt', '')} />"
1414

1515
class RST(CustomRst):
16-
def to_rst(self, inner, symbol, parent):
16+
def to_rst(self, inner, symbol, parent, **kwargs):
1717
return f".. image:: {symbol.get_prop('src')}\n :alt: {symbol.get_prop("alt", "")}\n"
1818

1919
class Img(Symbol):
20-
props = ["src", "alt"]
20+
prop_list = ["src", "alt"]
2121
md = MD()
2222
html = HTML()
23-
rst = RST()
23+
rst = RST()

BetterMD/elements/input.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from ..rst import CustomRst
55

66
class HTML(CustomHTML):
7-
def to_html(self, inner, symbol, parent):
7+
def to_html(self, inner, symbol, parent, **kwargs):
88
# Collect all input attributes
99
attrs = []
1010
for prop in Input.props:
@@ -20,13 +20,13 @@ def to_html(self, inner, symbol, parent):
2020
return f"<input {attrs_str} />"
2121

2222
class MD(CustomMarkdown):
23-
def to_md(self, inner, symbol, parent):
23+
def to_md(self, inner, symbol, parent, **kwargs):
2424
if symbol.get_prop("type") == "checkbox":
2525
return f"- [{'x' if symbol.get_prop('checked', '') else ''}] {inner.to_md()}"
2626
return symbol.to_html()
2727

2828
class RST(CustomRst):
29-
def to_rst(self, inner, symbol, parent):
29+
def to_rst(self, inner, symbol, parent, **kwargs):
3030
if symbol.get_prop("type") == "checkbox":
3131
return f"[ ] {inner.to_rst() if inner else ''}"
3232
return "" # Most input types don't have RST equivalents

BetterMD/elements/li.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
from ..markdown import CustomMarkdown
44

55
class MD(CustomMarkdown):
6-
def to_md(self, inner, symbol, parent):
6+
def to_md(self, inner, symbol, parent, **kwargs):
77
if isinstance(parent, OL):
88
return f"\n1. {" ".join([e.to_md() for e in inner])}"
99
return f"\n- {" ".join([e.to_md() for e in inner])}"
1010

1111
class RST(CustomRst):
12-
def to_rst(self, inner, symbol, parent) -> str:
12+
def to_rst(self, inner, symbol, parent, **kwargs) -> str:
1313
content = " ".join([e.to_rst() for e in inner])
1414
if isinstance(parent, OL):
1515
if v := symbol.props.get("value", None):
@@ -18,13 +18,13 @@ def to_rst(self, inner, symbol, parent) -> str:
1818
return f"* {content}"
1919

2020
class LMD(CustomMarkdown):
21-
def to_md(self, inner, symbol, parent) -> str:
21+
def to_md(self, inner, symbol, parent, **kwargs) -> str:
2222
if isinstance(parent, LI):
2323
return " \n".join([e.to_md() for e in inner])
2424
return " ".join([e.to_md() for e in inner])
2525

2626
class LRST(CustomRst):
27-
def to_rst(self, inner, symbol, parent) -> str:
27+
def to_rst(self, inner, symbol, parent, **kwargs) -> str:
2828
if isinstance(parent, LI):
2929
return " \n".join([e.to_rst() for e in inner])
3030
return " ".join([e.to_rst() for e in inner])

BetterMD/elements/symbol.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from ..rst import CustomRst
77

88
T = t.TypeVar("T", default=t.Any)
9+
T2 = t.TypeVar("T2", default=t.Any)
910
logger = logging.getLogger("BetterMD")
1011

1112
class List(list, t.Generic[T]):
@@ -17,10 +18,22 @@ def on_ammend(self, object: 'T'): ...
1718
def append(self, object: 'T') -> 'None':
1819
self.on_ammend(object)
1920
return super().append(object)
21+
22+
def get(self, index, default:'T2'=None) -> 't.Union[T, T2]':
23+
try:
24+
return self[index]
25+
except IndexError:
26+
return default
2027

2128
def __setitem__(self, key, value):
2229
self.on_set(key, value)
2330
return super().__setitem__(key, value)
31+
32+
def __getitem__(self, item) -> 'T':
33+
return super().__getitem__(item)
34+
35+
def __iter__(self) -> 't.Iterator[T]':
36+
return super().__iter__()
2437

2538
class Symbol:
2639
styles: 'dict[str, str]' = {}
@@ -74,11 +87,11 @@ def has_child(self, child:'type[Symbol]'):
7487

7588
return False
7689

77-
def prepare(self, parent:'t.Union[Symbol, None]'=None):
90+
def prepare(self, parent:'t.Union[Symbol, None]'=None, *args, **kwargs):
7891
self.prepared = True
7992
self.parent = parent
80-
for symbol in self.children:
81-
symbol.prepare(self)
93+
94+
[symbol.prepare(self, *args, **kwargs) for symbol in self.children]
8295

8396
return self
8497

@@ -90,6 +103,9 @@ def replace_child(self, old:'Symbol', new:'Symbol'):
90103

91104

92105
def to_html(self) -> 'str':
106+
if not self.prepared:
107+
self.prepare()
108+
93109
if isinstance(self.html, CustomHTML):
94110
return self.html.to_html(self.children, self, self.parent)
95111

@@ -106,17 +122,23 @@ def to_html(self) -> 'str':
106122
logger.debug(f"{inner_HTML=} {self.html=} {self.classes=} {self.styles=} {props=}")
107123
return f"<{self.html} class={'"'}{' '.join(self.classes) or ''}{'"'} style={'"'}{' '.join([f'{k}:{v}' for k,v in self.styles.items()]) or ''}{'"'} {' '.join(props)}>{inner_HTML}</{self.html}>"
108124

109-
def to_md(self) -> 'str':
125+
def to_md(self, **kwargs) -> 'str':
126+
if not self.prepared:
127+
self.prepare(**kwargs)
128+
110129
if isinstance(self.md, CustomMarkdown):
111-
return self.md.to_md(self.children, self, self.parent)
130+
return self.md.to_md(self.children, self, self.parent, **kwargs)
112131

113132
if self.md == None:
114-
return self.to_html()
133+
return self.to_html(**kwargs)
115134

116135
inner_md = " ".join([e.to_md() for e in self.children])
117136
return f"{self.md} {inner_md}" + ("\n" if self.nl else "")
118137

119-
def to_rst(self) -> 'str':
138+
def to_rst(self, **kwargs) -> 'str':
139+
if not self.prepared:
140+
self.prepare(**kwargs)
141+
120142
if isinstance(self.rst, CustomRst):
121143
return self.rst.to_rst(self.children, self, self.parent)
122144

0 commit comments

Comments
 (0)