OSDN Git Service

7905b1bdac133fb229c37f8250e4ea47cc7741c3
[jindolf/JinParser.git] / src / main / java / jp / sourceforge / jindolf / parser / BasicHandler.java
1 /*
2  * basic handler for XHTML
3  *
4  * License : The MIT License
5  * Copyright(c) 2009 olyutorskii
6  */
7
8 package jp.sourceforge.jindolf.parser;
9
10 import jp.sourceforge.jindolf.corelib.PeriodType;
11 import jp.sourceforge.jindolf.corelib.VillageState;
12
13 /**
14  * 人狼BBSの各種XHTMLの基本的な構造をパースするためのハンドラ。
15  * このハンドラの全メソッドはパーサ{@link HtmlParser}により呼ばれる。
16  *
17  * パーサはパース開始時に{@link #startParse(DecodedContent)}を呼び、
18  * パース終了直前に{@link #endParse()}を呼ぶ。
19  * その間に他の様々なメソッドが呼び出される。
20  *
21  * 一部のメソッドに渡される{@link DecodedContent}文字列オブジェクトは
22  * mutableである。
23  * 後々で内容が必要になるならば、ハンドラはSeqRangeで示されたこの内容の
24  * 必要な箇所をコピーして保存しなければならない。
25  *
26  * フラグメントや属性値中の文字参照記号列の解釈はハンドラ側の責務とする。
27  *
28  * 各メソッドは、各々の判断で{@link HtmlParseException}をスローする
29  * ことにより、パース作業を中断させることができる。
30  */
31 public interface BasicHandler{
32
33     /**
34      * パース開始の通知を受け取る。
35      * @param content これからパースを始めるXHTML文字列
36      * @throws HtmlParseException パースエラー
37      */
38     void startParse(DecodedContent content) throws HtmlParseException;
39
40     /**
41      * titleタグの内容の通知を受け取る。
42      * 例:「人狼BBS:F F2019 新緑の村」。
43      * @param content パース対象文字列
44      * @param titleRange タイトルの範囲
45      * @throws HtmlParseException パースエラー
46      */
47     void pageTitle(DecodedContent content, SeqRange titleRange)
48             throws HtmlParseException;
49
50     /**
51      * ログイン名(ID)の通知を受け取る。
52      * ログインせずに得られたページがパース対象であるなら、呼ばれない。
53      * F国のみで動作確認。
54      * @param content パース対象文字列
55      * @param loginRange ログイン名の範囲
56      * @throws HtmlParseException パースエラー
57      */
58     void loginName(DecodedContent content, SeqRange loginRange)
59             throws HtmlParseException;
60
61     /**
62      * 読み込んだページ種別を自動認識した結果を伝える。
63      * ページタイトルもしくはログイン名の通知の後に呼ばれうる。
64      * @param type ページ種別
65      * @throws HtmlParseException パースエラー
66      */
67     void pageType(PageType type)
68             throws HtmlParseException;
69
70     /**
71      * 村の名前の通知を受け取る。
72      * 国名と番号と愛称に分解するのはハンドラ側の責務。
73      * 例:「F2019 新緑の村」。
74      * @param content パース対象文字列
75      * @param villageRange 村名の範囲
76      * @throws HtmlParseException パースエラー
77      */
78     void villageName(DecodedContent content, SeqRange villageRange)
79             throws HtmlParseException;
80
81     /**
82      * 次回更新時刻の通知を受け取る。
83      * 既に終了した村がパース対象の場合、あまり月日に意味はないかも。
84      * @param month 更新月
85      * @param day 更新日
86      * @param hour 更新時
87      * @param minute 更新分
88      * @throws HtmlParseException パースエラー
89      */
90     void commitTime(int month, int day, int hour, int minute)
91             throws HtmlParseException;
92
93     /**
94      * 他の日へのリンクの通知を受け取る。
95      * 複数回呼ばれる場合がある。
96      * @param content パース対象文字列
97      * @param anchorRange aタグhref属性値の範囲
98      * @param periodType 日のタイプ。「終了」ならnull。
99      * @param day 日にち。「プロローグ」、「エピローグ」、「終了」では-1。
100      * @throws HtmlParseException パースエラー
101      */
102     void periodLink(DecodedContent content,
103                      SeqRange anchorRange,
104                      PeriodType periodType, int day)
105             throws HtmlParseException;
106
107     /**
108      * 村一覧リスト内の個別の村情報の通知を受け取る。
109      * @param content パース対象文字列
110      * @param anchorRange URLの範囲
111      * @param villageRange 村名の範囲
112      * @param hour 更新時。不明なら負の数。
113      * @param minute 更新分。不明なら負の数。
114      * @param state 村の状態
115      * @throws HtmlParseException パースエラー
116      */
117     void villageRecord(DecodedContent content,
118                          SeqRange anchorRange,
119                          SeqRange villageRange,
120                          int hour, int minute,
121                          VillageState state )
122             throws HtmlParseException;
123
124     /**
125      * パースの終了の通知を受け取る。
126      * @throws HtmlParseException パースエラー
127      */
128     void endParse() throws HtmlParseException;
129
130 }