<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Rushi Vivek</title>
    <link>https://blog.rushivivek.com</link>
    <description>Notes on building things.</description>
    <atom:link href="https://blog.rushivivek.com/feed.xml" rel="self"/>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Wed, 08 Jul 2026 05:14:14 +0000</lastBuildDate>
    <item>
      <title>Hello, calliope</title>
      <link>https://blog.rushivivek.com/hello-calliope/</link>
      <description>A first post from a static-site generator I wrote myself.</description>
      <content:encoded><![CDATA[<p>This blog is generated by <strong>calliope</strong>, a small static-site generator I wrote in
Python.<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> The whole engine is a handful of files: parse frontmatter, render
Markdown, apply a template, write HTML.</p>
<h2 id="why-build-my-own">Why build my own? <a class="header-anchor" href="#why-build-my-own">¶</a></h2>
<p>Because the engine <em>is</em> the project. A blog is a low-stakes place to own the
pipeline end to end.</p>
<p>Here's the highlight hook that wires Markdown fenced blocks to Pygments:</p>
<pre class="highlight"><code><span class="k">def</span><span class="w"> </span><span class="nf">_highlight</span><span class="p">(</span><span class="n">code</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">lang</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">_attrs</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="n">lexer</span> <span class="o">=</span> <span class="n">get_lexer_by_name</span><span class="p">(</span><span class="n">lang</span><span class="p">)</span> <span class="k">if</span> <span class="n">lang</span> <span class="k">else</span> <span class="n">guess_lexer</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
    <span class="n">inner</span> <span class="o">=</span> <span class="n">highlight</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">lexer</span><span class="p">,</span> <span class="n">_FORMATTER</span><span class="p">)</span>
    <span class="k">return</span> <span class="sa">f</span><span class="s1">&#39;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;</span><span class="si">{</span><span class="n">inner</span><span class="si">}</span><span class="s1">&lt;/code&gt;&lt;/pre&gt;&#39;</span>
</code></pre>
<h2 id="whats-next">What's next <a class="header-anchor" href="#whats-next">¶</a></h2>
<p>Tag pages, maybe KaTeX. Not today.</p>
<hr class="footnotes-sep" />
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>It's named after the muse of epic poetry. <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content:encoded>
      <guid isPermaLink="false">https://blog.rushivivek.com/hello-calliope/</guid>
      <pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>
