OSDN Git Service

e4b995a9e19ca52ddb5179728fd4cd03bba02bcf
[wptscs/wpts.git] / Wptscs / Parsers / MediaWikiRedirectParser.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiのリダイレクトページを解析するパーサークラスソース</summary>
4 //
5 // <copyright file="MediaWikiRedirectParser.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Parsers
12 {
13     using System;
14     using System.Collections.Generic;
15     using Honememo.Parsers;
16     using Honememo.Wptscs.Properties;
17     using Honememo.Wptscs.Websites;
18
19     /// <summary>
20     /// MediaWikiのリダイレクトページを解析するパーサークラスです。
21     /// </summary>
22     public class MediaWikiRedirectParser : MediaWikiParser
23     {
24         #region コンストラクタ
25
26         /// <summary>
27         /// 指定されたMediaWikiサーバーのページを解析するためのパーサーを作成する。
28         /// </summary>
29         /// <param name="site">このパーサーが対応するMediaWiki。</param>
30         /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
31         public MediaWikiRedirectParser(MediaWiki site)
32             : base(site)
33         {
34         }
35
36         #endregion
37
38         #region ITextParserインタフェース実装メソッド
39
40         /// <summary>
41         /// 渡されたMediaWikiページをMediaWikiのリダイレクトページとして解析する。
42         /// </summary>
43         /// <param name="s">解析対象のMediaWikiページ本文。</param>
44         /// <param name="condition">解析を終了するかの判定を行うデリゲート。本クラスでは無視されます。</param>
45         /// <param name="result">解析したリダイレクトリンク。</param>
46         /// <returns>解析に成功した場合<c>true</c>。</returns>
47         /// <remarks>
48         /// このメソッドへはMediaWikiのページ全体を渡す必要があります。
49         /// また、ページ全体を解析する必要があることから、
50         /// <paramref name="condition"/>が指定されていても無視します。
51         /// </remarks>
52         /// <exception cref="ObjectDisposedException"><see cref="MediaWikiParser.Dispose"/>が実行済みの場合。</exception>
53         public override bool TryParseToEndCondition(string s, IsEndCondition condition, out IElement result)
54         {
55             result = null;
56             if (this.LinkParser == null)
57             {
58                 // 子パーサーが解放済みの場合Dispose済みで処理不可
59                 throw new ObjectDisposedException(this.GetType().Name);
60             }
61             else if (String.IsNullOrEmpty(s))
62             {
63                 // 入力値が空の場合は即終了
64                 return false;
65             }
66
67             // 日本語版みたいに、#REDIRECTと言語固有の#転送みたいなのがあると思われるので、
68             // 翻訳元言語とデフォルトの設定でチェック
69             string trim = s.TrimStart();
70             string lower = trim.ToLower();
71             for (int i = 0; i < 2; i++)
72             {
73                 string format = this.Website.Redirect;
74                 if (i == 1)
75                 {
76                     format = Settings.Default.MediaWikiRedirect;
77                 }
78
79                 if (!String.IsNullOrEmpty(format)
80                     && lower.StartsWith(format.ToLower()))
81                 {
82                     // "#REDIRECT "の部分をカットして後ろの[[~]]の部分のリンクを解析
83                     if (this.LinkParser.TryParse(trim.Substring(format.Length).TrimStart(), out result))
84                     {
85                         return true;
86                     }
87                 }
88             }
89
90             return false;
91         }
92         
93         #endregion
94     }
95 }