• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

作業部屋の使い方を試しています。


Commit MetaInfo

Revision37 (tree)
Time2014-07-10 12:48:28
Authortuna_p

Log Message

(empty log message)

Change Summary

Incremental Difference

--- HtmlTest2/src/Form/SearchDataRW.java (nonexistent)
+++ HtmlTest2/src/Form/SearchDataRW.java (revision 37)
@@ -0,0 +1,121 @@
1+/*
2+ * To change this license header, choose License Headers in Project Properties.
3+ * To change this template file, choose Tools | Templates
4+ * and open the template in the editor.
5+ */
6+
7+package Form;
8+
9+import Lib.SearchData;
10+import java.io.BufferedReader;
11+import java.io.BufferedWriter;
12+import java.io.File;
13+import java.io.FileInputStream;
14+import java.io.FileOutputStream;
15+import java.io.IOException;
16+import java.io.InputStreamReader;
17+import java.io.OutputStreamWriter;
18+import java.util.ArrayList;
19+
20+/**
21+ *
22+ * @author kgto
23+ */
24+public class SearchDataRW {
25+
26+ private final String splitchar = "\t";
27+
28+ private String UrlAdress;
29+ private ArrayList slist;
30+
31+ public void seturl(String UrlAdress) {
32+ this.UrlAdress = UrlAdress;
33+ }
34+
35+ public void setslist(ArrayList slist) {
36+ this.slist = slist;
37+ }
38+
39+ public String geturl() {
40+ return UrlAdress;
41+ }
42+
43+ public ArrayList getslist() {
44+ return slist;
45+ }
46+
47+ /**
48+ * 保存
49+ * @param file
50+ */
51+ public void save(File file) {
52+
53+ try {
54+ //空のファイルを作成
55+ file.createNewFile();
56+
57+ FileOutputStream fileoutputstream = new FileOutputStream(file);
58+ OutputStreamWriter outputstreamwriter = new OutputStreamWriter(fileoutputstream, "UTF-8");
59+ BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);
60+
61+ // URL
62+ bufferedwriter.write(UrlAdress);
63+ bufferedwriter.write("\n");
64+ // 検索情報
65+ for (Object slist1 : slist) {
66+ SearchData sdat = (SearchData) slist1;
67+ StringBuilder str = new StringBuilder();
68+ str.append(sdat.getitem()).append(splitchar);
69+ str.append(sdat.getHtmltag()).append(splitchar);
70+ str.append(sdat.getHtmlid()).append(splitchar);
71+ str.append(sdat.getHtmlclass()).append(splitchar);
72+ str.append(sdat.getaround()).append(splitchar);
73+ str.append(sdat.getregexp()).append("\n");
74+
75+ bufferedwriter.write(str.toString());
76+ }
77+ bufferedwriter.close();
78+
79+ } catch(IOException e) {
80+ System.out.println(e);
81+ }
82+ }
83+
84+ /**
85+ * 読込
86+ * @param file
87+ */
88+ public void load(File file) {
89+ slist = new ArrayList();
90+
91+ try {
92+ FileInputStream fileinputstream = new FileInputStream(file);
93+ InputStreamReader inputstreamreader = new InputStreamReader(fileinputstream, "UTF-8");
94+ BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
95+
96+ String rec;
97+
98+ // URL
99+ UrlAdress = bufferedreader.readLine();
100+ // 検索情報
101+ while((rec = bufferedreader.readLine()) != null) {
102+ String[] recary = rec.split(splitchar, -1);
103+ SearchData sdat = new SearchData();
104+ sdat.setitem(recary[0]);
105+ sdat.setHtmltag(recary[1]);
106+ sdat.setHtmlid(recary[2]);
107+ sdat.setHtmlclass(recary[3]);
108+ sdat.setaround(recary[4]);
109+ sdat.setregexp(recary[5]);
110+
111+ slist.add(sdat);
112+ }
113+ bufferedreader.close();
114+
115+ } catch(IOException e) {
116+ System.out.println(e);
117+ }
118+
119+ }
120+
121+}
--- HtmlTest2/src/Form/HtmlSearch.java (nonexistent)
+++ HtmlTest2/src/Form/HtmlSearch.java (revision 37)
@@ -0,0 +1,361 @@
1+/*
2+ * To change this license header, choose License Headers in Project Properties.
3+ * To change this template file, choose Tools | Templates
4+ * and open the template in the editor.
5+ */
6+
7+package Form;
8+
9+import Lib.HtmlParser;
10+import Lib.SearchData;
11+import java.io.File;
12+import java.util.*;
13+import javax.swing.JFileChooser;
14+import javax.swing.filechooser.FileNameExtensionFilter;
15+import org.jdesktop.observablecollections.ObservableCollections;
16+
17+/**
18+ * HTMLページ上の特定の項目を検索し、その項目内容の値を取得する。
19+ * @author kgto
20+ */
21+public class HtmlSearch extends javax.swing.JFrame {
22+
23+ private ArrayList slist = new ArrayList();
24+ private List serachDataList = ObservableCollections.observableList(slist);
25+ private SearchDataRW sio = new SearchDataRW();
26+
27+ /**
28+ * Creates new form Frame1
29+ */
30+ public HtmlSearch() {
31+ initComponents();
32+ }
33+
34+ public List getSerachDataList() {
35+ return this.serachDataList;
36+ }
37+
38+ public void setSerachDataList(List serachDataList) {
39+ this.serachDataList = serachDataList;
40+ }
41+
42+ /**
43+ * This method is called from within the constructor to initialize the form.
44+ * WARNING: Do NOT modify this code. The content of this method is always
45+ * regenerated by the Form Editor.
46+ */
47+ @SuppressWarnings("unchecked")
48+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
49+ private void initComponents() {
50+ bindingGroup = new org.jdesktop.beansbinding.BindingGroup();
51+
52+ jFileChooser1 = new javax.swing.JFileChooser();
53+ jLabel1 = new javax.swing.JLabel();
54+ jTxtUrl = new javax.swing.JTextField();
55+ jBtnSearch = new javax.swing.JButton();
56+ jPanel1 = new javax.swing.JPanel();
57+ jScrollPane1 = new javax.swing.JScrollPane();
58+ jTable1 = new javax.swing.JTable();
59+ jBtnRowIns = new javax.swing.JButton();
60+ jBtnRowDel = new javax.swing.JButton();
61+ jBtnRowCpy = new javax.swing.JButton();
62+ jPanel2 = new javax.swing.JPanel();
63+ jScrollPane2 = new javax.swing.JScrollPane();
64+ jTxtRtn = new javax.swing.JTextArea();
65+ jMenuBar1 = new javax.swing.JMenuBar();
66+ jMenu1 = new javax.swing.JMenu();
67+ jMenuLoad = new javax.swing.JMenuItem();
68+ jMenuSave = new javax.swing.JMenuItem();
69+ jMenu2 = new javax.swing.JMenu();
70+
71+ jFileChooser1.setCurrentDirectory(new java.io.File("C:\\zz_work\\java"));
72+ jFileChooser1.setDialogTitle("");
73+ jFileChooser1.setFileFilter(new FileNameExtensionFilter("TEXTファイル", "txt"));
74+
75+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
76+ setTitle("タグ検索");
77+
78+ jLabel1.setText(" URL:");
79+
80+ jBtnSearch.setText("検索");
81+ jBtnSearch.addActionListener(new java.awt.event.ActionListener() {
82+ public void actionPerformed(java.awt.event.ActionEvent evt) {
83+ jBtnSearchActionPerformed(evt);
84+ }
85+ });
86+
87+ jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("検索情報"));
88+
89+ jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
90+ jTable1.getTableHeader().setReorderingAllowed(false);
91+
92+ org.jdesktop.beansbinding.ELProperty eLProperty = org.jdesktop.beansbinding.ELProperty.create("${serachDataList}");
93+ org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, this, eLProperty, jTable1);
94+ org.jdesktop.swingbinding.JTableBinding.ColumnBinding columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${item}"));
95+ columnBinding.setColumnName("項目名");
96+ columnBinding.setColumnClass(String.class);
97+ columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${htmltag}"));
98+ columnBinding.setColumnName("タグ");
99+ columnBinding.setColumnClass(String.class);
100+ columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${htmlid}"));
101+ columnBinding.setColumnName("ID");
102+ columnBinding.setColumnClass(String.class);
103+ columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${htmlclass}"));
104+ columnBinding.setColumnName("クラス");
105+ columnBinding.setColumnClass(String.class);
106+ columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${around}"));
107+ columnBinding.setColumnName("位置");
108+ columnBinding.setColumnClass(String.class);
109+ columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${regexp}"));
110+ columnBinding.setColumnName("抽出条件");
111+ columnBinding.setColumnClass(String.class);
112+ bindingGroup.addBinding(jTableBinding);
113+ jTableBinding.bind();
114+ jScrollPane1.setViewportView(jTable1);
115+
116+ jBtnRowIns.setText("行挿入");
117+ jBtnRowIns.addActionListener(new java.awt.event.ActionListener() {
118+ public void actionPerformed(java.awt.event.ActionEvent evt) {
119+ jBtnRowInsActionPerformed(evt);
120+ }
121+ });
122+
123+ jBtnRowDel.setText("行削除");
124+ jBtnRowDel.addActionListener(new java.awt.event.ActionListener() {
125+ public void actionPerformed(java.awt.event.ActionEvent evt) {
126+ jBtnRowDelActionPerformed(evt);
127+ }
128+ });
129+
130+ jBtnRowCpy.setText("行コピー");
131+ jBtnRowCpy.addActionListener(new java.awt.event.ActionListener() {
132+ public void actionPerformed(java.awt.event.ActionEvent evt) {
133+ jBtnRowCpyActionPerformed(evt);
134+ }
135+ });
136+
137+ javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
138+ jPanel1.setLayout(jPanel1Layout);
139+ jPanel1Layout.setHorizontalGroup(
140+ jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
141+ .addGroup(jPanel1Layout.createSequentialGroup()
142+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
143+ .addComponent(jBtnRowCpy)
144+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
145+ .addComponent(jBtnRowDel)
146+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
147+ .addComponent(jBtnRowIns))
148+ .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
149+ );
150+ jPanel1Layout.setVerticalGroup(
151+ jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
152+ .addGroup(jPanel1Layout.createSequentialGroup()
153+ .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
154+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
155+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
156+ .addComponent(jBtnRowDel)
157+ .addComponent(jBtnRowIns)
158+ .addComponent(jBtnRowCpy)))
159+ );
160+
161+ jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("検索結果"));
162+
163+ jTxtRtn.setColumns(20);
164+ jTxtRtn.setRows(5);
165+ jScrollPane2.setViewportView(jTxtRtn);
166+
167+ javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
168+ jPanel2.setLayout(jPanel2Layout);
169+ jPanel2Layout.setHorizontalGroup(
170+ jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
171+ .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 387, Short.MAX_VALUE)
172+ );
173+ jPanel2Layout.setVerticalGroup(
174+ jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
175+ .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE)
176+ );
177+
178+ jMenu1.setText("ファイル");
179+
180+ jMenuLoad.setText("LOAD");
181+ jMenuLoad.addActionListener(new java.awt.event.ActionListener() {
182+ public void actionPerformed(java.awt.event.ActionEvent evt) {
183+ jMenuLoadActionPerformed(evt);
184+ }
185+ });
186+ jMenu1.add(jMenuLoad);
187+
188+ jMenuSave.setText("SAVE");
189+ jMenuSave.addActionListener(new java.awt.event.ActionListener() {
190+ public void actionPerformed(java.awt.event.ActionEvent evt) {
191+ jMenuSaveActionPerformed(evt);
192+ }
193+ });
194+ jMenu1.add(jMenuSave);
195+
196+ jMenuBar1.add(jMenu1);
197+
198+ jMenu2.setText("検索");
199+ jMenu2.addMouseListener(new java.awt.event.MouseAdapter() {
200+ public void mouseClicked(java.awt.event.MouseEvent evt) {
201+ jMenu2MouseClicked(evt);
202+ }
203+ });
204+ jMenuBar1.add(jMenu2);
205+
206+ setJMenuBar(jMenuBar1);
207+
208+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
209+ getContentPane().setLayout(layout);
210+ layout.setHorizontalGroup(
211+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
212+ .addGroup(layout.createSequentialGroup()
213+ .addComponent(jLabel1)
214+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
215+ .addComponent(jTxtUrl)
216+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
217+ .addComponent(jBtnSearch))
218+ .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
219+ .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
220+ );
221+ layout.setVerticalGroup(
222+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
223+ .addGroup(layout.createSequentialGroup()
224+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
225+ .addComponent(jLabel1)
226+ .addComponent(jTxtUrl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
227+ .addComponent(jBtnSearch))
228+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
229+ .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
230+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
231+ .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
232+ );
233+
234+ bindingGroup.bind();
235+
236+ pack();
237+ }// </editor-fold>//GEN-END:initComponents
238+
239+ private void jBtnRowInsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnRowInsActionPerformed
240+ int SelectedRow = jTable1.getSelectedRow();
241+ SearchData sdat = new SearchData();
242+
243+ if(SelectedRow >= 0) {
244+ this.serachDataList.add(SelectedRow, sdat);
245+ } else {
246+ this.serachDataList.add(sdat);
247+ }
248+ }//GEN-LAST:event_jBtnRowInsActionPerformed
249+
250+ private void jBtnRowDelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnRowDelActionPerformed
251+ int SelectedRow = jTable1.getSelectedRow();
252+ if(!(SelectedRow < 0)) {
253+ this.serachDataList.remove(SelectedRow);
254+ }
255+ }//GEN-LAST:event_jBtnRowDelActionPerformed
256+
257+ private void jMenuLoadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuLoadActionPerformed
258+ int selected = jFileChooser1.showOpenDialog(this);
259+ if (selected == JFileChooser.APPROVE_OPTION) {
260+ File file = jFileChooser1.getSelectedFile();
261+ serachDataList.clear();
262+ sio.load(file);
263+ jTxtUrl.setText(sio.geturl());
264+ serachDataList.addAll(sio.getslist());
265+ }
266+ }//GEN-LAST:event_jMenuLoadActionPerformed
267+
268+ private void jMenuSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuSaveActionPerformed
269+ int selected = jFileChooser1.showSaveDialog(this);
270+ if (selected == JFileChooser.APPROVE_OPTION) {
271+ File file = jFileChooser1.getSelectedFile();
272+ sio.seturl(jTxtUrl.getText());
273+ sio.setslist(slist);
274+ sio.save(file);
275+ }
276+ }//GEN-LAST:event_jMenuSaveActionPerformed
277+
278+ private void jMenu2MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jMenu2MouseClicked
279+ jTxtRtn.setText(null);
280+ HtmlParser par = new HtmlParser(jTxtUrl.getText());
281+ for (Object slist1 : slist) {
282+ String rtn = par.search((SearchData)slist1);
283+ jTxtRtn.append(rtn + "\r\n");
284+ }
285+ }//GEN-LAST:event_jMenu2MouseClicked
286+
287+ private void jBtnRowCpyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnRowCpyActionPerformed
288+ int SelectedRow = jTable1.getSelectedRow();
289+ if(SelectedRow >= 0) {
290+ SearchData SelectData = (SearchData)slist.get(SelectedRow);
291+ SearchData Cpydata = new SearchData(SelectData);
292+ this.serachDataList.add(SelectedRow, Cpydata);
293+ }
294+ }//GEN-LAST:event_jBtnRowCpyActionPerformed
295+
296+ private void jBtnSearchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBtnSearchActionPerformed
297+ jTxtRtn.setText(null);
298+ HtmlParser par = new HtmlParser(jTxtUrl.getText());
299+ for (Object slist1 : slist) {
300+ String rtn = par.search((SearchData)slist1);
301+ jTxtRtn.append(rtn + "\r\n");
302+ }
303+ }//GEN-LAST:event_jBtnSearchActionPerformed
304+
305+ /**
306+ * @param args the command line arguments
307+ */
308+ public static void main(String args[]) {
309+ /* Set the Nimbus look and feel */
310+ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
311+ /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
312+ * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
313+ */
314+ try {
315+ for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
316+ if ("Nimbus".equals(info.getName())) {
317+ javax.swing.UIManager.setLookAndFeel(info.getClassName());
318+ break;
319+ }
320+ }
321+ } catch (ClassNotFoundException ex) {
322+ java.util.logging.Logger.getLogger(HtmlSearch.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
323+ } catch (InstantiationException ex) {
324+ java.util.logging.Logger.getLogger(HtmlSearch.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
325+ } catch (IllegalAccessException ex) {
326+ java.util.logging.Logger.getLogger(HtmlSearch.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
327+ } catch (javax.swing.UnsupportedLookAndFeelException ex) {
328+ java.util.logging.Logger.getLogger(HtmlSearch.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
329+ }
330+ //</editor-fold>
331+
332+ /* Create and display the form */
333+ java.awt.EventQueue.invokeLater(new Runnable() {
334+ public void run() {
335+ new HtmlSearch().setVisible(true);
336+ }
337+ });
338+ }
339+
340+ // Variables declaration - do not modify//GEN-BEGIN:variables
341+ private javax.swing.JButton jBtnRowCpy;
342+ private javax.swing.JButton jBtnRowDel;
343+ private javax.swing.JButton jBtnRowIns;
344+ private javax.swing.JButton jBtnSearch;
345+ private javax.swing.JFileChooser jFileChooser1;
346+ private javax.swing.JLabel jLabel1;
347+ private javax.swing.JMenu jMenu1;
348+ private javax.swing.JMenu jMenu2;
349+ private javax.swing.JMenuBar jMenuBar1;
350+ private javax.swing.JMenuItem jMenuLoad;
351+ private javax.swing.JMenuItem jMenuSave;
352+ private javax.swing.JPanel jPanel1;
353+ private javax.swing.JPanel jPanel2;
354+ private javax.swing.JScrollPane jScrollPane1;
355+ private javax.swing.JScrollPane jScrollPane2;
356+ private javax.swing.JTable jTable1;
357+ private javax.swing.JTextArea jTxtRtn;
358+ private javax.swing.JTextField jTxtUrl;
359+ private org.jdesktop.beansbinding.BindingGroup bindingGroup;
360+ // End of variables declaration//GEN-END:variables
361+}
--- HtmlTest2/src/Lib/HtmlParserCallback.java (nonexistent)
+++ HtmlTest2/src/Lib/HtmlParserCallback.java (revision 37)
@@ -0,0 +1,204 @@
1+/*
2+ * To change this license header, choose License Headers in Project Properties.
3+ * To change this template file, choose Tools | Templates
4+ * and open the template in the editor.
5+ */
6+
7+package Lib;
8+
9+import java.util.ArrayList;
10+import java.util.HashMap;
11+import javax.swing.text.MutableAttributeSet;
12+import javax.swing.text.html.HTML;
13+import javax.swing.text.html.HTMLEditorKit;
14+
15+/**
16+ *
17+ * @author kgto
18+ */
19+public class HtmlParserCallback extends HTMLEditorKit.ParserCallback {
20+
21+ // デバック情報表示フラグ
22+ final boolean DEBUG = false;
23+
24+ // Tag毎の階層
25+ HashMap<HTML.Tag,Integer> tagMap = new HashMap<>();
26+
27+ // serach key 情報
28+ String keytag;
29+ String keyid;
30+ String keyclass;
31+
32+ // serach key と一致時の情報退避
33+ int bufCount = 0;
34+ HTML.Tag bufTag = null;
35+ MutableAttributeSet bufAttr = null;
36+ // serach key と一致時の情報格納ワーク
37+ StringBuilder bufText;
38+
39+ // serach key と一致時のデータ一覧
40+ ArrayList sData;
41+
42+ public HtmlParserCallback(SearchData skey) {
43+
44+ // キー情報展開
45+ keytag = skey.getHtmltag();
46+ keyid = skey.getHtmlid();
47+ keyclass = skey.getHtmlclass();
48+
49+ sData = new ArrayList();
50+ }
51+
52+ public ArrayList getrtnData() {
53+ return this.sData;
54+ }
55+
56+ @Override
57+ public void handleStartTag(HTML.Tag tag, MutableAttributeSet attr, int pos){
58+ // Tag毎の階層を保持
59+ int count = 1;
60+ if(tagMap.containsKey(tag)) {
61+ count = tagMap.get(tag);
62+ count++;
63+ }
64+ tagMap.put(tag, count);
65+
66+ //--- DEBUG OUT ---- start ---
67+ if(DEBUG) {
68+ StringBuffer strBuf = new StringBuffer();
69+ String ret;
70+
71+ strBuf.append(count).append(" : F : ").append(tag.toString());
72+ ret = (String)attr.getAttribute(HTML.Attribute.ID);
73+ if(ret != null) {
74+ strBuf.append(" [ID] ").append(ret);
75+ }
76+ ret = (String)attr.getAttribute(HTML.Attribute.CLASS);
77+ if(ret != null) {
78+ strBuf.append(" [CLASS] ").append(ret);
79+ }
80+ ret = (String)attr.getAttribute(HTML.Attribute.VALUE);
81+ if(ret != null) {
82+ strBuf.append(" [VALUE] ").append(ret);
83+ }
84+ System.out.println(strBuf);
85+ }
86+ //--- DEBUG OUT ---- end ---
87+
88+ if(bufCount == 0) {
89+ if(tag.toString().equals(keytag)) {
90+ if(serachAttribute(attr)) {
91+ bufCount = count;
92+ bufTag = tag;
93+ bufAttr = attr;
94+ bufText = new StringBuilder();
95+ }
96+ }
97+ }
98+ }
99+
100+ @Override
101+ public void handleEndTag(HTML.Tag tag, int pos){
102+ // Tag毎の階層を取得
103+ int count = 0;
104+ if(tagMap.containsKey(tag)) {
105+ count = tagMap.get(tag);
106+ }
107+
108+ //--- DEBUG OUT ---- start ---
109+ if(DEBUG) {
110+ System.out.println(count + " : E : " + tag.toString());
111+ }
112+ //--- DEBUG OUT ---- end ---
113+
114+ if(tag.equals(bufTag) && count <= bufCount) {
115+
116+ // 溜め込んだ一致情報をリストへ格納
117+ sData.add(bufText.toString());
118+
119+ // 退避したserach keyとの一致情報クリア
120+ bufCount = 0;
121+ bufTag = null;
122+ bufAttr = null;
123+ bufText = null;
124+ }
125+
126+ // Tag毎の階層減算
127+ tagMap.put(tag, --count);
128+ }
129+
130+ @Override
131+ public void handleText(char[] data, int pos){
132+ //--- DEBUG OUT ---- start ---
133+ if(DEBUG) {
134+ String dat = new String(data);
135+ System.out.println(dat);
136+ }
137+ //--- DEBUG OUT ---- end ---
138+ String splitchar = "\t";
139+
140+ //制御文字の削除
141+ // &nbsp; 0xa0
142+ StringBuilder buf = new StringBuilder();
143+ for(int i = 0; i < data.length; i++) {
144+ if(data[i] > 0x1f && data[i] != 0x7f && data[i] != 0xa0) {
145+ buf.append(data[i]);
146+ }
147+ }
148+
149+ if(bufCount > 0) {
150+ if(bufText.length() > 0) {
151+ bufText.append(splitchar);
152+ }
153+ bufText.append(buf.toString());
154+ }
155+
156+ }
157+
158+ @Override
159+ public void handleSimpleTag(HTML.Tag tag, MutableAttributeSet attr, int pos){
160+ //--- DEBUG OUT ---- start ---
161+ if(DEBUG) {
162+ StringBuffer strBuf = new StringBuffer();
163+ String ret;
164+ strBuf.append("x : S : ").append(tag.toString());
165+ ret = (String)attr.getAttribute(HTML.Attribute.VALUE);
166+ if(ret != null) {
167+ strBuf.append(" [VALUE] ").append(ret);
168+ }
169+ System.out.println(strBuf);
170+ }
171+ //--- DEBUG OUT ---- end ---
172+ }
173+
174+ /**
175+ * ページ内のID/CLASS値と検索キーを比較する。
176+ * @param attr ページのMutableAttributeSet
177+ * @return boolean 検索キーと一致の時、true
178+ */
179+ public boolean serachAttribute(MutableAttributeSet attr) {
180+ String currentID = (String)attr.getAttribute(HTML.Attribute.ID);
181+ String currentClass = (String)attr.getAttribute(HTML.Attribute.CLASS);
182+
183+ if(keyid.isEmpty() == false && keyclass.isEmpty() == false) {
184+ if(keyid.equals(currentID) && keyclass.equals(currentClass)) {
185+ return true;
186+ }
187+ }
188+
189+ if(keyid.isEmpty() == false) {
190+ if(keyid.equals(currentID)) {
191+ return true;
192+ }
193+ }
194+
195+ if(keyclass.isEmpty() == false) {
196+ if(keyclass.equals(currentClass)) {
197+ return true;
198+ }
199+ }
200+
201+ return false;
202+ }
203+
204+}
--- HtmlTest2/src/Lib/SearchData.java (nonexistent)
+++ HtmlTest2/src/Lib/SearchData.java (revision 37)
@@ -0,0 +1,82 @@
1+/*
2+ * To change this license header, choose License Headers in Project Properties.
3+ * To change this template file, choose Tools | Templates
4+ * and open the template in the editor.
5+ */
6+
7+package Lib;
8+
9+/**
10+ *
11+ * @author kgto
12+ */
13+public class SearchData {
14+
15+ private String item;
16+ private String htmltag;
17+ private String htmlid;
18+ private String htmlclass;
19+ private String around;
20+ private String regexp;
21+
22+ public SearchData() {
23+ }
24+
25+ public SearchData(SearchData dat) {
26+ this.item = dat.getitem();
27+ this.htmltag = dat.getHtmltag();
28+ this.htmlid = dat.getHtmlid();
29+ this.htmlclass = dat.getHtmlclass();
30+ this.around = dat.getaround();
31+ this.regexp = dat.getregexp();
32+ }
33+
34+ public void setitem(String item) {
35+ this.item = item;
36+ }
37+
38+ public void setHtmltag(String htmltag) {
39+ this.htmltag = htmltag;
40+ }
41+
42+ public void setHtmlid(String htmlid) {
43+ this.htmlid = htmlid;
44+ }
45+
46+ public void setHtmlclass(String htmlclass) {
47+ this.htmlclass = htmlclass;
48+ }
49+
50+ public void setaround(String around) {
51+ this.around = around;
52+ }
53+
54+ public void setregexp(String regexp) {
55+ this.regexp = regexp;
56+ }
57+
58+ public String getitem() {
59+ return item;
60+ }
61+
62+ public String getHtmltag() {
63+ return htmltag;
64+ }
65+
66+ public String getHtmlid() {
67+ return htmlid;
68+ }
69+
70+ public String getHtmlclass() {
71+ return htmlclass;
72+ }
73+
74+ public String getaround() {
75+ return around;
76+ }
77+
78+ public String getregexp() {
79+ return regexp;
80+ }
81+
82+}
--- HtmlTest2/src/Lib/HtmlParser.java (nonexistent)
+++ HtmlTest2/src/Lib/HtmlParser.java (revision 37)
@@ -0,0 +1,201 @@
1+/*
2+ * To change this license header, choose License Headers in Project Properties.
3+ * To change this template file, choose Tools | Templates
4+ * and open the template in the editor.
5+ */
6+
7+package Lib;
8+
9+import java.io.*;
10+import java.net.*;
11+import java.util.ArrayList;
12+import java.util.regex.Matcher;
13+import java.util.regex.Pattern;
14+import javax.swing.text.html.parser.ParserDelegator;
15+
16+/**
17+ *
18+ * @author kgto
19+ */
20+public class HtmlParser {
21+
22+ String UrlAdress;
23+ String pageData;
24+
25+ ArrayList sData;
26+
27+ // 作業ワーク
28+ String htmltag;
29+ String htmlid;
30+ String htmlclass;
31+
32+ public HtmlParser() {
33+ UrlAdress = null;
34+ }
35+
36+ public HtmlParser(String UrlAdress) {
37+ this.UrlAdress = UrlAdress;
38+ getpageData();
39+ }
40+
41+ public void seturl(String UrlAdress) {
42+ this.UrlAdress = UrlAdress;
43+ getpageData();
44+ }
45+
46+ /**
47+ * HTMLページ内検索.
48+ * 検索キーとして渡されたタグ,ID,クラスから、対象となるタグを探し出し、
49+ * around(タグ位置)として指定された箇所の文字列をregexp(正規表現)で指定された整形を
50+ * 行った結果を返す。<br>
51+ * aroundの初期値:0 検索キーとして未指定(未入力)の場合、最初(0)の文字列。<br>
52+ * regexpが指定(入力)ありの場合、正規表現にて整形を行う。<br>
53+ * 渡された検索キーに一致するタグが存在しなかった場合、NULLを返す。
54+ * @param skey 検索キーデータ(SearchData)
55+ * @return String 検索キーに一致するデータの文字列
56+ */
57+ public String search(SearchData skey) {
58+
59+ String item = skey.getitem();
60+ String regexp = skey.getregexp();
61+
62+ // htmlページ内を検索
63+ if(isHtmlkeyEq(skey) == false) {
64+ serchpageData(skey);
65+ }
66+
67+ // 検索位置を数値変換
68+ String around = skey.getaround();
69+ byte bAround = 0;
70+ if(around.length() > 0) {
71+ bAround = Byte.parseByte(around);
72+ }
73+
74+ if(bAround < sData.size()) {
75+ String str = (String)sData.get(bAround);
76+ String rtn = RegularExpression(str, regexp);
77+ return item + "\t" + rtn;
78+ }
79+ return null;
80+ }
81+
82+ /**
83+ * 直近のHTMLタグ/ID/CLASS値と引数の値を比較する.
84+ * @param skey HTMLタグ/ID/CLASSが格納された検索キー
85+ * @return boolean HTMLタグ/ID/CLASS値が一致する時、true
86+ */
87+ public boolean isHtmlkeyEq(SearchData skey) {
88+
89+ String stag = skey.getHtmltag();
90+ String sid = skey.getHtmlid();
91+ String sclass = skey.getHtmlclass();
92+
93+ boolean rtn = true;
94+
95+ // htmltag
96+ if(htmltag == null) {
97+ rtn = false;
98+ } else {
99+ if(htmltag.equals(stag) == false) {
100+ rtn = false;
101+ }
102+ }
103+
104+ // htmlid
105+ if(htmlid == null) {
106+ rtn = false;
107+ } else {
108+ if(htmlid.equals(sid) == false) {
109+ rtn = false;
110+ }
111+ }
112+
113+ // htmlclass
114+ if(htmlclass == null) {
115+ rtn = false;
116+ } else {
117+ if(htmlclass.equals(sclass) == false) {
118+ rtn = false;
119+ }
120+ }
121+
122+ if(!rtn) {
123+ htmltag = stag;
124+ htmlid = sid;
125+ htmlclass = sclass;
126+ }
127+
128+ return rtn;
129+ }
130+
131+ /**
132+ * 正規表現検索.
133+ * @param strdata
134+ * @param regexp
135+ * @return
136+ */
137+ public String RegularExpression(String strdata, String regexp) {
138+ String expdata = null;
139+
140+ //regexpのチェック
141+ if(regexp.isEmpty()) {
142+ expdata = strdata;
143+ return expdata;
144+ }
145+
146+ //正規表現検索
147+ Pattern ptn = Pattern.compile(regexp);
148+ Matcher matchdata = ptn.matcher(strdata);
149+ if (matchdata.find()) {
150+ if(matchdata.groupCount() >= 1) {
151+ expdata = matchdata.group(1);
152+ }
153+ }
154+ return expdata;
155+ }
156+
157+ /**
158+ * インターネット接続.
159+ */
160+ public void getpageData() {
161+ try {
162+ URL url = new URL(UrlAdress);
163+ HttpURLConnection con = (HttpURLConnection)url.openConnection();
164+ con.setRequestMethod("GET");
165+ BufferedReader reader = new BufferedReader(
166+ new InputStreamReader(con.getInputStream(), "utf-8"));
167+ String wkline;
168+ StringBuilder sb = new StringBuilder();
169+ while((wkline = reader.readLine()) != null) {
170+ sb.append(wkline).append("\n");
171+ }
172+ pageData = sb.toString();
173+
174+ con.disconnect();
175+ }
176+ catch(IOException e) {
177+ System.err.println(e);
178+ }
179+ }
180+
181+ /**
182+ * HTMLパーサ.
183+ * @param skey
184+ */
185+ public void serchpageData(SearchData skey){
186+ Reader reader;
187+ try {
188+ reader = new BufferedReader(new StringReader(pageData));
189+ HtmlParserCallback cb = new HtmlParserCallback(skey);
190+ ParserDelegator pd = new ParserDelegator();
191+ pd.parse(reader, cb, true);
192+ reader.close();
193+
194+ sData = cb.getrtnData();
195+
196+ } catch (IOException e) {
197+ System.err.println(e);
198+ }
199+ }
200+
201+}