OSDN Git Service

#27621 言語間リンク解析の前処理の対象に<onlyinclude>タグを追加,
[wptscs/wpts.git] / Wptscs / Logics / MediaWikiLogger.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWiki翻訳支援処理用のログテキストの生成を行うためのクラスソース</summary>
4 //
5 // <copyright file="MediaWikiLogger.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Logics
12 {
13     using System;
14     using System.Text;
15     using Honememo.Parsers;
16     using Honememo.Wptscs.Parsers;
17     using Honememo.Wptscs.Properties;
18
19     /// <summary>
20     /// MediaWiki翻訳支援処理用のログテキストの生成を行うためのクラスです。
21     /// </summary>
22     public class MediaWikiLogger : Logger
23     {
24         #region ログ登録メソッド(翻訳支援処理)
25
26         /// <summary>
27         /// 変換元を表すログを追加する。
28         /// </summary>
29         /// <param name="source">変換元を表す要素。</param>
30         /// <remarks>
31         /// 変換結果をログ出力する際は
32         /// <code>AddSource</code>→(<see cref="AddAlias"/>)→<see cref="AddDestination"/>
33         /// の順で一連のメソッドをコールする。
34         /// 上記以外のメソッドをコールした場合、該当行の変換結果の出力は終了したものとみなす。
35         /// </remarks>
36         public override void AddSource(IElement source)
37         {
38             if (source is MediaWikiHeading)
39             {
40                 // 見出しの場合、変換先が無い場合は単に「見出し」として出力するので矢印を出さない
41                 // また、見出しの部分でログを一区切りする
42                 this.AddSeparator();
43                 this.Log += this.FormatElement(source);
44             }
45             else
46             {
47                 // それ以外は独自に整形だけ行い、後は親クラスの処理を使用
48                 base.AddSource(this.FormatElement(source));
49             }
50         }
51
52         /// <summary>
53         /// リダイレクトを表すログを追加する。
54         /// </summary>
55         /// <param name="alias">リダイレクトを表す要素。</param>
56         /// <remarks>
57         /// 変換結果をログ出力する際は
58         /// <see cref="AddSource"/>→(<code>AddAlias</code>)→<see cref="AddDestination"/>
59         /// の順で一連のメソッドをコールする。
60         /// 上記以外のメソッドをコールした場合、該当行の変換結果の出力は終了したものとみなす。
61         /// </remarks>
62         public override void AddAlias(IElement alias)
63         {
64             // 直前のログが見出しの場合矢印を出力、その後リダイレクトを出力
65             // ※ 見出しでリダイレクトというのはありえないが、一応AddDestinationとあわせて
66             this.AddRightArrowIfEndWithHeading();
67             ListElement list = new ListElement();
68             list.Add(new TextElement(Resources.LogMessageRedirect + " "));
69             list.Add(this.FormatElement(alias));
70             base.AddAlias(list);
71         }
72
73         /// <summary>
74         /// 変換先を表すログを追加する。
75         /// </summary>
76         /// <param name="destination">変換先を表す要素。</param>
77         /// <param name="cacheUsed">対訳表を使用している場合<code>true</code>。デフォルトは<code>false</code>。</param>
78         /// <remarks>
79         /// 変換結果をログ出力する際は
80         /// <see cref="AddSource"/>→(<see cref="AddAlias"/>)→<code>AddDestination</code>
81         /// の順で一連のメソッドをコールする。
82         /// 上記以外のメソッドをコールした場合、該当行の変換結果の出力は終了したものとみなす。
83         /// </remarks>
84         public override void AddDestination(IElement destination, bool cacheUsed = false)
85         {
86             // 直前のログが見出しの場合矢印を出力、その後独自に整形した変換先を出力
87             this.AddRightArrowIfEndWithHeading();
88             base.AddDestination(this.FormatElement(destination), cacheUsed);
89         }
90
91         #endregion
92
93         #region 内部処理用メソッド
94
95         /// <summary>
96         /// 渡された要素の種類に応じた翻訳支援処理ログ出力用の書式に変換した要素を返す。
97         /// </summary>
98         /// <param name="element">書式化する要素。</param>
99         /// <returns>書式化した内容で<code>ToString</code>が可能な要素。</returns>
100         private IElement FormatElement(IElement element)
101         {
102             // 要素のクラスに応じた書式に変換して返す
103             if (element is MediaWikiTemplate)
104             {
105                 return this.FormatMediaWikiTemplate((MediaWikiTemplate)element);
106             }
107             else if (element is MediaWikiLink)
108             {
109                 return this.FormatMediaWikiLink((MediaWikiLink)element);
110             }
111
112             // どこにも該当しないものはそのまま
113             return element;
114         }
115
116         /// <summary>
117         /// 翻訳支援処理ログ出力用の書式に変換した要素を返す。
118         /// </summary>
119         /// <param name="element">書式化する要素。</param>
120         /// <returns>書式化した内容で<code>ToString</code>が可能な要素。</returns>
121         private IElement FormatMediaWikiTemplate(MediaWikiTemplate element)
122         {
123             // そのままだとログに出すには情報が多すぎるので、必要な部分だけ抜粋
124             // ※ 現状は記事名のみ
125             return new MediaWikiTemplate(element.Title);
126         }
127
128         /// <summary>
129         /// 翻訳支援処理ログ出力用の書式に変換した要素を返す。
130         /// </summary>
131         /// <param name="element">書式化する要素。</param>
132         /// <returns>書式化した内容で<code>ToString</code>が可能な要素。</returns>
133         private IElement FormatMediaWikiLink(MediaWikiLink element)
134         {
135             // そのままだとログに出すには情報が多すぎるので、必要な部分だけ抜粋
136             // ※ 現状は記事名のみ
137             return new MediaWikiLink(element.Title);
138         }
139
140         /// <summary>
141         /// 最終ログが見出しの場合、<see cref="AddSource"/>で出していない矢印を出力する。
142         /// </summary>
143         private void AddRightArrowIfEndWithHeading()
144         {
145             if (this.Log.EndsWith(MediaWikiHeading.DelimiterEnd.ToString()))
146             {
147                 this.Log += " " + Resources.RightArrow + " ";
148             }
149         }
150
151         #endregion
152     }
153 }