Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
nbanyan edited this page Oct 17, 2024 · 30 revisions

A collection of user submitted snippets to customize your MkDocs site in various ways. Please add your own.

Bold H2 titles in the menu

Submitted by @yPhil.

li.toctree-l2 > a:link,
li.toctree-l2 > a:visited {
  font-weight: bold;
  color: #404040;
  margin-left: -6px;
}

Then, all the H2/level two "## Chapter title" entries will be more clearly identified as actual chapters of your text.

Dark Theme Syntax Highlighting

Submitted by @grbd in #821.

First create a css file to remove the border and make the background transparent for code blocks, this is needed for dark themes.

docs\css\highlight-fix.css

pre {
  background-color: transparent;
  border: none;
}

code {
  background-color: transparent;
}

Next edit mkdocs.yml to add a section to tweak the css

extra_css:
    - css/highlight-fix.css

To use custom highting themes grab the css of one you like from https://highlightjs.org/static/demo/ (for example Atelier Cave Dark for a dark theme) paste it into a file such as highlight-custom.css

Then also add this to the extra_css section

extra_css:
    - css/highlight-fix.css
    - css/highlight-custom.css

Replace JavaScript code highlighting with Pygments

See #1019. TODO: Flesh this out...

Add Support for Checkbox Lists

As suggest in #748

Install the Pymdown Tasklist Extension

pip install --upgrade pymdown-extensions

Enable the extension in your mkdown.yml config file:

markdown_extensions:
    - pymdownx.tasklist

Add some CSS to style your task lists by creating a css/custom.css file:

.task-list-item {
  list-style-type: none;
}

.task-list-item input {
  margin: 0 4px 0.25em -20px;
  vertical-align: middle;
}

And add that file to your mkdocs.yml config file:

extra_css:
    - css/custom.css

Associate github page with current mkdoc page

Add an extra js to enable: when click the "git" button, go to the github page corresponding with current page. It is like a wiki page -- when you want to modify something, go to do it.

add extra.js in your docs dir like below:

$(document).ready(function(){
    var git = 'http://github.com/<your github account>/<your repo name>/edit/master/docs'
    var t1 = window.location.pathname
    var url = null
    if (t1=='/'){
        url = git + '/index.md'
    }else{
        url = git+t1.substr(0, t1.length-1)+'.md'
    }   
    a_git = $('[href="https://github.com/<your github account>/<your repo name>"]')
    a_git.attr('href', url).attr('target', '_blank')
})

modify mkdocs.yml to enable:

extra_javascript: [extra.js]

Remove the "Table of Contents" sidebar from the mkdocs theme.

Note: This only works on version 0.16 or later.

Adjacent to your mkdocs.yml config file and the docs directory, add a new directory custom_theme (or whatever name you choose). Then edit the mkdocs.yml file to point to it:

theme: mkdocs
theme_dir : custom_theme

With the release of version 1.0, the syntax has changed (see: https://www.mkdocs.org/about/release-notes/#theme_dir-configuration-option-fully-deprecated):

theme:
    name: mkdocs
    custom_dir: custom_theme

Note that we need to explicitly name the parent theme (via theme: mkdocs) or MkDocs will assume a complete theme is contained in the theme_dir. Instead we will only be overriding a small part of the parent theme.

Finally, create a new file custom_theme/main.html and add the following to it:

{% extends "base.html" %}

{% block content %}
    <div class="col-md-12" role="main">{% include "content.html" %}</div>
{% endblock %}

That's it. The new content block will replace the content block defined in the mkdocs theme with one which does not insert the TOC. Note that if you are using a different theme than the mkdocs theme, the above may need to be adapted to work with your theme.

Add Open graph and Twitter Card

Note: You can use mkdocs and mkdocs-bootswatch, but some themes may not.

Overwrite the theme in the same way as above.

mkdocs.yml:

theme:
    name: mkdocs
    custom_dir: custom_theme

custom_theme/main.html:

{% extends "base.html" %}

{% block extrahead %}
  {% set title = config.site_name %}
  {% if page and page.title and not page.is_homepage %}
    {% set title = page.title ~ " - " ~ config.site_name | striptags %}
  {% endif %}
  {% set description = config.site_description %}
  {% if page and page.meta.description %}
    {% set description = page.meta.description %}
  {% endif %}
  {% set image = config.site_url ~ 'ogp.png' %}
  {% if page and page.meta.image %}
    {% set image = config.site_url ~ page.meta.image %}
  {% endif %}
<meta property="og:type" content="website">
<meta property="og:title" content="{{ title }}">
<meta property="og:description" content="{{ description }}">
<meta property="og:url" content="{{ page.canonical_url }}">
<meta property="og:image" content="{{ image }}">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ title }}">
<meta name="twitter:description" content="{{ description }}">
<meta name="twitter:image" content="{{ image }}">
{% endblock %}

The default image is (docs/) ogp.png. It can be changed page by page using the image of front matter.

Add *apple-touch-icon.png`

Note: You can use mkdocs and mkdocs-bootswatch, but some themes may not.

Overwrite the theme in the same way as above.

mkdocs.yml:

theme:
    name: mkdocs
    custom_dir: custom_theme

custom_theme/main.html:

{% extends "base.html" %}

{% block extrahead %}
 <link rel="apple-touch-icon" sizes="256x256" href="/img/apple-touch-icon.png">
{% endblock %}

Place it in (docs)/img/apple-touch-icon.png. (It's the same place as favicon.ico. Does not consider the project page!)
This size is 256x256 pixels. Please change if necessary.

Lightbox Add-on using theme_dir

See the example repo for a complete working example. Details are provided in the README.

Implementing the Abbreviation Extension's Glossary Option

This hook reads the file /includes/abbreviations.yaml into a dictionary and then inserts it into the MkDocs configuration for abbr's glossary option. You can change the file path (abbr_path) to fit your needs.

abbr_import.py:

"""
Import a glossary to the abbreviations plugin by reading a YAML file
and passing it to the `glossary` option for `abbr`.

This option is added in Python Markdown 3.7.
"""

import yaml
from mkdocs.config import Config
from pathlib import Path
from packaging.version import parse as parse_version
import markdown
import logging

log = logging.getLogger(f"mkdocs.plugins.{__name__}")

abbr_path = '/includes/abbreviations.yaml'


def on_config(config: Config, **kwargs):
    """Run when MkDocs parses the 'mkdocs.yml' file

    :param config: The MkDocs configuration object
    :type config: Config
    :return: The MkDocs configuration object
    :rtype: Config
    """
    try:
        if ('abbr' in config['markdown_extensions'] and
                parse_version(markdown.__version__) >= parse_version("3.7")):
            definitions_file = Path('..' + abbr_path)

            doc_folder = Path(config.data.get("docs_dir"))
            definitions_file = doc_folder.joinpath(definitions_file).resolve()

            # Load definitions from file
            with open(definitions_file, 'r', encoding='utf-8') as f:
                # importing the YAML file as a dictionary
                abbr_plugin = yaml.safe_load(f)
                if 'abbr' not in config['mdx_configs']:
                    config['mdx_configs']['abbr'] = {}

                # Because extensions are loaded again by Python Markdown
                # altering the MkDocs configuration for the extension
                # allows the glossary to be consistently applied.
                config['mdx_configs']['abbr']['glossary'] = abbr_plugin

                log.info('Loaded: ' + abbr_path)
    except FileNotFoundError:
        log.warning("Could not find " + abbr_path)

    return config

mkdocs.yaml:

hooks:
  - abbr_import.py

Clone this wiki locally

Morty Proxy This is a proxified and sanitized view of the page, visit original site.