Search code examples
htmlpelican

What is the correct way to express a path in order to get Pelican generated html to link to an image?


I'm just starting to create a blog with Pelican and wanted to link to an image. I did this by including the following line in my Markdown file:

<img src="./myImg1a.png" alt="./myImg.png" style="width: 750px; height: 800px;"/>

This line was successfully reproduced in the html file, which Pelican placed in the output directory (i.e. /myBlog/output). I placed the png files in the output directory (i.e. the same directory as the html files and got the following error:

WARNING:root:Unable to find file /category/myImg1a.png/index.html or variations. 

where /category refers to myBlog/output/category. When I, instead, used the following html code:

<img src="/myImg1a.png" alt="/myImg.png" style="width: 750px; height: 800px;"/>

everything worked fine. I don't understand why this should be:

  1. If the image file is in the same directory as the html file, shouldn't "./myImg1.png" be correct and "/myImg.png" be incorrect?

  2. Why was the folder /category/myImg1a.png/index.html being sought at all?


Solution

  • First of all, by design, you should not change the contents of the output directly/manually.
    You should put all your static contents in separate directory which is usually named as images or paths. And, then configure the path(s) in pelicanconf.py as:

    # ...
    PATH = 'content'
    STATIC_PATHS = ['images', 'files']  # add any no. of locations
    # ...
    

    In that case, when Pelican is building actual page, it will look for any referenced static file in ./content/images and ./content/files locations. If cannot find there, it will emit the error message.

    Now, answering to your trouble ...

    By,

    ... src="./myImg1a.png" ...
    

    Pelican look for this myImg1a.png file in your myBlog/content/ folder as you are mentioning ./ which is the root folder for Pelican is working on.

    But, when you are referring it as

    ... src="/myImg1a.png" ...
    

    Pelican eventually finds it in the html file's directory. By getting / as location, Pelican is looking for it in the same directory of your myblog/my-blog-post/index.html which is myblog/my-blog-post/.
    Hence, working. But not in the ideal way.

    For a deeper understanding, please take a look into Pelican's documentation on this matter.

    1. Why was the folder /category/myImg1a.png/index.html being sought at all?

    Pelican, here, just trying to be smart.