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("&", "&");
if (jcb[_lt].isSelected()) ss=ss.replaceAll("<", "<");
if (jcb[_gt].isSelected()) ss=ss.replaceAll(">", ">");
if (jcb[_quot].isSelected()) ss=ss.replaceAll("¥"", """);
if (jcb[_apos].isSelected()) ss=ss.replaceAll("'", "'"); // '
if (jcb[_yen].isSelected()) ss=ss.replaceAll("¥¥¥¥", "¥"); // '
ta.setText(ss);
}
}
class HDec implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
String ss=ta.getText();
if (jcb[_yen].isSelected()) ss=ss.replaceAll("¥", "¥¥¥¥" );
if (jcb[_apos].isSelected()) ss=ss.replaceAll("'", "'" );
if (jcb[_quot].isSelected()) ss=ss.replaceAll(""", "¥"" );
if (jcb[_gt].isSelected()) ss=ss.replaceAll(">", ">" );
if (jcb[_lt].isSelected()) ss=ss.replaceAll("<", "<" );
if (jcb[_amp].isSelected()) ss=ss.replaceAll("&","&" );
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]は範囲指定せずに押すと「全コピー」になります。
(範囲指定して押せば、その範囲だけのコピーになります)
この記事へのコメントはこちら