plugins/mkdocs-atlas-formatting-plugin/mkdocs_atlas_formatting_plugin/parser.py (36 lines of code) (raw):
from typing import List, Optional
from .atlaswebserver import NoopWebserver
from .block import Block
from .logconfig import setup_logging
logger = setup_logging(__name__)
class Parser:
def __init__(self, page_title: str, html: str, webserver: Optional[NoopWebserver] = None):
self.webserver = webserver
self.page_title: str = page_title
self.block_count: int = 0
self.input_lines: List[str] = html.split('\n')
self.output_lines: List[str] = []
self.html: Optional[str] = None
self.tokenize()
def tokenize(self) -> None:
block = Block() if not self.webserver else Block(self.webserver)
for in_line in self.input_lines:
if not block.is_started and self.block_start(in_line):
block.start(self.page_title, in_line)
elif block.is_started and self.block_end(in_line):
block.build_output()
for out_line in block.output_lines:
self.output_lines.append(out_line)
self.block_count += 1
block.complete()
elif block.is_started:
block.add_line(in_line.replace('&', '&'))
else:
self.output_lines.append(in_line)
self.html = '\n'.join(self.output_lines)
@staticmethod
def block_start(line: str) -> bool:
return line.startswith('<p>@@@')
@staticmethod
def block_end(line: str) -> bool:
return line.startswith('@@@</p>')