Diango博客--6.Markdown 文章自動生成目錄

文章目錄

    • 0.思路引導
    • 1.在文中插入目錄
    • 2.在頁面的任何地方插入目錄
    • 3.美化標題的錨點 URL

0.思路引導

Markdown 在解析內容的同時還可以自動提取整個內容的目錄結構,本文內容將從以下幾個方面展開:
1)在文中插入目錄;
2)在頁面的任何地方插入目錄;
3)美化標題的錨點 URL。

1.在文中插入目錄

博客的 Post(文章)模型,其中 body 是我們存儲 Markdown 文本的字段:

文件位置:blog/models.py

from django.db import modelsclass Post(models.Model):# Other fields ...body = models.TextField()

再來回顧一下文章詳情頁的視圖,我們在 detail 視圖函數中將 post 的 body 字段中的 Markdown 文本解析成了 HTML 文本,然后傳遞給模板顯示
文件位置:blog/views.py

def detail(request, pk):post = get_object_or_404(Post, pk=pk)post.body = markdown.markdown(post.body,extensions=['markdown.extensions.extra','markdown.extensions.codehilite','markdown.extensions.toc',])return render(request, 'blog/detail.html', context={'post': post})

markdown.markdown() 方法把 post.body 中的 Markdown 文本解析成了 HTML 文本。同時我們還給該方法提供了一個 extensions 的額外參數。其中 markdown.extensions.toc 就是自動生成目錄的拓展。

在渲染 Markdown 文本時加入了 toc 拓展后,就可以在文中插入目錄了。方法是在書寫 Markdown 文本時,在你想生成目錄的地方插入 [TOC] 標記即可。

后臺輸入如下:
在這里插入圖片描述
效果展示如下:
在這里插入圖片描述

2.在頁面的任何地方插入目錄

上述方式的一個局限性就是只能通過 [TOC] 標記在文章內容中插入目錄。如果想在頁面的其它地方,比如側邊欄插入一個目錄該怎么做呢?只需要稍微改動一下解析 Markdown 文本內容的方式即可。

以detail.py中的模板標簽{% block toc %}為例,其渲染的位置位于詳情頁的側邊欄,現在想要在側邊欄中生成目錄。

{% block toc %}
...
{% endblock toc %}

需要修改的代碼如下:

文件位置:blog/views.py

def detail(request, pk):post = get_object_or_404(Post, pk=pk)md = markdown.Markdown(extensions=['markdown.extensions.extra','markdown.extensions.codehilite','markdown.extensions.toc',])post.body = md.convert(post.body)m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)post.toc = m.group(1) if m is not None else ''return render(request, 'blog/detail.html', context={'post': post})

文件位置:detail.html

{% block toc %}{% if post.toc %}<div class="widget widget-content"><h3 class="widget-title">文章目錄</h3><div class="toc"><ul>{{ post.toc|safe }}</ul></div></div>{% endif %}
{% endblock toc %}

在這里,我們沒有直接用 markdown.markdown() 方法來渲染 post.body 中的內容,而是先實例化了一個 markdown.Markdown 對象 md,和 markdown.markdown() 方法一樣,也傳入了 extensions 參數。

接著我們便使用該實例的 convert 方法將 post.body 中的 Markdown 文本解析成 HTML 文本。而一旦調用該方法后,實例 md 就會多出一個 toc 屬性,這個屬性的值就是內容的目錄,我們把 md.toc 的值通過整個表達式的處理,賦給 post.toc 。

注意:為了防止文章目錄為空的情況,使用正則表達式來測試 ul 標簽中是否包裹有元素,從而來確定是否存在目錄。并使用新的模板標簽 {% if %},來對post.toc做條件判斷。

效果展示如下:
在這里插入圖片描述

3.美化標題的錨點 URL

文章內容的標題被設置了錨點,點擊目錄中的某個標題,頁面就會跳到該文章內容中標題所在的位置,這時候瀏覽器的 URL 顯示的值可能不太美觀,比如像下面的樣子:
在這里插入圖片描述
#1_1 就是錨點,Markdown 在設置錨點時利用的是標題的值,由于通常我們的標題都是中文,Markdown 沒法處理,所以它就忽略的標題的值,而是簡單地在后面加了個1 _1 這樣的錨點值。為了解決這一個問題,需要修改一下傳給 extentions 的參數,其具體做法如下:

文件位置:blog/views.py

from django.utils.text import slugify
from markdown.extensions.toc import TocExtensiondef detail(request, pk):post = get_object_or_404(Post, pk=pk)md = markdown.Markdown(extensions=['markdown.extensions.extra','markdown.extensions.codehilite',# 記得在頂部引入 TocExtension 和 slugifyTocExtension(slugify=slugify),])post.body = md.convert(post.body)m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)post.toc = m.group(1) if m is not None else ''return render(request, 'blog/detail.html', context={'post': post})

和之前不同的是,extensions 中的 toc 拓展不再是字符串 markdown.extensions.toc ,而是 TocExtension 的實例。

TocExtension 在實例化時其 slugify 參數可以接受一個函數,這個函數將被用于處理標題的錨點值。

Markdown 內置的處理方法不能處理中文標題,所以我們使用了 django.utils.text 中的 slugify 方法,該方法可以很好地處理中文。

效果展示如下:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452505.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452505.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452505.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java中對象和引用的理解

2019獨角獸企業重金招聘Python工程師標準>>> 偶然想起Java中對象和引用的基本概念&#xff0c;為了加深下對此的理解和認識&#xff0c;特地整理一下相關的知識點&#xff0c;通過具體實例從兩者的概念和區別兩方面去更形象的認識理解&#xff0c;再去記憶。12一、對…

android怎樣封裝,如何封裝屬于自己的博客網站安卓APP 源碼家園

說實話我今天在寫這個文章的時候是我使用易語言(E4A\易安卓)的第一天&#xff0c;我也是易小白&#xff0c;但是的確可以用&#xff01;我為什么寫這個文章呢&#xff1f;因為之前我也想封裝自己的網站&#xff0c;然后去網上找的在線封裝生成APP&#xff0c;果然能封裝好了&am…

程序員常犯的5個非技術性錯誤

一個好的軟件開發人員需要培養兩種技能&#xff1a;技術技能和非技術技能。不幸的是一些開發者只注重技術的部分&#xff0c;以致養成一些陋習&#xff0c;下面是最常犯的5個非技術性錯誤&#xff1a; 0. 缺乏自律 Jim Rohn曾經說過&#xff1a;自律是目標和成果之間的橋梁。我…

Redis進階實踐之二十 Redis的配置文件使用詳解

一、引言   寫完上一篇有關redis使用lua腳本的文章&#xff0c;就有意結束Redis這個系列的文章了&#xff0c;當然了&#xff0c;這里的結束只是我這個系列的結束&#xff0c;但是要學的東西還有很多。但是&#xff0c;好多天過去了&#xff0c;總是感覺好像還缺點什么…

web流程設計器 工作流的 整合視頻教程 activiti畫圖 SSM和獨立部署

本視頻為activiti工作流的web流程設計器整合視頻教程整合Acitiviti在線流程設計器(Activiti-Modeler 5.21.0 官方流程設計器&#xff09;本視頻共講了兩種整合方式1. 流程設計器和其它工作流項目分開部署的方式2. 流程設計器和SSM框架項目整合在一起的方式視頻大小 1.13 GB ~【…

Diango博客--7.自動生成文章摘要

文章目錄0.思路引導1.方法一&#xff1a;覆寫 save 方法2.方法二&#xff1a;使用 truncatechars 模板過濾器0.思路引導 博客文章的模型有一個 excerpt 字段&#xff0c;這個字段用于存儲文章的摘要。 若在 django admin 后臺手動為文章輸入摘要&#xff0c;每次手動輸入摘要…

android 增加觸摸范圍,android seekBar 增加點擊和滑動范圍

seekBar的的范圍有限&#xff0c;有時候設計師要求高度為4dp&#xff0c;此時范圍太小&#xff0c;很難滑動成功。因此&#xff0c;我們需要在不改變 UI 的前提下&#xff0c;增加點擊和滑動范圍。直接上代碼&#xff1a;public class MainActivity extends AppCompatActivity …

特斯拉股價暴跌,瘋狂燒錢是否真的能夠帶來高額回報?

“瘋狂燒錢”并不能成為公司持續虧損的理由&#xff0c;反而可能成為公司升級轉型的關鍵所在。 上周三&#xff0c;特斯拉發布第四季度財報&#xff0c;其后特斯拉CEO馬斯克在電話會議上表示&#xff0c;特斯拉虧損收窄&#xff0c;營收同比增長88%&#xff0c;但與此同時其首…

android gravity參數,Gravity - [ Android中文手冊 ] - 在線原生手冊 - php中文網

Gravity版本&#xff1a;Android 4.0 r1結構繼承關系public class Gravity extends Objectjava.lang.Objectandroid.view.Gravity類概述用來在一個更大容器中布置對象的標準常量和工具。常量public static final intAXIS_CLIP原始位控制右/底邊界是否被剪切到它的容器中&#x…

Diango博客--8.解鎖博客側欄

文章目錄0.思路引導1.[最新文章] 模板標簽2.[歸檔] 模板標簽3.[分類] 模板標簽4.[標簽云] 模板標簽5.使用自定義的模板標簽0.思路引導 博客側邊欄有四項內容&#xff1a;最新文章、歸檔、分類和標簽云&#xff0c;效果展示如下&#xff1a; 這些內容相對比較固定和獨立&…

十五、詳述 IntelliJ IDEA 插件的安裝及使用方法

正文 首先&#xff0c;進入插件安裝界面&#xff1a; Mac&#xff1a;IntelliJ IDEA -> Preferences -> Plugins;Windows&#xff1a;File -> Settings -> Plugins.標注 1&#xff1a;顯示 IntelliJ IDEA 的插件分類&#xff0c; All plugins&#xff1a;顯示 Inte…

編程巨星的唯一秘訣

別以為是那些軟件開發定律&#xff0c;別以為是開發出那些特殊用途的軟件&#xff0c;別以為是軟件設計技術本身。只有一條真理決定了一個軟件程序員的成功還是失敗。由于堅持這個真理&#xff0c;一個資深的程序員能在一天的時間里學會一門新的編程語言&#xff0c;而由于不堅…

面向數據流的設計方法

面向數據流的設計方法的目標是給出設計軟件結構的一個系統化的途徑。 在軟件工程的需求分析階段&#xff0c;信息流是一個關鍵考慮。通常用數據流圖描繪信息在系統中加工和流動的 情況。面向數據流的設計方法定義了一些不同的“映射”&#xff0c;利用這些映射可以把數據流圖…

AI研究的盲點:無解的神經網絡內在邏輯

論人工神經網絡內在邏輯的研究歷史及現狀。 伴隨著大數據&#xff0c;人工智能&#xff08;AI&#xff09;在沉寂了多年之后&#xff0c;又迎來了新的高潮。在這場涉及大部分科學的革命中&#xff0c;人工神經網絡釋放了人工智能&#xff08;AI&#xff09;。但科學家們發現&a…

Diango博客--9.歸檔、分類和標簽頁

文章目錄0.思路引導1.回顧2.歸檔頁面3.分類頁面4.標簽頁面0.思路引導 側邊欄已經正確地顯示了最新文章列表、歸檔、分類、標簽等信息&#xff0c;現在來完善歸檔、分類和標簽功能。 當用戶點擊歸檔下的某個日期、分類欄目下的某個分類或者標簽欄目下的某個標簽時&#xff0c;…

android studio1.2.6,1.2.2 使用Android Studio開發Android APP | 菜鳥教程

寫在前面本節將介紹如何使用Android Studio開發Android APP&#xff0c;和前面Eclipse ADT SDK搭建Android開發環境一樣&#xff0c;本節也只是介紹一些基本東西&#xff0c;深入的&#xff0c;比如快捷鍵&#xff0c;小技巧等會再另一篇文章中詳細地介紹&#xff01;1.下載A…

軟件工程中的啟發規則

1.改進軟件結構提高模塊獨立性 2. 模塊規模應該適中 3.深度、寬度、扇出和扇入都應適當 4.模塊的作用域應該在控制域之內 5.力爭降低模塊接口的復雜程度 6.設計單入口單出口的模塊 7.模塊功能應該可以預測

C#指南,重溫基礎,展望遠方!(4)表達式

表達式是在操作數和運算符的基礎之上構造而成。 表達式的運算符指明了向操作數應用的運算。 運算符的示例包括 、-、*、/ 和 new。 操作數的示例包括文本、字段、局部變量和表達式。 如果表達式包含多個運算符&#xff0c;那么運算符的優先級決定了各個運算符的計算順序。 例如…

UPS開始嘗試“貨車+無人機”的投遞方式,不必再擔心快遞員離職了

繼亞馬遜“空中倉庫”&#xff0c;無人機送貨再現新形式。 作為世界上最大的快遞承運商與包裹遞送公司&#xff0c;UPS當然也沒有放過“送貨無人機”這一新穎業務。與亞馬遜推出“空中倉庫”的理念類似&#xff0c;UPS并沒有選擇讓無人機從倉庫直接起飛&#xff0c;而是將之與…