文字列置換(html escape)ツールの例

 

特定の文字列を変換(html escape)するツールを作ってみましょう
というお題、考えてみたでしょうか?

毎度、イガジーです。

クリップボードを使う文字列のコピペサンプルとして
ソースを持っておくと、何かと役に立つと思います。

という訳で、さっそく回答例を書いておきます。
これはひとつの例ですから、多少異なっていても、きちんと動けば正解です。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;

public class HtmlEscape extends Frame {
	private static final long serialVersionUID = 1L;
	TextArea ta;
	Clipboard clp;

	String blb[]={
			"Paste",
			"Encode",
			"Decode",
			"Copy",
			"End"
	};
	ActionListener al[]={
			new PasteC(),
			new HEnc(),
			new HDec(),
			new CpyC(),
			new SysEnd()
	};
	int btnum=blb.length;
	Button b[]=new Button[btnum];

		HtmlEscape(){
		this.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
        });
		this.setTitle("HtmlEscape");
		clp=Toolkit.getDefaultToolkit().getSystemClipboard();
		Panel pb=new Panel();
		pb.setLayout(new FlowLayout());
		ta=new TextArea();
		for (int i=0;i<btnum;++i){
			b[i]=new Button(blb[i]);
			b[i].addActionListener(al[i]);
			pb.add(b[i]);
		}
		this.add(ta,BorderLayout.CENTER);
		this.add(pb,BorderLayout.SOUTH);
		this.setSize(400,400);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		new HtmlEscape();
	}

	class CpyC implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			StringSelection ss=new StringSelection(ta.getText());
			clp.setContents(ss, ss);
		}// actionPerformed
	} // class CpyC
	class PasteC implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			try {
				ta.setText((String) clp.getData(DataFlavor.stringFlavor));
			} catch (UnsupportedFlavorException e1) {
//				e1.printStackTrace();
				// do nothing
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}// actionPerformed
	} // class PasteC
	class HEnc implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			String ss=ta.getText();
			ss=ss.replaceAll("&", "&amp;");
			ss=ss.replaceAll(">", "&gt;");
			ss=ss.replaceAll("<", "&lt;");
			ta.setText(ss);
		}
	}
	class HDec implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			String ss=ta.getText();
			ss=ss.replaceAll("&gt;", ">" );
			ss=ss.replaceAll("&lt;", "<" );
			ss=ss.replaceAll("&amp;","&" );
			ta.setText(ss);
		}
	}
	class SysEnd implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			System.exit(0);
		}
	}
}

いつもはimportを省略するのですが、今回は含めています。
ボタンが5つあるのですが、似たような処理を5回書き下すのが
面倒に思えたので、配列にしてループさせています(5回書き下してもかまいません)。

このソースコードを貼るのに、このツール自身でソースコードの変換
(html escape)をしました。
以前は手作業だったので、変換忘れをした事もありましたが、
今後は大丈夫になる見込みです。

ご意見、ご感想をお持ちの方は、コメントでもメールでもお知らせください。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)