1 // ================================================================================================
3 // MediaWikiの変数を解析するパーサークラスソース</summary>
5 // <copyright file="MediaWikiVariableParser.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Wptscs.Parsers
14 using System.Collections.Generic;
16 using Honememo.Parsers;
17 using Honememo.Utilities;
20 /// MediaWikiの変数を解析するパーサークラスです。
22 public class MediaWikiVariableParser : AbstractParser
27 /// このパーサーが参照する<see cref="MediaWikiParser"/>。
29 private MediaWikiParser parser;
36 /// 指定された<see cref="MediaWikiParser"/>を元に変数を解析するためのパーサーを作成する。
38 /// <param name="parser">このパーサーが参照する<see cref="MediaWikiParser"/>。</param>
39 public MediaWikiVariableParser(MediaWikiParser parser)
49 /// 渡されたテキストをMediaWikiの変数として解析する。
51 /// <param name="s">解析対象の文字列。</param>
52 /// <param name="result">解析した変数。</param>
53 /// <returns>解析に成功した場合<c>true</c>。</returns>
54 public override bool TryParse(string s, out IElement result)
60 if (s == null || !s.StartsWith(MediaWikiVariable.DelimiterStart))
66 StringBuilder variable = new StringBuilder();
67 IElement value = null;
69 for (int i = MediaWikiVariable.DelimiterStart.Length; i < s.Length; i++)
72 if (StringUtils.StartsWith(s, MediaWikiVariable.DelimiterEnd, i))
74 lastIndex = i + MediaWikiVariable.DelimiterEnd.Length - 1;
78 // {{{変数名|デフォルト値}}} といったフォーマットのため、| の前後で処理を変更
81 // | の後(変数のデフォルト値など)は何でもありえるので親のパーサーで再帰的に解析
82 if (!this.parser.TryParseToDelimiter(StringUtils.Substring(s, i + 1), out value, MediaWikiVariable.DelimiterEnd))
84 // 平文でも解析するメソッドのため、基本的に失敗することは無い
89 i += value.ToString().Length;
93 // | の前(変数名の部分)のとき、変数・コメントの再帰チェック
95 if (this.TryParseAt(s, i, out element, this.parser.CommentParser, this.parser.VariableParser))
97 // 変数・コメントなら、解析したブロック単位で変数名に追加
98 i += element.ToString().Length - 1;
99 variable.Append(element.ToString());
103 // それ以外の普通の文字なら1文字ずつ変数名に追加
104 variable.Append(s[i]);
108 // 終了条件でループを抜けていない場合、解析失敗
114 // 変数名・値と、解析した素の文字列を結果に格納して終了
115 result = new MediaWikiVariable(variable.ToString(), value);
116 result.ParsedString = s.Substring(0, lastIndex + 1);
122 /// 渡された文字が<see cref="TryParse"/>等の候補となる先頭文字かを判定する。
124 /// <param name="c">解析文字列の先頭文字。</param>
125 /// <returns>候補となる場合<c>true</c>。このクラスでは常に<c>true</c>を返す。</returns>
126 /// <remarks>性能対策などで<see cref="TryParse"/>を呼ぶ前に目処を付けたい場合用。</remarks>
127 public override bool IsPossibleParse(char c)
129 return MediaWikiVariable.DelimiterStart[0] == c;