feature: first table implementation
This commit is contained in:
@@ -12,6 +12,7 @@ from .picture import Picture
|
||||
from .question import Question
|
||||
from .quote import Quote
|
||||
from .references import References
|
||||
from .table import Table
|
||||
from .tag import Tag
|
||||
from .underline import Underline
|
||||
from .unit import Unit
|
||||
@@ -38,7 +39,8 @@ class FiftyOhmHtmlRenderer(HtmlRenderer):
|
||||
References,
|
||||
Question,
|
||||
Picture,
|
||||
Photo
|
||||
Photo,
|
||||
Table
|
||||
)
|
||||
self.question_renderer = question_renderer
|
||||
|
||||
@@ -195,4 +197,35 @@ class FiftyOhmHtmlRenderer(HtmlRenderer):
|
||||
"""
|
||||
|
||||
def render_photo(self, token) :
|
||||
return self.render_photo_helper(token.id, token.ref, token.text, token.number)
|
||||
return self.render_photo_helper(token.id, token.ref, token.text, token.number)
|
||||
|
||||
@staticmethod
|
||||
def render_row_helper(row):
|
||||
return f"""<tr>{row}</tr>"""
|
||||
|
||||
@staticmethod
|
||||
def render_cell_helper(cell, alignment, type):
|
||||
if alignment == "l":
|
||||
return f"<{type} style='text-align: left;'>{cell}</{type}>"
|
||||
elif alignment == "r":
|
||||
return f"<{type} style='text-align: right;'>{cell}</{type}>"
|
||||
elif alignment == "c":
|
||||
return f"<{type} style='text-align: center;'>{cell}</{type}>"
|
||||
else:
|
||||
return f"<{type}>{cell}</{type}>"
|
||||
|
||||
def render_table(self, token):
|
||||
data = token.table
|
||||
alignment = token.alignment
|
||||
|
||||
table = "<table>"
|
||||
|
||||
for i, row in enumerate(data):
|
||||
content = ""
|
||||
for j, cell in enumerate(row[0]):
|
||||
content += self.render_cell_helper(cell, alignment[j], ("th" if i==0 else "td"))
|
||||
table += self.render_row_helper(content)
|
||||
|
||||
table += "</table>"
|
||||
|
||||
return table
|
||||
@@ -0,0 +1,58 @@
|
||||
|
||||
from mistletoe.block_token import BlockToken
|
||||
|
||||
|
||||
class Table(BlockToken):
|
||||
@staticmethod
|
||||
def start(line):
|
||||
return '|' in line
|
||||
|
||||
@classmethod
|
||||
def parseHeader(self, line):
|
||||
line = line.strip().strip('|') # Remove leading/trailing whitespace and pipes
|
||||
columns = [col.strip() for col in line.split('|')] # Split by pipe |
|
||||
|
||||
alignment = []
|
||||
data = []
|
||||
|
||||
for column in columns:
|
||||
attr, val = column.split(':')
|
||||
alignment.append(attr)
|
||||
data.append(val)
|
||||
|
||||
return data, alignment
|
||||
|
||||
@classmethod
|
||||
def parseRow(self, line):
|
||||
line = line.strip().strip('|')
|
||||
columns = [col.strip() for col in line.split('|')]
|
||||
|
||||
data = []
|
||||
|
||||
for column in columns:
|
||||
data.append(column)
|
||||
|
||||
return data
|
||||
|
||||
@classmethod
|
||||
def read(self, lines):
|
||||
|
||||
table = []
|
||||
|
||||
header = next(lines)
|
||||
|
||||
data, alignment = self.parseHeader(header)
|
||||
table.append([data])
|
||||
|
||||
for line in lines:
|
||||
if "|" not in line:
|
||||
break
|
||||
data = self.parseRow(line)
|
||||
table.append([data])
|
||||
|
||||
return [table, alignment]
|
||||
|
||||
def __init__(self, match):
|
||||
self.table = match[0]
|
||||
self.alignment = match[1]
|
||||
print("init")
|
||||
Reference in New Issue
Block a user