Files
50ohm/renderer/table.py
T
2025-05-14 15:55:51 +02:00

64 lines
1.6 KiB
Python

from mistletoe import span_token
from mistletoe.block_token import BlockToken
class Table(BlockToken):
@staticmethod
def start(line):
return '|' in line
@classmethod
def parseHeader(cls, line):
# Parse header, extract alignment and make an ordinary row out of it
line = line.strip().strip('|') # Remove leading/trailing whitespace and pipes
columns = [col.strip() for col in line.split('|')] # Split by pipe |
alignment = []
header = "| "
for column in columns:
attr, val = column.split(':')
alignment.append(attr)
header += val + " | "
return header, alignment
@classmethod
def read(cls, lines):
header = next(lines)
header, alignment = cls.parseHeader(header)
rows = [TableRow(header)]
for line in lines:
if "|" not in line :
break
else :
rows.append(TableRow(line))
return alignment, rows
def __init__(self, match):
self.alignment, self.children = match
class TableRow(BlockToken):
@classmethod
def parseRow(self, line):
line = line.strip().strip('|')
columns = [col.strip() for col in line.split('|')]
data = []
for column in columns:
data.append(TableCell(column))
return data
def __init__(self, match):
self.children = self.parseRow(match)
class TableCell(BlockToken) :
def __init__(self, match):
super().__init__(match, span_token.tokenize_inner)