aminho
aminho

Reputation: 565

Generate permalinks on header with python markdown library

I was wondering how to generate permalinks from the following markup, using python markdown library:

A header
========

A paragraph

The desired output would be something like

<span id="a-header"></span>
<h1>
  A header
  <a class="headerlink" title="Permalink to this headline" href="#a-header">¶</a>
</h1>
<p>A paragraph</p>

Answer:

Thanks @BlaXpirit (see answer)

Use headerid python markdown extension and input the following:

# A header [¶](#a-header) {#a-header}

A paragraph

This generates the following output:

<h1 id="a-header">
  A header
  <a href="#a-header">¶</a>
</h1>

Then use some css styling to get the common output, something like :

h1 a{visibility:hidden;}
h1:hover a{visibility:visible;}

Upvotes: 8

Views: 1921

Answers (3)

Keegan Skeate
Keegan Skeate

Reputation: 31

You can generate permalinks with the Table of Contents extension for Python-Markdown. The Python-Markdown documentation notes that when possible it is preferable to pass an instance of an extension rather than a string.

import markdown
from markdown.extensions.toc import TocExtension

markup = """
A header
========

A paragraph
"""

html = markdown.markdown(markup, extensions=[TocExtension(permalink=True)])
print(html)


configs = {'toc': {'permalink': True}}
html = markdown.markdown(markup, extensions=['toc'], extension_configs=configs)
print(html)

An answer to a different question shows how you can change the paragraph symbol by setting the permalink option to a string.

Upvotes: 1

applicative
applicative

Reputation: 8199

Pandoc associates a unique identifier to each header based on the rule you imagined: the id is the downcase heading, spaces replace by hyphens. This is used to generate optional tables of contents for HTML and LaTeX and other output formats. In HTML it automatically makes linkable ids and in particular can be used for internal cross references; the markdown syntax is:

 See the section on [header identifiers](#header-identifiers-in-html).

as we read in the user's guide at http://johnmacfarlane.net/pandoc/README.html#header-identifiers-in-html

Upvotes: 0

Oleh Prypin
Oleh Prypin

Reputation: 34116

Markdown in Python has an extension that does this.
It also lets you specify an id you like for the header, like this:

A header            {#a-header}
========

Upvotes: 1

Related Questions