Глобальные функции превращены в фильтры jinja2 [closes #40]

master
Антон Касимов 2019-06-13 14:17:17 +03:00
parent c374574911
commit b390539eac
6 changed files with 34 additions and 41 deletions

View File

@ -11,7 +11,9 @@ def main(global_config, **settings):
default_jinja2_filters = """markdown = flatfilecms.filters:markdown2html default_jinja2_filters = """markdown = flatfilecms.filters:markdown2html
fileglob = flatfilecms.filters:fileglob fileglob = flatfilecms.filters:fileglob
merge_dict = flatfilecms.filters.merge_dict merge_dict = flatfilecms.filters.merge_dict
join_url = flatfilecms.filters.join_url""" join_url = flatfilecms.filters.join_url
format_date = flatfilecms.filters.format_date
format_datetime = flatfilecms.filters.format_datetime"""
settings['jinja2.filters'] = default_jinja2_filters + settings.get( settings['jinja2.filters'] = default_jinja2_filters + settings.get(
'jinja2.filters', '') 'jinja2.filters', '')

View File

@ -1,36 +1,20 @@
from babel import dates
from datetime import date
from functools import partial
from pyramid.events import subscriber from pyramid.events import subscriber
from pyramid.events import BeforeRender from pyramid.events import BeforeRender
from .models import load_yaml from .models import load_yaml
@subscriber(BeforeRender)
def add_global(event):
event['globals'] = {
'format_date':
partial(dates.format_date, locale=event['request'].locale_name),
'format_datetime':
partial(dates.format_datetime, locale=event['request'].locale_name),
'today':
date.today(),
}
@subscriber(BeforeRender) @subscriber(BeforeRender)
def add_data(event): def add_data(event):
try: try:
event['data'] = load_yaml('globals.yaml', True) event["data"] = load_yaml("globals.yaml", True)
except FileNotFoundError: except FileNotFoundError:
event['data'] = {} event["data"] = {}
@subscriber(BeforeRender) @subscriber(BeforeRender)
def add_menu(event): def add_menu(event):
try: try:
event['menu'] = load_yaml('menu/default.yaml', True) event["menu"] = load_yaml("menu/default.yaml", True)
except FileNotFoundError: except FileNotFoundError:
event['menu'] = [] event["menu"] = []

View File

@ -1,3 +1,5 @@
from babel import dates
from jinja2 import contextfilter, Markup from jinja2 import contextfilter, Markup
import markdown import markdown
from pathlib import Path from pathlib import Path
@ -7,7 +9,7 @@ from markdown.blockprocessors import BlockProcessor
class Jinja2Processor(BlockProcessor): class Jinja2Processor(BlockProcessor):
def test(self, parent, block): def test(self, parent, block):
return block.startswith('{%') or block.startswith('{{') return block.startswith("{%") or block.startswith("{{")
def run(self, parent, blocks): def run(self, parent, blocks):
block = blocks.pop(0) block = blocks.pop(0)
@ -27,17 +29,19 @@ class Jinja2Processor(BlockProcessor):
class IgnoreExtension(Extension): class IgnoreExtension(Extension):
def extendMarkdown(self, md, md_globals): def extendMarkdown(self, md, md_globals):
md.parser.blockprocessors.add('jinja2', Jinja2Processor(md.parser), md.parser.blockprocessors.add(
">hashheader") "jinja2", Jinja2Processor(md.parser), ">hashheader"
)
@contextfilter @contextfilter
def markdown2html(context, text, render=True): def markdown2html(context, text, render=True):
result = markdown.markdown( result = markdown.markdown(
text, text,
extensions=[IgnoreExtension(), 'markdown.extensions.extra'], extensions=[IgnoreExtension(), "markdown.extensions.extra"],
output_format='html5', output_format="html5",
tab_length=2) tab_length=2,
)
if render: if render:
result = context.environment.from_string(result).render(context) result = context.environment.from_string(result).render(context)
if context.eval_ctx.autoescape: if context.eval_ctx.autoescape:
@ -56,4 +60,16 @@ def fileglob(path, root):
def join_url(a, b): def join_url(a, b):
return a.rstrip('/') + '/' + b.lstrip('/') return a.rstrip("/") + "/" + b.lstrip("/")
@contextfilter
def format_date(context, *args, **kwargs):
kwargs.setdefault("locale", context["request"].locale_name)
return dates.format_date(*args, **kwargs)
@contextfilter
def format_datetime(context, *args, **kwargs):
kwargs.setdefault("locale", context["request"].locale_name)
return dates.format_datetime(*args, **kwargs)

View File

@ -11,8 +11,8 @@
<a href="{{item[0]}}" class="btn btn-primary">Читать</a> <a href="{{item[0]}}" class="btn btn-primary">Читать</a>
</div> </div>
<div class="card-footer"><small class=text-muted"> <div class="card-footer"><small class=text-muted">
Опубликовано {{globals.format_date(item[1].page['published'], format='long')}} Опубликовано {{item[1].page['published']|format_date('long')}}
{%- if item[1].page['updated'] %}, обновлено {{globals.format_date(item[1].page['updated'], format='long')}}{% endif %} {%- if item[1].page['updated'] %}, обновлено {{item[1].page['updated']|format_date('long')}}{% endif %}
</small></div> </small></div>
</div> </div>
{% endfor %} {% endfor %}

View File

@ -56,8 +56,8 @@
<h1 class="page-title">{{title}}</h1> <h1 class="page-title">{{title}}</h1>
{%- if description %}<p class="page-lead">{{description}}</p>{% endif %} {%- if description %}<p class="page-lead">{{description}}</p>{% endif %}
<div class="row"> <div class="row">
{%- if published %}<p class="col-6 col-sm-4 col-md-3"><i class="fas fa-calendar-day"></i> {{globals.format_date(published, format='long')}}</p>{% endif %} {%- if published %}<p class="col-6 col-sm-4 col-md-3"><i class="fas fa-calendar-day"></i> {{published|format_date('long')}}</p>{% endif %}
{%- if updated %}<p class="col-6 col-sm-4 col-md-3"><i class="fas fa-edit"></i> {{globals.format_date(updated, format='long')}}</p>{% endif %} {%- if updated %}<p class="col-6 col-sm-4 col-md-3"><i class="fas fa-edit"></i> {{updated|format_date('long')}}</p>{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,12 +1,3 @@
def test_globals(fake_request):
from flatfilecms.events import add_global
event = {'request': fake_request}
add_global(event)
assert 'globals' in event
assert 'format_date' in event['globals']
assert 'format_datetime' in event['globals']
def test_data(config): def test_data(config):
from flatfilecms.events import add_data from flatfilecms.events import add_data
event = {} event = {}