aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/headerid
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/headerid')
-rw-r--r--plugins/headerid/README.rst16
-rw-r--r--plugins/headerid/__init__.py1
-rw-r--r--plugins/headerid/headerid.py31
3 files changed, 48 insertions, 0 deletions
diff --git a/plugins/headerid/README.rst b/plugins/headerid/README.rst
new file mode 100644
index 0000000..7bfa402
--- /dev/null
+++ b/plugins/headerid/README.rst
@@ -0,0 +1,16 @@
+Pelican ``headerid`` plugin
+===========================
+
+This plugin adds an anchor to each heading so you can deep-link to headers.
+It is intended for formats such as reStructuredText that do not natively
+generate these anchors.
+
+The ``HEADERID_LINK_CHAR`` config can be set to use a different char from ``*``
+for anchor text.
+
+For Markdown, this plugin is less relevant since the Python-Markdown library
+includes a Table of Contents extension that will generate link anchors.
+To enable the ``toc`` extension, add a line similar to the following example
+to your Pelican settings file::
+
+ MD_EXTENSIONS = ["codehilite(css_class=highlight)", "extra", "toc"]
diff --git a/plugins/headerid/__init__.py b/plugins/headerid/__init__.py
new file mode 100644
index 0000000..423261c
--- /dev/null
+++ b/plugins/headerid/__init__.py
@@ -0,0 +1 @@
+from headerid import * \ No newline at end of file
diff --git a/plugins/headerid/headerid.py b/plugins/headerid/headerid.py
new file mode 100644
index 0000000..ee9d265
--- /dev/null
+++ b/plugins/headerid/headerid.py
@@ -0,0 +1,31 @@
+from pelican import readers
+from pelican.readers import PelicanHTMLTranslator
+from pelican import signals
+from docutils import nodes
+
+LINK_CHAR = '*'
+
+
+def init_headerid(sender):
+ global LINK_CHAR
+ char = sender.settings.get('HEADERID_LINK_CHAR')
+ if char:
+ LINK_CHAR = char
+
+def register():
+ signals.initialized.connect(init_headerid)
+
+
+ class HeaderIDPatchedPelicanHTMLTranslator(PelicanHTMLTranslator):
+ def depart_title(self, node):
+ close_tag = self.context[-1]
+ parent = node.parent
+ if isinstance(parent, nodes.section) and parent.hasattr('ids') and parent['ids']:
+ anchor_name = parent['ids'][0]
+ # add permalink anchor
+ if close_tag.startswith('</h'):
+ self.body.append(
+ '<a class="headerlink" href="#%s" title="Permalink to this headline">%s</a>' %
+ (anchor_name, LINK_CHAR))
+ PelicanHTMLTranslator.depart_title(self, node)
+ readers.PelicanHTMLTranslator = HeaderIDPatchedPelicanHTMLTranslator