OSDN Git Service

#30244 Visual Studio 2012 Express for Windows Desktop, StyleCop 4.7, WiX 3.6 に合わせたソース...
[wptscs/wpts.git] / HmLib / Parsers / XmlCommentElementParser.cs
1 // ================================================================================================
2 // <summary>
3 //      XMLのコメント要素を解析するためのクラスソース</summary>
4 //
5 // <copyright file="XmlCommentElementParser.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Parsers
12 {
13     using System;
14
15     /// <summary>
16     /// XMLのコメント要素を解析するためのクラスです。
17     /// </summary>
18     public class XmlCommentElementParser : AbstractParser
19     {
20         #region インタフェース実装メソッド
21
22         /// <summary>
23         /// 渡されたテキストをXMLコメントとして解析する。
24         /// </summary>
25         /// <param name="s">解析対象の文字列。</param>
26         /// <param name="result">解析したタグ。</param>
27         /// <returns>タグの場合<c>true</c>。</returns>
28         /// <remarks>
29         /// XML/HTMLタグと判定するには、1文字目が開始タグである必要がある。
30         /// ただし、後ろについては閉じタグが無ければ全て、あればそれ以降は無視する。
31         /// </remarks>
32         public override bool TryParse(string s, out IElement result)
33         {
34             // 入力値確認
35             result = null;
36             if (string.IsNullOrEmpty(s) || !s.StartsWith(XmlCommentElement.DelimiterStart))
37             {
38                 return false;
39             }
40
41             // コメント終了まで取得
42             XmlCommentElement comment = new XmlCommentElement();
43             int index = s.IndexOf(XmlCommentElement.DelimiterEnd, XmlCommentElement.DelimiterStart.Length);
44             if (index < 0)
45             {
46                 // 閉じタグが存在しない場合、最後までコメントと判定
47                 comment.Raw = s.Substring(XmlCommentElement.DelimiterStart.Length);
48                 comment.ParsedString = s;
49             }
50             else
51             {
52                 // 閉じタグがあった場合、閉じタグまでを返す
53                 comment.Raw = s.Substring(
54                     XmlCommentElement.DelimiterStart.Length,
55                     index - XmlCommentElement.DelimiterStart.Length);
56                 comment.ParsedString = s.Substring(0, index + XmlCommentElement.DelimiterEnd.Length);
57             }
58
59             result = comment;
60             return true;
61         }
62
63         /// <summary>
64         /// 渡された文字が<see cref="TryParse"/>等の候補となる先頭文字かを判定する。
65         /// </summary>
66         /// <param name="c">解析文字列の先頭文字。</param>
67         /// <returns>候補となる場合<c>true</c>。このクラスでは常に<c>true</c>を返す。</returns>
68         /// <remarks>性能対策などで<see cref="TryParse"/>を呼ぶ前に目処を付けたい場合用。</remarks>
69         public override bool IsPossibleParse(char c)
70         {
71             return XmlCommentElement.DelimiterStart[0] == c;
72         }
73
74         #endregion
75     }
76 }