改行の操作ができるコピーボックス
- 記事再編
- 記事投稿
閲覧者が任意で改行その他を削除できるコピーボックスです。テンプレ配布サイトさん向け。
「テキストエリアの改行をそのまま出力する」設定の、携帯向けサービス利用者さんが案外多いようなので作ってみました。
改行を消せるタイプ
demo & source code
demo
HTML
- <textarea class="copybox1" id="box1">いろはに……</textarea>
- <input type="checkbox" data-cbox="box1" />改行削除
jQuery
- $(function(){
- $('.copybox1').each(function(){
- var $tgt = $(this);
- var $chk = $('[data-cbox="'+$tgt.attr('id')+'"]');
- var org = $tgt.val();
- $chk.on('change',function(){
- $tgt.val( !$chk.prop('checked') ? org : org.replace(/\n/g,'') );
- }).trigger('change');
- });
- });
box1
でチェックボックスとテキストエリアを紐付け- 完全削除ではなく、半角スペース等に置き換えたい場合は
''
を' '
('置き換え内容'
)に変更
色々消せるタイプ
demo & source code
demo
HTML
- <textarea class="copybox2" id="box2">いろはにほへと
- <!--ちりぬるを--></textarea>
- <input type="checkbox" data-cbox="box2" name="br" />改行削除
- <input type="checkbox" data-cbox="box2" name="sp" />インデント削除
- <input type="checkbox" data-cbox="box2" name="co" />コメントアウト削除
jQuery
- $(function(){
- $('.copybox2').each(function(){
- var $tgt = $(this);
- var $chk = $('[data-cbox="'+$tgt.attr('id')+'"]');
- var del = {
- 'sp': [0,/^[^\S\n]+/gm],
- 'br': [0,/\n/g],
- 'co': [0,/<!--.*?-->/gs]
- };
- var org = $tgt.val();
- $chk.each(function(){
- var $trg = $(this);
- var name = $trg.attr('name');
- if( !del[name] ) return true;
- $trg.on('change',function(){
- del[name][0] = $trg.prop('checked');
- boxWrite();
- }).trigger('change');
- });
- function boxWrite(){
- var txt = org;
- $.each(del,function(k,a){
- if( !a[0] ) return true;
- txt = txt.replace(a[1],'');
- });
- $tgt.val(txt);
- }
- });
- });
box1
でチェックボックスとテキストエリアを紐付けbr
等でチェックボックスと削除内容紐付け
削除内容の編集
jQuery_削除内容
- var del = {
- 'sp': [0,/^[^\S\n]+/gm],
- 'br': [0,/\n/g],
- 'co': [0,/<!--[\s\S]*?-->/g]
- };
上記箇所で設定しています。
br
等:チェックボックスのname
属性値と紐付/\n/g
等:削除内容を正規表現で記述0,
:フラグ用なので気にしないでください
削除対象の増減
箇所:間
'key': [0,/target/]
を,
挟みで記述
編集時の注意
チェックボックスにチェックが入っている際、上記オブジェクト配列の上から順に削除処理されるので、そのあたり加味して順番を決めたり正規表現を記述してください。
デフォルトでは行頭インデント検知の為に/^[^\S\n]+/gm
を指定しています。
この指定は行頭を対象とする為、改行を削除しをテキストを1行にする/\n/g
の削除後は上手く動いてくれません。("1行"の行頭インデントを消してくれるが元行頭だった部分は検知時には行中の為そのまま)
そのため先頭に記述しています。
削除から置き換えに変更
完全削除ではなく、半角スペース等に置き換えたい場合は下記どちらかの編集をしてください。
全ての削除対象の置き換え後が同じで良い場合
箇所:''
'置き換え内容'
と置き換え
削除対象毎に置き換え後を決める場合
箇所:
/target/
後に,'置き換え内容'
を追加(ここの記述についての詳細は前述削除内容の編集参照)
箇所:''
a[2]
と置き換え
自動でチェックボックスまで出力してくれるタイプ
demo & source code
demo
HTML
- <textarea class="copybox1_auto">いろはにほへと
- ちりぬるを</textarea>
jQuery
- $(function(){
- $('.copybox1_auto').each(function(){
- var $tgt = $(this);
- var $chk = $('<input type="checkbox" />');
- var org = $tgt.val();
- $tgt.after($chk);
- $chk.after('改行削除');
- $chk.on('change',function(){
- $tgt.val( !$chk.prop('checked') ? org : org.replace(/\n/g,'') );
- });
- });
- });
基本処理は改行を消せるタイプと同じです。
変更点
改行を消せるタイプではにて、読み込み済のHTMLからセレクタ指定してチェックボックスを取得していましたが、上記では同行にて新規にチェックボックスを生成(そのまま変数$chk
へ格納)、で対象テキストエリアの次に配置されるよう設定しています。
チェックボックスだけあっても意味不明なので、ついでににてチェックボックス横に文字列を追加。
jQuery実行後のHTML
- <textarea class="copybox1_auto">いろはにほへと
- ちりぬるを</textarea><input type="checkbox" />改行削除
この辺りはもう、特定要素に.append()
.prepend()
.before()
.after()
あたりのメソッド使うなりで上手い事やってください。
記述例:配布用ソースコードはとにかくシンプルに、と思い上記の形にしていますが、デモは実際
記述です。実働jQuery
- $('.copybox1_auto').each(function(){
- var $tgt = $(this);
- var $chk = $('<input type="checkbox" />');
- var org = $tgt.val();
- var $lbl = $('<label />').html('<i></i>改行削除');//新規label要素生成。要素内htmlをi要素と表示用テキストに
- $lbl.prepend($chk);//上記label要素内先頭にチェックボックス追加
- $tgt.after( $('<div />').append($lbl) );//テキストエリア直後に上記label要素を内包したdiv要素を配置
- $chk.on('change',function(){
- $tgt.val( !$chk.prop('checked') ? org : org.replace(/\n/g,'') );
- });
- });
実働jQuery実行後のHTML
- <textarea class="copybox1_auto">いろはにほへと
- ちりぬるを</textarea><div><label><input type="checkbox" /><i></i>改行削除</label></div>
▽やりたかった事
- チェックボックスは
label
要素に入れたい - チェックボックスについてのテキストも同要素に入れたい
- チェックボックス直後は表示の関係で
i
要素の必要がある - テキストエリアと
label
要素を直で兄弟要素にするのは避けたい
処理についての注意
置き換え元テキストについて
どの処理も、var org = $tgt.val();
部分でテキストエリアの入力内容を最初に保管し、以降チェックボックスの変化に応じて保管したテキストを元に変換しています。
つまり閲覧者が編集した内容はチェックボックス変化時に破棄されます。
避けたい方はvar org = $tgt.val();
下にでも下記の処理を足してください。
追加処理
- $tgt.on('change',function(){
- org = $tgt.val();
- });
テキストエリアの内容変化毎に変換元にする保管テキストを変更しています。
ただこれも改行消去後に編集とかすると、改行無し状態を変換元にしちゃうのでツール自体の意味がなくなる……