// ================================================================================================
//
// MediaWikiページのテンプレート要素をあらわすモデルクラスソース
//
//
// Copyright (C) 2012 Honeplus. All rights reserved.
//
// Honeplus
// ================================================================================================
namespace Honememo.Wptscs.Parsers
{
using System;
using System.Collections.Generic;
using System.Text;
using Honememo.Parsers;
using Honememo.Utilities;
///
/// MediaWikiページのテンプレート要素をあらわすモデルクラスです。
///
public class MediaWikiTemplate : MediaWikiLink
{
#region 定数
///
/// テンプレートの開始タグ。
///
public static readonly new string DelimiterStart = "{{";
///
/// テンプレートの閉じタグ。
///
public static readonly new string DelimiterEnd = "}}";
///
/// msgnwの書式。
///
public static readonly string Msgnw = "msgnw:";
#endregion
#region private変数
///
/// テンプレートの記事名。
///
private string title;
#endregion
#region コンストラクタ
///
/// 指定されたタイトルのテンプレート要素をあらわすインスタンスを生成する。
///
/// テンプレート名。
public MediaWikiTemplate(string title) : base(title)
{
}
#endregion
#region プロパティ
///
/// テンプレートの記事名。
///
/// 記事名がnullの場合。
/// 記事名が空の場合。
/// テンプレートに記載されていた記事名であり、名前空間の情報などは含まない可能性があるため注意。
public override string Title
{
get
{
return this.title;
}
set
{
this.title = Validate.NotBlank(value);
}
}
///
/// テンプレートのソースをそのまま出力することを示す msgnw: が付加されているか?
///
public virtual bool IsMsgnw
{
get;
set;
}
///
/// 記事名の後で改行が入るか?
///
public virtual bool NewLine
{
get;
set;
}
#endregion
#region 実装支援用抽象メソッド実装
///
/// この要素を書式化したテンプレートテキストを返す。
///
/// テンプレートテキスト。
protected override string ToStringImpl()
{
// 戻り値初期化
StringBuilder b = new StringBuilder();
// 開始タグの付加
b.Append(MediaWikiTemplate.DelimiterStart);
// 先頭の : の付加(テンプレート名前空間ではなく標準名前空間となる)
if (this.IsColon)
{
b.Append(':');
}
// msgnw: (テンプレートをタグで挟む)の付加
if (this.IsMsgnw)
{
b.Append(MediaWikiTemplate.Msgnw);
}
// 言語コード・他プロジェクトコードの付加
if (!string.IsNullOrEmpty(this.Interwiki))
{
b.Append(this.Interwiki);
b.Append(':');
}
// テンプレート名の付加
if (!string.IsNullOrEmpty(this.Title))
{
b.Append(this.Title);
}
// セクション名の付加
if (this.Section != null)
{
b.Append('#');
b.Append(this.Section);
}
// 改行の付加
if (this.NewLine)
{
b.Append('\n');
}
// パイプ後の文字列の付加
if (this.PipeTexts != null)
{
foreach (IElement p in this.PipeTexts)
{
b.Append('|');
b.Append(p.ToString());
}
}
// 閉じタグの付加
b.Append(MediaWikiTemplate.DelimiterEnd);
return b.ToString();
}
#endregion
}
}