1: using System.Collections;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text.RegularExpressions;
5:
6: namespace Ia.Islamic.Cl.Model.Business
7: {
8: ////////////////////////////////////////////////////////////////////////////
9:
10: /// <summary publish="true">
11: /// Koran Reference Network Class Library support functions: Business model
12: /// </summary>
13: /// <value>
14: /// https://msdn.microsoft.com/en-us/library/z1hkazw7(v=vs.100).aspx
15: /// </value>
16: /// <remarks>
17: /// Copyright © 2001-2020 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
18: ///
19: /// 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
20: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
21: ///
22: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
23: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
24: ///
25: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
26: ///
27: /// Copyright notice: This notice may not be removed or altered from any source distribution.
28: /// </remarks>
29: public class Default
30: {
31: ////////////////////////////////////////////////////////////////////////////
32:
33: /// <summary>
34: ///
35: /// </summary>
36: public Default()
37: {
38: }
39:
40: ////////////////////////////////////////////////////////////////////////////
41:
42: /// <summary>
43: ///
44: /// </summary>
45: public static List<Ia.Islamic.Cl.Model.Ui.VerseUi> Search(string searchWordLine, string _language, out Ia.Cl.Model.Result result)
46: {
47: const int maximumLengthOfVerseList = 100;
48: string wordRegularExpression;
49: List<string> variantList;
50: List<Ia.Islamic.Cl.Model.Ui.VerseUi> verseList;
51: Dictionary<string, List<string>> wordToVariantListDictionary;
52:
53: var language = new Ia.Cl.Model.Language(_language);
54: var translation = new Translation(language.Id);
55:
56: result = new Ia.Cl.Model.Result();
57: wordToVariantListDictionary = new Dictionary<string, List<string>>();
58:
59: if (!string.IsNullOrEmpty(searchWordLine))
60: {
61: // below: replace all consecutive space characters with a single ' '
62: searchWordLine = Regex.Replace(searchWordLine, @"\s+", " ");
63: searchWordLine = searchWordLine.Trim();
64:
65: if (language.Id == "ja" || language.Id == "ko")
66: {
67: wordRegularExpression = Ia.Cl.Model.Language.WordsRegularExpression(language.Symbol) + "|[" + Ia.Cl.Model.Language.Ideograph(language.Symbol) + "]{1}";
68: wordRegularExpression = wordRegularExpression.Replace("|[]{1}", string.Empty);
69: }
70: else wordRegularExpression = Ia.Cl.Model.Language.WordsRegularExpression(language.Symbol);
71:
72: var wordMatchCollection = Regex.Matches(searchWordLine, @"(" + wordRegularExpression + ")", RegexOptions.Compiled); // keep original line
73:
74: foreach (Match wordMatch in wordMatchCollection)
75: {
76: variantList = new List<string>();
77:
78: var word = wordMatch.Groups[1].Captures[0].Value;
79: variantList.Add(word);
80:
81: var basicWord = Ia.Cl.Model.Language.BasicForm(word);
82: if (!variantList.Contains(basicWord)) variantList.Add(basicWord);
83:
84: if (language.Id == "ar")
85: {
86: var list = Ia.Cl.Model.Language.ProduceSimilarArabicWords(word);
87:
88: foreach (string s in list)
89: {
90: if (!variantList.Contains(s)) variantList.Add(s);
91: }
92: }
93:
94: wordToVariantListDictionary[word] = variantList;
95: }
96:
97: wordToVariantListDictionary.Remove(" ");
98: wordToVariantListDictionary.Remove(string.Empty);
99:
100: verseList = Ia.Islamic.Cl.Model.Data.Default.VerseList(language, wordToVariantListDictionary.Values.ToList(), maximumLengthOfVerseList, out result);
101:
102: if (verseList.Count() > 0)
103: {
104: if (wordToVariantListDictionary.Count == 1)
105: {
106: result.AddSuccess(translation.ResultSearchForWord + @": """ + searchWordLine + @""". " + translation.ResultNumberOfAppearWords + " " + verseList.Count());
107: }
108: else if (wordToVariantListDictionary.Count > 1)
109: {
110: result.AddSuccess(translation.ResultSearchForWords + @": """ + searchWordLine + @""". " + translation.ResultNumberOfAppearWords + " " + verseList.Count());
111: }
112: }
113: else
114: {
115: if (wordToVariantListDictionary.Count == 1)
116: {
117: result.AddWarning(translation.ResultTheWord + @" """ + searchWordLine + @""" " + translation.ResultWasNotFound);
118: }
119: else if (wordToVariantListDictionary.Count > 1)
120: {
121: result.AddWarning(translation.ResultTheWords + @" """ + searchWordLine + @""" " + translation.ResultWereNotFound);
122: }
123: }
124: }
125: else
126: {
127: verseList = new List<Ia.Islamic.Cl.Model.Ui.VerseUi>();
128:
129: result.AddError(translation.ResultEmptyField);
130: }
131:
132: return verseList;
133: }
134:
135: ////////////////////////////////////////////////////////////////////////////
136:
137: /// <summary>
138: ///
139: /// </summary>
140: public static Ia.Islamic.Cl.Model.Ui.VerseUi Verse(Ia.Cl.Model.Language language, int chapterNumber, int verseNumber, out int op, out string result)
141: {
142: return Ia.Islamic.Cl.Model.Data.Default.Verse(language, chapterNumber, verseNumber, out op, out result);
143: }
144:
145: ////////////////////////////////////////////////////////////////////////////
146:
147: /// <summary>
148: ///
149: /// </summary>
150: public static Ia.Islamic.Cl.Model.Ui.VerseTopicUi VerseSpan(Ia.Cl.Model.Language language, int chapterNumber, int verseNumber, int numberOfVerses, out int op, out string result)
151: {
152: return Ia.Islamic.Cl.Model.Ui.VerseTopicUi.VerseTopic(language, chapterNumber, verseNumber, numberOfVerses, out op, out result);
153: }
154:
155: ////////////////////////////////////////////////////////////////////////////
156: ////////////////////////////////////////////////////////////////////////////
157: }
158: }