<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>toml on Daan Geijs</title>
    <link>https://www.daangeijs.nl/tags/toml/</link>
    <description>Recent content in toml on Daan Geijs</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 25 Mar 2023 12:48:00 +0100</lastBuildDate><atom:link href="https://www.daangeijs.nl/tags/toml/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Exporting a .bib File from Google Scholar and Generating TOML-formatted Markdown Files</title>
      <link>https://www.daangeijs.nl/posts/bib-to-markdown/</link>
      <pubDate>Sat, 25 Mar 2023 12:48:00 +0100</pubDate>
      
      <guid>https://www.daangeijs.nl/posts/bib-to-markdown/</guid>
      <description>This post will show you how I added the publications on my website, that is generated by Hugo. I will try to provide step-by-step instructions on exporting your .bib file from Google Scholar and converting it into TOML-formatted markdown files using Python.</description>
      <content:encoded><![CDATA[<h2 id="introduction">Introduction</h2>
<p>This post will show you how I added the publications on my website, that is generated by Hugo. I will try to provide step-by-step instructions on exporting your .bib file from Google Scholar and converting it into TOML-formatted markdown files using Python.</p>
<h2 id="step-1-exporting-bib-from-google-scholar">Step 1: Exporting .bib from Google Scholar</h2>
<ol>
<li><strong>Login to Google Scholar</strong>: Head over to <a href="https://scholar.google.com/">Google Scholar</a> and sign in using your credentials.</li>
<li><strong>Access &ldquo;My Library&rdquo;</strong>: Here you will find all your saved articles and citations.</li>
<li><strong>Select Articles</strong>: Choose the articles you wish to export by ticking the checkboxes next to them.</li>
<li><strong>Click the Export Button</strong>: This button, usually represented by quotation marks, will give you different export options.</li>
<li><strong>Choose BibTeX</strong>: Select the BibTeX option to export your articles in the .bib format.</li>
<li><strong>Save the File</strong>: The BibTeX formatted content will be displayed in a new window. Copy this content and save it in a <code>.bib</code> file, for example, <code>references.bib</code>.</li>
</ol>
<h2 id="step-2-converting-bib-to-toml-formatted-markdown-with-python">Step 2: Converting .bib to TOML-formatted Markdown with Python</h2>
<p>Now that we have our .bib file, let&rsquo;s use Python to parse the file and create individual markdown files with TOML front matter.</p>
<h3 id="a-setting-up-the-environment">a. Setting Up the Environment</h3>
<p>Before delving into the code, make sure you have the required Python libraries:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install pybtex pylatexenc
</span></span></code></pre></div><h3 id="b-code-breakdown">b. Code Breakdown</h3>
<h4 id="i-key-imports">i. Key Imports:</h4>
<ul>
<li><strong>os &amp; pathlib.Path</strong>: Used for directory and file path operations.</li>
<li><strong>bibtex</strong>: To parse the .bib file.</li>
<li><strong>latex2text</strong>: From <code>pylatexenc</code>, used to convert LaTeX to Unicode.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pybtex.database.input</span> <span class="kn">import</span> <span class="n">bibtex</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pylatexenc.latex2text</span> <span class="kn">import</span> <span class="n">LatexNodes2Text</span>
</span></span></code></pre></div><h4 id="ii-latex-to-unicode-conversion">ii. LaTeX to Unicode Conversion:</h4>
<p>We&rsquo;ll use the <code>pylatexenc</code> library to easily convert LaTeX-specific text into Unicode. This is especially useful for author names, titles, or sources that might use LaTeX-style formatting.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">latex_to_unicode</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">LatexNodes2Text</span><span class="p">()</span><span class="o">.</span><span class="n">latex_to_text</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></span></code></pre></div><h4 id="iii-generating-markdown">iii. Generating Markdown:</h4>
<p>The <code>create_or_update_md</code> function will be responsible for converting each .bib entry into its markdown equivalent with TOML front matter. By default it will set the publication to <code>hidden=true</code>. When hidden the publication will not be listed as an article, but will be listed as non-clickable entry in the partial.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">create_or_update_md</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Extracting common fields</span>
</span></span><span class="line"><span class="cl">    <span class="n">key</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">key</span>
</span></span><span class="line"><span class="cl">    <span class="n">title</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;title&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">year</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;year&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">journal</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;journal&#39;</span><span class="p">,</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;booktitle&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">volume</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;volume&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">pages</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;pages&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">publisher</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;publisher&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;url&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Extracting the author list and convert it to a list of authors</span>
</span></span><span class="line"><span class="cl">    <span class="n">authors</span> <span class="o">=</span> <span class="p">[</span><span class="n">latex_to_unicode</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">author</span><span class="p">))</span> <span class="k">for</span> <span class="n">author</span> <span class="ow">in</span> <span class="n">entry</span><span class="o">.</span><span class="n">persons</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;author&#39;</span><span class="p">,</span> <span class="p">[])]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Define the path</span>
</span></span><span class="line"><span class="cl">    <span class="n">folder_path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;content/publications/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">file_path</span> <span class="o">=</span> <span class="n">folder_path</span> <span class="o">/</span> <span class="s2">&#34;index.md&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Check if file exists</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">file_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># If file doesn&#39;t exist, create a new markdown file with TOML front matter</span>
</span></span><span class="line"><span class="cl">        <span class="n">folder_path</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;+++</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;title = &#34;</span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;hidden = true</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;authors  = </span><span class="si">{</span><span class="n">authors</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;date = </span><span class="si">{</span><span class="n">year</span><span class="si">}</span><span class="s1">-01-01</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;journal = &#34;</span><span class="si">{</span><span class="n">journal</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;volume = &#34;</span><span class="si">{</span><span class="n">volume</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;pages = &#34;</span><span class="si">{</span><span class="n">pages</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;publisher = &#34;</span><span class="si">{</span><span class="n">publisher</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;url = &#34;</span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;+++</span><span class="se">\n\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Summary about </span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="s2">.&#34;</span><span class="p">)</span>
</span></span></code></pre></div><h4 id="iv-parsing--execution">iv. Parsing &amp; Execution:</h4>
<p>Here, we parse the .bib file and process each entry:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">parser</span> <span class="o">=</span> <span class="n">bibtex</span><span class="o">.</span><span class="n">Parser</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">bib_data</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_file</span><span class="p">(</span><span class="s2">&#34;resources/references.bib&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">bib_data</span><span class="o">.</span><span class="n">entries</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="n">create_or_update_md</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">main</span><span class="p">()</span>
</span></span></code></pre></div><h2 id="step-3-displaying-in-hugo">Step 3: Displaying in Hugo</h2>
<p>You will need font-awesome package, you can add this head to your partial or in a included template, but just make sure you include it somewhere.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>After running the Python script, you&rsquo;ll have a collection of markdown files ready to be displayed in Hugo. Here&rsquo;s how you can showcase them using the provided Hugo partials.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="err">$</span><span class="nx">pages</span> <span class="o">:=</span> <span class="nx">where</span> <span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">RegularPages</span> <span class="s">&#34;Section&#34;</span> <span class="s">&#34;publications&#34;</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="err">$</span><span class="nx">sortedPages</span> <span class="o">:=</span> <span class="err">$</span><span class="nx">pages</span><span class="p">.</span><span class="nx">ByDate</span><span class="p">.</span><span class="nx">Reverse</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="err">$</span><span class="nx">latestPublications</span> <span class="o">:=</span> <span class="err">$</span><span class="nx">sortedPages</span> <span class="p">|</span> <span class="nx">first</span> <span class="mi">5</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nx">div</span> <span class="nx">class</span><span class="p">=</span><span class="s">&#34;latest-publications&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">h2</span><span class="p">&gt;</span><span class="nx">Latest</span> <span class="nx">Publications</span><span class="p">&lt;</span><span class="o">/</span><span class="nx">h2</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nx">ul</span> <span class="nx">class</span><span class="p">=</span><span class="s">&#34;&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">{{</span><span class="o">-</span> <span class="k">range</span> <span class="err">$</span><span class="nx">latestPublications</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nx">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">{{</span> <span class="err">$</span><span class="nx">currentPublication</span> <span class="o">:=</span> <span class="p">.</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="p">{{</span> <span class="k">if</span> <span class="nx">ne</span> <span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">hidden</span> <span class="kc">true</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="p">=</span><span class="s">&#34;{{ .Permalink }}&#34;</span><span class="p">&gt;{{</span> <span class="p">.</span><span class="nx">Title</span> <span class="p">}}</span> <span class="p">&lt;</span><span class="nx">i</span> <span class="nx">class</span><span class="p">=</span><span class="s">&#34;fas fa-file-alt&#34;</span><span class="p">&gt;&lt;</span><span class="o">/</span><span class="nx">i</span><span class="p">&gt;&lt;</span><span class="o">/</span><span class="nx">a</span><span class="p">&gt;</span> <span class="p">({{</span> <span class="p">.</span><span class="nx">Date</span><span class="p">.</span><span class="nx">Format</span> <span class="s">&#34;2006&#34;</span> <span class="p">}})</span>
</span></span><span class="line"><span class="cl">            <span class="p">{{</span> <span class="k">else</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">            <span class="p">{{</span> <span class="p">.</span><span class="nx">Title</span> <span class="p">}}</span> <span class="p">({{</span> <span class="p">.</span><span class="nx">Date</span><span class="p">.</span><span class="nx">Format</span> <span class="s">&#34;2006&#34;</span> <span class="p">}})</span>
</span></span><span class="line"><span class="cl">            <span class="p">{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nx">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="p">{{</span> <span class="k">range</span> <span class="err">$</span><span class="nx">i</span><span class="p">,</span> <span class="err">$</span><span class="nx">author</span> <span class="o">:=</span> <span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">authors</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">                <span class="p">{{</span> <span class="k">if</span> <span class="nx">lt</span> <span class="err">$</span><span class="nx">i</span> <span class="mi">1</span> <span class="p">}}{{</span> <span class="err">$</span><span class="nx">author</span> <span class="p">}}{{</span> <span class="k">if</span> <span class="nx">lt</span> <span class="err">$</span><span class="nf">i</span> <span class="p">(</span><span class="nf">sub</span> <span class="p">(</span><span class="nx">len</span> <span class="err">$</span><span class="nx">currentPublication</span><span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">authors</span><span class="p">)</span> <span class="mi">1</span><span class="p">)</span> <span class="p">}}</span> <span class="nx">and</span> <span class="p">{{</span> <span class="nx">end</span>
</span></span><span class="line"><span class="cl">                <span class="p">}}{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">                <span class="p">{{</span> <span class="k">if</span> <span class="nx">eq</span> <span class="err">$</span><span class="nx">i</span> <span class="mi">1</span> <span class="p">}}{{</span> <span class="err">$</span><span class="nx">author</span> <span class="p">}}</span> <span class="nx">et</span> <span class="nx">al</span><span class="p">.{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">                <span class="p">{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="o">/</span><span class="nx">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="o">/</span><span class="nx">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">{{</span><span class="o">-</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="o">/</span><span class="nx">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="o">/</span><span class="nx">div</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Simply embed this partial into your desired Hugo template, and your publications will be presented.</p>
<h2 id="the-complete-python-script">The Complete Python Script:</h2>
<p>For those who want to dive straight in, here&rsquo;s the full Python script:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pybtex.database.input</span> <span class="kn">import</span> <span class="n">bibtex</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pylatexenc.latex2text</span> <span class="kn">import</span> <span class="n">LatexNodes2Text</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">re</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">latex_to_unicode</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">LatexNodes2Text</span><span class="p">()</span><span class="o">.</span><span class="n">latex_to_text</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">create_or_update_md</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Extracting common fields</span>
</span></span><span class="line"><span class="cl">    <span class="n">key</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">key</span>
</span></span><span class="line"><span class="cl">    <span class="n">title</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;title&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">year</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;year&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">journal</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;journal&#39;</span><span class="p">,</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;booktitle&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">volume</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;volume&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">pages</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;pages&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">publisher</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;publisher&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;url&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Extracting the author list and convert it to a list of authors</span>
</span></span><span class="line"><span class="cl">    <span class="n">authors</span> <span class="o">=</span> <span class="p">[</span><span class="n">latex_to_unicode</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">author</span><span class="p">))</span> <span class="k">for</span> <span class="n">author</span> <span class="ow">in</span> <span class="n">entry</span><span class="o">.</span><span class="n">persons</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;author&#39;</span><span class="p">,</span> <span class="p">[])]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Define the path</span>
</span></span><span class="line"><span class="cl">    <span class="n">folder_path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;content/publications/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">file_path</span> <span class="o">=</span> <span class="n">folder_path</span> <span class="o">/</span> <span class="s2">&#34;index.md&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Check if file exists</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">file_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># If file doesn&#39;t exist, create a new markdown file with TOML front matter</span>
</span></span><span class="line"><span class="cl">        <span class="n">folder_path</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;+++</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;title = &#34;</span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;hidden = true</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;authors  = </span><span class="si">{</span><span class="n">authors</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;date = </span><span class="si">{</span><span class="n">year</span><span class="si">}</span><span class="s1">-01-01</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;journal = &#34;</span><span class="si">{</span><span class="n">journal</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;volume = &#34;</span><span class="si">{</span><span class="n">volume</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;pages = &#34;</span><span class="si">{</span><span class="n">pages</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;publisher = &#34;</span><span class="si">{</span><span class="n">publisher</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;url = &#34;</span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s1">&#34;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&#34;+++</span><span class="se">\n\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Summary about </span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="s2">.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_author_list</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="s1">&#39;author&#39;</span> <span class="ow">in</span> <span class="n">entry</span><span class="o">.</span><span class="n">persons</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">authors</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">persons</span><span class="p">[</span><span class="s1">&#39;author&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">author_str</span> <span class="o">=</span> <span class="s1">&#39; and &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">author</span><span class="p">)</span> <span class="k">for</span> <span class="n">author</span> <span class="ow">in</span> <span class="n">authors</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">latex_to_unicode</span><span class="p">(</span><span class="n">author_str</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s1">&#39;&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">update_field</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># If the field exists, update it. If not, just return the content as is.</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">field</span><span class="si">}</span><span class="s2">:&#34;</span> <span class="ow">in</span> <span class="n">content</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">content</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">field</span><span class="si">}</span><span class="s1">:.*&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">field</span><span class="si">}</span><span class="s1">: &#34;</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s1">&#34;&#39;</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">content</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">parser</span> <span class="o">=</span> <span class="n">bibtex</span><span class="o">.</span><span class="n">Parser</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">bib_data</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_file</span><span class="p">(</span><span class="s2">&#34;resources/references.bib&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">bib_data</span><span class="o">.</span><span class="n">entries</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="n">create_or_update_md</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">main</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
  </channel>
</rss>
