Move render visitors out of parser module
This commit is contained in:
parent
7eadaa0db4
commit
ffa27be86d
|
@ -9,7 +9,6 @@ from amanuensis.config import ReadOnlyOrderedDict
|
|||
from amanuensis.models import LexiconModel, UserModel
|
||||
from amanuensis.parser import (
|
||||
parse_raw_markdown,
|
||||
HtmlRenderer,
|
||||
titlesort,
|
||||
filesafe_title)
|
||||
from amanuensis.parser.core import RenderableVisitor
|
||||
|
@ -53,6 +52,53 @@ class ConstraintAnalysis(RenderableVisitor):
|
|||
return self
|
||||
|
||||
|
||||
class HtmlRenderer(RenderableVisitor):
|
||||
"""
|
||||
Renders an article token tree into published article HTML.
|
||||
"""
|
||||
def __init__(self, lexicon_name: str, written_articles: Iterable[str]):
|
||||
self.lexicon_name: str = lexicon_name
|
||||
self.written_articles: Iterable[str] = written_articles
|
||||
|
||||
def TextSpan(self, span):
|
||||
return span.innertext
|
||||
|
||||
def LineBreak(self, span):
|
||||
return '<br>'
|
||||
|
||||
def ParsedArticle(self, span):
|
||||
return '\n'.join(span.recurse(self))
|
||||
|
||||
def BodyParagraph(self, span):
|
||||
return f'<p>{"".join(span.recurse(self))}</p>'
|
||||
|
||||
def SignatureParagraph(self, span):
|
||||
return (
|
||||
'<hr><span class="signature"><p>'
|
||||
f'{"".join(span.recurse(self))}'
|
||||
'</p></span>'
|
||||
)
|
||||
|
||||
def BoldSpan(self, span):
|
||||
return f'<b>{"".join(span.recurse(self))}</b>'
|
||||
|
||||
def ItalicSpan(self, span):
|
||||
return f'<i>{"".join(span.recurse(self))}</i>'
|
||||
|
||||
def CitationSpan(self, span):
|
||||
if span.cite_target in self.written_articles:
|
||||
link_class = ''
|
||||
else:
|
||||
link_class = ' class="phantom"'
|
||||
# link = url_for(
|
||||
# 'lexicon.article',
|
||||
# name=self.lexicon_name,
|
||||
# title=filesafe_title(span.cite_target))
|
||||
link = (f'/lexicon/{self.lexicon_name}'
|
||||
+ f'/article/{filesafe_title(span.cite_target)}')
|
||||
return f'<a href="{link}"{link_class}>{"".join(span.recurse(self))}</a>'
|
||||
|
||||
|
||||
def get_player_characters(
|
||||
lexicon: LexiconModel,
|
||||
uid: str) -> Iterable[ReadOnlyOrderedDict]:
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
# from amanuensis.config.loader import AttrOrderedDict
|
||||
# from amanuensis.errors import ArgumentError
|
||||
# from amanuensis.lexicon import LexiconModel
|
||||
# from amanuensis.parser import parse_raw_markdown, GetCitations, HtmlRenderer, filesafe_title, titlesort
|
||||
# from amanuensis.parser import parse_raw_markdown, filesafe_title, titlesort
|
||||
# from amanuensis.resources import get_stream
|
||||
|
||||
|
||||
|
|
|
@ -5,13 +5,10 @@ Module encapsulating all markdown parsing functionality.
|
|||
from .core import normalize_title
|
||||
from .helpers import titlesort, filesafe_title
|
||||
from .parsing import parse_raw_markdown
|
||||
from .render import PreviewHtmlRenderer, HtmlRenderer
|
||||
|
||||
__all__ = [
|
||||
normalize_title.__name__,
|
||||
titlesort.__name__,
|
||||
filesafe_title.__name__,
|
||||
parse_raw_markdown.__name__,
|
||||
PreviewHtmlRenderer.__name__,
|
||||
HtmlRenderer.__name__,
|
||||
]
|
||||
|
|
|
@ -1,104 +0,0 @@
|
|||
"""
|
||||
Internal module encapsulating visitors that render articles into
|
||||
readable formats.
|
||||
"""
|
||||
|
||||
from typing import Iterable
|
||||
|
||||
from .core import RenderableVisitor
|
||||
from .helpers import filesafe_title
|
||||
|
||||
|
||||
class HtmlRenderer(RenderableVisitor):
|
||||
"""
|
||||
Renders an article token tree into published article HTML.
|
||||
"""
|
||||
def __init__(self, lexicon_name: str, written_articles: Iterable[str]):
|
||||
self.lexicon_name: str = lexicon_name
|
||||
self.written_articles: Iterable[str] = written_articles
|
||||
|
||||
def TextSpan(self, span):
|
||||
return span.innertext
|
||||
|
||||
def LineBreak(self, span):
|
||||
return '<br>'
|
||||
|
||||
def ParsedArticle(self, span):
|
||||
return '\n'.join(span.recurse(self))
|
||||
|
||||
def BodyParagraph(self, span):
|
||||
return f'<p>{"".join(span.recurse(self))}</p>'
|
||||
|
||||
def SignatureParagraph(self, span):
|
||||
return (
|
||||
'<hr><span class="signature"><p>'
|
||||
f'{"".join(span.recurse(self))}'
|
||||
'</p></span>'
|
||||
)
|
||||
|
||||
def BoldSpan(self, span):
|
||||
return f'<b>{"".join(span.recurse(self))}</b>'
|
||||
|
||||
def ItalicSpan(self, span):
|
||||
return f'<i>{"".join(span.recurse(self))}</i>'
|
||||
|
||||
def CitationSpan(self, span):
|
||||
if span.cite_target in self.written_articles:
|
||||
link_class = ''
|
||||
else:
|
||||
link_class = ' class="phantom"'
|
||||
# link = url_for(
|
||||
# 'lexicon.article',
|
||||
# name=self.lexicon_name,
|
||||
# title=filesafe_title(span.cite_target))
|
||||
link = (f'/lexicon/{self.lexicon_name}'
|
||||
+ f'/article/{filesafe_title(span.cite_target)}')
|
||||
return f'<a href="{link}"{link_class}>{"".join(span.recurse(self))}</a>'
|
||||
|
||||
|
||||
class PreviewHtmlRenderer(RenderableVisitor):
|
||||
def __init__(self, lexicon):
|
||||
with lexicon.ctx.read('info') as info:
|
||||
self.article_map = {
|
||||
title: article.character
|
||||
for title, article in info.items()
|
||||
}
|
||||
self.citations = []
|
||||
self.contents = ""
|
||||
|
||||
def TextSpan(self, span):
|
||||
return span.innertext
|
||||
|
||||
def LineBreak(self, span):
|
||||
return '<br>'
|
||||
|
||||
def ParsedArticle(self, span):
|
||||
self.contents = '\n'.join(span.recurse(self))
|
||||
return self
|
||||
|
||||
def BodyParagraph(self, span):
|
||||
return f'<p>{"".join(span.recurse(self))}</p>'
|
||||
|
||||
def SignatureParagraph(self, span):
|
||||
return (
|
||||
'<hr><span class="signature"><p>'
|
||||
f'{"".join(span.recurse(self))}'
|
||||
'</p></span>'
|
||||
)
|
||||
|
||||
def BoldSpan(self, span):
|
||||
return f'<b>{"".join(span.recurse(self))}</b>'
|
||||
|
||||
def ItalicSpan(self, span):
|
||||
return f'<i>{"".join(span.recurse(self))}</i>'
|
||||
|
||||
def CitationSpan(self, span):
|
||||
if span.cite_target in self.article_map:
|
||||
if self.article_map.get(span.cite_target):
|
||||
link_class = '[extant]'
|
||||
else:
|
||||
link_class = '[phantom]'
|
||||
else:
|
||||
link_class = '[new]'
|
||||
self.citations.append(f'{span.cite_target} {link_class}')
|
||||
return f'<u>{"".join(span.recurse(self))}</u>[{len(self.citations)}]'
|
|
@ -15,9 +15,7 @@ from amanuensis.lexicon import (
|
|||
create_character_in_lexicon,
|
||||
get_draft)
|
||||
from amanuensis.models import LexiconModel
|
||||
from amanuensis.parser import (
|
||||
parse_raw_markdown,
|
||||
PreviewHtmlRenderer)
|
||||
from amanuensis.parser import parse_raw_markdown
|
||||
from amanuensis.server.helpers import (
|
||||
lexicon_param,
|
||||
player_required,
|
||||
|
@ -29,7 +27,7 @@ from .forms import (
|
|||
LexiconPublishTurnForm,
|
||||
LexiconConfigForm)
|
||||
|
||||
from .editor import load_editor, new_draft, update_draft
|
||||
from .editor import load_editor, new_draft, update_draft, PreviewHtmlRenderer
|
||||
|
||||
|
||||
bp_session = Blueprint('session', __name__,
|
||||
|
|
|
@ -17,8 +17,56 @@ from amanuensis.lexicon import (
|
|||
from amanuensis.models import LexiconModel
|
||||
from amanuensis.parser import (
|
||||
normalize_title,
|
||||
parse_raw_markdown,
|
||||
PreviewHtmlRenderer)
|
||||
parse_raw_markdown)
|
||||
from amanuensis.parser.core import RenderableVisitor
|
||||
|
||||
|
||||
class PreviewHtmlRenderer(RenderableVisitor):
|
||||
def __init__(self, lexicon):
|
||||
with lexicon.ctx.read('info') as info:
|
||||
self.article_map = {
|
||||
title: article.character
|
||||
for title, article in info.items()
|
||||
}
|
||||
self.citations = []
|
||||
self.contents = ""
|
||||
|
||||
def TextSpan(self, span):
|
||||
return span.innertext
|
||||
|
||||
def LineBreak(self, span):
|
||||
return '<br>'
|
||||
|
||||
def ParsedArticle(self, span):
|
||||
self.contents = '\n'.join(span.recurse(self))
|
||||
return self
|
||||
|
||||
def BodyParagraph(self, span):
|
||||
return f'<p>{"".join(span.recurse(self))}</p>'
|
||||
|
||||
def SignatureParagraph(self, span):
|
||||
return (
|
||||
'<hr><span class="signature"><p>'
|
||||
f'{"".join(span.recurse(self))}'
|
||||
'</p></span>'
|
||||
)
|
||||
|
||||
def BoldSpan(self, span):
|
||||
return f'<b>{"".join(span.recurse(self))}</b>'
|
||||
|
||||
def ItalicSpan(self, span):
|
||||
return f'<i>{"".join(span.recurse(self))}</i>'
|
||||
|
||||
def CitationSpan(self, span):
|
||||
if span.cite_target in self.article_map:
|
||||
if self.article_map.get(span.cite_target):
|
||||
link_class = '[extant]'
|
||||
else:
|
||||
link_class = '[phantom]'
|
||||
else:
|
||||
link_class = '[new]'
|
||||
self.citations.append(f'{span.cite_target} {link_class}')
|
||||
return f'<u>{"".join(span.recurse(self))}</u>[{len(self.citations)}]'
|
||||
|
||||
|
||||
def load_editor(lexicon: LexiconModel, aid: str):
|
||||
|
|
Loading…
Reference in New Issue