メインコンテンツに移動

shirane lab

メインナビゲーション

  • ホーム
  • ブログ
  • Drush
  • 検索

パンくず

  • ホーム
  • ブログ
  • CKEditor CodeSnippet の言語選択肢を追加する

CKEditor CodeSnippet の言語選択肢を追加する

2020/09/25(金) - 23:37
shirane

CKEditor CodeSnippet は、Drupal のコンテンツ編集で CKEditor の CodeSnippet プラグインを使えるようにするモジュール。有効にすると、ツールバーの「コードスニペットを挿入」ボタンで開くモーダルウィンドウから言語とコードを入力することで、ハイライト表示のコード片をコンテンツに挿入できる。

コードスニペットの挿入

これを使って sites/default/services.yml ファイルの内容を入力しようとして、言語の選択肢に YAML がないことに気づいた。指定できる選択肢は、テキストフォーマットの設定(admin/config/content/formats)で選択するが、そもそもそこに YAML がない。

サポート言語の指定

記述言語に応じてコード内のキーワードをハイライト表示する機能は highlight.js によるが、もしかして使用しているファイルに YAML サポートが含まれていないのだろうか。もしそうなら、https://highlightjs.org/download/ で YAML を含むバージョンを生成&ダウンロードして差し替える必要がある。でも、本当にそうか。

モジュールの README を確認すると、同梱の highlight.js に含まれている言語のリストがあった:

Out of the box, the included version of highlightjs comes with these
languages (as defined in config/install/codesnippet.settings.yml):

languages:
  apache: 'Apache'
  bash: 'Bash'
  coffeescript: 'CoffeeScript'
  css: 'CSS'
  dart: 'Dart'
  dockerfile: 'Dockerfile'
  dust: 'Dust'
  gherkin: 'Gherkin'
  go: 'Go'
  haml: 'HAML'
  handlebars: 'Handlebars'
  ini: 'Ini'
  java: 'Java'
  javascript: 'JavaScript'
  json: 'JSON'
  less: 'Less'
  makefile: 'Makefile'
  markdown: 'Markdown'
  nginx: 'Nginx'
  php: 'PHP'
  perl: 'Perl'
  powershell: 'Powershell'
  puppet: 'Puppet'
  python: 'Python'
  ruby: 'Ruby'
  scss: 'SCSS'
  sql: 'SQL'
  twig: 'Twig'
  typescript: 'TypeScript'
  yaml: 'Yaml'
  xml: 'XML'

あー、やっぱり最後から2行目に YAML がある。ということは、highlight.js ではなく、Drupal モジュール側に原因があるのか。README を読むと、自作モジュールで HOOK_form_FORM_ID_alter フックを実装することで言語の選択肢を追加できるとある。

というわけで、チュートリアルを見ながら簡単なモジュールを作ってみることに。ここでは仮に hoge モジュールとしよう。

modules/custom/hoge ディレクトリを作成して hoge.module ファイルを追加する。このファイルに README のサンプルコードをコピーし、関数名にモジュール名を反映し、実装に YAML 用の配列要素を追加。

modules/custom/hoge/hoge.module:

<?php

use Drupal\Core\Form\FormStateInterface;

function hoge_form_filter_format_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if (isset($form['editor']['settings']['subform']['plugins']['codesnippet'])) {
    $form['editor']['settings']['subform']['plugins']['codesnippet']['highlight_languages']['#options']['cpp'] = 'C++';
    $form['editor']['settings']['subform']['plugins']['codesnippet']['highlight_languages']['#options']['d'] = 'D';
    $form['editor']['settings']['subform']['plugins']['codesnippet']['highlight_languages']['#options']['rust'] = 'Rust';
    $form['editor']['settings']['subform']['plugins']['codesnippet']['highlight_languages']['#options']['yaml'] = 'YAML';
    asort($form['editor']['settings']['subform']['plugins']['codesnippet']['highlight_languages']['#options']);
  }
}

 あとは、Drupal にモジュールとして認識させるためのメタ情報として、hoge.info.yml ファイルを作って出来上がり。

 modules/custom/hoge/hoge.info.yml:

name: hoge
description: custom code for My module
package: Custom

type: module
core_version_requirement: ^9

Drupal の管理画面で「機能拡張」ページを開き、作成したモジュールが認識されていることを確認。あとは有効化すれば適用されるはず。

モジュールを有効にした後、テキストフォーマットの管理画面で CodeSnippet の設定を見ると、YAML を含む、上の関数で指定した各言語のチェックボックスが追加されていた。よしよし。

YAML を追加

追加された YAML のチェックボックスをオンにして保存すると、コンテンツ編集時の「コードスニペット」ウィンドウの言語選択肢に YAML が追加された。よしよしよし。

コードスニペットの言語選択肢に YAML が追加された

これで YAML コードもハイライト表示できるようになった。

コードはサンプルのコピペでいけるけど、外枠のモジュールを作るところが初心者にはハードルが高い。もっと簡単な方法があれば、教えていただけるとうれしいです。

参考資料:

  • CKEditor CodeSnippet
  • Creating custom modules
  • Naming and placing your Drupal module
  • Let Drupal know about your module with an .info.yml file
モジュール
Drupal9
CKEditor
‹ 前の記事次の記事 ›

書籍

『D9 おいしいレシピ集2』がパワーアップして商業誌に

『D9 おいしいレシピ集2』がパワーアップして商業誌に

 書籍の一覧はこちら

 

タグ一覧

DrushDrupal9Drupal6ffdsmVagrant開発環境VirtualBoxDrupal7ComposerコミュニティDrupal5Migrate勉強会モジュールDocker書籍ubercartWindowsCKEditorArtisteerDrupal ONSENDrupal4MariaDBTwigデバッグthemingTomeテーマH5PインストールAnalytics仮想マシンCentOSMacREPLpsyshDruxtJSデカップルドヘッドレスNuxtQuizVue

サイト運営

シナジークエスト

© shirane lab