-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcarew-vstupitelnyj-tekst-bez-front-matter.html
More file actions
126 lines (120 loc) · 8.09 KB
/
Copy pathcarew-vstupitelnyj-tekst-bez-front-matter.html
File metadata and controls
126 lines (120 loc) · 8.09 KB
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
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Carew. Вступительный текст без "front matter"</title>
<meta name="description" content="Определение вступительного (intro) текста в основном на страницах, сгенерированных через Carew">
<meta name="author" content="Андрей Котельник">
<meta name="viewport" content="width=device-width">
<meta name="google-site-verification" content="srcHAgeuk6CVcbIN_EgR07rRYW1oG420EIbLWAB73P4" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Serif:400,400italic,700%7CPT+Sans:400">
<link rel="stylesheet" href="/assets/build/css/main.css?id=63efd47ac29e03c51d5e">
<!-- Icons -->
<link rel="apple-touch-icon" sizes="144x144" href="/assets/images/apple-touch-icon-precomposed.png">
<link rel="shortcut icon" href="/assets/images/favicon.ico">
</head>
<body>
<!-- Target for toggling the sidebar `.sidebar-checkbox` is for regular
styles, `#sidebar-checkbox` for behavior. -->
<input type="checkbox" class="sidebar-checkbox" id="sidebar-checkbox" />
<!-- Toggleable sidebar -->
<div class="sidebar" id="sidebar">
<aside class="sidebar-item">
<p class="text-justify">Здесь должен быть текст, который покажет, что я не только хороший специалист, но и приятный человек, но я его пока не придумал</p>
</aside>
<nav class="sidebar-nav">
<a href="about.html" class="sidebar-nav-item">Кто здесь?!</a>
<a href="https://github.com/Ascendens" class="sidebar-nav-item" rel="nofollow">GitHub</a>
</nav>
<footer class="sidebar-item">
<p>© 2017 - 2019 ascendens.github.io</p>
</footer>
</div>
<div class="wrap">
<div class="masthead">
<header class="container">
<h3 class="masthead-title">
<a href="/" title="Home">Пытаясь программировать</a>
<small>...иногда даже получается</small>
</h3>
</header>
</div>
<main class="container content"><article class="post">
<header>
<h1 class="post-title">Carew. Вступительный текст без "front matter"</h1>
<time class="post-date" datetime="2017-02-02T21:58:00+02:00">02 Фев 2017</time>
</header>
<h2 id="">Зачем мне понадобился вступительный текст<a href="#" class="anchor">#</a></h2>
<p>Генератор статических сайтов <a href="https://carew.github.io/">Carew</a>, по моему скромному мнению, "из коробки" поддерживает
почти все, что нужно для ведения среднестатистического блога — посты, страницы, категории, теги и темы.
Списки категорий, к сожалению, а может к счастью, представлены достаточно аскетично — просто список ссылок
на материалы, где анкорами являются заголовки. Но, многим, в том числе и мне, этого покажется мало.
Просматривая категорию, под заголовком, я ожидаю увидеть намек на то, о чем же все таки идет речь.</p>
<h2 id="-2">Как отображать вступительный текст<a href="#-2" class="anchor">#</a></h2>
<p>Итак, первое, что придет на ум разработчику, использующему любой генератор статических сайтов — это
<a href="https://carew.github.io/documentation.html#front-matter">front matter</a>. Решение простое и даже
логичное, но попытка использовать там форматирование заканчивается неудачей. Аналогично для нескольких
строк текста.</p>
<p>Раз <em>front matter</em> для наших целей не подходит, будем использовать область основного текста. Просто
введем понятие разделителя между основным и вступительным содержимым. Пусть это будет HTML комментарий
такого вида:</p>
<pre><code class="language-html"><!--more--></code></pre>
<p>Теперь нужно сообщить движку о том, что нужно как-то обрабатывать новоявленный разделитель. Так как
нашей изначальной целью является список документов, создаем/открываем файл <code>layouts/blocks.html.twig</code>
и находим в нем блок <code>documents</code>. Именно здесь и описан нужный нам вывод.</p>
<pre><code class="language-twig">{% block documents %}
{% spaceless -%}
<ul class="{% block ul_class '' %}">
{% for document in documents %}
<li class="{% block li_class '' %}">
{% block document_list %}
<a href="{{ render_document_path(document) }}">
{{ render_document_title(document) }}
</a>
{% endblock %}
</li>
{% endfor %}
</ul>
{%- endspaceless %}
{% endblock %}</code></pre>
<p>Для упрощения, давайте выводить вступление прямо под ссылкой.</p>
<pre><code class="language-twig"><a href="{{ render_document_path(document) }}">
{{ render_document_title(document) }}
</a>
{{ render_document_intro(document) }}</code></pre>
<p>Понять, почему функция вывода вступления называна именно <code>render_document_intro</code> можно, взглянув на
<a href="https://carew.github.io/cookbook/helper.html#render-document">этот раздел документации</a>, я же просто
представлю вам свой вариант реализации данного блока:</p>
<pre><code class="language-twig">{% block document_intro %}
{% spaceless -%}
{% set parts = document.body|split('<!--more-->') %}
{% if 2 == parts|length %}
{{ parts[0]|raw }}
{% endif %}
{%- endspaceless %}
{% endblock %}</code></pre>
<p>Алгоритм элементарен — разделяем текст по <code><!--more--></code> и выводим первую часть. Надеюсь, кому-нибудь прогодится.</p>
</article>
</main>
</div>
<label for="sidebar-checkbox" class="sidebar-toggle"></label>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
if (window.location.host.indexOf('local') === -1) {
ga('create', 'UA-18144383-3', 'auto');
ga('send', 'pageview');
}
</script>
<script src="/assets/build/js/highlight.min.js"></script>
<script src="/assets/build/js/highlightjs-line-numbers.min.js"></script>
<script>
hljs.initHighlightingOnLoad();
hljs.initLineNumbersOnLoad();
</script>
</body>
</html>