htmlescapeツールの改良版

 

このブログで、いくつかツールの例を公開していますが
一番使っている(役に立っている)のが htmlescape ツール、すなわち
<を < >を> などに置き換えるツールです。
なにせ、このブログでソースを公開する際には必須ですから。

毎度、管理人イガジーです。

htmlにする際に置き換える文字列は、<>&だけではなく
他にもあるようです。(気にしだすと切りがないみたいですが。)
前回のプログラム例を少々改良してみました。

改良点は、
・swingのJTextAreaを使い、TAB幅を4にした
・行頭タブを削除するボタン[DelLtab]を追加
・置き換え対象を&(amp)<(lt)>(gt)”(quot)’(aps)¥(yen)として
個々に置き換えする/しないを指定できるようにした(JCheckBox)
です。
コピー&ペーストの機能(ボタン)は前回と同じです。

¥は、ソース上では¥¥と2つ書く必要があり、かつreplaceAll では
正規表現になるので¥が2つ必要です。(都合、¥¥¥¥と4つになる!)
では、改良版のソースコードです。

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
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.io.IOException;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JHtmlEscape extends JFrame {
	private static final long serialVersionUID = 1L;
	JTextArea ta;
	Clipboard clp;
	JCheckBox []jcb = new JCheckBox[6];
	String []jcbl={"&","<",">","¥"","'","¥¥yen" };
	final int _amp=0,_lt=1,_gt=2,_quot=3,_apos=4,_yen=5;

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

	JHtmlEscape(){
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("JHtmlEscape");
		clp=Toolkit.getDefaultToolkit().getSystemClipboard();
		JPanel pb=new JPanel();
		pb.setLayout(new FlowLayout());
		ta=new JTextArea();
		ta.setFont(new Font(Font.MONOSPACED,Font.PLAIN,14));
		ta.setTabSize(4);
		JScrollPane jsp=new JScrollPane(ta);

		for (int i=0;i<btnum;++i){
			b[i]=new JButton(blb[i]);
			b[i].addActionListener(al[i]);
			pb.add(b[i]);
		}
		this.add(jsp,BorderLayout.CENTER);
		this.add(pb,BorderLayout.SOUTH);

		JPanel p0=new JPanel();
		p0.setLayout(new FlowLayout(FlowLayout.LEFT));
		for (int i=0;i<jcb.length;++i){
			jcb[i]=new JCheckBox(jcbl[i],true);
			p0.add(jcb[i]);
		}
		this.add(p0,BorderLayout.NORTH);

		this.setSize(460,400);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		new JHtmlEscape();
	}

	class CpyC implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			StringSelection ss;
			int s1=ta.getSelectionStart();
			int s2=ta.getSelectionEnd();
			if (s1==s2)	ss=new StringSelection(ta.getText());
			else ss=new StringSelection(ta.getSelectedText());
			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();
			if (jcb[_amp].isSelected()) ss=ss.replaceAll("&", "&amp;");
			if (jcb[_lt].isSelected()) ss=ss.replaceAll("<", "&lt;");
			if (jcb[_gt].isSelected()) ss=ss.replaceAll(">", "&gt;");
			if (jcb[_quot].isSelected()) ss=ss.replaceAll("¥"", "&quot;");
			if (jcb[_apos].isSelected()) ss=ss.replaceAll("'", "&apos;"); // &#039;
			if (jcb[_yen].isSelected()) ss=ss.replaceAll("¥¥¥¥", "&yen;"); // &#039;
			ta.setText(ss);
		}
	}
	class HDec implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			String ss=ta.getText();
			if (jcb[_yen].isSelected()) ss=ss.replaceAll("&yen;", "¥¥¥¥" );
			if (jcb[_apos].isSelected()) ss=ss.replaceAll("&apos;", "'" );
			if (jcb[_quot].isSelected()) ss=ss.replaceAll("&quot;", "¥"" );
			if (jcb[_gt].isSelected()) ss=ss.replaceAll("&gt;", ">" );
			if (jcb[_lt].isSelected()) ss=ss.replaceAll("&lt;", "<" );
			if (jcb[_amp].isSelected()) ss=ss.replaceAll("&amp;","&" );
			ta.setText(ss);
		}
	}
	class Rm1Tab implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			String sa="¥n"+ta.getText();
			sa=sa.replaceAll("¥n¥t", "¥n");
			ta.setText(sa.substring(1));
		}
	}
}

[Paste]ボタンは、テキストエリアに何があってもそれを消去して
ペーストします(事前に残りテキストを削除する必要はありません)。
また[Copy]は範囲指定せずに押すと「全コピー」になります。
(範囲指定して押せば、その範囲だけのコピーになります)

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

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

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