summaryrefslogtreecommitdiff
path: root/templates/page.html
blob: 0dff1a7e6c82ed4c66ebd3ee1d0dea5446ec02cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
{% extends "base.html" %}

{% block main_content %}
{%- set separator = config.extra.separator | default(value="•") -%}

{%- set rel_attributes = macros_rel_attributes::rel_attributes() | trim -%}

{%- set blank_target = macros_target_attribute::target_attribute(new_tab=config.markdown.external_links_target_blank) -%}

{# Debugging #}
{# <div><pre>
    Page path: {{ page.path }}
    Page components: {{ page.components | join(sep=", ") }}
    Page ancestors: {{ page.ancestors | join(sep=", ") }}
    Current language: {{ lang }}
    Default language: {{ config.default_language }}
    Current section: {% if current_section %}{{ current_section.path }}{% else %}None{% endif %}
    Page extra: {{ page.extra | json_encode() }}
    {% if section -%}
        {%- set current_section = section -%}
    {%- elif page -%}
        {%- set current_section = "" -%}
        {%- if page.ancestors | length > 0 -%}
            {%- set last_ancestor = page.ancestors | slice(start=-1) -%}
            {%- set_global current_section = get_section(path=last_ancestor.0, metadata_only=true) -%}
        {%- else -%}
            {%- set components = page.components -%}
            {%- for i in range(start=1, end=components | length) -%}
                {%- if lang == config.default_language -%}
                    {%- set potential_path = components | slice(end=components | length - i) | join(sep="/") -%}
                    {%- set potential_page = potential_path ~ "/index.md" -%}
                    {%- set potential_section = potential_path ~ "/_index.md" -%}
                {%- else -%}
                    {%- set potential_path = components | slice(start=1, end=components | length - i) | join(sep="/") -%}
                    {%- set potential_page = potential_path ~ "/index." ~ lang ~ ".md" -%}
                    {%- set potential_section = potential_path ~ "/_index." ~ lang ~ ".md" -%}
                {%- endif -%}
                Checking parent page: {{ potential_page }}
                {%- set page_data = load_data(path=potential_page, required=false) -%}
                {%- if page_data -%}
                    {%- set_global current_section = get_page(path=potential_page) %}
    Parent page found: {{ current_section.path }}
                    {%- break -%}
                {%- endif -%}
                Checking section: {{ potential_section }}
                {%- set section_data = load_data(path=potential_section, required=false) -%}
                {%- if section_data -%}
                    {%- set_global current_section = get_section(path=potential_section, metadata_only=true) -%}
                    Section found: {{ current_section.path }}
                    {%- break -%}
                {%- endif -%}
            {%- endfor -%}
        {%- endif -%}
    {%- endif %}
Found nearest parent/section: {% if current_section %}{{ current_section.path }}{% else %}None{% endif %}
Current section extra: {% if current_section %}{{ current_section.extra | json_encode() }}{% else %}None{% endif %}
</pre></div>

    {% set settings_to_test = [
        "iine",
        "iine_icon",
        "enable_cards_tag_filtering",
        "footnote_backlinks",
        "add_src_to_code_block",
        "force_codeblock_ltr",
        "copy_button",
        "katex",
        "quick_navigation_buttons",
        "show_reading_time",
        "show_date",
        "show_author",
        "show_remote_changes",
        "toc",
        "show_previous_next_article_links",
        "invert_previous_next_article_links",
        "previous_next_article_links_full_width",
        "enable_csp",
    ] %}

    <table>
        <thead>
            <tr>
                <th>setting</th>
                <th>page</th>
                <th>section</th>
                <th>config</th>
                <th>macro output</th>
            </tr>
        </thead>
        <tbody>
            {% for setting in settings_to_test %}
                <tr>
                    <td><code>{{ setting }}</code></td>
                    <td>{{ page.extra[setting] | default(value="⬛") }}</td>
                    <td>{{ current_section.extra[setting] | default(value="⬛") }}</td>
                    <td>{{ config.extra[setting] | default(value="⬛") }}</td>
                    <td>{{ macros_settings::evaluate_setting_priority(setting=setting, page=page) }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
</div> #}

{# {{ __tera_context }} #}
{# End debugging #}

<main>
    <article class="h-entry">
        <h1 class="p-name article-title">
            {{ page.title | markdown(inline=true) | safe }}
        </h1>
        <a class="u-url u-uid" href="{{ page.permalink | safe }}"></a>

        <ul class="meta">
            {#- Draft indicator -#}
            {% if page.draft %}
                <li class="draft-label">{{ macros_translate::translate(key="draft", default="DRAFT", language_strings=language_strings) }}</li>
            {% endif %}

         {#- Author(s) -#}
            {%- if page.authors or config.author and macros_settings::evaluate_setting_priority(setting="show_author", page=page, default_global_value=false) == "true" -%}
                {%- if page.authors -%}
                    {%- set author_list = page.authors -%}
                {%- else -%}
                    {%- set author_list = [config.author] -%}
                {%- endif -%}

                {%- if author_list | length == 1 -%}
                    {%- set author_string = '<span class="p-author">' ~ author_list.0 ~ '</span>' -%}
                {%- else -%}
                    {%- set last_author = author_list | last -%}
                    {%- set other_authors = author_list | slice(end=-1) -%}
                    {%- set author_separator = macros_translate::translate(key="author_separator", default=", ", language_strings=language_strings) -%}
                   {%- set author_separator = '</span>' ~ author_separator ~ '<span class="p-author">' -%}
                    {%- set conjunction = macros_translate::translate(key="author_conjunction", default=" and ", language_strings=language_strings) -%}
                    {%- set conjunction = '</span>' ~ conjunction ~ '<span class="p-author">' -%}
                    {%- set author_string = other_authors | join(sep=author_separator) -%}
                    {%- set author_string = author_string ~ conjunction ~ last_author -%}
                    {%- set author_string = '<span class="p-author">' ~ author_string ~ '</span>' -%}
                {%- endif -%}

                {%- set by_author = macros_translate::translate(key="by_author", default="By $AUTHOR", language_strings=language_strings) -%}
                <li>{{ by_author | replace(from="$AUTHOR", to=author_string) | safe }}</li>
                {%- set previous_visible = true -%}
            {%- endif -%}

            {%- if config.extra.hcard and config.extra.hcard.enable and ( not author_list or author_list is containing(config.author)) -%}
                {% include "partials/hcard_small.html" %}
            {%- endif -%}

            {%- set separator_with_class = "<span class='separator' aria-hidden='true'>" ~ separator ~ "</span>"-%}

            {#- Date -#}
            {%- if page.date and macros_settings::evaluate_setting_priority(setting="show_date", page=page, default_global_value=true) == "true" -%}
                <li><time class="dt-published" datetime="{{ page.date }}">{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{ macros_format_date::format_date(date=page.date, short=true, language_strings=language_strings) }}</time></li>
                {#- Variable to keep track of whether we've shown a section, to avoid separators as the first element -#}
                {%- set previous_visible = true -%}
            {%- endif -%}

            {#- Reading time -#}
            {%- if macros_settings::evaluate_setting_priority(setting="show_reading_time", page=page, default_global_value=true) == "true" -%}
                <li title="{{ macros_translate::translate(key="words", number=page.word_count, default="$NUMBER words", language_strings=language_strings) }}">{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{ macros_translate::translate(key="min_read", number=page.reading_time, default="$NUMBER min read", language_strings=language_strings) }}</li>
                {%- set previous_visible = true -%}
            {%- endif -%}

            {#- Tags -#}
            {%- if page.taxonomies and page.taxonomies.tags -%}
                <li class="tag">{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{- macros_translate::translate(key="tags", default="tags", language_strings=language_strings) | capitalize -}}:&nbsp;</li>
                {%- for tag in page.taxonomies.tags -%}
                    <li class="tag"><a class="p-category" href="{{ get_taxonomy_url(kind='tags', name=tag, lang=lang) | safe }}">{{ tag }}</a>
                    {%- if not loop.last -%}
                        ,&nbsp;
                    {%- endif -%}
                    </li>
                {%- endfor -%}
                {%- set previous_visible = true -%}
            {%- endif -%}

            {#- Last updated on -#}
            {% if page.updated %}
                {%- set last_updated_str = macros_translate::translate(key="last_updated_on", default="Updated on $DATE", language_strings=language_strings) -%}
                {%- set formatted_date = macros_format_date::format_date(date=page.updated, short=true, language_strings=language_strings) -%}
                {%- set updated_str = last_updated_str | replace(from="$DATE", to=formatted_date) -%}
                {%- set previous_visible = true -%}
                </ul><ul class="meta last-updated"><li><time class="dt-updated" datetime="{{ page.updated }}">{{ updated_str }}</time></li>
                {#- Show link to remote changes if enabled -#}
                {%- if config.extra.remote_repository_url and macros_settings::evaluate_setting_priority(setting="show_remote_changes", page=page, default_global_value=true) == "true" -%}
                    <li>{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}<a class="external" href="{% include "partials/history_url.html" %}" {{ blank_target }} rel="{{ rel_attributes }}">{{ macros_translate::translate(key="see_changes", default="See changes", language_strings=language_strings) }}</a></li>
                {%- endif -%}
            {% endif %}
        </ul>

        {#- A page is part of a series if one of the sections above (whether it is transparent or not) has the `extra.series` parameter set to true. -#}
        {#- As a series might be a transparent section in order to mix up its articles with those of the section just above or the root, -#}
        {#- there is no other way but to compute the potential path of each ancestor section related to the page and look for the first one being a series. -#}
        {#- Using the `ancestors` field of a section is not possible because transparent sections are not present in this field. -#}
        {%- set series_path_components = [] -%}
        {%- set section_paths = [] -%}
        {%- for path in page.relative_path | split(pat="/") | slice(end=-1) -%}
            {%- set_global series_path_components = series_path_components | concat(with=path) -%}
            {%- set section_path = series_path_components | concat(with="_index.md") | join(sep="/") -%}
            {%- set_global section_paths = section_paths | concat(with=section_path) -%}
        {%- endfor -%}
        {#- The series the page is part of is the closest section flagged as a series, if any -#}
        {%- for section_path in section_paths | reverse -%}
            {%- set section_file_exists = load_data(path=section_path, required=false) -%}
            {%- if section_file_exists -%}
                {%- set loaded_section = get_section(path=section_path,lang=lang) -%}
                {%- if "series" in loaded_section.extra and loaded_section.extra.series -%}
                    {%- set_global series_section = loaded_section -%}
                    {%- set_global series_ordered_pages = loaded_section.pages -%}
                    {%- if loaded_section.paginated | default(value=0) > 0 and loaded_section.paginate_reversed -%}
                        {%- set_global series_ordered_pages = loaded_section.pages | reverse -%}
                    {%- endif -%}
                    {%- break -%}
                {%- endif -%}
            {%- endif -%}
        {%- endfor -%}

        {% if page.extra.tldr %}
            <div class="admonition note">
                <div class="admonition-icon admonition-icon-note"></div>
                <div class="admonition-content">
                    <strong class="admonition-title">
                        <span title="Too long; didn't read (summary)">TL;DR</span>
                    </strong>
                    <p>{{ page.extra.tldr | markdown | safe }}</p>
                </div>
            </div>
        {% endif %}

        {#- Optional table of contents below the header -#}
        {% if page.toc and macros_settings::evaluate_setting_priority(setting="toc", page=page, default_global_value=false) == "true" %}
            {{ macros_toc::toc(page=page, header=true, language_strings=language_strings) }}
        {% endif %}

        {#- Optional Summary paragraph for readers -#}
        {% if page.description %}
            <p class="p-summary" hidden>{{ page.description }}</p>
        {%- endif -%}


        <section class="e-content body">
            {#- Replace series_intro placeholder -#}
            {%- set content_with_intro = page.content -%}
            {%- if "<!-- series_intro -->" in page.content -%}
                {%- set series_intro_html = macros_series_page::get_introduction(page=page, series_section=series_section, series_ordered_pages=series_ordered_pages, language_strings=language_strings) -%}
                {%- set content_with_intro = content_with_intro | replace(from="<!-- series_intro -->", to=series_intro_html) -%}
            {%- elif series_section -%}
                {%- set series_intro_html = macros_series_page::get_introduction(page=page, series_section=series_section, series_ordered_pages=series_ordered_pages, language_strings=language_strings) -%}
                {%- set content_with_intro = series_intro_html ~ content_with_intro -%}
            {%- endif -%}

            {#- Handle series_outro placeholder -#}
            {%- set processed_content = content_with_intro -%}
            {%- if "<!-- series_outro -->" in content_with_intro -%}
                {%- set series_outro_html = macros_series_page::get_outro(page=page, series_section=series_section, series_ordered_pages=series_ordered_pages, language_strings=language_strings) -%}
                {%- set processed_content = processed_content | replace(from="<!-- series_outro -->", to=series_outro_html) -%}
            {%- elif series_section -%}
                {%- set series_outro_html = macros_series_page::get_outro(page=page, series_section=series_section, series_ordered_pages=series_ordered_pages, language_strings=language_strings) -%}
                {#- We want the outro at the end of the article, but before footnote definitions -#}
                {%- set footnotes_marker = '<hr><ol class="footnotes-list">' -%}
                {%- if footnotes_marker in content_with_intro -%}
                    {%- set content_sections = processed_content | split(pat=footnotes_marker) -%}
                    {%- set main_content = content_sections | first -%}
                    {%- set footnotes_content = content_sections | slice(start=1) | join(sep=footnotes_marker) -%}
                    {%- set processed_content = main_content ~ series_outro_html ~ footnotes_marker ~ footnotes_content -%}
                {%- else -%}
                    {%- set processed_content = processed_content ~ series_outro_html -%}
                {%- endif -%}
            {%- endif -%}

            {#- Replace TOC and render final content -#}
            {#- The replace pattern is used to enable arbitrary locations for the Table of Contents -#}
            {#- This is Philipp Oppermann's workaround: https://github.com/getzola/zola/issues/584#issuecomment-474329637 -#}
            {{ processed_content | replace(from="<!-- toc -->", to=macros_toc::toc(page=page, header=false, language_strings=language_strings)) | safe }}
        </section>

        {#- iine button -#}
        {%- if macros_settings::evaluate_setting_priority(setting="iine", page=page, default_global_value=false) == "true" -%}
            {% include "partials/iine_button.html" %}
        {%- endif -%}

        {% if macros_settings::evaluate_setting_priority(setting="show_previous_next_article_links", page=page, default_global_value=true) == "true" %}
            {%- if page.lower or page.higher -%}
                {% set next_label = macros_translate::translate(key="next", default="Next", language_strings=language_strings) %}
                {% set prev_label = macros_translate::translate(key="prev", default="Prev", language_strings=language_strings) %}
                {% if macros_settings::evaluate_setting_priority(setting="invert_previous_next_article_links", page=page, default_global_value=true) == "true" %}
                    {% if page.higher %}
                        {% set left_link = page.higher.permalink %}
                        {% set left_label = prev_label %}
                        {% set left_title = page.higher.title %}
                    {% endif %}
                    {% if page.lower %}
                        {% set right_link = page.lower.permalink %}
                        {% set right_label = next_label %}
                        {% set right_title = page.lower.title %}
                    {% endif %}
                {% else %}
                    {% if page.lower %}
                        {% set left_link = page.lower.permalink %}
                        {% set left_label = next_label %}
                        {% set left_title = page.lower.title %}
                    {% endif %}
                    {% if page.higher %}
                        {% set right_link = page.higher.permalink %}
                        {% set right_label = prev_label %}
                        {% set right_title = page.higher.title %}
                    {% endif %}
                {% endif %}
                {% if macros_settings::evaluate_setting_priority(setting="previous_next_article_links_full_width", page=page, default_global_value=true) == "true" %}
                    {%- set full_width_class = "full-width" -%}
                {% endif %}
            <nav class="{{ full_width_class | default(value="") }} article-navigation">
                <div>
                {%- if left_link and left_label and left_title -%}
                <a href="{{ left_link | safe }}" aria-label="{{ left_label }}" aria-describedby="left_title"><span class="arrow"></span>&nbsp;{{ left_label }}</a>
                <p aria-hidden="true" id="left_title">{{ left_title | truncate(length=100, end="…") | markdown(inline=true) | safe }}</p>
                {%- endif -%}
                </div>
                <div>
                {%- if right_link and right_label and right_title -%}
                <a href="{{ right_link | safe }}" aria-label="{{ right_label }}" aria-describedby="right_title">{{ right_label }}&nbsp;<span class="arrow"></span></a>
                <p aria-hidden="true" id="right_title">{{ right_title | truncate(length=100, end="…") | markdown(inline=true) | safe }}</p>
                {%- endif -%}
                </div>
            </nav>
            {%- endif -%}
        {%- endif -%}

        {#- Comments -#}
        {#- Check if comments are enabled, checking that they are not disabled on the specific page -#}
        {% set systems = ["giscus", "utterances", "hyvortalk", "isso"] %}
        {% set enabled_systems = 0 %}
        {% set comment_system = "" %}

        {% for system in systems %}
            {% set global_enabled = config.extra[system].enabled_for_all_posts | default(value=false) %}
            {% set page_enabled = page.extra[system] | default(value=global_enabled) %}
            {% set is_enabled = global_enabled and page_enabled != false or page_enabled == true %}

            {% if is_enabled %}
                {% set_global comment_system = system %}
                {% set_global enabled_systems = enabled_systems + 1 %}
            {% endif %}
        {% endfor %}
        {#- Ensure only one comment system is enabled -#}
        {% if enabled_systems > 1 %}
            {{ throw(message="ERROR: Multiple comment systems have been enabled for the same page. Check your config.toml and individual page settings to ensure only one comment system is activated at a time.") }}
        {% endif %}
        {% if comment_system %}
            {% include "partials/comments.html" %}
        {% endif %}

        {#- Webmentions -#}
        {%- set global_webmentions_enabled = config.extra.webmentions.enable | default(value=false) -%}
        {%- set page_webmentions_enabled = page.extra.webmentions | default(value=global_webmentions_enabled) -%}
        {%- set webmentions_enabled = global_webmentions_enabled and page_webmentions_enabled != false or page_webmentions_enabled == true -%}
        {%- if webmentions_enabled -%}
            {%- include "partials/webmentions.html" -%}
        {%- endif -%}

    </article>
</main>

{%- include "partials/extra_features.html" -%}

{% endblock main_content %}