如何在Tower開源的富文字編輯器Simditor中使用PrismJS來高亮程式碼?

愛學啊發表於2018-07-09

起因是我們在做愛學啊官方網站的時候,要用到富文字的地方有電子書頁面,文章頁面,所以就要用到富文字編輯,調研了一圈就選用了Tower開源的Simditor編輯器,各方方面都還不錯基本上沒有什麼大的Bug,主要是他原來上傳圖片需要服務端配合,但是現在大部分情況下都是將圖片這類資源託管的到第三方,所以我們這裡修改了他的原始碼,支援直接將圖片上傳到阿里雲。但有了富文字,貼別是 裡面貼程式碼,如果不高亮總感覺死氣成成的,感覺先不說程式碼內容這麼樣,要格式不好看就沒有靈魂,最後實在不能忍所以就到處尋找發現用的最多的highlight.js,但是他所支援的格式是:

<pre>
  <code class="java">
  </code>
</pre>
複製程式碼

而Simditor預設編輯出來的程式碼塊是: 也就是說highlight.js支援的是沒有字首的,這裡也說不上誰對誰錯,畢竟Simditor也是按照H5規範來的,而highlight.js可能由於年代久遠,那時候還沒這規範,所以就這樣實現的,但是好像在highlight.js官網看到所可以設定字首,不過沒找到;接著就想的是更改Simditor原始碼,但更改後升級就不太好升級了,接著想的是更改highlight.js原始碼,檢視一番後發現沒太看懂,也挺麻煩,所以這個需求就一直擱置了,直到有一天知道PrismJS然後就是這加進來的,佔時沒有發現什麼大的問題,所以就在做一個記錄也幫助到需要的人。

下載PrismJS

來到PrismJS官網,可以發現在首頁他就佔時了幾個主題的切換按鈕,下面就相應的效果,我們這裡選用的是預設主題。來到PrismJS下載頁面

第一步:選擇下載的版本是開發版本,還是壓縮版本。
第二步:選擇主題。
第三步:選擇需要的語言,如果你第一次整合,建議你選擇預設的語言,先下載下來整合到專案中,確認沒問題,能實現需求,然後在選擇語言。
第四步:選擇外掛,我們這裡沒有選用。
複製程式碼

下載完成後得到兩個檔案:

prism.css,prism.js

在網頁中引入資源 現在就可以在網頁中引入這個兩個資源,js建議在body內容後面引入,例如這樣:

<!DOCTYPE html>
<html>
<head>
	<title>test1</title>
	<!-- 引入css -->
	<link rel="stylesheet" type="text/css" href="./prism.css">
</head>
<body>
	<pre><code class="lang-java">private void showCommentMoreDialog(final Comment data) {
	 &nbsp; &nbsp; CommentMoreDialogFragment dialogFragment = new CommentMoreDialogFragment();
	 &nbsp; &nbsp; dialogFragment.show(getSupportFragmentManager(), new DialogInterface.OnClickListener() {
	 &nbsp; &nbsp; &nbsp; &nbsp; @Override
	 &nbsp; &nbsp; &nbsp; &nbsp; public void onClick(DialogInterface dialog, int which) {
	 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialog.dismiss();
	 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processOnClick(which, data);
	 &nbsp; &nbsp; &nbsp; &nbsp; }
	 &nbsp; &nbsp; });
	 }
	 </code></pre>

 	<!-- 引入js,該js內部處理了,也就是說在head中引入也是沒問題的 -->
	<script type="text/javascript" src="./prism.js"></script>
</body>
</html>
複製程式碼

效果如下圖:

image.png
可以看到差不多,沒有什麼大問題。基本使用到這裡就完成,如果你需要手動高亮,也就是說不讓載入完js就高亮,那麼你需要這樣匯入js:

<!DOCTYPE html>
<html>
<head>
	<title>test1</title>
	<!-- 引入css -->
	<link rel="stylesheet" type="text/css" href="./prism.css">
</head>
<body>
	<pre><code class="lang-java">private void showCommentMoreDialog(final Comment data) {
	 &nbsp; &nbsp; CommentMoreDialogFragment dialogFragment = new CommentMoreDialogFragment();
	 &nbsp; &nbsp; dialogFragment.show(getSupportFragmentManager(), new DialogInterface.OnClickListener() {
	 &nbsp; &nbsp; &nbsp; &nbsp; @Override
	 &nbsp; &nbsp; &nbsp; &nbsp; public void onClick(DialogInterface dialog, int which) {
	 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialog.dismiss();
	 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processOnClick(which, data);
	 &nbsp; &nbsp; &nbsp; &nbsp; }
	 &nbsp; &nbsp; });
	 }
	 </code></pre>

 	<!-- 引入js,該js內部處理了,也就是說在head中引入也是沒問題的 -->
	<script type="text/javascript" src="./prism.js" data-manual></script>
	<script type="text/javascript">
		//然後在需要的位置呼叫如下方法
		Prism.highlightAll();
	</script>
</body>
</html>
複製程式碼

顯示效果和上面一樣。

Simditor增加更多語言 預設情況下Simditor大概就10多種語言,所以說可能不夠用,比如:Groovy,Go,Swift,Kotlin就沒有,所以說這不能忍,就需要修改,另外還有個問題是,好像部分語言他們的命名還不一樣,我們這裡就統一修改成了PrismJS的命令,修改的方法也很簡單:

修改simditor.js中的this.langs = this.editor.opts.codeLanguages屬性。
複製程式碼

我這裡修改完成後的程式碼如下,大概有40中語言,大家拿去直接就可以放到你的原始碼中就行了:

this.langs = this.editor.opts.codeLanguages || [
    {
        name: 'ASP.NET',
        value: 'aspnet'
    },
    {
        name: 'Bash',
        value: 'bash'
    },{
        name: 'Basic',
        value: 'basic'
    }, {
        name: 'C',
        value: 'c'
    }, {
        name: 'CoffeeScript',
        value: 'coffeescript'
    }, {
        name: 'C++',
        value: 'c++'
    }, {
        name: 'C#',
        value: 'csharp'
    }, {
        name: 'CSS',
        value: 'css'
    }, {
        name: 'Diff',
        value: 'diff'
    }, {
        name: 'Erlang',
        value: 'erlang'
    }, {
        name: 'Go',
        value: 'go'
    }, {
        name: 'Groovy',
        value: 'groovy'
    }, {
        name: 'HTML,XML',
        value: 'html'
    }, {
        name: 'Java',
        value: 'java'
    }, {
        name: 'JavaScript',
        value: 'js'
    }, {
        name: 'JSON',
        value: 'json'
    }, {
        name: 'Kotlin',
        value: 'kotlin'
    }, {
        name: 'Less',
        value: 'less'
    }, {
        name: 'Lisp',
        value: 'lisp'
    }, {
        name: 'Lua',
        value: 'lua'
    }, {
        name: 'Markdown',
        value: 'markdown'
    }, {
        name: 'Markup',
        value: 'markup'
    }, {
        name: 'Matlab',
        value: 'matlab'
    }, {
        name: 'Objective C',
        value: 'objectivec'
    }, {
        name: 'Perl',
        value: 'parl'
    }, {
        name: 'PHP',
        value: 'php'
    }, {
        name: 'PL/SQL',
        value: 'plsql'
    }, {
        name: 'PowerShell',
        value: 'powershell'
    }, {
        name: 'Python',
        value: 'python'
    }, {
        name: 'R',
        value: 'r'
    }, {
        name: 'Ruby',
        value: 'ruby'
    }, {
        name: 'Rust',
        value: 'rust'
    }, {
        name: 'Scala',
        value: 'scala'
    }, {
        name: 'Sass',
        value: 'sass'
    }, {
        name: 'Scss',
        value: 'scss'
    }, {
        name: 'SQL',
        value: 'sql'
    }, {
        name: 'Swift',
        value: 'swift'
    }, {
        name: 'TypeScript',
        value: 'typescript'
    }, {
        name: 'VB.NET',
        value: 'vbnet'
    }, {
        name: 'VisualBasic',
        value: 'visual-basic'
    }, {
        name: 'Yaml',
        value: 'yaml'
    }
];
複製程式碼

修改完成後,在選擇語言的時候就改變了。

關於Simditor的問題 感覺Simditor還有一些問題,不知道大家是如何解決的,建議大家收藏這篇文章(只有官方才會更新),後面如果解決的相應的問題會在更新的。

  1. 有時候從編輯器中直接複製原始碼到編輯中,有些換行符沒有了,臨時解決辦法就是先貼上到文字編輯器,然後在複製。

  2. 撤銷感覺不太好使。

  3. 有時選中一段文字,再貼上會貼上到編輯器最前面。

原文來自如何在Tower開源的富文字編輯器Simditor中使用PrismJS來高亮程式碼?,如果感覺我們寫的不錯,可以支援我們一下,我們官網提供線上視訊教程在官網購買可以優惠5元喲,同時視訊課程也可以在網易雲課程,騰訊課堂上購買。

有任何問題可以新增我們的QQ來討論:3469271680;也可以掃描下面的二維碼新增Android開發交流群和微信公眾號(愛學啊官網底部也有聯絡方式喲),我們平均每天都會推送一篇優質文章;評論可能回覆不是很及時,還望大家體諒;購買課程後可以獲得一對一答疑服務,當然也可以談人生談理想瞎扯淡;同時如果是零基礎想學程式設計的朋友也可以聯絡我們進行諮詢,我們可以提供一些建議和幫助,讓你在程式設計道路上更順暢。

愛學啊官方公眾號

相關文章