parent
2d18dd5bd6
commit
31e1db359d
@ -0,0 +1,49 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from datetime import datetime, date
|
||||
from typing import Any, Iterable, Tuple
|
||||
|
||||
|
||||
class PagesSorter(ABC):
|
||||
_default_published = date.fromtimestamp(0)
|
||||
|
||||
def __init__(self, pages: Iterable[dict]):
|
||||
self.pages = pages
|
||||
|
||||
@abstractmethod
|
||||
def __call__(self, page: dict) -> Any:
|
||||
raise NotImplemented()
|
||||
|
||||
|
||||
class PagesSortByTime(PagesSorter):
|
||||
def __call__(self, page: dict) -> datetime:
|
||||
return page.get('published', self._default_published)
|
||||
|
||||
|
||||
class PagesSortByFolderAndTime(PagesSorter):
|
||||
def __call__(self, page: dict) -> Tuple:
|
||||
return (
|
||||
page.get('folder'),
|
||||
date.today() - page.get(
|
||||
'published', self._default_published
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class PagesSortByTimeGroupedByFolder(PagesSorter):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
st = {}
|
||||
for page in self.pages:
|
||||
folder = page.get('folder', '')
|
||||
published = page.get('published', self._default_published)
|
||||
st[folder] = st.get(folder, published)
|
||||
st[folder] = max(st[folder], published)
|
||||
|
||||
self._max_date_by_folder = st
|
||||
|
||||
def __call__(self, page: dict) -> Tuple:
|
||||
return (
|
||||
self._max_date_by_folder[page.get('folder', '')],
|
||||
page.get('published', self._default_published)
|
||||
)
|
@ -1,41 +1,59 @@
|
||||
{% with title=title or config.title or 'Blog', skip_header=not config.header, styles=['/css/home.css'] %}
|
||||
{% include 'common-head.html' %}
|
||||
{% include 'common-head.html' %}
|
||||
{% endwith %}
|
||||
|
||||
<main>
|
||||
<div class="index">
|
||||
<div class="index">
|
||||
{% set state = {} %}
|
||||
{% for i, page in pages %}
|
||||
{% if 'cur_folder' not in state or page.get('folder') != state.get('cur_folder') %}
|
||||
<div class="folder">
|
||||
{% set folder = page.get('folder') %}
|
||||
{% if folder %}
|
||||
<div id="{{ folder.replace('/', '-') }}" class="folder-title">
|
||||
<a href="#{{ folder.replace('/', '-') }}">
|
||||
{{ folder }}
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="articles">
|
||||
{% for page in pages %}
|
||||
<a class="article" href="{{ page['uri'] }}">
|
||||
<div class="container">
|
||||
{% if page['image'] %}
|
||||
<div class="image">
|
||||
<img src="{{ page['image'] }}" alt="">
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="title">
|
||||
{{ page['title'] }}
|
||||
</div>
|
||||
|
||||
{% if page['published'] %}
|
||||
<div class="published-date">
|
||||
{{ page['published'].strftime('%b %d, %Y') }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if page['description'] %}
|
||||
<div class="description">
|
||||
{{ page['description'] }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if state.update({'cur_folder': page.get('folder')}) %}{% endif %}
|
||||
|
||||
<a class="article" href="{{ page['uri'] }}">
|
||||
<div class="container">
|
||||
{% if page['image'] %}
|
||||
<div class="image">
|
||||
<img src="{{ page['image'] }}" alt="">
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="title">
|
||||
{{ page['title'] }}
|
||||
</div>
|
||||
|
||||
{% if page['published'] %}
|
||||
<div class="published-date">
|
||||
{{ page['published'].strftime('%b %d, %Y') }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if page['description'] %}
|
||||
<div class="description">
|
||||
{{ page['description'] }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</a>
|
||||
|
||||
{% if i == pages|length - 1 or pages[i+1][1].get('folder') != page.get('folder') %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% include 'footer.html' %}
|
||||
{% include 'footer.html' %}
|
||||
</main>
|
||||
|
||||
{% include 'common-tail.html' %}
|
||||
|
Loading…
Reference in new issue