欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

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

tinymce編輯器界面

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

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

目錄

1.前臺(tái)展示tinymce編輯器編輯的內(nèi)容時(shí)踩的坑

2.安裝PrimsJS代碼高亮庫

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

4.給代碼塊添加行號(hào)

5.PrimsJS代碼高亮的原理

一、前臺(tái)展示tinymce編輯器編輯的內(nèi)容時(shí)踩的坑

最近做了一個(gè)小項(xiàng)目,該項(xiàng)目主要是將tinymce富文本編輯器編輯的內(nèi)容在前臺(tái)展示,我很簡單的以為只需要用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>

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

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

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

我們獲取到編輯器提交給后臺(tái)的數(shù)據(jù)捶⑾謕re->code標(biāo)簽下就只有我們插入的代碼塊,就像下面這樣,

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

二、安裝Prismjs代碼高亮庫

后來在網(wǎng)上找到了代碼高亮庫prismjs并愉快的添加到了Vue3+Ts項(xiàng)目中

什么是prismjs

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

1. //安裝

2. npm install prismjs

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

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"//導(dǎo)入代碼高亮插件的core(里面提供了其他官方插件及代碼高亮樣式主題,你只需要引入即可)

9. import "prismjs/themes/prism-tomorrow.min.css"//引入代碼高亮主題(這個(gè)去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 {//從后臺(tái)請(qǐng)求數(shù)據(jù)

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>

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

后來研究才發(fā)現(xiàn)是因?yàn)閜rismjs執(zhí)行的時(shí)機(jī)不對(duì)導(dǎo)致pre->code中的代碼沒有被prismjs解析添加相應(yīng)的標(biāo)簽。

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

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

1. onMounted(() => {

2.     getArticleInfo()

3.      setTimeout(() => {

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

5.     }, 100)

6. })

async/await配合Promise進(jìn)行加載,等數(shù)據(jù)完全加載完后再用Prismjs進(jìn)行解析即可實(shí)現(xiàn)代碼高亮,就像下面那樣(需要注意的是一定要等v-html中后臺(tái)返回的數(shù)據(jù)加載完畢后才可以被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()// 全局代碼高亮(必須等獲取數(shù)據(jù)之后,代碼高亮才能生效,也可以用定時(shí)器定時(shí))

19.})

20.function getArticleInfo(): Promise<Array<object>> {//從后臺(tái)請(qǐng)求數(shù)據(jù)

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>

四、給代碼塊添加行號(hào)

我們從上圖中可以發(fā)現(xiàn)雖然我們完美的給代碼添加理論高亮,但我們?cè)趘scode中使用時(shí)會(huì)發(fā)現(xiàn),每行代碼都有相應(yīng)大行號(hào),這樣代碼出錯(cuò)時(shí)我們可以直接定位到某一行。

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

那么如何使用行號(hào)插件呢?其實(shí)很簡單,我們剛剛在上文中安裝了Prism,只需要在node_modules中找到剛剛安裝的prismjs中的plugins,然后找到對(duì)應(yīng)的插件引入即可。

在項(xiàng)目中需要這樣引入

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"//行號(hào)插件

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

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

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()// 全局代碼高亮(必須等獲取數(shù)據(jù)之后,代碼高亮才能生效,也可以用定時(shí)器定時(shí))

21.})

22.function getArticleInfo(): Promise<Array<object>> {//從后臺(tái)請(qǐng)求數(shù)據(jù)

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>

引入完之后刷新你會(huì)發(fā)現(xiàn)還是沒有添加行號(hào)

官網(wǎng)已經(jīng)說得很清楚,除了引入行號(hào)插件及樣式,我們還需要指定一個(gè)line-numbers類,將這個(gè)類添加到pre標(biāo)簽或者他的祖先,只要他或他的祖先添加的了line-numbers那么他的子元素就會(huì)被行號(hào)插件自動(dòng)添加line-numbers,從而達(dá)到添加行號(hào)。

添加line-numbers類名到自己的項(xiàng)目,在這里我添加到了v-html要解析的那個(gè)標(biāo)簽上,因?yàn)楹笈_(tái)返回的編輯數(shù)據(jù)都是在該標(biāo)簽內(nèi)渲染,所以該標(biāo)簽屬于pre標(biāo)簽的祖先元素,你也可以將line-numbers類名添加到該div的祖先父級(jí)元素中,又或者可以添加到body上,但建議添加到這個(gè)v-html要渲染的簽上,因?yàn)橹挥性摌?biāo)簽內(nèi)的數(shù)據(jù)是要被渲染解析的。

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類名后我們可以看到行號(hào)已經(jīng)被添加上去,其他插件的使用方式同本插件,大家按需引入然后看對(duì)應(yīng)的插件即可。

五、Prismjs代碼高亮的實(shí)現(xiàn)原理

在說原理之前我們應(yīng)該弄明白的一個(gè)問題是,編輯器編輯的內(nèi)容輸出數(shù)據(jù)格式是怎么樣的,這里以tinymce編輯器為例,我們可以發(fā)現(xiàn)返回給前臺(tái)的數(shù)據(jù)是這樣的,我們可以發(fā)現(xiàn)代碼塊被pre->code被這兩個(gè)標(biāo)簽所包裹,簡單來說就是prismjs是在pre->code

從后臺(tái)返回的編輯器內(nèi)容數(shù)據(jù)

上做了一些處理,我們可以從prismjs的源碼中可以發(fā)現(xiàn),獲取到pre->code之后,首先獲取到pre標(biāo)簽類上的language-xxxx給對(duì)應(yīng)語言的關(guān)鍵字用正則匹配替換或添加標(biāo)簽及相應(yīng)的樣式,這樣就達(dá)到了代碼高亮的效果。

prism解析js的源碼

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

所以只要符合pre->code標(biāo)簽結(jié)構(gòu)內(nèi)的代碼塊都會(huì)被prism js解析高亮。

到此完結(jié),希望能為你節(jié)省一些時(shí)間。


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