Google-Code-Prettifyのソースコピー問題の対応方法
google-code-prettifyでハイライト表示したソースコードをブラウザでコピーするとIE/FireFoxでは正常にコピーする事が出来ない場合があります。そのコピー問題を解決する方法です。(google-code-prettify側は一切、修正しません。)
prettify_plus.jsを使用する
私がこのブログのシステムを作成する時に作ったJavaScriptです。
[prettify_plus.js]
// 特殊なHTMLエンティティを文字に戻す
// ※他にも追加したい場合は追記して下さい
function htmlspecialchars_decode(text) {
var result = text;
result = result.replace(/</g , '<');
result = result.replace(/>/g , '>');
result = result.replace(/"/g , '"');
result = result.replace(/'/g , "'");
result = result.replace(/'/g , "'");
result = result.replace(/'/g , "'");
result = result.replace(/ /g , " ");
return result.replace(/&/g , '&');
}
// 装飾後の<pre>内の中身からタグを除去
function remove_tag(text,newline_count){
var result = "";
var target_tag = "";
var lessthan_flg = false;
var list = text.split('');
newline_count[0] = 0;
for(i=0;i<list.length;i++){
// 開始タグ
if (list[i] == '<') {
lessthan_flg = true;
target_tag = list[i];
continue;
}
// 終了タグ
if (list[i] == '>') {
lessthan_flg = false;
target_tag = target_tag +list[i];
if (target_tag == '</li>' || target_tag == '</LI>'){
result = result + "\r\n"; // CRLF :-)
newline_count[0]++;
}
continue;
}
// タグ以外の文字を取得
if (!lessthan_flg){
result = result + list[i];
}else{
target_tag = target_tag +list[i];
}
}
return result;
}
// RAWエレメントの生成(textarea)
function createRawElement(raw,parent_obj,pre_obj,newline_count) {
var element = document.createElement('textarea');
element.id = pre_obj.id + "_raw";
element.rows = newline_count+2;
element.readOnly = true;
// IE8以下の場合はinnerHTMLで設定すると改行が除去される
// element.innerHTML = raw;
element.value = raw;
parent_obj.appendChild(element);
}
// RAWエレメントの非表示
function hiddenRawElement(parent_obj,msg_obj,pre_obj) {
pre_obj.style.display= "block";
document.getElementById(pre_obj.id + "_raw").style.display = "none";
msg_obj.innerHTML='<a href="#" onclick="showRawElement(' + parent_obj.id + ',' + msg_obj.id + ',' + pre_obj.id + '); ' +
'return false;" style="font-size:14px;">ソースをコピー</a>';
}
// RAWデータの表示
// parent_obj: 親オブジェクト(<pre>の上位)
// msg_obj : msgオブジェクト(コードの切り替え)
// pre_obj : <pre>オブジェクト
function showRawElement(parent_obj,msg_obj,pre_obj){
if (!document.getElementById(pre_obj.id + "_raw")) {
// RAWデータの生成
// (IE8以下のinnerHTMLを経由すると改行が抹消されるので注意)
var newline_count = new Array(0);
var raw = remove_tag(pre_obj.innerHTML,newline_count);
// RAWデータの特殊なHTMLエンティティの解除
raw = htmlspecialchars_decode(raw);
// RAWエレメントの生成(textarea)
createRawElement(raw,parent_obj,pre_obj,newline_count[0]);
}else{
document.getElementById(pre_obj.id + "_raw").style.display = "block";
}
// 装飾済みのエレメント(pre)を非表示
pre_obj.style.display= "none";
msg_obj.innerHTML='<a href="#" onclick="hiddenRawElement(' + parent_obj.id + ',' + msg_obj.id + ',' + pre_obj.id + '); ' +
'return false;" style="font-size:14px;">元に戻す</a><p></p>';
}
[CSS]
.com { color: #080; } /* コメント */
.str { color: #800 } /* 文字列 */
.typ { color: #000; } /* タイプ、クラス名等 */
.kwd { color: #0068b7; font-weight:bold; } /* キーワード */
pre.prettyprint {
background-color: #fff;
font-family:"メイリオ", Meiryo,Verdana, Helvetica, sans-serif;
font-size:14px;
overflow:auto;
max-height: 500px !important;
}
ol.linenums{
padding-left: 46px !important;
}
ol.linenums li {
list-style: decimal outside;
border-left: solid 3px #6CE26C;
padding-left: 10px;
background-color: #fff;
}
textarea{
width : 98%;
font-family:"メイリオ", Meiryo,Verdana, Helvetica, sans-serif;
font-size:14px;
border-radius: 4px;
overflow:auto;
background-color: #fff;
padding-left: 10px;
margin-bottom: 15px;;
max-height: 500px !important;
}
使用方法
run_prettify.js、prettify_plus.js、CSSの順で読み込ませてください。
<head>
<script src="http://あなたの環境/run_prettify.js"></script>
<script src="http://あなたの環境/prettify_plus.js"></script>
<link rel="stylesheet" href="http://あなたの環境/xxx.css" type="text/css">
</head>
...
<div id="src1" >
<div id="msg1" style="text-align:right;padding-right:10px;">
<a href="#" onclick="showRawElement(src1,msg1,pre1);return false;" style="font-size:14px;">ソースをコピー</a>
</div>
<pre class="prettyprint linenums" id="pre1">
ここにソースを記述
</pre>
</div>
※ID/スタイルは適宜変更してください。
※IDは自動で採番や日付を付与すると複数に対応しやすいです。例) src1,src_2014_1224_1200など
利用条件
商用・非商用を問わずにご利用できます。但し、必ずダウンロードしてあなたの環境に設置してください。また、改変や再配布に関してはお好きなだけどうぞ :-)
スポンサーリンク
関連記事
公開日:2014年12月17日 最終更新日:2015年12月21日
記事NO:00030
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









