jekyll帖子和页面中的首字母和单词

问题描述 投票:2回答:2

我想在我的jekyll博客中设置我的帖子和页面的首字母和首字母的样式。像这样的东西:

initial letter and word

我可以使用以下样式和span标记来实现此结果:

:not(.post-excerpt) > .initial-word {
  color: #166079;
  font-variant: small-caps;
  font-weight: bold;
}

:not(.post-excerpt) > .initial-word .initial-letter {
  float: left;
  font-size: 3.15em;
  line-height: 0.5;
  margin: 0.225em 0.159em 0 0;
  color: #166079;
  font-weight: normal;
  text-transform: uppercase;
}
<p>
  <span class="initial-word"><span class="initial-letter">L</span>orem</span> ipsum dolor sit amet
</p>

给出一篇以简介文字开头的jekyll帖子:

Lorem ipsum dolor sit amet

# Main title of the post

Lorem ipsum dolor sit amet

通过液体代码{{ content }}在我的布局中访问的帖子内容将类似于:

<p>Lorem ipsum dolor sit amet</p>

<h1>Main title of the post</h1>

<p>Lorem ipsum dolor sit amet</p>

我想修改帖子的内容,添加我的span标签,并满足以下要求:

  • 初始标签只能添加到介绍中;如果内容不是以p标签开头,我不想要它们,我只想在第一段中使用它们。
  • 可以在帖子中直接使用<span class="initial-word">标签来封装多个单词,如下所示: <span class="initial-word">Lorem ipsum</span> dolor sit amet # Main title of the post Lorem ipsum dolor sit amet`

在这种情况下,只应添加<span class="initial-letter">

我最后得到了这个复杂的帖子代码:

{% assign content_start=content | slice: 0, 3 %}
{% assign tokens=content | split: '<span class="initial-word">' %}
{% assign count=tokens | size %}
{% if content_start == "<p>" or count > 1 %}
  {% if count > 1 %}
    {% assign tokens=tokens[1] | split: "</span>" %}
    {% assign initial_word=tokens[0] %}
  {% else %}
    {% assign initial_word=content | remove_first: "<p>" | truncatewords: 1, "" %}
  {% endif %}
  {% assign initial_letter=initial_word | slice: 0 %}
  {% assign span_letter=initial_letter | prepend: '<span class="initial-letter">' | append: '</span>' %}
  {% assign span_word=initial_word | replace_first: initial_letter, "" | prepend: span_letter %}
  {% unless count > 1 %}
    {% assign span_word=span_word | prepend: '<span class="initial-word">' | append: '</span>' %}
  {% endunless %}
  {% assign content=content | replace_first: initial_word, span_word %}
{% endif %}

和页面类似但略有不同的版本。有人有任何暗示以更简单的方式做到这一点吗?我失踪了一些神奇的过滤器?

html css jekyll liquid
2个回答
3
投票

不是一个完整的答案,我可能误解了一些东西,但对于第一个字母,我建议使用:first-letter选择器,而不是将其包装在span

为了选择第一段,p:first-of-type可以提供帮助吗?


0
投票

从@IanDevlin的评论开始,我首先改变了excerpt separator模型后第一个单词的显式标记:

Lorem ipsum<!--first-word--> dolor sit amet

# Main title of the post

Lorem ipsum dolor sit amet

使用::first-letter选择器,我更改了液体代码以检测符合我要求的第一个p标签(基本上,我只考虑段落启动内容):

{% assign content_start=content | slice: 0, 3 %}
{% if content_start == '<p>' %}
  {% if content contains '<!--first-word-->' %}
    {% assign content=content | replace_first: '<!--first-word-->', '</span>' %}
  {% else %}
    {% assign first_word=content | remove_first: '<p>' | truncatewords: 1, '' %}
    {% assign span_word=first_word | append: '</span>' %}
    {% assign content=content | replace_first: first_word, span_word %}
  {% endif %}
  {% assign content=content | replace_first: '<p>', '<p class="first-p"><span class="first-word">' %}
{% endif %}

这会生成以下html代码,并带有更新的css:

:not(.post-excerpt) > .first-word {
  color: #166079;
  font-variant: small-caps;
  font-weight: bold;
}

:not(.post-excerpt) > .first-p::first-letter {
  float: left;
  font-size: 3.15em;
  line-height: 0.5;
  margin: 0.159em 0.159em 0 0;
  color: #166079;
  font-weight: normal;
  text-transform: uppercase;
}
<p class="first-p">
  <span class="first-word">Lorem ipsum</span> dolor sit amet
</p>
© www.soinside.com 2019 - 2024. All rights reserved.