A static website and blog generator

Overview

Nikola, a Static Site and Blog Generator

In goes content, out comes a website, ready to deploy.

Why Static Websites?

Static websites are safer, use fewer resources, and avoid vendor and platform lock-in. You can read more about this in the Nikola Handbook

What Can Nikola Do?

It has many features, but here are some of the nicer ones:

Nikola Architecture

https://getnikola.com/images/architecture.png

Installation Instructions

Assuming you have pip installed:

pip install Nikola

For optional features:

pip install "Nikola[extras]"

For tests:

pip install "Nikola[extras,tests]"

For more information, see https://getnikola.com/

Issues
  • ```EarlyTask``` plugins

    ```EarlyTask``` plugins

    Hi,

    I'd like to have a plugin category EarlyTask, for tasks which are executed before the site is rendered (i.e. an analogue to LateTask). I personally need that for a plugin (or better, combination of plugins) I wrote, currently I used the Task plugin class but it happens that some tasks are run after page compiling, while my page compiling plugin needs their result -- and so it fails.

    Does anyone mind if I add something like that? Or would it be better to have a general priority system, so you can assign a task a priority (usual tasks could get 10, and late tasks 100, so you could add a task with priority 2 and one with priority 7 to ensure that the one with priority 2 appears in the task list before the one with priority 7 and before all regular rendering tasks and late tasks)?

    (I have the vague feeling that I already read something about EarlyTasks somewhere here, but I cannot remember where. So it's probably not my own idea :) )

    Cheers, Felix

    enhancement question idea 
    opened by felixfontein 71
  • URLs for sites not in the webserver root are broken [was: The image url is not correct.]

    URLs for sites not in the webserver root are broken [was: The image url is not correct.]

    My site is in a subfolder, such as http://www.abc.com/blog/. The url of image in the gallery is not correct. If I put a jpg file in galleries/software/screen.jpg, after building, the url will be http://www.abc.com/galleries/software/screen.jpg. In face it should be http://www.abc.com/blog/galleries/software/screen.jpg.

    The images in the posts are good.

    Nikola version 6.2.1

    bug 
    opened by ghost 47
  • Support for EarlyTasks.

    Support for EarlyTasks.

    The earlytask_impl branch implements support for EarlyTasks in Nikola, which are tasks that are executed before Nikola scans for posts. See #1562 for more details. After some testing (sorry it took so long) I think it works rather well now, so it's time to start a PR :-)

    What this branch improves over current Nikola:

    • there's a better separation between Tasks and LateTasks: LateTasks won't be processed before Tasks aren't done; this makes in particular a difference when multithreading/multiprocessing is used;
    • scanning for posts is now collected to happen at precisely one place: in stage 0, which is before the stage where all Task objects are processed, and after all EarlyTask objects are processed;

    What this branch requires:

    • an up-to-date version of doit

    What this branch cannot deliver at the moment:

    • nikola build <filename> does not work without further support in doit (see https://github.com/pydoit/doit/issues/20, haven't had time to really work on it yet);
    • nikola build <taskname> only works for tasks named after the plugin itself, and not for (potential) otherwise named tasks created by the plugins;
    • when running nikola in parallel (via -n 4 for example), one has to tell doit (via -P thread) to use threads instead of processes.

    (fixes #1553 and #1562)

    Review on Reviewable

    enhancement breaks backwards compatibility 
    opened by felixfontein 36
  • fix #1118

    fix #1118

    Adds TZ name to the post's date from new_post, parses it back on reading posts. Existing posts without TZ info will default to conf.py's as before.

    enhancement 
    opened by ralsina 35
  • Python 3 is BATSHIT INSANE

    Python 3 is BATSHIT INSANE

    Random rebuilds on my blog:

    • [x] tag indexes rebuild all the time
    • [x] galleries rebuild at random (self.kw changes sometimes)
    • blog posts/pages, mainly related to those galleries, rebuild when galleries get rebuilt (sounds sane)

    I have no idea where to start debugging this shit. I’m running Nikola from github master.

    Database diffs hint at sorting issues: https://gist.github.com/754d0a351618099f7d4c and https://gist.github.com/7611c1fe09ddf9d6680a Note that dict order is RANDOM in Python 3.

    cc @felixfontein (you messed with all this recently, didn’t you?)

    bug 
    opened by Kwpolska 32
  • First shot on #993 for taxonomies, in particular archives.

    First shot on #993 for taxonomies, in particular archives.

    • [x] I’ve read the guidelines for contributing.
    • [x] I updated AUTHORS.txt and CHANGES.txt (if the change is non-trivial) and documentation (if applicable).
    • [x] I tested my changes.

    This PR adds functionality to the taxonomy system to be able to reference translated classifications in taxonomies, with an example how to use this for archives. See #993.

    The generated archives currently look ugly due to no CSS :)

    enhancement BLOCKER i18n 
    opened by felixfontein 32
  • Make github pages deploy seamless

    Make github pages deploy seamless

    I am not knowledgeable enough of git to handle this, all recipes I've seen look like a complicated mess (but it's all on me! really!).

    So, let's fix it the right way: why not have a nikola github-deploy command that does The Right Thing (tm) using just a github username or whatever in conf.py?

    Looking forward to it :-)

    enhancement 
    opened by ralsina 32
  • Provide conda packages

    Provide conda packages

    I'm looking for conda packages, but can find only pretty old ones here: https://anaconda.org/search?q=nikola. Any plans to provide more recent ones regularly?

    PR exists feature request 
    opened by deeplook 31
  • Incremental build seems not to be working

    Incremental build seems not to be working

    Environment

    Python Version: Python 3.5.2

    Nikola Version: Nikola v8.0.1

    Operating System: Ubuntu 16.04

    Description:

    If I run nikola build twice in a row, according to this page I would expect it to do nothing; and yet:

    $ nikola build 2>&1 | wc -l
    1910
    

    It is less than a full rebuild:

    $ nikola build -a 2>&1 | wc -l
    4077
    

    If I compare the actual output, it seems that the incremental rebuild doesn't do the render_posts:cache/posts/... tasks and the render_taxonomies:output/... for the atom and xml feeds.

    Do I have some configuration or template in my site that makes Nikola misbehave? Are there some ways to debug this?

    For the record, the source of my site is here.

    bug 
    opened by mardy 31
  • UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ord inal not in range(256)

    UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ord inal not in range(256)

    i use win7 with python 2.7.9 when i installed nikola and use "nikola help" command, cmd.exe tells:

    Traceback (most recent call last): File "D:\Python27\lib\runpy.py", line 162, in run_module_as_main "main", fname, loader, pkg_name) File "D:\Python27\lib\runpy.py", line 72, in run_code exec code in run_globals File "D:\Python27\Scripts\nikola.exe__main.py", line 9, in File "D:\Python27\lib\site-packages\nikola__main__.py", line 158, in main site = Nikola(**config) File "D:\Python27\lib\site-packages\nikola\nikola.py", line 658, in init self.tzinfo = dateutil.tz.gettz(self.config['TIMEZONE']) File "D:\Python27\lib\site-packages\dateutil\tz.py", line 964, in gettz tz = tzwin(name) File "D:\Python27\lib\site-packages\dateutil\tzwin.py", line 92, in init self._stdname = keydict["Std"].encode("iso-8859-1") UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ord inal not in range(256)

    someone else's bug 
    opened by xh84 29
  • Static comments

    Static comments

    Hi,

    I saw that there once was a discussion on static comments (#719). At that time, the idea was more or less dropped, as far as I understand. I'd like to revive it to some extend :) Namely, I want to convert some of my WordPress blogs including all comments. I don't want to use any JavaScript or any 3rd party system which requires access to another server, and I also don't want to just drop the comments. I'm not sure what to do about commenting in the future, but for now (also due to a very low volume of comments), I'd be perfectly happy with static comments. The problem is that it looks like I need a bit of support by Nikola to do this. In particular, I need that for every created post object, one function is called. From what I understand, there's no way to do that with the current plugin types, so I need a new one for precisely this.

    Adding that is quite simple (also adding support for static comments in galleries, this requires essentially one call per gallery). The question is how far should this go, i.e. whether there should be more support for static comments or not. The bare minimum is a plugin category which is called once per Post object (for both posts and stories) and once per gallery (with the chance to return something which is added to the gallery's context). With that foundation, doing everything else in a plugin (or multiple plugins) and themes is definitely possible. A more deluxe solution would be to add basic support to Nikola, in form of a Comment class collecting some information on comments. Then it would be much easier to support generic static comments in a theme without knowing which static comments plugin the user might use (maybe also none at all). Of course, one question is: how many such plugins will there be after all? Probably not many. Maybe only one. So I'm really not sure if it's worth that trouble to add such things. Maybe it's better to only implement the minimal foundation and leave everything else to plugins?

    What do you think? Do you want such a feature at all? And if you want it, do you want more a minimalist, or more a deluxe version?

    Thanks and all the best, Felix

    opened by felixfontein 29
  • Experiments for generalization of taxonomies.

    Experiments for generalization of taxonomies.

    This is about #2107. I added a new plugin category, Taxonomy, as well as two plugins which take care to classify posts with all Taxonomy plugins and render all associated pages for them.

    The next step is re-implementing the following plugins with this framework and see if it works:

    • archive
    • authors
    • indexes (needs to be split up into two plugins, one for the main index and one for section indexes)

    It's not possible to recreate the tags plugin with this framework as it contains the option (which is even default!) to put tags and categories onto the same overview page. But that problem will be solved in v8 anyway when categories go away :)

    in progress 
    opened by felixfontein 29
  • New themable base theme

    New themable base theme

    I have only touched the base theme. Let us decide on what to do with it before tackling bootstrap3 and friends. Galleries are untouched.

    Themes can be created by only only shipping stylesheets. Everything is semantically structured and there are class names (by page kind or general) on every major section. For example, comments sections can be styled in a more generalized way regardless of the comment system being used.

    The site banner is separated out into base_header.tmpl and the footer to base_footer.tmpl. Allowing themes to be strip out headers, navigational menus, and footer without having to make changes to main content data or structure of base. (A sidebar can be injected at the top of base_footer.tmpl, for example.)

    fixes #1123

    enhancement 
    opened by da2x 28
  • Complete URL translation

    Complete URL translation

    Test implementation of my idea in #2116, to allow to override the relative path to the post (relatively to the source folder specified in POSTS/PAGES) using post metadata.

    fixes #2116

    opened by felixfontein 26
  • LESS processing issue, have to run nikola twice

    LESS processing issue, have to run nikola twice

    I am finding that I have to run "nikola build" twice when using LESS processing and bundles. My hypothesis is that on the first execution the bundle is created without the output of the execution of lessc on the LESS source. On the second run the bundling picks up the previously created CSS from the LESS source. You have to do a "nikola clean" to really see this happening.

    bug 
    opened by russel 26
  • Nikola makes HTML5 video source tags invalid

    Nikola makes HTML5 video source tags invalid

    If you use a <video> element with a <source> tag in a post, theme, ..., Nikola generates a </source> for every <source ...>, which is not valid HTML5.

    This happens in the last few lines of Nikola.render_template() in nikola/nikola.py:

    parser = lxml.html.HTMLParser(remove_blank_text=True)
    doc = lxml.html.document_fromstring(data, parser)
    doc.rewrite_links(lambda dst: self.url_replacer(src, dst, context['lang']))
    data = b'<!DOCTYPE html>\n' + lxml.html.tostring(doc, encoding='utf8', method='html', pretty_print=True)
    

    This is a problem of lxml.html (or maybe of something they use), so nothing we can easily fix.

    I'll try to investigate more when I'm more motivated and have some more time... (For my blog, I can "fix" this by replacing "" with "" in all .html files... That's no good solution in general, though...)

    someone else's bug 
    opened by felixfontein 25
  • Add ATOM_PATH setting

    Add ATOM_PATH setting

    Pull Request Checklist

    • [x] I’ve read the guidelines for contributing.
    • [x] I updated AUTHORS.txt and CHANGES.txt (if the change is non-trivial) and documentation (if applicable).
    • [x] I tested my changes.

    Description

    Add ATOM_PATH setting, similar to RSS_PATH.

    Reference #2971

    opened by davidak 25
  • base theme has too much stuff

    base theme has too much stuff

    Environment (if reporting a bug)

    Nikola Version: 7.8.4

    Description:

    The base theme uses a number of bootstrap specific css classes and html tag conventions that are not necessarily suitable / desirable for use in building out new themes. In my usage, building out a skeleton based theme, I found that I had to fork the base theme and strip a bunch of stuff out, before I could properly derive my own theme.

    I'd be happy to unify my efforts with mainline base and push out a PR that further strips things down. Would other people be interested in seeing this?

    opened by gwax 24
  • WIP: render author pages

    WIP: render author pages

    Based on tags.py

    Requires this configs:

    AUTHOR_PATH = 'author'
    AUTHOR_PAGES_ARE_INDEXES = True
    

    and this messages:

    "Authors": "Autores",
    "Posts by %s": "Posts de %s"
    
    enhancement PR exists 
    opened by jjconti 23
  • [discussion] Plugins

    [discussion] Plugins

    I'd like to start a discussion on two plugin-related points:

    1. In #2820, @Kwpolska wrote "built-in stuff should not be real yapsy plugins for performance reasons (that would require reading way too many files)".

    2. Some of my internal plugins have strong dependencies (one must be there for the other to make sense and actually work), and they also share code, which is pretty hard to implement if I don't want to fix where they are loaded from; I need to use the inspect module to find their location on disk and use importlib.machinery (Python 3) resp. imp (Python 2) to load the other file, and of course I have to assume that all plugin files are in the same directory.

    I thought a bit about how to improve on this situation; here are two ideas:

    a) Allow to inject plugins without yapsy. This could be done by Nikola core to add a bunch of plugins without the need to put them into own files (or even to define them in different files).

    b) Allow bundled plugins (a new plugin type like CombinedPlugins), which are one yapsy plugin and which provide several Nikola plugins from one source file (or one package).

    Both ideas would share some code in nikola.py, and only differ in how they are seen from the point of the DISABLED_PLUGINS config and the plugin command plugin. (Idea a) plugins should be treated as different ones, idea b) plugins as one big plugin.)

    This would allow to keep a loose coupling of plugins, like for #2820, without the need to have too many plugin files. What do you think?

    opened by felixfontein 23
  • Change drafts to be its own metadata instead of special tag

    Change drafts to be its own metadata instead of special tag

    For a future version, I'd like to see Nikola change the way it handles drafts.

    Today, drafts are handled in a way that isn't as straight-forward to the user by having a special tag.

    Instead, I'd like to see drafts defined by a separate piece of metadata:

    .. title: My Super Title Here About Python
    .. slug: my-super-title-here-about-python
    .. date: 2017-05-13 00:00:00 UTC
    .. tags: python, pip, venv
    .. section: Developers
    .. description: My Python Post
    .. status: published
    

    Why?

    By having an explicit status of draft or published, and with a default set in conf.py, the user can clearly see that a post is published or not. As an example, conf.py may have a default post setting:

    DEFAULT_POST_STATUS='draft'
    

    "But tags already do that." Sort of. I see this as a combination of User Experience and a technical abstraction of post creation to be extensible. By keeping special meaning out of tags, users:

    • won't accidentally remove a draft tag while editing their post (UX)
    • the user has to explicitly say a post is ready to be published (or explicitly say it is draft) making it clear what's happening to the content (UX)
    • this can later on allow extensible post compiling to do things like have separate configs for publishing for only posts that are marked as having a status of published by having a config for dev and a config for prod.
    enhancement BLOCKER 
    opened by h4ckninja 23
  • Nicer URLs?

    Nicer URLs?

    I would love to have nicer URLs — for example /2013/02/10/slug/ for blog posts and /story-title/ for stories. Currently I do it with nginx rewrites (which also forces a patch on nikola.Nikola().render_template.replacer() to completely disarm it) and template magic, but the RSS URLs are still bad. Could you please (a) make it possible to use this on my RSS URLs; or (b) do it the Jekyll way and create directories on the server according to an URL format provided by the user to allow for nicer URLs?

    enhancement 
    opened by Kwpolska 23
  • Error loading tasks (exception). AttributeError: 'NoneType' object has no attribute 'split'.

    Error loading tasks (exception). AttributeError: 'NoneType' object has no attribute 'split'.

    Python Version: 3.6.8

    Nikola Version: 8.0.2

    Operating System: 64-bit GNU/Linux 4.15.0-20-generic; distro: Mint 19.1 (a fork of Ubuntu)

    Description:

    Tried to build an empty site (no posts/pages), just some Jinja2 templates.

    $ nikola build
    Scanning posts........done!
    [2019-08-04T13:06:35Z] ERROR: Nikola: Error loading tasks. An unhandled exception occurred.
    [2019-08-04T13:06:35Z] ERROR: Nikola: AttributeError: 'NoneType' object has no attribute 'split'
    [2019-08-04T13:06:35Z] NOTICE: Nikola: To see more details, run Nikola in debug mode (set environment variable NIKOLA_DEBUG=1) or use NIKOLA_SHOW_TRACEBACKS=1
    

    With debug on:

    First, I get a huge spam of errors (hundreds/thousands of entries) looking like this. Seems like yapsy has something wrong with venv directory but ... the venv directory is 1 level higher than the directory where the website is and Nikola is run.

    [2019-08-04T13:11:17Z] DEBUG: yapsy: correct subclass tests failed for: sc in /home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/plugins/compile/html
    Traceback (most recent call last):
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/yapsy/PluginManager.py", line 535, in loadPlugins
        is_correct_subclass = issubclass(element, self.categories_interfaces[category_name])
    TypeError: issubclass() arg 1 must be a class
    [2019-08-04T13:11:17Z] DEBUG: yapsy: correct subclass tests failed for: write_metadata in /home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/plugins/compile/html
    Traceback (most recent call last):
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/yapsy/PluginManager.py", line 535, in loadPlugins
        is_correct_subclass = issubclass(element, self.categories_interfaces[category_name])
    TypeError: issubclass() arg 1 must be a class
    

    Then this at the end:

    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "yapsy_loaded_plugin_mdx_nikola_0.NikolaExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "yapsy_loaded_plugin_mdx_podcast_0.PodcastExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "yapsy_loaded_plugin_mdx_gist_0.GistExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.fenced_code".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.fenced_code.FencedCodeExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.codehilite".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.codehilite.CodeHiliteExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.extra".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.smart_strong".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.smart_strong.SmartEmphasisExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.fenced_code".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.fenced_code.FencedCodeExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.footnotes".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.footnotes.FootnoteExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.attr_list".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.attr_list.AttrListExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.def_list".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.def_list.DefListExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.tables".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.tables.TableExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfuly imported extension module "markdown.extensions.abbr".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.abbr.AbbrExtension".
    [2019-08-04T13:11:17Z] DEBUG: MARKDOWN: Successfully loaded extension "markdown.extensions.extra.ExtraExtension".
    Scanning posts........done!
    [2019-08-04T13:11:17Z] ERROR: Nikola: Error loading tasks. An unhandled exception occurred.
    Traceback (most recent call last):
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/doit/doit_cmd.py", line 177, in run
        return command.parse_execute(args)
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/doit/cmd_base.py", line 127, in parse_execute
        return self.execute(params, args)
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/doit/cmd_base.py", line 389, in execute
        self, params, args)
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/__main__.py", line 277, in load_tasks
        self.nikola.gen_tasks('render_site', "Task", 'Group of tasks to render the site.'))
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/doit/loader.py", line 313, in generate_tasks
        for task_dict, x_doc in flat_generator(gen_result, gen_doc):
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/doit/loader.py", line 26, in flat_generator
        for item in gen:
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/nikola.py", line 1956, in gen_tasks
        for task in flatten(pluginInfo.plugin_object.gen_tasks()):
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/nikola.py", line 1950, in flatten
        for t in task:
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/plugins/task/pages.py", line 66, in gen_tasks
        for task in self.site.generic_page_renderer(lang, post, kw["filters"], context):
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/nikola.py", line 2262, in generic_page_renderer
        url_type=post.url_type)
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/nikola.py", line 2166, in generic_renderer
        file_deps += self.template_system.template_deps(template_name)
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/plugins/template/jinja.py", line 129, in template_deps
        self.dependency_cache[template_name] = [filename] + self.get_deps(filename)
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/plugins/template/jinja.py", line 123, in get_deps
        return self.get_string_deps(text)
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/nikola/plugins/template/jinja.py", line 113, in get_string_deps
        filename = self.lookup.loader.get_source(self.lookup, dep_name)[1]
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/jinja2/loaders.py", line 168, in get_source
        pieces = split_template_path(template)
      File "/home/xeverous/workspace/the_website/venv/lib/python3.6/site-packages/jinja2/loaders.py", line 27, in split_template_path
        for piece in template.split('/'):
    AttributeError: 'NoneType' object has no attribute 'split'
    
    bug 
    opened by Xeverous 23
  • Extending categories?

    Extending categories?

    Hi, two things I'm missing in Nikola are the possibility to have more than one category per post, and to have a hierarchy of categories (where posts in child categories automatically belong to parent categories when browsing through the list of posts per category). (Thruth is, I've been heavily relying on these two features in WordPress and don't like the idea of just mixing the small amount of structured categories into the huge tag mess.) Parts of this can be done without modifying Nikola -- that is, adding categories (just add categories: A, B, C to .meta files) and displaying them (use [ x.strip() for x in post.meta('categories').split(',') ] for the list of categories per post; won't have a nice automatic order, though). Other parts can be done by duplicating a lot of code from Nikola into plugins -- such as showing posts per category. But I don't like unecessary code duplication, so here's my question: what about adding that natively to Nikola? With some automatic defaults -- like automatically setting category resp. categories when only the other is set (if it makes sense) -- it should be mostly backwards compatible (in particular if you don't use more than one category per post in your blog). What do you all think? All the best, Felix

    enhancement 
    opened by felixfontein 23
  • import themes for bootstrap3 - work in process

    import themes for bootstrap3 - work in process

    This is a work in process to support bootstrap3

    There is few things that will need to be fixed, for instance rewriting a Slide plugins for carousel, so I hope we can hope discussion on this and also get some help to make this happen!

    Comments, blames, stones are welcome :)

    enhancement 
    opened by areski 22
  • Can nikola handle a large site with more than 150,000 post files?

    Can nikola handle a large site with more than 150,000 post files?

    Hi,

    I have tried a few static site generators (SSGs). One common problem I often encountered was the SSG loads all the posts into memory to work with. Some like Hugo also uses up all the CPU and makes my PC unusable during its building process.

    Before converting my hundred thousand posts to nikola format, I would like to know how nikola would handle a large number of post files.

    opened by hieu-n 22
  • Obtaining and using site information before compilation

    Obtaining and using site information before compilation

    I want to create few things:

    1. An index page, which contains a tree view of all other pages. Something similar to sitemap.xml, but readable for users like any normal page.
    2. Breadcrums on each page, allowing to easily see where you are and click some part of it to go upwards.
    3. Next/previous buttons on each page to go forward/backward when reading tutorial pages.

    The problem is that AFAIK site structure information (all posts/pages and their titles, etc) is gathered after all pages are scanned. I need this information inside templates. Is such thing available there?

    Other issue is that in order to generate index page, all pages must be scanned. Creating index page adds another page, which appears after all pages have been scaned. So it will likely not be compiled. Is there any way here to avoid circular dependency?

    question 
    opened by Xeverous 22
  • gallery directive fails after ``nikola clean``

    gallery directive fails after ``nikola clean``

    # nikola clean
    # nikola build
    […]
    ########################################
    TaskError - taskid:render_posts:cache/posts/MY_POST.html
    PythonAction Error
    Traceback (most recent call last):
      File "/usr/lib/python3.3/site-packages/doit/action.py", line 343, in execute
        returned_value = self.py_callable(*self.args, **kwargs)
      File "/usr/lib/python3.3/site-packages/nikola/post.py", line 315, in compile
        self.is_two_file),
      File "/usr/lib/python3.3/site-packages/nikola/plugins/compile/rest/__init__.py", line 91, in compile_html
        }, logger=self.logger, l_source=source, l_add_ln=add_ln)
      File "/usr/lib/python3.3/site-packages/nikola/plugins/compile/rest/__init__.py", line 253, in rst2html
        pub.publish(enable_exit_status=enable_exit_status)
      File "/usr/lib/python3.3/site-packages/docutils/core.py", line 217, in publish
        self.settings)
      File "/usr/lib/python3.3/site-packages/docutils/readers/__init__.py", line 72, in read
        self.parse()
      File "/usr/lib/python3.3/site-packages/docutils/readers/__init__.py", line 78, in parse
        self.parser.parse(self.input, document)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/__init__.py", line 172, in parse
        self.statemachine.run(inputlines, document, inliner=self.inliner)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 174, in run
        input_source=document['source'])
      File "/usr/lib/python3.3/site-packages/docutils/statemachine.py", line 239, in run
        context, state, transitions)
      File "/usr/lib/python3.3/site-packages/docutils/statemachine.py", line 460, in check_line
        return method(match, context, next_state)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 2706, in underline
        self.section(title, source, style, lineno - 1, messages)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 331, in section
        self.new_subsection(title, lineno, messages)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 399, in new_subsection
        node=section_node, match_titles=True)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 286, in nested_parse
        node=node, match_titles=match_titles)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 199, in run
        results = StateMachineWS.run(self, input_lines, input_offset)
      File "/usr/lib/python3.3/site-packages/docutils/statemachine.py", line 239, in run
        context, state, transitions)
      File "/usr/lib/python3.3/site-packages/docutils/statemachine.py", line 460, in check_line
        return method(match, context, next_state)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 2279, in explicit_markup
        nodelist, blank_finish = self.explicit_construct(match)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 2291, in explicit_construct
        return method(self, expmatch)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 2034, in directive
        directive_class, match, type_name, option_presets)
      File "/usr/lib/python3.3/site-packages/docutils/parsers/rst/states.py", line 2083, in run_directive
        result = directive_instance.run()
      File "MY_BLOG/plugins/gallery_directive/gallery_directive.py", line 72, in run
        with open(gallery_index, 'r') as inf:
    FileNotFoundError: [Errno 2] Datei oder Verzeichnis nicht gefunden: 'output/galleries/MY_GALLERY/index.html'
    

    Rendering the galleries manually before the build fixes this:

    # nikola render_galleries
    # nikola build
    
    bug 
    opened by devurandom 22
  • Problems when using parallel processing with threads and multiple languages

    Problems when using parallel processing with threads and multiple languages

    There's a problem with Nikola if your site has more than one language and if you use nikola run -n4 -P thread (run four tasks in parallel using threads instead of forking, see here: http://pydoit.org/cmd_run.html#parallel-execution). Namely, when rendering a page/..., LocaleBorg is storing the current language in global storage which is then used by messages("...") and formatted_date() (among others). When two tasks run in parallel for two different languages, one will overwrite the LocaleBorg setup of the other, and with high probability one of the output files ends up with wrong strings or wrongly formatted dates. (When using forking, this should not be a problem, but that doesn't always work -- it might be problematic under Windows, and totally breaks for the earlytask_impl branch.)

    I don't know how easy/complicated fixing this would be. There are two aspects:

    1. If we store the current language not in a global state, but a thread-local state, at least messages("...") will always use the correct language.
    2. This might not help for formatted_date and get_month_name, since they have to set the correct locale and then call some Python system function -- Python might not store the locale thread-local, but global. (Or does it store it thread-local? If that is guaranteed for both Python 2 and 3, using thread-local storage would be enough.) But this could be solved by using a global lock which avoids that formatted_date and get_month_name run in parallel.

    What do yout think? While standard Nikola not run in parallel mode is totally not affected by this (and after all we don't advertise that you can run several tasks in parallel), I think that making Nikola more thread-safe is always a good idea.

    bug question 
    opened by felixfontein 22
  • bootstrap4 tags page should have its own article/div HTML tag

    bootstrap4 tags page should have its own article/div HTML tag

    Hi there guys! I'm really comfortable using Nikola in a side project.

    Requested Feature: Include an article or div HTML tag in the /bootstrap4/templates/tags.tmpl file.

    Related Area: templates.

    Do you want to contribute this yourself as a pull request?

    • [x] Yes, I don’t have code ready yet

    Does this feature affect backwards compatibility? If yes, in what way?

    It might break custom CSS already applied to the tags pages in the bootstrap4 template and children.

    Rationale and full description: By not having this HTML tag, it makes impossible applying custom CSS to the page content (i. e. the tags and categories lists) without affecting also the footer (such as centering the text). The base tags.tmpl already has this as <article class="tagindex">, so we could just mimic this approach.

    feature request 
    opened by fvicent 0
  • Nikola serve seems blocked

    Nikola serve seems blocked

    Environment

    **Python Version: 3.7.6

    **Nikola Version: 8.2.0

    **Operating System:MacOS Mojave, safari, firefox, Chrome

    Description:

    When I start Nikola with "nikola serve" or "nikola serve -b" the 127.0.0.1 page seems blocked. It takes a moment for the page to load but eventually she charges after 30s. The problem comes up often and especially when I regenerate new pages.

    Any help ?

    François-Régis Chalaoux

    bug 
    opened by frchalaoux 12
  • MARKDOWN_EXTENSION_CONFIGS is not marked as translatable in default conf.py

    MARKDOWN_EXTENSION_CONFIGS is not marked as translatable in default conf.py

    Environment

    Python Version: Python 3.8.0

    Nikola Version: Nikola v8.2.0

    Operating System: Windows 10 Build 19043

    Description:

    The MARKDOWN_EXTENSION_CONFIGS configuration variable is translatable, but is not noted as such in the default conf.py

    I plan to submit a pull request modifying conf.py.in to fix this small problem right after submitting this issue.

    I wasn't quite sure what issue category to choose, but decided on a bug report, please forgive me if this is the wrong category for this issue.

    bug 
    opened by yaram 1
  • Nikola should respect cell metadata tags in Jupyter Notebooks

    Nikola should respect cell metadata tags in Jupyter Notebooks

    Requested Feature: (short description)

    Users need to be able to hide code input, hide code output and sometimes hide a whole code cell in a Jupyter Notebook. The canonical way to do this since Jupyter 5.0 (~2017) is to add the appropriate tag "hide-cell", "hide-input" or "hide-output" to the metadata for that cell. See here: https://blog.jupyter.org/jupyter-notebook-5-0-909c6c172d78

    However, it seems that Nikola doesn't respect these tags--at least it continues to build and display my cells despite them having the right tag.

    The only discussion I've managed to find on the google group for this topic is old and was from a previous version of Jupyter. See: https://groups.google.com/g/nikola-discuss/c/Z3lUriHoIrc/m/i5LOAgwLBAAJ

    Related Area: (eg. tasks, compilers, configuration, templates…)

    Honestly not sure, I'm a newb here.

    Do you want to contribute this yourself as a pull request? (don’t worry about it if you don’t want to/can’t — someone else can take care of it)

    • [ ] Yes, I have already written code for it (link if available and feasible)
    • [ ] Yes, I don’t have code ready yet (that’s okay!)
    • [x ] No (that’s okay too!)

    Sorry, I don't have the skill necessary.

    Does this feature affect backwards compatibility? If yes, in what way?

    Rationale and full description: (why should it be added to Nikola?)

    It's an important feature of making attractive Jupyter Notebooks and Nikola's support of Jupyter was a big part of why I chose Nikola for my blog --- I'm sure I'm not alone in that.

    feature request 
    opened by shanewilkins 1
  • Add bootstrap5 and bootblog5 themes (#3552)

    Add bootstrap5 and bootblog5 themes (#3552)

    Fixes #3552. Work in progress.

    opened by Kwpolska 0
  • Post-Upgrade bugs

    Post-Upgrade bugs

    Environment

    Python Version: 3.9.6

    Nikola Version: 8.1.3

    Operating System: macOS 10.14.6

    Description:

    After breaking ghp-import and unsuccessfully trying to reinstall it, I reinstalled an updated version of nikola 8.1.3 this time in a virtual environment.

    Since then I have two (possibly related) bugs.

    • Editing and saving an rst file isn't enough for nikola build to do its job. Now I must first run nikola clean then nikola build.
    • The sidebar directive stopped working. After installing nikola plugin -i sidebar and rebuilding, I get the following error.

    ❯ nikola build Scanning posts........done! . render_sidebar:output/sidebar-en.inc TaskError - taskid:render_sidebar:output/sidebar-en.inc PythonAction Error Traceback (most recent call last): File "/Users/nvence/virtualenvs/nikola/lib/python3.9/site-packages/doit/action.py", line 437, in execute returned_value = self.py_callable(*self.args, **kwargs) File "/Users/nvence/virtualenvs/nikola/lib/python3.9/site-packages/nikola/nikola.py", line 1472, in render_template data = self.template_system.render_template( File "/Users/nvence/virtualenvs/nikola/lib/python3.9/site-packages/nikola/plugins/template/mako.py", line 113, in render_template data = template.render_unicode(**context) File "/Users/nvence/virtualenvs/nikola/lib/python3.9/site-packages/mako/template.py", line 478, in render_unicode return runtime._render( File "/Users/nvence/virtualenvs/nikola/lib/python3.9/site-packages/mako/runtime.py", line 878, in _render _render_context( File "/Users/nvence/virtualenvs/nikola/lib/python3.9/site-packages/mako/runtime.py", line 920, in _render_context _exec_template(inherit, lclcontext, args=args, kwargs=kwargs) File "/Users/nvence/virtualenvs/nikola/lib/python3.9/site-packages/mako/runtime.py", line 947, in exec_template callable(context, *args, **kwargs) File "/Users/nvence/site/cache/.mako.tmp/sidebar.tmpl.py", line 40, in render_body __M_writer(str( helper.list_posts(global_posts) )) File "/Users/nvence/site/cache/.mako.tmp/sidebar-helper.tmpl.py", line 37, in render_list_posts __M_writer(str( messages("Recent Posts", lang) )) File "/Users/nvence/virtualenvs/nikola/lib/python3.9/site-packages/nikola/utils.py", line 216, in call return self[lang][key] KeyError: 'Recent Posts'

    ######################################## render_sidebar:output/sidebar-en.inc :

    Thank you for your help, I am really at a loss on what to do.

    bug 
    opened by nickvence 5
  • Add/send a metadata signal.

    Add/send a metadata signal.

    Pull Request Checklist

    • [X] I’ve read the guidelines for contributing.
    • [ ] I updated AUTHORS.txt and CHANGES.txt (if the change is non-trivial) and documentation (if applicable).
    • [X] I tested my changes.

    Description

    Send a "metadata" signal to allow interested parties to make additions/changes to the metadata. One example use of this would be to set the "updated" time of a post to the actual modification time of the source file for the post.

    opened by vsajip 3
  • Fix #3555: Let plugin name be correctly accessed.

    Fix #3555: Let plugin name be correctly accessed.

    Pull Request Checklist

    • [X] I’ve read the guidelines for contributing.
    • [ ] I updated AUTHORS.txt and CHANGES.txt (if the change is non-trivial) and documentation (if applicable).
    • [X] I tested my changes.

    Description

    Get the plugin name from the correct source.

    opened by vsajip 2
  • Resolve shortcodes after ipynb compilation

    Resolve shortcodes after ipynb compilation

    Requested Feature: Resolve the shortcodes in an ipynb file after converting to HTML. This would make it possible to use custom ipynb preprocessors that inject/convert source cells to formatted shortcodes. The idea comes from fastpages where, for example, the markdown block-text > Warning: Watch out for ... is converted to a shortcode that is further processed to a nice looking warning box (theme dependent). For the person who wrote the shortcodes/preprocessors this may be unnecessary, but it could be quite helpful in a multi-author scenario or when the original ipynb file is posted independently of the blog.

    Specifically talking about the compile_string function. Instead of using

    def compile_string(self, data, source_path=None, is_two_file=True, post=None, lang=None):
            """Compile notebooks into HTML strings."""
            new_data, shortcodes = sc.extract_shortcodes(data)
            output = self._compile_string(nbformat.reads(new_data, current_nbformat))
            return self.site.apply_shortcodes_uuid(output, shortcodes, filename=source_path, extra_context={'post': post})
    

    Maybe it would be enough to run:

    def compile_string(self, data, source_path=None, is_two_file=True, post=None, lang=None):
            """Compile notebooks into HTML strings."""
            output = self._compile_string(nbformat.reads(data, current_nbformat))
            new_output, shortcodes = sc.extract_shortcodes(output)
            return self.site.apply_shortcodes_uuid(new_output, shortcodes, filename=source_path, extra_context={'post': post})
    

    I am running the modified version locally without any issues, but I am not too experienced with HTML-escaping/the shortcodes parser to evaluate possible issues/corner cases. A new plugin is possible, but since it seems to be such a minor change (if it is as easy as I am hoping for) maybe it is possible to include it directly? Or maybe provide an optional switch and mark it as an experimental feature?

    Related Area: ipynb compiler

    feature request 
    opened by kai-tub 0
  • Plugin name not being correctly accessed

    Plugin name not being correctly accessed

    The name specified for a plugin seems not to be correctly accessed - it's not being read from the plugin_info's plugin_object, as it ought to be. Instead of

    https://github.com/getnikola/nikola/blob/650b954294ab01627ba9b45d81835293a5e02bb8/nikola/nikola.py#L1152

    it should be something like

              name = getattr(plugin_info.plugin_object, 'name', plugin_info.name)
              self._commands[name] = plugin_info.plugin_object
    

    Similar logic needs to be applied for the activation, at

    https://github.com/getnikola/nikola/blob/650b954294ab01627ba9b45d81835293a5e02bb8/nikola/nikola.py#L1321

    which could be something like

              name = getattr(plugin_info.plugin_object, 'name', plugin_info.name)
              self.plugin_manager.activatePluginByName(name)
    
    opened by vsajip 0
Releases(v8.2.0)
  • v8.2.0(Dec 27, 2021)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.2.0. This release includes some new features as well as a bunch of bugfixes.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola.

    Changes

    Features

    • Add category_titles, category_descriptions, tag_titles, tag_descriptions to default context of tags page (Issue #3584)
    • Add Maori translation
    • Add Occitan translation
    • New auto_command_starting signal when nikola auto is starting
    • typogrify_custom filter adds a default value for typogrify_filters so that ignore_tags can be specified as the only option.
    • The default ignore_tags are appended to the user-supplied ignore_tags added via typogrify_custom.
    • Allow adding comment systems from a plugin (Issue #3544)
    • New CommentSystem plugin category (Issue #3544)

    Bugfixes

    • Fix changes to INDEX_READ_MORE_LINK and FEED_READ_MORE_LINK not triggering rebuilds
    • Make CATEGORY_TITLES, CATEGORY_DESCRIPTIONS, TAG_TITLES, TAG_DESCRIPTIONS translatable settings for consistency (Issue #3584)
    • Fix bug with posts after the first one appearing shifted due to a <div> closed too early (Issue #3573, #3564)
    • Fix support for files outside of site root directory on Windows
    • Support passing --backend and --db-file to nikola auto
    • Support blank values in certain WordPress-imported structures (Issue #3535)
    • Typogrify ignores div elements with .math CSS class. (Issue #3512)
    • Adjust panorama aspect ratio to 3:1 and document behaviour.
    Source code(tar.gz)
    Source code(zip)
  • v8.1.3(Feb 13, 2021)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.1.3. This release has some minor fixes, and a minor dependency change.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola.

    Changes

    Features

    • Provide the full GLOBAL_CONTEXT to the post list shortcode plugin (Issue #3481)
    • Add BasePlugin.register_auto_watched_folder()
    • Allow different PANDOC_OPTIONS values based on input extensions by specifying a dict of {".extension": [options]} (Issue #3492)
    • Allow boolean/integer pretty_url post meta values in YAML/TOML (Issue #3503)

    Bugfixes

    • Fix an UnboundLocalError crash in nikola deploy (Issue #3479)

    Other

    • For nikola github_deploy, the ghp-import PyPI package is now recommended instead of ghp-import2. Both versions should work, but you can’t have both installed at the same time. (Issue #3499)
    Source code(tar.gz)
    Source code(zip)
  • v8.1.2(Nov 15, 2020)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.1.2. This release has a bunch of new features, fixes some bugs, and improves compatibility with some dependencies and Windows.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola.

    Changes

    Features

    • Support for multiple authors per post — comma-separated, enabled by MULTIPLE_AUTHORS_PER_POST setting (Issue #3252)
    • Add navbar_custom_bg theme option to bootstrap4 and document options for bootstrap4 better (Issue #3443)
    • Add Marathi translation
    • Restore caps typogrify filter (wraps strings of capital letters with <span class="caps"> (via Issue #3405)
    • Improve nikola auto performance with rate-limiting, support -n argument to pass to nikola build (Issue #3401)
    • Add support for the Utterances comment system

    Bugfixes

    • Fix previewimages (post- and root-relative) in bootblog4/galleries featured posts for non-server-root sites (Issue #3471)
    • Windows: Also fix symlinks when installing from source with pip; if possible, enable Developer Mode and run git config --global core.symlinks true before cloning the Nikola repo
    • Fix clicking on links to image files. baguetteBox now requires a link (<a>) to have an <img> as a child in order to make the link activate the lightbox. (Issue #3472)
    • Fix LINK_CHECK_WHITELIST having issues due to mixing Unicode and bytestrings (Issue #3466)
    • Add support for nbconvert>=6.0.0 (Issue #3457)
    • Read files as utf-8-sig to allow BOM in input files
    • Don’t break slugs with slashes in doc directive (Issue #3450)
    • Avoid warnings from type annotations in auto caused by missing aiohttp (Issue #3451)
    • Ensure query strings and fragments are kept with URL_TYPE = "full_path" (Issue #3448)
    • Don’t run typogrify filters on <title> tag to avoid adding extra tags (Issue #3405)
    • Fix handling of duplicate plugins on Windows
    • Allow else clause in post-list plugin. (Issue #3436)
    • Ensure type metadata value from plugins is preserved (Issue 3445)
    • Fix path handlers with slashes on Windows
    Source code(tar.gz)
    Source code(zip)
  • v8.1.1(Jul 5, 2020)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.1.1. This release is mainly due to an incorrect PGP key being used for the PyPI artifacts; three regressions were also fixed in this release.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola.

    Changes

    Bugfixes

    • Default to no line numbers in code blocks, honor CodeHilite requesting no line numbers. Listing pages still use line numbers (Issue #3426)
    • Remove duplicate MathJax config in bootstrap themes (Issue #3427)
    • Fix doit requirement to doit>=0.32.0 (Issue #3422)
    Source code(tar.gz)
    Source code(zip)
  • v8.1.0(Jun 27, 2020)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.1.0. This release makes a few feature changes, improvements, and fixes a few bugs.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola.

    Changes

    Features

    • Support posts without titles (Issue #3408)
    • Support WebP image scaling (Issue #3399)
    • Use Luxon instead of Moment for fancy dates to make it more lightweight, going from 328k to 68k (Issue #3232)
    • New nikola console -s script.py option to run scripts that access your site (Issue #3385)
    • Allow preview images to be relative to posts for bootblog4 featured posts
    • Change the listings formatting to support word wrap with line numbers and improve appearance
    • Put the current language’s feed links first so that feed readers prefer it (Issue #3248)
    • Added support for default preview image for posts (Issue #3326)
    • Added support for thumbnails in gallery lists (Issue #1771)

    Bugfixes

    • Support directory names in REDIRECTIONS (Issue #3421)
    • Return a non-zero error code when nikola github_deploy fails
    • Refactored scale_image causing performance increasing in image resizing.
    • Don’t force absolute links for brand/languages (Issue #3229)
    • Fix RTL mirroring in base theme (:dir() pseudo-class is Firefox only) (Issue #3353)
    • Work around Bootstrap 4 alignment bug for RTL languages (Issue #3353)
    • Handle multiple level of inherit/import nesting in Mako templates correctly (Issue #3349)
    • Output a more informative error when files are missing due to broken symlinks or incorrect TRANSLATIONS_PATTERN values
    • Avoid installing tests package to site-packages, remove it from your environment if it was inadvertently added (Issue #3348)
    • Sometimes hyphenation added hyphens at the beginning of words (Issue #3362)
    • Mark gallery images as "dirty" if EXIF configuration changes (Issue #3357)
    • Fix regression in gallery titles being "index" if there was a index.txt and no title (Issue #3360)
    • Make gallery indexes depend on destination images to avoid multithreading race condition (Issue #3361)
    • Mark gallery thumbnails as lazy loading (Issue #2918)
    • Don't consider JPEG images with EXIF thumbnails as animated (Issue #3332)
    • Use correct language for hyphenation in posts that are not translated to all languages (Issue #3377)

    Internal

    • Added Post.source() method to get a Post's object unprocessed contents.
    • Added Post.save() method to modify Post contents.
    • Made is_two_file a property that uses save()
    Source code(tar.gz)
    Source code(zip)
  • v8.0.4(Feb 25, 2020)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.0.4. This release fixes a few small bugs, including a date glitch that appeared around New Year’s Eve.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola.

    Changes

    Nikola now supports Python 3.5 or newer. If you are on 3.4, please upgrade to a newer release of Python.

    Bugfixes

    • Fix hiding future posts in sitemaps for posts without pretty URLs (Issue #3339)
    • Pass the correct parameters to shortcodes in jupyter notebooks
    • Fix handling of conflicts between posts/pages and indexes generated by CATEGORY_PAGES_FOLLOW_DESTPATH
    • Fix default date format to yyyy-MM-dd to avoid bug with ISO years (Issue #3337)
    • Remove extra_header and extra_footer from base theme due to incompatibility with Mako. The blocks are still available in bootstrap4 and bootblog4. (Issue #3319 via #3291)
    • Show tracebacks when conf.py cannot be imported
    • Fix loading complex config files that import modules (Issue #3314)
    • Fix behavior of header demotion for negative values
    • If FILE_METADATA_REGEXP is set, load metadata from the filename first, then continue with the other sources (Issue #3344)
    Source code(tar.gz)
    Source code(zip)
  • v8.0.3(Nov 2, 2019)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.0.3. This release fixes a few bugs, including a notable one with galleries not working on mobile.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola.

    Changes

    Features

    • Add Friulian translation by aoanla
    • Add extra_header and extra_footer blocks to templates (Issue #3291)
    • Add REST_FILE_INSERTION_ENABLED config option to enable or disable reST external file inclusion directives (Issue #3311)

    Bugfixes

    • Support Markdown v3.x (Issue #3173)
    • Fix galleries in Firefox Mobile and when resizing window (Issue #3258)
    • Output <code> tag for double backticks in reST (Issue #3276)
    • Fully switch to HTML5 writer for reST (Issue #3276, getnikola/plugins#294)
    • Make ipynb listings work again
    • Correctly link to listings with spaces in their names
    • import_wordpress plugin doesn't require anymore a translation and can use nikola's default if none provided
    • Wordpress+qtranslate import (--qtranslate option) now works with more recent versions of plugins from the qtranslate family (namely qtranslate-X)
    • Fixed a wordpress import exception when image metadata has floats formated with ',' instead of '.'
    Source code(tar.gz)
    Source code(zip)
  • v8.0.2(Feb 22, 2019)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.0.2. This is a quality-of-life release with a handful of bug fixes, two new translations and a few extra features.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola. (Python 3-only since v8.0.0.)

    Changes

    • Make ARCHIVE_PATH, ARCHIVE_FILENAME translatable (Issue #3234)
    • Support configuring Isso via GLOBAL_CONTEXT['isso_config'] (Issue #3225)
    • Handle fragments in doc role (Issue #3212)
    • Slugify references in doc role.
    • Add Interlingua translation by Alberto Mardegan
    • Add Afrikaans translation by Friedel Wolff
    • Support for docutils.conf (Issue #3188)

    Bugfixes

    • Avoid random rebuilds with sites whose locales are not fullly supported, and random rebuilds on multilingual sites using Python 3.4/3.5 (Issue #3216)
    • Apply modifications to default_metadata before copying it to other languages
    • Make Commento comments work (Issue #3198)
    • Correctly handle separators in the relative path given to "ignored_assets" key in theme meta files (Issue #3210)
    • Fix error when nikola new_post receives directory name as path (Issue #3207)
    • Add slashes to paths with query strings in nikola serve only if there isn’t one before ?
    • Read listings files as UTF-8
    • Set one-file status basing on default language only (Issue #3191)
    • Don’t warn if post status is set to published explicitly (Issue #3181)
    • Remove mention of Twitter cards requiring an opt-in. This is not true anymore - anyone can use them.
    • fancydates now workwith listdate items (eg. archives)
    • bootstrap4 and bootblog4 themes no longer load moment.js when fancydates are off. (Issue #3231)
    Source code(tar.gz)
    Source code(zip)
  • v8.0.1(Sep 30, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.0.1. Some bugs were fixed; more importantly, we pinned down the Markdown package version due to incompatibilities.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola. (Python 3-only since v8.0.0.)

    Changes

    • Not compatible with Markdown 3.x yet, this release pins the requirement down to 2.x (until we get 3.x support done)

    Features

    • Make URL displayed by nikola auto and nikola serve clickable (Issue #3166)

    Bugfixes

    • Pandoc compiler was passing deleted argument (Issue #3171)
    • Make nikola version --check work again (Issue #3170)
    • Set logging level for reST to warning in order to limit noise
    • Fix docinfo removal for sites that use reST docinfo metadata (Issue #3167)
    Source code(tar.gz)
    Source code(zip)
  • v8.0.0(Sep 10, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.0.0. After 15 months in development, we’ve created our best release ever, with new features, many bugs squashed, and some improvements under the hood.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola==8.0.0.

    If you want to upgrade to Nikola v8, make sure to read the Upgrading blog post.

    Changes

    Important compatibility changes

    • Rename crumbs.tmpl to ui_helper.tmpl and the breadcrumbs bar function to breadcrumbs (your templates may need changing as well)
    • Rename post.is_mathjax to post.has_math. Themes using post.is_mathjax must be updated; it is recommended that they are changed to use math_helper.tmpl.
    • Reading reST docinfo metadata, including first heading as title, requires USE_REST_DOCINFO_METADATA now (Issue #2987)
    • RSS feeds might have changed their places due to RSS_PATH behavior changes (you may need to change RSS_PATH, RSS_FILENAME_BASE)
    • Atom feeds for archives and Atom pagination are no longer supported (Issue #3016)
    • Sections are replaced by categories (Issue #2833)
    • You need <a class="reference"> (instead of image-reference) to activate the lightbox now
    • Date formatting now uses the Babel library, you might need to change BABEL_FORMAT (Issues #2606, 3121)
    • The first heading in a reST document is not removed anymore by default unless USE_REST_DOCINFO_METADATA is enabled (Issues #2382, #3124)

    Features

    • Add Malayalam translation by Nemo Dicto
    • Add Vietnamese translation by Hoai-Thu Vuong
    • Don’t generate gallery index if the destination directory is site root and it would conflict with blog index (Issue #3133)
    • All built-in themes now support updated timestamp fields in posts. The update time, if it is specified and different from the posting time, will be displayed as "{postDate} (${messages("updated")} {updateDate})". If no update time is specified, the posting time will be displayed alone.
    • All built-in themes now support the DATE_FANCINESS option.
    • Theme bundles are now parsed using the configparser module and can support newlines inside entries as well as comments
    • Make bootstrap4 navbar color configurable with THEME_CONFIG['navbar_light'] (Issue #2863)
    • New data_file option for chart shortcode and directive (Issue #3129)
    • Show the filename of the missing file when nikola serve can't find a file (i.e. when an 404 error occurs).
    • Better error messages for JSON download failures in nikola plugin and nikola theme (Issue getnikola/plugins#282)
    • Use Babel instead of the locale module to better handle localizations (Issues #2606, #3121)
    • Change DATE_FORMAT formats to CLDR formats (Issue #2606)
    • Add NAVIGATION_ALT_LINKS option, displayed on the right side in bootstrap4/bootblog4 (Issue #3030)
    • Added documentation of Post objects to list of template variables (Issue #3003)
    • Support featured posts in bootblog4 (Issue #2964)
    • Add THEME_CONFIG setting that themes can use in any way
    • Use youtube-nocookie.com for better privacy in youtube reST directive and improve the appearance of the player
    • Support hackerthemes.com themes and renamed bootswatch_theme command subtheme (Issue #3049)
    • Add DISABLE_MAIN_ATOM_FEED setting (Issue #3016, Issue #3039)
    • Add ATOM_FILENAME_BASE setting (defaults to index for existing sites, but feed for new sites) (Issue #3016)
    • Add CATEGORY_DESTPATH_AS_DEFAULT, CATEGORY_DESTPATH_TRIM_PREFIX, CATEGORY_DESTPATH_FIRST_DIRECTORY_ONLY settings, as part of replacing sections with categories (Issue #2833)
    • Tags draft, private and mathjax are no longer treated special if USE_TAG_METADATA is set to False (default for new sites) (Issue #2761)
    • Replace draft and private tags with a status meta field (supports published, featured, draft, private) and mathjax with .. has_math: yes (Issue #2761)
    • Rename TAG_PAGES_TITLESTAG_TITLES, TAG_PAGES_DESCRIPTIONSTAG_DESCRIPTIONS.
    • Rename CATEGORY_PAGES_TITLESCATEGORY_TITLES, CATEGORY_PAGES_DESCRIPTIONSCATEGORY_DESCRIPTIONS.
    • Produce a better error message when a template referenced in another template is missing (Issue #3055)
    • Support captioned images and image ordering in galleries, as well as arbitrary metadata through a new metadata.yml file (Issue #3017, Issue #3050, Issue #2837)
    • New ATOM_PATH setting (Issue #2971)
    • Make crumbs available to all pages
    • Allowing to customize RSS and Atom feed extensions with RSS_EXTENSION, ATOM_EXTENSION settings (Issue #3041)
    • Allowing to customize filename base appended to RSS_PATH with RSS_FILENAME_BASE setting (Issue #3041)
    • Use basic ipynb template by default for slightly better appearance and behavior
    • Fixing behavior of RSS_PATH to do what the documentation says it does (Issue #3024)
    • Add support for fragments in path handlers (Issue #3032)
    • New METADATA_VALUE_MAPPING setting to allow for flexible global modification of metadata (Issue #3025)
    • New smartjoin template function/filter that joins lists and leaves strings as-is (Issue #3025)
    • Explain index.html conflicts better (Issue #3022)
    • Recognize both TEASER_END and (new) END_TEASER (Issue #3010) (warning: if you perform manual splits, the regex change means new indexes must be used)
    • New MARKDOWN_EXTENSION_CONFIGS setting (Issue #2970)
    • Replace flowr.js with justified-layout.js by Flickr (does not require jQuery!)
    • bootblog4 is the new default theme (Issue #2964)
    • New bootstrap4 and bootblog4 themes (Issue #2964)
    • New Thai translation by Narumol Hankrotha and Jean Jordaan
    • Support for Commento comment system (Issue #2773)
    • New PRESERVE_ICC_PROFILES option to control whether ICC profiles are preserved when copying images.
    • Use baguetteBox in Bootstrap theme (part of Issue #2777)
    • New default-config command to generate a clean configuration.
    • New thumbnail shortcode similar to the reStructuredText thumbnail directive (via Issue #2809)
    • Rewrite nikola auto with asyncio and aiohttp (Issue #2850)
    • New listings shortcode similar to the reStructuredText listings directive (Issue #2868)
    • Switch to reStructuredText’s new HTML 5 renderer (Issue #2874)
    • Deprecate html4css1.css in favor of rst_base.css (Issue #2874)
    • Add support for MetadataExtractor plugins that allow custom, extensible metadata extraction from posts (Issue #2830)
    • Support YAML and TOML metadata in 2-file posts (via Issue #2830)
    • Renamed UNSLUGIFY_TITLESFILE_METADATA_UNSLUGIFY_TITLES (Issue #2840)
    • Add NIKOLA_SHOW_TRACEBACKS environment variable that shows full tracebacks instead of one-line summaries
    • Use PRETTY_URLS by default on all sites (Issue #1838)
    • Feed link generation is completely refactored (Issue #2844)
    • Let path handlers return absolute URLs (Issue #2876)
    • Add BLOG_EMAIL to global context to make it available for templates (Issue #2968)

    Bugfixes

    • Use UTF-8 instead of system encoding for gallery metadata.yml file
    • Do not remove first heading in document (reST document title) if USE_REST_DOCINFO_METADATA is disabled (Issue #3124)
    • Remove NO_DOCUTILS_TITLE_TRANSFORM setting, this is now default behavior if USE_REST_DOCINFO_METADATA is disabled (Issue #2382, #3124)
    • Enforce trailing slash for directories in nikola auto (Issue #3140)
    • Galleries with baguetteBox don’t glitch out on the first image anymore (Issue #3141)
    • Pass arguments to youtube directive unchanged (Issue #3150)
    • Fix listing installed themes if theme directory is missing.
    • Watch correct output folder in nikola auto (Issue #3119)
    • Fix post fragment dependencies when posts are only available in a non-default language (Issue #3112)
    • Implement MARKDOWN_EXTENSION_CONFIGS properly (Issue #2970)
    • Ignore .DS_Store when processing listings (Issue #3099)
    • Remove redundant check for tag similarity (Mentioned in Issue #3123)
    • Improve appearance of bootblog4 on mobile (Issue #3069)
    • Make smartjoin more flexible (Issue #3080)
    • Make post-list and post_list synonymous (Issue #3083)
    • Support CATEGORY_DESTPATH_NAMES with pages following destpath
    • Make CATEGORY_PAGES_FOLLOW_DESTPATH more resilient (Issue #3081)
    • Guard against null items in gallery meta files (Issues #3076, #3077)
    • Respect USE_FILENAME_AS_TITLE in galleries with a meta file
    • Fix gallery metadata for multilingual sites (Issue #3078)
    • Fixes behavior for posts not available in default language (Issues #2956 and #3073)
    • Always follow FEED_LENGTH for Atom feeds
    • Apply filters to all Atom feeds
    • Read file metadata if compiler metadata exists and prefer it over compiler metadata (Issue #3008)
    • Rename DISABLE_INDEXES_PLUGIN_INDEX_AND_ATOM_FEED to DISABLE_INDEXES and DISABLE_INDEXES_PLUGIN_RSS_FEED to DISABLE_MAIN_RSS_FEED (Issue #3039)
    • Make chart shortcode its own plugin and make the reST directive depend on it.
    • Put post_list shortcode in its own plugin and make the reST directive depend on it.
    • Don’t silence syntax errors and other exceptions that occur while reading metadata
    • Use documented dateutil API for time zone list (Issue #3006)
    • Handle trailing slash redirects with query strings correctly in nikola serve (Issue #3000)
    • Fix w3c validation errors for itemscope entries in default themes
    • Hide “Incomplete language” message for overrides of complete languages
    • Handle '/' and other absolute paths better in POSTS / PAGES / TRANSLATIONS (Issue #2982)
    • Fix loading non-default languages
    • Support KaTeX for reST display math (Issue #2888)
    • Use npm for asset management instead of bower, which was deprecated (Issue #2790)
    • Properly handle SHOW_INDEX_PAGE_NAVIGATION with Jinja templates (Issue #2960)
    • Prevent crashes due to Windows-specific code in auto running on all platforms (Issue #2940)
    • Don’t run hyphenate on <pre> blocks (Issue #2939)
    • Make errors in reST display in logs again
    • Unquote paths given to link:// magic URLs (Issue #2934)
    • Specify UTF-8 input encoding for Mako as default (Issue #2930)
    • Don't trigger rebuilds in auto mode for files it's safe to ignore (Issue #2906)
    • Fix padding for Jupyter code blocks (Issue #2927)
    • Apply SCHEDULE_ALL to posts only (Issue #2921)
    • Restore version number to Bootswatch URLs (Issue #2916)
    • Do not strip trailing slash in slug magic links
    • Ignore empty tags in HTML metadata reader (Issue #2890)
    • Do not remove doctype if add_header_permalinks or deduplicate_ids are used
    • Handle empty slug metadata (Issue #2887)
    • Fix crash when compiling empty .html posts (Issue #2851)
    • Make failures to get source commit hash non-fatal in github_deploy (Issue #2847)
    • Less cryptic error when guessing format from extension in new_post fails
    • Use Jupyter name more consistently in docs
    • Support CODE_COLOR_SCHEME in Jupyter notebooks (Issue #2093)
    • Language was not passed to title and link generation for page indexes
    • Addressed issue with snaps not allowing certain functions to work properly.

    Removed conf.py settings

    The following settings have been removed. Nikola will now always behave as if the value was what is displayed afer the setting name.

    • FEED_PREVIEWIMAGE = True
    • SITEMAP_INCLUDE_FILELESS_DIRS = True
    • USE_OPEN_GRAPH = True
    • USE_BASE_TAG = False

    Removed features

    • Removed Colorbox, baguetteBox is used instead (Issue #2777)
    • Removed googleplus comments (no longer supported) (Issue #635)
    • Removed the slides directive for docutils, it will now be a separate plugin.
    • Dropped Python 2 and Python 3.3 support (oldest supported version is 3.4)
    • Removed nikola install_theme — use nikola theme instead
    • Droppped insecure post “encryption” feature
    • Stopped supporting all deprecated config options
    • Dropped annotations support (annotateit.org closed down in March 2017)
    • Removed taxonomy option also_create_classifications_from_other_languages (Issue #2785) and generate_atom_feeds_for_post_lists (Issue #3016)
    • Removed old 7-line metadata format (Issue #2839)
    • Atom feeds are now limited to one page (Issue #3016)
    • Removed sections (replaced by improved categories) (Issue #2833)
    • Moved tag_cloud_data.json generation to a separate tagcloud plugin (Issue #1696)
    • The webassets library is no longer required, we now manually bundle files (Issue #3074)
    Source code(tar.gz)
    Source code(zip)
  • v8.0.0rc1(Sep 8, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.0.0rc1. This is the end of the road to Nikola version 8. Within 48 hours, assuming there are no grave bugs reported in that timeframe, we intend to release v8 final.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola==8.0.0rc1.

    If you want to upgrade to Nikola v8, make sure to read the Upgrading blog post.

    Changes

    Features

    • Add Vietnamese translation by Hoai-Thu Vuong
    • Don’t generate gallery index if the destination directory is site root and it would conflict with blog index (Issue #3133)
    • All built-in themes now support updated timestamp fields in posts. The update time, if it is specified and different from the posting time, will be displayed as "{postDate} (${messages("updated")} {updateDate})". If no update time is specified, the posting time will be displayed alone.
    • All built-in themes now support the DATE_FANCINESS option.
    • Theme bundles are now parsed using the configparser module and can support newlines inside entries as well as comments
    • Make bootstrap4 navbar color configurable with THEME_CONFIG['navbar_light'] (Issue #2863)

    Bugfixes

    • Use UTF-8 instead of system encoding for gallery metadata.yml file
    • Do not remove first heading in document (reST document title) if USE_REST_DOCINFO_METADATA is disabled (Issue #3124)
    • Remove NO_DOCUTILS_TITLE_TRANSFORM setting, this is now default behavior if USE_REST_DOCINFO_METADATA is disabled (Issue #2382, #3124)
    • Enforce trailing slash for directories in nikola auto (Issue #3140)
    • Galleries with baguetteBox don’t glitch out on the first image anymore (Issue #3141)

    Removed features

    • Moved tag_cloud_data.json generation to a separate tagcloud plugin (Issue #1696)
    • The webassets library is no longer required, we now manually bundle files (Issue #3074)
    Source code(tar.gz)
    Source code(zip)
  • v8.0.0b3(Aug 7, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.0.0b3. This is the third and hopefully final beta of Nikola v8. The big change in this release is the adoption of Babel to handle date translations (instead of relying on system locale, which didn’t work well for us). Other issues and bugs were fixed.

    Many themes in our Index have been ported for Nikola v8, but some of them are not yet there.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola==8.0.0b3.

    If you want to upgrade to Nikola v8, make sure to read the Upgrading blog post.

    Changes

    Features

    • New data_file option for chart shortcode and directive (Issue #3129)
    • Show the filename of the missing file when nikola serve can't find a file (i.e. when an 404 error occurs).
    • Better error messages for JSON download failures in nikola plugin and nikola theme (Issue getnikola/plugins#282)
    • Use Babel instead of the locale module to better handle localizations (Issues #2606, #3121)
    • Change DATE_FORMAT formats to CLDR formats (Issue #2606)

    Bugfixes

    • Fix listing installed themes if theme directory is missing.
    • Watch correct output folder in nikola auto (Issue #3119)
    • Fix post fragment dependencies when posts are only available in a non-default language (Issue #3112)
    • Implement MARKDOWN_EXTENSION_CONFIGS properly (Issue #2970)
    • Ignore .DS_Store when processing listings (Issue #3099)
    • Remove redundant check for tag similarity (Mentioned in Issue #3123)
    Source code(tar.gz)
    Source code(zip)
  • v8.0.0b2(May 13, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.0.0b2. This release fixes some bugs found in v8.0.0b1, and adds a few new appearance features (featured posts, alternate navigation links)

    The final version of Nikola v8 should be out in early June. We welcome everyone to test it with their site and report any issues to make it the best release ever.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola==8.0.0.b2.

    Changes

    Important compatibility changes not mentioned previously

    • You need <a class="reference"> (instead of image-reference) to activate the lightbox now

    Features

    • Add NAVIGATION_ALT_LINKS option, displayed on the right side in bootstrap4/bootblog4 (Issue #3030)
    • Added documentation of Post objects to list of template variables (Issue #3003)
    • Support featured posts in bootblog4 (Issue #2964)
    • Add THEME_CONFIG setting that themes can use in any way
    • Use youtube-nocookie.com for better privacy in youtube reST directive and improve the appearance of the player

    Featured post details: https://getnikola.com/handbook.html#featured-posts

    Bugfixes

    • Improve appearance of bootblog4 on mobile (Issue #3069)
    • Make smartjoin more flexible (Issue #3080)
    • Make post-list and post_list synonymous (Issue #3083)
    • Support CATEGORY_DESTPATH_NAMES with pages following destpath
    • Make CATEGORY_PAGES_FOLLOW_DESTPATH more resilient (Issue #3081)
    • Guard against null items in gallery meta files (Issues #3076, #3077)
    • Respect USE_FILENAME_AS_TITLE in galleries with a meta file
    • Fix gallery metadata for multilingual sites (Issue #3078)
    Source code(tar.gz)
    Source code(zip)
  • v8.0.0b1(May 5, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v8.0.0b1.

    Nikola v8.0.0b1 (Beta 1) is the first test release of the v8 series. The v8 series adds a ton of new features and fixes bugs, while also breaking backwards compatibility.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter (IPython) Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola==8.0.0.beta1.

    Before upgrading to Nikola v8, make sure to read the “Upgrading” document.

    Changes in v8.0.0b1

    Important compatibility changes

    • Rename crumbs.tmpl to ui_helper.tmpl and the breadcrumbs bar function to breadcrumbs (your templates may need changing as well)
    • Rename post.is_mathjax to post.has_math. Themes using post.is_mathjax must be updated; it is recommended that they are changed to use math_helper.tmpl.
    • Reading reST docinfo metadata, including first heading as title, requires USE_REST_DOCINFO_METADATA now (Issue #2987)
    • RSS feeds might have changed their places due to RSS_PATH behavior changes (you may need to change RSS_PATH, RSS_FILENAME_BASE)
    • Atom feeds for archives and Atom pagination are no longer supported (Issue #3016)
    • Sections are replaced by categories (Issue #2833)

    Features

    • Support hackerthemes.com themes and renamed bootswatch_theme command subtheme (Issue #3049)
    • Add DISABLE_MAIN_ATOM_FEED setting (Issue #3016, Issue #3039)
    • Add ATOM_FILENAME_BASE setting (defaults to index for existing sites, but feed for new sites) (Issue #3016)
    • Add CATEGORY_DESTPATH_AS_DEFAULT, CATEGORY_DESTPATH_TRIM_PREFIX, CATEGORY_DESTPATH_FIRST_DIRECTORY_ONLY settings, as part of replacing sections with categories (Issue #2833)
    • Tags draft, private and mathjax are no longer treated special if USE_TAG_METADATA is set to False (default for new sites) (Issue #2761)
    • Replace draft and private tags with a status meta field (supports published, featured, draft, private) and mathjax with .. has_math: yes (Issue #2761)
    • Rename TAG_PAGES_TITLESTAG_TITLES, TAG_PAGES_DESCRIPTIONSTAG_DESCRIPTIONS.
    • Rename CATEGORY_PAGES_TITLESCATEGORY_TITLES, CATEGORY_PAGES_DESCRIPTIONSCATEGORY_DESCRIPTIONS.
    • Produce a better error message when a template referenced in another template is missing (Issue #3055)
    • Support captioned images and image ordering in galleries, as well as arbitrary metadata through a new metadata.yml file (Issue #3017, Issue #3050, Issue #2837)
    • New ATOM_PATH setting (Issue #2971)
    • Make crumbs available to all pages
    • Allowing to customize RSS and Atom feed extensions with RSS_EXTENSION, ATOM_EXTENSION settings (Issue #3041)
    • Allowing to customize filename base appended to RSS_PATH with RSS_FILENAME_BASE setting (Issue #3041)
    • Use basic ipynb template by default for slightly better appearance and behavior
    • Fixing behavior of RSS_PATH to do what the documentation says it does (Issue #3024)
    • Add support for fragments in path handlers (Issue #3032)
    • New METADATA_VALUE_MAPPING setting to allow for flexible global modification of metadata (Issue #3025)
    • New smartjoin template function/filter that joins lists and leaves strings as-is (Issue #3025)
    • Explain index.html conflicts better (Issue #3022)
    • Recognize both TEASER_END and (new) END_TEASER (Issue #3010) (warning: if you perform manual splits, the regex change means new indexes must be used)
    • New MARKDOWN_EXTENSION_CONFIGS setting (Issue #2970)
    • Replace flowr.js with justified-layout.js by Flickr (does not require jQuery!)
    • bootblog4 is the new default theme (Issue #2964)
    • New bootstrap4 and bootblog4 themes (Issue #2964)
    • New Thai translation by Narumol Hankrotha and Jean Jordaan
    • Support for Commento comment system (Issue #2773)
    • New PRESERVE_ICC_PROFILES option to control whether ICC profiles are preserved when copying images.
    • Use baguetteBox in Bootstrap theme (part of Issue #2777)
    • New default-config command to generate a clean configuration.
    • New thumbnail shortcode similar to the reStructuredText thumbnail directive (via Issue #2809)
    • Rewrite nikola auto with asyncio and aiohttp (Issue #2850)
    • New listings shortcode similar to the reStructuredText listings directive (Issue #2868)
    • Switch to reStructuredText’s new HTML 5 renderer (Issue #2874)
    • Deprecate html4css1.css in favor of rst_base.css (Issue #2874)
    • Add support for MetadataExtractor plugins that allow custom, extensible metadata extraction from posts (Issue #2830)
    • Support YAML and TOML metadata in 2-file posts (via Issue #2830)
    • Renamed UNSLUGIFY_TITLESFILE_METADATA_UNSLUGIFY_TITLES (Issue #2840)
    • Add NIKOLA_SHOW_TRACEBACKS environment variable that shows full tracebacks instead of one-line summaries
    • Use PRETTY_URLS by default on all sites (Issue #1838)
    • Feed link generation is completely refactored (Issue #2844)
    • Let path handlers return absolute URLs (Issue #2876)
    • Add BLOG_EMAIL to global context to make it available for templates (Issue #2968)

    Bugfixes

    • Fixes behavior for posts not available in default language (Issues #2956 and #3073)
    • Always follow FEED_LENGTH for Atom feeds
    • Apply filters to all Atom feeds
    • Read file metadata if compiler metadata exists and prefer it over compiler metadata (Issue #3008)
    • Rename DISABLE_INDEXES_PLUGIN_INDEX_AND_ATOM_FEED to DISABLE_INDEXES and DISABLE_INDEXES_PLUGIN_RSS_FEED to DISABLE_MAIN_RSS_FEED (Issue #3039)
    • Make chart shortcode its own plugin and make the reST directive depend on it.
    • Put post_list shortcode in its own plugin and make the reST directive depend on it.
    • Don’t silence syntax errors and other exceptions that occur while reading metadata
    • Use documented dateutil API for time zone list (Issue #3006)
    • Handle trailing slash redirects with query strings correctly in nikola serve (Issue #3000)
    • Fix w3c validation errors for itemscope entries in default themes
    • Hide “Incomplete language” message for overrides of complete languages
    • Handle '/' and other absolute paths better in POSTS / PAGES / TRANSLATIONS (Issue #2982)
    • Fix loading non-default languages
    • Support KaTeX for reST display math (Issue #2888)
    • Use npm for asset management instead of bower, which was deprecated (Issue #2790)
    • Properly handle SHOW_INDEX_PAGE_NAVIGATION with Jinja templates (Issue #2960)
    • Prevent crashes due to Windows-specific code in auto running on all platforms (Issue #2940)
    • Don’t run hyphenate on <pre> blocks (Issue #2939)
    • Make errors in reST display in logs again
    • Unquote paths given to link:// magic URLs (Issue #2934)
    • Specify UTF-8 input encoding for Mako as default (Issue #2930)
    • Don't trigger rebuilds in auto mode for files it's safe to ignore (Issue #2906)
    • Fix padding for Jupyter code blocks (Issue #2927)
    • Apply SCHEDULE_ALL to posts only (Issue #2921)
    • Restore version number to Bootswatch URLs (Issue #2916)
    • Do not strip trailing slash in slug magic links
    • Ignore empty tags in HTML metadata reader (Issue #2890)
    • Do not remove doctype if add_header_permalinks or deduplicate_ids are used
    • Handle empty slug metadata (Issue #2887)
    • Fix crash when compiling empty .html posts (Issue #2851)
    • Make failures to get source commit hash non-fatal in github_deploy (Issue #2847)
    • Less cryptic error when guessing format from extension in new_post fails
    • Use Jupyter name more consistently in docs
    • Support CODE_COLOR_SCHEME in Jupyter notebooks (Issue #2093)
    • Language was not passed to title and link generation for page indexes
    • Addressed issue with snaps not allowing certain functions to work properly.

    Removed conf.py settings

    The following settings have been removed. Nikola will now always behave as if the value was what is displayed afer the setting name.

    • FEED_PREVIEWIMAGE = True
    • SITEMAP_INCLUDE_FILELESS_DIRS = True
    • USE_OPEN_GRAPH = True
    • USE_BASE_TAG = False

    Removed features

    • Removed Colorbox, baguetteBox is used instead (Issue #2777)
    • Removed googleplus comments (no longer supported) (Issue #635)
    • Removed the slides directive for docutils, it will now be a separate plugin.
    • Dropped Python 2 and Python 3.3 support (oldest supported version is 3.4)
    • Removed nikola install_theme — use nikola theme instead
    • Droppped insecure post “encryption” feature
    • Stopped supporting all deprecated config options
    • Dropped annotations support (annotateit.org closed down in March 2017)
    • Removed taxonomy option also_create_classifications_from_other_languages (Issue #2785) and generate_atom_feeds_for_post_lists (Issue #3016)
    • Removed old 7-line metadata format (Issue #2839)
    • Atom feeds are now limited to one page (Issue #3016)
    • Removed sections (replaced by improved categories) (Issue #2833)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.15(May 5, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.15. Nikola v7.8.15 is the last v7 maintenance release with a few more bug fixes.

    Install using pip install Nikola==7.8.15.

    Changes

    • Fix behavior for posts not available in default language (Issues #2956 and #3073)
    • Fix behavior of RSS_PATH to do what the documentation says it does (Issue #3024)
    • Use documented dateutil API for time zone list (Issue #3006)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.14(Mar 31, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.14. This is a maintenance release for the v7 series.

    Future releases in the v7 series are going to be small maintenance releases that include bugfixes only, as work on v8.0.0 is underway. If you wish to test new features, you can install from the master branch on GitHub.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    • doit v0.31.0 compatibility (Issue #2980, #3004, v8 backport)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.13(Mar 20, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.13. This is a maintenance release for the v7 series.

    Future releases in the v7 series are going to be small maintenance releases that include bugfixes only, as work on v8.0.0 is underway.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    • Add new Thai translation by Narumol Hankrotha and Jean Jordaan (v8 backport)
    • Hide “Incomplete language” message for overrides of complete languages
    • Restore ability to override messages partially
    Source code(tar.gz)
    Source code(zip)
  • v7.8.12(Mar 17, 2018)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.12. This is a maintenance release for the v7 series.

    Future releases in the v7 series are going to be small maintenance releases that include bugfixes only, as work on v8.0.0 is underway.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    • Fix loading non-default languages
    Source code(tar.gz)
    Source code(zip)
  • v7.8.11(Dec 29, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.11. This is a maintenance release for the v7 series.

    Future releases in the v7 series are going to be small maintenance releases that include bugfixes only, as work on v8.0.0 is underway.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    • Make errors in reST display in logs again
    • Restore version number to Bootswatch URLs (Issue #2916)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.10(Sep 10, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.10. This is a maintenance release for the v7 series.

    Future releases in the v7 series are going to be small maintenance releases that include bugfixes only, as work on v8.0.0 is underway.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    • Fix crashes with Jinja2 themes and tag indexes (Issue #2900)
    • Ignore empty tags in HTML metadata reader (Issue #2890)
    • Fix crash when compiling empty .html posts (Issue #2851)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.9(Jun 20, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.9. This is a maintenance release for the v7 series.

    Future releases in the v7 series are going to be small maintenance releases that include bugfixes only, as work on v8.0.0 is underway.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    • Restore missing unminified assets
    • Make failures to get source commit hash non-fatal in github_deploy (Issue #2847)
    • Fix a bug in HTML meta parsing that crashed on <meta> tags without name (Issue #2835)
    • Fix math not showing up in some circumstances (Issue #2841)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.8(Jun 12, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.8. It fixes some bugs, some related to metadata support, while also adding more internationalization features.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    This release fixes two grave bugs in TOML metadata support (sorry!). The built-in themes have also been cleaned up and include less unused assets. In addition, taxonomies now support translations. HTML meta tags are also possible metadata sources. The default metadata format to generate can now be changed.

    Features

    • Providing infrastructure for taxonomies for classification pages to link to related classifications in other languages
    • Added alternate links (visible and header) for archives and authors (Issue #993)
    • Added options to add alternative links (visible and header) for tags, sections and categories.
    • New METADATA_FORMAT option to choose preferred metadata format (Nikola/YAML/TOML/Pelican) (Part of Issue #2801)
    • Extract metadata from HTML meta and title tags like Pelican (Issue #1923)
    • Update assets in the base and base-jinja themes and clean up code (Issue #2744)
    • Show captions in the base theme gallery (Part of issue #2777)

    Bugfixes

    • Fix two grave bugs in TOML metadata
    • Require just one line break after TOML/YAML metadata
    • Add alt attribute to images in galleries in base theme (Part of issue #2777)
    • Support empty lines in YAML/TOML metadata (Part of issue #2801)
    • Tests run on macOS.
    Source code(tar.gz)
    Source code(zip)
  • v7.8.7(Jun 5, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.7. This is a part-emergency bugfix, part-world domination release.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter (IPython) Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    In an effort to improve interoperability with other static site generators, make importing data easier, and help with world domination, Nikola v7.8.7 ships with support for the following metadata formats:

    • reST-style comments (.. name: value — default format)
    • Two-file format (reST-style comments or 7-line)
    • Jupyter Notebook metadata
    • YAML, between --- (Jekyll, Hugo)
    • TOML, between +++ (Hugo)
    • reST docinfo (Pelican)
    • Markdown metadata extension (Pelican)

    In addition, Markdown is now enabled and required by default. More details: https://getnikola.com/handbook.html#metadata-formats

    The release also fixes two important bugs, one that crashes when trying to detect locale in some edge cases, and another which made some themes quietly leak template files. If you’re using a Jinja2-based theme that does not have its own parent file, please force a rebuild (nikola build -a).

    Features

    • Enable markdown by default (part of Issue #2809)
    • Allowing to register filters from plugins, and allowing to specify default filters as strings of the form filters.<name> (part of Issue #2475)
    • Support ignoring assets via ignore_assets theme meta field (Issue #2812)
    • Ignore unused Colorbox locales (Issue #2812)
    • Accept tag metadata as lists for YAML/TOML (Issue #2801)
    • Support for mapping metadata from other formats to Nikola names using the METADATA_MAPPING setting (Issue #2817)
    • Support for reStructured text docinfo metadata with USE_REST_DOCINFO_METADATA option, defaulting to False (Issue #1923)
    • New HIDE_REST_DOCINFO option, defaulting to False.
    • Support for Markdown Metadata for Pelican compatibility by adding 'markdown.extensions.meta' to MARKDOWN_EXTENSIONS (Issue #1923)
    • Support for YAML and TOML metadata (Issue #2801)

    Bugfixes

    • Use inheritance tree when looking for theme engine (Issue #2816)
    • Fix unbound variable error in locale guessing (Issue #2806)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.6(May 26, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.6. It fixes some bugs and adds new features.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter (IPython) Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Or if you prefer, Snapcraft packages are now built automatically, and Nikola v7.8.6 will be available in the stable channel.

    Changes

    Features

    • Guess file format from file name on new_post (Issue #2798)
    • Use BaguetteBox as lightbox in base theme (Issue #2777)
    • New deduplicate_ids filter, for preventing duplication of HTML id attributes (Issue #2570)
    • Ported gallery image layout to base theme (Issue #2775)
    • Better error handling when posts can't be parsed (Issue #2771)
    • Use .theme files to store theme metadata (Issue #2758)
    • New add_header_permalinks filter, for Sphinx-style header links (Issue #2636)
    • Added alternate links for gallery translations (Issue #993)

    Bugfixes

    • Use locale.getdefaultlocale() for better locale guessing (credit: @madduck)
    • Save dependencies for template hooks properly (using .__doc__ or .template_registry_identifier for callables)
    • Enable larger panorama thumbnails (Issue #2780)
    • Disable archive_rss link handler, which was useless because no such RSS was ever generated (Issue #2783)
    • Ignore files ending wih "bak" (Issue #2740)
    • Use page.tmpl by default, which is inherited from story.tmpl (Issue #1891)

    Other

    • Limit Jupyter support to notebook >= 4.0.0 (it already was in requirements-extras.txt; Issue #2733)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.5(May 12, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.5. It fixes some bugs and adds new features.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter (IPython) Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    Math support changes

    • If you edited templates related to indexes and posts (index.tmpl, post.tmpl, index_helper.tmpl, post_helper.tmpl) in your templates, you should adjust them to use math_helper.tmpl.
    • If you are using KaTeX, you should remove the CSS snippet from your configuration (templates), as that is now handled by Nikola.

    Features

    • Get rid of THEME_REVEAL_CONFIG_* settings, use global context instead (Issue #2485)
    • New emoji shortcode
    • Add SECTION_PATH support to move the section indexes to a user-defined location (Issue #2738)
    • Add a list of template variables to documentation (Issues #2328, #2712, #2259) and update the theming reference (Issue #2259)
    • Add {post_title} tag for Read More links (Issue #2709)
    • Include MathJax config only when needed (via Issue #2715)
    • Include KaTeX CSS automatically when needed (Issue #2715)
    • Split out math code into new math_helper.tmpl template (Issue #2715)
    • Added jpegoptim_progressive filter to convert jpeg images to progressive jpegs.

    Bugfixes

    • Open 127.0.0.1 when using nikola serve -b and default 0.0.0.0 hostname to avoid resolution issues — the site is still available on all interfaces (Issue #2755)
    • Don't break animated GIFs in postprocessing (Issue #2750)
    • More robust shortcodes, no need to escape URLs in reSt, work better with LaTeX, etc.
    • No longer creates empty subarchive pages, and no longer create broken archive navigation links on day level (Issue #2734)
    • Fixes post scanner plugin order (Issue #2720)
    • Rename POSTS_SECTION_ARE_INDEXES to POSTS_SECTIONS_ARE_INDEXES
    • Make date ranges work in shortcode-based post lists (Issue #2690)
    • Read data files only if Nikola configuration exists (Issue #2708)
    • Make PAGE_INDEX work with PRETTY_URLS (Issue #2705)
    • Fix PHP posts/pages not rendering on Windows (Issue #2706)
    • Improving support for PostScanner plugins by asking them which compilers are unused (Issue #2496)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.4(Mar 26, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.4. It fixes some bugs and adds new features.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter (IPython) Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    Features

    • Refactor RSS feed generation to allow better plugin access
    • Add Jupyter config as dependency for jupyter posts (by @knowsuchagency)
    • Make nikola plugin --list-installed more readable (Issue #2692)
    • Accept now in post-list date conditions
    • Add RSS_COPYRIGHT, RSS_COPYRIGHT_PLAIN, and RSS_COPYRIGHT_FORMATS options in conf.py which can be disabled by specifying copyright_=False to generic_rss_renderer, or overriden by specifying an explicit value.
    • Write PID of detached nikola serve process to a file called nikolaserve.pid
    • Append file name (generated from title) if nikola new_post receives directory name as path (Issue #2651)
    • Add a require_all_tags parameter to the post-list directive to show only posts that have all specified tags. (Issue #2665)
    • Add META_GENERATOR_TAG option in conf.py allowing the meta generator tag to be disabled (Issue #2628)
    • Add YUI_COMPRESSOR_EXECUTABLE, CLOSURE_COMPILER_EXECUTABLE, OPTIPNG_EXECUTABLE, JPEGOPTIM_EXECUTABLE and HTML_TIDY_EXECUTABLE to configure executables for built-in filters. (Issue #2615)
    • Allow setting custom GUID in feeds (Issue #2378)

    Bugfixes

    • Remove misplaced and duplicated meta description tags (Issue #2694)
    • Fix crash if PAGE_INDEX is enabled and make them actually work (Issues #2646, #2702)
    • Ignore NEW_POST_DATE_PATH when creating pages (Issue #2699)
    • Ensure post.updated is timezone-aware (Issue #2698)
    • Pass previously missing post object and language to reST compiler and language to Markdown compiler (for shortcodes)
    • Fix crashes when rendering subcategories (Issue #2681)
    • Prevent writing cache files outside of the cache folder (Issue #2684)
    • Fix mimetype guessing in auto mode (Issue #2645)
    • Fix filters.html5lib_xmllike for laters html5lib (Issue #2648)
    • Skip the current post in post lists (Issue #2666)
    • Fix poor performance when compiling multiple markdown documents with the markdown compiler. (Issue #2660)
    • Fix crash if SHOW_INDEX_PAGE_NAVIGATION is True while INDEXES_STATIC is False. (Issue #2654)
    • Make NEW_POST_DATE_PATH follow rrule if it exists (Issue #2653)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.3(Jan 13, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.3. This is an emergency bugfix release, which fixes a bug that prevented nikola new_page from working. There has also been a minor change to post sorting order (won’t affect most sites). The wheel packages have also been fixed (they now exist for Python 2 and 3, with correct doit versioning).

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter (IPython) Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    Features

    • Sort posts chronologically with one unified function (easier to change). (Issue #2627)
    • Sort posts in the following order (most important last): source path (A-Z), title (A-Z), date (reverse chronological order), priority meta number (descending). (Issue #2627)

    Bugfixes

    • Fix a bug that prevents nikola new_page from working (Issue #2631)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.2(Jan 8, 2017)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.2. It adds a ton of new features, while also fixing some bugs.

    Key Changes

    • A rewrite of all taxonomies (tags, categories, sections, etc.) in a generic fashion, allowing for much greater flexibility (by Felix Fontein) — adds new settings, enables new features (CREATE_ARCHIVE_NAVIGATION) and customizability
    • Automatic cration of year/month/day directory structures (NEW_POST_DATE_PATH)
    • Ability to sort posts from within templates (sort_posts)
    • API changes for post compilers (new compile, compile_string functions)
    • Addition of a generator meta tag to default themes — we hope you do not mind a bit of promotion for Nikola?

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter (IPython) Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    Minor API change: The compile_string compiler method (partially internal) now takes a post argument and returns between two and four values, adding shortcode_deps and shortcode support. See issues #2623 and #2624.

    Features

    • Add meta generator tag to default templates to promote Nikola (Issue #2619)
    • Add nikola new_post -d and NEW_POST_DATE_PATH to allow automatic creation of year/month/day (date-based) directory structures (Issue #2513)
    • Allow enabling pretty URLs with per-post setting (Issue #2613)
    • Add a sort_posts function (available as Jinja filter in global context), which allows general-purpose timeline sorting (Issue #2602)
    • Allow creating archive navigation (Issue #1639)
    • Accept a page argument for taxonomy paths (Issue #2585)
    • Query strings in magic links are passed as keyword arguments to path handlers (via Issue #2580)
    • Accept arbitrary arguments to path handlers (via Issue #2580)
    • Added new typogrify_oldschool filter (Issue #2574)
    • Improving handling of .dep files, and allowing compilers to specify additional targets for the render_posts task (Issue #2536)
    • render_template and generic_renderer can now create HTML fragments.
    • Allow posts to set custom URL_TYPE by using the url_type meta tag (useful for HTML fragments inserted using JavaScript)
    • Plugins can depend on other plugins being installed (Issue #2533)
    • The destination folder in POSTS and PAGES can now be translated (Issue #2116)
    • Pass post object and lang to post compilers (Issue #2531)
    • Pass url_type into template's context.
    • Make thumbnail naming configurable with IMAGE_THUMBNAIL_FORMAT.
    • There is a new plugin category Taxonomy which allows to easily create new taxonomies. All of the existing taxonomies (authors, archives, indexes, page index, sections, tags, and categories) have been converted to the new system. (Issue #2107)
    • Added CATEGORIES_INDEX_PATH, similar to TAGS_INDEX_PATH. (Issue #2567)
    • Made INDEX_PATH, RSS_PATH and AUTHOR_PATH translatable. (Issue #1914)
    • Added setting SHOW_INDEX_PAGE_NAVIGATION which enables a basic page navigation for indexes. (Issue #2299)
    • Added settings DISABLE_INDEXES_PLUGIN_INDEX_AND_ATOM_FEED and DISABLE_INDEXES_PLUGIN_RSS_FEED to disable specific parts of the classify_indexes taxonomy plugin. (Issue #2591)

    Bugfixes

    • Work around conflicts between posts and sections trying to render index.html files (via Issue #2613)
    • Make AUTHOR_PAGES_ARE_INDEXES really work (Issue #2600)
    • WordPress importer now correctly handles & etc. in tags. (Issue #2557)
    • If CODE_COLOR_SCHEME is empty, don’t generate code.css (Issue #2597)
    • Don’t warn about nikolademo DISQUS account when comments are disabled (Issue #2588)
    • Make data from global context available to templated shortcodes as global_data (Issue #2488)
    • Don't crash if plugins is a file (Issue #2539)
    • Don't mangle bare # links (Issue #2553)
    • generic_index_renderer now always produces output. It previously did not when the post list was empty and INDEXES_STATIC == False. (via Issue #2579)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.1(Oct 13, 2016)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.1. It fixes some bugs and adds new features.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter (IPython) Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    Bugfixes

    • Rename stories to pages in most of the codebase (Issue #1891)
    • Report missing/unknown dates in posts with filenames (Issues #2505, #2506)
    • Report filename of post that raised exception when scanning (Issue #2505)
    • Accept page and pages for the type field in post lists
    • Don’t crash if a post list has no posts (Issue #2489)

    Features

    • Add Hebrew translation by Yitzhak Bar Geva
    • Add Chinese (Traditional) zh_TW translation by Po-Wen Chi
    • Add nikola theme --list-installed (Issue #2504)
    • Add KATEX_AUTO_RENDER setting to configure math delimiters
    • Update KaTeX version to 0.6.0: support aligned math display
    • Better support for a tree of files in data/
    Source code(tar.gz)
    Source code(zip)
  • v7.8.0(Aug 29, 2016)

    On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.0. It fixes some bugs and adds new features.

    What is Nikola?

    Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown — and can even turn Jupyter (IPython) Notebooks into blog posts! It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed).

    Find out more at the website: https://getnikola.com/

    Downloads

    Install using pip install Nikola or download tarballs on GitHub and PyPI.

    Changes

    Features

    • Exposed gist as a shortcode (Issue #2459)
    • Always copy source files for listings (Issue #2473)
    • Detect dependencies in template strings (Issue #2455)
    • RSS feeds for sections (Issue #2068)
    • New data metadata that loads data from external files (Issue #2450)
    • Shortcode to escape to the template language (Issue #1227)
    • Added link to raw file in listings (Issue #1995)
    • New NO_DOCUTILS_TITLE_TRANSFORM (Issue #2382)
    • Update options of chart directive to Pygal 2.2.3
    • Pass global context to template shortcodes (Issue #2424)
    • Added new options --html2text and --transform-to-markdown to WordPress importer (Issue #2261)
    • Listing: guess the lexer if cannot be determined from the file name.
    • Read files from data/ and insert data in global context (Issue #2477)

    Bugfixes

    • Added link to sources in the output of listing directive (Issue #2472)
    • Fix Windows crash with calendar locales (Issue #2332)
    • Remove the (useless) <base> tag by default; change conf.py to opt in (Issue #2471)
    • Show tag descriptions when TAG_PAGES_ARE_INDEXES is True (Issue #2444)
    • Record template dependencies for post-list shortcut (Issue #2451)
    • Default to English for docutils messages if no translations exist (Issues #2422, #2437)
    Source code(tar.gz)
    Source code(zip)
Owner
Nikola, a static site generator
Nikola, a static site generator
A Python Static Website Generator

Version 0.8.9 Overview Hyde starter kit by merlinrebrovic is a really nice way to get started with hyde. Hyde layout for bootstrap by auzigog is also

Hyde - Static Website Generator 1.6k Feb 19, 2022
a static website generator to make beautiful customizable pictures galleries that tell a story

Prosopopee Prosopopee. Static site generator for your story. Make beautiful customizable pictures galleries that tell a story using a static website g

Bram 239 Feb 24, 2022
A static website generator for people who enjoy the simpler things in life.

A static website generator for people who enjoy the simpler things in life.

Darren Mulholland 84 Feb 19, 2022
Static site generator that supports Markdown and reST syntax. Powered by Python.

Pelican Pelican is a static site generator, written in Python. Write content in reStructuredText or Markdown using your editor of choice Includes a si

Pelican dev team 10.8k Feb 17, 2022
Static site generator for designers. Uses Python and Django templates.

News Cactus 3 is out! We're happy to announce Cactus 3. It brings a set of great new features like asset fingerprinting, an asset pipeline, pretty url

null 3.4k Feb 19, 2022
A simple static site generator with deployment to S3/Cloudfront.

Stasis A simple static site generator with deployment to S3/Cloudfront. Features Stasis is a static website generator written in Python, using Pandoc

Scott Czepiel 56 Aug 30, 2021
dirmaker is a simple, opinionated static site generator for quickly publishing directory websites.

dirmaker is a simple, opinionated static site generator for publishing directory websites (eg: Indic.page, env.wiki It takes entries from a YAML file and generates a categorised, paginated directory website.

Kailash Nadh 31 Jan 14, 2022
AutoLoader is a plugin for Pelican, a static site generator written in Python.

AutoLoader AutoLoader is a plugin for Pelican, a static site generator written in Python. AutoLoader is designed to autoload the other Pelican plugins

null 1 Oct 25, 2021
Kaktos is a python static site generator

Python static site generator κάκτος Kaktos is a python static site generator. The idea is create a simple static site generator for people that don't

Paulo Coutinho 3 Jan 14, 2022
barely is a lightweight, but highly extensible static site generator written in pure python.

barely is a lightweight, but highly extensible static site generator. Explore the docs » Quickstart · See available Plugins · Report Bug · Request Fea

null 36 Dec 29, 2021
A python-based static site generator for setting up a CV/Resume site

ezcv A python-based static site generator for setting up a CV/Resume site Table of Contents What does ezcv do? Features & Roadmap Why should I use ezc

Kieran Wood 3 Aug 28, 2021
A declarative website generator designed for high-quality websites, with a focus on easy maintenance and localization.

Grow Grow is a declarative tool for rapidly building, launching, and maintaining high-quality static HTML. Easy installation Jinja template engine Con

Grow 373 Feb 20, 2022
Hobby Project. A Python Library to create and generate static web pages using just python.

PyWeb ??️ ?? Current Release: 0.1 A Hobby Project ?? PyWeb is a small Library to generate customized static web pages using python. Aimed for new deve

Abhinav Sinha 2 Nov 18, 2021
The lektor static file content management system

Lektor Lektor is a static website generator. It builds out an entire project from static files into many individual HTML pages and has a built-in admi

Lektor CMS 3.5k Feb 18, 2022
Makes dynamic linked shit "static". Amazing

static.py What does it do? You give it a dynamically linked binary and it will make a directory that has all the dependencies (recursively). It also f

Stephen Tong 25 Nov 19, 2021
Simple Static Site Inductor Made in Python

sssimp ?? Simple Static Site Inductor Made in Python How to use Create a folder called input, inside create a folder called content and an empty file

Tina 8 Jan 19, 2022
Simple, lightweight, and magic-free static site/blog generator for Python coders

makesite.py Take full control of your static website/blog generation by writing your own simple, lightweight, and magic-free static site generator in

Sunaina Pai 1.6k Feb 15, 2022
A Python Static Website Generator

Version 0.8.9 Overview Hyde starter kit by merlinrebrovic is a really nice way to get started with hyde. Hyde layout for bootstrap by auzigog is also

Hyde - Static Website Generator 1.6k Feb 19, 2022
a static website generator to make beautiful customizable pictures galleries that tell a story

Prosopopee Prosopopee. Static site generator for your story. Make beautiful customizable pictures galleries that tell a story using a static website g

Bram 239 Feb 24, 2022
A static website generator for people who enjoy the simpler things in life.

A static website generator for people who enjoy the simpler things in life.

Darren Mulholland 84 Feb 19, 2022
This is a simple website crawler which asks for a website link from the user to crawl and find specific data from the given website address.

This is a simple website crawler which asks for a website link from the user to crawl and find specific data from the given website address.

Faisal Ahmed 1 Jan 10, 2022
Static Features Classifier - A static features classifier for Point-Could clusters using an Attention-RNN model

Static Features Classifier This is a static features classifier for Point-Could

ABDALKARIM MOHTASIB 1 Jan 25, 2022
Static site generator that supports Markdown and reST syntax. Powered by Python.

Pelican Pelican is a static site generator, written in Python. Write content in reStructuredText or Markdown using your editor of choice Includes a si

Pelican dev team 10.8k Feb 17, 2022
Static site generator that supports Markdown and reST syntax. Powered by Python.

Pelican Pelican is a static site generator, written in Python. Write content in reStructuredText or Markdown using your editor of choice Includes a si

Pelican dev team 10.8k Feb 21, 2022
Static site generator for designers. Uses Python and Django templates.

News Cactus 3 is out! We're happy to announce Cactus 3. It brings a set of great new features like asset fingerprinting, an asset pipeline, pretty url

null 3.4k Feb 19, 2022
Livemark is a static page generator that extends Markdown with interactive charts, tables, and more.

Livermark This software is in the early stages and is not well-tested Livemark is a static site generator that extends Markdown with interactive chart

Frictionless Data 79 Feb 19, 2022
A simple static site generator with deployment to S3/Cloudfront.

Stasis A simple static site generator with deployment to S3/Cloudfront. Features Stasis is a static website generator written in Python, using Pandoc

Scott Czepiel 56 Aug 30, 2021
dirmaker is a simple, opinionated static site generator for quickly publishing directory websites.

dirmaker is a simple, opinionated static site generator for publishing directory websites (eg: Indic.page, env.wiki It takes entries from a YAML file and generates a categorised, paginated directory website.

Kailash Nadh 31 Jan 14, 2022
AutoLoader is a plugin for Pelican, a static site generator written in Python.

AutoLoader AutoLoader is a plugin for Pelican, a static site generator written in Python. AutoLoader is designed to autoload the other Pelican plugins

null 1 Oct 25, 2021