Skip to content

Commit

Permalink
feat: new template handling custom_blog_categorization
Browse files Browse the repository at this point in the history
  • Loading branch information
kamilkrzyskow committed Oct 3, 2024
1 parent 9e8bddb commit 8e31729
Show file tree
Hide file tree
Showing 5 changed files with 369 additions and 2 deletions.
4 changes: 4 additions & 0 deletions mkdocs_nype/plugins/custom_blog_categorization/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,7 @@ class CustomBlogCategorizationConfig(Config):
# Settings for posts
post_excerpt_max = Type(int, default=5)
# post_url_max_industries = 1 # Currently has no effect, URLs require more overrides

# Settings for templates
icon = Type(str, default="material/briefcase")
singular_name = Optional(Type(str))
33 changes: 32 additions & 1 deletion mkdocs_nype/plugins/custom_blog_categorization/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@
from mkdocs.exceptions import PluginError
from mkdocs.plugins import BasePlugin, PrefixedLogger, event_priority
from mkdocs.structure.files import Files, InclusionLevel
from mkdocs.structure.nav import Section
from mkdocs.structure.nav import Navigation, Section
from mkdocs.structure.pages import Page
from mkdocs.utils.templates import TemplateContext

from .config import CustomBlogCategorizationConfig

Expand Down Expand Up @@ -67,6 +69,19 @@ def on_config(self, config):
LOG.warning("_render_post toc override was not applied")
return

# Categories and Industries end with 'ies', or 'y' for singluar
if self.config.singular_name is None:
# Remove the last split element
without_ies = self.config.render_name.split("ies")[:-1]
# More ies than expected
if not self.config.render_name.endswith("ies") or len(without_ies) != 1:
raise PluginError(
f"Singular name could not be resolved for {self.config.render_name}. "
"Please set it manually."
)
else:
self.config.singular_name = without_ies[0] + "y"

LOG.info("Industry View override found no issues")

# Run after the blog plugin
Expand Down Expand Up @@ -133,6 +148,22 @@ def on_page_markdown(self, markdown, *, page, config, files):
getattr(page, self.config.code_name)[:max_categorization],
)

try:
custom_categorizations = page.custom_categorizations
except AttributeError:
custom_categorizations = None

if custom_categorizations is None:
custom_categorizations = {}
page.custom_categorizations = custom_categorizations
page.excerpt.custom_categorizations = custom_categorizations

custom_categorizations[self.config.code_name] = {
"icon": self.config.icon,
"plural_name": self.config.render_name,
"singular_name": self.config.singular_name,
}

def decorate_render_post(self, func):
"""The categorization_toc isn't taken into account when rendering, so adjust the view afterwards"""

Expand Down
199 changes: 199 additions & 0 deletions mkdocs_nype/templates/blog-post.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
{#-
Copyright (c) 2016-2024 Martin Donath <martin[email protected]>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
-#}

{#-
Modified for mkdocs-nype, last checked up-to-date with mkdocs-material 9.5.39

- Added handling of custom categorization via the custom_blog_categorization plugin

MIT License 2024 Kamil Krzyśków (HRY) for Nype (npe.cm)
-#}

{% extends "main.html" %}

{% import "partials/nav-item.html" as item with context %}

<!-- Page content -->
{% block container %}
<div class="md-content md-content--post" data-md-component="content">

<!-- Sidebar -->
<div
class="md-sidebar md-sidebar--post"
data-md-component="sidebar"
data-md-type="navigation"
>
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner md-post">
<nav class="md-nav md-nav--primary">

<!-- Back to overview link -->
<div class="md-post__back">
<div class="md-nav__title md-nav__container">
<a href="{{ page.parent.url | url }}" class=" md-nav__link">
{% include ".icons/material/arrow-left.svg" %}
<span class="md-ellipsis">
{{ lang.t("blog.index") }}
</span>
</a>
</div>
</div>

<!-- Post authors -->
{% if page.authors %}
<div class="md-post__authors md-typeset">
{% for author in page.authors %}
<div class="md-profile md-post__profile">
<span class="md-author md-author--long">
<img src="{{ author.avatar | url }}" alt="{{ author.name }}" />
</span>
<span class="md-profile__description">
<strong>
{% if author.url %}
<a href="{{ author.url }}">{{ author.name }}</a>
{% else %}
{{ author.name }}
{% endif %}
</strong>
<br />
{{ author.description }}
</span>
</div>
{% endfor %}
</div>
{% endif %}

<!-- Post metadata -->
<ul class="md-post__meta md-nav__list">
<li class="md-nav__item md-nav__item--section">
<div class="md-post__title">
<span class="md-ellipsis">
{{ lang.t("blog.meta") }}
</span>
</div>
<nav class="md-nav">
<ul class="md-nav__list">

<!-- Post date -->
<li class="md-nav__item">
<div class="md-nav__link">
{% include ".icons/material/calendar.svg" %}
<time
datetime="{{ page.config.date.created }}"
class="md-ellipsis"
>
{{- page.config.date.created | date -}}
</time>
</div>
</li>

<!-- Post date updated -->
{% if page.config.date.updated %}
<li class="md-nav__item">
<div class="md-nav__link">
{% include ".icons/material/calendar-clock.svg" %}
<time
datetime="{{ page.config.date.updated }}"
class="md-ellipsis"
>
{{- page.config.date.updated | date -}}
</time>
</div>
</li>
{% endif %}

<!-- Post categories -->
{% if page.categories %}
<li class="md-nav__item">
<div class="md-nav__link">
{% include ".icons/material/bookshelf.svg" %}
<span class="md-ellipsis">
{{ lang.t("blog.categories.in") }}
{% for category in page.categories %}
<a href="{{ category.url | url }}">
{{- category.title -}}
</a>
{%- if loop.revindex > 1 %}, {% endif -%}
{% endfor -%}
</span>
</div>
</li>
{% endif %}

<!-- Post custom categorization managed by custom_blog_categorization plugin -->
{% if page.custom_categorizations %}
{% for categorization, properties in page.custom_categorizations.items() %}
<li class="md-nav__item">
<div class="md-nav__link">
{% include ".icons/" ~ properties.icon ~ ".svg" %}
<span class="md-ellipsis">
{{ lang.t("blog.categories.in") }}
{% for entry in page[categorization] %}
<a href="{{ entry.url | url }}">
{{- entry.title -}}
</a>
{%- if loop.revindex > 1 %}, {% endif -%}
{% endfor -%}
</span>
</div>
</li>
{% endfor %}
{% endif %}

<!-- Post readtime -->
{% if page.config.readtime %}
{% set time = page.config.readtime %}
<li class="md-nav__item">
<div class="md-nav__link">
{% include ".icons/material/clock-outline.svg" %}
<span class="md-ellipsis">
{% if time == 1 %}
{{ lang.t("readtime.one") }}
{% else %}
{{ lang.t("readtime.other") | replace("#", time) }}
{% endif %}
</span>
</div>
</li>
{% endif %}
</ul>
</nav>
</li>
</ul>
</nav>

<!-- Table of contents, if integrated -->
{% if "toc.integrate" in features %}
{% include "partials/toc.html" %}
{% endif %}
</div>
</div>
</div>

<!-- Page content -->
<article class="md-content__inner md-typeset">
{% block content %}
{% include "partials/content.html" %}
{% endblock %}
</article>
</div>
{% endblock %}
133 changes: 133 additions & 0 deletions mkdocs_nype/templates/partials/post.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
{#-
Copyright (c) 2016-2024 Martin Donath <martin[email protected]>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
-#}

{#-
Modified for mkdocs-nype, last checked up-to-date with mkdocs-material 9.5.39

- Added handling of custom categorization via the custom_blog_categorization plugin
- Disabled the Continue Reading button

Also note that 'post' is used here rather loosely and it's the Excerpt View object.

MIT License 2024 Kamil Krzyśków (HRY) for Nype (npe.cm)
-#}

<!-- Post excerpt -->
<article class="md-post md-post--excerpt">
<header class="md-post__header">

<!-- Post authors -->
{% if post.authors %}
<nav class="md-post__authors md-typeset">
{% for author in post.authors %}
<span class="md-author">
<img src="{{ author.avatar | url }}" alt="{{ author.name }}" />
</span>
{% endfor %}
</nav>
{% endif %}

<!-- Post metadata -->
<div class="md-post__meta md-meta">
<ul class="md-meta__list">

<!-- Post date -->
<li class="md-meta__item">
<time datetime="{{ post.config.date.created }}">
{{- post.config.date.created | date -}}
</time>
{#- Collapse whitespace -#}
</li>

<!-- Post categories -->
{% if post.categories %}
<li class="md-meta__item">
{# lang.t("blog.categories.in") #}
{% set cat_len = post.categories | length %}
Categor{{ 'y' if cat_len < 2 else 'ies' }}
{% for category in post.categories %}
<a
href="{{ category.url | url }}"
class="md-meta__link"
>
{{- category.title -}}
</a>
{%- if loop.revindex > 1 %}, {% endif -%}
{% endfor -%}
</li>
{% endif %}

<!-- Post custom categorization managed by custom_blog_categorization plugin -->
{% if post.custom_categorizations %}
{% for categorization, properties in post.custom_categorizations.items() %}
<li class="md-meta__item">
{%- set cat_len = post[categorization] | length -%}
{{ properties.singular_name if cat_len < 2 else properties.plural_name }}
{% for entry in post[categorization] %}
<a
href="{{ entry.url | url }}"
class="md-meta__link"
>
{{- entry.title -}}
</a>
{%- if loop.revindex > 1 %}, {% endif -%}
{% endfor -%}
</li>
{% endfor %}
{% endif %}

<!-- Post readtime -->
{% if post.config.readtime %}
{% set time = post.config.readtime %}
<li class="md-meta__item">
{% if time == 1 %}
{{ lang.t("readtime.one") }}
{% else %}
{{ lang.t("readtime.other") | replace("#", time) }}
{% endif %}
</li>
{% endif %}
</ul>

<!-- Draft marker -->
{% if post.config.draft %}
<span class="md-draft">
{{ lang.t("blog.draft") }}
</span>
{% endif %}
</div>
</header>

<!-- Post content -->
<div class="md-post__content md-typeset">
{{ post.content }}

<!-- Continue reading link -->
{% if post.more and false %}
<nav class="md-post__action">
<a href="{{ post.url | url }}">
{{ lang.t("blog.continue") }}
</a>
</nav>
{% endif %}
</div>
</article>
Loading

0 comments on commit 8e31729

Please sign in to comment.