OSDN Git Service

584885913e8ed0ac51b936138b9c0b0c3b8cde0a
[wptscs/wpts.git] / Wptscs / Parsers / MediaWikiLink.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiページの内部リンク要素をあらわすモデルクラスソース</summary>
4 //
5 // <copyright file="MediaWikiLink.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 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 System.Text;
16     using Honememo.Parsers;
17
18     /// <summary>
19     /// MediaWikiページの内部リンク要素をあらわすモデルクラスです。
20     /// </summary>
21     public class MediaWikiLink : AbstractElement
22     {
23         #region 定数
24
25         /// <summary>
26         /// 内部リンクの開始タグ。
27         /// </summary>
28         public static readonly string DelimiterStart = "[[";
29
30         /// <summary>
31         /// 内部リンクの閉じタグ。
32         /// </summary>
33         public static readonly string DelimiterEnd = "]]";
34
35         #endregion
36
37         #region コンストラクタ
38
39         /// <summary>
40         /// 指定されたタイトルの内部リンク要素をあらわすインスタンスを生成する。
41         /// </summary>
42         /// <param name="title">記事名。</param>
43         public MediaWikiLink(string title) : this()
44         {
45             this.Title = title;
46         }
47
48         /// <summary>
49         /// 内部リンク要素をあらわす空のインスタンスを生成する。
50         /// </summary>
51         public MediaWikiLink()
52         {
53             this.PipeTexts = new List<IElement>();
54         }
55
56         #endregion
57
58         #region プロパティ
59
60         /// <summary>
61         /// リンクの記事名。
62         /// </summary>
63         /// <remarks>リンクに記載されていた記事名であり、名前空間の情報などは含まない可能性があるため注意。</remarks>
64         public virtual string Title
65         {
66             get;
67             set;
68         }
69
70         /// <summary>
71         /// リンクのセクション名(#)。
72         /// </summary>
73         public virtual string Section
74         {
75             get;
76             set;
77         }
78
79         /// <summary>
80         /// リンクのパイプ後の文字列(|)。
81         /// </summary>
82         public virtual IList<IElement> PipeTexts
83         {
84             get;
85             set;
86         }
87
88         /// <summary>
89         /// ウィキ間リンクのコード値。
90         /// </summary>
91         public virtual string Interwiki
92         {
93             get;
94             set;
95         }
96
97         /// <summary>
98         /// リンクの先頭が : で始まるかを示すフラグ。
99         /// </summary>
100         public virtual bool IsColon
101         {
102             get;
103             set;
104         }
105
106         #endregion
107
108         #region 公開メソッド
109
110         /// <summary>
111         /// サブページ形式のリンクか?
112         /// </summary>
113         /// <returns>サブページ形式の場合<c>true</c>。</returns>
114         public virtual bool IsSubpage()
115         {
116             // 記事名部分が / または ../ で始まる場合サブページ形式と判定
117             return this.Title != null && (this.Title.StartsWith("/") || this.Title.StartsWith("../"));
118         }
119
120         /// <summary>
121         /// この要素を書式化したリンク先部分のテキスト(先頭の:から言語コード, 記事名, セクションまで)を返す。
122         /// </summary>
123         /// <returns>記事名部分のテキスト。</returns>
124         public virtual string GetLinkString()
125         {
126             StringBuilder b = new StringBuilder();
127
128             // 先頭の : の付加
129             if (this.IsColon)
130             {
131                 b.Append(':');
132             }
133
134             // 言語コード・他プロジェクトコードの付加
135             if (!string.IsNullOrEmpty(this.Interwiki))
136             {
137                 b.Append(this.Interwiki);
138                 b.Append(':');
139             }
140
141             // 記事名の付加
142             if (!string.IsNullOrEmpty(this.Title))
143             {
144                 b.Append(this.Title);
145             }
146
147             // セクション名の付加
148             if (this.Section != null)
149             {
150                 b.Append('#');
151                 b.Append(this.Section);
152             }
153
154             return b.ToString();
155         }
156
157         #endregion
158
159         #region 実装支援用抽象メソッド実装
160
161         /// <summary>
162         /// この要素を書式化した内部リンクテキストを返す。
163         /// </summary>
164         /// <returns>内部リンクテキスト。</returns>
165         protected override string ToStringImpl()
166         {
167             // 戻り値初期化
168             StringBuilder b = new StringBuilder();
169             
170             // 開始タグの付加
171             b.Append(MediaWikiLink.DelimiterStart);
172
173             // リンク先部分のテキスト(先頭の:から言語コード, 記事名, セクションまで)を設定
174             b.Append(this.GetLinkString());
175
176             // パイプ後の文字列の付加
177             if (this.PipeTexts != null)
178             {
179                 foreach (IElement p in this.PipeTexts)
180                 {
181                     b.Append('|');
182                     b.Append(p.ToString());
183                 }
184             }
185
186             // 閉じタグの付加
187             b.Append(MediaWikiLink.DelimiterEnd);
188             return b.ToString();
189         }
190
191         #endregion
192     }
193 }