django-markdown-view icon indicating copy to clipboard operation
django-markdown-view copied to clipboard

Serve .md pages as Django templates

Django Markdown View

.. image:: https://travis-ci.org/rgs258/django-markdown-view.svg?branch=master :target: https://travis-ci.org/rgs258/django-markdown-view

.. image:: https://coveralls.io/repos/github/rgs258/django-markdown-view/badge.svg?branch=master :target: https://coveralls.io/github/rgs258/django-markdown-view?branch=master

Serve .md pages as Django views.

This package aims to make it easy to serve .md files on Django sites.

.. contents:: Contents :depth: 5

.. note:: * This package needs tests, and to have Travis and Coveralls properly configured.

Installation

#. Install with pip install django-markdown-view.

#. Add 'markdown_view' to your INSTALLED_APPS settings.

.. code-block:: python

    INSTALLED_APPS = [
        ...,
        'markdown_view',
        ...
    ]

#. (OPTIONAL) Add MARKDOWN_VIEW_BASE_DIR or BASE_DIR to settings The dictionary of the application's base. See Settings_ below

For example, if settings are in config/settings/base.py, then:

.. code-block:: python

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))

Usage

Views


Use one of ``MarkdownView``,  ``LoggedInMarkdownView``, or ``StaffMarkdownView``
from ``markdown_view.views`` to serve a .md file

.. code-block:: python

    from markdown_view.views import StaffMarkdownView

    path('readme/',
        StaffMarkdownView.as_view(file_name='my_app/README.md'),
        name="readme"),

Settings

All settings are optional. See <markdown_view/constants.py>_ for the defaults.

  • MARKDOWN_VIEW_BASE_DIR and BASE_DIR

    When present, the value is taken as a location to append to the list of dirs that Django's django.template.utils.get_app_template_dirs will return when passed dirname="". This is used to locate .md files in the root of the project, e.g., a README.md file. Looks for BASE_DIR if MARKDOWN_VIEW_BASE_DIR is not found.

  • MARKDOWN_VIEW_LOADERS

    A list of loaders that locate .md files. The default list includes only markdown_view.loaders.MarkdownLoader which will by default try to load .md files from root directories in INSTALLED_APPS packages much the same as Django's django.template.loaders.app_directories.Loader looks to load from "templates".

  • MARKDOWN_VIEW_LOADER_TEMPLATES_DIR

    The name of the directories in INSTALLED_APPS packages in which to locate .md files. Defaults to "" in order to locate .md filed in the root directories.

  • MARKDOWN_VIEW_EXTENSIONS

    The extensions to enable. These extensions are enabled be default:

    • toc: generates a Table of Contents. If toc is removed from extensions, then MARKDOWN_VIEW_TEMPLATE_USE_TOC must be set to False.

    • tables: enables tables.

    • fenced_code: enables code blocks. If fenced_code is removed from extensions, then MARKDOWN_VIEW_TEMPLATE_USE_HIGHLIGHT_JS, which provides the highlighting for code blocks, can be disabled.

    • markdown_view.markdown_extensions.ImageExtension: makes images responsive in bootstrap4.

    See https://python-markdown.github.io/extensions/ and https://github.com/Python-Markdown/markdown/wiki/Third-Party-Extensions for more extensions.

    You can create your own extensions by following https://github.com/Python-Markdown/markdown/wiki/Tutorial-1---Writing-Extensions-for-Python-Markdown

  • MARKDOWN_VIEW_TEMPLATE

    The Django template that'll be used to render the HTML that is generated from the Markdown. Set your own template to style your pages. Context includes:

    • markdown_content: The HTML produced from the Markdown.

    • use_highlight_js: If highlight.js is enabled.

    • use_toc: If the table of contents should be rendered.

    • markdown_toc: A table of contents from the headers of the Markdown. Not set when use_toc is False.

    • page_title: A guess at a page title, for now it's the first row of the TOC. Not set when use_toc is False.

  • MARKDOWN_VIEW_TEMPLATE_USE_TOC

    Whether to render the TOC. If false, in the template context, use_toc is False and markdown_toc and page_title are not present.

  • MARKDOWN_VIEW_TEMPLATE_USE_HIGHLIGHT_JS

    Whether to load and activate the highlight.js library in the template.

Experimental Settings


* `MARKDOWN_VIEW_USE_REQUEST_CONTEXT`

    If the request context should be used as a base when creating the context with
    which to render the Markdown internally. This is because the Markdown is rendered
    once first in order to prepend it with `{% load static %}`.
    This is not well tested; YMMV.

* `MARKDOWN_VIEW_EXTRA_CONTEXT`

    Any extra context to send to the internal render of the Markdown. Can be used
    to expose context to template tags embedded in the Markdown.
    This is not well tested; YMMV.


Implementation
--------------

At a high level, `MarkdownView` will:

#. Use a template loader to locate `.md` given as `file_name`

#. Render as a template, the contents of the `.md` file prepended with
   `{% load static %}`, into several context variables

#. Serve the `MARKDOWN_VIEW_TEMPLATE` with the context variables

Release Notes and Contributors
------------------------------

* `Release notes <https://github.com/rgs258/django-markdown-view/releases>`_
* `Our wonderful contributors <https://github.com/rgs258/django-markdown-view/graphs/contributors>`_

Contributing
------------

All contributions are very welcomed. Propositions, problems, bugs, and
enhancement are tracked with `GitHub issues`_ and patches are submitted
via `pull requests`_.

We use `Travis`_ coupled with `Coveralls`_ as continious integration tools.

.. _`GitHub issues`: https://github.com/rgs258/django-markdown-view/issues
.. _`pull requests`: https://github.com/rgs258/django-markdown-view/pulls
.. _Travis: https://travis-ci.org/github/rgs258/django-markdown-view
.. _Coveralls: https://coveralls.io/github/rgs258/django-markdown-view

Requirements
------------

We aspire to support the currently supported versions of Django.

**The Tested With section describes aspirational goals.**

Tested with:

* Python: 3.6, 3.7, 3.8, 3.9, 3.10
* Django: 2.2, 3.2, 4.0