greasemonkey
Slack
slackDay 3

slackのinline code blockを便利にするグリモンスクリプト

More than 3 years have passed since last update.

slackは slack でのいろんな表記方法 にも書かれているように、一部ではありますがMarkdownライクな記述に対応しています。
しかし、この機能は日本語まじりで使うと問題が出ることがあります。

問題点

実例を見てみましょう。

入力した文字列
@slackbot あ、`SomeBuilder#build`の`ensure`で不要なファイルは削除しておいてねー。

japanese1.png
はい、コードブロックになるべきバッククォートで囲まれた部分がそのまま表示されてしまい、うまくいきません。

英語に代表される、単語をスペースで区切る言語であれば特に問題にはなりません。

入力した文字列
@slackbot Please delete unnecessary files in `ensure` block of `SomeBuilder#build`.

english1.png

どうもバッククォートの前にスペース(や一部の半角記号)が無いとうまく動かないようです。

対応方法

手動でスペースを入れれば動くのですが、面倒ですね。面倒なことは自動化しましょう。

ということでこんなGreasemonkey用のScriptを書きました。
Chrome環境であればTampermonkeyで使えるかと思います。

インストールはこちらからどうぞ。

insert_space_before_backquote.user.js
// ==UserScript==
// @name        Insert space before backquote
// @namespace   net.sheile.dev.slack-backquote
// @include     https://*.slack.com/*
// @version     1
// @grant       none
// ==/UserScript==
(function() {
  $('#message-input').bind('keydown', function(e) {
    if(e.keyCode == 13 && !e.shiftKey) {
      var message = $(this).val();
      message = message.replace(/(^|.)(`([^`\r\n]+?)`)/g, function(match, pre, entire) {
        if(pre.match(/^$|[\s,.!"#$%&(-={?:;<>^\[]/)) return match;
        return pre + ' ' + entire;
      });
      $(this).val(message);
    }
  });
})();

動作確認

入力した文字列
@slackbot あ、`SomeBuilder#build`の`ensure`で不要なファイルは削除しておいてねー。

japanese2.png

良いですね!

JavaScriptの正規表現は後読みに対応していないので、二連続のバッククォートとかには対応できていませんが、普通に使う分には困らないかと思います。
なお、強調や斜体、取り消し線については前だけではなく、後ろにもスペースが必要なようですが、自分の場合はほとんど使わないので、誤マッチを考えると手動で良いかな、と思っています。

明日は@ara_ta3さんで「Slackに新しいチャンネルができたら特定のチャンネルに通知を送るスクリプトを組んだ話」のようです。