狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

使用語法高亮 Prism.js 讓你寫的代碼美化起來(以Vue3為例)

admin
2024年3月29日 10:9 本文熱度 718

tinymce編輯器界面

【tips】:tinymce是國外的一個功能超全開箱即用的富文本編輯器,他是一個開源的編輯器,除了基本的功能外還可以通過插件的形式拓展,插件也只需要簡單的添加插件名稱即可,插件分為開源插件和高級插件,其中高級插件功能需要付費,但開源的功能完全夠用,而且提供了多種主題選擇,還可以高度自定義編輯器樣式,可以在 Vue、React、Angular、Blazor、Svelte、Node+Express等多種環境中使用。

下載地址:https://prismjs.com/download.html

目錄

1.前臺展示tinymce編輯器編輯的內容時踩的坑

2.安裝PrimsJS代碼高亮庫

3.解決PrimsJS添加后代碼不高亮的問題

4.給代碼塊添加行號

5.PrimsJS代碼高亮的原理

一、前臺展示tinymce編輯器編輯的內容時踩的坑

最近做了一個小項目,該項目主要是將tinymce富文本編輯器編輯的內容在前臺展示,我很簡單的以為只需要用Vue的v-html解析就能正常展示了,像下面這樣

1. <template>

2.     <div class="article-wrapper">

3.         <template v-for="item in articleInfoData">

4.             <h2 class="title">{{ item.title }}</h2>

5.             <p class="desc" v-if="item.desc">摘要:{{ item.desc }}</p>

6.             <div class="content" v-html="item.content"></div>

7.             <p class="date">{{ item.created_at }}</p>

8.         </template>

9.     </div>

10.</template>

然而并沒有那么簡單,純文本編輯的內容可以正常渲染,但是代碼塊就是顯示純文本,代碼沒有高亮,就像下面這樣

這并非是我們所期待的,我們所期待的應該是下面這樣的,讓不同代碼更加突出展示

后來才發現代碼高亮是需要像prismjs這樣的庫來進行解析的,我們審查tinymce編輯器的代碼塊元素后會發現,pre->code標簽下他給代碼塊添加了好多標簽及樣式,但是

我們獲取到編輯器提交給后臺的數據捶⑾謕re->code標簽下就只有我們插入的代碼塊,就像下面這樣,

起初我還以是tinymce編輯器配置的問題,導致缺失了pre->code標簽下面的標簽及樣式,后來看完了tinymce官方文檔的配置也沒有找到類似的配置。

二、安裝Prismjs代碼高亮庫

后來在網上找到了代碼高亮庫prismjs并愉快的添加到了Vue3+Ts項目中

什么是prismjs

官方是這樣描述的,他是一個非常簡單快速可拓展且支持超多語言的輕量級代碼高亮庫。官網地址

1. //安裝

2. npm install prismjs

1. //引入Prism(我們只需要在局部引入即可,我這里是在文章內容展示組件中引入)

2. <script setup lang="ts">

3. import { ref, reactive, onMounted } from 'vue'

4. import type {Ref } from 'vue'

5. import { useRouter, useRoute } from 'vue-router'

6. import { api } from "@/assets/config/api"

7. import { request } from "@/assets/common/request"

8. import Prism from "prismjs"//導入代碼高亮插件的core(里面提供了其他官方插件及代碼高亮樣式主題,你只需要引入即可)

9. import "prismjs/themes/prism-tomorrow.min.css"//引入代碼高亮主題(這個去node_modules的安裝prismjs中找到想使用的主題即可)

10.

11.const router = useRouter()

12.const route = useRoute()

13.const articleInfoData: Ref<Array<object>> = ref([]);

14.

15.onMounted(() => {

16.   getArticleInfo()

17.   Prism.highlightAll()// 全局代碼高亮

18.})

19.function getArticleInfo(): void {//從后臺請求數據

20.        request.get(api.GetArticleInfo, {

21.            id: route.params.id

22.        }).then(res => {

23.          articleInfoData.value = res?.data?.data

24.        }).catch(err => {

25.           console.log(err)

26.        })

27.    })

28.

29.}

30.</script>

但結果又出現了下面的這種問題,明顯可以看到prismjs以及css是被加載了的,但代碼還是沒有被高亮

后來研究才發現是因為prismjs執行的時機不對導致pre->code中的代碼沒有被prismjs解析添加相應的標簽。

三、解決PrimsJS添加后代碼不高亮的問題

解決辦法也很簡單,我們可以給Prismjs高亮方法添加一個定時器延遲加載,或者使用

1. onMounted(() => {

2.     getArticleInfo()

3.      setTimeout(() => {

4.         Prism.highlightAll()// 全局代碼高亮

5.     }, 100)

6. })

async/await配合Promise進行加載,等數據完全加載完后再用Prismjs進行解析即可實現代碼高亮,就像下面那樣(需要注意的是一定要等v-html中后臺返回的數據加載完畢后才可以被Prismjs解析)

1. <script setup lang="ts">

2. import { ref, reactive, onMounted } from 'vue'

3. import type {Ref } from 'vue'

4. import { useRouter, useRoute } from 'vue-router'

5. import { api } from "@/assets/config/api"

6. import { request } from "@/assets/common/request"

7. import Prism from "prismjs"//代碼高亮插件的core

8. import "prismjs/themes/prism-tomorrow.min.css"//高亮主題

9. const router = useRouter()

10.const route = useRoute()

11.const articleInfoData: Ref<Array<object>> = ref([]);

12.onMounted(async () => {

13.   await getArticleInfo().then(res => {

14.        articleInfoData.value = res

15.    }).catch(err => {

16.       console.log(err);

17.    })

18.     Prism.highlightAll()// 全局代碼高亮(必須等獲取數據之后,代碼高亮才能生效,也可以用定時器定時)

19.})

20.function getArticleInfo(): Promise<Array<object>> {//從后臺請求數據

21.   return new Promise((resolve, reject) => {

22.        request.get(api.GetArticleInfo, {

23.            id: route.params.id

24.        }).then(res => {

25.            resolve(res?.data?.data)

26.        }).catch(err => {

27.            reject(err)

28.        })

29.    })

30.}

31.</script>

四、給代碼塊添加行號

我們從上圖中可以發現雖然我們完美的給代碼添加理論高亮,但我們在vscode中使用時會發現,每行代碼都有相應大行號,這樣代碼出錯時我們可以直接定位到某一行。

我們可以看到Prism官方 https://prismjs.com/index.html#plugins 提供了一些常用的插件,我們選擇紅框中的行號

那么如何使用行號插件呢?其實很簡單,我們剛剛在上文中安裝了Prism,只需要在node_modules中找到剛剛安裝的prismjs中的plugins,然后找到對應的插件引入即可。

在項目中需要這樣引入

1. <script setup lang="ts">

2. import { ref, reactive, onMounted } from 'vue'

3. import type {Ref } from 'vue'

4. import { useRouter, useRoute } from 'vue-router'

5. import { api } from "@/assets/config/api"

6. import { request } from "@/assets/common/request"

7. import Prism from "prismjs"//代碼高亮core

8. import "prismjs/plugins/line-numbers/prism-line-numbers.min.js"//行號插件

9. import "prismjs/themes/prism-tomorrow.min.css"//高亮主題

10.import "prismjs/plugins/line-numbers/prism-line-numbers.min.css"//行號插件的樣式

11.const router = useRouter()

12.const route = useRoute()

13.const articleInfoData: Ref<Array<object>> = ref([]);

14.onMounted(async () => {

15.   await getArticleInfo().then(res => {

16.        articleInfoData.value = res

17.    }).catch(err => {

18.       console.log(err);

19.    })

20.   Prism.highlightAll()// 全局代碼高亮(必須等獲取數據之后,代碼高亮才能生效,也可以用定時器定時)

21.})

22.function getArticleInfo(): Promise<Array<object>> {//從后臺請求數據

23.   return new Promise((resolve, reject) => {

24.        request.get(api.GetArticleInfo, {

25.            id: route.params.id

26.        }).then(res => {

27.            resolve(res?.data?.data)

28.        }).catch(err => {

29.            reject(err)

30.        })

31.    })

32.}

33.</script>

引入完之后刷新你會發現還是沒有添加行號

官網已經說得很清楚,除了引入行號插件及樣式,我們還需要指定一個line-numbers類,將這個類添加到pre標簽或者他的祖先,只要他或他的祖先添加的了line-numbers那么他的子元素就會被行號插件自動添加line-numbers,從而達到添加行號。

添加line-numbers類名到自己的項目,在這里我添加到了v-html要解析的那個標簽上,因為后臺返回的編輯數據都是在該標簽內渲染,所以該標簽屬于pre標簽的祖先元素,你也可以將line-numbers類名添加到該div的祖先父級元素中,又或者可以添加到body上,但建議添加到這個v-html要渲染的簽上,因為只有該標簽內的數據是要被渲染解析的。

1. <template>

2.     <div class="article-wrapper">

3.         <template v-for="item in articleInfoData">

4.             <h3 class="title">{{ item.title }}</h3>

5.             <p class="desc" v-if="item.desc">摘要:{{ item.desc }}</p>

6.             <section class="author">

7.                 <span>作者:三葉雨</span>&nbsp;

8.                 <span>{{ item.created_at }}</span>

9.             </section>

10.            <div class="content line-numbers" v-html="item.content"></div>

11.        </template>

12.    </div>

13.</template>

添加line-numbers類名后我們可以看到行號已經被添加上去,其他插件的使用方式同本插件,大家按需引入然后看對應的插件即可。

五、Prismjs代碼高亮的實現原理

在說原理之前我們應該弄明白的一個問題是,編輯器編輯的內容輸出數據格式是怎么樣的,這里以tinymce編輯器為例,我們可以發現返回給前臺的數據是這樣的,我們可以發現代碼塊被pre->code被這兩個標簽所包裹,簡單來說就是prismjs是在pre->code

從后臺返回的編輯器內容數據

上做了一些處理,我們可以從prismjs的源碼中可以發現,獲取到pre->code之后,首先獲取到pre標簽類上的language-xxxx給對應語言的關鍵字用正則匹配替換或添加標簽及相應的樣式,這樣就達到了代碼高亮的效果。

prism解析js的源碼

被prism解析后代碼高亮的HTML源碼

所以只要符合pre->code標簽結構內的代碼塊都會被prism js解析高亮。

到此完結,希望能為你節省一些時間。


該文章在 2024/3/29 10:17:23 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved