feed template

آخرین فایل atom.tt2 که برای ساختن فید مطالب هر سایت به کار می‌رود، البته میتوانید با هر یک از استانداردهای مورد قبول که دوست دارید فید خود را بسازید و الزامی به atom بودن آن نیست، نهایتا خروجی این فایل، فایل feed.xml در شاخه اصلی هر سایت خواهد بود.

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>{{ TITLE }}</title>
    <description>{{ DESCRIPTION }}</description>
    <link>{{ URL }}</link>
    <atom:link href="{{ URL }}/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>{{ Build.date }}</pubDate>
    <lastBuildDate>{{ DATE }}</lastBuildDate>
    <generator>mira</generator>
    {{ FOREACH post IN POSTS }}
        <item>
          <title>{{ post.title }}</title>
          <description>{{ post.body.more | html }}</description>
          <pubDate>{{ post.date }}</pubDate>
          <link>{{ post.url }}</link>
          <guid isPermaLink="true">{{ post.url }}</guid>
    {{- FOREACH list IN SITE.lists -}}
        {{ IF post.$list }}
        <{{ list }}>
           {{- FOREACH arch IN post.$list.values -}}
            {{- arch.name -}}
            {{- IF (loop.index != loop.max) -}},{{- END -}}
           {{- END -}}
        </{{ list }}>
        {{ END }}
    {{- END -}}
        </item>
    {{ END }}
  </channel>
</rss>

نکته: در این قالب چند نکته جدید را می‌بینید، یکی برچسب BUILD که اطلاعات زمان اجرای فرمان build را در خود دارد، مانند CALENDAR برای هر پست

و دیگری استفاده جدید از حلقه ها و متغیرهای آن‌ها، خط هجده را ببینید:

{{- FOREACH list IN SITE.lists -}}
        {{ IF post.$list }}
    ...
    ...
       {{- FOREACH arch IN post.$list.values -}}

در حلقه‌ی اول هر لیستی را که در فایل تنظیمات سایت تنظیم کرده‌ایم را چک می‌کند و از این به بعد با استفاده از علامت $ به جای {{}} میتوانیم از مقدار متغیر در کدهای قالب استفاده کنیم، در خط بعد چک میکنیم اگر این مقدار در پست وجود داشته باشد، در حلقه‌ی جدید نام آن را استخراج می‌کنیم.

حلقه‌ی بالا برای نمایش دادن تمام لیست‌های آرشیو موجود در هر سایت است، یعنی مثلا اگر category در هدر باشد، مقدار یا مقدارهای آن‌را به نمایش در می‌آورد، اما ممکن است بپرسید چرا در قالب post از این روش استفاده نکردیم و با استفاده از IF و FOREACH جدا جدا هر لیست را لود کردیم؟!

جواب ساده است، برای اینکه کنترل بیشتری بر روی مکان هر آرشیو داشته باشیم، میخواستیم ترتیب لیست‌ها و مکان قرار گیریشان در قالب دقیقا تحت کنترل خودمان باشد، مثلا نام نویسنده را قبل از بدنه محتوا قرار بدهیم و دسته بندی ها را بعد از آن. اما برای feed نیازی به این مورد نداشتیم، فقط نیاز داریم همه‌ی لیست‌ها دقیقا بعد از متن نمایش داده شوند.

همچنین از یک شرط جدید هم استفاده شده:

{{- IF (loop.index != loop.max) -}},{{- END -}}

با استفاده از loop میتوانیم مشخصات حلقه‌ی در حال اجرا را چک کنیم، loop.index می‌گوید که مرتبه چندم از اجرای حلقه هستیم و loop.max، حداکثر دفعاتی که یک حلقه FOREACH با توجه به سایز لیستی که لود کرده خواهد داشت.

آیتم‌هایی که نمایش داده می‌شوند را با یک کاما بعد از هر کدام از هم جدا کردیم، اما نمیخواستیم که کاما بعد از آخرین آیتم هم نمایش داده شود، پس چک کردیم که اگر در آخر حلقه هستیم دیگر کاما نمایش داده نشود.

بدون این شرط، برچسب زیر vimrc,terminal,vimrc bank,ترمینال,vim

به شکل زیر، بعد از vim یک کامای اضافه نمایش داده خواهد شد:

<tags>vimrc,terminal,vimrc bank,ترمینال,vim,</tags>

و نکته‌ی آخر، بعضی از خط ها بعد و قبل از استفاده از جفت آکولادها {{ }} از یک خط تیره - استفاده شده {{- -}}، آکولادها قبل و بعد از خود یک کاراکتر خط جدید را هم به نمایش در می‌آورند. البته برای ساختن قالب‌های html چندان اهمیتی ندارند، چرا که در html تا از
یا

یا سایر برچسب‌های مشابه استفاده نکنیم خطوط جدید ساخته نمی‌شوند، و این کاراکترهای خط جدید که قبل و بعد از آکولاد تولید می‌شوند، باعث تفکیک کدها و خواناتر شدن آن هم می‌شوند. اما برای ساختن یک xml تمیز بهتر است که این کاراکترهای خط جدید وجود نداشته باشند. با گذاشتن خط تیره - مانع از فاصله افتادن بین خطوط می‌شویم.