Here are some frequently asked questions about Pelican.
Please read our feedback guidelines <contribute>
.
There are several ways to help out. First, you can report any Pelican suggestions or problems you might have via IRC (preferred) or the issue tracker. If submitting an issue report, please first check the existing issue list (both open and closed) in order to avoid submitting a duplicate issue.
If you want to contribute, please fork the git repository, create a new feature branch, make your changes, and issue a pull request. Someone will review your changes as soon as possible. Please refer to the How to Contribute <contribute>
section for more details.
You can also contribute by creating themes and improving the documentation.
Configuration files are optional and are just an easy way to configure Pelican. For basic operations, it's possible to specify options while invoking Pelican via the command line. See pelican --help
for more information.
When experimenting with different settings (especially the metadata ones) caching may interfere and the changes may not be visible. In such cases, ensure that caching is disabled via LOAD_CONTENT_CACHE = False
or use the --ignore-cache
command-line switch.
Pygments adds some classes to the generated content. These classes are used by themes to style code syntax highlighting via CSS. Specifically, you can customize the appearance of your syntax highlighting via the .highlight pre
class in your theme's CSS file. To see how various styles can be used to render Django code, for example, use the style selector drop-down at top-right on the Pygments project demo site.
You can use the following example commands to generate a starting CSS file from a Pygments built-in style (in this case, "monokai") and then copy the generated CSS file to your new theme:
pygmentize -S monokai -f html -a .highlight > pygment.css
cp pygment.css path/to/theme/static/css/
Don't forget to import your pygment.css
file from your main CSS file.
Please refer to theming-pelican
.
If you try to generate Markdown content without first installing the Markdown library, may see a message that says No valid files found in content
. Markdown is not a hard dependency for Pelican, so if you have content in Markdown format, you will need to explicitly install the Markdown library. You can do so by typing the following command, prepending sudo
if permissions require it:
python -m pip install markdown
Yes. For example, to include a modified date in a Markdown post, one could include the following at the top of the article:
Modified: 2012-08-08
For reStructuredText, this metadata should of course be prefixed with a colon:
:Modified: 2012-08-08
This metadata can then be accessed in templates such as article.html
via:
{% if article.modified %}
Last modified: {{ article.modified }}
{% endif %}
If you want to include metadata in templates outside the article context (e.g., base.html
), the if
statement should instead be:
{% if article and article.modified %}
It's as simple as adding an extra line of metadata to any page or article that you want to have its own template. For example, this is how it would be handled for content in reST format:
:template: template_name
For content in Markdown format:
Template: template_name
Then just make sure your theme contains the relevant template file (e.g. template_name.html
).
Include url
and save_as
metadata in any pages or articles that you want to override the generated URL. Here is an example page in reST format:
Override url/save_as page
#########################
:url: override/url/
:save_as: override/url/index.html
With this metadata, the page will be written to override/url/index.html
and Pelican will use url override/url/
to link to this page.
The override feature mentioned above can be used to specify a static page as your home page. The following Markdown example could be stored in content/pages/home.md
:
Title: Welcome to My Site
URL:
save_as: index.html
Thank you for visiting. Welcome!
If the original blog index is still wanted, it can then be saved in a different location by setting INDEX_SAVE_AS = 'blog_index.html'
for the 'index'
direct template.
To disable feed generation, all feed settings should be set to None
. All but three feed settings already default to None
, so if you want to disable all feed generation, you only need to specify the following settings:
FEED_ALL_ATOM = None
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None
The word None
should not be surrounded by quotes. Please note that None
and ''
are not the same thing.
RSS and Atom feeds require all URL links to be absolute. In order to properly generate links in Pelican you will need to set SITEURL
to the full path of your site.
Feeds are still generated when this warning is displayed, but links within may be malformed and thus the feed may not validate.
Instead of having to open a separate browser window to read articles, the overwhelming majority of folks who use feed readers prefer to read content within the feed reader itself. Mainly for that reason, Pelican does not support restricting Atom feeds to only contain summaries. Unlike Atom feeds, the RSS feed specification does not include a separate content
field, so by default Pelican publishes RSS feeds that only contain summaries (but can optionally be set to instead publish full content RSS feeds). So the default feed generation behavior provides users with a choice: subscribe to Atom feeds for full content or to RSS feeds for just the summaries.
No. Pelican can be easily configured to create and maintain any type of static site. This may require a little customization of your theme and Pelican configuration. For example, if you are building a launch site for your product and do not need tags on your site, you could remove the relevant HTML code from your theme. You can also disable generation of tag-related pages via:
TAGS_SAVE_AS = ''
TAG_SAVE_AS = ''
In order to reliably determine whether the HTML output is different before writing it, a large part of the generation environment including the template contexts, imported plugins, etc. would have to be saved and compared, at least in the form of a hash (which would require special handling of unhashable types), because of all the possible combinations of plugins, pagination, etc. which may change in many different ways. This would require a lot more processing time and memory and storage space. Simply writing the files each time is a lot faster and a lot more reliable.
However, this means that the modification time of the files changes every time, so a rsync
based upload will transfer them even if their content hasn't changed. A simple solution is to make rsync
use the --checksum
option, which will make it compare the file checksums in a much faster way than Pelican would.
When only several specific output files are of interest (e.g. when working on some specific page or the theme templates), the WRITE_SELECTED
option may help, see writing_only_selected_content
.
It is often useful to process only e.g. 10 articles for debugging purposes. This can be achieved by explicitly specifying only the filenames of those articles in ARTICLE_PATHS
. A list of such filenames could be found using a command similar to cd content; find -name '*.md' | head -n 10
.
In an ongoing effort to streamline Pelican, tag cloud generation has been moved out of Pelican core and into a separate plugin. See the plugins
documentation for further information about the Pelican plugin system.
Pages were available to themes as lowercase pages
and uppercase PAGES
. To bring this inline with the templates-variables
section, PAGES
has been removed. This is quickly resolved by updating your theme to iterate over pages
instead of PAGES
. Just replace:
{% for pg in PAGES %}
with something like:
{% for pg in pages %}
Pelican's article and page generators run before it's static generator. That means if you use a setup similar to the default configuration, where a static source directory is defined inside a *_PATHS
setting, all files that have a valid content file ending (.html
, .rst
, .md
, ...) will be treated as articles or pages before they get treated as static files.
To circumvent this issue either use the appropriate *_EXCLUDES
setting or disable the offending reader via READERS
if you don't need it.
Pelican does not directly handle Markdown processing and instead delegates that task to the Python-Markdown project, the core of which purposefully follows the original Markdown syntax rules and not the myriad Markdown "flavors" that have subsequently propagated. That said, Python-Markdown is quite modular, and the syntax you are looking for may be provided by one of the many available Markdown Extensions. Alternatively, some folks have created Pelican plugins that support Markdown variants, so that may be your best choice if there is a particular variant you want to use when writing your content.