嗯,你需要检查某处当前词条的首字母是否与上一个词条的首字母不同。
试试这个:
{% assign lastletter = "" %}
{% for listing in site.data.terminology %}
{% assign tmpletter = listing.term | slice: 0 | upcase %}
{% if tmpletter != lastletter %}
<h1>{{ tmpletter }}</h1>
{% endif %}
{{ listing.term }}: {{ listing.definition }}<br>
{% assign lastletter = tmpletter %}
{% endfor %}
我只是将当前术语的第一个字母保存到变量tmpletter。
(slice 截断字符串,upcase 将其转换为大写,因为我想以大写显示)
然后,如果它与上一个词的第一个字母不同,我显示它。
HTML 输出:
<h1>A</h1>
again: now it is here<br>
aunt: another explanation for two<br>
<h1>B</h1>
borrow: something from someone<br>
brother: new explanation for one<br>
<h1>F</h1>
father: this is it<br>
forbidden: fruit<br>
<h1>U</h1>
uncle: and last one for three, with the use of comma fin<br>
utah: this is a state<br>
(我没有费心把 <ul><li> 的东西弄好,你可能会自己解决这个问题)
代码运行良好,但仅当 csv 文件已按字母顺序排序时,我需要代码来执行排序和添加第一个字母。
好的,那么您需要将您的代码和我的代码结合起来,即您需要将我的“确定首字母是否更改”部分应用到您的 {% for allterms in allsortedlistings %} 部分。
类似这样的:
{% capture thelistings %}
{% for listing in site.data.terminology %}
{{ listing.term }}: {{ listing.definition }}
{% endfor %}
{% endcapture %}
{% assign allsortedlistings = thelistings | split:" " | sort %}
{% assign lastletter = "" %}
<ul>
{% for allterms in allsortedlistings %}
{% assign tmpletter = allterms | strip | slice: 0 | upcase %}
{% if tmpletter != lastletter %}
<li>{{ tmpletter }}</li>
{% endif %}
<li>{{ allterms }}</li>
{% assign lastletter = tmpletter %}
{% endfor %}
</ul>
这不是 100% 完成的解决方案,您仍然需要弄清楚当第一个字母发生变化时如何结束/开始 <ul> 部分。
另外,开头有一个空的<li>,可能是因为你用空字符串分割,thelistings 包含 lot 的空字符串(因为里面有换行符和缩进{% capture thelistings %}...{% endcapture %}.
(出于同样的原因,我需要 strip {% assign tmpletter = ... 行中字符串中的所有空格,以找到第一个不是空格的字符)