たこつぼくらぶ

更新履歴

カスタム絵文字ピッカー(仮-2)

【概要】
  • てがろぐ Ver 4.0.5.から実装されている、カスタム絵文字リストをスキンへ持ってくるスクリプト
  • 前回配布したものとは別
  • jQuery・PHP使用
  • AI生成物を加筆修正したもの(検証:Windows/vivaldi、iOS/safari)
  • 使用は自己責任でお願いいたします


【詳細】
カスタム絵文字ピッカーを、Misskeyみたいに使うためのスクリプト第二弾です。前のものとは別物になったので別の記事にしました。

PHPで絵文字を使用するフォルダ(ディレクトリ)内の画像ファイルを一覧化し、
HTML(スキン)内の任意のdiv要素内へ出力します。
そうやって出力された絵文字をクリックすると、クイック投稿フォームの現在のカーソル位置へ挿入される、というものです。
使用する場合は、スキンへの記述の追加のほかに、PHPファイルを作成する必要があります。

デモでお試しください。 (デフォルトスキンのクイック投稿フォームの近くに配置しています)


【使用方法】
●「get_cemoji.php」というPHPファイルを作成します。

<?php
// ここに許可するドメイン(自分のサイトのURL)を追加
$allowedDomain = 'サイトのURL';

// Refererヘッダーを取得
$referer = $_SERVER['HTTP_REFERER'];

// Refererヘッダーが許可するドメインで始まるかどうかを確認
if (strpos($referer, $allowedDomain) === 0) {
    // 許可するドメインからのアクセスの場合、処理を続行

    // ここから カスタム絵文字ピッカーについての記述

    // カスタム絵文字ディレクトリのパス(デフォルトはemoji)
    $imgDir = 'emoji/';

    // ディレクトリ内のファイル一覧を取得
    $files = scandir($imgDir);
    // 余分な要素を削除
    $files = array_diff($files, array('.', '..'));
    // JSON形式でファイルリストを返す
    header('Content-Type: application/json');
    echo json_encode($files);
    // ここまで カスタム絵文字ピッカーについての記述

} else {
    // 許可しないドメインからのアクセスの場合、エラーを返すなどの処理を行う
    http_response_code(403); // 403 Forbiddenを返す
    echo "アクセスが許可されていません。";
    exit;
}
?>

畳む

phpファイルのみにアクセスされるのを防ぐため(別に見えても画像ファイル名しかないと思いますが…)、
自分のサイトからしかphpを呼び出せないようにします。
「サイトのURL」の部分を自分のサイトのURL(https://www.example.comの形式)に書き換えてください。
(他にいい方法があったら教えてください・・・)

また、カスタム絵文字のディレクトリを変更している場合は、そちらも適切に書き換えてください。
設定=>システム設定=>【カスタム絵文字機能の設定】で設定しているディレクトリ+末尾に/を追加

phpファイルが作成出来たら、tegalog.cgiが設置してあるディレクトリ内に設置してください。
(異なる場所に配置したり、get_cemoji.php以外のファイル名にする場合は、下記のスクリプトの記述で、ご自身で適切に書き換えてください。)

●続いてスキン側(skin-cover.html)へ、絵文字を出力位置へ要素を追加
適当なところ(クイック投稿フォームの近くがおすすめ)に下記を追加
<div class="cemojipicker Login-Required"></div>
Login-Requiredはログイン時以外は非表示にできるクラスです。(公式マニュアル
cemojipickerの部分は好きに置き換えて問題ないですが、スクリプトのcemojipickerの部分を置き換える必要があります。

●続いてスキン側(skin-cover.html)のBODY内に追加
まずjQueryのCDNを公式から持ってくる
(すでにある場合は重複しないように気をつけてください)

その下に下記を追加

<script>
   $(document).ready(function () {
      // サーバーサイドのスクリプトから画像ファイルリストを取得
      $.ajax({
         url: 'get_cemoji.php', // サーバーサイドのスクリプトへのパスを指定
         dataType: 'json',
         success: function (data) {
            // 取得したファイルリストを処理
            $.each(data, function (index, filename) {

               // 拡張子を取り除いたファイル名を生成 必要であれば有効にする(不要なのでコメントアウト)
               // var fileBaseName = filename.split('.').slice(0, -1).join('.');

               // 画像の<img>要素を作成し、alt属性を設定して<div class="cemojipicker">に追加
               var imgSrc = 'emoji/' + filename;

               // alt属性を指定された形式に設定。拡張子を含めないときはfilenameをfileBaseNameにする
               var altText = '[:' + filename + ':]';

               var img = $("<img>").attr("src", imgSrc).attr("alt", altText);
               img.appendTo(".cemojipicker");

               // 画像をクリックしたときの処理
               img.click(function () {
                  // クリックされた画像のalt属性の値を取得
                  var altText = $(this).attr("alt");

                  // <textarea class="tegalogpost">のDOM要素を取得
                  var textarea = document.querySelector(".tegalogpost");

                  // カーソルの位置を取得
                  var cursorPos = textarea.selectionStart;

                  // テキストエリアの内容を取得
                  var text = textarea.value;

                  // カーソル位置に新しいテキストを挿入
                  var newText = text.slice(0, cursorPos) + altText + text.slice(cursorPos);

                  // テキストエリアに新しいテキストを設定
                  textarea.value = newText;

                  // カーソル位置を更新
                  textarea.selectionStart = cursorPos + altText.length;
                  textarea.selectionEnd = cursorPos + altText.length;
               });
            });
         }
      });
   });
</script>

畳む


これは絵文字のAlt属性を[:ファイル名.拡張子:]の形式で作成し、そのAlt要素を取得=>テキストエリアに貼り付けています。
拡張子を含めることで、投稿フォームのライブプレビュー機能等を実装している場合に、絵文字をプレビューすることができます。

不要な場合は[:ファイル名:]の形式がスマートだと思うので、コメントアウトしている部分(緑の部分)を有効にして使ってください。

また、黄色の文字の部分は、前の項目でファイル名・クラス名を変更している場合に変更が必要な箇所です。


●CSS(例)
/*全体の見た目を整える*/
.cemojipicker{
   margin: 10px auto;
   padding: 5px 0;
   width: calc(100% - 10px);
   max-width: 900px;
   max-height: 300px;
   overflow-y: auto;
   background-color: #dedede;
}

/*カスタム絵文字のサイズをそろえて余白をつける*/
.cemojipicker img {
   margin: 2px 5px;
   height: 2em;
   transition: 0.3s;
}

/*絵文字をクリックしたらちょっと小さくなる*/
.cemojipicker img:active{
transform: scale(0.8);
}
畳む



●このスプリクトは、てがろぐのアップデートにかかわらず、不定期に更新・変更、削除する可能性があります。●
« No.29 / No.31 »