When writing a plugin for Nikola, it may be useful to
have a task that has to run another task. For instance, you may want to be able
to link to specific points on other pages, which requires parsing those pages
before the posts are rendered in the render_posts
task. If you’re developing
both tasks, this is fairly simple with the task_dep
parameter for the doit
task engine. However, if the task that must run later is already built in to
Nikola, you can’t set its task_dep
list.
Never fear though, there is a way out of this problem. The Nikola
BasePlugin
has a method to
inject_dependency
to a task. The signature of the
function is
inject_dependency(self, target, dependency)
The target
is the task where the dependency should be added, and the
dependency
is the task the target
should depend on. This method can be
called in the set_site
method that sets up your plugin. For example, something like
from nikola.plugin_categories import Task
class MyTask(Task):
name = 'my_task'
def set_site(self, site):
self.site = site
self.inject_dependency('render_posts', 'my_task')
super(self, MyTask).set_site(site)
def gen_tasks(self):
pass
Here, the MyTask
task was added as a dependency to the render_posts
task.
Note that the name of the task my_task
is used in the inject_dependency
function. Now, Nikola will run the plugin named my_task
before it runs the
built-in render_posts
plugin.