django使用markdown将.md渲染成html

1. 安装markdown

pip install markdown

2. 创建一个django项目和用来测试markdown的app:

django_test_markdown

django-admin startproject django_test_markdown
cd django_test_markdown
python manage.py startapp test_markdown_app

2. 编写一个markdown的文件

如test.md

###1 首先使用Django写一个简单的网站
```
django-admin startproject django_test_markdown
cd django_test_markdown
python manage.py startapp test_markdown_app
```

(想知道我怎么在markdown中写markdown的吗? 在这一段之前加tab制表符即可。)

创建一个static/article文件夹放置这篇文章

现在项目的目录树为:

D:.
├─.idea
│  └─inspectionProfiles
├─django_test_markdown
│  └─__pycache__
├─static
│  └─article
├─templates
└─test_markdown_app
    └─migrations

3. 读取test.md 并显示。

3.1 在test_markdown_app应用中的views.py中加一个get_article()函数,如下:

from django.shortcuts import render
import markdown
import codecs
from django_test_markdown.settings import BASE_DIR

# Create your views here.

def get_article(request, article_name="test"):
    article_path = str(BASE_DIR)+"/static/article/"+article_name+".md"
    file = codecs.open(article_path, "r", encoding='utf-8')
    data = file.read()
    article = markdown.markdown(data,
        extensions=[
        # 包含 缩写、表格等常用扩展
        'markdown.extensions.extra',
        # 语法高亮扩展
        'markdown.extensions.codehilite',
        ])
    context = {'article': article}
    return render(request, "article.html",

3.2 在templates文件夹中添加一个article.html

article.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p>{{ article |safe }}</p>
</body>
</html>

3.3 在urls.py中添加一个导航

from django.contrib import admin
from django.urls import path
import test_markdown_app.views as test_markdown_app_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', test_markdown_app_views.get_article),
    path('article/<str:article_name>', test_markdown_app_views.get_article),
]

3.4 在settings.py中加一下static文件夹的位置,一会儿访问css要用

import os
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

4 在浏览器中输入127.0.0.1:8000即可看到效果

可以看到他的源代码为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p><h3>1 首先使用Django写一个简单的网站</h3>
<pre class="codehilite"><code>django-admin startproject blog
cd blog
python manage.py startapp my_blog
</code></pre></p>
</body>
</html>

说明markdown这个库成功把md的文字转换成了html,并且引入了一个class,名字叫做:"codehilite",这个就是用来给markdown设定不同css用的。

5.1 markdown简单的css设置

上面的实现代码看起来并不好看,所以加一个markdown的基本格式设置

样式表可以去这里下载:https://github.com/richleland/pygments-css

但是他的css很鬼畜,下了还不能用,还改改

你要是官方的操作就是先安装Pygments:pip install Pygments

然后使用命令:

pygmentize -S monokai -f html -a .codehilite > monokai.css

生成的css和他github上提供的css的唯一区别就是,css前边所有的.highlight 都改成了 .codehilite

例如:

.highlight .hll { background-color: #ffffcc }

改成了:

.codehilite .hll { background-color: #ffffcc }

仿佛是个**

所以你自己用代码改也行,不用安装那个鬼畜的东西

这里给你一个代码:

import os
import requests


'''
这里从github上的一个项目下载css,里面有好多你可以自己选择

项目地址:http://github.com/richleland/pygments-css/blob/master/native.css
'''

save_folder = "./css"
raw_css_folder = save_folder+"/raw"
refine_css_folder = save_folder+"/refine"

css_name = "native"

def mkdir(path):
    if os.path.exists(path) == False:
        os.mkdir(path)

def download_css():
    mkdir(raw_css_folder)
    url = "https://raw.githubusercontent.com/richleland/pygments-css/master/"+css_name+".css"
    response = requests.get(url, verify=False)
    file_path = raw_css_folder+"/"+css_name+".css"
    file = open(file_path, "w", encoding="utf-8")
    file.write(response.text)
    file.close()

def refine_css():
    mkdir(refine_css_folder)
    raw_css_path = raw_css_folder + "/" + css_name + ".css"
    refine_css_path = refine_css_folder+"/"+css_name+".css"
    if os.path.exists(raw_css_path) == False:
        print("download failed!")
        return
    raw_css_file = open(raw_css_path, "r", encoding="utf-8")
    raw_css_text = raw_css_file.readlines()
    raw_css_file.close()

    refine_css_file = open(refine_css_path, "w", encoding="utf-8")
    for i in range(len(raw_css_text)):
        refine_css_file.write(raw_css_text[i].replace(".highlight", ".codehilite"))
    refine_css_file.close()

if __name__ == '__main__':
    mkdir(save_folder)
    download_css()
    refine_css()

里边好多css你使用了可能没啥变化,多试几个吧。。

用法:

在article.html中引用我们的css

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/style/native.css">
</head>
<body>
{{ article |safe }}
</body>
</html>

然后效果图:

emmm 不好看,你自己去找吧,23333

5.2 markdown带语法高亮的css和js

使用的项目是:https://github.com/highlightjs/highlight.js#links

我的项目是传统的css加js,你要是vue的框架你去用vue

这个项目分两步:

第一 用Getting the Library那里的link把需要的css和js下载下来

推荐使用unpkg这个,别的我打不开

<link rel="stylesheet" href="https://unpkg.com/@highlightjs/[email protected]/styles/default.min.css">
<script src="https://unpkg.com/@highlightjs/[email protected]/highlight.min.js"></script>
<!-- and it's easy to individually load additional languages -->
<script src="https://unpkg.com/@highlightjs/[email protected]/languages/go.min.js"></script>

其中那个css是makrdown的样式,highlight.min.js是将没有样式的标签加上样式,go.min.js是关于go语言高亮适配的一个简单写法,可以参考他的写法适配自己想适配但默认缺没有适配的语言。

article.html最终: default.min.css -> markdown.min.css highlight.min.js -> markdown.highlight.min.js go.min.js -> markdown.go.min.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/css/markdown.min.css">
    <link rel="stylesheet" href="/static/css/katex.min.css">

</head>
<body style="font-size: 28px">
    {{ article |safe }}
</body>

<script defer src="/static/js/katex.min.js"></script>
<script defer src="/static/js/auto-render.min.js" onload="renderMathInElement(document.body);"></script>

<script src="/static/js/markdown.highlight.min.js"></script>
{#markdown.go.min.js is a simple example for you to apply for a new laugage #}
<script src="/static/js/markdown.go.min.js"></script>
<script src="/static/js/main.js"></script>

</html>

并且在view.py中的markdown配置时记得去掉高亮扩展,不用那个了。

from django.shortcuts import render
import markdown
import codecs
from django_test_markdown.settings import BASE_DIR

# Create your views here.

def get_article(request, article_name="test"):
    article_path = str(BASE_DIR)+"/static/article/"+article_name+".md"
    file = codecs.open(article_path, "r", encoding='utf-8')
    data = file.read()
    article = markdown.markdown(data,
        extensions=[
        # 包含 缩写、表格等常用扩展
        'markdown.extensions.extra',
        # 语法高亮扩展
        # 'markdown.extensions.codehilite',
        ])
    context = {'article': article}
    return render(request, "article.html", context)

关于markdown的导航是用toc扩展即可。'markdown.extensions.toc',

md = markdown.Markdown(
        extensions=[
            # 包含 缩写、表格等常用扩展
            'markdown.extensions.extra',
            # 语法高亮扩展
            # 'markdown.extensions.codehilite',
            # 目录
            'markdown.extensions.toc',
        ],
    )

渲染的时候类似于文章的写法写成:

<ul>  {{ toc|safe }} </ul>
文章目录