Webページで $ command args のようにコマンド例を示すときに $ をコピペさせないようにする方法について説明します。
加えて、Prism.js で $ をコピペさせない設定方法も紹介します。
結論から言うと、$ の部分を user-select: none にします。
何もしていないHTMLでは以下のように書きますが、これでは $ も選択できるので、コピーされてしまいます。
-
HTMLソース
<pre><code>$ command args</code></pre> -
実際の表示のされ方 (
$の部分は選択できます)$ command args
そこで $ の部分を span で囲んでスタイルを user-select: none にします。
こうすることで、$ は選択できなくなり、コピーされなくなります。
-
HTMLソース
<pre><code><span style="user-select: none">$ </span>command args</code></pre> -
実際の表示のされ方 (
$の部分が選択できません)$ command args
Prism.js で $ をコピペさせない
Webページで表示させるプログラムのシンタックスハイライトに Prism.js を使っている場合は、$ の部分を token として認識させることで簡単に、user-select: none を適用させることができます。
bash の行頭にある $ を選択できないようにするには次のHTMLを使います。
<link rel="stylesheet" href="path/to/prism.css">
<script src="path/to/prism.js"></script>
<!-- token の追加 -->
<script type="text/javascript">
Prism.languages.bash.prompt = /^\$ /m;
</script>
<!-- token に対するスタイルの設定 -->
<style>
.token.prompt {
user-select: none;
}
</style>
正規表現 /^\$ /m について、オプション m を指定すると、行頭 ^ のマッチングが、文字列の先頭だけでなく、各行の行頭にもマッチするようになります。これにより、各行の行頭にある $ だけを token として取り出すことができます。
取り出した token は タグが付けられるので、CSSで .token.prompt のスタイルを user-select: none にします。
結果は以下の通りです。コピーするときのUXがいい感じになりました。行頭の $ は選択できませんが、変数名などは選択できることが確認できると思います。
$ echo hello world
$ echo $PATH
Prism.js で PS> をコピペさせない
2021/10追記:PowerShellのプロンプトである PS> を選択できないようにするには、次のJavaScriptを追加します。
Prism.languages.insertBefore('powershell', 'function', {
'prompt': /^PS> /m,
})
PowerShellの字句解析でPromptの部分「PS>」もtokenにするためのプログラムです。 デフォルトだとPSがfunctionと判定されるので、insertBeforeでfunctionの解析を前に先に評価するようにする必要があります。
以上です。