<?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>Render Hook on Natenoms Blog</title><link>https://natenom.de/tags/render-hook/</link><description>Recent content in Render Hook on Natenoms Blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright/><lastBuildDate>Tue, 04 Apr 2023 20:52:47 +0200</lastBuildDate><atom:link href="https://natenom.de/tags/render-hook/index.xml" rel="self" type="application/rss+xml"/><item><title>Shortcode und Render Hook für Hugo verbessert – weniger Datenmüll und schnelleres Rendern (Update)</title><link>https://natenom.de/2023/04/shortcode-und-render-hook-fuer-hugo-verbessert-weniger-datenmuell-und-schnelleres-rendern/</link><pubDate>Tue, 04 Apr 2023 20:52:47 +0200</pubDate><guid>https://natenom.de/2023/04/shortcode-und-render-hook-fuer-hugo-verbessert-weniger-datenmuell-und-schnelleres-rendern/</guid><description><![CDATA[<p>Bisher hatte ich die Verarbeitung und Einbindung von Bilddateien im Blog und im Wiki so implementiert, dass WebP als Standardformat immer angeboten wurde (auch wenn das Originalfoto ein anderes Format hatte) und es zusätzlich als Fallback für ältere Browser von jeder Datei eine im JPG-Format gab. Einen Blogbeitrag dazu gibt es <a  href="/2022/04/verbesserungen-des-render-hooks-fuer-bilder-und-im-wiki/">hier</a>.</p>
<p>Dazu gab es Varianten der beiden Datei-Formate in unterschiedlichen Auflösungen, sodass ein Browser selbst entscheiden konnte, welches Format in welcher Auflösung er je nach Bildschirmgröße herunterlädt und verwendet.</p>]]></description><content:encoded><![CDATA[<p>Bisher hatte ich die Verarbeitung und Einbindung von Bilddateien im Blog und im Wiki so implementiert, dass WebP als Standardformat immer angeboten wurde (auch wenn das Originalfoto ein anderes Format hatte) und es zusätzlich als Fallback für ältere Browser von jeder Datei eine im JPG-Format gab. Einen Blogbeitrag dazu gibt es <a  href="/2022/04/verbesserungen-des-render-hooks-fuer-bilder-und-im-wiki/">hier</a>.</p>
<p>Dazu gab es Varianten der beiden Datei-Formate in unterschiedlichen Auflösungen, sodass ein Browser selbst entscheiden konnte, welches Format in welcher Auflösung er je nach Bildschirmgröße herunterlädt und verwendet.</p>
<p>Für jedes in einem Blogbeitrag verwendete Foto gab es einen Mix aus diesen Dateien:</p>
<ul>
<li>
<p>Das Originalfoto (das jeweils andere Format wurde automatisch generiert)</p>
<ul>
<li><code>foto1.webp</code> (960 KiB)</li>
<li><code>foto1.jpg</code> ( 1100 KiB)</li>
</ul>
</li>
<li>
<p>Und <strong>zusätzlich</strong> die Bildvarianten in verschiedenen Auflösungen (1933 KiB):</p>
<ul>
<li><code>foto1-360px.webp</code> (43 KiB)</li>
<li><code>foto1-360px.jpg</code> (48 KiB)</li>
<li><code>foto1-500px.webp</code> (75 KiB)</li>
<li><code>foto1-500px.jpg</code> (84 KiB)</li>
<li><code>foto1-816px.webp</code> (159 KiB)</li>
<li><code>foto1-816px.jpg</code> (195 KiB)</li>
<li><code>foto1-1632px.webp</code> (617 KiB)</li>
<li><code>foto1-1632px.jpg</code> (712 KiB)</li>
</ul>
</li>
</ul>
<p>Da JPG bei gleicher Qualität deutlich größer ist als WebP, wurde die Datenmenge für jedes Foto durch die Bildvarianten mehr als verdoppelt.</p>

<h2 id="wenig-nutzen-viel-speicherplatz-und-rechenleistung-fürs-rendern" data-numberify>Wenig Nutzen, viel Speicherplatz und Rechenleistung fürs Rendern<a class="anchor ms-1" href="#wenig-nutzen-viel-speicherplatz-und-rechenleistung-fürs-rendern"></a></h2>
<p>Das war damals von der Idee gut und auch sicher, da es vielleicht noch veraltete Systeme und Browser gibt, die das WebP-Format nicht unterstützen. Aber der Nachteil war, dass dadurch sehr viele Dateien erzeugt wurden, die für die große Mehrheit der Clienten unnötig waren, die aber trotzdem Rechenpower und Speicherplatz beim Generieren benötigen.</p>

<h2 id="neu--sparsam-fürs-rendern-und-arbeiten-mit-dem-was-da-ist" data-numberify>Neu – sparsam fürs Rendern und Arbeiten mit dem, was da ist<a class="anchor ms-1" href="#neu--sparsam-fürs-rendern-und-arbeiten-mit-dem-was-da-ist"></a></h2>
<p>Nun habe ich die Implementierung geändert:</p>
<ul>
<li>Hat das Originalfoto ein anderes Format als WebP, dann wird es nicht mehr in der selben Auflösung im WebP-Format generiert sondern es wird das Original genutzt.</li>
<li>Das Fallback mit dem JPG-Format gibt es gar nicht mehr. Wer noch so einen alten Browser verwendet, muss damit leider leben.</li>
</ul>
<p>Es werden jetzt nur noch die zusätzlichen Bildvarianten mit kleineren Auflösungen ausschließlich im WebP-Format generiert:</p>
<ul>
<li><code>foto1-360px.webp</code></li>
<li><code>foto1-500px.webp</code></li>
<li><code>foto1-816px.webp</code></li>
<li><code>foto1-1632px.webp</code></li>
</ul>
<p>Das ergibt dann nur noch 894 KiB an zusätzlichen Bilddateien statt bisher 1933 KiB. Bei einem anderen Blogbeitrag mit vielen Fotografien werden nach der Neuerung nur noch 7 MiB an zusätzlichen Dateien erzeugt, zuvor waren es 17 MiB.</p>
<p>Das Verzeichnis <code>resources/_gen</code> des Blogs war vor der Änderung 3300 MiB groß. Nach der Änderung sind es nur noch 1492 MiB.</p>
<p>Das passt so erst einmal. 😊</p>

<h2 id="render-hook-herunterladen" data-numberify>Render Hook herunterladen<a class="anchor ms-1" href="#render-hook-herunterladen"></a></h2>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content">Update 2023-08-24: Möglichkeit, die benötigten Dateien herunterzuladen.</div>
</div>


<p>Hier kannst du beide Dateien des Render Hooks herunterladen:</p>
<ul>
<li><a  href="downloads/figure.html.txt">figure.html</a></li>
<li><a  href="downloads/render-image.html.txt">render-image.html</a></li>
</ul>
<p>Das .txt am Ende muss entfernt werden.</p>]]></content:encoded></item><item><title>Mal wieder Änderungen im Blog und im Wiki</title><link>https://natenom.de/2022/05/wieder-aenderungen-blog-und-wiki/</link><pubDate>Tue, 03 May 2022 22:19:53 +0200</pubDate><guid>https://natenom.de/2022/05/wieder-aenderungen-blog-und-wiki/</guid><description>Es haben sich wieder ein paar Änderungen im Blog und im Wiki angesammelt, die ich hier dokumentiere.
Suche beschleunigt Die schönste Änderung ist die Suche, die jetzt sehr schnell Ergebnisse liefert. Zuvor dauerte die Suche je nach Stärke der Client-CPU von vielen Sekunden bis &amp;ldquo;Browser will Tab schließen&amp;rdquo; und die Suchergebnisse ließen auch zu Wünschen übrig.
Jetzt dauert es nur noch eine bis wenige Sekunden.
Ich habe dazu einen eigenen Blogbeitrag geschrieben, siehe hier.</description><content:encoded><![CDATA[<p>Es haben sich wieder ein paar Änderungen im Blog und im Wiki angesammelt, die ich hier dokumentiere.</p>

<h2 id="suche-beschleunigt" data-numberify>Suche beschleunigt<a class="anchor ms-1" href="#suche-beschleunigt"></a></h2>
<p>Die schönste Änderung ist die Suche, die jetzt sehr schnell Ergebnisse liefert. Zuvor dauerte die Suche je nach Stärke der Client-CPU von vielen Sekunden bis &ldquo;Browser will Tab schließen&rdquo; und die Suchergebnisse ließen auch zu Wünschen übrig.</p>
<p>Jetzt dauert es nur noch eine bis wenige Sekunden.</p>
<p>Ich habe dazu einen eigenen Blogbeitrag geschrieben, <a  href="/2022/05/suchfunktion-im-blog-massiv-beschleunigt-und-ausschluss-von-beitraegen/">siehe hier</a>.</p>

<h2 id="sortierte-tags-und-kategorien" data-numberify>Sortierte Tags und Kategorien<a class="anchor ms-1" href="#sortierte-tags-und-kategorien"></a></h2>
<p>Die Listen der Kategorien und Tags in Blogbeiträgen ist jetzt alphabetisch sortiert. Das hat der Entwickler nach meiner Anfrage in sein Theme implementiert, da es ursprünglich unsortiert war bzw. in der selben Reihenfolge angezeigt wurde, wie es auch im Front Matter eingetragen war.</p>
<p>Alphabetisch sortiert ist jetzt die Voreinstellung. Man kann aber auch auch in der <code>config.toml</code> im Bereich <code>[params]</code> einstellen, sodass nach Häufigkeit sortiert wird:</p>
<pre><code>taxonomySortingMethod = &quot;popularity&quot;
</code></pre>
<p>So sieht es jetzt aus (früher war es &ldquo;unsortiert&rdquo;):
</p><figure class="image-caption"><picture><source type="webp" srcset="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-sortierte-taxonomie.webp" />
			         <img alt="Sortierte Taxonomie (Kategorien und Tags) aus diesem Beitrag" src="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-sortierte-taxonomie.webp" title="Sortierte Taxonomie" width="806" height="44" loading="lazy" /></picture><figcaption>Sortierte Taxonomie</figcaption></figure><p>
</p>

<h2 id="webp-als-standard" data-numberify>WebP als Standard<a class="anchor ms-1" href="#webp-als-standard"></a></h2>
<p>Da jetzt immer automatisch Bildvarianten auch in JPG erstellt werden, habe ich meine Programme so eingestellt, dass Bilddateien immer im WebP-Format abgespeichert werden. Das betrifft Screenshots, ImagePipe auf Android und mein Script, das automatisch Bilder für den Blog aufbereitet.</p>

<h2 id="rand-um-bilder" data-numberify>Rand um Bilder<a class="anchor ms-1" href="#rand-um-bilder"></a></h2>
<p>Vri hat den Rand um Bilder herum verschönert.</p>
<p>Früher:</p>
<p></p><figure class="image-caption"><picture><source type="png" srcset="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-01-alte-bildumrandung.png" />
			         <img alt="Frühere Umrandung für Bilder war eine Art nach außen verlaufender Schatten in der Akzentfarbe der aktuell ausgewählten Palette." src="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-01-alte-bildumrandung.png" title="Alter Rand für Bilder" width="238" height="183" loading="lazy" /></picture><figcaption>Alter Rand für Bilder</figcaption></figure><p>
</p>
<p>Jetzt:</p>
<p></p><figure class="image-caption"><picture><source type="png" srcset="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-01-neue-bildumrandung.png" />
			         <img alt="Neue Umrandung für Bilder ist eine feste Linie in der Akzentfarbe der aktuell ausgewählten Palette mit abgerundeten Ecken." src="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-01-neue-bildumrandung.png" title="Neuer Rand für Bilder" width="238" height="183" loading="lazy" /></picture><figcaption>Neuer Rand für Bilder</figcaption></figure><p>
</p>

<h2 id="inhaltsverzeichnis-inline" data-numberify>Inhaltsverzeichnis inline<a class="anchor ms-1" href="#inhaltsverzeichnis-inline"></a></h2>
<p>Das Inhaltsverzeichnis befindet sich nicht mehr rechts in der Sidebar sondern immer ganz oben im Blogbeitrag. Es wird ein <code>details</code>-Element verwendet, da aber per Voreinstellung offen ist. Hintergrund ist die Darstellung auf mobilen Geräten, da dort das Inhaltsverzeichnis innerhalb der Sidebar erst ganz am Ende der Seite dargestellt wird. Mit der Änderung hat man auch auf Mobilteräten einfachen Zugriff auf das Inhaltsverzeichnis.</p>
<p>Seit der Umstellung finde ich es auch angenehmer, dass man direkt am Anfang des Blogbeitrags kurz überblicken kann, um was es geht. Selbst auf einem großen Bildschirm auf dem Desktop war das bisher nicht gegeben, weil man eher nicht nach rechts in die Sidebar geschaut hat.</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-inline-inhaltsverzeichnis_hu8037093d0769ccab6dfd6ca158f5279d_18854_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-inline-inhaltsverzeichnis_hu8037093d0769ccab6dfd6ca158f5279d_18854_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-inline-inhaltsverzeichnis_hu8037093d0769ccab6dfd6ca158f5279d_18854_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Inhaltsverzeichnis Inline eines anderen Beitrags" srcset="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-inline-inhaltsverzeichnis_hu8037093d0769ccab6dfd6ca158f5279d_18854_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-inline-inhaltsverzeichnis_hu8037093d0769ccab6dfd6ca158f5279d_18854_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-inline-inhaltsverzeichnis_hu8037093d0769ccab6dfd6ca158f5279d_18854_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-inline-inhaltsverzeichnis_hu8037093d0769ccab6dfd6ca158f5279d_18854_816x0_resize_q95_h2_catmullrom_2.webp" title="Inhaltsverzeichnis ist jetzt inline, hier am Beispiel eines anderen Beitrags." loading="lazy" width="816" height="392" /></picture><figcaption>Inhaltsverzeichnis ist jetzt inline, hier am Beispiel eines anderen Beitrags.</figcaption></figure><p>
</p>

<h2 id="render-hook-für-bilder-angepasst" data-numberify>Render Hook für Bilder angepasst<a class="anchor ms-1" href="#render-hook-für-bilder-angepasst"></a></h2>

<h3 id="a_renderhook-verlinkung" data-numberify>Keine automatische Verlinkung des Originals<a class="anchor ms-1" href="#a_renderhook-verlinkung"></a></h3>
<p>Mein Render Hook für Bilder verlinkt nicht mehr automatisch zum Originalbild, falls dieses breiter ist als 1000 Pixel. Das war sowieso nie intuitiv und weit weg von dem, was Markdown normalerweise macht. Man will schließlich selbst entscheiden, ob etwas verlinkt werden soll und wohin.</p>
<p>Für eine einzelne Seite bekommt man das alte Verhalten zurück, indem man im Front Matter <code>imageAutoLink: true</code> einfügt. Das mache ich bei Blogbeiträgen, bei denen ich hoch aufgelöste Bilder eingefügt hatte und von diesem Verhalten ausging. Erst ab heute werde ich solche Bilder manuell verlinken.</p>
<p>Zudem es jetzt auch wieder möglich, mit der Markdown-Syntax ein Bild selbst irgendwohin zu verlinken, optional auch auf das hochaufgelöste Originalbild. Soll so Link auf das Originalbild eingefügt werden, so kann man diese Syntax verwenden:</p>
<pre><code>[![](bild.jpg)](bild.jpg)
</code></pre>
<p>Das ist aber nur sinnvoll für Bilder ohne Beschreibungstext drunter, da dieser sonst auch als Link gerendert wird.</p>
<p><em>So langsam erschließt sich mir, weshalb die Leute von Hugo das so implementiert haben, dass alles, was mehr benötigt, als nur Bilder ganz einfach einzubinden, per <code>figure</code>-Shortcode gemacht wird.</em></p>
<p>Oder ein Bild mit Verlinkung auf eine URL</p>
<pre><code>[![](bild.jpg)](/lala)
</code></pre>

<h3 id="angabe-von-breite-und-höhe" data-numberify>Angabe von Breite und Höhe<a class="anchor ms-1" href="#angabe-von-breite-und-höhe"></a></h3>
<p>Mit dem Render Hook eingebundene erhalten jetzt auch eine passende Breiten- und Höhenangabe im HTML-Code, damit der Text dahinter beim Laden von Bildern mit einer langsamen Internetanbindung nicht mehr nach unten springt, sobald das Bild geladen wurde.</p>
<p><em>Bei Galerien passiert das aber noch immer, weil dafür ein Shortcode verwendet wird, der von einem größeren Projekt stammt und den ich nicht so einfach mal anpassen möchte.</em></p>

<h2 id="neuer-figure-shortcode" data-numberify>Neuer figure Shortcode<a class="anchor ms-1" href="#neuer-figure-shortcode"></a></h2>
<p>Ich habe einen neuen Shortcode <code>figure</code> erstellt, der auf dem aktuellen Render Hook basiert (<a  href="#a_renderhook-verlinkung">siehe oben</a>).</p>
<p>Dadurch werden, wie auch im Render Hook, nur dann kleine Bildvarianten erstellt, wenn das Originalbild größer als 816 Pixel ist. So gibt es keine vermatschten Bilder mehr, die dadurch entstehen, dass ein kleines Bild vergrößert wird.</p>
<p>Zusätzlich erlaubt der Shortcode die Verwendung von Markdown für den Parameter <code>caption</code> (wie auch beim builtin Shortcode <code>figure</code>), sodass es z. B. möglich wird, einen Link auf eine Lizenz zu setzen, wie das von OpenStreetMap bei Einbindung deren Karten gefordert wird.</p>
<p>Beispiel mit einem Link in der Beschreibung (&ldquo;caption&rdquo;):</p>
<pre><code>{{&lt; figure src=&quot;2022-05-03-inline-inhaltsverzeichnis.webp&quot; link=&quot;&quot;
alt=&quot;&quot; title=&quot;Ein Titel&quot; width=&quot;350&quot;
caption=&quot;Eine Caption mit URL wegen Copyright by [Natenom](/)&quot; &gt;}}
</code></pre>
<p>Ergebnis:</p>
 <figure class="image-caption"><picture><source type="webp" srcset="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-inline-inhaltsverzeichnis_hu8037093d0769ccab6dfd6ca158f5279d_18854_350x0_resize_q95_h2_catmullrom_2.webp" />
			         <img alt="" src="/2022/05/wieder-aenderungen-blog-und-wiki/2022-05-03-inline-inhaltsverzeichnis_hu8037093d0769ccab6dfd6ca158f5279d_18854_350x0_resize_q95_h2_catmullrom_2.webp" title="Ein Titel" width="350" height="168" loading="lazy" /></picture><figcaption>Eine Caption mit URL wegen Copyright by <a  href="/">Natenom</a></figcaption></figure>
<p>Ich werde die anderen <a  class='urlextern'  href="https://gohugo.io/content-management/shortcodes/#figure">Parameter, die im builtin-Shortcode <code>figure</code> von Hugo möglich sind</a>, in Zukunft auch noch implementieren, wenn ich sie benötige.</p>
]]></content:encoded></item><item><title>Verbesserung des Render Hooks für Bilder hier im Blog (und im Wiki)</title><link>https://natenom.de/2022/04/verbesserungen-des-render-hooks-fuer-bilder-und-im-wiki/</link><pubDate>Wed, 27 Apr 2022 02:20:37 +0200</pubDate><guid>https://natenom.de/2022/04/verbesserungen-des-render-hooks-fuer-bilder-und-im-wiki/</guid><description><![CDATA[<p>Nach dem letzten Blogbeitrag zu meinem neuen <a  href="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/">Render Hook zum Einbinden von Bildern in Hugo</a> habe ich von <a  class='urlextern'  href="https://benjaminneff.ch/">SuperTux88</a> wertvolle Rückmeldungen bekommen. Vielen Dank dafür. 👍</p>]]></description><content:encoded><![CDATA[<p>Nach dem letzten Blogbeitrag zu meinem neuen <a  href="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/">Render Hook zum Einbinden von Bildern in Hugo</a> habe ich von <a  class='urlextern'  href="https://benjaminneff.ch/">SuperTux88</a> wertvolle Rückmeldungen bekommen. Vielen Dank dafür. 👍</p>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>Update 1: Den Shortcode und den Hook gibt es hier zum herunterladen, <a  href="#a_download">siehe unten</a>.</p>
<p>Update 2 (04.04.2023): Es gibt wieder einen verbesserten Render Hook, der sich am Ursprungsformat eines Fotos orientiert, nur auf Webp für die Bildvarianten ausgelegt ist und somit sehr viel schneller ist und viel weniger Daten produziert, <a  href="/2023/04/shortcode-und-render-hook-fuer-hugo-verbessert-weniger-datenmuell-und-schnelleres-rendern/">siehe hier</a>.</p>
</div>
</div>



<h2 id="die-rückmeldungen" data-numberify>Die Rückmeldungen<a class="anchor ms-1" href="#die-rückmeldungen"></a></h2>
<p>Die Rückmeldungen sind im Einzelnen aufgelistet…</p>

<h3 id="mehr-monitor" data-numberify>Mehr Monitor<a class="anchor ms-1" href="#mehr-monitor"></a></h3>
<ul>
<li>Wenn jemand einen 4k Monitor hat, dann freut er sich über Bilder, die höher aufgelöst sind als nur 816 Pixel in der Breite.</li>
</ul>
<p>Meine Lösung: Wenn das Originalbild breiter ist als 1632 Pixel, dann wird zusätzlich noch ein hoch aufgelöstes Bild erzeugt mit 1632 Pixel Breite. In meinem Blog trifft das z. B. auf einzelne Fotos oder Panoramabilder zu, die mindestens 2000 Pixel breit sind.</p>

<h3 id="webp-und-jpg" data-numberify>WebP und JPG<a class="anchor ms-1" href="#webp-und-jpg"></a></h3>
<ul>
<li>Hugo kann man anweisen, die Varianten des Originalbilds immer als WebP zu erzeugen, auch wenn das Original ein anderes Format hat.</li>
<li><del>Safari auf Mac OS kann noch nicht mit WebP umgehen</del>. Korrektur: Nur Safari auf alten Mac OS Systemen kann kein WebP. Es hängt wohl vom Betriebssystem ab und das aktuelle Mac OS kann WebP.</li>
</ul>
<p>Lösung: Für alle Bilder werden jetzt kleine Bildvarianten in den Formaten JPG und WebP erzeugt. Beide Dateiformate werden zur Verfügung gestellt. WebP ist der Standard und JPG das Fallback (z. B. für Safari und Mac OS).</p>

<h3 id="4k-simulieren" data-numberify>4k &ldquo;simulieren&rdquo;<a class="anchor ms-1" href="#4k-simulieren"></a></h3>
<p>Im Browser auf 200 % zoomen, dann bekommt man auch die große Bildvariante geliefert, wenn sie vorhanden ist, siehe nächster Abschnitt.</p>

<h2 id="wie-der-neue-render-hook-arbeitet" data-numberify>Wie der neue Render Hook arbeitet<a class="anchor ms-1" href="#wie-der-neue-render-hook-arbeitet"></a></h2>
<p>Und aus all den Vorschlägen und viel Arbeit ist nun das neue Render Hook entstanden, das wie folgt arbeitet (und damit etwas anders als <a  href="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/#wie-der-neue-render-hook-funktioniert">bisher</a>):</p>
<ul>
<li>Ist das Originalbild eine <code>.webp</code>-Datei, dann wird dieses konvertiert und eine <code>.jpg</code>-Datei erzeugt, sodass beide Formate vorliegen.</li>
<li>Ist das Originalbild eine <code>.jpg</code>-Datei, dann wird dieses konvertiert und eine <code>.webp</code>-Datei erzeugt, sodass beide Formate vorliegen.</li>
<li>Ist das Originalbild eine andere von Hugo unterstützte Datei, dann wird diese konvertiert und sowohl eine <code>.webp</code>- als auch in eine <code>.jpg</code>-Datei erzeugt, sodass beide Formate vorliegen.</li>
<li>Ist das Originalbild 816 Pixel breit oder breiter, dann wird ein srcset erzeugt für die Breiten 360, 500, 816 und optional bei Bildern über 1632 Pixeln noch zusätzlich 1632 Pixel Breite.</li>
<li>Ist das Originalbild kleiner als 816 Pixel, dann wird nur das Originalbild ohne srcset in der Seite eingebunden und es findet keine Verlinkung statt und es werden keine kleinen Bildvarianten erzeugt.</li>
<li>Ist das Originalbild breiter als 1000 Pixel, dann wird um die einbegundene verkleinerte Variante herum ein Link auf das Originalbild gesetzt.</li>
<li>In allen Fällen wird das Bild per <code>picture</code>-Element eingebunden. Dieses enthält immer als Voreinstellung per <code>source</code>-Element (<a  class='urlextern'  href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source">Dokumentation</a>) alle Bildgrößen im <code>.webp</code>-Format und als Fallback im <code>img</code>-Element alle Bildgrößen im <code>.jpg</code>-Format.</li>
<li>Liegt das Bild nicht im <code>Page Bundle</code>, dann wird es ohne irgendwelche Zusätze per <code>img</code>-Element eingebunden.</li>
<li>Bilder werden immer per Lazy loading eingebunden.</li>
</ul>

<h2 id="vorteile-der-neuen-variante-des-render-hooks" data-numberify>Vorteile der neuen Variante des Render Hooks<a class="anchor ms-1" href="#vorteile-der-neuen-variante-des-render-hooks"></a></h2>
<p>Ich kann für die Originalbilder alle Formate verwenden, die Hugo konvertieren kann. Das sind <code>bmp, gif, jpeg, jpg, png, tif, tiff, webp</code>. Alle kleinen Bildvarianten werden jedoch im JPG- und WebP-Format zur Verfügung gestellt.</p>

<h2 id="beispiele" data-numberify>Beispiele<a class="anchor ms-1" href="#beispiele"></a></h2>
<p>So sieht es z. B. aus, wenn das Originalbild eine circa 5000 Pixel breites WebP-Datei ist <em>(Pfade und Dateinamen auf das Wesentliche gekürzt)</em>:</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-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">figure</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;image-caption&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;lala.webp&#34;</span>&gt;
</span></span><span style="display:flex;"><span>        &lt;<span style="color:#f92672">picture</span>&gt;
</span></span><span style="display:flex;"><span>            &lt;<span style="color:#f92672">source</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;image/webp&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">srcset</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;360x.webp 360w,500x.webp 500w,816x.webp 816w, 1632x.webp 1632w&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">sizes</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px&#34;</span>
</span></span><span style="display:flex;"><span>            /&gt;
</span></span><span style="display:flex;"><span>            &lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">alt</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;lala&#34;</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">srcset</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;360x.jpg 360w, 500x.jpg 500w, 816x.jpg 816w, 1632x.jpg 1632w,&#34;</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">sizes</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px&#34;</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;1632x.jpg&#34;</span> <span style="color:#a6e22e">title</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;lala&#34;</span> <span style="color:#a6e22e">loading</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;lazy&#34;</span> /&gt;
</span></span><span style="display:flex;"><span>        &lt;/<span style="color:#f92672">picture</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;/<span style="color:#f92672">a</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">figcaption</span>&gt;lala&lt;/<span style="color:#f92672">figcaption</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">figure</span>&gt;</span></span></code></pre></div>
<p>Und so sieht es aus, wenn die Datei schmaler als 816 Pixel ist:</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-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">figure</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;image-caption&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">picture</span>&gt;&lt;<span style="color:#f92672">source</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;image/webp&#34;</span> <span style="color:#a6e22e">srcset</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;330x.webp&#34;</span> /&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">alt</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;lala&#34;</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;lala.jpg&#34;</span> <span style="color:#a6e22e">title</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;lala&#34;</span> <span style="color:#a6e22e">loading</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;lazy&#34;</span> /&gt;&lt;/<span style="color:#f92672">picture</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">figcaption</span>&gt;lala&lt;/<span style="color:#f92672">figcaption</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">figure</span>&gt;</span></span></code></pre></div>

<h2 id="unschöne-platzverschwendung" data-numberify>Unschöne Platzverschwendung<a class="anchor ms-1" href="#unschöne-platzverschwendung"></a></h2>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>29.04.2022: Eindeutig Unfähigkeit 🤪</p>
<p>Mit den genannten Befehlen wird das Ergebnis ins HTML gerendert. Das Bild wird aber schon beim Befehl <code>.Resize</code> generiert. Danke für die Klarstellung.</p>
<p>Durch eine zur Verfügung gestellte Beispielimplementierung von SuperTux88 hab ich einige Dinge über Hugo gelernt, die ich vorher nicht wusste. Bin halt Anwender, kein Programmierer. 🤪 Dadurch konnte ich den Render Hook so umsetzen, wie ich es eigentlich vor hatte.</p>
<p>Zum Beispiel werden jetzt nicht mehr immer alle möglichen Bildgrößen erzeugt sondern nur die benötigten. Für den Blog bedeutet das eine Verkleinerung der genertierten Bilddateien von 700 MiB auf 244 MiB und für das Wiki von 644 MiB auf 355 MiB.</p>
</div>
</div>


<p><del>Entweder liegt es an meiner Unfähigkeit oder an Hugo, dass Bildvarianten, die gar nicht verwendet werden und in irgendwelchen If-Bedingungen im Render Hook stehen und gar nicht erfüllt werden, trotzdem jedes Mal erzeugt werden. Stört mich nicht sehr, da sie niemals ausgeliefert werden, aber sie sind da und belegen Speicherplatz. Vielleicht kann ich das in Zukunft noch lösen.</del></p>
<p><del>Laut <a  class='urlextern'  href="https://gohugo.io/content-management/image-processing/#image-rendering">Dokumentation</a> sollte meinem Verständnis nach das Bild erst dann generiert werden, wenn einer dieser &ldquo;Befehle&rdquo; auf das Bild ausgeführt wird: <code>Permalink, RelPermalink, Width, Height</code>.</del></p>
<p><del>Im Render Hook reicht aber schon so eine Zeile aus, um das Bild zu generieren</del>:</p>
<pre><code>{{- $img_webp := $img.Resize &quot;600x webp&quot; -}}
</code></pre>
<p><del>Wer darüber etwas weiß, darf sich gerne melden. 🙂</del></p>

<h2 id="verbesserungen" data-numberify>Verbesserungen?<a class="anchor ms-1" href="#verbesserungen"></a></h2>
<p>Vielleicht wäre es sinnvoller, immer auf die konvertierte jpg-Datei zu verlinken. Oder auf die webp-Datei? Kann man das irgendwie so in HTML einbinden, dass sich der Browser je nach Fähigkeit selbst aussuche, welchen Link zu welchem Ziel er wählt?</p>

<h2 id="nützliches-zum-picture-tag" data-numberify>Nützliches zum Picture-Tag<a class="anchor ms-1" href="#nützliches-zum-picture-tag"></a></h2>
<ul>
<li>Antwort auf die Frage, ob man ein <code>picture</code>-Element in ein <code>figure</code>-Element stecken darf, <a  class='urlextern'  href="https://stackoverflow.com/a/23941403">siehe hier</a>. Spoiler: Definitiv. Und hier zur <a  class='urlextern'  href="https://html.spec.whatwg.org/multipage/embedded-content.html#embedded-content">weiteren Lektüre</a> dazu.</li>
</ul>

<h2 id="a_download" data-numberify>Shortcode und Hook zum Herunterladen<a class="anchor ms-1" href="#a_download"></a></h2>
<ul>
<li><a  href="downloads/figure.html.txt">figure.html</a></li>
<li><a  href="downloads/render-image.html.txt">render-image.html</a></li>
</ul>
<p>Das .txt am Ende muss entfernt werden.</p>]]></content:encoded></item><item><title>Einbindung von Bildern in Hugo – Infos und eigener Render Hook</title><link>https://natenom.de/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/</link><pubDate>Sun, 24 Apr 2022 12:01:40 +0200</pubDate><guid>https://natenom.de/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/</guid><description>&lt;p>Ein paar Informationen dazu, wie man in Hugo Bilder einbinden kann, welche Hilfsmittel es gibt und auch, was mit Bordmitteln von Hugo nicht möglich ist. Und zum Schluss ein eigener Render-Hook, der hilfreiche Dinge macht.&lt;/p></description><content:encoded><![CDATA[<p>Ein paar Informationen dazu, wie man in Hugo Bilder einbinden kann, welche Hilfsmittel es gibt und auch, was mit Bordmitteln von Hugo nicht möglich ist. Und zum Schluss ein eigener Render-Hook, der hilfreiche Dinge macht.</p>
<div class="shortcode-notice update">
    <div class="shortcode-notice-title update">
        Update</div>
    <div class="notice-content"><p>Update 1 (27.04.2022): Im Blog wird jetzt ein aktuelleres und verbessertes Render Hook verwendet, <a  href="/2022/04/verbesserungen-des-render-hooks-fuer-bilder-und-im-wiki/">siehe hier</a>.</p>
<p>Update 2 (04.04.2023): Es gibt wieder einen verbesserten Render Hook, der sich am Ursprungsformat eines Fotos orientiert, nur auf Webp für die Bildvarianten ausgelegt ist und somit sehr viel schneller ist und viel weniger Daten produziert, <a  href="/2023/04/shortcode-und-render-hook-fuer-hugo-verbessert-weniger-datenmuell-und-schnelleres-rendern/">siehe hier</a>.</p>
</div>
</div>



<h2 id="bilder-in-hugo" data-numberify>Bilder in Hugo<a class="anchor ms-1" href="#bilder-in-hugo"></a></h2>
<p>Es gibt verschiedene Möglichkeiten zur Einbindung von Bildern in Hugo.</p>
<ul>
<li><a  href="#a_einbinden-via-markdown-syntax">Standard-Markdown-Syntax</a></li>
<li><a  href="#a_renderhook">Render Hook</a></li>
<li><a  href="#a_theme">Theme-Erweiterungen</a></li>
<li><a  href="#a_shortcode">Shortcode</a></li>
</ul>

<h3 id="a_einbinden-via-markdown-syntax" data-numberify>Standard-Markdown-Syntax – Tut, kann aber nix<a class="anchor ms-1" href="#a_einbinden-via-markdown-syntax"></a></h3>
<p>Die Standard-Markdown-Syntax, die Hugo von sich aus unterstützt, funktioniert zwar, kann dafür aber nichts:</p>
<pre><code>![Alt Text](/pfad/zu-datei.jpg)
</code></pre>
<p>Das bedeutet konkret:</p>
<ul>
<li>Keine Möglichkeit zur Angabe, wie groß das Bild dargestellt wird, es wird immer maximal groß angezeigt.</li>
<li>Es werden keine kleineren Bildvarianten erstellt. Ist ein Bild z. B. 10 MiB groß, 2000 Pixel breit und beträgt der zur Verfügung stehende Platz im Blog nur 800 Pixel in der Breite, so wird trotzdem das Originalbild mit 2000 Pixeln eingebunden, nur eben verkleinert und man muss 10 MiB herunterladen.</li>
</ul>

<h3 id="a_renderhook" data-numberify>Render Hook<a class="anchor ms-1" href="#a_renderhook"></a></h3>
<p>Für einen <a  class='urlextern'  href="https://gohugo.io/templates/render-hooks/">Render Hook</a> erstellt man die Datei <code>layouts/_default/_markup/render-image.html</code>.</p>
<p>Hier kann man Programmcode hinterlegen, der ausgeführt wird, sobald die Standard-Markdown-Syntax für die Einbindung von Bildern gerendert wird.</p>
<p>Dies hat den Vorteil, dass man im Gegensatz zu einem <a  href="#a_shortcode">Shortcode</a> beim Standard-Markdown bleiben oder diesen auch erweitern kann.</p>

<h3 id="a_theme" data-numberify>Theme-Erweiterungen<a class="anchor ms-1" href="#a_theme"></a></h3>
<p>Das hier im Blog verwendete Theme &lsquo;<a  class='urlextern'  href="https://hbs.razonyang.com/en/docs/image-processing/">Bootstrap</a>&rsquo; stellt einige Möglichkeiten zum Einbinden von Bildern bereit. So kann man z. B. Bilder verkleinert anzeigen lassen und dafür wird auch wirklich eine kleinere Variante des Originalbildes erzeugt (wenn das Bild Teil des <code>Page Bundles</code> ist).</p>
<p>Es kann eine erweitere Standard-Markdown-Syntax verwendet werden, wie z. B.</p>
<pre><code>![Alt Text](pfad/zu-datei.jpg?height=200px)
</code></pre>
<p>Letztlich wird das üer einen Render Hook ermöglicht, siehe <a  href="#a_renderhook">oben</a>.</p>

<h3 id="a_shortcode" data-numberify>Shortcode<a class="anchor ms-1" href="#a_shortcode"></a></h3>
<p>Es gibt im Netz verschiedene Lösungen in Form von Shortcodes, die z. B. automatisch kleinere Varianten der Bilder erstellen und diese einbinden statt des Originals und es auch ermöglichen, einen Link auf das Originalbild zu setzen, einen Text unter dem Bild anzuzeigen und mehr.</p>
<p>Solch einen Shortcode hatte ich bis vor kurzem auch verwendet. Jedoch muss man für Shortcodes eine andere Syntax verwenden, z. B. für den Shortcode <code>bildeinbinden</code>:</p>
<pre><code>{{​&lt; bildeinbinden src=&quot;&quot; link=&quot;&quot; alt=&quot;&quot; title=&quot;&quot; width=&quot;&quot; &gt;​}}
</code></pre>

<h2 id="so-nah-am-standard-wie-möglich" data-numberify>So nah am Standard, wie möglich<a class="anchor ms-1" href="#so-nah-am-standard-wie-möglich"></a></h2>
<p>Ich bevorzuge die Verwendung von gegebenen Standards statt einer eigenen Lösung. Denn so werden Probleme beim Wechsel eines Themes oder auch beim Export minimiert.</p>
<p>So verwende ich lieber die Standard-Markdown-Syntax für das Einbinden von Bildern in Hugo statt eines eigenen Shortcodes, dessen Parameter man sich mehr oder weniger merken muss. Zudem ist es für neue Menschen leichter.</p>
<p>Deshalb habe ich mich hier im Blog für einen Render Hook entschieden, um Bilder einzubinden.</p>

<h2 id="der-eigene-render-hook" data-numberify>Der eigene Render Hook<a class="anchor ms-1" href="#der-eigene-render-hook"></a></h2>
<p>Als Ausgangspunkt habe ich <a  class='urlextern'  href="https://github.com/bep/portable-hugo-links/blob/master/layouts/_default/_markup/render-image.html">diese Version hier</a> verwendet und für meine Anforderungen angepasst.</p>
<p>Die Syntax ist die selbe wie in Hugo:</p>
<pre><code>![Alt-Text](bild-200px.jpg &quot;Titel&quot;)
</code></pre>
<p>z. B.</p>
<pre><code>![Ein Demobild mit Radfahrenden, um zu verdeutlichen, wie ein Bild mit dem eigenen Render Hook eingebunden wird. ](bild-200px.jpg &quot;Radfahrende in Pforzheim&quot;)
</code></pre>
<p>Im Ergebnis das 200 Pixel breite Bild, das nicht automatisch verlinkt wird, weil es zu klein ist:</p>
<p></p><figure class="image-caption"><picture><source type="jpeg" srcset="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-200px.jpg" />
			         <img alt="Ein Demobild mit Radfahrenden, um zu verdeutlichen, wie ein Bild mit dem eigenen Render Hook eingebunden wird. " src="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-200px.jpg" title="Radfahrende in Pforzheim" width="200" height="133" loading="lazy" /></picture><figcaption>Radfahrende in Pforzheim</figcaption></figure><p>
</p>
<p>Und hier ein Beispiel eines Bildes, das 2000 Pixel breit ist und deshalb automatisch zum Originalbild verlinkt, während automatisch eine erzeugte kleinere Variante (800 Pixel breit) des Originalbildes hier eingebunden wird.</p>
<p>Aus:</p>
<pre><code>![Fahrrad auf einem Feldweg und mit einem 'Vorsicht Kinder' Schild auf dem Gepäckträger](bild-gross.jpg &quot;Das Schild habe ich zuvor am Straßenrand gefunden.&quot;)
</code></pre>
<p>Wird:
</p><figure class="image-caption"><a href="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross.jpg"><picture>
                <source type="image/webp" srcset="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross_hu8a21981fb063edd2268f2be3898cd825_1439790_360x0_resize_q95_h2_catmullrom.webp 360w,/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross_hu8a21981fb063edd2268f2be3898cd825_1439790_500x0_resize_q95_h2_catmullrom.webp 500w,/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross_hu8a21981fb063edd2268f2be3898cd825_1439790_816x0_resize_q95_h2_catmullrom.webp 816w, /2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross_hu8a21981fb063edd2268f2be3898cd825_1439790_1632x0_resize_q95_h2_catmullrom.webp 1632w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px" />
                <img alt="Fahrrad auf einem Feldweg und mit einem &amp;lsquo;Vorsicht Kinder&amp;rsquo; Schild auf dem Gepäckträger" srcset="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross_hu8a21981fb063edd2268f2be3898cd825_1439790_360x0_resize_q95_h2_catmullrom.webp 360w, /2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross_hu8a21981fb063edd2268f2be3898cd825_1439790_500x0_resize_q95_h2_catmullrom.webp 500w, /2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross_hu8a21981fb063edd2268f2be3898cd825_1439790_816x0_resize_q95_h2_catmullrom.webp 816w,/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross_hu8a21981fb063edd2268f2be3898cd825_1439790_1632x0_resize_q95_h2_catmullrom.webp 1632w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px,(min-width: 1200px) 1632px"
                     src="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/bild-gross_hu8a21981fb063edd2268f2be3898cd825_1439790_816x0_resize_q95_h2_catmullrom.webp" title="Das Schild habe ich zuvor am Straßenrand gefunden." loading="lazy" width="816" height="612" /></picture></a><figcaption>Das Schild habe ich zuvor am Straßenrand gefunden.</figcaption></figure><p>
</p>
<p>Man kann jedoch sowohl den Alt-Text als auch den Titel weglassen.</p>
<div class="shortcode-notice hinweis">
    <div class="shortcode-notice-title hinweis">
        Hinweis</div>
    <div class="notice-content"><p>Mir gefällt jedoch an dieser Syntax, dass man immer daran erinnert wird, einen Beschreibungstext zu hinterlegen und nicht nur einen Titel. Denn der Beschreibungstext (Alt-Text) ist wichtig für Menschen mit Sehbeeinträchtigungen.</p>
<p>Ich werde in Zukunft somit darauf achten, solche Texte zu hinterlegen. In der Vergangenheit habe ich das im Blog fast nie getan.</p>
</div>
</div>



<h3 id="quelltext" data-numberify>Quelltext<a class="anchor ms-1" href="#quelltext"></a></h3>
<p>Hier der fertige Render Hook <code>layouts/_default/_markup/render-image.html</code>:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-jinja" data-lang="jinja"><span style="display:flex;"><span><span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>autolinking <span style="color:#f92672">:=</span> .Page.Param <span style="color:#e6db74">&#34;imageAutoLink&#34;</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">default</span> <span style="color:#66d9ef">true</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>img <span style="color:#f92672">:=</span> .Page.Resources.GetMatch .Destination -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">and</span> <span style="color:#f92672">(</span><span style="color:#66d9ef">not</span> <span style="color:#960050;background-color:#1e0010">$</span>img<span style="color:#f92672">)</span> .Page.File -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>path <span style="color:#f92672">:=</span> path.Join .Page.File.Dir .Destination <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>img <span style="color:#f92672">=</span> resources.Get <span style="color:#960050;background-color:#1e0010">$</span>path -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> end -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">with</span> <span style="color:#960050;background-color:#1e0010">$</span>img -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>large <span style="color:#f92672">:=</span> <span style="color:#960050;background-color:#1e0010">$</span>img.Resize <span style="color:#e6db74">&#34;816x&#34;</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>medium <span style="color:#f92672">:=</span> <span style="color:#960050;background-color:#1e0010">$</span>img.Resize <span style="color:#e6db74">&#34;500x&#34;</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>small <span style="color:#f92672">:=</span> <span style="color:#960050;background-color:#1e0010">$</span>img.Resize <span style="color:#e6db74">&#34;360x&#34;</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;figure class=&#34;image-caption&#34;&gt;
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span> <span style="color:#66d9ef">if</span> gt <span style="color:#960050;background-color:#1e0010">$</span>img.Width <span style="color:#ae81ff">816</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">{{</span> <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">and</span> <span style="color:#f92672">(</span>gt <span style="color:#960050;background-color:#1e0010">$</span>img.Width <span style="color:#ae81ff">1000</span><span style="color:#f92672">)</span> <span style="color:#f92672">(</span>eq <span style="color:#960050;background-color:#1e0010">$</span>autolinking <span style="color:#66d9ef">true</span> <span style="color:#f92672">)</span> <span style="color:#75715e">}}</span>&lt;a href=&#34;<span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">$</span>img.RelPermalink -<span style="color:#75715e">}}</span>&#34;&gt;<span style="color:#75715e">{{</span> end <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>    &lt;img alt=&#34;<span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>.Text <span style="color:#75715e">}}</span>&#34; srcset=&#34;
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>small.RelPermalink <span style="color:#75715e">}}</span> 360w,
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>medium.RelPermalink <span style="color:#75715e">}}</span> 500w,
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>large.RelPermalink <span style="color:#75715e">}}</span> 816w&#34; sizes=&#34;(max-width: 424px) 360px,(max-width: 596px) 500px,(min-width: 565px) 816px&#34; src=&#34;<span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>small.RelPermalink <span style="color:#75715e">}}</span>&#34; title=&#34;<span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>.Title <span style="color:#75715e">}}</span>&#34; loading=&#34;lazy&#34; /&gt;
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">{{</span> <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">and</span> <span style="color:#f92672">(</span>gt <span style="color:#960050;background-color:#1e0010">$</span>img.Width <span style="color:#ae81ff">1000</span><span style="color:#f92672">)</span> <span style="color:#f92672">(</span>eq <span style="color:#960050;background-color:#1e0010">$</span>autolinking <span style="color:#66d9ef">true</span> <span style="color:#f92672">)</span> <span style="color:#75715e">}}</span>&lt;/a&gt;<span style="color:#75715e">{{</span> end <span style="color:#75715e">}}</span>
</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;img alt=&#34;<span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>.Text <span style="color:#75715e">}}</span>&#34; src=&#34;<span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>img.RelPermalink <span style="color:#75715e">}}</span>&#34; loading=&#34;lazy&#34; title=&#34;<span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>.Title <span style="color:#75715e">}}</span>&#34; /&gt;
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span> end <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>    &lt;figcaption&gt;<span style="color:#75715e">{{</span> <span style="color:#66d9ef">with</span> <span style="color:#960050;background-color:#1e0010">$</span>.Title <span style="color:#f92672">|</span> <span style="color:#a6e22e">safeHTML</span> <span style="color:#75715e">}}{{</span> <span style="color:#960050;background-color:#1e0010">.</span> <span style="color:#75715e">}}{{</span> end <span style="color:#75715e">}}</span>&lt;/figcaption&gt;
</span></span><span style="display:flex;"><span>&lt;/figure&gt;
</span></span><span style="display:flex;"><span><span style="color:#75715e">{{</span><span style="color:#f92672">-</span> <span style="color:#66d9ef">else</span> -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;img src=&#34;<span style="color:#75715e">{{</span> .Destination <span style="color:#f92672">|</span> <span style="color:#a6e22e">safeURL</span> <span style="color:#75715e">}}</span>&#34; alt=&#34;<span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>.Text <span style="color:#75715e">}}</span>&#34; title=&#34;<span style="color:#75715e">{{</span> <span style="color:#960050;background-color:#1e0010">$</span>.Title <span style="color:#75715e">}}</span>&#34; loading=&#34;lazy&#34; /&gt;<span style="color:#75715e">{{</span><span style="color:#f92672">-</span> end -<span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>&lt;!-- adapted from https://github.com/bep/portable-hugo-links/blob/master/layouts/_default/_markup/render-image.html --&gt;</span></span></code></pre></td></tr></table>
</div>
</div>

<h3 id="wie-der-neue-render-hook-funktioniert" data-numberify>Wie der neue Render Hook funktioniert<a class="anchor ms-1" href="#wie-der-neue-render-hook-funktioniert"></a></h3>
<p>Und so funktioniert der neu erstellte Render Hook <code>render-image.html</code>:</p>
<ul>
<li>Bild ist breiter als 816 Pixel<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>:
<ul>
<li>Es werden automatisch kleinere Bildvarianten erstellt und via <code>srcset</code> eingebunden.</li>
</ul>
</li>
<li>Bild ist schmaler als 816 Pixel:
<ul>
<li>Es werden keine kleineren/größeren Bildvarianten erstellt und auf ein <code>srcset</code> wird verzichtet, es wird nur das Originalbild eingebunden. <em>(Man könnte noch implementieren, dass in letzterem Fall nur die Bildvarianten erstellt werden, die kleiner als 816 Pixel sind. Aber das spare ich mir, da das nur selten vorkommt und das meistens Dateien mit sehr geringen Dateigrößen sind.)</em></li>
<li>Hierdurch wird ein sehr kleines Bild wirklich nur so groß angezeigt, wie es auch ist, nicht vergrößert und matschig.</li>
</ul>
</li>
<li>Bild ist breiter als 1000 Pixel:
<ul>
<li>Es wird automatisch ein Link auf das Originalbild gesetzt. Das Verlinken kann man unterbinden mit <code>imageAutoLink: false</code> im Front Matter eines Blogbeitrags.</li>
</ul>
</li>
<li>Der angegebene Titel wird unter dem Bild angezeigt.</li>
<li>Der angegebene Alt-Text in eckigen Klammern wird in das alt-Attribut eingefügt.</li>
<li>Die Bilder werden per <a  class='urlextern'  href="https://developer.mozilla.org/en-US/docs/Web/Performance/Lazy_loading">Lazy loading</a> eingebunden, sodass der Browser sie erst herunterlädt, wenn sie in der Nähe des Sichtbereits im Browser sind. Das spart Ressourcen, falls man nur einen Teil eines Beitrags liest.</li>
<li>Es werden kleine Bildvarianten mit 500 und 360 Pixeln Breite erstellt. Diese sind für die kleineren Ansichten im Blog notwendig, z. B. auf Mobilgeräten.</li>
</ul>

<h3 id="ideen-für-später" data-numberify>Ideen für später<a class="anchor ms-1" href="#ideen-für-später"></a></h3>
<ul>
<li>Es wäre schön, wenn die Beschreibung aus den <a  class='urlextern'  href="https://gohugo.io/content-management/image-processing/#exif-data">Exif-Tags</a> verwendet werden könnte, sofern man keine eigene Beschreibung in Markdown einträgt. Ein Beispiel einer Umsetzung gibt es <a  class='urlextern'  href="https://digitalnotions.net/show-photo-exif-data-in-hugo/">hier</a>.</li>
<li>Angabe von selbst festgelegter Breite für das Einbinden eines Bildes, wie z. B. <a  class='urlextern'  href="https://discourse.gohugo.io/t/pass-attributes-to-image-render-hook/36899">hier</a> beschrieben oder auch im <a  href="#a_theme">hier im Blog verwendeten Theme</a>.</li>
</ul>

<h2 id="uffbasse-aufpassen--besser-kein-srcset-bei-kleinen-bildern" data-numberify>Uffbasse (Aufpassen) – Besser kein srcset bei kleinen Bildern<a class="anchor ms-1" href="#uffbasse-aufpassen--besser-kein-srcset-bei-kleinen-bildern"></a></h2>
<p>Man kann Hugo anweisen, <a  class='urlextern'  href="https://gohugo.io/content-management/image-processing/#resize">kleinere Bildvarianten des Originalbildes</a> zu erstellen, die man dann statt des Originalbildes verwenden kann. Alternativ kann man daraus ein <code>srcset</code> erstellen, sodass der Browser automatisch die passende Größe aussuchen und herunterladen kann.</p>
<p>Jedoch ist dieser Mechanismus der Erstellung von Bildvarianten in Hugo ziemlich &ldquo;dumm&rdquo;. Wenn z. B. das Bild nur 200 Pixel breit ist, werden angeforderte größere Bildvarianten trotzdem erstellt und das resultiert dann in einem total zermatschten größeren Bild.</p>
<p>In diesem Screenshot wird das deutlich sichtbar. Das Originalbild (200 Pixel breit) und darunter das Bild, das von Hugo auf Anfrage in 800 Pixel Breite erzeugt wurde, obwohl das Originalbild kleiner ist:</p>
<p></p><figure class="image-caption"><picture>
                <source type="image/webp" srcset="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/images/2022-04-24-markdown-syntax-und-figure_hu96733c1f658ccc0888b66ba5cbfa8dc6_71688_360x0_resize_q95_h2_catmullrom_2.webp 360w,/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/images/2022-04-24-markdown-syntax-und-figure_hu96733c1f658ccc0888b66ba5cbfa8dc6_71688_500x0_resize_q95_h2_catmullrom_2.webp 500w,/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/images/2022-04-24-markdown-syntax-und-figure_hu96733c1f658ccc0888b66ba5cbfa8dc6_71688_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                                          sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px" />
                <img alt="Oben das Originalbild in 200 Pixel breite und darunter das von Hugo angefragte aus dem Originalbild erzeugte Bild mit circa 800 Pixeln, das entsprechend breit angezeigt wird und natürlich total zermatscht ist." srcset="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/images/2022-04-24-markdown-syntax-und-figure_hu96733c1f658ccc0888b66ba5cbfa8dc6_71688_360x0_resize_q95_h2_catmullrom_2.webp 360w, /2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/images/2022-04-24-markdown-syntax-und-figure_hu96733c1f658ccc0888b66ba5cbfa8dc6_71688_500x0_resize_q95_h2_catmullrom_2.webp 500w, /2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/images/2022-04-24-markdown-syntax-und-figure_hu96733c1f658ccc0888b66ba5cbfa8dc6_71688_816x0_resize_q95_h2_catmullrom_2.webp 816w"
                     sizes="(max-width: 424px) 360px, (max-width: 596px) 500px, (min-width: 565px) 816px"
                     src="/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/images/2022-04-24-markdown-syntax-und-figure_hu96733c1f658ccc0888b66ba5cbfa8dc6_71688_816x0_resize_q95_h2_catmullrom_2.webp" title="Oben das Originalbild in 200 Pixel breite und darunter das von Hugo angefragte aus dem Originalbild erzeugte Bild mit circa 800 Pixeln, das entsprechend breit angezeigt wird und natürlich total zermatscht ist." loading="lazy" width="816" height="706" /></picture><figcaption>Oben das Originalbild in 200 Pixel breite und darunter das von Hugo angefragte aus dem Originalbild erzeugte Bild mit circa 800 Pixeln, das entsprechend breit angezeigt wird und natürlich total zermatscht ist.</figcaption></figure><p>
</p>
<p>Jedoch kann man in Hugo per <code>.Width</code> die Breite eines Bildes abfragen und nur dann weitere Bildvarianten erstellen lassen, wenn eine Mindestbreite gegeben ist und bei zu kleinen Bildern auf srcset verzichten.</p>

<h2 id="passt" data-numberify>Passt<a class="anchor ms-1" href="#passt"></a></h2>
<p>Ich bin mit der neuen Lösung erst einmal zufrieden. Ich kann die Standard-Markdown-Syntax verwenden, es wird automatisch ein srcset eingefügt und große Bilder werden automatisch zum Originalbild verlinkt. Und zusätzlich werde ich auch noch daran erinnert, einen passenden Alt-Text zu schreiben.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>816 Pixel ist die Breite des Inhalts in der Standardansicht meines Blog.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></content:encoded><enclosure url="https://natenom.de/2022/04/einbindung-von-bildern-in-hugo-infos-und-render-hook/cover.jpg" length="1439790" type="image/jpeg"/></item></channel></rss>