<?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>Front Matter on Natenoms Blog</title><link>https://natenom.de/tags/front-matter/</link><description>Recent content in Front Matter on Natenoms Blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright/><lastBuildDate>Sat, 20 Jan 2024 22:22:07 +0100</lastBuildDate><atom:link href="https://natenom.de/tags/front-matter/index.xml" rel="self" type="application/rss+xml"/><item><title>Und wieder ein neues Helferlein, um einfacher bloggen zu können</title><link>https://natenom.de/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/</link><pubDate>Sat, 20 Jan 2024 22:22:07 +0100</pubDate><guid>https://natenom.de/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/</guid><description><![CDATA[<p>Ich hatte bereits vor kurzem ein Helferlein beschrieben, <a  href="/2024/01/neues-helferlein-fuer-hugo-erleichtert-das-bloggen/">siehe hier</a>, das mir die &ldquo;Arbeit&rdquo; im Blog erleichtert. Doch ich hatte immer noch einige Dinge, die ich von Hand machen musste und die mich immer wieder genervt hatten. Und wenn genervt ist von Dingen, dann macht man sie weniger wahrscheinlich. Daher habe ich meinen Hugo Helper noch etwas erweitert, um noch weniger manuell machen zu müssen.</p>]]></description><content:encoded><![CDATA[<p>Ich hatte bereits vor kurzem ein Helferlein beschrieben, <a  href="/2024/01/neues-helferlein-fuer-hugo-erleichtert-das-bloggen/">siehe hier</a>, das mir die &ldquo;Arbeit&rdquo; im Blog erleichtert. Doch ich hatte immer noch einige Dinge, die ich von Hand machen musste und die mich immer wieder genervt hatten. Und wenn genervt ist von Dingen, dann macht man sie weniger wahrscheinlich. Daher habe ich meinen Hugo Helper noch etwas erweitert, um noch weniger manuell machen zu müssen.</p>
<p>Angenommen, ich wollte ein paar Bilder in einem Blogbeitrag unterbringen. Die Bilder, die ich ins Page Bundle kopiert hatte, konnte ich über einen Rechtsklick über ein eigenes Script verkleinern. Über ein weiteres Script musste ich auch wieder per Rechtsklick alle Metadaten entfernen und dabei entscheiden, ob ich das Script nutze, das alle Daten entfernt oder das Script, das nur die entfernt, die nicht relevant für Fotos sind. Im Fall von 360 ° Fotos müssen bestimmte Metadaten nämlich erhalten bleiben, da sonst der Betrachter hier im Blog nicht funktioniert, <a  href="/2023/09/viewer-fuer-360-grad-fotos-im-blog-verbessert/#metadaten--so-wichtig-f%c3%bcr-unvollst%c3%a4ndige-panoramen">siehe hier</a>.</p>

<h2 id="hugo-helper-erweitert" data-numberify>Hugo Helper erweitert<a class="anchor ms-1" href="#hugo-helper-erweitert"></a></h2>
<p>Diese beschriebenen Schritte erledigt jetzt mein Hugo Helper automatisch. Ich muss nur weiterhin die Bilder in das Page Bundle (ein Verzeichnis, das den Blogbeitrag und alle zugehörigen Dateien beinhaltet), benennen und führe irgendwann nur noch meinen Hugo Helper aus, der die folgenden Dinge macht:</p>
<ul>
<li>Alle Bilder in 4000x4000 Pixel herunterskalieren, wenn sie größer sind.</li>
<li>Beinhaltet der Dateiname die Zeichenkette <code>2k</code>, dann wird auf 2000x2000 Pixel herunterskaliert. Das hat den Hintergrund, dass nicht alle Fotos die volle Auflösung haben müssen, wenn es z. B. nicht um Fotografie geht.</li>
<li>Enthält der Dateiname den String &ldquo;pano&rdquo; oder &ldquo;sphere&rdquo; (360°-Foto) wird die Auflösung nicht verringert.</li>
<li>Alle Bilder werden nach .webp konvertiert.</li>
<li>Die alten Bilder werden in ein temporäres Verzeichnis außerhalb des Blog-Verzeichnisses verschoben, statt direkt gelöscht zu werden, falls etwas schiefgehen sollte.</li>
<li>Die Exifdaten aller Fotos und Videos werden gelöscht bis auf für Fotografie relevante Daten.</li>
<li>Enthält der Dateiname den String <code>sphere</code>, dann werden auch die dafür relevanten Exifdaten in der Datei belassen (siehe oben).</li>
</ul>

<h2 id="neuer-workflow-für-blogbeiträge" data-numberify>Neuer Workflow für Blogbeiträge<a class="anchor ms-1" href="#neuer-workflow-für-blogbeiträge"></a></h2>
<p>Somit ergibt sich für neue Blogbeiträge der folgende, sehr einfache Ablauf:</p>
<ul>
<li><code>hgb -cpb &quot;Ich habe eine neue Idee für einen Blogbeitrag&quot;</code></li>
<li>NeoVimm starten und Verzeichnis des neuen Blogbeitrags öffnen</li>
<li>Mit <code>&lt;Leader&gt;nd</code> (eigenes Keybinding) das Verzeichnis in Dolphin öffnen.</li>
<li>In Dolphin die Dateien reinwerfen, die ich gerne verewenden möchte, richtig benennen, ggf auf oben genannte Substrings achten und im Blogbeitrag mit einem eigenen Shortcode <code>figure</code> einbetten.</li>
<li>Blogbeitrag schreiben.</li>
<li>Wenn ich fertig bin, <code>hgb -hs</code> aufrufen und im Browser <code>http://localhost:1313</code> aufrufen, Ergebnis überprüfen.</li>
<li>Wenn das Ergebnis mir gefällt, dann kann ich noch im FrontMatter das aktuelle Datum einfügen, das Tag <code>draft</code> auf <code>false</code> setzen oder die ganze Zeile löschen und in NeoVim <code>&lt;Leader&gt;gg</code> drücken und damit LazyGit aufrufen, commiten und pushen.</li>
</ul>
<p>Fertig. ☺️</p>
<p>Und hier noch ein Screenshot dieses Blogbeitrags im Zen-Mode:</p>
 <figure class="image-caption"><a href="/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover.webp"><picture>
                <source type="image/webp" srcset="/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover_hueb4e7b7046bca8ff3686b8be239c22ea_99862_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover_hueb4e7b7046bca8ff3686b8be239c22ea_99862_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover_hueb4e7b7046bca8ff3686b8be239c22ea_99862_816x0_resize_q95_h2_catmullrom_2.webp 816w, /2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover_hueb4e7b7046bca8ff3686b8be239c22ea_99862_1632x0_resize_q95_h2_catmullrom_2.webp 1632w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px" />
                <img alt="" srcset="/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover_hueb4e7b7046bca8ff3686b8be239c22ea_99862_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover_hueb4e7b7046bca8ff3686b8be239c22ea_99862_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover_hueb4e7b7046bca8ff3686b8be239c22ea_99862_816x0_resize_q95_h2_catmullrom_2.webp 816w,/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover_hueb4e7b7046bca8ff3686b8be239c22ea_99862_1632x0_resize_q95_h2_catmullrom_2.webp 1632w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px"
                     src="/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover_hueb4e7b7046bca8ff3686b8be239c22ea_99862_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="472" /></picture></a></figure>]]></content:encoded><enclosure url="https://natenom.de/2024/01/und-wieder-ein-neues-helferlein-um-einfacher-bloggen-zu-koennen/2024-01-20-screenshot-zen-mode-neovim-cover.webp" length="99862" type="image/webp"/></item><item><title>Mein Hugo Helper Python Script und was es tun kann</title><link>https://natenom.de/2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/</link><pubDate>Tue, 09 Jan 2024 21:51:16 +0100</pubDate><guid>https://natenom.de/2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/</guid><description>&lt;p>Alle meine Webseiten werden mit Hilfe von Hugo statisch generiert. Für die Arbeit mit Hugo nutze ich schon länger ein eigenes Python-Script, das mir einige Arbeit abnimmt.&lt;/p>
&lt;p>Vor ein paar Tagen hat mich jemand gefragt, ob ich das Script nicht öffentlich machen könnte und ich habe das zum Anlass genommen, da mal einige Dinge zu verschönern, damit auch andere Menschen damit etwas anfangen können.&lt;/p></description><content:encoded><![CDATA[<p>Alle meine Webseiten werden mit Hilfe von Hugo statisch generiert. Für die Arbeit mit Hugo nutze ich schon länger ein eigenes Python-Script, das mir einige Arbeit abnimmt.</p>
<p>Vor ein paar Tagen hat mich jemand gefragt, ob ich das Script nicht öffentlich machen könnte und ich habe das zum Anlass genommen, da mal einige Dinge zu verschönern, damit auch andere Menschen damit etwas anfangen können.</p>
<div class="shortcode-notice warnung">
    <div class="shortcode-notice-title warnung">
        Warnung</div>
    <div class="notice-content"><p>Ich bin kein Programmierer und das Script hat vermutlich eine eher schlechte Qualität. Aber das stört mich nicht, denn es funktioniert (für mich).</p>
<p>Wenn es andere Menschen für sich nutzen können, dann ist das großartig. Wenn nicht, dann ist es auch okay.</p>
</div>
</div>


<p>Zur Installation des Scripts bitte in die <code>README.md</code> des Projekts schauen.</p>

<h2 id="konfiguration" data-numberify>Konfiguration<a class="anchor ms-1" href="#konfiguration"></a></h2>
<p>In der Konfigurationsdatei <code>~/.config/hgh/hgh.json</code> gibt es einen Abschnitt für allgemeine Einstellungen und dann je einen Abschnitt pro Website, die mit hgh verwaltet werden soll.</p>
<p>Hier ist hinterlegt, welcher Editor verwendet werden soll, wo die Basisverzeichnisse der Websites liegen, wo die <code>content</code>-Verzeichnisse, welcher Benutzernamen für rsync verwendet werden soll, usw.</p>

<h2 id="ein-alias-macht-das-leben-einfacher" data-numberify>Ein Alias macht das Leben einfacher<a class="anchor ms-1" href="#ein-alias-macht-das-leben-einfacher"></a></h2>
<p>Damit ich nicht dauernd <code>hgh.py --site blog</code> tippen muss, habe ich für jede meiner Websites in der <code>.bashrc</code> einen Alias erstellt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>alias hgb<span style="color:#f92672">=</span><span style="color:#e6db74">`</span>hgh.py --site blog<span style="color:#e6db74">`</span>
</span></span><span style="display:flex;"><span>alias hgw<span style="color:#f92672">=</span><span style="color:#e6db74">`</span>hgh.py --site wiki<span style="color:#e6db74">`</span>
</span></span></code></pre></div><p>Somit kann ich z. B. mittels <code>hgb -cdb</code> ins Basisverzeichnis des Blogs wechseln.</p>

<h2 id="was-der-hugo-helper-hgh-für-mich-macht" data-numberify>Was der Hugo Helper (hgh) für mich macht<a class="anchor ms-1" href="#was-der-hugo-helper-hgh-für-mich-macht"></a></h2>

<h3 id="allgemeine-infos" data-numberify>Allgemeine Infos<a class="anchor ms-1" href="#allgemeine-infos"></a></h3>
<p>Mit <code>--help</code> gibt es eine hoffentlich hilfreiche Hilfe. 😁</p>
<p>Mit <code>hgh.py --sites</code> bekomme ich eine Liste aller Websites und der zugehörigen Basisverzeichnisse. Mit <code>--printconfig</code> wird die ganze Konfiguration ausgegeben.</p>

<h3 id="verzeichniswechsel" data-numberify>Verzeichniswechsel<a class="anchor ms-1" href="#verzeichniswechsel"></a></h3>
<p>Mit <code>-cdb</code> kann ich ins Basisverzeichnis einer Website wechseln, mit <code>-cdc</code> ins normale Content-Verzeichnis und mit <code>-cdl</code> in ein alternatives Content-Verzeichnis.</p>
<p>Letzeres nutze ich für verschiedene Blogbeiträge im Entwurfsmodus. Denn mein Blog besteht aus mehreren tausend Blogbeiträgen und das Bauen dauert sehr lange. Zum Schreiben von längeren Blogbeiträgen nutze ich dieses Verzeichnis und das Bauen dauert dann nur wenige Sekunden.</p>

<h3 id="kommentar-datei" data-numberify>Kommentar-Datei<a class="anchor ms-1" href="#kommentar-datei"></a></h3>
<p>Für Kommentare im Blog nutze mittlerweile eine eigene Implementation, bei der die Kommentare im Page Bundle innerhalb der Datei <code>comments.json</code> stehen.</p>
<p>Mit <code>hgh.py --site blog --create-comments-file</code> wird im aktuellen Verzeichnis eine <code>comments.json</code>-Datei erstellt, die bereits ein Skelett für einen Kommentar enthält. Dazu wird die Info ausgegeben, dass man noch im Front Matter <code>jsoncomments: true</code> eintragen muss. Da es hier im Blog nur sehr selten Kommentare gibt, vergesse ich das sonst und will auch nicht jedes Mal nachschauen, wie die Syntax eines Kommentars ist.</p>

<h3 id="neuer-blogbeitrag" data-numberify>Neuer Blogbeitrag<a class="anchor ms-1" href="#neuer-blogbeitrag"></a></h3>
<p>Diese Funktion nutze ich nur für meinen Blog und kann mit einem kurzen <code>hgb --create &quot;Ein neuer Blogbeitrag bla blub&quot;</code> gleich mehrere Aufgaben automatisieren:</p>
<ul>
<li>benötigte Verzeichnisse erstellen</li>
<li>Slug aus dem angegebenen Titel erzeugen</li>
<li>Page Bundle erstellen</li>
<li>Markdown-Datei für den Blogbeitrag erstellen und mit einem Template befüllen</li>
</ul>
<p>Details dazu, was alles gemacht wird, gibt es <a  href="/2024/01/neues-helferlein-fuer-hugo-erleichtert-das-bloggen/">in diesem Blogbeitrag</a>.</p>
<p>In der aktuellen Version des Scripts kann ich auch noch mit <code>--template</code> angeben, welches Template verwendet werden soll.</p>
<p>Mit <code>hgh.py --list-templates</code> wird eine Liste aller vorhandenen Templates angezeigt.</p>
<p>Wer das benutzen will, muss den Code dafür im Script anpassen, um alle notwendigen Variablen auch zu befüllen.</p>

<h3 id="tmux" data-numberify>Tmux<a class="anchor ms-1" href="#tmux"></a></h3>
<p>Bevor ich VSCode für die Bearbeitung meiner Websites nutzte, habe ich dafür den micro-Editor auf der Kommandozeile benutzt. Aus dieser Zeit stammt <code>--tmux</code>, das ein bestimmtes Layout in Tmux startet. Das habe ich aber schon länger nicht mehr verwendet und man müsste es für sich anpassen.</p>

<h3 id="lokale-vorschau-einer-website" data-numberify>Lokale Vorschau einer Website<a class="anchor ms-1" href="#lokale-vorschau-einer-website"></a></h3>
<p>Mittels <code>--hugo-server</code> wird der Blog lokal gebaut und auf dem einstellbaren Port zugänglich gemacht. Für das alternative Content-Verzeichnis gibt es <code>--hugo-server-light</code>.</p>
<p>Dazu kann man noch <code>--hugo-server-env</code> angeben, mit dem sich einstellen lässt, welche Umgebung Hugo verwendet. Default hier ist <code>development</code>. Ich nutze diese Funktion, um den umfangreichen Blog testweise so zu bauen, dass nur die Blogbeiträge der letzten Monate enthalten sind, was dann statt 35 Sekunden (für den gesamten Blog) nur ca. 3 Sekunden dauert.</p>

<h3 id="tags-kategorien-und-deren-häufigkeit" data-numberify>Tags, Kategorien und deren Häufigkeit<a class="anchor ms-1" href="#tags-kategorien-und-deren-häufigkeit"></a></h3>
<p>Was mir am Anfang bei Hugo im Vergleich zu WordPress sehr gefehlt hat, waren die Vorschläge für zu verwendende Tags und Kategorien in einem neuen Blogbeitrag.</p>
<p>Hierfür muss man mit dem Hugo Helper eine kleine &ldquo;Datenbank&rdquo; erstellen lassen. Dazu wird mit Hilfe von <code>find</code> und dem Tool <code>yq</code> je eine Liste aller bisher verwendeten Tags und Kategorien erstellt und dazu auch die Häufigkeit der Verwendung angegeben.</p>
<p>Diese &ldquo;Datenbank&rdquo; erstellt man mit <code>hgh.py --site blog --create-tags-categories-caches</code> und das dauert ein paar Sekunden. Im Ergebnis werden innerhalb von <code>~/.cache/hgh/</code> für jede Website zwei Dateien erzeugt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>&gt; ls -1 .cache/hgh/
</span></span><span style="display:flex;"><span>natenom.de_categories.list
</span></span><span style="display:flex;"><span>natenom.de_tags.list
</span></span></code></pre></div><p>Ein Auszug aus den Tags:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[…]
</span></span><span style="display:flex;"><span>8:F-Droid
</span></span><span style="display:flex;"><span>1:FLAC
</span></span><span style="display:flex;"><span>4:Facebook
</span></span><span style="display:flex;"><span>1:Fahrbahn
</span></span><span style="display:flex;"><span>556:Fahrrad
</span></span><span style="display:flex;"><span>52:Fahrradanhänger
</span></span><span style="display:flex;"><span>1:Fahrradbubble
</span></span><span style="display:flex;"><span>22:Fahrradcomputer
</span></span><span style="display:flex;"><span>6:Fahrradmordor
</span></span><span style="display:flex;"><span>6:Fahrradparkplätze
</span></span><span style="display:flex;"><span>2:Fahrradstaffel
</span></span><span style="display:flex;"><span>1:Fahrräder
</span></span><span style="display:flex;"><span>10:Falschparker
</span></span><span style="display:flex;"><span>[…]
</span></span></code></pre></div><p>Um nicht manuell in den &ldquo;Datenbanken&rdquo; herumstöbern zu müssen, gibt es <code>--find-tags xyz</code> und <code>--find-categories xyz</code> bzw. die Kurzformen <code>-ft xyz</code> und <code>-fc xyz</code>. Man kann reguläre Ausdrücke verwenden.</p>
<p>Führt man diese aus, wird das Tool <code>fzf</code> (Fuzzy Find) benutzt, um die Liste anzuzeigen und darin suchen zu können:</p>

<figure class="shortcode-video">
    <video preload="metadata" controls>
    <source src="2024-01-06-hugo-searchtag.mp4" type="video/mp4" poster="">
    Your browser does not seem to support video.
    </video>

<figcaption>Mittels fzf kann man in der Liste der Tags suchen. Die Anzahl der Verwendung wird auch angezeigt. (<a href="2024-01-06-hugo-searchtag.mp4">Link zum Video</a>)</figcaption>
</figure>

<div class="shortcode-notice hinweis">
    <div class="shortcode-notice-title hinweis">
        Hinweis</div>
    <div class="notice-content">Ab und zu muss man die Datenbanken neu erstellen lassen, da sonst Tags und Kategorien neuer Blogbeiträge nicht enthalten sind.</div>
</div>


<div class="shortcode-notice hinweis">
    <div class="shortcode-notice-title hinweis">
        Hinweis</div>
    <div class="notice-content">Ich weiß, dass es für VSCode z. B. das Plugin FrontMatter gibt, das genau diese Funktionialität liefert. Ich möchte jedoch kein riesiges Plugin mit tausenden anderen Funktionen nutzen, wenn es auch einfacher geht. Und wer weiß, ob ich in x Zeit immer noch mit VSCode arbeiten werde.</div>
</div>



<h3 id="alles-andere-finden" data-numberify>Alles andere finden<a class="anchor ms-1" href="#alles-andere-finden"></a></h3>
<p>Mittlerweile nutze ich zum Auffinden von Blogbeitragen die Tastenkombination <code>Strg + Shift + f</code> in VSCode. Aber früher brauchte ich dafür etwas Eigenes.</p>
<p>Hierfür gibt es zwei Varianten.</p>

<h4 id="einfache-variante" data-numberify>Einfache Variante<a class="anchor ms-1" href="#einfache-variante"></a></h4>
<p>Mittels <code>--find xyz</code> bzw. der Kurzform <code>-f xyz</code> wird einfach nur rekursiv nach xyz im Content-Verzeichnis der angegebenen Website gegrept und es gibt eine farbige Ausgabe mit Dateinamen und der zum Suchbegriff passenden Zeile. Groß- und Kleinschreibung werden dabei nicht ignoriert.</p>
<p>Hier z. B. das Ergebnis für die Suche nach <code>^hugo</code>. Das ist ein Regulärer Ausdruck, der nur auf Zeilen passt, in denen <code>hugo</code> am Anfang der Zeile steht:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>posts/2022/2022-02-18-mein-workflow-mit-hugo/index.md:130:1:hugo server -E -D -F -v -c /home/hugo-light/content/
</span></span><span style="display:flex;"><span>posts/2022/2022-02-27-hugo-theme-optimiert-zeit-zum-rendern-massiv-verringert.md:24:1:hugo --templateMetrics --templateMetricsHints --gc --minify &gt; hugo-metric_0.txt
</span></span><span style="display:flex;"><span>posts/2022/2022-02-06-ich-mache-wieder-einen-linkdump-woechentlich/index.md:64:1:hugo new -k linkdump posts/2022-02-linkdump-kw-6-2022
</span></span><span style="display:flex;"><span>posts/2022/2022-03-19-umzug-dokuwiki-hugo-3-einrichtung/index.md:29:1:hugo new site wiki.natenom.com
</span></span><span style="display:flex;"><span>posts/2022/2022-02-03-umzug-von-wordpress-zu-hugo-1/index.md:310:1:hugo server --renderToDisk -D -E -F -v
</span></span><span style="display:flex;"><span>posts/2022/2022-02-13-weiterleitungen-auf-umlaut-urls/index.md:55:1:hugo-search-tags -E &#34;(ä|ö|ü|ß)&#34; | cut -d&#39;:&#39; -f2 &gt; /tmp/umlaut-urls-hugo.txt
</span></span></code></pre></div><p>So kann ich z. B. sehr einfach alle Blogbeiträge anzeigen lassen, die ein bestimmtes Tag oder eine Kategorie verwenden, hier z. B. &ldquo;Linux&rdquo;, in dem ich den Regulären Ausdruck <code>hgb -f &quot;^\W+- Linux&quot;</code> nutze, der auf Zeilen passt, die am Zeilenanfang beliebig viele Leerzeichen enthalten, gefolgt von <code>- Linux</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[…]
</span></span><span style="display:flex;"><span>posts/2013/2013-06-27-alle-videos-eines-youtube-kanals-auf-einmal-herunterladen-mit-youtube-dl.md:7:1:  - Linux
</span></span><span style="display:flex;"><span>posts/2018/2018-11-12-mit-fensterregeln-in-plasma5-kde-bestimmte-fenster-beim-task-switcher-und-anderen-effekten-ignorieren.md:13:1:  - Linux
</span></span><span style="display:flex;"><span>posts/2013/2013-08-15-neuer-versuch-mit-kde-sc.md:11:1:  - Linux
</span></span><span style="display:flex;"><span>[…]
</span></span></code></pre></div>
<h4 id="erweiterte-variante" data-numberify>Erweiterte Variante<a class="anchor ms-1" href="#erweiterte-variante"></a></h4>
<p>Mittels <code>--find-fuzzy xyz</code> bzw. der Kurzform <code>-ff xyz</code> wird die Ausgabe der oben gezeigten einfachen Variante zusätzlich an <code>fzf</code> übergeben, sodass man darin suchen kann, eine Vorschau der Datei angezeigt bekommt und durch Drücken von <code>F4</code> die Datei direkt im Editor öffnen kann, den man in der Konfiguration in <code>bin_editor</code> eingestellt hat.</p>
<p>Auch hier kann man reguläre Ausdürcke verwenden, z. B. <code>-ff &quot;Markdown.*kate&quot;</code></p>
 <figure class="image-caption"><a href="2024-01-09-beispiel-hgh-ff-cover.webp"><picture>
                <source type="image/webp" srcset="/2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/2024-01-09-beispiel-hgh-ff-cover_hub930d5896ab04f44420e5ef9ccf62eb9_74206_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/2024-01-09-beispiel-hgh-ff-cover_hub930d5896ab04f44420e5ef9ccf62eb9_74206_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/2024-01-09-beispiel-hgh-ff-cover_hub930d5896ab04f44420e5ef9ccf62eb9_74206_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/2024-01-09-beispiel-hgh-ff-cover_hub930d5896ab04f44420e5ef9ccf62eb9_74206_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/2024-01-09-beispiel-hgh-ff-cover_hub930d5896ab04f44420e5ef9ccf62eb9_74206_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/2024-01-09-beispiel-hgh-ff-cover_hub930d5896ab04f44420e5ef9ccf62eb9_74206_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/2024-01-09-beispiel-hgh-ff-cover_hub930d5896ab04f44420e5ef9ccf62eb9_74206_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="623" /></picture></a></figure>

<h3 id="website-bauen-und-hochladen" data-numberify>Website bauen und hochladen<a class="anchor ms-1" href="#website-bauen-und-hochladen"></a></h3>
<p>Mit <code>hgh.py --site blog --build</code> wird mein Blog lokal gebaut, sodass ich ihn nach einer kurzen Prüfung mit <code>hgh.py --site blog --upload</code> hochladen kann.</p>
<p>Wenn ich mir sicher bin, kann ich auch beide Schritte vereinen mit <code>hgh.py --site blog --deploy</code>.</p>

<h2 id="hugo-helper-herunterladen" data-numberify>Hugo Helper herunterladen<a class="anchor ms-1" href="#hugo-helper-herunterladen"></a></h2>
<p>Das Hugo Helper Script gibt es <a  class='urlextern'  href="https://code.cozy.town/natenom/hgh">hier</a>.</p>
<p>Viel Spaß damit. Oder eben nicht. ☺️</p>]]></content:encoded><enclosure url="https://natenom.de/2024/01/mein-hugo-helper-python-script-und-was-es-tun-kann/2024-01-09-beispiel-hgh-ff-cover.webp" length="74206" type="image/webp"/></item><item><title>Neues Helferlein für Hugo erleichtert das Bloggen</title><link>https://natenom.de/2024/01/neues-helferlein-fuer-hugo-erleichtert-das-bloggen/</link><pubDate>Fri, 05 Jan 2024 20:36:47 +0100</pubDate><guid>https://natenom.de/2024/01/neues-helferlein-fuer-hugo-erleichtert-das-bloggen/</guid><description>&lt;p>Ich habe hier seit Anfang Dezember nichts mehr im Blog geschrieben und das liegt unter anderem daran, dass der Start eines Blogbeitrags immer etwas umständlich war.&lt;/p>
&lt;p>Das habe ich jetzt mit einem Script automatisiert und kann direkt mit dem Schreiben beginnen, statt die verschiedenen Dinge im Voraus manuell machen zu müssen.&lt;/p></description><content:encoded><![CDATA[<p>Ich habe hier seit Anfang Dezember nichts mehr im Blog geschrieben und das liegt unter anderem daran, dass der Start eines Blogbeitrags immer etwas umständlich war.</p>
<p>Das habe ich jetzt mit einem Script automatisiert und kann direkt mit dem Schreiben beginnen, statt die verschiedenen Dinge im Voraus manuell machen zu müssen.</p>
<p>Das Script rufe ich z. B. so auf:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>hgb --create <span style="color:#e6db74">&#34;Neues Helferlein für Hugo erleichtert das Bloggen&#34;</span>
</span></span></code></pre></div>
<h2 id="das-script" data-numberify>Das Script<a class="anchor ms-1" href="#das-script"></a></h2>
<p>Das Script macht folgende Arbeiten für mich:</p>

<h3 id="verzeichnisse-erstellen" data-numberify>Verzeichnisse erstellen<a class="anchor ms-1" href="#verzeichnisse-erstellen"></a></h3>
<p>Innerhalb des <code>content</code> Verzeichnisses von Hugo legt es, wenn noch nicht vorhanden, alle Überverzeichnisse für Jahr und Monat an.</p>
<p>Da dies der erste Beitrag in diesem Jahr ist, hat das Script die Verzeichnisstruktur in <code>…/content/posts/</code> erstellt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>2024/
</span></span><span style="display:flex;"><span>    01/
</span></span></code></pre></div>
<h3 id="slug-erzeugen" data-numberify>Slug erzeugen<a class="anchor ms-1" href="#slug-erzeugen"></a></h3>
<p>Der Slug ist ein Teil der späteren URL. Bei mir im Blog besteht die endgültige URL eines Blogbeitrags z. B. aus <code>https://natenom.de/JAHR/MONAT/SLUG/</code>.</p>
<p>Das Script erzeugt den Slug automatisch aus dem angegebenen Titel für den neuen Blogbeitrag. Dabei werden folgende Aufgaben erledigt:</p>
<ul>
<li>Der Slug wird auf xx Zeichen verkürzt.</li>
<li>Großschreibung wird in Kleinschreibung umgewandelt.</li>
<li>Leerzeichen werden durch Bindestriche ersetzt.</li>
<li>Umlaute werden durch Entsprechungen wie z. B. <code>ae</code> oder <code>ss</code> ersetzt.</li>
<li>Alle verbleibenden Zeichen, die nicht alphanumerisch und keine Bindestriche sind, werden entfernt.</li>
</ul>

<h3 id="page-bundle" data-numberify>Page Bundle<a class="anchor ms-1" href="#page-bundle"></a></h3>
<p>Innerhalb der bereits erstellten Verzeichnisstruktur für Jahr und Monat (siehe oben) wird nun ein Page Bundle erstellt. Der Verzeichnisname besteht aus dem aktuellen Datum und dem Slug. Hier z. B.:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>2024-01-05-neues-helferlein-fuer-hugo-erleichtert-das-bloggen/
</span></span></code></pre></div>
<h3 id="datei-indexmd" data-numberify>Datei index.md<a class="anchor ms-1" href="#datei-indexmd"></a></h3>
<p>In dem erstellten Page Bundle wird nun die Datei <code>index.md</code> aus einem eigenen Template generiert, in welchem die Metadaten <code>title</code>, <code>slug</code> und <code>date</code> im Front Matter eingefügt werden. Die anderen Metadaten wie Kategorien und Tags fülle ich manuell aus.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">title</span>: <span style="color:#e6db74">&#34;Neues Helferlein für Hugo erleichtert das Bloggen&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">slug</span>: <span style="color:#ae81ff">neues-helferlein-fuer-hugo-erleichtert-das-bloggen</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">author</span>: <span style="color:#ae81ff">Natenom</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">date</span>: <span style="color:#e6db74">2024-01-05T20:25:55</span><span style="color:#ae81ff">+01</span>:<span style="color:#ae81ff">00</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">categories</span>:
</span></span><span style="display:flex;"><span>  -
</span></span><span style="display:flex;"><span><span style="color:#f92672">tags</span>:
</span></span><span style="display:flex;"><span>  -
</span></span><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">&lt;!--more--&gt;</span>
</span></span></code></pre></div>
<h2 id="nächster-schritt" data-numberify>Nächster Schritt<a class="anchor ms-1" href="#nächster-schritt"></a></h2>
<p>Das Script zeigt nun ein paar Infos an und auch, wie ich die Datei direkt in VSCode öffnen kann, weil ich das fürs Schreiben in Markdown verwende:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Page Bundle erfolgreich erstellt:
</span></span><span style="display:flex;"><span>        Template: default
</span></span><span style="display:flex;"><span>        Slug: neues-helferlein-fuer-hugo-erleichtert-das-bloggen
</span></span><span style="display:flex;"><span>        Verzeichnis: /…/content/posts/2024/01/2024-01-05-neues-helferlein-fuer-hugo-erleichtert-das-bloggen
</span></span><span style="display:flex;"><span>Hinweise:
</span></span><span style="display:flex;"><span>        Pfad zur Datei in Zwischenablage eingefügt. In VSCodium öffnen mit &#39;Strg + o&#39; und einfügen, Leerzeichen am Ende entfernen. (Das Leerzeichen am Ende kommt von VSCode.)
</span></span></code></pre></div>
<h2 id="blogbeitrag-schreiben" data-numberify>Blogbeitrag schreiben<a class="anchor ms-1" href="#blogbeitrag-schreiben"></a></h2>
<p>Nun kann ich im bereits geöffneten VSCode die Tastenkombinatin <code>Strg + o</code> drücken, gefolgt von <code>Strg + v</code>, muss noch das Leerzeichen entfernen, das VSCode ans Ende angefügt hat, drücke Enter und kann anfangen, den Blogbeitrag zu schreiben.</p>

<h2 id="passt" data-numberify>Passt<a class="anchor ms-1" href="#passt"></a></h2>
<p>So soll das sein. Wenn ich in Zukunft eine Idee habe, kann ich sofort anfangen, zu schreiben und bin nicht erst noch abgelenkt von den vielen verschiedenen Aufgaben, um die Datei für den Blogbeitrag erst noch erstellen zu müssen.</p>
<p>Das hat jetzt auch sehr gut funktioniert.</p>]]></content:encoded></item><item><title>Kommentarfunktion via Isso für meinen Blog</title><link>https://natenom.de/2023/08/kommentarfunktion-via-isso-fuer-meinen-blog/</link><pubDate>Sat, 12 Aug 2023 20:38:03 +0200</pubDate><guid>https://natenom.de/2023/08/kommentarfunktion-via-isso-fuer-meinen-blog/</guid><description><![CDATA[<p>Dank Isso ist es nun möglich, Kommentare hier im Blog zu schreiben. Zur Installation von Isso schreibe ich hier nichts, da gibt es eine gute Anleitung auf der Projektseite, aber ich schreibe etwas zur Motivation und zur Benutzung.</p>
<p>Vor einiger Zeit hatte ich hier schon einmal die <a  href="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/">Möglichkeit erläutert, Kommentare zu schreiben</a>, obwohl das hier eine statische Website ist, die mit Hugo betrieben wird.</p>]]></description><content:encoded><![CDATA[<p>Dank Isso ist es nun möglich, Kommentare hier im Blog zu schreiben. Zur Installation von Isso schreibe ich hier nichts, da gibt es eine gute Anleitung auf der Projektseite, aber ich schreibe etwas zur Motivation und zur Benutzung.</p>
<p>Vor einiger Zeit hatte ich hier schon einmal die <a  href="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/">Möglichkeit erläutert, Kommentare zu schreiben</a>, obwohl das hier eine statische Website ist, die mit Hugo betrieben wird.</p>
<h2 id="wozu-überhaupt-kommentare" data-numberify>Wozu überhaupt Kommentare?<a class="anchor ms-1" href="#wozu-überhaupt-kommentare"></a></h2>
<p>Wenn ich einen Blogbeitrag auf Social Media verlinke, bekomme ich dort Rückmeldungen dazu. Diese sind aber nur im Kontext Social Media zu finden und nicht, wenn man Blogbeiträge im Browser liest.</p>

<h2 id="nicht-gut--kommentare-via-fediversemastodon" data-numberify>Nicht gut – Kommentare via Fediverse/Mastodon<a class="anchor ms-1" href="#nicht-gut--kommentare-via-fediversemastodon"></a></h2>
<p>Letztes Jahr hatte ich bereits Kommentare via Mastodon bzw. dem Fediverse ermöglicht, was jedoch ein paar Nachteile hatte. Hauptsächlich war es umständlich, denn ich musste für jeden Blogbeitrag, für den Kommentare möglich sein sollten, einen Toot auf Mastodon erstellen und darin den Blogbeitrag verlinken. Dann im Front Matter (Header des Blogbeitrags) die URL zum Toot eintragen und den Blog neu generieren. Das hatte ich dann auch nur ein paar Mal gemacht.</p>
<p>Weitere Nachteile:</p>
<ul>
<li>Keine Moderation.</li>
<li>Nicht wirklich transparent für Menschen, die im Fediverse kommentieren. Dazu hatte ich mein Setup dann noch etwas komplizierter gestaltet, <a  href="/2022/11/transparenz-fuer-kommentare-im-blog-via-mastodon/">siehe hier</a>.</li>
<li>Dass ich meine Toots immer mal wieder lösche, war nicht gerade hilfreich.</li>
</ul>

<h2 id="besser--kommentare-via-isso" data-numberify>Besser – Kommentare via Isso<a class="anchor ms-1" href="#besser--kommentare-via-isso"></a></h2>
<p>Hingegen gibt es bei Isso, das ich jetzt verwende, einige Vorteile:</p>
<p>Vorteile für Benutzer:</p>
<ul>
<li>Für einen einstellbaren Zeitraum lassen sich bereits gesendete Kommentare vom Absender ändern. Derzeit sind das 5 Minuten.</li>
<li>Wenn die entsprechenden Cookies im Browser des Benutzers noch vorhanden sind, kann er eigene Kommentare wieder gelöscht werden.</li>
<li>Man kann auf andere Kommentare Bezug nehmen und dies ist später auch in der Struktur erkennbar.</li>
<li>Markdown kann verwendet werden.</li>
</ul>
<p>Vorteile für mich als Betreiber:</p>
<ul>
<li>Die Daten liegen auf meinem Server und ich kann sie jederzeit einfach vom Netz nehmen.</li>
<li>Die Daten liegen in einer Sqlite-Datenbank, die man einfach sichern kann.</li>
<li>Die Sqlite-Datenbank kann man direkt bearbeiten, entweder mit <code>sqlite3</code> oder mit <code>litecli</code>.</li>
<li>Es gibt keine Metadaten, die in Blogbeiträgen enthalten sind. D. h. aus Sicht von Hugo muss nur das Script zum Laden/Schreiben von Kommentaren eingebunden werden. Dadurch kann man Kommentare auch nicht über die Suche finden.</li>
<li>Es gibt eine Moderation für Kommentare. Ich kann einen Kommentar vor dem Freischalten bearbeiten.</li>
<li>Isso kann auf einem anderen Server laufen und beherrscht auch Multisite, also das Bereitstellen der Kommentarfunktion für verschiedene Websites.</li>
</ul>
<div class="shortcode-notice hinweis">
    <div class="shortcode-notice-title hinweis">
        Hinweis</div>
    <div class="notice-content"><p>Ein Nachteil ist für mich, dass jetzt wieder eine dynamische Komponente auf dem Server läuft, die für den Betrieb von <code>comments.natenom.de</code> zuständig ist und hinter einem Nginx-Proxy läuft.</p>
<p>Die kann ich aber jederzeit abschalten und es würden keine Probleme daraus entstehen.</p>
</div>
</div>



<h2 id="local-storage-cookies-und-ip-adresse" data-numberify>Local Storage, Cookies und IP-Adresse<a class="anchor ms-1" href="#local-storage-cookies-und-ip-adresse"></a></h2>
<p>Sobald man einen Kommentar abschickt, speichert der Browser für weitere Kommentare den angegebenen Namen, die E-Mail-Adresse und die URL im LocalStorage des Browsers. Diese Daten können später clientseitig vom Script ausgelesen und verwendet werden.</p>
<p>Des weiteren wird für jeden abgesendeten Kommentar ein Cookie gesetzt. Dieses wird auch nur vom JavaScript clientseitig ausgewertet und nur zur Authentifizierung an den Server geschickt, wenn man einen abgesendeten Kommentar ändern oder löschen möchte.</p>
<p>Serverseitig werden vom Benutzer die offensichtlichen Daten des Kommentars gespeichert und zusätzlich auch die IP-Adresse, wobei der letzte Teil auf Null gesetzt wird.</p>
<p>Ich habe für die neue Kommentarfunktion die Datenschutzerklärung im Blog entsprechend angepasst.</p>

<h2 id="an-die-url-des-blogbeitrags-gebunden" data-numberify>An die URL des Blogbeitrags gebunden<a class="anchor ms-1" href="#an-die-url-des-blogbeitrags-gebunden"></a></h2>
<p>Für jeden Kommentar wird die URL des Blogbeitrags (ohne <code>https://natenom.de</code> am Anfang) gespeichert. Wenn man also nachträglich den Slug eines Beitrags ändert, dann werden Kommentare nicht mehr sichtbar sein, wenn man nicht auch in der Datenbank von Isso diese URL in den entsprechenden Kommentaren ändert.</p>

<h2 id="kommentarfunktion-in-einzelnen-beiträgen-deaktivieren" data-numberify>Kommentarfunktion in einzelnen Beiträgen deaktivieren<a class="anchor ms-1" href="#kommentarfunktion-in-einzelnen-beiträgen-deaktivieren"></a></h2>
<p>Dank des Themes, das ich hier im Blog verwende (siehe unten im Footer), kann ich für einzelne Blogbeitrag Kommentare deaktivieren. Dazu füge ich im Front Matter eines Beitrags <code>comment: false</code> ein.</p>
<p>Man kann natürlich trotzdem über die API Kommentare für solche Beiträge abgeben. Aber erstens sind Kommentare im Blog moderiert und zweitens werden sie in solchen Beiträgen gar nicht erst durch den Browser abgerufen/geladen.</p>

<h2 id="recht-auf-vergessen" data-numberify>Recht auf Vergessen<a class="anchor ms-1" href="#recht-auf-vergessen"></a></h2>
<p>Da ich das <a  href="/2022/02/recht-auf-vergessen-kommentare-geloescht/">Recht auf Vergessen</a> gut finde, werde ich noch etwas einrichten, um alle Kommentare zu löschen, die älter sind als x. Wie lange x sein wird, habe ich noch nicht entschieden.</p>

<h2 id="gespannt" data-numberify>Gespannt<a class="anchor ms-1" href="#gespannt"></a></h2>
<p>Da es auch schon in der Vergangenheit, als der Blog noch mit WordPress betrieben wurde, nur selten Kommentare gab, bin ich gespannt, ob jetzt jemand diese Möglichkeit nutzen wird. Und vor allem, ob ich irgendwann von Spam oder sonst etwas genervt sein werde, und Kommentare wieder abschalten werde.</p>
<p>Es kann jedoch im Zweifel etwas dauern, bis ich Kommentare freigebe.</p>

<h2 id="projektseite" data-numberify>Projektseite<a class="anchor ms-1" href="#projektseite"></a></h2>
<p>Hier die <a  class='urlextern'  href="https://isso-comments.de/">Projektseite von Isso</a>.</p>
<p>Speziell die Clientkonfiguation fand ich hilfreich, <a  class='urlextern'  href="https://isso-comments.de/docs/reference/client-config/">siehe hier</a>.</p>]]></content:encoded></item><item><title>JavaScript für Kommentarfunktion in eigene Datei ausgelagert</title><link>https://natenom.de/2022/11/javascript-fuer-kommentarfunktion-in-eigene-datei-ausgelagert/</link><pubDate>Sun, 06 Nov 2022 17:25:07 +0100</pubDate><guid>https://natenom.de/2022/11/javascript-fuer-kommentarfunktion-in-eigene-datei-ausgelagert/</guid><description><![CDATA[<p>Vri hat heute das System für <a  href="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/">Kommentare hier im Blog</a> verbessert.</p>
<p>Vielen Dank dafür. ☺️</p>]]></description><content:encoded><![CDATA[<p>Vri hat heute das System für <a  href="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/">Kommentare hier im Blog</a> verbessert.</p>
<p>Vielen Dank dafür. ☺️</p>
<p>Sie hat das ganze JavaScript-Zeugs in eine eigene Datei ausgelagert und den Code angepasst. Dieser wird natürlich nur eingebunden, wenn im Front Matter die Kommentarfunktion aktiviert ist.</p>

<h2 id="javascript" data-numberify>JavaScript<a class="anchor ms-1" href="#javascript"></a></h2>
<p>Hier die Datei <a  href="/my_js/mastodon-comments.js">mastodon-comments.js</a>.</p>

<h2 id="hugo-template" data-numberify>Hugo-Template<a class="anchor ms-1" href="#hugo-template"></a></h2>
<p>Das Template (<code>layouts/partials/post/comments/custom.html</code>) für Hugo sieht jetzt so aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go-html-template" data-lang="go-html-template"><span style="display:flex;"><span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">with</span> <span style="color:#a6e22e">.Params.comments</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;masto-comments datenschutz&#34;</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span>&gt;&lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/ueber/datenschutz/#kommentare&#34;</span>&gt;(Datenschutzinformationen zu Kommentaren via Mastodon)&lt;/<span style="color:#f92672">a</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-wrapper&#34;</span> <span style="color:#a6e22e">data-mastodon-host</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.host</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34;</span> <span style="color:#a6e22e">data-mastodon-username</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.username</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34;</span> <span style="color:#a6e22e">data-mastodon-id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.id</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34;</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-buttons&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-outline-primary&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.host</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">/interact/</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.id</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">?type=reply&#34;</span> <span style="color:#a6e22e">target</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;_blank&#34;</span>&gt;Kommentar schreiben&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-outline-primary&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.host</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">/@</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.username</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">/</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">.id</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34;</span> <span style="color:#a6e22e">target</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;_blank&#34;</span>&gt;Tröt öffnen&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-list&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;load-comments&#34;</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-primary&#34;</span>&gt;Kommentare anzeigen (via Mastodon)&lt;/<span style="color:#f92672">button</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">noscript</span>&gt;&lt;<span style="color:#f92672">p</span>&gt;Du benötigst JavaScript, um die Kommentare hier anzeigen zu lassen.&lt;/<span style="color:#f92672">p</span>&gt;&lt;/<span style="color:#f92672">noscript</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/my_js/purify.min.js&#34;</span>&gt;&lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/my_js/mastodon-comments.js&#34;</span>&gt;&lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">else</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments nocomment&#34;</span>&gt;Kommentare sind für diesen Blogbeitrag (noch) nicht aktiviert. Nach der Veröffentlichung eines Blogbeitrags dauert das in der Regel noch ein paar Minuten.&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">end</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span>&gt;&lt;<span style="color:#f92672">details</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments email&#34;</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">summary</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments email-summary&#34;</span>&gt;Alternative: Anmerkung per E-Mail&lt;/<span style="color:#f92672">summary</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments emailcontent&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">p</span>&gt;Du kannst mir Anmerkungen zum Blogbeitrag per E-Mail schicken, &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;mailto:user@tld.org?subject=Anmerkung zum Blog&amp;body=Hallo Natenom. Zum Blogbeitrag &#34;</span><span style="color:#75715e">{{</span> <span style="color:#a6e22e">$.Page.Permalink</span> <span style="color:#75715e">}}</span><span style="color:#e6db74">&#34; habe ich eine Anmerkung:&#39;</span>&gt;wenn du hier klickst&lt;/<span style="color:#f92672">a</span>&gt;. Der Inhalt davon bleibt privat und wird nicht hier im Kommentarbereich veröffentlicht.&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">details</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span></code></pre></div>
<h2 id="css" data-numberify>CSS<a class="anchor ms-1" href="#css"></a></h2>
<p>Beim CSS hat sich nichts geändert und das <a  href="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/#css">gibt es hier</a>.</p>]]></content:encoded></item><item><title>Kommentare in meinem statischen Blog via Mastodon</title><link>https://natenom.de/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/</link><pubDate>Tue, 01 Nov 2022 20:01:42 +0100</pubDate><guid>https://natenom.de/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/</guid><description><![CDATA[<p>Seit dem Umzug meines Blogs <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">von WordPress hin zu einer statischen Website</a> Anfang des Jahres hatte ich ganz leicht, aber wirklich nur ganz bisschen die Kommentarfunktion vermisst. Es gab hier sowieso nur selten Kommentare. Eine Interaktionsmöglichkeit ist aber trotzdem schön.</p>
<p>Deshalb haben wir heute die Möglichkeit im Blog integriert, in dafür freigeschalteten Blogbeiträgen per Mastodon zu kommentieren.</p>]]></description><content:encoded><![CDATA[<p>Seit dem Umzug meines Blogs <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">von WordPress hin zu einer statischen Website</a> Anfang des Jahres hatte ich ganz leicht, aber wirklich nur ganz bisschen die Kommentarfunktion vermisst. Es gab hier sowieso nur selten Kommentare. Eine Interaktionsmöglichkeit ist aber trotzdem schön.</p>
<p>Deshalb haben wir heute die Möglichkeit im Blog integriert, in dafür freigeschalteten Blogbeiträgen per Mastodon zu kommentieren.</p>
<p>Vielen Dank an die Menschen, die mir auf <a  class='urlextern'  href="https://social.anoxinon.de/@natenom/109263561189792179">Mastodon auf meine Frage hin</a> antworteten. Darüber konnte ich <a  class='urlextern'  href="https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/">diesen Blogbeitrag</a> finden, der das Vorgehen für Hugo erklärt.</p>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content">2022-11-06: Die Einbindung von Kommentaren aus Mastodon erfolgt jetzt transparent, <a  href="/2022/11/transparenz-fuer-kommentare-im-blog-via-mastodon/">siehe hier</a>.</div>
</div>



<h2 id="was-ist-mastodon" data-numberify>Was ist Mastodon?<a class="anchor ms-1" href="#was-ist-mastodon"></a></h2>
<p><a  class='urlextern'  href="https://de.wikipedia.org/wiki/Mastodon_%28Software%29">Mastodon</a> ist ein Teil vom <a  class='urlextern'  href="https://de.wikipedia.org/wiki/Fediverse">Fediverse</a>. Jeder Mensch kann dort einen Account bei einem beliebigen Anbieter einer Instanz erstellen.</p>
<p>Man kann sich das vorstellen wie bei E-Mails. Jeder Mensch hat einen anderen E-Mail-Anbieter und kann trotzdem mit jedem anderen Menschen auf der Welt kommunizieren.</p>

<h2 id="vorab-wie-es-funktioniert" data-numberify>Vorab: Wie es funktioniert<a class="anchor ms-1" href="#vorab-wie-es-funktioniert"></a></h2>

<h3 id="für-menschen-die-kommentieren" data-numberify>Für Menschen, die kommentieren<a class="anchor ms-1" href="#für-menschen-die-kommentieren"></a></h3>
<p>Entweder nach unten scrollen oder rechts auf die Sprechblase (rechts oben im Blogbeitrag) klicken. Dann landet man hier:</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-ungeladen_hu94308d496794c6ec792089d0ab8ba6d6_13760_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="258" /></picture><figcaption></figcaption></figure><p>
</p>
<p>Dann &ldquo;Kommentare anzeigen (via Mastodon)&rdquo; anklicken:</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/11/kommentare-in-meinem-statischen-blog-via-mastodon/2022-11-01-kommentare-geladen_hub77b13ab36b426318ae164eb0f25648e_17800_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="310" /></picture><figcaption></figcaption></figure><p>
</p>
<p>Oder einen der oberen Links anklicken, um zu kommentieren oder den Tröt in einem neuen Tab zu öffnen.</p>
<p>Um zu kommentieren, benötigt man entweder einen Mastodon-Account, einen Friendica-Account oder irgend einen anderen Account eines Dienstes des Fediverse.</p>

<h3 id="für-mich-als-betreiber-des-blogs" data-numberify>Für mich als Betreiber des Blogs<a class="anchor ms-1" href="#für-mich-als-betreiber-des-blogs"></a></h3>
<ol>
<li>Blogbeitrag veröffentlichen.</li>
<li>Link zum Blogbeitrag auf Mastodon tröten.</li>
<li>Im veröffentlichen Blogbeitrag im <code>Front Matter</code> einfügen:</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">comments</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">host</span>: <span style="color:#ae81ff">social.anoxinon.de</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">username</span>: <span style="color:#ae81ff">natenom</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">id</span>: <span style="color:#ae81ff">123456789</span><span style="color:#ae81ff">…</span>
</span></span></code></pre></div><ol start="4">
<li>Blogbeitrag erneut veröffentlichen mit dem geänderten <code>Front Matter</code>.</li>
</ol>
<p>Die ID ist die lange Zahl am Ende des Links eines Tröts (Toots).</p>
<p>Ich habe bewusst entschieden, den Host immer im Front Matter des Blogbeitrag zu hinterlegen, statt ihn global in der Konfiguration von Hugo zu hinterlegen. Denn es könnte sein, dass ich zukünftig eine andere Instanz verwenden werde und dann sollten bisherige Kommentare weiterhin zugreifbar bleiben.</p>
<p>Der Nachteil dieser Lösung ist, dass es immer etwas dauert (da der Blog neu generiert wird), bis Kommentare im Blog eingebunden werden können, obwohl es bereits einen Tröt auf Mastodon gibt. Das macht aber nichts, da man trotzdem bereits auf Mastodon antworten kann und diese Antworten später auch über den Blog sichtbar sind.</p>
<p><em>(Man könnte auch kurz vor dem Veröffentlichen des Beitrags bereits einen Mastodon-Tröt zum Blogbeitrag schreiben, müsste dann aber das Vorschaubild und den Titel manuell eintragen und würde nur wenig Zeit sparen.)</em></p>

<h2 id="umsetzung-für-meinen-blog" data-numberify>Umsetzung für meinen Blog<a class="anchor ms-1" href="#umsetzung-für-meinen-blog"></a></h2>
<p>Hier die Anleitung, wie wir das mit dem hier verwendeten Theme &ldquo;<a  class='urlextern'  href="https://github.com/razonyang/hugo-theme-bootstrap">Hugo Theme Bootstrap</a>&rdquo; umgesetzt haben.</p>
<p>Wir haben den Quelltext des oben bereits genannten <a  class='urlextern'  href="https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/">Blogbeitrags</a> an den Blog angepasst.</p>
<div class="shortcode-notice info">
    <div class="shortcode-notice-title info">
        Info</div>
    <div class="notice-content">Vielen Dank an Vri, die dafür gesorgt hat, dass das Ergebnis schön aussieht.</div>
</div>



<h3 id="template" data-numberify>Template<a class="anchor ms-1" href="#template"></a></h3>
<p>Dieser Quelltext kommt in die Datei <code>layouts/partials/post/comments/custom.html</code>:</p>
<div class="shortcode-details">
    <details>
    <summary>Quelltext der Datei</summary>
        <div class="shortcode-details content"><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>{{ with .Params.comments }}
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;masto-comments datenschutz&#34;</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span>&gt;&lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/ueber/datenschutz/#kommentare&#34;</span>&gt;(Datenschutzinformationen zu Kommentaren via Mastodon)&lt;/<span style="color:#f92672">a</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-wrapper&#34;</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-buttons&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-outline-primary&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://{{ .host }}/interact/{{ .id }}?type=reply&#34;</span> <span style="color:#a6e22e">target</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;_blank&#34;</span>&gt;Kommentar schreiben&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-outline-primary&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://{{ .host }}/@{{ .username }}/{{ .id }}&#34;</span> <span style="color:#a6e22e">target</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;_blank&#34;</span>&gt;Tröt öffnen&lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-list&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;load-comments&#34;</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;btn btn-sm btn-primary&#34;</span>&gt;Kommentare anzeigen (via Mastodon)&lt;/<span style="color:#f92672">button</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">noscript</span>&gt;&lt;<span style="color:#f92672">p</span>&gt;Du benötigst JavaScript, um die Kommentare hier anzeigen zu lassen.&lt;/<span style="color:#f92672">p</span>&gt;&lt;/<span style="color:#f92672">noscript</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/my_js/purify.min.js&#34;</span>&gt;&lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>  document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;load-comments&#39;</span>).<span style="color:#a6e22e">addEventListener</span>(<span style="color:#e6db74">&#39;click&#39;</span>, <span style="color:#a6e22e">loadComment</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">unsafe</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">unsafe</span>
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&amp;/g</span>, <span style="color:#e6db74">&#39;&amp;amp;&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&lt;/g</span>, <span style="color:#e6db74">&#39;&amp;lt;&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&gt;/g</span>, <span style="color:#e6db74">&#39;&amp;gt;&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&#34;/g</span>, <span style="color:#e6db74">&#39;&amp;quot;&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&#39;/g</span>, <span style="color:#e6db74">&#39;&amp;#039;&#39;</span>);
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">loadComment</span>() {
</span></span><span style="display:flex;"><span>    document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;load-comments&#39;</span>).<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;Lade …&#39;</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">fetch</span>(<span style="color:#e6db74">&#39;https://{{ .host }}/api/v1/statuses/{{ .id }}/context&#39;</span>)
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">response</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">response</span>.<span style="color:#a6e22e">json</span>();
</span></span><span style="display:flex;"><span>      })
</span></span><span style="display:flex;"><span>      .<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">data</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">data</span>[<span style="color:#e6db74">&#39;descendants&#39;</span>] <span style="color:#f92672">&amp;&amp;</span>
</span></span><span style="display:flex;"><span>        Array.<span style="color:#a6e22e">isArray</span>(<span style="color:#a6e22e">data</span>[<span style="color:#e6db74">&#39;descendants&#39;</span>]) <span style="color:#f92672">&amp;&amp;</span> 
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">data</span>[<span style="color:#e6db74">&#39;descendants&#39;</span>].<span style="color:#a6e22e">length</span> <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) {
</span></span><span style="display:flex;"><span>        document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;mastodon-comments-list&#39;</span>).<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">data</span>[<span style="color:#e6db74">&#39;descendants&#39;</span>].<span style="color:#a6e22e">forEach</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">reply</span>) {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span>);
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">emojis</span>.<span style="color:#a6e22e">forEach</span>(<span style="color:#a6e22e">emoji</span> =&gt; {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span>.<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">`:</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">shortcode</span><span style="color:#e6db74">}</span><span style="color:#e6db74">:`</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">`&lt;img src=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">static_url</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; alt=&#34;Emoji </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">shortcode</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; height=&#34;20&#34; width=&#34;20&#34; /&gt;`</span>);
</span></span><span style="display:flex;"><span>          });
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">replyCreationDate</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Date(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">created_at</span>).<span style="color:#a6e22e">toLocaleDateString</span>(<span style="color:#66d9ef">undefined</span>, { <span style="color:#a6e22e">day</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">month</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;short&#39;</span>, <span style="color:#a6e22e">hour</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">minute</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span> });
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">replyCreationDateLong</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Date(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">created_at</span>).<span style="color:#a6e22e">toLocaleDateString</span>(<span style="color:#66d9ef">undefined</span>, { <span style="color:#a6e22e">day</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">month</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;long&#39;</span>, <span style="color:#a6e22e">year</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">hour</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span>, <span style="color:#a6e22e">minute</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;numeric&#39;</span> });
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">mastodonComment</span> <span style="color:#f92672">=</span>
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">`&lt;div class=&#34;mastodon-comment&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            &lt;div class=&#34;avatar&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              &lt;img src=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">avatar_static</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; alt=&#34;&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            &lt;/div&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            &lt;div class=&#34;content&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              &lt;div class=&#34;author-wrapper&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                &lt;a class=&#34;author&#34; href=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">url</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; rel=&#34;nofollow&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                  &lt;span class=&#34;author-name&#34;&gt;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&lt;/span&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                  &lt;span class=&#34;author-handle&#34;&gt;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">acct</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">&lt;/span&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                &lt;/a&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                &lt;a class=&#34;date&#34; href=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">uri</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34; rel=&#34;nofollow&#34; title=&#34;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">replyCreationDateLong</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                  </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">replyCreationDate</span><span style="color:#e6db74">}</span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                &lt;/a&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              &lt;/div&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              &lt;div class=&#34;mastodon-comment-content&#34;&gt;</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">reply</span>.<span style="color:#a6e22e">content</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&lt;/div&gt; 
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            &lt;/div&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          &lt;/div&gt;`</span>;
</span></span><span style="display:flex;"><span>          document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;mastodon-comments-list&#39;</span>).<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">DOMPurify</span>.<span style="color:#a6e22e">sanitize</span>(<span style="color:#a6e22e">mastodonComment</span>, {<span style="color:#e6db74">&#39;RETURN_DOM_FRAGMENT&#39;</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</span>}));
</span></span><span style="display:flex;"><span>        });
</span></span><span style="display:flex;"><span>      } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>          document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#39;mastodon-comments-list&#39;</span>).<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&lt;p&gt;Keine Kommentare gefunden&lt;/p&gt;&#34;</span>;
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    });
</span></span><span style="display:flex;"><span>  };
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>{{ else }}
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments nocomment&#34;</span>&gt;Kommentare sind für diesen Blogbeitrag (noch) nicht aktiviert. Nach der Veröffentlichung eines Blogbeitrags dauert das in der Regel noch ein paar Minuten.&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>{{ end }}
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">p</span>&gt;&lt;<span style="color:#f92672">details</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments email&#34;</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">summary</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments email-summary&#34;</span>&gt;Alternative: Anmerkung per E-Mail&lt;/<span style="color:#f92672">summary</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments emailcontent&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">p</span>&gt;Du kannst mir Anmerkungen zum Blogbeitrag per E-Mail schicken, &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;mailto:user@tld.org?subject=Anmerkung zum Blog&amp;body=Hallo Natenom. Zum Blogbeitrag &#34;{{ $.Page.Permalink }}&#34; habe ich eine Anmerkung:&#39;</span>&gt;wenn du hier klickst&lt;/<span style="color:#f92672">a</span>&gt;. Der Inhalt davon bleibt privat und wird nicht hier im Kommentarbereich veröffentlicht.&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">details</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span></code></pre></div></div>
    </details>
</div>

<div class="shortcode-notice info">
    <div class="shortcode-notice-title info">
        Info</div>
    <div class="notice-content">Der Inhalt des <a  class='urlextern'  href="https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/">Blogbeitrags</a>, von dem ich den oberen Quelltext entnommen habe, ist lizensiert unter Creative Commons BY-SA 4.0. Daher gehe ich davon aus, dass auch der dort gelistete Quelltext unter diese Lizenz fällt. Sollte dem nicht so sein, so bitte ich um eine Nachricht. Entsprechend steht der hier angepasste Quelltext unter der selben Lizenz zur Verfügung.</div>
</div>



<h3 id="css" data-numberify>CSS<a class="anchor ms-1" href="#css"></a></h3>
<p>Das SCSS kommt in die Datei <code>assets/main/scss/_custom.scss</code>:</p>
<div class="shortcode-details">
    <details>
    <summary>CSS für die Kommentarfunktion</summary>
        <div class="shortcode-details content"><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scss" data-lang="scss"><span style="display:flex;"><span><span style="color:#75715e">/* Für Kommentar, die von Mastodon geladen werden. :) */</span>
</span></span><span style="display:flex;"><span>#mastodon-comments-wrapper {
</span></span><span style="display:flex;"><span>	#mastodon-comments-buttons {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">margin-bottom</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span><span style="color:#ae81ff">.5</span><span style="color:#66d9ef">em</span>;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	#mastodon-comments-list {
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">button</span>#load-comments {
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">border</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">border-radius</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span><span style="color:#e6db74">#{</span>$prefix<span style="color:#e6db74">}</span>border-radius);
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">background-color</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span><span style="color:#e6db74">#{</span>$prefix<span style="color:#e6db74">}</span>btn-border-color);
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">margin</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span> auto;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">.mastodon-comment</span> {
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">display</span><span style="color:#f92672">:</span> grid;
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">grid-gap</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">1</span><span style="color:#66d9ef">em</span>;
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">grid-template-columns</span><span style="color:#f92672">:</span> auto <span style="color:#ae81ff">1</span><span style="color:#66d9ef">fr</span>;
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">.avatar</span> <span style="color:#f92672">img</span> {
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">border-radius</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span><span style="color:#e6db74">#{</span>$prefix<span style="color:#e6db74">}</span>border-radius);
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">position</span><span style="color:#f92672">:</span> relative;
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">top</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">6</span><span style="color:#66d9ef">px</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">width</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">48</span><span style="color:#66d9ef">px</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">.content</span> {
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">.author-wrapper</span> {
</span></span><span style="display:flex;"><span>					<span style="color:#a6e22e">.author</span> {
</span></span><span style="display:flex;"><span>						<span style="color:#a6e22e">.author-name</span> {
</span></span><span style="display:flex;"><span>							<span style="color:#a6e22e">font-weight</span><span style="color:#f92672">:</span> bold;
</span></span><span style="display:flex;"><span>						}
</span></span><span style="display:flex;"><span>						<span style="color:#66d9ef">&amp;</span><span style="color:#a6e22e">:hover</span> {
</span></span><span style="display:flex;"><span>							<span style="color:#a6e22e">color</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span>hbs-link-color);
</span></span><span style="display:flex;"><span>							<span style="color:#a6e22e">text-decoration</span><span style="color:#f92672">:</span> none;
</span></span><span style="display:flex;"><span>							<span style="color:#a6e22e">.author-name</span> {
</span></span><span style="display:flex;"><span>								<span style="color:#a6e22e">color</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">var</span>(<span style="color:#f92672">--</span>hbs-link-hover-color);
</span></span><span style="display:flex;"><span>								<span style="color:#a6e22e">text-decoration</span><span style="color:#f92672">:</span> underline;
</span></span><span style="display:flex;"><span>							}
</span></span><span style="display:flex;"><span>						}
</span></span><span style="display:flex;"><span>					}
</span></span><span style="display:flex;"><span>					<span style="color:#a6e22e">.date</span> {
</span></span><span style="display:flex;"><span>						<span style="color:#a6e22e">float</span><span style="color:#f92672">:</span> right;
</span></span><span style="display:flex;"><span>					}
</span></span><span style="display:flex;"><span>				}
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div></div>
    </details>
</div>


<h3 id="javascript" data-numberify>JavaScript<a class="anchor ms-1" href="#javascript"></a></h3>
<p>Es wird die Bibliothek <a  class='urlextern'  href="https://github.com/cure53/DOMPurify">DomPurify</a> benötigt. Die steht unter einer freien <a  class='urlextern'  href="https://github.com/cure53/DOMPurify/blob/main/LICENSE">Lizenz</a> zur Verfügung und kann somit verwendet werden.</p>
<p>Die Datei habe ich heruntergeladen und nach <code>static/my_js/purify.min.js</code> abgelegt.</p>

<h3 id="header-auf-dem-webserver" data-numberify>Header (auf dem Webserver)<a class="anchor ms-1" href="#header-auf-dem-webserver"></a></h3>
<p>Auf meinem Server sind die Header für den Blog relativ streng eingestellt.</p>
<p>Damit JavaScript Daten von extern laden darf, musste der Header in der Nginx-Konfiguration von:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#66d9ef">Eadd_header</span> <span style="color:#e6db74">Content-Security-Policy</span> <span style="color:#e6db74">&#34;default-src</span> <span style="color:#e6db74">&#39;none&#39;</span>; <span style="color:#66d9ef">font-src</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">connect-src</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">form-action</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">img-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">data:</span> <span style="color:#e6db74">https://*.natenom.com</span> <span style="color:#e6db74">https://*.natenom.de</span>; <span style="color:#66d9ef">media-src</span> <span style="color:#e6db74">https://*.natenom.com</span> <span style="color:#e6db74">https://*.natenom.de</span>; <span style="color:#66d9ef">script-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">&#39;unsafe-inline&#39;</span>; <span style="color:#66d9ef">style-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">&#39;unsafe-inline&#39;</span>; <span style="color:#66d9ef">frame-ancestors</span> <span style="color:#e6db74">&#39;none&#39;</span>;<span style="color:#66d9ef">&#34;</span>;
</span></span></code></pre></div><p>geändert werden nach:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#66d9ef">Eadd_header</span> <span style="color:#e6db74">Content-Security-Policy</span> <span style="color:#e6db74">&#34;default-src</span> <span style="color:#e6db74">&#39;none&#39;</span>; <span style="color:#66d9ef">font-src</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">connect-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">https://social.anoxinon.de</span>; <span style="color:#66d9ef">form-action</span> <span style="color:#e6db74">&#39;self&#39;</span>; <span style="color:#66d9ef">img-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">https://social.anoxinon.de</span> <span style="color:#e6db74">data:</span> <span style="color:#e6db74">https://*.natenom.com</span> <span style="color:#e6db74">https://*.natenom.de</span>; <span style="color:#66d9ef">media-src</span> <span style="color:#e6db74">https://*.natenom.com</span> <span style="color:#e6db74">https://*.natenom.de</span>; <span style="color:#66d9ef">script-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">&#39;unsafe-inline&#39;</span>; <span style="color:#66d9ef">style-src</span> <span style="color:#e6db74">&#39;self&#39;</span> <span style="color:#e6db74">&#39;unsafe-inline&#39;</span>; <span style="color:#66d9ef">frame-ancestors</span> <span style="color:#e6db74">&#39;none&#39;</span>;<span style="color:#66d9ef">&#34;</span>;
</span></span></code></pre></div><p>Sowohl im Bereich <code>connect-src</code> als auch bei <code>img-src</code> musste die Domain der Mastodon-Instanz eingetragen werden.</p>

<h3 id="datenschutz" data-numberify>Datenschutz<a class="anchor ms-1" href="#datenschutz"></a></h3>
<p>Die Informationen zum Datenschutz wurden um den Bereich &ldquo;Kommentare&rdquo; erweitert, <a  href="/ueber/datenschutz/#kommentare">siehe hier</a>.</p>

<h2 id="was-noch-fehlt" data-numberify>Was noch fehlt<a class="anchor ms-1" href="#was-noch-fehlt"></a></h2>

<h3 id="tröts-für-kommentarfunktion-nicht-automatisch-löschen-lassen" data-numberify>Tröts für Kommentarfunktion nicht automatisch löschen lassen<a class="anchor ms-1" href="#tröts-für-kommentarfunktion-nicht-automatisch-löschen-lassen"></a></h3>
<p>Meine Mastodon-Tröts werden bei mir derzeit nach einem Monat automatisch gelöscht. Kommentare würden so nach dieser Zeit nicht mehr angezeigt werden.</p>
<p>Es ist jedoch in Mastodon einstellbar, dass bestimmte Tröts nicht gelöscht werden, z. B. solche, die man zu den Lesezeichen hinzugefügt hat. Dadurch könnte ich die Lesezeichen-Funktion aber nicht mehr für andere Inhalte benutzen.</p>
<p>Eine Alternative wäre, die Automatisch-Löschen-Funktion von Mastodon nicht mehr zu verwenden und stattdessen ein externes Script (<a  href="/2021/03/alte-toots-eines-mastodon-accounts-automatisiert-loeschen/">siehe hier</a>). Dieses Tool könnte man so konfigurieren, dass es keine Toots löscht, die ein bestimmtes Hashtag beinhalten.</p>

<h3 id="eingerückt" data-numberify>Eingerückt<a class="anchor ms-1" href="#eingerückt"></a></h3>
<p>Es wäre schön, wenn auch auf der Seite erkennbar wäre, auf welchen Mastodon-Tröt genau jemand geantwortet hat. Die Reihenfolge passt zwar schon, aber die Einrückungen fehlen noch.</p>]]></content:encoded></item><item><title>Wie man im Blog (Hugo) ein eigenes Bild für die Suchseite einstellt</title><link>https://natenom.de/2022/09/wie-man-im-blog-hugo-ein-eigenes-bild-fuer-die-suchseite-einstellt/</link><pubDate>Tue, 27 Sep 2022 02:50:03 +0200</pubDate><guid>https://natenom.de/2022/09/wie-man-im-blog-hugo-ein-eigenes-bild-fuer-die-suchseite-einstellt/</guid><description><![CDATA[<p>Wenn man früher einen Link zur Suchseite hier im Blog auf Social Media geteilt hatte, wurde immer nur das Natenom-Logo im <a  href="/tags/twitter/">Twitter-Card</a> angezeigt, denn das war der Default fürs &ldquo;Beitragsbild&rdquo;.</p>
<p>Ich wollt jedoch nur für die Suche ein eigenes Bild haben. Einen kleinen Elefanten, der so aussieht, als ob er was suchen würde.</p>]]></description><content:encoded><![CDATA[<p>Wenn man früher einen Link zur Suchseite hier im Blog auf Social Media geteilt hatte, wurde immer nur das Natenom-Logo im <a  href="/tags/twitter/">Twitter-Card</a> angezeigt, denn das war der Default fürs &ldquo;Beitragsbild&rdquo;.</p>
<p>Ich wollt jedoch nur für die Suche ein eigenes Bild haben. Einen kleinen Elefanten, der so aussieht, als ob er was suchen würde.</p>
<p>Ich fragte den Entwickler und er <a  class='urlextern'  href="https://github.com/razonyang/hugo-theme-bootstrap/discussions/744#discussioncomment-3738425">erklärte</a>, dass die Suchseite letztlich eine normale Seite ist und man dort im <code>Front Matter</code> Dinge angeben kann, so wie z. B. das Beitragsbild.</p>
<p>Der Quelltext der Suchseite <code>blog/content/search/_index.md</code> sieht jetzt so aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span><span style="color:#a6e22e">---</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">title</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;Suche&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">layout</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;search&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">images</span><span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">-</span> <span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">images</span><span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">search</span>.<span style="color:#a6e22e">webp</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">---</span>
</span></span></code></pre></div><p>Und das Bild liegt in <code>blog/static/images/</code>.</p>
<p>Teilt man nun einen Link zur Suchseite mit einem beliebigen Suchbegriff, dann wird nicht mehr das Natenom-Logo verwendet sondern dieses schöne Bild vom kleinen Elefanten (später dann eines mit einer Lupe, das ich noch machen muss):</p>
<p></p><figure class="image-caption"><picture><source type="jpeg" srcset="/2022/09/wie-man-im-blog-hugo-ein-eigenes-bild-fuer-die-suchseite-einstellt/2022-09-27-eigenes-bild-fuer-suchseite-im-blog-cover.jpg" />
			         <img alt="" src="/2022/09/wie-man-im-blog-hugo-ein-eigenes-bild-fuer-die-suchseite-einstellt/2022-09-27-eigenes-bild-fuer-suchseite-im-blog-cover.jpg" title="" width="492" height="479" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>
<p>Jetzt steht unter dem Bild aber noch der Standardtext über den Blog. Mit <code>description: </code> im Front Matter kann man hier einen anderen Text hinterlegen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span><span style="color:#a6e22e">description</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#39;Der kleine Elefant ist so nett und durchsucht den Blog für dich nach verschiedenen Begriffen…&#39;</span>
</span></span></code></pre></div><p>Ergebnis:</p>
<p></p><figure class="image-caption"><picture><source type="jpeg" srcset="/2022/09/wie-man-im-blog-hugo-ein-eigenes-bild-fuer-die-suchseite-einstellt/2022-09-27-eigenes-bild-fuer-suchseite-im-blog-2.jpg" />
			         <img alt="" src="/2022/09/wie-man-im-blog-hugo-ein-eigenes-bild-fuer-die-suchseite-einstellt/2022-09-27-eigenes-bild-fuer-suchseite-im-blog-2.jpg" title="" width="492" height="439" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>]]></content:encoded><enclosure url="https://natenom.de/2022/09/wie-man-im-blog-hugo-ein-eigenes-bild-fuer-die-suchseite-einstellt/2022-09-27-eigenes-bild-fuer-suchseite-im-blog-cover.jpg" length="50398" type="image/jpeg"/></item><item><title>Wechsel von Kate zu VSCodium für Markdown</title><link>https://natenom.de/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/</link><pubDate>Sun, 11 Sep 2022 17:01:07 +0200</pubDate><guid>https://natenom.de/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/</guid><description><![CDATA[<p>In dem Zeitraum, als ich meinen Blog und mein Wiki auf Hugo umgestellt hatte, suchte ich lange nach einem guten Editor für Markdown und <a  href="/2022/02/suche-nach-editor-fuers-schreiben-markdown/">probierte viele Editoren aus</a> und bin letztlich beim bis dahin sonst immer verwendeten <a  href="/2022/02/workflow-zum-schreiben-von-blogbeitraegen-hugo/">Editor Kate</a> geblieben. Denn die meisten getesteten Editoren hatten keine Snippets-Funktion und andere Editoren waren mir zu überladen (z. B. solche, die auf <a  class='urlextern'  href="https://www.electronjs.org/">Electron</a> basieren).</p>
<p>Doch nach mehreren Monaten und vielen geschriebenen Blogbeiträgen fehlen mir ein paar Funktionen in Kate, die Zeit und Nerven fressen oder umständliche &ldquo;Lösungen&rdquo; brauchen.</p>
<p>Was mir in Kate besonders fehlt:</p>
<ul>
<li>Live-Vorschau (wenn auch nicht alle Shortcodes gerendert werden können).</li>
<li>Ordentlich funktionierende Snippets mit Zusatzfunktionen (die in Kate sind nur rudimentär und zudem buggy).</li>
<li>Inhaltsverzeichnis mit der Möglichkeit, zu einem Eintrag zu springen.</li>
<li>Distraction free writing (oder zumindest einigermaßen ordentliche Vorschau). Hierfür habe ich in VSCodium noch keine Lösung gefunden.</li>
</ul>]]></description><content:encoded><![CDATA[<p>In dem Zeitraum, als ich meinen Blog und mein Wiki auf Hugo umgestellt hatte, suchte ich lange nach einem guten Editor für Markdown und <a  href="/2022/02/suche-nach-editor-fuers-schreiben-markdown/">probierte viele Editoren aus</a> und bin letztlich beim bis dahin sonst immer verwendeten <a  href="/2022/02/workflow-zum-schreiben-von-blogbeitraegen-hugo/">Editor Kate</a> geblieben. Denn die meisten getesteten Editoren hatten keine Snippets-Funktion und andere Editoren waren mir zu überladen (z. B. solche, die auf <a  class='urlextern'  href="https://www.electronjs.org/">Electron</a> basieren).</p>
<p>Doch nach mehreren Monaten und vielen geschriebenen Blogbeiträgen fehlen mir ein paar Funktionen in Kate, die Zeit und Nerven fressen oder umständliche &ldquo;Lösungen&rdquo; brauchen.</p>
<p>Was mir in Kate besonders fehlt:</p>
<ul>
<li>Live-Vorschau (wenn auch nicht alle Shortcodes gerendert werden können).</li>
<li>Ordentlich funktionierende Snippets mit Zusatzfunktionen (die in Kate sind nur rudimentär und zudem buggy).</li>
<li>Inhaltsverzeichnis mit der Möglichkeit, zu einem Eintrag zu springen.</li>
<li>Distraction free writing (oder zumindest einigermaßen ordentliche Vorschau). Hierfür habe ich in VSCodium noch keine Lösung gefunden.</li>
</ul>
<p>Ich probierte einige der bereits getesteten Editoren noch einmal aus und am besten gefiel mir MarkText, doch das kann leider keine Snippets.</p>
<p>Deshalb habe ich mich für <a  class='urlextern'  href="https://vscodium.com/">VSCodium</a> entschieden, einer etwas freieren Variante von <a  class='urlextern'  href="https://code.visualstudio.com/">Visual Studio Code</a>. Die basiert zwar auf Electron, aber ich jetzt bereit, diesen Kompromiss einzugehen, um dafür viele schöne Funktionen zu bekommen.</p>
<p>In VSCodium gibt es – im Unterschied zu Kate – einige Funktionen, die ich folgend beschreibe.</p>
<div class="shortcode-notice hinweis">
    <div class="shortcode-notice-title hinweis">
        Hinweis</div>
    <div class="notice-content"><p>Eine ältere Liste nützlicher Erweiterungen speziell für Hugo <a  class='urlextern'  href="https://gohugo.io/tools/editors/#visual-studio-code">gibt es auf der Hugo-Projektseite</a>.</p>
<p>Und <a  class='urlextern'  href="https://code.visualstudio.com/docs/languages/markdown">hier</a> ist die Dokumentation für VSCodium für den Umgang mit Markdown.</p>
</div>
</div>



<h2 id="erweiterungen" data-numberify>Erweiterungen<a class="anchor ms-1" href="#erweiterungen"></a></h2>
<p>Für VSCodium gibt es extrem viele Erweiterungen (die ich bisher nicht benötige, aber vielleicht finde ich doch noch hilfreiche Dinge).</p>
<p>Für Kate gibt es Plugins, aber nicht annähernd so viele.</p>

<h2 id="live-vorschau" data-numberify>Live-Vorschau<a class="anchor ms-1" href="#live-vorschau"></a></h2>
<p>An der Live-Vorschau gefällt mir besonders, dass</p>
<ul>
<li>sie automatisch mit scrollt.</li>
<li>es links immer einen Indikator gibt, der anzeige, in welcher Zeile der Cursor gerade ist.</li>
<li>man optional trotzdem unabhängig vom Code in der Vorschau scrollen kann, diese aber wieder synchron läuft, sobald man im Quelltext scrollt.</li>
<li>der Cursor bei einem Doppelklick auf einen Bereich in der Vorschau automatisch auf diese Zeile im Quelltext gesetzt wird.</li>
</ul>
<p>Die Vorschaufunktion gibt zwar nicht genau wieder, wie es später im Blog oder im Wiki aussehen wird, aber es ist ausreichend, sodass ich während des Schreibens den Hugo-Server gar nicht erst anwerfen muss, außer zum Schluss mal wegen Shortcodes, die nicht dargestellt werden, wie <code>figure</code>.</p>
<p>Die Vorschau öffent man mit der Tastenkombination <code>Ctrl + k</code> gefolgt von <code>v</code>.</p>

<h2 id="inhaltsverzeichnis" data-numberify>Inhaltsverzeichnis<a class="anchor ms-1" href="#inhaltsverzeichnis"></a></h2>
<p>Es gibt drei Möglichkeiten, ein Inhaltsverzeichnis des aktuellen Dokuments zu sehen:</p>
<ul>
<li>Mit der Tastenkombination <code>Strg + Shift + o</code> öffnet man das Inhaltsverzeichnis und kann zu einer bestimmten Überschrift springen.</li>
<li>Die aktuelle Überschrift wird auch immer oben in den <code>Breadcrumbs</code> angezeigt. Dort kann man drauf klicken und kann auch wieder zu den Bereichen springen.</li>
<li>In der Leiste links öffnet man den <code>Explorer</code> oder drück die Tastenkombination <code>Ctrl + Shift + e</code> und öffnet unten den Bereich <code>OUTLINE</code>. </p><figure class="image-caption"><picture><source type="webp" srcset="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-strg-shift-o.webp" />
			         <img alt="Screenshot mit dem Inhaltsverzeichnis" src="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-strg-shift-o.webp" title="" width="595" height="236" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</li>
</ul>

<h2 id="snippets" data-numberify>Snippets<a class="anchor ms-1" href="#snippets"></a></h2>
<p>In VSCodium kann man tolle Dinge mit Snippets machen, die ich teilweise auch schon vom Editor <a  class='urlextern'  href="https://micro-editor.github.io/">Micro</a> kenne.</p>
<p>Die Dokumentation für Snippets in VSCodium <a  class='urlextern'  href="https://code.visualstudio.com/docs/editor/userdefinedsnippets">gibt es hier</a>.</p>
<p>Hier einige der Möglichkeiten.</p>
<p>Eigene Snippets trägt man in eine selbst gewählte Datei ein, die man über <code>Ctrl + Shift + p</code> gefolgt von <code>Snippets: Configure User Snippets</code> definieren und öffnen kann.</p>

<h3 id="tabstops" data-numberify>Tabstops<a class="anchor ms-1" href="#tabstops"></a></h3>
<p>In Snippet kann man Positionen definieren, zu denen man nach dem Einfügen mit der <code>Tab</code>-Taste springen kann, sodass man notwendige Eingaben schneller erledigen kann, also mit den Cursor-Tasten zu navigieren. Das nutze ich z. B. in meinem <code>Front Matter</code>-Snippet.</p>

<h3 id="vorauswahl" data-numberify>Vorauswahl<a class="anchor ms-1" href="#vorauswahl"></a></h3>
<p>Hier bekommt man ein kleines Popup-Fenster und kann einen der Einträge auswählen:</p>
<p></p><figure class="image-caption"><picture><source type="webp" srcset="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-snippet-auswahl.webp" />
			         <img alt="Screenshot des Popup-Fensters zur Auswahl der Einträge beim Einfügen eines Snippets." src="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-snippet-auswahl.webp" title="" width="602" height="129" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>
<p>Das Snippet dazu sieht so aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#e6db74">&#34;notice&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>		<span style="color:#e6db74">&#34;scope&#34;</span>: <span style="color:#e6db74">&#34;markdown&#34;</span>,
</span></span><span style="display:flex;"><span>		 <span style="color:#e6db74">&#34;prefix&#34;</span>: <span style="color:#e6db74">&#34;md-notice&#34;</span>,
</span></span><span style="display:flex;"><span>		 <span style="color:#e6db74">&#34;body&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>			<span style="color:#e6db74">&#34;{{&lt; notice </span><span style="color:#e6db74">${</span>1|hinweis,tipp,info,warnung,update|<span style="color:#e6db74">}</span><span style="color:#e6db74"> &gt;}}&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#e6db74">&#34;</span>$0<span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>			<span style="color:#e6db74">&#34;{{&lt; /notice &gt;}}&#34;</span>
</span></span><span style="display:flex;"><span>		 <span style="color:#f92672">]</span>,
</span></span><span style="display:flex;"><span>		 <span style="color:#e6db74">&#34;description&#34;</span>: <span style="color:#e6db74">&#34;Notice, tip, info, …&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">}</span>
</span></span></code></pre></div>
<h3 id="snippets-auf-markierte-bereiche-anwenden" data-numberify>Snippets auf markierte Bereiche anwenden<a class="anchor ms-1" href="#snippets-auf-markierte-bereiche-anwenden"></a></h3>
<p>Um einen aktuell im Editor markieren Bereich innerhalb eines Snippets nutzen zu können, gibt es die Variable <code>${TM_SELECTED_TEXT}</code> und weitere (<a  class='urlextern'  href="https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables">siehe hier</a>). Diese Möglichkeit bietet sich an, wenn man z. B. nachträglich einen Bereich als Codeblock oder Zitat formatieren will.</p>
<p>Hat man so ein Snippet geschrieben, markiert man zuerst den benötigen Bereich, drückt <code>Alt + Leertaste</code>, und wählt anschließend das Snippet mit den Cursor-Tasten aus.</p>
<p>Seltsam wird es, wenn man den Eintrag nicht per Cursor-Taste auswählt, sondern, wie sonst auch, den Namen des Snippets tippt. Dann überschreibt man nämlich den markieren Bereich. Doch das macht nichts. Sobald man den passenden Eintrag ausgewählt hat und sofern das Snippet die genannte Variable nutzt, wird beim Bestätigen mit <code>Enter</code> das komplette Snippet inklusive dem überschrieben geglaubten Bereich eingefügt.</p>

<h2 id="datum-fürs-front-matter-direkt-statt-über-shell" data-numberify>Datum fürs Front Matter direkt statt über Shell<a class="anchor ms-1" href="#datum-fürs-front-matter-direkt-statt-über-shell"></a></h2>
<p>Beim Einfügen meines eigenen Snippets <code>frontmatter</code> ist jetzt direkt das aktuelle Datum enthalten. Bisher musste ich das immer erst über ein Shellkommando machen und dann ins <code>Front Matter</code> einfügen. Theoretisch ginge das auch mit Kate und JavaScript, aber das habe ich bisher nicht geschafft.</p>
<p>So sieht dann das <code>Front Matter</code> nach dem Einfügen aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">title</span>:
</span></span><span style="display:flex;"><span><span style="color:#f92672">slug</span>:
</span></span><span style="display:flex;"><span><span style="color:#f92672">date</span>: <span style="color:#e6db74">2022-09-11T12:40:57</span><span style="color:#ae81ff">+02</span>:<span style="color:#ae81ff">00</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">draft</span>: <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">author</span>: <span style="color:#ae81ff">Natenom</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#description:</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">categories</span>:
</span></span><span style="display:flex;"><span>  -
</span></span><span style="display:flex;"><span><span style="color:#f92672">tags</span>:
</span></span><span style="display:flex;"><span>  -
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></div><p>Und das ist das zugehörige Snippet:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#e6db74">&#34;md-frontmatter&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;scope&#34;</span>: <span style="color:#e6db74">&#34;markdown&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;prefix&#34;</span>: <span style="color:#e6db74">&#34;md&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;body&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;---&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;title: </span>$1<span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;slug: </span>$2<span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;date: </span>$CURRENT_YEAR<span style="color:#e6db74">-</span>$CURRENT_MONTH<span style="color:#e6db74">-</span><span style="color:#e6db74">${</span>CURRENT_DATE<span style="color:#e6db74">}</span><span style="color:#e6db74">T</span><span style="color:#e6db74">${</span>CURRENT_HOUR<span style="color:#e6db74">}</span><span style="color:#e6db74">:</span>$CURRENT_MINUTE<span style="color:#e6db74">:</span>$CURRENT_SECOND<span style="color:#e6db74">+02:00&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;draft: false&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;author: Natenom&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;#description: &#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;categories:&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;  - </span>$3<span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;tags:&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;  - </span>$4<span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;---&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">]</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;description&#34;</span>: <span style="color:#e6db74">&#34;Front Matter Blog&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div>
<h2 id="tastenkombinationen" data-numberify>Tastenkombinationen<a class="anchor ms-1" href="#tastenkombinationen"></a></h2>
<p>Eine <a  class='urlextern'  href="https://code.visualstudio.com/docs/getstarted/keybindings#_basic-editing">Liste der Tastenkombinationen</a> für VSCodium.</p>

<h2 id="merk-dir-was" data-numberify>Merk dir was<a class="anchor ms-1" href="#merk-dir-was"></a></h2>
<p>Besonders gut gefällt mir, dass man ein &ldquo;Verzeichnis&rdquo; mit <code>Ctrl + k</code> gefolgt von <code>Ctrl + o</code> öffnen kann und der Editor sich dafür dann die geöffneten Dateien und Ansichten merkt.</p>
<p>So kann ich zwischen Blog und Wiki sehr einfach wechseln und die bearbeiteten Dateien sind weiterhin geföffnet. Das erleichtert die Arbeit.</p>
<p>Alternativ nutzt man die Tastenkombination <code>Ctrl + r</code> und kann dann bisher geöffnete Dateien und oben genannte Verzeichnisse wieder öffnen. Hält man <code>Ctrl</code> dabei gedrückt, werden diese in einem neuen Fenster geöffnet.</p>
<p>Hier z. B. die Ansicht für die Arbeit im Wiki, wo gerade die Selfies vom kleinen Elefanten geöffnet sind:</p>
<p><a  href="2022-09-11-vscodium-mit-meinem-wiki-cover.webp"></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover_hu3887bf5f54664a8d95251105ebf05eb0_205538_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover_hu3887bf5f54664a8d95251105ebf05eb0_205538_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover_hu3887bf5f54664a8d95251105ebf05eb0_205538_816x0_resize_q95_h2_catmullrom_2.webp 816w, /2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover_hu3887bf5f54664a8d95251105ebf05eb0_205538_1632x0_resize_q95_h2_catmullrom_2.webp 1632w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px" />
                <img alt="Screenshot von VSCodium mit Navigationsbaum links, dem Quelltext der Selfie-Seite des kleinen Elefanten in der Mitte und der Live-Vorschau rechts." srcset="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover_hu3887bf5f54664a8d95251105ebf05eb0_205538_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover_hu3887bf5f54664a8d95251105ebf05eb0_205538_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover_hu3887bf5f54664a8d95251105ebf05eb0_205538_816x0_resize_q95_h2_catmullrom_2.webp 816w,/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover_hu3887bf5f54664a8d95251105ebf05eb0_205538_1632x0_resize_q95_h2_catmullrom_2.webp 1632w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px"
                     src="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover_hu3887bf5f54664a8d95251105ebf05eb0_205538_816x0_resize_q95_h2_catmullrom_2.webp" title="" loading="lazy" width="816" height="459" /></picture><figcaption></figcaption></figure><p>
</a></p>

<h2 id="meine-anpassungen-und-installierte-erweiterungen" data-numberify>Meine Anpassungen und installierte Erweiterungen<a class="anchor ms-1" href="#meine-anpassungen-und-installierte-erweiterungen"></a></h2>
<p>Ich habe ein paar kleine Anpassungen für VSCode, die ich hier aufliste, falls ich das irgendwann mal wieder brauche.</p>

<h3 id="weniger-ist-mehr" data-numberify>Weniger ist mehr<a class="anchor ms-1" href="#weniger-ist-mehr"></a></h3>
<p>Ich habe die &ldquo;Status bar&rdquo; (<code>View -&gt; Appearence -&gt; Status bar</code>) unten und die &ldquo;Menu bar&rdquo; (<code>View -&gt; Appearence -&gt; Menu bar</code>) oben ausgeblendet.</p>
<p>Falls man die &ldquo;Status Bar&rdquo; wieder benötigt, kann man sie mit <code>Ctrl + Shift + p</code> und der Eingabe von <code>View: Toggle Status Bar Visibility</code> oder Teilen davon wieder aktivieren.</p>
<p>Für die &ldquo;Menu bar&rdquo; gibt man <code>View: Toggle Menu bar</code> ein. Oder man drückt die <code>Alt</code>-Taste, dann erscheint die Menübar, wird direkt fokusiert, und verschwindet dann wieder, sobald man einen Eintrag gewählt hat oder erneut die <code>Alt</code>-Taste drückt.</p>

<h3 id="hervorhebung-der-aktuellen-zeile" data-numberify>Hervorhebung der aktuellen Zeile<a class="anchor ms-1" href="#hervorhebung-der-aktuellen-zeile"></a></h3>
<p>Die Hervorhebung der aktuellen Zeile gefällt mir bei VSCodium gar nicht, deshalb habe ich das so angepasst, wie ich es von Kate gewohnt bin.</p>
<p>Dazu öffnet man die Datei <code>settings.json</code> via <code>Strg + Shift + p</code> und der Eingabe von <code>Preferences: Open User Settings (JSON)</code> und trägt ein:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#e6db74">&#34;workbench.colorCustomizations&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;[Default Dark+]&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;editor.lineHighlightBackground&#34;</span>: <span style="color:#e6db74">&#34;#4587de2a&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;editor.lineHighlightBorder&#34;</span>: <span style="color:#e6db74">&#34;#4587de2a&#34;</span>
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;[Default Light+]&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;editor.lineHighlightBackground&#34;</span>: <span style="color:#e6db74">&#34;#4587de2a&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;editor.lineHighlightBorder&#34;</span>: <span style="color:#e6db74">&#34;#4587de2a&#34;</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Zeilenhervorhebung ohne Anpassung im Dark Theme mit kaum sichtbarer Umrandung:</p>
<p></p><figure class="image-caption"><picture><source type="webp" srcset="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-zeilenhervorhebung-ohne-anpassung.webp" />
			         <img alt="Screenshot. Kaum sichtbare Umrandung der aktuellen Zeile." src="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-zeilenhervorhebung-ohne-anpassung.webp" title="" width="493" height="21" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>
<p>Und mit Anpassung:</p>
<p></p><figure class="image-caption"><picture><source type="webp" srcset="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-zeilenhervorhebung-mit-anpassung.webp" />
			         <img alt="Screenshot. Blauer Hintergrund in der Zeile." src="/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-zeilenhervorhebung-mit-anpassung.webp" title="" width="493" height="21" loading="lazy" /></picture><figcaption></figcaption></figure><p>
</p>
<p>Damit zusätzlich auch noch die Zeilennummer hervorgehoben wird, fügt man hinzu:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#e6db74">&#34;editor.renderLineHighlight&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;all&#34;</span><span style="color:#960050;background-color:#1e0010">,</span>
</span></span></code></pre></div>
<h3 id="installierte-erweiterungen" data-numberify>Installierte Erweiterungen<a class="anchor ms-1" href="#installierte-erweiterungen"></a></h3>
<ul>
<li><code>streetsidesoftware.code-spell-checker-german</code> für Rechtschreibüberprüfung</li>
</ul>

<h2 id="fazit" data-numberify>Fazit<a class="anchor ms-1" href="#fazit"></a></h2>
<p>Ich habe diesen Blogbeitrag schon mit VSCodium geschrieben und währenddessen hier dokumentiert und ausprobiert.</p>
<p>Mein Fazit bisher ist, dass ich mich mit diesem Editor besser auf Inhalte fokussieren kann, da ich nicht ständig andere Tools benutzen muss. Wie z. B. eine Konsole für das aktuelle Datum und die Uhrzeit fürs Front-Matter, weil man auch Bilder (zumindest in der Markdown-Standard-Syntax) über den Dateiexplorer von VSCodium direkt einfügen kann.</p>
<p>Desweiteren brauche ich kein laufendes Hugo und keinen Browser, in dem die Vorschau angezeigt wird. Diese zeigt zwar genau das Ergebnis, wie es auch später online aussehen wird, aber das ist für meine Sachen meist nur zur Endkontrolle vor dem Veröffentlichen notwendig.</p>
<p>Ich kann mir vorstellen, dass man das Bauen mit Hugo auch noch in VSCodium einrichten könnte, aber ich mache das lieber extern. Ich brauche einen guten Editor zum Bearbeiten, aber keine eierlegende Wollmilchsau für alles zusammen.</p>]]></content:encoded><enclosure url="https://natenom.de/2022/09/wechsel-von-kate-zu-vscodium-fuer-markdown/2022-09-11-vscodium-mit-meinem-wiki-cover.webp" length="205538" type="image/webp"/></item><item><title>Ein Python-Script für die Arbeit mit Hugo (Update 2024-01-09)</title><link>https://natenom.de/2022/03/python-script-fuer-die-arbeit-mit-hugo/</link><pubDate>Thu, 24 Mar 2022 05:35:39 +0100</pubDate><guid>https://natenom.de/2022/03/python-script-fuer-die-arbeit-mit-hugo/</guid><description><![CDATA[<p>Bei der <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">Umstellung meines Blogs auf Hugo</a> hatte ich mehrere Shell-Aliase in der <code>.bashrc</code> erstellt, um die Arbeit einfacher zu gestalten, wie z. B. eine tmux-Session im Verzeichnis der Website starten, nach Seitennamen, Kategorien und Tags zu suchen und einiges mehr. Es wurden immer mehr Aliase und es war nicht wirklich flexibel sondern nur richtig hacky.</p>]]></description><content:encoded><![CDATA[<p>Bei der <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">Umstellung meines Blogs auf Hugo</a> hatte ich mehrere Shell-Aliase in der <code>.bashrc</code> erstellt, um die Arbeit einfacher zu gestalten, wie z. B. eine tmux-Session im Verzeichnis der Website starten, nach Seitennamen, Kategorien und Tags zu suchen und einiges mehr. Es wurden immer mehr Aliase und es war nicht wirklich flexibel sondern nur richtig hacky.</p>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content">Update (2024-01-09): Ich habe eine ganz neue Version des Python-Scripts veröffentlicht, das deutlich mehr kann, siehe <a  href="/2024/01/wofuer-ich-mein-hugo-helper-python-script-verwende-und-wo-man-es-findet/">in diesem Blogbeitrag</a>.</div>
</div>


<p>Spätestens seitdem ich auch <a  href="/2022/03/umzug-dokuwiki-hugo-1-vorarbeiten/">mein neues Wiki mit Hugo</a> nutze, funktionieren die vielen Aliase nicht mehr, denn ich bräuchte alles doppelt, um auch die Arbeit mit meinem Wiki damit bewerkstelligen zu können. Flexibel ist anders.</p>
<p>Und weil auch Vri in Zukunft in der Lage sein soll, sowohl im Wiki als auch im Blog Dinge zu tun, musste ich da was Schönes bauen. Denn meine vorherige Frickellösung könnte ich guten Gewissens niemandem zumuten.</p>
<p>Also habe ich heute Nacht ohne Ahnung und viel $Suchmaschine ein Python-Script erstellt, das die ganzen Shell-Aliase ersetzt und jetzt für beliebig viele Webseiten funktioniert. Und dabei habe ich sogar einen fiesen Bug in der <a  class='urlextern'  href="https://community.kde.org/Plasma">Plasmashell</a> gefunden.</p>

<h2 id="was-kann-das-script" data-numberify>Was kann das Script?<a class="anchor ms-1" href="#was-kann-das-script"></a></h2>
<p>Mit dem neuen Script kann ich sehr einfach:</p>
<ul>
<li>Eine Website generieren lassen.</li>
<li>Eine Website hochladen (mit rsync synchronisieren).</li>
<li>Die beiden oberen Dinge in einem Aufruf.</li>
<li>Eine Website lokal zur Verfügung stellen (<code>hugo server</code>).</li>
<li>Eine tmux-Session innerhalb des lokalen Verzeichnisses starten, um dort z. B. git zu verwenden.</li>
<li>(Nur im Blog) nach verwendeten Tags und nach Kategorien suchen. Dabei funktionieren sowohl einfache Strings als auch Reguläre Ausdrücke.</li>
<li>Mittels <code>grep -r</code> suchen.</li>
<li>Aktuelle Uhrzeit inklusive Datum und Zeitzone erhalten. Für das Front Matter (Metadaten einer einzelnen Seite).</li>
</ul>
<p>Hier z. B. die Suche nach allen Seiten im Blog, in denen der String <code>hugo</code> vorkommt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[…]
</span></span><span style="display:flex;"><span>content/posts/2016/2016-12-02-hugo-kann-mehrsprachig.md,,Hugo kann mehrsprachig :),2016-12-02T13:29:05Z,0001-01-01T00:00:00Z,2016-12-02T13:29:05Z,false,/2016/12/hugo-kann-mehrsprachig/
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>content/posts/2015/2015-12-10-gpeasy-php-durch-hugo-statisches-html-ersetzt.md,,gpEasy (PHP) durch Hugo (statisches HTML) ersetzt,2015-12-10T13:05:11Z,0001-01-01T00:00:00Z,2015-12-10T13:05:11Z,false,/2015/12/gpeasy-php-durch-hugo-statisches-html-ersetzt/
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Format: path,slug,title,date,expiryDate,publishDate,draft,permalink
</span></span><span style="display:flex;"><span>Results for &#39;hugo&#39;: 27</span></span></code></pre></div>

<h3 id="externe-konfiguration" data-numberify>Externe Konfiguration<a class="anchor ms-1" href="#externe-konfiguration"></a></h3>
<p>Die Konfigurationsdatei mit den Einstellungen für beliebig viele Websites liegt in <code>~/.config/hugo-noms.conf</code>.</p>

<h3 id="hilfe" data-numberify>Hilfe<a class="anchor ms-1" href="#hilfe"></a></h3>
<p>Da das Script <a  class='urlextern'  href="https://docs.python.org/3/library/argparse.html">argparse</a> verwendet, gibt es automatisch eine schöne Hilfe: <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>usage: hg.py [-h] [--site SITE_NAME | --time | --printconfig | --sites]
</span></span><span style="display:flex;"><span>             [--cd | --build | --upload | --deploy | --tmux | --serve | --serve_light]
</span></span><span style="display:flex;"><span>             [--searchpost SEARCHPOST | --searchgrep SEARCHGREP | --searchtag SEARCHTAG | --searchcat SEARCHCAT]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Handles hugo stuff.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>optional arguments:
</span></span><span style="display:flex;"><span>  -h, --help            show this help message and exit
</span></span><span style="display:flex;"><span>  --site SITE_NAME      Name of the website to work on currently.
</span></span><span style="display:flex;"><span>  --time                Copy current date and time to clipboard.
</span></span><span style="display:flex;"><span>  --printconfig         Print the devices configuration.
</span></span><span style="display:flex;"><span>  --sites               Print sites from configuration
</span></span><span style="display:flex;"><span>  --cd                  Change directory to workdir of site.
</span></span><span style="display:flex;"><span>  --build               Build a site.
</span></span><span style="display:flex;"><span>  --upload              Build AND upload site to remote.
</span></span><span style="display:flex;"><span>  --deploy              Deploy (build AND upload) a site.
</span></span><span style="display:flex;"><span>  --tmux                Start the tmux session for --site.
</span></span><span style="display:flex;"><span>  --serve               Serves site (full).
</span></span><span style="display:flex;"><span>  --serve_light         Serves site (light).
</span></span><span style="display:flex;"><span>  --searchpost SEARCHPOST
</span></span><span style="display:flex;"><span>                        Find pages/posts containing search term in &#39;path, slug, title, date or permalink&#39;.
</span></span><span style="display:flex;"><span>                        Strings and Regular Expressions (regex) are allowed.
</span></span><span style="display:flex;"><span>  --searchgrep SEARCHGREP
</span></span><span style="display:flex;"><span>                        Find pages/posts containing search term in file content. Uses &#39;grep -r&#39;. Strings and
</span></span><span style="display:flex;"><span>                        Regular Expressions (regex) are allowed.
</span></span><span style="display:flex;"><span>  --searchtag SEARCHTAG
</span></span><span style="display:flex;"><span>                        Find tags containing search term. Strings and Regular Expressions (regex) are allowed.
</span></span><span style="display:flex;"><span>  --searchcat SEARCHCAT
</span></span><span style="display:flex;"><span>                        Find categories containing search term. Strings and Regular Expressions (regex) are
</span></span><span style="display:flex;"><span>                        allowed.</span></span></code></pre></div>

<h2 id="wo-gibts-das-script" data-numberify>Wo gibts das Script?<a class="anchor ms-1" href="#wo-gibts-das-script"></a></h2>
<p>Vielleicht kann das ja noch jemand gebrauchen. Ich weiß aktuell nicht, wo ich es hinschubsen könnte, daher liegt es jetzt erst einmal in meinem Wiki im neuen Bereich <code>Hugo</code>, <a  href="https://wiki.natenom.de/docs/sammelsurium/hugo/">siehe hier</a>.</p>

<h2 id="nur-noch-zwei-aliase" data-numberify>Nur noch zwei Aliase<a class="anchor ms-1" href="#nur-noch-zwei-aliase"></a></h2>
<p>Da ich ein extrem fauler Mensch bin, habe ich aber später trotzdem noch zwei Aliase in der <code>.bashrc</code> definiert:</p>
<pre><code>alias hgb='/pfad/zu/hg.py --site blog'
alias hgw='/pfad/zu/hg.py --site wiki'
</code></pre>
<p>Somit kann ich z. B.</p>
<pre><code>hg.py --site blog --tmux
</code></pre>
<p>abkürzen mit</p>
<pre><code>hgb --tmux
</code></pre>
<p>🙂</p>

<h2 id="bug-in-plasmashell" data-numberify>Bug in Plasmashell<a class="anchor ms-1" href="#bug-in-plasmashell"></a></h2>
<p>Ruft man ein Script mit diesen beiden Zeilen auf oder führt es in iPython aus, dann hängt sich die Plasmashell entweder für ein paar Sekunden, lange oder komplett auf. Der String landet trotzdem nicht in der Zwischenablage obwohl xclip als auch xsel installiert sind.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> pyperclip
</span></span><span style="display:flex;"><span>pyperclip<span style="color:#f92672">.</span>copy(<span style="color:#e6db74">&#34;text&#34;</span>)</span></span></code></pre></div>
<p>Ich wollte diese Funktion nutzen, um einen generierten String mit Datum, Uhrzeit und Zeitzone in die Zwischenablage zu kopieren, um diesen dann im Front Matter eines Blogbeitrags manuell über die Zwischenablage einfügen zu können. Stattdessen nutze ich jetzt <code>os.system(&quot;date … | xsel …&quot;)</code>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>schlechtes Englisch darf behalten werden 🙂&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content:encoded></item><item><title>Umzug von DokuWiki nach Hugo – Teil 2 – Export mit Pandoc</title><link>https://natenom.de/2022/03/umzug-dokuwiki-hugo-2-pandoc/</link><pubDate>Thu, 17 Mar 2022 00:56:09 +0100</pubDate><guid>https://natenom.de/2022/03/umzug-dokuwiki-hugo-2-pandoc/</guid><description><![CDATA[<p>Es gibt verschiedene Tools, um die Inhalte eines DokuWiki von dessen eigener Syntax nach Markdown zu konvertieren, welches in Hugo verwendet wird. Die Auswertung davon <a  href="/2022/03/tools-export-dokuwiki-nach-markdown-hugo/">gibt es hier</a>.</p>
<p>Ich habe mich für <a  class='urlextern'  href="https://pandoc.org/">Pandoc</a> entschieden.</p>]]></description><content:encoded><![CDATA[<p>Es gibt verschiedene Tools, um die Inhalte eines DokuWiki von dessen eigener Syntax nach Markdown zu konvertieren, welches in Hugo verwendet wird. Die Auswertung davon <a  href="/2022/03/tools-export-dokuwiki-nach-markdown-hugo/">gibt es hier</a>.</p>
<p>Ich habe mich für <a  class='urlextern'  href="https://pandoc.org/">Pandoc</a> entschieden.</p>
<h2 id="export-mit-hilfe-von-pandoc" data-numberify>Export mit Hilfe von Pandoc<a class="anchor ms-1" href="#export-mit-hilfe-von-pandoc"></a></h2>
<p>Der grundsätzliche Aufruf für den Export via Pandoc ist:</p>
<pre><code>find path/to/pages/ -iname &quot;*.txt&quot; -exec pandoc --wrap=none -s --from=dokuwiki --to=gfm -o &quot;{}.md&quot; '{}' \;
</code></pre>
<p>Der Parameter <code>--wrap=none</code> ist wichtig, weil sonst Zeilen immer nach 72 Zeichen einen Zeilenumbruch bekommen. Dokumentation hierzu siehe <a  class='urlextern'  href="https://pandoc.org/MANUAL.html#general-writer-options">hier</a> im Bereich &ldquo;wrap&rdquo;.</p>
<p>Die erstellten .md-Dateien liegen jetzt immer an der selben Stelle wo auch die .txt-Datien liegen.</p>
<div class="shortcode-notice hinweis">
    <div class="shortcode-notice-title hinweis">
        Hinweis</div>
    <div class="notice-content"><p>Man benötigt eine Pandoc-Version ab mindestens 2.11.3, da sonst Interwiki-Links durch Links zu Google ersetzt werden. Siehe im Bereich &ldquo;Dokuwiki reader&rdquo; der <a  class='urlextern'  href="https://pandoc.org/releases.html#pandoc-2.11.3-2020-12-17">Release Notes</a> von Pandoc.</p>
<p>Da es in Debian selbst in Unstable nur Version 2.9 gibt, kann man manuell die neueste Version installieren, siehe <a  class='urlextern'  href="https://pandoc.org/installing.html#linux">hier</a>.</p>
</div>
</div>

<h2 id="txt-dateien-löschen" data-numberify>.txt-Dateien löschen<a class="anchor ms-1" href="#txt-dateien-löschen"></a></h2>
<p>Die alten .txt-Dateien können jetzt gelöscht werden mit:</p>
<pre><code>find path/to/pages/ -name &quot;*.txt&quot; -execdir rm '{}' \;
</code></pre>

<h2 id="front-matter" data-numberify>Front Matter<a class="anchor ms-1" href="#front-matter"></a></h2>
<p>Damit Dateien überhaupt in Hugo gerendert werden, müssen sie ein rudimentäres Front Matter haben, das zumindest z. B. den Titel enthält:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">title</span>: <span style="color:#ae81ff">Müllsammeln</span>
</span></span><span style="display:flex;"><span>---</span></span></code></pre></div></p>
<p>Für das Hinzufügen dieses rudimentären Front Matters (mit dem Dateinamen als Titel) habe ich das Script von <a  class='urlextern'  href="https://gist.github.com/thebearjew/79f5f572baa8dc8e6d492a282c7d4fc9">hier</a> angepasst und hinzugefügt, dass auch die erste <code>H1</code>-Überschrift in jeder Datei entfernt wird, da Hugo diese beim Rendern der Website automatisch aus dem <code>titel:</code> generiert. Zusätzlich wird noch das <code>.txt</code> aus den Dateinamen entfernt.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/bash
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span>filepath<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span>$1<span style="color:#e6db74">&#34;</span> <span style="color:#75715e">#path/to/filename.md</span>
</span></span><span style="display:flex;"><span>file_name<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>basename $filepath<span style="color:#66d9ef">)</span> <span style="color:#75715e">#filename.md</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>md<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;.txt.md&#39;</span>
</span></span><span style="display:flex;"><span>title<span style="color:#f92672">=</span><span style="color:#e6db74">${</span>file_name%$md<span style="color:#e6db74">}</span> <span style="color:#75715e">#filname</span>
</span></span><span style="display:flex;"><span>newname<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>title<span style="color:#e6db74">}</span><span style="color:#e6db74">.md&#34;</span> <span style="color:#75715e">#filename.md</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>TEMPLATE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;---
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">title: </span>$title<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">---
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"># Remove first line of file (with # Title)
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">sed -i &#39;1d&#39; &#34;</span><span style="color:#e6db74">${</span>filepath<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">echo &#34;</span>$TEMPLATE<span style="color:#e6db74">&#34; | cat - &#34;</span>$filepath<span style="color:#e6db74">&#34; &gt; temp &amp;&amp; mv temp &#34;</span><span style="color:#e6db74">${</span>filepath%$md<span style="color:#e6db74">}</span>.md<span style="color:#e6db74">&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">rm </span><span style="color:#e6db74">${</span>filepath<span style="color:#e6db74">}</span></span></span></code></pre></div>
<p>Der Aufruf ist:</p>
<pre><code>find pages/ -name &quot;*.md&quot; -print0 | xargs -0 -I file path/to/prepend.sh file
</code></pre>

<h2 id="fertig" data-numberify>Fertig<a class="anchor ms-1" href="#fertig"></a></h2>
<p>Im Ergebnis erhält man die komplette Verzeichnisstruktur eines DokuWiki mit Dateien im Markdown-Format.</p>
<p>Zusätzlich benötigt man aber noch die Medien-Dateien (Fotos, Screenshots, Videos, usw.) aus dem DokuWiki.</p>

<h3 id="verzeichnisstruktur-der-md-dateien" data-numberify>Verzeichnisstruktur der .md-Dateien<a class="anchor ms-1" href="#verzeichnisstruktur-der-md-dateien"></a></h3>
<p>Hier ein Auszug aus der Verzeichnisstruktur meines exportierten Wikis:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>└── pages
</span></span><span style="display:flex;"><span>    […]
</span></span><span style="display:flex;"><span>    ├── sport
</span></span><span style="display:flex;"><span>    │   ├── fahrrad
</span></span><span style="display:flex;"><span>    │   │   ├── hunde.md
</span></span><span style="display:flex;"><span>    │   │   ├── kleidung
</span></span><span style="display:flex;"><span>    │   │   │   ├── armlinge_und_beinlinge.md
</span></span><span style="display:flex;"><span>    │   │   │   ├── baselayer.md
</span></span><span style="display:flex;"><span>    │   │   │   ├── handschuhe.md
</span></span><span style="display:flex;"><span>    │   │   │   ├── hose.md
</span></span><span style="display:flex;"><span>    │   │   │   ├── lenkerstulpen
</span></span><span style="display:flex;"><span>    │   │   │   │   ├── 45nrth.md
</span></span><span style="display:flex;"><span>    │   │   │   │   └── einfache_variante.md
</span></span><span style="display:flex;"><span>    │   │   │   ├── lenkerstulpen.md
</span></span><span style="display:flex;"><span>    │   │   │   ├── schuhe.md
</span></span><span style="display:flex;"><span>    │   │   │   ├── sicherheitsweste.md
</span></span><span style="display:flex;"><span>    […]</span></span></code></pre></div></p>

<h3 id="verzeichnisstruktur-der-medien-dateien" data-numberify>Verzeichnisstruktur der Medien-Dateien<a class="anchor ms-1" href="#verzeichnisstruktur-der-medien-dateien"></a></h3>
<p>Zusätzlich benötigt man natürlich noch die Dateien aus <code>media/</code>.</p>
<p>Auch hier ein Auszug aus den entsprechenden Verzeichnissen meines alten Wikis:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>    […]
</span></span><span style="display:flex;"><span>├─ sport
</span></span><span style="display:flex;"><span>│   └── fahrrad
</span></span><span style="display:flex;"><span>│       ├── 2019-06_kamera_befestigung_am_rueckspiegel_1.jpeg
</span></span><span style="display:flex;"><span>│       ├── 2019-06_kamera_befestigung_am_rueckspiegel_2.jpeg
</span></span><span style="display:flex;"><span>│       ├── 2020-07_kamera_setup_vorne_1.jpg
</span></span><span style="display:flex;"><span>│       ├── 2020-07_kamera_setup_vorne_2.jpg
</span></span><span style="display:flex;"><span>│       ├── 2020-07_kamera_setup_vorne_3.jpg
</span></span><span style="display:flex;"><span>│       ├── 2020-12_kamerabefestigung_lenkertaschenhalter_01.jpg
</span></span><span style="display:flex;"><span>        […]</span></span></code></pre></div></p>]]></content:encoded></item><item><title>Tools zum Export von DokuWiki nach Markdown (Hugo)</title><link>https://natenom.de/2022/03/tools-export-dokuwiki-nach-markdown-hugo/</link><pubDate>Wed, 16 Mar 2022 14:47:37 +0100</pubDate><guid>https://natenom.de/2022/03/tools-export-dokuwiki-nach-markdown-hugo/</guid><description>&lt;p>Da ich mein &lt;a href="https://wikiarchiv.natenom.de/">DokuWiki&lt;/a> auf Lange Sicht nach Hugo umziehen möchte, habe ich mir verschiedene Möglichkeiten angesehen, die Daten zu exportieren und ins Format Markdown zu überführen, welches in Hugo verwendet wird.&lt;/p></description><content:encoded><![CDATA[<p>Da ich mein <a  href="https://wikiarchiv.natenom.de/">DokuWiki</a> auf Lange Sicht nach Hugo umziehen möchte, habe ich mir verschiedene Möglichkeiten angesehen, die Daten zu exportieren und ins Format Markdown zu überführen, welches in Hugo verwendet wird.</p>
<h2 id="dokuwiki-to-markdown-converter" data-numberify>DokuWiki-to-Markdown-Converter<a class="anchor ms-1" href="#dokuwiki-to-markdown-converter"></a></h2>
<p><a  class='urlextern'  href="https://github.com/ludoza/DokuWiki-to-Markdown-Converter">Link zum Konverter</a></p>
<p>Aufruf:</p>
<pre><code>find path/to/pages/ -name &quot;*.txt&quot; -exec php convert.php '{}' \;
</code></pre>
<p>Danach gibt es sowohl die alten .txt-Dateien als auch die neuen .md-Dateien in <code>pages/</code>. Jetzt können wir die alten Dateien löschen:</p>
<pre><code>find path/to/pages/ -name &quot;*.txt&quot; -execdir rm '{}' \;
</code></pre>
<p>Das Ergebnis ist eine Verzeichnisstruktur von <code>pages</code>, die nur noch .md-Dateien ohne <code>Front Matter</code> enthält.</p>

<h3 id="pro-und-kontra-von-dokuwiki-to-markdown-converter" data-numberify>Pro und Kontra von DokuWiki-to-Markdown-Converter<a class="anchor ms-1" href="#pro-und-kontra-von-dokuwiki-to-markdown-converter"></a></h3>
<ul>
<li>Pro
<ul>
<li>Konvertiert Tabellen</li>
<li>Konvertiert ins <code>Github flavored Markdown</code></li>
<li>Konvertiert eingebettete Bilder, auch mit Bildbeschreibungen.</li>
</ul>
</li>
<li>Kontra
<ul>
<li>Das Tool erstellt kein Front Matter.</li>
<li>Keine Konvertierung von Fußnoten.</li>
<li>Leerzeile auch zwischen zusammen gehörigen Listen</li>
<li>Hat Probleme bei Titeln von Tabellen (gibt es keine Überschrift, dann wird die erste Zeile zur Überschrift).</li>
</ul>
</li>
</ul>

<h2 id="dokuwiki-to-hugo" data-numberify>DokuWiki-to-Hugo<a class="anchor ms-1" href="#dokuwiki-to-hugo"></a></h2>
<p><a  class='urlextern'  href="https://github.com/wgroeneveld/dokuwiki-to-hugo">Link zum Konverter</a></p>
<p>Aufruf:</p>
<pre><code>python src/main.py --dir='path/to/pages/'
</code></pre>
<p>Das Ergebnis ist eine neue Verzeichnisstruktur von <code>pages</code>, die nur noch .md-Dateien ohne <code>Front Matter</code> enthält.</p>

<h3 id="pro-und-kontra-von-dokuwiki-to-hugo" data-numberify>Pro und Kontra von DokuWiki-to-Hugo<a class="anchor ms-1" href="#pro-und-kontra-von-dokuwiki-to-hugo"></a></h3>
<ul>
<li>Pro
<ul>
<li>Erzeugt Front Matter, allerdings im TOML-Format</li>
</ul>
</li>
<li>Kontra
<ul>
<li>Bei mir wurde nur das Front Matter zur exportierten Datei hinzugefügt, jedoch keinerlei Konvertierung der Dateiinhalte vorgenommen.</li>
<li>Selbst wenn es funktionieren würde, so gibt es nur Konvertierungen für relativ wenige Elemente.</li>
</ul>
</li>
</ul>

<h2 id="pandoc" data-numberify>Pandoc<a class="anchor ms-1" href="#pandoc"></a></h2>
<p><a  class='urlextern'  href="https://pandoc.org/">Link zum Konverter</a></p>
<p>Aufruf:</p>
<pre><code>find path/to/pages/ -iname &quot;*.txt&quot; -exec pandoc --wrap=none -s --from=dokuwiki --to=gfm -o &quot;{}.md&quot; '{}' \;
</code></pre>
<p>Der Parameter <code>--wrap=none</code> ist wichtig, da sonst in jeder Zeile nach 72 Zeichen ein Zeilenumbruch eingefügt wird. Dokumentation dazu gibt es <a  class='urlextern'  href="https://pandoc.org/MANUAL.html#general-writer-options">hier</a> im Bereich &ldquo;wrap&rdquo;.</p>
<div class="shortcode-notice hinweis">
    <div class="shortcode-notice-title hinweis">
        Hinweis</div>
    <div class="notice-content">Man benötigt eine Pandoc-Version ab mindestens 2.11.3, da sonst Interwiki-Links durch Links zu Google ersetzt werden. Siehe im Bereich &ldquo;Dokuwiki reader&rdquo; der <a  class='urlextern'  href="https://pandoc.org/releases.html#pandoc-2.11.3-2020-12-17">Release Notes</a> von Pandoc. Da es in Debian selbst in Unstable nur Version 2.9 gibt, kann man manuell die neueste Version installieren, siehe <a  class='urlextern'  href="https://pandoc.org/installing.html#linux">hier</a>.</div>
</div>

<h3 id="pro-und-kontra-von-pandoc" data-numberify>Pro und Kontra von Pandoc<a class="anchor ms-1" href="#pro-und-kontra-von-pandoc"></a></h3>
<ul>
<li>Pro
<ul>
<li>Konvertiert Fußnoten und viele andere Dinge.</li>
</ul>
</li>
<li>Kontra
<ul>
<li>Kein Front-Matter (natürlich nicht, ist ein Konverter, kein Hugo-Exporter). Der lässt sich aber rudimentär selbst einfügen.</li>
<li>Konvertiert eingebettete Bilder in img-Tags statt in die Markdown-Syntax.</li>
</ul>
</li>
</ul>

<h2 id="fazit" data-numberify>Fazit<a class="anchor ms-1" href="#fazit"></a></h2>
<p>Pandoc gefällt mir von den getesteten Möglichkeiten am besten. Wie ich das genau benutzt habe, um die Inhalte meines Wikis zu exportieren, schreibe ich in einem eigenen Blogbeitrag und werde diesen hier verlinken.</p>]]></content:encoded></item><item><title>URL-Struktur in Hugo mit url, slug und title</title><link>https://natenom.de/2022/02/url-struktur-hugo-url-slug-title/</link><pubDate>Mon, 14 Feb 2022 14:23:51 +0100</pubDate><guid>https://natenom.de/2022/02/url-struktur-hugo-url-slug-title/</guid><description>Alles dank dem Export von WordPress Ich habe mich etwas mit der URL-Struktur hier im Blog beschäftigt. Da ich anfänglich fast nur auf Basis der aus WordPress exportierten Blogbeiträgt gearbeitete hatte, gewöhnte ich mir an, im Front Matter immer die Option url: anzugeben. Diese enthält immer den vollen Pfad der URL ab der baseURL. Letztere besteht in meinem Blog aus dem Protokoll (https) und dem Domainnamen.
Für diesen Blogbeitrag hätte ich somit im Front Matter eingetragen:</description><content:encoded><![CDATA[
<h2 id="alles-dank-dem-export-von-wordpress" data-numberify>Alles dank dem Export von WordPress<a class="anchor ms-1" href="#alles-dank-dem-export-von-wordpress"></a></h2>
<p>Ich habe mich etwas mit der URL-Struktur hier im Blog beschäftigt. Da ich anfänglich fast nur auf Basis der aus <a  href="/tags/wordpress/">WordPress</a> exportierten Blogbeiträgt gearbeitete hatte, gewöhnte ich mir an, im Front Matter immer die Option <code>url:</code> anzugeben. Diese enthält immer den vollen Pfad der URL ab der <code>baseURL</code>. Letztere besteht in meinem Blog aus dem Protokoll (https) und dem Domainnamen.</p>
<p>Für diesen Blogbeitrag hätte ich somit im Front Matter eingetragen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">url</span>: <span style="color:#ae81ff">/2022/02/url-struktur-hugo-url-slug-title</span></span></span></code></pre></div>

<h2 id="nicht-gut" data-numberify>Nicht gut<a class="anchor ms-1" href="#nicht-gut"></a></h2>
<p>Das ist nicht optimal, denn man verliert die Flexibilität. So kann man nicht einfach mal irgendwann die URL-Struktur anpassen, weil in jedem Blogbeitrag schon die am höchsten priorisierte Option <code>url:</code> angegeben ist.</p>
<p>Außerdem braucht man es auch gar nicht, da es in der Konfiguration von Hugo einen Abschnitt gibt, der festlegt, wie die URL (nach der BaseURL) generiert werden soll.</p>

<h2 id="gut" data-numberify>Gut<a class="anchor ms-1" href="#gut"></a></h2>
<p>Ich habe die Konfiguration von Hugo umgestellt und werde in Zukunft nur noch <code>slug:</code> angeben. Der Slug ist der Teil der URL, der nur das Dokument des Blogbeitrags repräsentiert. Im oberen Beispiel wäre das <code>&quot;url-struktur-hugo-url-slug-title&quot;</code>.</p>
<p>Damit die URL-Struktur im Blog weiterhin so bleibt wie bisher (&quot;/jahr/monat/titel-des-beitrags/&quot;), habe ich in die <code>config.toml</code> eingetragen:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">permalinks</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">posts</span> = <span style="color:#e6db74">&#39;/:year/:month/:slug/&#39;</span></span></span></code></pre></div></p>
<p>Die Voreinstellung, würde man das nicht einfügen, wäre:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span><span style="color:#e6db74">&#39;/:year/:month/:title/&#39;</span></span></span></code></pre></div></p>
<p>Die Voreinstellung will ich nicht, da ich teils lange Titel für Blogbeiträge habe, die URLs insgesamt aber relativ kurz halten möchte.</p>
<p>Jetzt verwende ich im Front Matter eines Blogbeitrags nur noch die Option <code>slug: </code> und habe im Endeffekt die selbe URL-Struktur und das ganze ist dadurch weniger fehleranfällig, falls man in der url bei Jahr oder Monat etwas Falsches einträgt.</p>
<p>Im Front Matter sah es früher so aus:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">title</span>: <span style="color:#ae81ff">URL-Struktur in Hugo mit url, slug und title</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">url</span>: <span style="color:#ae81ff">/2022/02/url-struktur-hugo-url-slug-title</span>
</span></span><span style="display:flex;"><span>[<span style="color:#ae81ff">…]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>---</span></span></code></pre></div></p>
<p>Und jetzt so:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">title</span>: <span style="color:#ae81ff">URL-Struktur in Hugo mit url, slug und title</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">slug</span>: <span style="color:#ae81ff">url-struktur-hugo-url-slug-title</span>
</span></span><span style="display:flex;"><span>[<span style="color:#ae81ff">…]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>---</span></span></code></pre></div></p>
<p>Erreichbar ist der Blogbeitrag in beiden Fällen unter:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>natenom.de/2022/02/url-struktur-hugo-url-slug-title</span></span></code></pre></div></p>
<div class="shortcode-update">
<p>Update: Ich wurde darauf hingewiesen, dass Hugo den Namen des Markdown-Dokuments bzw. den Verzeichnisnamen des Page Bundles automatisch als String für den Slug verwendet, wenn man die Option nicht explizit im Front Matter setzt.</p>
</div>


<h2 id="bestehende-blogbeiträge-per-script-ändern-irgendwann" data-numberify>Bestehende Blogbeiträge per Script ändern, irgendwann<a class="anchor ms-1" href="#bestehende-blogbeiträge-per-script-ändern-irgendwann"></a></h2>
<p>Und wenn ich dann irgendwann mal alle Front Matter der Blogbeiträge automatisiert von <code>url: </code> nach <code>slug: </code> ändere, habe ich dann sogar die Möglichkeit, mit einer einzigen Änderung in der <code>config.toml</code> die URL-Struktur für alle Blogbeiträge auf einmal zu verändern. Natürlich sollte man in so einem Fall dann Weiterleitungen einrichten.</p>
<p>Bis dahin gibt es keine Probleme mit der bestehenden URL-Struktur, da die Option <code>url:</code> im Front Matter eines Beitrags immer die höchste Priorität hat.</p>

<h2 id="dokumentation" data-numberify>Dokumentation<a class="anchor ms-1" href="#dokumentation"></a></h2>
<p>Die <a  class='urlextern'  href="https://gohugo.io/content-management/urls/">Dokumentation zu diesem Thema</a> findet sich auf der Projektseite von Hugo.</p>
]]></content:encoded></item><item><title>Ein neues Helferlein für die Arbeit mit Hugo</title><link>https://natenom.de/2022/02/ein-neues-helferlein-fuer-die-arbeit-mit-hugo/</link><pubDate>Wed, 09 Feb 2022 20:14:06 +0100</pubDate><guid>https://natenom.de/2022/02/ein-neues-helferlein-fuer-die-arbeit-mit-hugo/</guid><description><![CDATA[Bevor ich einen Blogbeitrag veröffentliche, möchte ich meist das aktuelle Datum mit Uhrzeit im Front Matter eintragen. Dieser Wert bestimmt, wann laut Blog der Beitrag veröffentlicht wurde. Den benötigten String erstellt mir ein Alias in der .bashrc:
alias hugo-date-now=&#39;date +&#34;%Y-%m-%dT%H:%M:%S%:z&#34; | xsel -i -b ; echo &#34;Check your clipboard :)&#34;&#39; Da man in meinem Editor Kate direkt eine Konsole starten kann, tue ich das, gebe hugo-date-now ein und als Ergebnis befindet sich der benötigte String mit aktuellem Datum und Uhrzeig in der Zwischenablage.]]></description><content:encoded><![CDATA[<p>Bevor ich einen Blogbeitrag veröffentliche, möchte ich meist das aktuelle Datum mit Uhrzeit im Front Matter eintragen. Dieser Wert bestimmt, wann laut Blog der Beitrag veröffentlicht wurde. Den benötigten String erstellt mir ein Alias in der .bashrc:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>alias hugo-date-now<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;date +&#34;%Y-%m-%dT%H:%M:%S%:z&#34; | xsel -i -b ; echo &#34;Check your clipboard :)&#34;&#39;</span></span></span></code></pre></div>
<p>Da man in meinem Editor Kate direkt eine Konsole starten kann, tue ich das, gebe <code>hugo-date-now</code> ein und als Ergebnis befindet sich der benötigte String mit aktuellem Datum und Uhrzeig in der Zwischenablage. Den kann ich dann im Front Matter eintragen, z. B. für diesen Blogbeitrag hier:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>2022-02-09T20:14:06+01:00</span></span></code></pre></div>
]]></content:encoded></item><item><title>Twitter Cards, Open Graph und Artikelbilder im Hugo-Theme hugo-theme-bootstrap</title><link>https://natenom.de/2022/02/hugo-theme-bootstrap-twitter-open-graph-artikelbilder/</link><pubDate>Mon, 07 Feb 2022 10:41:13 +0100</pubDate><guid>https://natenom.de/2022/02/hugo-theme-bootstrap-twitter-open-graph-artikelbilder/</guid><description>Es gibt Neuerungen im Theme hugo-theme-bootstrap, das hier im Blog verwendet wird. Könnte interessant sein für Menschen, die das Theme auch verwenden.
Artikelbilder Vor dem Update Bisher wurde als Beitragsbild das erste Bild in der Liste der Bilder der Variable images: im Front Matter verwendet: images: - relativer-pfad/bild.jpg # Ergebnis: /blogbeitrag-titel/relativer-pfad/bild.jpg
Oder:
images: - /absoluter-pfad/bild.jpg # Ergebnis: /absoluter-pfad/bild.jpg Nach dem Update Seit dem Update hat sich das verändert. Relative Pfade sind nicht mehr relativ zum aktuellen Beitrag bzw.</description><content:encoded><![CDATA[<p>Es gibt Neuerungen im Theme <a  class='urlextern'  href="https://github.com/razonyang/hugo-theme-bootstrap/">hugo-theme-bootstrap</a>, das hier im Blog verwendet wird. Könnte interessant sein für Menschen, die das Theme auch verwenden.</p>

<h2 id="artikelbilder" data-numberify>Artikelbilder<a class="anchor ms-1" href="#artikelbilder"></a></h2>

<h3 id="vor-dem-update" data-numberify>Vor dem Update<a class="anchor ms-1" href="#vor-dem-update"></a></h3>
<p>Bisher wurde als Beitragsbild das erste Bild in der Liste der Bilder der Variable <code>images:</code> im Front Matter verwendet:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">images</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">relativer-pfad/bild.jpg</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Ergebnis: /blogbeitrag-titel/relativer-pfad/bild.jpg</span></span></span></code></pre></div></p>
<p>Oder:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">images</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">/absoluter-pfad/bild.jpg</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Ergebnis: /absoluter-pfad/bild.jpg</span></span></span></code></pre></div>

<h3 id="nach-dem-update" data-numberify>Nach dem Update<a class="anchor ms-1" href="#nach-dem-update"></a></h3>
<p>Seit dem Update hat sich das <a  class='urlextern'  href="https://github.com/razonyang/hugo-theme-bootstrap/commit/c08bca72ebc43319d04f419c66f7f88e97755d97">verändert</a>. Relative Pfade sind nicht mehr relativ zum aktuellen Beitrag bzw. Page Bundle sondern immer relativ zum static-Verzeichnis der Website:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">images</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">relativer-pfad/bild.jpg</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Ergebnis: /relativer-pfad/bild.jpg</span></span></span></code></pre></div>
<p>Dann gibt es noch die Neuerungen, dass fürs Artikelbild automatisch das erste gefundene Bild eines Page Bundles verwendet wird, wenn folgender Dateiname passt (in dieser Reihenfolge) UND KEINE Variable <code>images</code> im Front Matter definiert ist:</p>
<ul>
<li>*feature*</li>
<li>*cover*</li>
<li>*thumbnail*</li>
</ul>
<p>Hierbei sollte ein Bild verwendet werden, das in den Breiten von 180 Pixel und um 500 Pixel noch gut aussieht, da die Artikelbilder in der normalen Ansicht sehr klein und in der mobilen Ansicht sehr groß angezeigt werden.</p>
<p>Vielleicht könnte man hier noch einen Feature Request stellen, damit für das verwendete Bild automatisch die benötigten Größen von Hugo generiert werden. Technisch ist das möglich.</p>

<h2 id="twitter-card-und-open-graph" data-numberify>Twitter Card und Open Graph<a class="anchor ms-1" href="#twitter-card-und-open-graph"></a></h2>
<p>Für die Twitter Card und den Open Graph wird immer das Artikelbild verwendet. Gibt es kein Artikelbild, dann nutzen Twitter Card und Open Graph das in der <code>config.toml</code> eingestellte Bild der Variable <code>logo=</code>. Vor dem Update gab es in letzterem Fall gar kein Bild.</p>
<p>Die Lösung mit dem logo finde ich nicht gut. Denn normalerweise wird das Logo auf der Website oben nur in 30x30 Pixeln dargestellt, auf Twitter oder anderen Social-Media-Plattformen aber mit über 500 Pixeln. Auch hier wäre es meiner Ansicht nach möglich, automatisch die Größenvarianten des Logos von Hugo erstellen zu lassen.</p>
<p>Somit wurde die Handhabung im Theme an die Funktionsweise in Hugo selbst <a  class='urlextern'  href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/twitter_cards.html">angeglichen</a>.</p>
<p></p><figure class="image-caption"><picture><source type="png" srcset="/2022/02/hugo-theme-bootstrap-twitter-open-graph-artikelbilder/2022-02-07-beispiel-einer-twitter-card.png" />
			         <img alt="Beispiel einer Twitter Card" src="/2022/02/hugo-theme-bootstrap-twitter-open-graph-artikelbilder/2022-02-07-beispiel-einer-twitter-card.png" title="Beispiel einer Twitter Card" width="417" height="316" loading="lazy" /></picture><figcaption>Beispiel einer Twitter Card</figcaption></figure><p>
</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/hugo-theme-bootstrap-twitter-open-graph-artikelbilder/cover.png" length="91714" type="image/png"/></item><item><title>Nextcloud Editor für Markdown-Dateien zerstört Front Matter von Hugo</title><link>https://natenom.de/2022/02/nextcloud-editor-zerstoert-frontmatter/</link><pubDate>Sun, 06 Feb 2022 17:19:55 +0100</pubDate><guid>https://natenom.de/2022/02/nextcloud-editor-zerstoert-frontmatter/</guid><description>Ich benutze Nextcloud, um die Markdown-Dateien für meinen Blog auf verschiedenen Geräte bearbeiten zu können. Der Blog wird mit Hugo generiert.
Dabei habe ich bemerkt, dass der Editor, der per Voreinstellung sowohl im Browser in Nextcloud als auch in der Android-App benutzt wird, das Front Matter der Dateien nach dem Bearbeiten zerstört.
Aus:
title: Linkdump KW FIXME/2022 url: /2022/xx-linkdump-kw-FIXME-2022 date: 2022-02-06T14:16:09+01:00 author: Natenom description: Linkdump für Kalenderwoche FIXME/2022 #disable_lightbox: true images: - featured.</description><content:encoded><![CDATA[<p>Ich benutze Nextcloud, um die Markdown-Dateien für meinen Blog auf verschiedenen Geräte bearbeiten zu können. Der Blog wird mit Hugo generiert.</p>
<p>Dabei habe ich bemerkt, dass der Editor, der per Voreinstellung sowohl im Browser in Nextcloud als auch in der Android-App benutzt wird, das Front Matter der Dateien nach dem Bearbeiten zerstört.</p>
<p>Aus:</p>

<h2 id="hahahugoshortcode1188s0hbhb" data-numberify><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>title: Linkdump KW FIXME/2022
</span></span><span style="display:flex;"><span>url: /2022/xx-linkdump-kw-FIXME-2022
</span></span><span style="display:flex;"><span>date: 2022-02-06T14:16:09+01:00
</span></span><span style="display:flex;"><span>author: Natenom
</span></span><span style="display:flex;"><span>description: Linkdump für Kalenderwoche FIXME/2022
</span></span><span style="display:flex;"><span>#disable_lightbox: true
</span></span><span style="display:flex;"><span>images:
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> featured.png
</span></span><span style="display:flex;"><span>  categories:
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> Linkdump
</span></span><span style="display:flex;"><span>  tags:
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> FIXME
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>---</span></span></code></pre></div><a class="anchor ms-1" href="#hahahugoshortcode1188s0hbhb"></a></h2>
<p>wird:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>title: Linkdump KW FIXME/2022 url: /2022/xx-linkdump-kw-FIXME-2022 date: 2022-02-06T14:16:09+01:00 author: Natenom description: Linkdump für Kalenderwoche FIXME/2022 #disable_lightbox: true images:
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> featured.png categories:
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> Linkdump tags:
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> FIXME
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>---</span></span></code></pre></div></p>
<p>Bei Verwendung der Nextcloud-App sollte man also besser eine eigene App zur Bearbeitung verwenden. Ich nutze auf Android den Editor <a  class='urlextern'  href="https://gsantner.net/project/markor.html">Markor</a>.</p>
<p>Möchte man Markdown-Dateien auch im Browser bearbeiten, so kann man zusätzlich zum Standardeditor auch einen anderen installieren. Z. B. <a  class='urlextern'  href="https://apps.nextcloud.com/apps/files_markdown">files_markdown</a>.</p>
<p>Über die drei Punkte rechts wählt man ihn zum Öffnen der Datei aus:
</p><figure class="image-caption"><picture><source type="png" srcset="/2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-oeffnen-mit.png" />
			         <img alt="Öffnen mit Dialog in Nextcloud" src="/2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-oeffnen-mit.png" title="Öffnen mit Dialog in Nextcloud" width="807" height="457" loading="lazy" /></picture><figcaption>Öffnen mit Dialog in Nextcloud</figcaption></figure><p>
</p>
<p>Der Editor zeigt wahlweise nur den Quelltext an, Quelltext und Vorschau oder nur die Vorschau.
</p><figure class="image-caption"><a href="/2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-text-editor.png"><picture>
                <source type="image/webp" srcset="/2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-text-editor_hu0c7469ef4636e35ccaf839f045effb7f_281683_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-text-editor_hu0c7469ef4636e35ccaf839f045effb7f_281683_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-text-editor_hu0c7469ef4636e35ccaf839f045effb7f_281683_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Alternativer Editor mit Vorschaufunktion" srcset="/2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-text-editor_hu0c7469ef4636e35ccaf839f045effb7f_281683_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-text-editor_hu0c7469ef4636e35ccaf839f045effb7f_281683_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-text-editor_hu0c7469ef4636e35ccaf839f045effb7f_281683_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/nextcloud-editor-zerstoert-frontmatter/images/2022-02-06-nextcloud-text-editor_hu0c7469ef4636e35ccaf839f045effb7f_281683_816x0_resize_q95_h2_catmullrom_3.webp" title="Alternativer Editor mit Vorschaufunktion" loading="lazy" width="816" height="629" /></picture></a><figcaption>Alternativer Editor mit Vorschaufunktion</figcaption></figure><p>
</p>
<p>Für mich passt das. So kann ich auch mal im Browser meine Blogbeiträge bearbeiten.</p>
<p>Schön wäre, wenn man in Nextcloud einstellen könnte, dass Dateien immer mit dem neuen Editor geöffnet werden, damit man nicht versehentlich doch mal eine Datei kaputt macht. Weiß jemand, wie das geht? Falls ja, bitte unten bei &ldquo;Kommentar&rdquo; eine E-Mail schicken :) Danke.</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/nextcloud-editor-zerstoert-frontmatter/cover.png" length="281683" type="image/png"/></item><item><title>Umzug von WordPress zu Hugo – Teil 2 – Bestandsaufnahme und Korrekturen</title><link>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/</link><pubDate>Thu, 03 Feb 2022 10:10:33 +0100</pubDate><guid>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/</guid><description>Im ersten Teil ging um die Gründe meines Wechsels von WordPres zu Hugo und wie man den Wechsel technisch umsetzt und am Ende einen lauffähigen Blog mit Hugo hat, dem man im Browser lokal anschauen kann.
Hier im zweiten Teil geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt.</description><content:encoded><![CDATA[<p>Im <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/">ersten Teil</a> ging um die Gründe meines Wechsels von WordPres zu Hugo und wie man den Wechsel technisch umsetzt und am Ende einen lauffähigen Blog mit Hugo hat, dem man im Browser lokal anschauen kann.</p>
<p>Hier im zweiten Teil geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt. Das hat den Vorteil, dass ich den Blog mit Hugo bereits aktiv nutzen kann und nicht im Hintergrund erst alles auf manuell auf Markdown umstellen musste.</p>
<p>Es wird nicht ganz so viel werden, wie im ersten Teil.</p>

<h2 id="übrig-gebliebenes-html-schön-machen" data-numberify>Übrig gebliebenes HTML schön machen<a class="anchor ms-1" href="#übrig-gebliebenes-html-schön-machen"></a></h2>
<p>Wie bereits erwähnt enthalten viele exportiere Beiträge noch einiges an HTML-Quelltext, der vom Export-Tool nicht in Markdown umgewandelt werden konnte. Und ich werde noch eine Weile mit diesem HTML Code leben müssen, bis ich es irgendwann geschafft habe, alles in sinnvolles Markdown zu übersetzen.</p>
<p>Ich wollte aber schon vorher den neuen Blog mit Hugo veröffentlichen. Deshalb war es notwendig, dass ich diesen bestehenden HTML Code soweit schön mache, dass es am besten gar nicht auffällt, dass die Quelle noch kein Markdown verwendet.</p>
<p>Nachfolgend werden die dafür notwendigen Anpassungen erläutert.</p>

<h3 id="wichtig-wp-content-behalten" data-numberify>Wichtig: wp-content behalten<a class="anchor ms-1" href="#wichtig-wp-content-behalten"></a></h3>
<p>Damit nicht so gut wie alle Bilder und Fotos fehlen, die bisher nur über &ldquo;alten&rdquo; HTML-Code statt über Markdown eingebunden sind, habe ich eine Kopie des Verzeichnisses <code>wp-content/uploads/</code> auch im Webverzeichnis der neuen statischen Webseite eingebunden. So funktionieren alle bisherigen Verlinkungen und Einbettungen weiterhin.</p>
<p>Mit der Zeit werde ich alle Galerien im Blog so umschreiben, dass die Page Bundles benutzen, d. h. die Bilder für einen Beitrag sind zusammen mit dem Beitrag selbst in einem eigenen Verzeichnis.</p>

<h3 id="verzerrte-fotos-in-galerien" data-numberify>Verzerrte Fotos in Galerien<a class="anchor ms-1" href="#verzerrte-fotos-in-galerien"></a></h3>
<p>In einigen der Galerien wurden die Fotos noch in WordPress mit width=&ldquo;2000&rdquo; und height=&ldquo;xxx&rdquo; eingebunden. Das führte dazu, dass sie im neuen Hugo-Theme aufgrund der fehlenden Breite, oder weshalb auch immer, gestaucht angezeigt werden.</p>
<p>Daher habe ich die beiden Tags komplett entfernt mit:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s/ width=&#34;[0-9]{1,4}&#34;//g&#39;</span> *.md
</span></span><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s/ height=&#34;[0-9]{1,4}&#34;//g&#39;</span> *.md</span></span></code></pre></div>
<p>Diese Zeilen entfernen natürlich alle Vorkommen von width und height. Soweit ich gesehen habe, bleiben diese Tags nach dem Export aus WordPress aber wirklich nur bei Bildern und vermutlich auch bei Videos erhalten.</p>

<h3 id="unscharfe-fotos--zu-klein-wird-zu-groß-angezeigt" data-numberify>Unscharfe Fotos – Zu klein wird zu groß angezeigt<a class="anchor ms-1" href="#unscharfe-fotos--zu-klein-wird-zu-groß-angezeigt"></a></h3>
<p>In anderen Blogbeiträgen gab und gibt es immer noch unscharfe Fotos. Das liegt daran, dass diese Bilder in WordPress als kleine Vorschaubilder angezeigt wurden und bei einem Klick darauf die großen Varianten der Bilder in voller Auflösung in einer Lightbox geföffnet wurden.</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Unscharfes Bild" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_hua3e115e5b44b9c8114f448360e22e946_220820_816x0_resize_q95_h2_catmullrom_3.webp" title="Unscharfes Bild" loading="lazy" width="816" height="847" /></picture><figcaption>Unscharfes Bild</figcaption></figure><p>
</p>
<p>So sah der Beitrag ursprünglich in WordPress aus:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Wie es in WordPress aussah" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-01-31_unscharfes_bild_original_wordpress_huaa7ed6c6f42cd7f476f3b6ac55bb6b3c_130038_816x0_resize_q95_h2_catmullrom_3.webp" title="Wie es in WordPress aussah" loading="lazy" width="816" height="674" /></picture><figcaption>Wie es in WordPress aussah</figcaption></figure><p>
</p>

<h4 id="erste-möglichkeit-bei-unscharfen-bildern-lightbox-benutzen" data-numberify>Erste Möglichkeit bei unscharfen Bildern: Lightbox benutzen<a class="anchor ms-1" href="#erste-möglichkeit-bei-unscharfen-bildern-lightbox-benutzen"></a></h4>
<p>Die verwendete Lightbox öffnet im Overlay nicht die kleine Datei sondern die verlinkte, große Datei. In der Lightbox ist das Bild somit scharf.</p>
<p>So sieht es dann aus:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_5d4b7a29b4ffd2cfdc139f980d5d3ec3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_94cc4eae95910fd0164e99ee8ccd57bf.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_fed7e5cd9dd901989bfd84fd11bad4bc.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Große Variante des Bildes wird in der Lightbox geladen" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_5d4b7a29b4ffd2cfdc139f980d5d3ec3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_94cc4eae95910fd0164e99ee8ccd57bf.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_fed7e5cd9dd901989bfd84fd11bad4bc.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hu947fe256f281467470c8dc56ea8813e2_214715_fed7e5cd9dd901989bfd84fd11bad4bc.webp" title="Große Variante des Bildes wird in der Lightbox geladen" loading="lazy" width="816" height="810" /></picture><figcaption>Große Variante des Bildes wird in der Lightbox geladen</figcaption></figure><p>
</p>
<p>In Hugo werden nur noch diese kleinen Bilder in viel zu groß dargestellt. Dank einer verwendeten Lightbox werden zumindest beim Anklicken die Originalfotos in einem Overlay angezeigt und für die Übergangszeit reicht mir das so auch.</p>
<p>Für diese Lösung habe ich mich erst einmal entschieden.</p>

<h4 id="zweite-möglichkeit-bei-unscharfen-bildern-html-automatisiert-anpassen-" data-numberify>Zweite Möglichkeit bei unscharfen Bildern: HTML automatisiert anpassen …<a class="anchor ms-1" href="#zweite-möglichkeit-bei-unscharfen-bildern-html-automatisiert-anpassen-"></a></h4>
<p>Man kann das Problem auch damit beheben, dass man den HTML-Quelltext so abändert, dass statt der kleinen Dateien überall die Originaldateien eingebunden werden, aber weiterhin auch verlinkt bleiben.</p>
<p>Damit wird z. B. statt dem eingebetteten Bild <code>mumble-git-1-100x50.jpg</code> das Bild <code>mumble-git-1.jpg</code> eingebunden. Nicht optimal, da es aus sein kann, dass ein riesiges Originalfoto von einer Landschaft dann relativ klein angezeigt wird. Öffnet man einen Blogbeitrag mit einer Galerie von Landschaftsfotos, dann sieht man zwar nur kleine Bilder, der Browser lädt dann aber direkt alle Bilder in voller Auflösung herunter.</p>
<p>Deshalb habe ich mich gegen diese Lösung entschieden, obwohl sie am besten aussieht.</p>
<p>Hier trotzdem die Befehlszeile(n), um die URLs der kleinen Varianten der Bilder gegen die Originale zu ersetzen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#-[0-9]{1,4}x[0-9]{1,4}\.jpg#\.jpg#g&#39;</span> *.md
</span></span><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#-[0-9]{1,4}x[0-9]{1,4}\.png#\.png#g&#39;</span> *.md
</span></span><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#-[0-9]{1,4}x[0-9]{1,4}\.gif#\.gif#g&#39;</span> *.md</span></span></code></pre></div>
<p>Natürlich muss man diese Zeilen für die verwendeten Dateitypen anpassen (png, gif, …).</p>
<p>Das Ergebnis wäre dann:
</p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_78298c2eee0c2cdc88bdee4225e1021b.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_d406d7d22b0f55fb789d43d08d39d4a4.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_88d619b232c61be2427b2b0b387a7584.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Dank Eingettung des Originals ist es wieder scharf, verursacht aber auch mehr Traffic." srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_78298c2eee0c2cdc88bdee4225e1021b.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_d406d7d22b0f55fb789d43d08d39d4a4.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_88d619b232c61be2427b2b0b387a7584.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/_hud16e79c8559f92e0a0b94c4ac7482b13_154998_88d619b232c61be2427b2b0b387a7584.webp" title="Dank Eingettung des Originals ist es wieder scharf, verursacht aber auch mehr Traffic." loading="lazy" width="816" height="810" /></picture><figcaption>Dank Eingettung des Originals ist es wieder scharf, verursacht aber auch mehr Traffic.</figcaption></figure><p>
</p>

<h3 id="srcsets-entfernen" data-numberify>srcsets entfernen<a class="anchor ms-1" href="#srcsets-entfernen"></a></h3>
<p>Um zusätzlich noch die srcsets aus solchen Galerien zu entfernen, kann man diese Zeile ausführen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s# class=&#34;.*;&#34; /&gt;#/&gt;#g&#39;</span> *.md</span></span></code></pre></div>
<p>Ich  habe das erst einmal sein lassen. Vielleicht schaffe ich es ja noch, dass diese srcsets doch noch genutzt werden, solange ich noch nicht alles auf Markdown umgewandelt habe.</p>

<h3 id="eingebettete-videos-werden-zu-breit-dargestellt" data-numberify>Eingebettete Videos werden zu breit dargestellt<a class="anchor ms-1" href="#eingebettete-videos-werden-zu-breit-dargestellt"></a></h3>
<p>Mit dem video-Tag eingebundene Videos sind im Theme so breit, dass sie teilweise hinter dem rechten Seitenpanel versteckt sind.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Video hängt hinter der Seitenleiste" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_hu1fddacdcf0cf8337631b3802486489be_633779_816x0_resize_q95_h2_catmullrom_3.webp" title="Video hängt hinter der Seitenleiste" loading="lazy" width="816" height="569" /></picture></a><figcaption>Video hängt hinter der Seitenleiste</figcaption></figure><p>
</p>
<p>Um das zu heben, habe ich erstmal ein bisschen css verwendet:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-css" data-lang="css"><span style="display:flex;"><span><span style="color:#f92672">video</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">max-width</span>: <span style="color:#ae81ff">100</span><span style="color:#66d9ef">%</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">height</span>: <span style="color:#66d9ef">auto</span>;
</span></span><span style="display:flex;"><span>}</span></span></code></pre></div></p>
<p>Damit werden alle Videoeinbettungen, auch die, die ich später mit Markdown verwenden werde, richtig angezeigt.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Video ist wieder richtig" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/images/2022-02-02_video_zu_gross_behoben_huaf770b04746750e4f7f3b11363d93e52_616743_816x0_resize_q95_h2_catmullrom_3.webp" title="Video ist wieder richtig" loading="lazy" width="816" height="569" /></picture></a><figcaption>Video ist wieder richtig</figcaption></figure><p>
</p>
<p>Später werde ich den HTML Code durch einen Shortcode video ersetzen.</p>

<h2 id="artikelbilder" data-numberify>Artikelbilder<a class="anchor ms-1" href="#artikelbilder"></a></h2>
<p>In den WordPress-Themes, die ich bisher verwendet hatte, gab es immer Artikelbilder. Ich finde das sehr schön, weil es meiner Ansicht nach auflockernd wirkt und man besser erkennt, worum es in einem Blogbeitrag gehen könnte. Deshalb fand ich es schade, als ich bemerkte, dass in meinem ausgewählten Theme keine Artikelbilder zu sehen waren.</p>
<p>Ich habe dann selbst versucht Artikelbilder zu implementieren und dabei dann entdeckt, dass das Theme solche durchaus vorsieht und nur die richtigen Angaben im Front Matter fehlten.</p>
<p>Dank des Exports von WordPress landeten im Frontmatter bei immerhin ca. 1900 von 2460 Beiträgen die Angaben zu Artikelbildern im Stil von:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">featured_image</span>: <span style="color:#ae81ff">dateiname.jpg</span></span></span></code></pre></div></p>
<p>Doch das Hugo Theme erwartet die folgende Struktur:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">images</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#ae81ff">dateiname.jpg</span></span></span></code></pre></div></p>
<p>Kein Problem, denn mit dem Streamingeditor <code>sed</code> unter Linux ist das mit einem Befehl erleidgt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s/^featured_image: (.*)$/images:\n  - \1/&#39;</span> *.md</span></span></code></pre></div>
<p>Seitdem werden, wie auch im WordPress zuvor, Artikelbilder auch im mit Hugo generierten Blog angezeigt.</p>

<h2 id="reicht-wieder" data-numberify>Reicht wieder<a class="anchor ms-1" href="#reicht-wieder"></a></h2>
<p>Das reicht auch schon für den zweiten Teil.</p>
<p>Im nächsten Teil geht es dann um Lightboxen, Kommentare, um verschiedene Konfigurationsmöglichkeiten und mehr.</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2/cover.png" length="130038" type="image/png"/></item><item><title>Umzug von WordPress zu Hugo – Teil 1 – Von den Gründen bis zum ersten funktionierenden Blog</title><link>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/</link><pubDate>Thu, 03 Feb 2022 07:30:33 +0100</pubDate><guid>https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/</guid><description>Schon einige Male in den vergangenen Jahren habe ich versucht, meinen Blog von WordPress auf Hugo umzuziehen. Immer gab es dabei für mich unüberwindbare Hürden. Jetzt endlich hat es mal in einem neuen Anlauf funktioniert.
Hier berichte ich davon, wie genau ich das gemacht habe, was es zu bedenken galt und wie es im Ergebnis geworden ist. In erster Linie ist es für mich als Dokumentation gedacht, damit ich das in x Zeit noch nachvollziehen kann.</description><content:encoded><![CDATA[<p>Schon einige Male in den vergangenen Jahren habe ich versucht, meinen Blog von WordPress auf Hugo umzuziehen. Immer gab es dabei für mich unüberwindbare Hürden. Jetzt endlich hat es mal in einem neuen Anlauf funktioniert.</p>
<p>Hier berichte ich davon, wie genau ich das gemacht habe, was es zu bedenken galt und wie es im Ergebnis geworden ist. In erster Linie ist es für mich als Dokumentation gedacht, damit ich das in x Zeit noch nachvollziehen kann. Und wenn jemand anderes damit auch noch etwas anfangen kann, dann ist es noch besser.</p>
<p>Dabei schreibe ich übrigens das erste Mal einen Blogbeitrag mit einem einfachen Editor, offline, ohne Browser, in einem einfachen Textbearbeitungsprogramm. Und das fühlt sich gut an.</p>

<h2 id="wieso-überhaupt-weg-von-wordpress" data-numberify>Wieso überhaupt weg von WordPress?<a class="anchor ms-1" href="#wieso-überhaupt-weg-von-wordpress"></a></h2>
<p>Ich habe WordPress seit 2009 für meinen Blog benutzt und es immer auf eigenen Servern selbst gehostet. Ich war immer sehr zufrieden damit. WordPress hat es mir ermöglicht, mich immer nur auf den Inhalt konzentrieren zu können und hat mir die ganze Arbeit drumherum abgenommen. Und es ist immer noch so. Das schätze ich an dem Content Management System WordPress. Jedes Upgrade auf eine neue Version war immer fehlerfrei mit nur wenigen Klicks möglich.</p>
<p>Die meisten Funktionen von WordPress habe ich nie benutzt. Und mit dem Update auf den Gutenberg-Editor und jetzt kürzlich auf 5.9 mit dem Super Feature &ldquo;Full Site Editing&rdquo; ist noch klarer geworden, dass ich solch ein komplexes System nicht benötige. Es ist immer noch sehr einfach zu bedienen und zu aktualisieren, aber ich brauche es eben nicht.</p>
<p>Was ich brauche, ist eine einfache Möglichkeit, Texte zu schreiben, die Maus möglichst nicht bewegen zu müssen und außerdem benötige ich nur die grundlegensten Formatierungen. Kurzum das, was <a  class='urlextern'  href="https://daringfireball.net/projects/markdown/">Markdown</a> bietet.</p>
<p>Natürlich sind da noch andere Aspekte:</p>
<ul>
<li>Wartbarkeit: Webserver, PHP, Datenbank, alles will gepflegt werden und benötigt ab und zu Aufmerksamkeit. Mit Hugo kann man den kompletten Blog, der aus statischen Dateien (HTML, CSS, JavaScript) besteht, auf einen Webserver werfen und für immer dort liegen lassen.</li>
<li>Portierbarkeit/Backup: Sollte ich mal vom Rad fallen und nicht mehr aufstehen, kann man sich das Archiv herunterladen und hat weiterhin Zugriff auf die Inhalte des Blogs. Entsprechend wird man sich später das einmal alle x Zeit aktualisierte Archiv herunterladen können. Dazu später mehr.</li>
<li>Sicherheit: Da nichts dynamisch ausgeführt wird, gibt es auch keine Sicherheitslücken, die jemand ausnutzen könnte.</li>
<li>&ldquo;Einfachheit&rdquo;: Text-Editor, Hugo laufen lassen, hochladen per SFTP. Fertig.</li>
</ul>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Fenster eines Texteditors unter KDE/Plasma" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-03-blog-im-texteditor-schreiben_hu223b2f7dc1c2e1006a2b9545468f5ada_162917_816x0_resize_q95_h2_catmullrom_3.webp" title="Fenster eines Texteditors unter KDE/Plasma" loading="lazy" width="816" height="523" /></picture></a><figcaption>Fenster eines Texteditors unter KDE/Plasma</figcaption></figure><p>
</p>

<h2 id="ein-schönes-theme-für-hugo-finden" data-numberify>Ein schönes Theme für Hugo finden<a class="anchor ms-1" href="#ein-schönes-theme-für-hugo-finden"></a></h2>
<p>Man kann natürlich auch selbst ein Theme bauen, aber das ist nichts für mich.</p>
<p>Eine Liste von aktuell 285 Themes gibt es auf der Webseite von Hugo, siehe <a  class='urlextern'  href="https://themes.gohugo.io/">hier</a>.</p>
<p>Ich habe mich für das Theme <a  class='urlextern'  href="https://themes.gohugo.io/themes/hugo-theme-bootstrap/">Bootstrap Theme for Personal Blog and Documentations</a> entschieden, weil es fast alles liefert, was ich benötige und vielfältige Einstellungsmöglichkeiten hat.</p>
<p>Was ich besonders mag:</p>
<ul>
<li>Dark Mode/Light Mode</li>
<li>Suchfunktion (<a  class='urlextern'  href="https://fusejs.io">fuse.js</a>)</li>
<li>Durch Ausblenden der Seitenliste kann der Inhaltsbereich breiter gemacht werden.</li>
<li>Es gibt bereits Shortcodes für Nachrichtenboxen (Info, Alarm, &hellip;). Siehe <a  class='urlextern'  href="https://hbs.razonyang.com/en/docs/shortcodes/alert/">hier</a>.</li>
<li><a  class='urlextern'  href="https://gohugo.io/templates/internal/#configure-twitter-cards">Twitter Cards</a> und <a  class='urlextern'  href="https://gohugo.io/templates/internal/#configure-open-graph">Open Graph</a></li>
<li>Responsive</li>
<li>optional mehrsprachig</li>
<li>Archivseiten</li>
<li>Shortcods für Verleinern von Bildern. Die verkleinerten Bilder werden beim Rendern von Hugo aus den Originaldateien erzeugt.</li>
<li>Lazy loading für Bilder</li>
<li>Inhaltsverzeichnis für Blogbeiträge</li>
<li>Keine Einbindung von externen Inhalten</li>
<li>Liste von &ldquo;ähnlichen Beiträgen&rdquo;</li>
</ul>

<h2 id="vor-dem-export-in-wordpress-aufräumen" data-numberify>Vor dem Export in WordPress aufräumen<a class="anchor ms-1" href="#vor-dem-export-in-wordpress-aufräumen"></a></h2>

<h3 id="tabellen-aufräumen" data-numberify>Tabellen aufräumen<a class="anchor ms-1" href="#tabellen-aufräumen"></a></h3>
<p>Vor dem Export der Daten kann man den Blog noch etwas aufräumen. Hat man z. B. wie ich über die Jahre viele verschiedene Plugins ausprobiert und wieder entfernt, dann könnten die Daten der Plugins immer noch irgendwo in den Tabellen der Datenbank liegen und beim Export in den Daten landen. Das wären alles zusätzliche Daten, die man nicht benötigt.</p>
<p>Dazu hatte ich mal einen eigenen Blogbeitrag verfasst, siehe <a  href="/2021/05/datenbank-von-wordpress-auch-mal-aufraeumen/">hier</a>.</p>

<h3 id="entwürfe" data-numberify>Entwürfe<a class="anchor ms-1" href="#entwürfe"></a></h3>
<p>Werden Entwürfe exportiert, dann erhalten diese in der exportierten Version kein Datum und sind somit erstmal aus dem Sichtbereich raus oder bekommen seltsame Namen/URLs zugewiesen wie z. B. &ldquo;?p=52696/&rdquo;, das der fortlaufenden ID von Blogbeiträgen entspricht. Das will man später alles nicht einzeln bearbeiten müssen. Deshalb Entwürfe löschen oder veröffentlichen.</p>

<h3 id="verlinkungen-in-wordpress" data-numberify>Verlinkungen in WordPress<a class="anchor ms-1" href="#verlinkungen-in-wordpress"></a></h3>
<p>Man kann in WordPress entweder die komplette URL verwenden (Standard), um auf einen Beitrag im eigenen Blog zu verlinken oder die ID des Beitrags verwenden.</p>
<p>Die komplette URL wäre z. B. &ldquo;natenom.de/2021/01/beitrag-ueber-den-kleinen-elefanten&rdquo; während die ID &ldquo;natenom.de/?p=12345&rdquo; wäre.</p>
<p>Solche Verlinkungen sollte man noch im laufenden WordPress Blog finden und in die erste Form (lange URL) überführen, da die zweite Form mit der ID in Hugo nicht funktionieren wird.</p>
<p>Dazu reicht die Suchfunktion im Adminpanel aus. Man sucht nach &ldquo;/?p=&rdquo;. In meinem Fall fanden sich ca. 130 solcher Beiträge mit ID Verlinkungen.</p>

<h2 id="optional-backup-des-blogs--für-hugo-nicht-relevant" data-numberify>(optional) Backup des Blogs – Für Hugo nicht relevant<a class="anchor ms-1" href="#optional-backup-des-blogs--für-hugo-nicht-relevant"></a></h2>
<p>Da der Blog am Ende abgeschaltet werden soll, habe ich ein letztes Mal Backups gemacht:</p>
<ul>
<li>Backup der WordPress Datenbank</li>
<li>Als Admin in WordPress angemeldet und unter Werkzeuge -&gt; Daten exportieren -&gt; Alle Inhalte ausgewählt und die xml-Datei heruntergeladen. In dieser Datei sind alle Beiträge, alle Seiten und auch die Kommentare von Benutzern enthalten. Nicht jedoch die hochgeladenen Dateien. In meinem Fall ist die Datei um 50 MiB groß und hat um die 50000 Zeilen.</li>
<li>Backup des kompletten WordPress-Verzeichnisses inklusive den hochgeladenen Dateien und dem ganzen PHP-Zeug</li>
<li>Herunterladen der kompletten Webseite mit wget, um später noch nachvollziehen zu können, unter welchen URLs was zu finden war. Für solche URLs, die Hugo nicht generiert. Die könnte man dann mit einem Webserver passend weiterleiten. Die Kommandozeile dafür ist:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget --recursive --domains<span style="color:#f92672">=</span>natenom.de --html-extension --page-requisites --convert-links --no-parent <span style="color:#e6db74">&#34;/&#34;</span> -R <span style="color:#e6db74">&#34;*xmlrpc*&#34;</span> --reject-regex <span style="color:#e6db74">&#34;.*wp-content.*&#34;</span></span></span></code></pre></div>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>Wenn es Probleme gibt und eine Meldung in der Form <code>no follow attribute found</code>, dann benötigt man zusätzlich noch diesen Parameter:</p>
<pre><code>-erobots=off
</code></pre>
</div>
</div>


<p>Das Verzeichnis <code>wp-content</code> habe ich bewusst ausgelassen, da es nur hochgeladene Dateien enthält (ca. 7 GiB), die bereits in einem anderen Backup enthalten sind.</p>
<p></p><figure class="image-caption"><a href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress.png"><picture>
                <source type="image/webp" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_360x0_resize_q95_h2_catmullrom_3.webp 360w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_500x0_resize_q95_h2_catmullrom_3.webp 500w,/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="" srcset="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_360x0_resize_q95_h2_catmullrom_3.webp 360w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_500x0_resize_q95_h2_catmullrom_3.webp 500w, /2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/images/2022-02-01-backups-export-aller-daten-aus-wordpress_hub4eed37399a08ef15104b74a01748fa5_75678_816x0_resize_q95_h2_catmullrom_3.webp" title="Export Tool von WordPress. Exportiert alles außer der hochgeladenen Dateien." loading="lazy" width="816" height="430" /></picture></a><figcaption>Export Tool von WordPress. Exportiert alles außer der hochgeladenen Dateien.</figcaption></figure><p>
</p>

<h2 id="daten-für-hugo-aus-wordpress-exportieren" data-numberify>Daten für Hugo aus WordPress exportieren<a class="anchor ms-1" href="#daten-für-hugo-aus-wordpress-exportieren"></a></h2>
<p>Mit dem Tool <a  class='urlextern'  href="https://github.com/SchumacherFM/wordpress-to-hugo-exporter">WordPress to Hugo Exporter</a> kann man alle Seiten und Beiträg eines Blogs in eine Zip-Datei exportieren.</p>
<p>Ich gehe hier nicht darauf ein, wie man das Tool verwendet, da das ausreichend gut auf dessen Webseite erklärt ist. Wichtig ist hier nur, dass man am Ende eine Datei erhält, hier im Beispiel mit dem Namen wpexport.zip.</p>
<p>Auf der Projektseite steht, was man an der PHP-Datei anpassen muss, damit auch Kommentare exportiert werden.</p>
<p>Der Export kann eine ganze Weile dauern und sollte deshalb auf der Kommandozeile ausgeführt werden. Die <code>wpexport.zip</code> meines Blogs hatte eine Dateigröße von etwas mehr als 7 GiB.</p>
<p>Die Datei <code>wpexport.zip</code> hat diese Struktur:</p>
<pre tabindex="0"><code>seite-a/index.md
seite-b/index.md
irgendeine-seite/index.md
posts/
    2022-01-05-mein-beitrag-im-januar
    2022-01-06-mein-beitrag-ueber-bluemeleinchen
    2022-02-08-ein-neuer-beitrag-mit-tollen-fahrraedern
wp-content/
    uploads/
        2022/
            01/
                2022-01-04-hochgeladenes-bild-1.jpg
                2022-01-04-hochgeladenes-bild-2.jpg
config.yaml
</code></pre><ul>
<li>Es sind alle &ldquo;Seiten&rdquo; des Blogs als Verzeichnisse enthalten, in den index.md-Dateien sind die Inhalte.</li>
<li>Die &ldquo;Beiträge&rdquo; (Englisch &ldquo;Posts&rdquo;) liegen als md-Dateien im Verzeichnis &ldquo;posts&rdquo;.</li>
<li>Die hochgeladenen Dateien wie Fotos, Screenshots oder auch Audio und Video liegen im Verzeichnis wp-content/uploads, sortiert nach Jahr und Monat.</li>
<li>Dann gibt es noch die Datei config.yaml, welche die URL des Blogs enthält, den Namen und die Beschreibung.</li>
</ul>
<p>Die Daten lädt man dann auf den eigenen PC herunter.</p>

<h2 id="eine-webseite-mit-hugo-anlegen-und-theme-einfügen" data-numberify>Eine Webseite mit Hugo anlegen und Theme einfügen<a class="anchor ms-1" href="#eine-webseite-mit-hugo-anlegen-und-theme-einfügen"></a></h2>
<p>Ich will hier nicht darauf eingehen, wie man eine Webseite mit Hugo anlegt und das Theme einfügt, das ist auf der Projektseite bereits ausführlich gut dokumentiert, siehe <a  class='urlextern'  href="https://gohugo.io/getting-started/quick-start/">hier</a>.</p>
<p>Sobald das erledigt und das Theme eingebunden ist, kann man die exportierten Daten aus dem heruntergeladenen Archiv entpacken und die Daten in das Verzeichnis des neuen Blogs hineinkopieren:</p>
<ul>
<li>Die Datei <code>config.yaml</code> habe ich weg gelassen.</li>
<li>Das Verzeichnis <code>posts</code> wird nach <code>content</code> kopiert.</li>
<li>Das Verzeichnisse <code>seite-x</code> werden nach <code>content/pages</code> kopiert.</li>
<li>Das Verzeichnis <code>wp-content</code> wird nach <code>static</code> kopiert.</li>
</ul>

<h2 id="ein-bisschen-konfiguration" data-numberify>Ein bisschen Konfiguration<a class="anchor ms-1" href="#ein-bisschen-konfiguration"></a></h2>
<p>Eine Liste aller Einstellungsmöglichkeiten gibt es auf der <a  class='urlextern'  href="https://hbs.razonyang.com/v0/en/docs/configuration/">Seite des Theme-Entwicklers</a>.</p>

<h3 id="taxonomie" data-numberify>Taxonomie<a class="anchor ms-1" href="#taxonomie"></a></h3>
<p>Bei der Taxonomie wollte ich die URLs von WordPress möglichst erhalten.</p>
<p>Per Voreinstellung verwendet Hugo für tags in der URL &ldquo;tags&rdquo;, WordPress jedoch &ldquo;tag&rdquo;. Bei Kategorien verwendet Hugo &ldquo;categories&rdquo; und WordPress &ldquo;category&rdquo;.</p>
<p>Das kann man in der <code>config.toml</code> anpassen mit:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">taxonomies</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">category</span> = <span style="color:#e6db74">&#39;category&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">tag</span> = <span style="color:#e6db74">&#39;tag&#39;</span></span></span></code></pre></div>
<p>In meinem ausgewählten Theme funktioniert das jedoch leider nicht, da zwingend &ldquo;tags&rdquo; und &ldquo;categories&rdquo; notwendig sind. Kann man sicher anpassen, ich aber nicht. Also bleibt es bei den Voreinstellungen. Ich werde es dann einfach mit dem Webserver weiterleiten lassen.</p>
<p>In Nginx z. B. mit:</p>
<pre tabindex="0"><code>rewrite ^/tag/(.*)$ /tags/$1 redirect;
rewrite ^/category/(.*)$ /categories/$1 redirect;
</code></pre><p>Wenn das gut funktioniert, kann man das später auf <em>permanent</em> umschreiben.</p>

<h3 id="beiträge-nicht-gelistet" data-numberify>Beiträge nicht gelistet<a class="anchor ms-1" href="#beiträge-nicht-gelistet"></a></h3>
<p>Auf der Startseite des Blogs wurden die Beiträge nicht gelistet. Mit Herumprobieren konnte ich herausfinden, dass das an dem Eintrag &ldquo;type: post&rdquo; im Front Matter (Metadaten eines Beitrags) lag. Daher habe ich mit dem folgenden Shell-Aufruf diese Zeile in allen md-Dateien gelöscht:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i <span style="color:#e6db74">&#34;/^type: post</span>$<span style="color:#e6db74">/d&#34;</span> *.md</span></span></code></pre></div>

<h3 id="sonstige-konfiguration" data-numberify>Sonstige Konfiguration<a class="anchor ms-1" href="#sonstige-konfiguration"></a></h3>
<p>Hier noch ein paar weitere wichtige Dinge, die ich in der Konfiguration eingestellt habe.
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">baseURL</span> = <span style="color:#e6db74">&#34;/&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">rssLimit</span> = <span style="color:#ae81ff">15</span>
</span></span><span style="display:flex;"><span>[<span style="color:#960050;background-color:#1e0010">…</span>]
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">params</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">comment</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">breadcrumb</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">palette</span> = <span style="color:#e6db74">&#34;blue&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">dateFormat</span> = <span style="color:#e6db74">&#34;Mon, 02 Jan 2006 15:04&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">mainSections</span> = [<span style="color:#e6db74">&#34;posts&#34;</span>, <span style="color:#e6db74">&#34;pages&#34;</span> ]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">poweredBy</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">math</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">diagram</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">logo</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">description</span> = <span style="color:#e6db74">&#34; Verkehrswende, Fahrrad, CriticalMass, OpenBikeSensor, SimRa, Mumble, Open Source, Minimalist, OpenStreetMap, Müllsammeln&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">recentPostCount</span> = <span style="color:#ae81ff">5</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">relatedPostCount</span> = <span style="color:#ae81ff">6</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">categoryCount</span> = <span style="color:#ae81ff">200</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">tagCount</span> = <span style="color:#ae81ff">150</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">searchBar</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">post</span>.<span style="color:#a6e22e">copyright</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">search</span>.<span style="color:#a6e22e">fuse</span>.<span style="color:#a6e22e">threshold</span> = <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">countTaxonomyPosts</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">post</span>.<span style="color:#a6e22e">excerpt</span> = <span style="color:#e6db74">&#34;description&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">viewer</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">showShare</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">socialShare</span> = <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">outputs</span>]
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">home</span> = [<span style="color:#e6db74">&#34;HTML&#34;</span>, <span style="color:#e6db74">&#34;RSS&#34;</span>, <span style="color:#e6db74">&#34;JSON&#34;</span>]</span></span></code></pre></div></p>

<h2 id="von-absoluten-urls-zu-relativen-urls" data-numberify>Von absoluten URLs zu relativen URLs<a class="anchor ms-1" href="#von-absoluten-urls-zu-relativen-urls"></a></h2>
<p>Ich habe keine Ahnung von SEO und habe mich nie damit beschäftigt. Könnte es sein, dass WordPress aus SEO-Gründen absoulte URLs verwendet und nicht realtive? Ich habe dazu die Info auf einer Webseite gefunden, dass relative Links problematisch werden könnten, wenn der Server nicht richtig eingerichtet sei.</p>
<p>Hat man Bedenken, dann weiter zum nächsten Abschnitt.</p>
<p>Aber: Will man den neuen Blog auf dem eigenen PC anschauen, benötigt man ohne die Veränderungen der URLs eine Internetverbindung, damit eingebettete Inhalte wie z. B. Bilder vom Browser von der ursprünglichen Webseite heruntergeladen werden können. Oder aber man biegt das DNS temporär um, muss dann aber zumindest aus https http machen, und so weiter.</p>

<h3 id="absolute-urls-auf-hochgeladene-dateien" data-numberify>Absolute URLs auf hochgeladene Dateien<a class="anchor ms-1" href="#absolute-urls-auf-hochgeladene-dateien"></a></h3>
<p>Alle Verlinkungen auf Fotos, Bilder und Videos sind in WordPress mit der absoulten URL angegeben, in meinem Fall mit <code>natenom.de/wp-content/uploads/...</code>. Und das wird so auch in die md-Dateien exportiert.</p>
<p>Deshalb kann man die URLs mit dem Streameditor sed umschreiben lassen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#/wp-content/uploads/#/wp-content/uploads/#g&#39;</span> *.md</span></span></code></pre></div>
<p>(Ich habe das aktuell erstmal noch nicht getan.)</p>
<p>Das Kommando führt man in allen Verzeichnissen aus, in denen md-Dateien liegen. Man könnte das auch so umschreiben, dass es ausgehend vom neuen Blogverzeichnis alle md-Dateien findet und so alle erfasst. Aber so reicht es mir.</p>

<h3 id="absolute-urls-auf-blogbeiträge" data-numberify>Absolute URLs auf Blogbeiträge<a class="anchor ms-1" href="#absolute-urls-auf-blogbeiträge"></a></h3>
<p>Das selbe gilt auch für Verlinkungen im Blogbeiträgen auf andere Beiträg im eigenen Blog. Auch diese URLs lasse ich umschreiben:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sed -i -E -e <span style="color:#e6db74">&#39;s#/#/#g&#39;</span> *.md</span></span></code></pre></div>
<p>(Ich habe das aktuell erstmal noch nicht getan.)</p>
<p>Aus dem absoulten Link <code>/</code> wird dadurch <code>/</code>.</p>

<h2 id="umlaute-in-urls-von-kategorien-und-tags" data-numberify>Umlaute in URLs von Kategorien und Tags<a class="anchor ms-1" href="#umlaute-in-urls-von-kategorien-und-tags"></a></h2>
<p>Ich verwende im Blog das Tag &ldquo;Müllsammeln&rdquo; und die Kategorie &ldquo;Mobilität&rdquo;. Wordpress hat dabei automatisch die Umlaute in den dafür genutzten URLs in die alternativen Schreibweisen &ldquo;muellsammeln&rdquo; und &ldquo;mobilitaet&rdquo; umgewandelt. Hugo macht das nicht, weshalb dort das Tag auch &ldquo;müllsammeln&rdquo; lautet.</p>
<p>Es gibt mehrere Lösungen:</p>
<ol>
<li>Es dabei belassen, denn mittlerweile sind diese Zeichen kein Problem mehr. Es sieht nur nicht sonderlich schön aus, wenn man statt <strong>mobilität</strong> das hier sieht <strong>mobilit%C3%A4t</strong></li>
<li>Ohne Veränderungen an den Beiträgen wäre die Option <strong>removePathAccents</strong> von Hugo möglich, die aus &ldquo;mobilität&rdquo; &ldquo;mobilitat&rdquo; macht.</li>
<li>Hugo selbst zu verändern, <a  class='urlextern'  href="https://www.von-laufenberg.de/blog/it/hugo-umlaute/">siehe hier</a>.</li>
<li>Alle Vorkommen der Tags in den Beiträgen mit sed umschreiben und ö durch oe ersetzen usw.</li>
<li>Weiterleitungen durch den Webserver, siehe unten.</li>
</ol>
<p>Einen Issue mit vielen Informationen zu diesem Theme gibt es auf Github, <a  class='urlextern'  href="https://github.com/gohugoio/hugo/issues/3476">siehe hier</a>. Ein weitere Issue zu dem Thema ist seit November 2021 noch offen, <a  class='urlextern'  href="https://github.com/gohugoio/hugo/issues/9134">siehe hier</a>.</p>
<p>Ich habe mich entschieden, das so zu belassen das erst einmal mit Weiterleitungen zu &ldquo;fixen&rdquo; und zu schauen, was sich bei dem Issue tut.</p>
<p>In Nginx sind diese:</p>
<pre tabindex="0"><code>rewrite ^/tag/muellsammeln/(.*)$ /tags/müllsammeln/$1 redirect;
rewrite ^/category/mobilitaet/(.*)$ /categories/mobilität/$1 redirect;
rewrite ^/tag/(.*)$ /tags/$1 redirect;
rewrite ^/category/(.*)$ /categories/$1 redirect;
</code></pre><p>Ich nutze bei solchen Dingen am Anfang immer erst redirect, was dem HTTP Status 302 entspricht und ändere das dann irgendwann zu permanent (Status 301) um.</p>

<h2 id="fehlerseite-für-404" data-numberify>Fehlerseite für 404<a class="anchor ms-1" href="#fehlerseite-für-404"></a></h2>
<p>Falls doch mal eine Seite nicht gefunden wird, habe ich die <code>404.html</code> in Nginx eingerichtet:</p>
<pre tabindex="0"><code>error_page 404 /404.html;
</code></pre><p>Hier kann man die Seite mal ansehen: <a  href="/blabla-diese-seite-gibt-es-nicht">Dieser Link zeigt auf eine nicht vorhandene Seite</a>.</p>

<h2 id="damit-erstmal-keine-inhalte-fehlen" data-numberify>Damit erstmal keine Inhalte fehlen<a class="anchor ms-1" href="#damit-erstmal-keine-inhalte-fehlen"></a></h2>
<p>Würde man jetzt schon Hugo starten, würden vermutlich viele Inhalte in verschiedenen Beiträgen fehlen. Das liegt daran, dass das oben genannte Export-Tool viele HTML Tags nicht in Markdown konvertieren kann und dann an diesen Stellen den HTML-Quelltext in die exportierten md-Dateien schreibt. Doch Hugo filtert diesen HTML-Quelltext beim Rendern der Website heraus.</p>
<p>Damit ich nicht erst alle 2560 Blogbeiträge manuell überprüfen und korrigieren muss, bevor ich den neuen Blog öffentlich machen kann, habe ich mich entschieden, dieses Verhalten von Hugo umzustellen und Hugo anzuweisen, den HTML-Quelltext nicht herauszufiltern. Das ist zwar nicht im Sinne des Erfinders aber so habe ich die Möglichkeit, die Arbeit auf <em>irgendwann</em> später zu verschieben.</p>
<p>Details dazu findet man <a  class='urlextern'  href="https://gohugo.io/news/0.60.0-relnotes/">hier</a>. Suche nach <code>unsafe</code>.</p>
<p>In die config.toml fügt man dazu Folgendes ein:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">markup</span>]
</span></span><span style="display:flex;"><span>  [<span style="color:#a6e22e">markup</span>.<span style="color:#a6e22e">goldmark</span>]
</span></span><span style="display:flex;"><span>    [<span style="color:#a6e22e">markup</span>.<span style="color:#a6e22e">goldmark</span>.<span style="color:#a6e22e">renderer</span>]
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">unsafe</span> = <span style="color:#66d9ef">true</span></span></span></code></pre></div>

<h2 id="run-hugo-run" data-numberify>Run Hugo, Run<a class="anchor ms-1" href="#run-hugo-run"></a></h2>
<p>Jetzt kann man Hugo veranlassen, den neuen Blog das erste Mal zu rendern und dann lokal zur Verfügung zu stellen. Per Voreinstellung ist er unter localhost:1313 erreichbar.</p>
<p>Dazu wechselt man auf der Kommandozeile in das Verzeichnis des neuen Blogs und führt aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>hugo server --renderToDisk -D -E -F -v</span></span></code></pre></div>
<p>Jetzt werden alle gerenderten Dateien und auch die aus dem <code>static</code>-Verzeichnis in das Verzeichnis <code>public</code> kopiert, welches Hugo automatisch erstellt, wenn es noch nicht existiert.</p>
<p>Sobald alles bereit ist, gibt es eine Meldung wie etwa:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>                   |  DE   
</span></span><span style="display:flex;"><span>-------------------+-------
</span></span><span style="display:flex;"><span>  Pages            | <span style="color:#ae81ff">4350</span>  
</span></span><span style="display:flex;"><span>  Paginator pages  | <span style="color:#ae81ff">1694</span>  
</span></span><span style="display:flex;"><span>  Non-page files   |    <span style="color:#ae81ff">1</span>  
</span></span><span style="display:flex;"><span>  Static files     |   <span style="color:#ae81ff">88</span>  
</span></span><span style="display:flex;"><span>  Processed images |    <span style="color:#ae81ff">0</span>  
</span></span><span style="display:flex;"><span>  Aliases          |  <span style="color:#ae81ff">889</span>  
</span></span><span style="display:flex;"><span>  Sitemaps         |    <span style="color:#ae81ff">1</span>  
</span></span><span style="display:flex;"><span>  Cleaned          |    <span style="color:#ae81ff">0</span>  
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Built in <span style="color:#ae81ff">45228</span> ms
</span></span><span style="display:flex;"><span>Watching <span style="color:#66d9ef">for</span> changes in /home/natenom-web-hugo/<span style="color:#f92672">{</span>assets,content,layouts,static,themes<span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>Watching <span style="color:#66d9ef">for</span> config changes in /home/natenom-web-hugo/config.toml, <span style="color:#f92672">[</span>…<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Environment: <span style="color:#e6db74">&#34;development&#34;</span>
</span></span><span style="display:flex;"><span>Serving pages from /home/natenom-web-hugo/public
</span></span><span style="display:flex;"><span>Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
</span></span><span style="display:flex;"><span>Web Server is available at http://localhost:1313/ <span style="color:#f92672">(</span>bind address 127.0.0.1<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>Press Ctrl+C to stop</span></span></code></pre></div>

<h2 id="erstmal-fertig" data-numberify>Erstmal fertig<a class="anchor ms-1" href="#erstmal-fertig"></a></h2>
<p>Das reicht dann auch wieder für diesen Beitrag. Man kann jetzt schon im eigenen Blog offline umgucken und wird hier und da noch unschöne Dinge finden, wie falsch dargestellte Bilder.</p>
<p>In <a  href="/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-2">Teil 2</a> geht es darum, für die Übergangszeit das übrig gebliebene HTML, das nicht zu Markdown konvertiert werden konnte, automatisiert so zu verändern, dass der Blog trotzdem ansehnlich ist, wenn auch noch nicht perfekt.</p>
]]></content:encoded><enclosure url="https://natenom.de/2022/02/umzug-des-blogs-von-wordpress-zu-hugo-teil-1/cover.png" length="162917" type="image/png"/></item></channel></rss>