1: using System;
2: using System.Collections;
3: using System.Collections.Generic;
4: using System.IO;
5: using System.Reflection;
6: using System.Linq;
7: using System.Data;
8: using System.Xml.Linq;
9:
10: namespace Ia.TentPlay.Cl.Model.Memorise
11: {
12: ////////////////////////////////////////////////////////////////////////////
13:
14: /// <summary publish="true">
15: /// Kana class
16: /// </summary>
17: /// <value>
18: /// https://msdn.microsoft.com/en-us/library/z1hkazw7(v=vs.100).aspx
19: /// </value>
20: /// <remarks>
21: /// Copyright © 2008-2018 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
22: ///
23: /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
24: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
25: ///
26: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
27: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
28: ///
29: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
30: ///
31: /// Copyright notice: This notice may not be removed or altered from any source distribution.
32: /// </remarks>
33: public class Kana : Test
34: {
35: private static XDocument xDocument;
36:
37: protected override TestTopic testTopic
38: {
39: get
40: {
41: return Ia.TentPlay.Cl.Model.Memorise.Test.TestTopic.Kana;
42: }
43: }
44:
45: ////////////////////////////////////////////////////////////////////////////
46:
47: /// <summary>
48: ///
49: /// </summary>
50: public enum CharType { Hiragana, Katakana };
51:
52: ////////////////////////////////////////////////////////////////////////////
53:
54: /// <summary>
55: ///
56: /// </summary>
57: public struct Char
58: {
59: public string Hiragana;
60: public string Katakana;
61: public string Pronunciation;
62:
63: public Char(string hiragana, string katakana, string pronunciation)
64: {
65: this.Hiragana = hiragana;
66: this.Katakana = katakana;
67: this.Pronunciation = pronunciation;
68: }
69: }
70:
71: ////////////////////////////////////////////////////////////////////////////
72:
73: /// <summary>
74: ///
75: /// </summary>
76: public Kana() { }
77:
78: ////////////////////////////////////////////////////////////////////////////
79:
80: /// <summary>
81: ///
82: /// </summary>
83: public override void PopulateTestDatabaseTableWithInitialQuestionsIfEmpty(Guid userId)
84: {
85: int count;
86: string question, answer;
87: CharType charType;
88: Ia.TentPlay.Cl.Model.Memorise.Score score;
89: List<Ia.TentPlay.Cl.Model.Memorise.Score> scoreList;
90:
91: // below: synch database words with XML list
92: using (var db = new Ia.TentPlay.Db())
93: {
94: count = (from s in db.Scores where s.TestId == (int)Ia.TentPlay.Cl.Model.Memorise.Test.TestTopic.Kana select s).Count();
95:
96: if (count == 0)
97: {
98: scoreList = Ia.TentPlay.Cl.Model.Memorise.Score.KanaScoreList(userId);
99:
100: foreach (bool b in new bool[] { true, false })
101: {
102: foreach (var @char in List)
103: {
104: if (b)
105: {
106: question = @char.Hiragana;
107: charType = CharType.Hiragana;
108: }
109: else
110: {
111: question = @char.Katakana;
112: charType = CharType.Katakana;
113: }
114:
115: answer = @char.Pronunciation;
116:
117: score = (from s in scoreList where s.TestId == (int)testTopic && s.Question == question && s.Answer == answer && s.TypeId == (int)charType select s).FirstOrDefault();
118:
119: if (score == null)
120: {
121: score = new Ia.TentPlay.Cl.Model.Memorise.Score
122: {
123: Question = question,
124: Answer = answer,
125: TestId = (int)testTopic,
126: TypeId = (int)charType,
127: Created = DateTime.UtcNow.AddHours(3),
128: Updated = DateTime.UtcNow.AddHours(3),
129: Viewed = DateTime.UtcNow.AddHours(3),
130: UserId = userId
131: };
132:
133: db.Scores.Add(score);
134: }
135: }
136: }
137:
138: db.SaveChanges();
139: }
140: }
141: }
142:
143: ////////////////////////////////////////////////////////////////////////////
144:
145: /// <summary>
146: ///
147: /// </summary>
148: public override int WeightedRandomTypeIdAccordingTypeDistribution(Guid userId)
149: {
150: CharType charType;
151:
152: if (Ia.Cl.Model.Default.RandomBool) charType = CharType.Hiragana;
153: else charType = CharType.Katakana;
154:
155: return (int)charType;
156: }
157:
158: ////////////////////////////////////////////////////////////////////////////
159:
160: /// <summary>
161: /// Read all Kana symbol characters
162: /// </summary>
163: public static List<Ia.TentPlay.Cl.Model.Memorise.Kana.Char> List
164: {
165: get
166: {
167: Ia.TentPlay.Cl.Model.Memorise.Kana.Char @char;
168: List<Ia.TentPlay.Cl.Model.Memorise.Kana.Char> charList;
169:
170: charList = new List<Ia.TentPlay.Cl.Model.Memorise.Kana.Char>(2000);
171:
172: foreach (XElement xe in XDocument.Element("kana").Elements("char"))
173: {
174: // <kana hiragana="あ" katakana="ア" pronunciation="a [a]" />
175:
176: @char = new Ia.TentPlay.Cl.Model.Memorise.Kana.Char(
177: xe.Attribute("hiragana").Value,
178: xe.Attribute("katakana").Value,
179: xe.Attribute("pronunciation").Value);
180:
181: charList.Add(@char);
182: }
183:
184: return charList;
185: }
186: }
187:
188: ////////////////////////////////////////////////////////////////////////////
189: ////////////////////////////////////////////////////////////////////////////
190:
191: /// <summary>
192: ///
193: /// How to embed and access resources by using Visual C# http://support.microsoft.com/kb/319292/en-us
194: ///
195: /// 1. Change the "Build Action" property of your XML file from "Content" to "Embedded Resource".
196: /// 2. Add "using System.Reflection".
197: /// 3. Manifest resource stream will start with the project namespace, the location of XML file.
198: ///
199: /// </summary>
200: public static XDocument XDocument
201: {
202: get
203: {
204: if (xDocument == null)
205: {
206: Assembly _assembly;
207: StreamReader streamReader;
208:
209: _assembly = Assembly.GetExecutingAssembly();
210: streamReader = new StreamReader(_assembly.GetManifestResourceStream("Ia.TentPlay.Cl.model.data.memorise.kana.xml"));
211:
212: try
213: {
214: if (streamReader.Peek() != -1)
215: {
216: xDocument = System.Xml.Linq.XDocument.Load(streamReader);
217: }
218: }
219: catch (Exception)
220: {
221: }
222: finally
223: {
224: }
225: }
226:
227: return xDocument;
228: }
229: }
230:
231: ////////////////////////////////////////////////////////////////////////////
232: ////////////////////////////////////////////////////////////////////////////
233: }
234: }