Skip to main content

Python Markdown extension to include local or remote files

Project description

Include extension for Python Markdown. It lets you include local or remote (downloadable) files into your markdown at your desired places.

This project is motivated by markdown-include and provides the same functionalities with some extras.

Inclusion for local file is by default recursive and for remote file non-recursive. You can change this behavior through configuration.

You should not use markdown-include along with this extension, choose either one, not both.

Syntax

General syntax: {!recurs_state file_path_or_url | encoding !}

The spaces are not necessary. They are just to make it look nice :) . No spaces allowd between {! and recurs_state

Examples:

  1. Simple: {! file_path_or_url !}
  2. With explicit encoding: {! file_path_or_url | encoding !}
  3. With recurs_state on: {!+ file_path_or_url !} or {!+ file_path_or_url | encoding !}. This makes the included file to be able to include other files. This is meaningful only when recursion is set to None. If it is set to False, this explicit recurs_state defintion can not force recursion. This is a depth 1 recursion, so you can choose which one to recurs and which one to not.
  4. With recurs_state off: {!- file_path_or_url !} or {!- file_path_or_url | encoding !}. This will force not to recurs even when recursion is set to True.

You can escape it to get the literal. For example, \{! file_path_or_url !} will give you literal {! file_path_or_url !} and \\\{! file_path_or_url !} will give you \{! file_path_or_url !}

You can change the syntax!!!

If you don't like the syntax you can change it through configuration.

There might be some complications with the syntax {!file!}, for example, conflict with markdown.extensions.attr_list which uses {:?something}. As the : is optional, a typical problem that occurs is this one:

A paragraph
{!our syntax!}

would produce:

<p syntax_="syntax!" _our="!our">A paragraph</p>

If you really want to avoid this type of collision, find some character sequence that is not being used by any extension that you are using and use those character sequences to make up the syntax.

See the configuration section for details

Install

Install from Pypi:

pip install mdx_include

Usage

text = r"""
some text {! some_file !} some more text {! some_more_file | utf-8 !}

Escaping will give you the exact literal \{! some_file !}

If you escape, then the backslash will be removed.

If you want the backslash too, then provide two more: \\\{! some_file !}
"""
md = markdown.Markdown(extensions=['mdx_include'])
html = md.convert(text)
print(html)

Configuration

Config param Default Details
base_path . The base path from which relative paths are normalized.
encoding utf-8 The file encoding.
allow_local True Whether to allow including local files.
allow_remote True Whether to allow including remote files.
truncate_on_failure True Whether to truncate the matched include syntax on failure. False value for both allow_local and allow_remote is treated as a failure.
recurs_local True Whether the inclusions are recursive on local files. Options are: True, False and None. None is a neutral value with negative default and overridable with recurs_state (e.g {!+file!}). False will permanently prevent recursion i.e you won't be able to override it with the recurs_state. True value is overridable with recurs_state (e.g {!-file!}).
recurs_remote False Whether the inclusions are recursive on remote files. Options are: True, False and None. None is a neutral value with negative default and overridable with recurs_state (e.g {!+file!}). False will permanently prevent recursion i.e you won't be able to override it with the recurs_state. True value is overridable with recurs_state (e.g {!-file!}).
syntax_left \{! The left boundary of the syntax. (Used in regex, thus escaped {)
syntax_right !\} The right boundary of the syntax. (Used in regex, thus escaped })
syntax_delim \| The delimiter that separates encoding from path_or_url. (Used in regex, thus escaped |)
syntax_recurs_on + The character to specify recurs_state on. (Used in regex)
syntax_recurs_off - The character to specify recurs_state off. (Used in regex)

Example with configuration

configs = {
            'mdx_include': {
                'base_path': 'mdx_include/test/',
                'encoding': 'utf-8',
                'allow_local': True,
                'allow_remote': True,
                'truncate_on_failure': False,
                'recurs_local': None,
                'recurs_remote': False,
                'syntax_left': r'\{!',
                'syntax_right': r'!\}',
                'syntax_delim': r'\|',
                'syntax_recurs_on': '+',
                'syntax_recurs_off': '-',
            },
        }

text = r"""
some text {! some_file !} some more text {! some_more_file | utf-8 !}

Escaping will give you the exact literal \{! some_file !}

If you escape, then the backslash will be removed.

If you want the backslash too, then provide two more: \\\{! some_file !}
"""
md = markdown.Markdown(extensions=['mdx_include'], extension_configs=configs)
html = md.convert(text)
print(html)

Examples

The following markdown:

Including a gist:

```python
{! https://gist.github.com/drgarcia1986/3cce1d134c3c3eeb01bd/raw/73951574d6b62a18b4c342235006ff89d299f879/django_hello.py !}
```

Writing the syntax literally: \{! file_path !}

You just escape it with a backslash.

\\\{! file_path !} -> this one will show the backslash before the syntax in HTML

will produce (with fenced code block enabled):

<p>Including a gist:</p>
<pre><code class="python"># -*- coding: utf-8 -*-

# Settings
from django.conf import settings


settings.configure(
    DEBUG=True,
    SECRET_KEY='secretfoobar',
    ROOT_URLCONF=__name__,
    MIDDLEWARE_CLASSES=(
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    )
)


# Views
from django.http import HttpResponse
from django.conf.urls import url


def index(request):
    return HttpResponse('&lt;h1&gt;Hello Word&lt;/h1&gt;')

# Routes
urlpatterns = (
    url(r'^$', index),
)


# RunServer
if __name__ == '__main__':
    from django.core.management import execute_from_command_line
    import sys

    execute_from_command_line(sys.argv)

</code></pre>

<p>Writing the syntax literally: {! file_path !}</p>
<p>You just escape it with a backslash.</p>
<p>\{! file_path !} -&gt; this one will show the backslash before the syntax in HTML</p>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mdx_include-1.0.4.tar.gz (7.6 kB view details)

Uploaded Source

Built Distribution

mdx_include-1.0.4-py3-none-any.whl (7.1 kB view details)

Uploaded Python 3

File details

Details for the file mdx_include-1.0.4.tar.gz.

File metadata

  • Download URL: mdx_include-1.0.4.tar.gz
  • Upload date:
  • Size: 7.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.5

File hashes

Hashes for mdx_include-1.0.4.tar.gz
Algorithm Hash digest
SHA256 1736595bbf0223b4695e53d28883f2b4004456fcf7b952c360811bcf5aaf7454
MD5 2e046b71af22162d3a32d8c1ee5b403f
BLAKE2b-256 c49a216bf9e7ed7e70d2e25d440be9c29a13adaa72132d3b622491a22e57f274

See more details on using hashes here.

File details

Details for the file mdx_include-1.0.4-py3-none-any.whl.

File metadata

  • Download URL: mdx_include-1.0.4-py3-none-any.whl
  • Upload date:
  • Size: 7.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.5

File hashes

Hashes for mdx_include-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 6c1818ca2b8a483d619f1891b5db475259691f02db7706a62d87584f31f079fb
MD5 bf2591e1e560e2e5c9919c1ffe6cc979
BLAKE2b-256 241f43fc85e76637156a0525f90b902f1a7459e2820dfe9b30d04906d0395848

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page