<?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>Share on Ben&#39;s Blog</title>
    <link>https://jinpeng.cv/en/tags/share/</link>
    <description>Recent content in Share on Ben&#39;s Blog</description>
    <generator>Hugo -- 0.154.0</generator>
    <language>en</language>
    <copyright>©️ 2025 Ben</copyright>
    <lastBuildDate>Mon, 09 Mar 2026 22:26:59 -0600</lastBuildDate>
    <atom:link href="https://jinpeng.cv/en/tags/share/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hugo &#43; Obsidian: An Elegant Image Hosting-Free Solution</title>
      <link>https://jinpeng.cv/en/posts/note/code/note_20250331012336/</link>
      <pubDate>Sun, 30 Mar 2025 17:23:36 +0000</pubDate>
      <guid>https://jinpeng.cv/en/posts/note/code/note_20250331012336/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;When managing images for a Hugo blog in Obsidian, using an image hosting service can be unstable. Without one, inserting images becomes difficult and maintenance is cumbersome. Common issues include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Path Confusion&lt;/strong&gt;: Manual maintenance of the &lt;code&gt;/static/images&lt;/code&gt; directory structure is required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-language Adaptation&lt;/strong&gt;: Duplicate configuration is needed for Chinese and English paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Poor Development Experience&lt;/strong&gt;: Frequent 404 errors occur during local debugging and file operations.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;demonstration&#34;&gt;Demonstration&lt;/h2&gt;
&lt;p&gt;Direct rendering may result in errors due to incorrect paths, as shown below:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="problem">Problem</h2>
<p>When managing images for a Hugo blog in Obsidian, using an image hosting service can be unstable. Without one, inserting images becomes difficult and maintenance is cumbersome. Common issues include:</p>
<ol>
<li><strong>Path Confusion</strong>: Manual maintenance of the <code>/static/images</code> directory structure is required.</li>
<li><strong>Multi-language Adaptation</strong>: Duplicate configuration is needed for Chinese and English paths.</li>
<li><strong>Poor Development Experience</strong>: Frequent 404 errors occur during local debugging and file operations.</li>
</ol>
<h2 id="demonstration">Demonstration</h2>
<p>Direct rendering may result in errors due to incorrect paths, as shown below:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">GET http://192.168.3.29:1313/en/static/images/diary/two-ways.png <span class="m">404</span> <span class="o">(</span>Not Found<span class="o">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>After applying the script, the image path is corrected and re-requested:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Replaced: http://192.168.3.29:1313/en/static/images/diary/two-ways.png -&gt; http://192.168.3.29:1313/images/diary/two-ways.png
</span></span></code></pre></td></tr></table>
</div>
</div><p>The image is then rendered correctly.</p>
<img loading="lazy" src="../../../../static/images/note/%E6%88%AA%E5%9B%BE%E7%A4%BA%E4%BE%8B.png"><h2 id="solution">Solution</h2>
<p>This section provides a conceptual reference. Anyone can easily implement it. If you need the source code, feel free to request it in the comments.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// instead_images.js
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">IMAGE_REWRITER_CONFIG</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">pathPatterns</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">test</span><span class="o">:</span> <span class="sr">/(\/zh|\/en)\/static\/images\/(.*)/</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">replace</span><span class="o">:</span> <span class="s1">&#39;/images/$2&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nx">debug</span><span class="o">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">rewriteImageSource</span><span class="p">(</span><span class="nx">src</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Implement smart path conversion
</span></span></span><span class="line"><span class="cl">  <span class="c1">// [Core logic code...]
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Hijack the native image creation method
</span></span></span><span class="line"><span class="cl"><span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">tagName</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// [Image object hijacking code...]
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Dynamic content handling
</span></span></span><span class="line"><span class="cl"><span class="k">new</span> <span class="nx">MutationObserver</span><span class="p">(()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// [Auto-processing for new images code...]
</span></span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="configuration">Configuration</h2>
<h3 id="configure-hugo">Configure Hugo</h3>
<p>In <code>config.yaml</code>, set:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="nt">params</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">InsteadPicture</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>Then, simply include the following in the head section:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">.</span><span class="nx">Site</span><span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">InsteadPicture</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nx">script</span><span class="w"> </span><span class="nx">src</span><span class="p">=</span><span class="s">&#34;{{ &#34;</span><span class="o">/</span><span class="nx">js</span><span class="o">/</span><span class="nx">instead_images</span><span class="p">.</span><span class="nx">js</span><span class="s">&#34; | relURL }}&#34;</span><span class="p">&gt;&lt;</span><span class="o">/</span><span class="nx">script</span><span class="p">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span><span class="w"> </span><span class="nx">end</span><span class="w"> </span><span class="o">-</span><span class="p">}}</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>After configuring Obsidian, the solution will take effect.</p>
<h3 id="configure-obsidian">Configure Obsidian</h3>
<ol>
<li>Set file references to use <strong>relative path</strong> mode.</li>
<li>Configure the image storage directory as needed. For example, mine is <code>static\images\</code>.</li>
<li>No need to worry about file changes—Obsidian automatically updates links when files are moved.</li>
</ol>
<h2 id="advantages">Advantages</h2>
<ol>
<li><strong>No Dependency on Image Hosting</strong>: All images are managed locally without any file operations.</li>
<li><strong>Developer-Friendly</strong>: Real-time reloading doesn’t disrupt the writing flow.</li>
<li><strong>SEO Optimization</strong>: Ensures consistency in static resource paths.</li>
<li><strong>Multi-platform Compatibility</strong>: Works seamlessly with static site generators like Hugo/Hexo.</li>
<li><strong>Easy Organization</strong>: Moving file paths can rely on Obsidian to automatically update links.</li>
</ol>
]]></content:encoded>
    </item>
  </channel>
</rss>
