Provides syntax for Python-Markdown which allows for the inclusion of the contents of other Markdown documents.

Overview

Markdown-Include

This is an extension to Python-Markdown which provides an "include" function, similar to that found in LaTeX (and also the C pre-processor and Fortran). I originally wrote it for my FORD Fortran auto-documentation generator.

Installation

This module can now be installed using pip.

pip install markdown-include

Usage

This module can be used in a program in the following way:

import markdown
html = markdown.markdown(source, extensions=['markdown_include.include'])

The syntax for use within your Markdown files is {!filename!}. This statement will be replaced by the contents of filename. Markdown-Include will work recursively, so any included files within filename will also be included. This replacement is done prior to any other Markdown processing, so any Markdown syntax that you want can be used within your included files. Note that this is a change from the previous version. It was felt that this syntax was less likely to conflict with any code fragments present in the Markdown.

By default, all file-names are evaluated relative to the location from which Markdown is being called. If you would like to change the directory relative to which paths are evaluated, then this can be done by specifying the extension setting base_path.

Configuration

The following settings can be specified when initialising the plugin.

  • base_path: Default location from which to evaluate relative paths for the include statement. (Default: the run-directory.)
  • encoding: Encoding of the files used by the include statement. (Default: utf-8.)
  • inheritHeadingDepth : If true, increases headings on include file by amount of previous heading. Combiens with headingOffset option, below. (Default: False.)
  • headingOffset: Increases heading depth by a specific ammount, in addition to the inheritHeadingDepth Option. (Default: 0)
  • throwException: When true, if the extension is unable to find an included file it will throw an exception which the user can catch. If false (default), a warning will be printed and Markdown will continue parsing the file.

Examples

An example of setting the base path and file encoding is given below:

import markdown
from markdown_include.include import MarkdownInclude

# Markdown Extensions
markdown_include = MarkdownInclude(
    configs={'base_path':'/srv/content/', 'encoding': 'iso-8859-1'}
)
html = markdown.markdown(source, extensions=[markdown_include])

Included files can inherit the heading depth of the location inheritHeadingDepth, as well as receive a specific offset, headingOffset For example, consider the files

Source file
# Heading Level 1 of main file

{!included_file.md!}

## Heading Level 2 of main file

{!included_file.md!}

and included_file.md

# This heading will be one level deeper from the previous heading
More included file content.
End of included content.

Then running the script

import markdown
from markdown_include.include import MarkdownInclude

# Markdown Extensions
markdown_include = MarkdownInclude(
    configs={'inheritHeadingDepth':True}
)
html = markdown.markdown(source, extensions=[markdown_include])

produces

<p>Source file</p>
<h1>Heading Level 1 of main file</h1>
<h2>This heading will be one level deeper from the previous heading</h2>
<p>More included file content.</p>
<p>End of included content.</p>
<h2>Heading Level 2 of main file</h2>
<h3>This heading will be one level deeper from the previous heading</h3>
<p>More included file content.</p>
<p>End of included content.</p>

ChangeLog

Version 0.6.0

  • Added ability ot offset headers in the included file so they fall under the header level in which the include occurs
  • Add option to throw exception when can't find an include file (instead of printing a warning)
  • Fixed stripping of last character in file, so only occurs if it is a new-line
  • Some behind-the-scenes improvement to code and documentation

Version 0.5.1

Bugfix for a syntax error.

Version 0.5

Corrected some errors in documentation and merged in commits of diegobz to add support for encoding and tidy up the source code.

Version 0.4

Fixed problem related to passing configurations to the extension.

Version 0.3

Added support for Python 3.

Version 0.2

Changed the API to be less likely to conflict with other syntax.

Version 0.1

Initial release.

Comments
  • sdist is missing on PyPI for 0.7.0

    sdist is missing on PyPI for 0.7.0

    Currently there is only a wheel on PyPI for version 0.7.0, but no sdist. For packaging this project on conda-forge it would be nice to have an sdist as well

    cc @hadim

    opened by awvwgk 6
  • Extension is not context aware

    Extension is not context aware

    Not sure this is actually a bug, I can see how this is "works as designed" but might be problematic.

    The intended use of the include string is "place the string somewhere and there it will include the referenced file". The problem is that if you place the string inside a code block (inline, fenced doesn't matter) to demonstrate how it is used it will process the string regardless. For an existing file you will simply get the file included at the location of the string, for a non-existing file there will be a warning.

    So it's impossible to use the include string inside a code block. You can encode the braces with HTML characters outside of a code block to make an example but everything else won't work. I'm trying to teach my users how to use the extension and it breaks consistency with the rest of my examples.

    opened by r0ckarong 5
  • The last character is always stripped from imported files

    The last character is always stripped from imported files

    markdown-include==0.5.1 seems to always strip the last character from files it includes. That's great when the last is a new line character \n, but less great when it's something else like the end of an html tag.

    See this example. Note how the trailing > has been stripped off the included file and the markdown is therefore messed up.

    import markdown
    from markdown_include.include import MarkdownInclude
    from devtools import debug
    
    included_file_content = """
    <b>this is a test</b>"""
    
    with open('docs/examples/error.html', 'w') as f:
        f.write(included_file_content)
    
    # Markdown Extensions
    markdown_include = MarkdownInclude(
        configs={'base_path': 'docs/examples/'}
    )
    
    src = """
    This is a test
    
    {!error.html!}
    
    and more afterwards.
    """
    html = markdown.markdown(src, extensions=[markdown_include])
    debug(html)
    """
    test.py:24 <module>
        html: (
            '<p>This is a test</p>\n'
            '<p><b>this is a test&lt;/b</p>\n'
            '<p>and more afterwards.</p>'
        ) (str) len=80
    """
    
    opened by samuelcolvin 4
  • Removed deprecated md_globals

    Removed deprecated md_globals

    markdown has removed this argument: https://github.com/Python-Markdown/markdown/blob/77fb7f1b51076becff488a9b42ef2883153262a0/docs/change_log/release-3.4.md#previously-deprecated-objects-have-been-removed

    opened by haochuanwei 3
  • Breaking my site with latest updates

    Breaking my site with latest updates

    I use this plugin on my site after upgrading

    - markdown_include.include:
          base_path: .
    

    The error I get is:

    mkdocs serve
    INFO     -  Building documentation...
    ERROR    -  Config value: 'markdown_extensions'. Error: MarkdownInclude.extendMarkdown() missing 1 required positional argument: 'md_globals'
    Aborted with 1 Configuration Errors!
    

    Output from requirements.txt file:

    click==8.1.3
    fontawesome-markdown @ https://github.com/bmcorser/fontawesome-markdown/archive/master.zip
    ghp-import==2.1.0
    gitdb==4.0.9
    GitPython==3.1.27
    importlib-metadata==4.12.0
    Jinja2==3.1.2
    livereload==2.6.3
    lunr==0.6.2
    Markdown==3.4.1
    markdown-include==0.6.0
    MarkupSafe==2.1.1
    mercurial==6.1.4
    mergedeep==1.3.4
    mkdocs==1.3.0
    mkdocs-autolinks-plugin==0.6.0
    mkdocs-git-revision-date-localized-plugin==1.1.0
    mkdocs-material==8.3.9
    mkdocs-material-extensions==1.0.3
    packaging==21.3
    pycurl==7.45.1
    Pygments==2.12.0
    pymdown-extensions==9.5
    pyparsing==3.0.9
    python-dateutil==2.8.2
    pytz==2022.1
    PyYAML==6.0
    pyyaml_env_tag==0.1
    six==1.16.0
    smmap==5.0.0
    tabulate==0.8.10
    tornado==6.2
    watchdog==2.1.9
    zipp==3.8.1```
    
    opened by SilentGlasses 3
  • OrderedDict Error in v0.6.0

    OrderedDict Error in v0.6.0

    The recent release has broken my documentation build

    Here is the relevant error message.

    /home/travis/build/D3DEnergetic/FIDASIM/docs/fidasim.md
    Traceback (most recent call last):
      File "/home/travis/virtualenv/python2.7.14/bin/ford", line 11, in <module>
        sys.exit(run())
      File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/ford/__init__.py", line 385, in run
        proj_data, proj_docs, md = initialize()
      File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/ford/__init__.py", line 141, in initialize
        extension_configs={'markdown_include.include': {'base_path': md_base}})
      File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/markdown/__init__.py", line 159, in __init__
        configs=kwargs.get('extension_configs', {}))
      File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/markdown/__init__.py", line 187, in registerExtensions
        ext.extendMarkdown(self, globals())
      File "/home/travis/virtualenv/python2.7.14/lib/python2.7/site-packages/markdown_include/include.py", line 58, in extendMarkdown
        md.preprocessors.register(IncludePreprocessor(md,self.getConfigs()), 'include', 101)
    AttributeError: 'OrderedDict' object has no attribute 'register'
    make: *** [docs] Error 1
    
    opened by lstagner 3
  • Fix error when including files without newlines

    Fix error when including files without newlines

    The last character of each line is being chipped off, so as to remove the newline character. But when working with files without any newlines, this chips off a significant character.

    This commit fixes this problem.

    opened by sharat87 3
  • Support multiple includes on one line

    Support multiple includes on one line

    I've got a potential use-case that populates a requirements table using includes, like this:

    Product | Operating System | Cloud Environments | Datacenter Environments --- | --- | --- | --- Product X | {! ./prod-x-os.md !} | {! ./prod-x-cloud.md !} | {! ./prod-x-dc.md !} Product Y | {! ./prod-y-os.md !} | {! ./prod-y-cloud.md !} | {! ./prod-y-dc.md !}

    markdown-include only matches first include on each line, so the above scenario doesn't work. In fact, in this example scenario, everything from the second include onward is actually lost.

    How do you feel about supporting multiple matches per line?

    opened by erilot 3
  • Using 'inheritHeadingDepth: True' in MkDocs config

    Using 'inheritHeadingDepth: True' in MkDocs config

    I have the markdown-include extension working with MkDocs, but when I try to add the inheritHeadingDepth: True config value, I get an error. I'm guessing I just don't have the config syntax right. Can anyone advise? Thanks :)

    From my mkdocs.yml

    markdown_extensions:
        - markdown_include.include:
            base_path: docs
            inheritHeadingDepth: True
    

    Config instructions: https://github.com/cmacmackin/markdown-include#configuration I have tried formatting the YML several different ways with no luck.

    Debug says:

    DEBUG   -  Config value: 'markdown_extensions' = [{}, u'extra', u'admonition', {}, u'sane_lists']
    

    And the error:

    ERROR   -  Config value: 'markdown_extensions'. Error: inheritHeadingDepth
    [E 190516 17:55:31 ioloop:801] Exception in callback <bound method type.poll_tasks of <class 'livereload.handlers.LiveReloadHandler'>>
        Traceback (most recent call last):
          File "c:\python27\lib\site-packages\tornado\ioloop.py", line 1229, in _run
            return self.callback()
          File "c:\python27\lib\site-packages\livereload\handlers.py", line 67, in poll_tasks
            filepath, delay = cls.watcher.examine()
          File "c:\python27\lib\site-packages\livereload\watcher.py", line 73, in examine
            func and func()
          File "c:\python27\lib\site-packages\mkdocs\commands\serve.py", line 107, in builder
            site_dir=site_dir
          File "c:\python27\lib\site-packages\mkdocs\config\base.py", line 210, in load_config
            "Aborted with {0} Configuration Errors!".format(len(errors))
        ConfigurationError: Aborted with 1 Configuration Errors!
    
    opened by mollieswenson 2
  • Use for...enumerate() instead of list.index() for a nice performance boost

    Use for...enumerate() instead of list.index() for a nice performance boost

    https://github.com/cmacmackin/markdown-include/blob/6bdd38511403bd77cfad83580ed21eeb3eed44c5/markdown_include/include.py#L70

    Changing the for loop around the whole list of lines to:

    for loc, line in enumerate(lines):
    

    and removing the loc = lines.index(line) call would improve performance.

    Unfortunately, list.index() is just a for loop in C that starts at the beginning each time it's called, on every line, over and over again getting worse on each call.

    opened by ssteinerx 2
  • How can I install this along with MkDocs?

    How can I install this along with MkDocs?

    Hello! I'm confused with the instructions in the README, I'm able to include this extension in MkDocs: markdown_extensions: [markdown_include.include] Now, I don't have an idea how to use this extension, Here what I want to achieve is to create a file name file.md with a content of:

    [URL1]: mydocs/file1.md
    [URL2]: mydocs/file2.md
    [URL3]: mydocs/file3.md
    

    then calling these relative paths from other markdown files like this:

    Here is the [link][URL1] 
    Here is the [link][URL2] 
    Here is the [link][URL3] 
    

    Is it possible? thanks in advance!

    opened by happicamper 2
  • Indented included source gets indented

    Indented included source gets indented

    Consider the following situation:

    === "source"
        ` ` `python
        {!my_source.py!}
        ` ` `
    

    and

    print('Hello, world!')
    

    Here we'd expect

    === "source"
        ` ` `python
        print('Hello, world!')
        ` ` `
    

    That is, every line of my_source.py gets as many tabs and spaces as many is leading the inclusion tag.

    This pull request enables this inclusion mode.

    opened by BarnabasSzabolcs 1
  • Including CommonMark-tables with inheritHeadingDepth renders the table as text

    Including CommonMark-tables with inheritHeadingDepth renders the table as text

    In my mkdocs project, I am using markdown-include and mkdocs-material.

    Let a top-level file be:

    # Some heading
    
    {!tables/Some_Table.md!}
    

    And let table/Some_Table.md be:

    The following table shows some data about whatever.
    
    | Some first column | Some second column | 
    | ----------------- | ------------------ |
    | Some text.        | Some more text.    |
    
    • With inheritHeadingDepth being false, the generated output will be some nice looking HTML-table.
    • With inheritHeadingDepth being true, the generated output will be the actual text, wrapped in <p> elements.

    Used versions:

    • mkdocs: 1.1.1
    • mkdocs-material: 6.2.8
    • markdown-include: 0.6.0
    • python: 3.8
    opened by sepulzera 0
  • inheritHeadingDepth should refer to the original including file's depth

    inheritHeadingDepth should refer to the original including file's depth

    With inheritHeadingDepth being true.

    Let a top-level file be:

    # Some first level heading
    
    {!sub/Subsection_1.md!}
    
    {!task/Subsection_2.md!}
    
    {!task/Subsection_3.md!}
    

    And let each task/Subection_X.md be:

    # Some heading <X>
    
    Some text.
    

    Then, I would expect the result to be:

    # Some first level heading
    
    ## Some heading 1
    
    Some text.
    
    ## Some heading 2
    
    Some text.
    
    ## Some heading 3
    
    Some text.
    

    But, the actual result is:

    # Some first level heading
    
    ## Some heading 1
    
    Some text.
    
    ### Some heading 2
    
    Some text.
    
    #### Some heading 3
    
    Some text.
    

    With the current implementation of inheritHeadingDepth, it is impossible to include several sections on the same level.

    Current workaround probably is to move the heading from the sections into the parent file.

    opened by sepulzera 0
  • Support source file including

    Support source file including

    This patch allows to automatically format source files (declared in the 'extensions' config option, where one can set a source file extension and a syntax highlighter synonym for that extension). I use it in mkdocs, where i set the following extensions:

        - markdown_include.include:
            base_path: docs
            extensions: 
                java: java
                py: python
                js: javascript
    

    Is there any chence for this to get merged? Or do you plan to support this independently from my work?

    opened by gaborantal 0
  • Links in included files have to be written like if they were in the parent including file

    Links in included files have to be written like if they were in the parent including file

    Hi,

    I'm having an issue with my includes because included files contains links.

    For instance I have the following structure and parameter base_path: docs:

    .
    ├── docs
    │   ├── Tutorials
    │   │   └── Examples
    │   │   │   ├── Example1.md
    │   │   │   ├── Example2.md
    │   │   │   └── Example3.md
    │   ├── global
    │   │   └── Postman.md
    │   ├── postman
    │   │   └── collection1.json
    └── mkdocs.yml
    

    NOTE: this is a simplified directory structure for the ticket, the real one is visible at https://github.com/hyperledger/besu-docs/

    Examples files all include the Postman.md file with the include syntax {!global/Postman.md!} relative to the docs base_path directory.

    The Postman.md includes some explanation and a link to the JSON file in the form [download the collection](/postman/collection1.json) for it to be valid when the HTML is compiles with MkDocs and put on the website. I'm forced to use / as I can't know where the include is going to be made and so I can't have a relative path like postman/collection1.json otherwise it will end up in having the file relative for example to Tutorials/Examples/Example1 and will point to Tutorials/Examples/Example1/postman/collection1.json which is not right.

    But the side effects of that are:

    1. I have to make sure the /postman/collection1.json is a valid link because for instance with ReadTheDocs, path includes /lang/version/ so I have to add a redirect from /postman/collection1.json to /lang/version/postman/collection1.json which is not convenient
    2. Link checker (is use the Node markdown-link-check but I guess all checkers will have the same issue) is failing on the link in the Postman.md file as it's valid only when included and compiles with MkDocs.
    3. I'm unable to navigate to the link in my markdown source using my IDE as the link is invalid before being compiled in HTML.
    4. Google indexed the Github repos and when people look at the Github rendered Postman.md file, the link is invalid as it tries to point to the root of my repos like https://github.com/me/myproject/blob/master/postman/collection1.json instead of https://github.com/me/myproject/blob/master/docs/postman/collection1.json

    My wish:

    Having the links in included files able to be written relatively to the included file then translated to the correct path once included would fix all this.

    For instance, when I include the link in my docs/global/Postman.md I would simply write [download the collection](../postman/collection1.json), which would be valid when not included and once included in docs/Tutorials/Examples/Example1.md it would be translated to [download the collection](../../postman/collection1.json) which would correctly go up by two levels as expected.

    The rendered HTML will have a valid relative path and the source markdown would be valid too whatever the context.

    I think it requires the rewriting of URL just after including and before rendering the HTML or whatever, but I don't see any drawbacks for the moment. Please tell me if you do.

    Thanks.

    opened by NicolasMassart 0
Releases(v0.8.0)
  • v0.8.0(Nov 23, 2022)

    What's Changed

    • multiple templates on one line by @Umaaz in https://github.com/cmacmackin/markdown-include/pull/27
    • ✨ Add support for specifying lines and line ranges by @tiangolo in https://github.com/cmacmackin/markdown-include/pull/31

    New Contributors

    • @Umaaz made their first contribution in https://github.com/cmacmackin/markdown-include/pull/27
    • @tiangolo made their first contribution in https://github.com/cmacmackin/markdown-include/pull/31

    Full Changelog: https://github.com/cmacmackin/markdown-include/compare/v0.7.2...v0.8.0

    Source code(tar.gz)
    Source code(zip)
  • v0.7.2(Nov 23, 2022)

  • v0.7.1(Nov 23, 2022)

    What's Changed

    • Automate publishing by @ZedThree in https://github.com/cmacmackin/markdown-include/pull/37

    New Contributors

    • @ZedThree made their first contribution in https://github.com/cmacmackin/markdown-include/pull/37

    Full Changelog: https://github.com/cmacmackin/markdown-include/compare/v0.7.0...v0.7.1

    Source code(tar.gz)
    Source code(zip)
  • v0.7.0(Jul 19, 2022)

  • v0.6.0(Aug 20, 2020)

    • Added ability ot offset headers in the included file so they fall under the header level in which the include occurs
    • Add option to throw exception when can't find an include file (instead of printing a warning)
    • Fixed stripping of last character in file, so only occurs if it is a new-line
    • Some behind-the-scenes improvement to code and documentation
    Source code(tar.gz)
    Source code(zip)
  • v0.5.1(Apr 26, 2015)

  • v0.5.0(Apr 21, 2015)

  • v0.4.2(Jan 27, 2015)

  • v0.4.1(Jan 21, 2015)

  • v0.3(Jan 20, 2015)

  • v0.2(Jan 17, 2015)

    This release is a change to the API. Now the include syntax is {!filename!}, which is felt to be less likely to conflict with any code fragments also present in a Markdown file.

    Source code(tar.gz)
    Source code(zip)
  • v0.1(Jan 12, 2015)

    This is the first release of Markdown-Include. It provides the basic functionality that is needed and runs in Python 2.7. This will be the only release for some time, unless I decide to write a Python 3 version as well or if the Markdown API changes substantially.

    Source code(tar.gz)
    Source code(zip)
Owner
Chris MacMackin
I am a research software engineer at the UK Atomic Energy Authority. I hold a PhD in Atmospheric, Oceanic, and Planetary Physics.
Chris MacMackin
Markdown Presentations for Tech Conferences, Training, Developer Advocates, and Educators.

March 1, 2021: Service on gitpitch.com has been shutdown permanently. GitPitch 4.0 Docs Twitter About Watch the Introducing GitPitch 4.0 Video Visit t

David Russell 5.4k Jan 05, 2023
😸Awsome markdown readme for your profile or your portfolio

GitHub Profile Readme Description That's a simple and minimalist README.md for your profile Usage You can download or copy to your repository and make

0 Jul 24, 2022
An interactive, terminal-based markdown presenter

lookatme lookatme is an interactive, extensible, terminal-based markdown presentation tool. TOC TOC Features Tour Navigating the Presentation CLI Opti

James Johnson 1.4k Jan 01, 2023
Convert mind maps to markdown for import into Roam.

Mind Map to Markdown for Roam import Got a Mind Map with contents you'd like to import into Roam? Soon, this Python application might do what just you

Romilly Cocking 3 Dec 09, 2021
Lightweight Markdown dialect for Python desktop apps

Litemark is a lightweight Markdown dialect originally created to be the markup language for the Codegame Platform project. When you run litemark from the command line interface without any arguments,

10 Apr 23, 2022
A super simple script which uses the GitHub API to convert your markdown files to GitHub styled HTML site.

A super simple script which uses the GitHub API to convert your markdown files to GitHub styled HTML site.

Çalgan Aygün 213 Dec 22, 2022
Rich-cli is a command line toolbox for fancy output in the terminal

Rich CLI Rich-cli is a command line toolbox for fancy output in the terminal, built with Rich. Rich-cli can syntax highlight a large number of file ty

Textualize 2.5k Jan 02, 2023
Livemark is a static page generator that extends Markdown with interactive charts, tables, and more.

Livermark This software is in the early stages and is not well-tested Livemark is a static site generator that extends Markdown with interactive chart

Frictionless Data 86 Dec 25, 2022
A markdown extension for converting Leiden+ epigraphic text to TEI XML/HTML

LeidenMark $ pip install leidenmark A Python Markdown extension for converting Leiden+ epigraphic text to TEI XML/HTML. Inspired by the Brill plain te

André van Delft 2 Aug 04, 2021
A markdown generation library for Python.

Welcome to SnakeMD SnakeMD is your ticket to generating Markdown in Python. To prove it to you, we've generated this entire README using SnakeMD. See

The Renegade Coder 22 Dec 08, 2022
A Python implementation of John Gruber’s Markdown with Extension support.

Python-Markdown This is a Python implementation of John Gruber's Markdown. It is almost completely compliant with the reference implementation, though

Python-Markdown 3.1k Dec 30, 2022
Mdut: a tool for generating Markdown URL tags

mdut mdut (pronounced "em-doot") is a tool for generating Markdown URL tags. It

Nik Kantar 2 Feb 17, 2022
A fast yet powerful Python Markdown parser with renderers and plugins.

Mistune v2 A fast yet powerful Python Markdown parser with renderers and plugins. NOTE: This is the re-designed v2 of mistune. Check v1 branch for ear

Hsiaoming Yang 2.2k Jan 04, 2023
Comprehensive Markdown plugin built for Django

Django MarkdownX Django MarkdownX is a comprehensive Markdown plugin built for Django, the renowned high-level Python web framework, with flexibility,

neutronX 740 Jan 08, 2023
Extensions for Python Markdown

PyMdown Extensions Extensions for Python Markdown. Documentation Extension documentation is found here: https://facelessuser.github.io/pymdown-extensi

Isaac Muse 685 Jan 01, 2023
Awesome Django Markdown Editor, supported for Bootstrap & Semantic-UI

martor Martor is a Markdown Editor plugin for Django, supported for Bootstrap & Semantic-UI. Features Live Preview Integrated with Ace Editor Supporte

659 Jan 04, 2023
A Straightforward Markdown Journal

Introducing Pepys: A straightforward markdown journal "It is rightly made for those who love to document their daily life events" - FOSSBytes Pepys is

Luke Briggs 23 Nov 12, 2022
Pure-python-server - A blogging platform written in pure python for developer to share their coding knowledge

Pure Python web server - PyProject A blogging platform written in pure python (n

Srikar Koushik Satya Viswanadha 10 Nov 07, 2022
Markdown journal template.

Markdown Journal Template Description This project contains a script which creates a markdown journal template for the current year by creating a mark

Stephen McAleese 2 Mar 06, 2022
Yuque2md - Offline download the markdown file and image from yuque

yuque2md 按照语雀知识库里的目录,导出语雀知识库中所有的markdown文档,并离线图片到本地 使用 安装 Python3.x clone 项目 下载依

JiaJianHuang 4 Oct 30, 2022