邊做筆記邊複習。
簡述
CKEditor 是一個所見即所得的文字編輯器,主要用途是給使用者編輯文字的環境,例如部落格裡面的編輯文章功能。
CKEditor 目前主要有 4、5 兩個版本,這兩者是不相容的,所以這篇會拿 5 來做教學。
備註 當初踩到的雷
在安裝編輯器跟套件的時候要特別注意「版本」,如果套件的版本比編輯器還新,像這樣:
1 2 3 4 5 6 7 8 9
| { "name": "@ckeditor/ckeditor5-build-classic", "version": "19.0.0", "description": "The classic editor build of CKEditor 5 – the best browser-based rich text editor.", "devDependencies": { "@ckeditor/ckeditor5-ckfinder": "^19.0.0", "@ckeditor/ckeditor5-code-block": "^32.0.0", "@ckeditor/ckeditor5-core": "^19.0.0", },
|
之後引入的時候就有機會碰到 duplicated modules
(模組重複載入)的問題。
引入方式
- CDN 引入,如果你沒有安裝擴充套件的需求,那就用這個方式就好:
1
| <script src="https://cdn.ckeditor.com/ckeditor5/32.0.0/classic/ckeditor.js"></script>
|
- 下載原始碼
目前有五個版本:
- classic — the Classic editor
- inline — the Inline editor
- balloon — the Balloon editor
- balloon-block — the Balloon block editor
- decoupled-document — the Document editor
實際的差別可以去看官方文件,因為我也沒特別去看所以不清楚。
總之,最多人用的是 classic,所以這邊也會拿這個來用。
先到 這邊 下載原始碼:
1
| git clone https://github.com/ckeditor/ckeditor5.git
|
備註:現在新版的 CKEditor5 已經整合到一個 Repository 了,不要下載錯版本,像這個就是舊版的:ckeditor5-build-classic。
接著只要根據路徑把 ckeditor.js
引入就 OK 了:
1
| <script src="ckeditor5\packages\ckeditor5-build-classic\build\ckeditor.js"></script>
|
啟用方式
很簡單,只要這兩段 code 就搞定:
1
| <textarea name="content" id="editor"></textarea>
|
1 2 3 4 5 6 7 8
| <script src=".ckeditor5\packages\ckeditor5-build-classic\build\ckeditor.js"></script> <script> ClassicEditor .create(document.querySelector('#editor')) .catch(error => { console.error(error); }); </script>
|
create
會根據 selector 來替換元素,所以不一定要 <textarea>
,<div>
也行。
另外這很明顯是個 Promise,所以發生錯誤的話就會執行 catch
區塊,你可以在那邊看錯誤訊息。
一切順利的話你就會看到這個結果:
如果你沒有要安裝其他套件的話,到這邊就差不多了,有需求的話就繼續看下去吧。
安裝擴充功能
備註:安裝的方式有兩個,一種是改源碼重新 build,另一種是直接在 JS 裡面插入。這裡介紹的是第一種,如果你對第二種方式有興趣參考這裡。不過要切記,這兩個不可以混用,否則很有可能出問題。
備註:後來發現有更簡單的方式,官方有提供線上打包的服務,可以參考這裡
把原始碼下載下來後,會看到 ckeditor5-build-classic
這個資料夾,這裡說明一下資料結構:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| │ CHANGELOG.md │ CONTRIBUTING.md │ LICENSE.md │ package.json -> CKEditor 的所有資訊(很重要) │ README.md │ ├───.github │ PULL_REQUEST_TEMPLATE.md │ ├───build -> 打包後的檔案 │ │ ckeditor.js │ │ ckeditor.js.map │ │ │ └───translations │ ├───sample -> 示範檔案(用這個能看 build 出來的編輯器長怎樣) │ index.html │ ├───src -> 原始碼(程式的進入點) │ ckeditor.js │ └───tests -> 測試的地方 │ ckeditor.js │ └───manual
|
先說明一下安裝擴充套件的流程:
- npm install 你要安裝的擴充功能
- 到 src ckeditor.js 把套件引入跟設定
- 重新 build
不過在那之前,請務必先:
npm install
安裝所有 package.json 中的套件
npm install
安裝所有 package.json 中的套件
npm install
安裝所有 package.json 中的套件
因為它是用 webpack 來打包的,沒有先安裝好的話等一下 build 的時候會出錯。
安裝 Code blocks 套件
這邊拿 Code blocks 來當範例。不管安裝哪個套件流程都是一樣的,所以請務必弄懂這個流程。
接著照著文件的安裝說明來做:
1 2
| npm install --save @ckeditor/ckeditor5-code-block
|
安裝完後 package.json 就會有紀錄了:
1 2 3
| "dependencies": { "@ckeditor/ckeditor5-code-block": "^32.0.0" }
|
引入及設定套件
接著打開 src
底下的 ckeditor.js
,會看到像這樣的內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import ClassicEditorBase from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials'; import UploadAdapter from '@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter'; import Autoformat from '@ckeditor/ckeditor5-autoformat/src/autoformat'; import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold'; import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic'; import BlockQuote from '@ckeditor/ckeditor5-block-quote/src/blockquote'; ....
ClassicEditor.builtinPlugins = [ Essentials, UploadAdapter, Autoformat, Bold, Italic, BlockQuote, CKFinder, EasyImage, Heading, ... ];
ClassicEditor.defaultConfig = { toolbar: { items: [ 'heading', '|', 'bold', 'italic', 'link', ... ] }, image: { toolbar: [ 'imageStyle:full', 'imageStyle:side', '|', 'imageTextAlternative' ] }, table: { contentToolbar: [ 'tableColumn', 'tableRow', 'mergeTableCells' ] }, language: 'en' };
|
這邊只要做兩件事情就好:
- 把剛載好的套件
import
進來
- 把套件綁到
ClassicEditor.defaultConfig
下
一樣按照官方說明來做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| import ClassicEditorBase from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials'; import UploadAdapter from '@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter'; import Autoformat from '@ckeditor/ckeditor5-autoformat/src/autoformat'; import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold'; import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic'; import BlockQuote from '@ckeditor/ckeditor5-block-quote/src/blockquote';
import CodeBlock from '@ckeditor/ckeditor5-code-block/src/codeblock'; ....
ClassicEditor.builtinPlugins = [ Essentials, UploadAdapter, Autoformat, Bold, Italic, BlockQuote, CKFinder, EasyImage, Heading, CodeBlock, ... ];
ClassicEditor.defaultConfig = { toolbar: { items: [ 'heading', '|', 'bold', 'italic', 'link', ... 'codeBlock' ] }, };
|
備註:套件設定的部分建議別動,要改的話去使用 CKEditor 的頁面在改就好。
重新編譯
最後一步最簡單啦,下這行指令就好:
最後把編譯完的 ckeditor.js
引入就完成了。
怎麼取得編輯器的內容
- PHP
如果你是用 Form 表單來送出內容的話,那你可以在 PHP 裡面拿資料:
1 2 3 4
| <form method="POST" action="result.php"> <textarea name="content" id="editor"></textarea> <button class="btn">Send</button> </form>
|
1 2
| $content = $_POST['content'];
|
- JavaScript
如果你是透過 AJAX 的話,參考這個做法:
1 2
| <textarea name="content" id="editor"></textarea> <button class="btn">send</button>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| let editor = undefined; ClassicEditor .create(document.querySelector('#editor')) .then( newEditor => { editor = newEditor }) .catch(error => { console.error(error); }); document.querySelector('.btn').addEventListener('click', () => { console.log(editor.getData()); })
|