IWC 2018 Berlin: per year archives instead of fixed number split pagination (and a couple of w3c validator fixes)
@@ -556,12 +556,15 @@ @property
def template(self): return "%s.j2.html" % (self.__class__.__name__) - @property + @cached_property def renderdir(self): - return os.path.join( + d = os.path.join( settings.paths.get('build'), self.name ) + if not os.path.isdir(d): + os.makedirs(d) + return d @property def renderfile(self):@@ -1194,6 +1197,14 @@ )
) dict.__setitem__(self, key, value) + # TODO + # - find all months posts were made on + # - use this to iterate + # - make a function to query per month + # - make archives based on this + # - instead of plain numbers, use YYYY-MM + # - feed still needs last X + def get_posts(self, start=0, end=-1): return [ self[k].tmplvars@@ -1242,15 +1253,40 @@ )
else: return settings.paths.get('build') - @property - def tmplvars(self): + def tmplvars(self, posts=[], c=False, p=False, n=False): + if p: + p = { + 'url': "%s%s/" % (self.url, p.format('YYYY')), + 'label': p.format('YYYY') + } + + if n: + n = { + 'url': "%s%s/" % (self.url, n.format('YYYY')), + 'label': n.format('YYYY') + } + + if not c: + c = self[0].published.format('YYYY') + return { - 'name': self.name, - 'display': self.display, - 'url': self.url, - 'feed': "%s%s/" % (self.url, 'feed'), - 'jsonfeed': "%s%s/index.json" % (self.url, 'feed'), - 'title': self.title + 'site': settings.site, + 'author': settings.author, + 'meta': settings.meta, + 'licence': settings.licence, + 'tips': settings.tips, + 'category': { + 'name': self.name, + 'display': self.display, + 'url': self.url, + 'feed': "%s%s/" % (self.url, 'feed'), + #'jsonfeed': "%s%s/index.json" % (self.url, 'feed'), + 'title': self.title, + 'current': c, + 'previous': p, + 'next': n, + }, + 'posts': posts, } @property@@ -1371,55 +1407,99 @@ f.write(fg.rss_str(pretty=True))
elif xmlformat == 'atom': f.write(fg.atom_str(pretty=True)) - async def render_page(self, pagenum=1, pages=1): - if self.display == 'flat': - start = 0 - end = -1 - else: - pagination = int(settings.site.get('pagination')) - start = int((pagenum - 1) * pagination) - end = int(start + pagination) + async def render_flat(self): + r = J2.get_template(self.template).render( + self.tmplvars([self[k].tmplvars for k in self.sortedkeys]) + ) - posts = self.get_posts(start, end) - r = J2.get_template(self.template).render({ - 'site': settings.site, - 'author': settings.author, - 'meta': settings.meta, - 'licence': settings.licence, - 'tips': settings.tips, - 'category': self.tmplvars, - 'pages': { - 'current': pagenum, - 'total': pages, - }, - 'posts': posts, - }) - if pagenum > 1: - renderdir = os.path.join(self.renderdir, 'page', str(pagenum)) - else: - renderdir = self.renderdir - if not os.path.isdir(renderdir): - os.makedirs(renderdir) - renderfile = os.path.join(renderdir, 'index.html') + renderfile = os.path.join(self.renderdir, 'index.html') with open(renderfile, 'wt') as f: f.write(r) + + #async def render_page(self, tmplvars): + + + # async def render_page(self, pagenum=1, pages=1): + # if self.display == 'flat': + # start = 0 + # end = -1 + # else: + # pagination = int(settings.site.get('pagination')) + # start = int((pagenum - 1) * pagination) + # end = int(start + pagination) + + # posts = self.get_posts(start, end) + # r = J2.get_template(self.template).render({ + # 'site': settings.site, + # 'author': settings.author, + # 'meta': settings.meta, + # 'licence': settings.licence, + # 'tips': settings.tips, + # 'category': self.tmplvars, + # 'pages': { + # 'current': pagenum, + # 'total': pages, + # }, + # 'posts': posts, + # }) + # if pagenum > 1: + # renderdir = os.path.join(self.renderdir, 'page', str(pagenum)) + # else: + # renderdir = self.renderdir + # if not os.path.isdir(renderdir): + # os.makedirs(renderdir) + # renderfile = os.path.join(renderdir, 'index.html') + # with open(renderfile, 'wt') as f: + # f.write(r) + async def render(self): if self.exists: return + await self.render_feeds() if self.display == 'flat': - pagination = len(self) - else: - pagination = int(settings.site.get('pagination')) + await self.render_flat() + return - pages = ceil(len(self) / pagination) - page = 1 - while page <= pages: - await self.render_page(page, pages) - page = page + 1 - await self.render_feeds() + time_format = 'YYYY' + by_time = {} + for key in self.sortedkeys: + trange = arrow.get(key).format(time_format) + if trange not in by_time: + by_time.update({ + trange: [] + }) + by_time[trange].append(key) + keys = list(by_time.keys()) + for p, c, n in zip([None]+keys[:-1], keys, keys[1:]+[None]): + if arrow.utcnow().format(time_format) == c.format(time_format): + renderdir = self.renderdir + else: + renderdir = os.path.join( + self.renderdir, + c.format(time_format) + ) + # + if not os.path.isdir(renderdir): + os.makedirs(renderdir) + renderfile = os.path.join( + renderdir, + 'index.html' + ) + + r = J2.get_template(self.template).render( + self.tmplvars( + [self[k].tmplvars for k in by_time[c]], + c=c, + p=p, + n=n + ) + ) + with open(renderfile, 'wt') as f: + settings.logger.info('writing category archive to: %s', renderfile) + f.write(r) class Sitemap(dict): @property
@@ -6,9 +6,9 @@ <link rel="alternate" type="application/rss+xml" title="{{ category.title }} RSS feed" href="{{ category.feed }}" />
<link rel="alternate" type="application/atom+xml" title="{{ category.title }} ATOM feed" href="{{ category.feed }}atom.xml" /> {% endblock %} {% block content %} -<main class="content-body h-feed hfeed"> +<main class="content-body h-feed hfeed" property="h-feed"> <header> - <h1 class="p-name">{{ category.name }}</h1> + <h1 class="p-name" property="p-name">{{ category.name }}</h1> </header>@@ -20,26 +20,26 @@ <h2>{{ post.year }}</h2>
{% endif %} {% set _ = year.append(post.year)%} - <article class="h-entry hentry singular" lang="{{ post.lang }}" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting" itemref="author"> + <article class="h-entry hentry singular" property="h-entry" lang="{{ post.lang }}" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting" itemref="author"> <header> {% if category.display == 'flat' %} - <h3 itemprop="name headline" class="p-name entry-title"> + <h3 class="p-name entry-title" property="p-name" itemprop="name headline" > {% else %} - <h2 itemprop="name headline" class="p-name entry-title"> + <h2 class="p-name entry-title" property="p-name" itemprop="name headline" > {% endif %} {% if post.is_reply %} <svg class="icon" width="16" height="16"> <use xlink:href="#icon-reply" /> </svg> - <a href="{{ post.url }}/" class="u-url bookmark" itemprop="url mainEntityOfPage"> + <a href="{{ post.url }}/" class="u-url bookmark" property="u-url" itemprop="url mainEntityOfPage"> RE: </a> - <a href="{{ post.is_reply }}" class="u-in-reply-to"> + <a href="{{ post.is_reply }}" class="u-in-reply-to" property="u-in-reply-to"> {{ post.is_reply }} </a> {% else %} - <a href="{{ post.url }}" title="{{ post.title }}" class="u-url bookmark" itemprop="url mainEntityOfPage"> - <span class="entry-title p-name">{{ post.title }}</span> + <a href="{{ post.url }}" title="{{ post.title }}" class="u-url bookmark" property="u-url" itemprop="url mainEntityOfPage"> + <span class="entry-title p-name" property="p-name">{{ post.title }}</span> </a> {% endif %} {% if category.display == 'flat' %}@@ -50,7 +50,7 @@ {% endif %}
</header> {% if post.summary %} - <div class="e-summary entry-summary" itemprop="description"> + <div class="e-summary entry-summary" property="e-summary" itemprop="description"> {{ post.html_summary }} <p class="more"> <a href="{{ post.url }}" title="{{ post.title }}">@@ -59,98 +59,61 @@ </a>
</p> </div> {% else %} - <div class="e-content entry-content" itemprop="articleBody"> + <div class="e-content entry-content" property="e-content" itemprop="articleBody"> {{ post.html_content }} </div> {% endif %} - <footer aria-hidden="true" hidden="hidden" /> + <footer aria-hidden="true" hidden="hidden"> <span class="published updated"> - <time class="dt-published dt-updated" datetime="{{ post.pubtime }}" itemprop="dateModified datePublished">{{ post.pubdate }}</time> + <time class="dt-published dt-updated" property="dt-published dt-updated" datetime="{{ post.pubtime }}" itemprop="dateModified datePublished">{{ post.pubdate }}</time> </span> {% if not post.has_mainimg %} - <img aria-hidden="true" src="{{ author.avatar }}" itemprop="image" width="0" height="0" /> + <img src="{{ author.avatar }}" + itemprop="image" + width="0" + height="0" + alt="Photo of {{ author.name }}" /> {% endif %} - <p class="p-author h-card vcard"> + <p class="p-author h-card vcard" property="p-author h-card"> <img class="photo avatar u-photo u-avatar" + property="u-photo u-avatar" src="{{ author.avatar }}" alt="Photo of {{ author.name }}" /> <a class="fn p-name url u-url u-uid" + property="p-name u-url u-uid" href="{{ author.url }}" rel="author"> {{ author.name }} </a> - <a class="u-email email" href="mailto:{{ author.email }}"> + <a class="u-email email" property="u-email" href="mailto:{{ author.email }}"> {{ author.email }} </a> </p> + </footer> </article> {% endfor %} </main> {% endblock %} {% block pagination %} -{% if pages.total > 1 %} - - {# based on: http://dev.dbl-a.com/symfony-2-0/symfony2-and-twig-pagination/ #} - <nav> - <ul> - {% if pages.current > 1 %} - {% set prev = pages.current - 1 %} - <li> - <a rel="prev" href="{{ category.url }}page/{{ prev }}/">«</a> - </li> - <li> - <a rel="prev" href="{{ category.url }}">1</a> - </li> - {% endif %} - - {% if pages.current - 4 > 0 %} - <li> - <span class="dots">…</span> - </li> - {% endif %} - - - {% if ( pages.current - 1 > 1 ) %} - <li> - <a href="{{ category.url }}page/{{ pages.current - 1 }}/">{{ pages.current - 1 }}</a> - </li> +<nav> + <ul> + {% if category.previous %} + <li> + <a rel="prev" href="{{ category.previous.url }}">« {{ category.previous.label }}</a> + </li> {% endif %} - - <li> - <span class="current">{{ pages.current }}</span> - </li> - + <li> + <span class="current">{{ category.current }}</span> + </li> - {% if ( pages.current + 1 <= pages.total -1 ) %} - <li> - <a href="{{ category.url }}page/{{ pages.current + 1 }}/">{{ pages.current + 1 }}</a> - </li> + {% if category.next %} + <li> + <a rel="next" href="{{ category.next.url }}">{{ category.next.label }} »</a> + </li> {% endif %} - - {% if pages.current + 3 < pages.total %} - <li> - <span class="dots">…</span> - </li> - {% endif %} - - - {% if pages.current != pages.total %} - <li> - <a href="{{ category.url }}page/{{ pages.total }}/">{{ pages.total }}</a> - </li> - {% endif %} - - {% if pages.current < pages.total %} - {% set next = pages.current + 1 %} - <li> - <a rel="next" href="{{ category.url }}page/{{ next }}/">»</a> - </li> - {% endif %} - </ul> - </nav> - -{% endif %} + </ul> +</nav> {% endblock %}
@@ -2,7 +2,7 @@ <figure class="photo">
{% if href != src %} <a href="{{ href }}"> {% endif %} - <img src="{{ src }}" title="{{ title }}" alt="" width="{{ width }}" height="{{ height }}" {% if is_mainimg %}itemprop="image" class="u-featured"{% endif %} /> + <img src="{{ src }}" title="{{ title }}" alt="" width="{{ width }}" height="{{ height }}" {% if is_mainimg %}itemprop="image" class="u-featured" property="u-featured"{% endif %} /> {% if href != src %} </a> {% endif %}
@@ -12,7 +12,7 @@ {% block meta %}{% endblock %}
<style media="all"> {% include 'style.css' %} </style> - <style id="css_alt" media="none"> + <style id="css_alt" media="aural"> {% include 'style-alt.css' %} </style> <style media="print">@@ -31,7 +31,7 @@ function toggleStylesheet(trigger){
var setto = 'all'; var e = document.querySelector('#css_alt'); if (e.getAttribute("media") == 'all') { - setto = 'none'; + setto = 'aural'; } localStorage.setItem("stylesheet", setto); e.setAttribute("media", setto);@@ -81,7 +81,7 @@ </nav>
<div> <form role="search" method="get" action="{{ site.url }}/search.php"> - <label for="s">Search</label> + <label for="q">Search</label> <input type="search" placeholder="search..." value="" name="q" id="q" title="Search for:" /> <input type="submit" value="➡" />@@ -94,7 +94,7 @@ </button>
</form> <p class="follow"> - <a title="follow petermolnar.net" rel="feed" href="{{ site.url }}/follow/"> + <a title="follow petermolnar.net" href="{{ site.url }}/follow/"> <svg width="16" height="16"> <use xlink:href="#icon-feed" /> </svg>@@ -106,9 +106,9 @@ </header>
{% block content %} <main> - <article class="h-entry hentry singular" lang="{{ post.lang }}" itemscope="" itemprop="blogPost" itemtype="http://schema.org/BlogPosting" itemref="author"> + <article class="h-entry hentry singular" lang="{{ post.lang }}" property="h-entry" itemscope="" itemprop="blogPost" itemtype="http://schema.org/BlogPosting" itemref="author"> <header> - <h1 class="entry-title p-name" itemprop="name headline"> + <h1 class="entry-title p-name" itemprop="name headline" property="p-name"> {% if post.is_reply %} <span> <svg width="16" height="16">@@ -117,7 +117,7 @@ </svg>
<a href="{{ post.url }}" class="u-url"> RE: </a> - <a href="{{ post.is_reply }}" class="u-in-reply-to"> + <a href="{{ post.is_reply }}" class="u-in-reply-to" property="u-in-reply-to"> {{ post.is_reply }} </a> </span>@@ -131,14 +131,14 @@ </header>
{% if post.review %} <hr/> - <div class="h-review hreview" itemprop="review" itemscope="" itemtype="http://schema.org/Review"> - <strong>Review summary of: <a href="{{ post.review.url }}" class="item fn p-name u-url p-item h-product">{{ post.review.title }}</a></strong> + <div class="h-review hreview" property="h-review" itemprop="review" itemscope="" itemtype="http://schema.org/Review"> + <strong>Review summary of: <a href="{{ post.review.url }}" class="item fn p-name u-url p-item h-product" property="p-name u-url p-item h-product">{{ post.review.title }}</a></strong> <p> By - <span class="p-author h-card vcard reviewer" itemprop="author" itemscope="" itemtype="http://schema.org/Person"> - <a class="fn p-name url u-url u-uid" href="{{ author.url }}" itemprop="url"> + <span class="p-author h-card vcard reviewer" property="p-author" itemprop="author" itemscope="" itemtype="http://schema.org/Person"> + <a class="fn p-name url u-url u-uid" property="p-name u-url u-uid" href="{{ author.url }}" itemprop="url"> <span itemprop="name">{{ author.name }}</span> - </a></span> at <time class="dt-published dtreviewed" datetime="{{ post.pubtime }}" itemprop="datePublished">{{ post.pubdate }}</time> + </a></span> at <time class="dt-published dtreviewed" property="dt-published" datetime="{{ post.pubtime }}" itemprop="datePublished">{{ post.pubdate }}</time> </p> <p> <span class="rating" itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating">@@ -148,18 +148,18 @@ out of
<span class="best" itemprop="bestRating">{{ post.review.outof }}</span> </span> </p> - <p class="p-summary summary" itemprop="reviewBody">{{ post.review.summary }}</p> + <p class="p-summary summary" property="p-summary" itemprop="reviewBody">{{ post.review.summary }}</p> </div> <hr/> {% endif %} {% if post.summary %} - <div class="e-summary entry-summary" itemprop="description"> + <div class="e-summary entry-summary" property="e-summary" itemprop="description"> {{ post.html_summary }} </div> {% endif %} - <div class="e-content entry-content" itemprop="articleBody"> + <div class="e-content entry-content" property="e-content" itemprop="articleBody"> {{ post.html_content }} </div>@@ -169,6 +169,7 @@ <dl>
<dt>Published</dt> <dd class="published updated"> <time class="dt-published dt-updated" + property="dt-published dt-updated" datetime="{{ post.pubtime }}" itemprop="dateModified datePublished" >{{ post.pubdate }}</time>@@ -176,18 +177,20 @@ </dd>
<dt>Author</dt> <dd> - <p class="p-author h-card vcard" itemprop="author" itemscope="" itemtype="http://schema.org/Person"> + <p class="p-author h-card vcard" property="p-author h-card" itemprop="author" itemscope="" itemtype="http://schema.org/Person"> <img class="photo avatar u-photo u-avatar" + property="p-author h-card" src="{{ author.avatar }}" alt="Photo of {{ author.name }}" itemprop="image" /> <a class="fn p-name url u-url u-uid" + property="p-name u-url u-uid" href="{{ author.url }}" rel="author" itemprop="url"> <span itemprop="name">{{ author.name }}</span> </a> - <<a class="u-email email" href="mailto:{{ author.email }}"> + <<a class="u-email email" property="u-email" href="mailto:{{ author.email }}"> <span itemprop="email">{{ author.email }}</span> </a>> </p>@@ -198,7 +201,7 @@ <dd>
{% if not post.has_mainimg %} <img aria-hidden="true" src="{{ author.avatar }}" itemprop="image" hidden="hidden" /> {% endif %} - <a class="u-url u-uuid" rel="bookmark" href="{{ post.url }}" itemprop="url mainEntityOfPage"> + <a class="u-url u-uuid" property="u-url u-uuid" rel="bookmark" href="{{ post.url }}" itemprop="url mainEntityOfPage"> {{ post.url }} </a> </dd>@@ -206,7 +209,7 @@
<dt>License</dt> <dd class="license"> {% if post.licence == 'by' %} - <a rel="license" href="https://creativecommons.org/licenses/by/4.0/" class="u-license" itemprop="license">CC BY 4.0</a> + <a rel="license" href="https://creativecommons.org/licenses/by/4.0/" class="u-license" property="u-licence" itemprop="license">CC BY 4.0</a> <ul> <li>you can share it</li> <li>you can republish it</li>@@ -215,7 +218,7 @@ <li>you can use it for commercial purposes</li>
<li>you always need to make a link back here</li> </ul> {% elif post.licence.text == 'by-nc' %} - <a rel="license" href="https://creativecommons.org/licenses/by-nc/4.0/" class="u-license" itemprop="license">CC BY-NC 4.0</a> + <a rel="license" href="https://creativecommons.org/licenses/by-nc/4.0/" class="u-license" property="u-licence" itemprop="license">CC BY-NC 4.0</a> <ul> <li>you can share it</li> <li>you can republish it</li>@@ -225,7 +228,7 @@ <li>you always need to make a link back here</li>
</ul> For commercial use, please contact me. {% else %} - <a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" class="u-license" itemprop="license">CC BY-NC-ND 4.0</a> + <a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" class="u-license" property="u-licence" itemprop="license">CC BY-NC-ND 4.0</a> <ul> <li>you can share it</li> <li>you can't modify it</li>@@ -251,7 +254,7 @@
{% if post.syndicate|length %} <section class="syndication"> {% for url in post.syndicate %} - <a href="{{ url }}" class="u-syndication"></a> + <a href="{{ url }}" class="u-syndication" itemprop="u-syndication"></a> {% endfor %} </section> {% endif %}@@ -262,19 +265,19 @@ <section class="replies">
<h2><a id="replies"></a>Replies</h2> <ol> {% for mtime, comment in post.replies.items() %} - <li class="h-entry p-comment"> - <time class="dt-published" datetime="{{ comment.pubtime }}"> + <li class="h-entry p-comment" property="h-entry p-comment"> + <time class="dt-published" property="dt-published" datetime="{{ comment.pubtime }}"> {{ comment.pubdate }} </time> from - <span class="p-author h-card"> + <span class="p-author h-card" property="p-author h-card"> {% if comment.author.url %} - <a class="url u-url" href="{{ comment.author.url }}"> - <span class="p-name fn"> + <a class="url u-url" property="u-url" href="{{ comment.author.url }}"> + <span class="p-name fn" property="p-name"> {{ comment.author.name }} </span> </a> {% else %} - <span class="p-name fn"> + <span class="p-name fn" property="p-name"> {{ comment.author.name }} </span> {% endif %}@@ -283,7 +286,7 @@ <span class="source">
<svg width="16" height="16"> <use xlink:href="#icon-link"></use> </svg> - <a class="u-url" href="{{ comment.source }}"> + <a class="u-url" property="u-url" href="{{ comment.source }}"> {{ comment.source }} </a> </span>@@ -302,24 +305,24 @@ <dt>{{ character }}</dt>
<dd> <ul> {% for mtime, comment in comments.items() %} - <li class="h-entry p-comment"> + <li class="h-entry p-comment" property="h-entry p-comment"> <span class="reaction"> - <a class="u-url" href="{{ comment.source }}"> + <a class="u-url" property="u-url" href="{{ comment.source }}"> {{ comment.type }} </a> </span> - <time class="dt-published" datetime="{{ comment.pubtime }}"> + <time class="dt-published" property="dt-published" datetime="{{ comment.pubtime }}"> {{ comment.pubdate }} </time> from - <span class="p-author h-card"> + <span class="p-author h-card" property="p-author h-card"> {% if comment.author.url %} - <a class="url u-url" href="{{ comment.author.url }}"> - <span class="p-name fn"> + <a class="url u-url" property="u-url" href="{{ comment.author.url }}"> + <span class="p-name fn" property="p-name"> {{ comment.author.name }} </span> </a> {% else %} - <span class="p-name fn"> + <span class="p-name fn" property="p-name"> {{ comment.author.name }} </span> {% endif %}@@ -343,20 +346,21 @@ {% endblock %}
<footer> - <div class="p-author h-card vcard" id="author" itemprop="author publisher" itemscope="" itemtype="https://schema.org/Person https://schema.org/Organization"> + <div class="p-author h-card vcard" property="p-author h-card" id="author" itemprop="author publisher" itemscope="" itemtype="https://schema.org/Person https://schema.org/Organization"> <p> <a href="https://creativecommons.org/">CC</a>, 1999-2018, <span itemprop="logo" itemscope="" itemtype="https://schema.org/ImageObject"> <img class="photo avatar u-photo u-avatar" + property="u-photo u-avatar" src="{{ author.avatar }}" alt="Photo of {{ author.name }}" itemprop="image url" /> </span> - <a class="fn p-name url u-url u-uid" rel="me" href="{{ site.url }}/about.html"> + <a class="fn p-name url u-url u-uid" property="p-name u-url u-uid" rel="me" href="{{ site.url }}/about.html"> <span itemprop="name">{{ author.name }}</span> </a> - <a class="u-email email" rel="me" href="mailto:{{ author.email }}"> + <a class="u-email email" property="u-email" rel="me" href="mailto:{{ author.email }}"> <span itemprop="email">{{ author.email }}</span> </a> </p>@@ -364,7 +368,7 @@ <nav>
<ul> {% for name, value in author.contact.items() %} <li> - <a class="url u-url x-{{name}}" rel="me" href="{{ value }}" itemprop="sameAs"> + <a class="url u-url x-{{name}}" property="u-url x-{{name}}" rel="me" href="{{ value }}" itemprop="sameAs"> <svg width="16" height="16"> <use xlink:href="#icon-{{ name }}"></use> </svg>
@@ -62,7 +62,7 @@ }
code, pre { max-width: 96%; - page-break-inside: enabled; + page-break-inside: auto; font-family: "Courier", "Courier New", monospace !important; }@@ -79,5 +79,5 @@ border: 1px solid #000;
} .h-feed .h-entry { - page-break-after:always; + page-break-after: always; }
@@ -99,7 +99,7 @@ </symbol>
<symbol id="icon-instagram" viewBox="0 0 16 16"> <path fill="#e4405f" d="M8 0c-2.173 0-2.445 0.010-3.298 0.048-0.852 0.040-1.432 0.174-1.942 0.372-0.526 0.204-0.973 0.478-1.417 0.923s-0.719 0.891-0.923 1.417c-0.198 0.51-0.333 1.090-0.372 1.942-0.040 0.853-0.048 1.125-0.048 3.298s0.010 2.445 0.048 3.298c0.040 0.851 0.174 1.432 0.372 1.942 0.204 0.525 0.478 0.973 0.923 1.417s0.891 0.719 1.417 0.923c0.511 0.197 1.091 0.333 1.942 0.372 0.853 0.040 1.125 0.048 3.298 0.048s2.445-0.010 3.298-0.048c0.851-0.040 1.432-0.175 1.942-0.372 0.525-0.204 0.973-0.479 1.417-0.923s0.719-0.89 0.923-1.417c0.197-0.51 0.333-1.091 0.372-1.942 0.040-0.853 0.048-1.125 0.048-3.298s-0.010-2.445-0.048-3.298c-0.040-0.851-0.175-1.433-0.372-1.942-0.204-0.526-0.479-0.973-0.923-1.417s-0.89-0.719-1.417-0.923c-0.51-0.198-1.091-0.333-1.942-0.372-0.853-0.040-1.125-0.048-3.298-0.048zM8 1.44c2.135 0 2.39 0.011 3.233 0.047 0.78 0.037 1.203 0.166 1.485 0.277 0.375 0.145 0.64 0.318 0.921 0.597 0.279 0.28 0.453 0.546 0.597 0.921 0.109 0.281 0.24 0.705 0.275 1.485 0.038 0.844 0.047 1.097 0.047 3.233s-0.010 2.39-0.049 3.233c-0.041 0.78-0.171 1.203-0.281 1.485-0.149 0.375-0.319 0.64-0.599 0.921-0.279 0.279-0.549 0.453-0.92 0.597-0.28 0.109-0.71 0.24-1.49 0.275-0.849 0.038-1.099 0.047-3.239 0.047s-2.391-0.010-3.239-0.049c-0.781-0.041-1.211-0.171-1.491-0.281-0.379-0.149-0.64-0.319-0.919-0.599-0.281-0.279-0.46-0.549-0.6-0.92-0.11-0.28-0.239-0.71-0.28-1.49-0.030-0.84-0.041-1.099-0.041-3.229s0.011-2.391 0.041-3.241c0.041-0.78 0.17-1.209 0.28-1.489 0.14-0.38 0.319-0.64 0.6-0.921 0.279-0.279 0.54-0.459 0.919-0.599 0.28-0.111 0.701-0.241 1.481-0.281 0.85-0.030 1.1-0.040 3.239-0.040l0.030 0.020zM8 3.892c-2.27 0-4.108 1.84-4.108 4.108 0 2.27 1.84 4.108 4.108 4.108 2.27 0 4.108-1.84 4.108-4.108 0-2.27-1.84-4.108-4.108-4.108zM8 10.667c-1.473 0-2.667-1.193-2.667-2.667s1.193-2.667 2.667-2.667 2.667 1.193 2.667 2.667-1.193 2.667-2.667 2.667zM13.231 3.73c0 0.53-0.431 0.96-0.96 0.96s-0.96-0.431-0.96-0.96 0.431-0.959 0.96-0.959c0.529-0.001 0.96 0.43 0.96 0.959z"></path> </symbol> - <symbol id="icon-twitter" width="16" height="16" viewBox="0 0 16 16"> + <symbol id="icon-twitter" viewBox="0 0 16 16"> <path fill="#1da1f2" d="M15.969 3.046c-0.59 0.259-1.22 0.436-1.883 0.517 0.676-0.407 1.196-1.049 1.442-1.815-0.634 0.37-1.337 0.639-2.085 0.789-0.597-0.639-1.449-1.039-2.394-1.039-1.811 0-3.28 1.469-3.28 3.278 0 0.26 0.030 0.51 0.085 0.749-2.727-0.129-5.143-1.438-6.761-3.417-0.285 0.481-0.444 1.041-0.444 1.65 0 1.14 0.58 2.142 1.459 2.731-0.538-0.017-1.044-0.165-1.485-0.411v0.041c0 1.59 1.129 2.916 2.631 3.218-0.275 0.074-0.566 0.114-0.864 0.114-0.209 0-0.41-0.020-0.611-0.057 0.421 1.302 1.63 2.251 3.069 2.278-1.12 0.879-2.539 1.403-4.068 1.403-0.26 0-0.519-0.015-0.78-0.045 1.459 0.929 3.179 1.473 5.038 1.473 6.036 0 9.333-4.997 9.333-9.324 0-0.139 0-0.28-0.010-0.42 0.641-0.459 1.2-1.040 1.64-1.699l-0.031-0.013z"></path> </symbol> </svg>