1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Xml.Linq;
5: using System.Text;
6: using System.Text.RegularExpressions;
7: using System.Data;
8: using Microsoft.EntityFrameworkCore;
9: using System.Linq.Expressions;
10:
11: namespace Ia.Islamic.Koran.Wfa.Model.Business
12: {
13: ////////////////////////////////////////////////////////////////////////////
14:
15: /// <summary publish="true">
16: /// Koran Reference Network Windows Form support functions: Business model
17: /// </summary>
18: /// <value>
19: /// https://msdn.microsoft.com/en-us/library/z1hkazw7(v=vs.100).aspx
20: /// </value>
21: /// <remarks>
22: /// Copyright © 1995-2020 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
23: ///
24: /// 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
25: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
26: ///
27: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
28: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
29: ///
30: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
31: ///
32: /// Copyright notice: This notice may not be removed or altered from any source distribution.
33: /// </remarks>
34: public class Default
35: {
36: private static readonly string websiteFilePath = @"C:\Users\Jasem\Documents\Visual Studio 2022\Projects\Islamic\krn.org\";
37:
38: ////////////////////////////////////////////////////////////////////////////
39:
40: /// <summary>
41: ///
42: /// </summary>
43: public Default()
44: {
45: }
46:
47: ////////////////////////////////////////////////////////////////////////////
48:
49: /// <summary>
50: ///
51: /// </summary>
52: public static void BuildLanguageComboBox(ref System.Windows.Forms.ComboBox cb)
53: {
54: cb.Items.Clear();
55:
56: var list = (from l in Ia.Cl.Model.Language.List
57: where Ia.Islamic.Cl.Model.Data.Default.UsedKoranLanguageSymbolList.Contains(l.Iso6391)
58: orderby l.Name
59: select new
60: {
61: Symbol = l.Iso6391,
62: l.Name
63: }).ToList();
64:
65: cb.DataSource = list;
66: cb.DisplayMember = "Name";
67: cb.ValueMember = "Symbol";
68:
69: cb.SelectedIndex = 0;
70: }
71:
72: ////////////////////////////////////////////////////////////////////////////
73:
74: /// <summary>
75: ///
76: /// </summary>
77: public static void CreateDatabaseTableRecords(Ia.Cl.Model.Language language, out Ia.Cl.Model.Result result)
78: {
79: int chapterNumber, verseNumber;
80: string name, arabicName, revealed, introduction;
81: string regularExpression, word0, content;
82: MatchCollection matchCollection;
83: Ia.Islamic.Cl.Model.Koran koran;
84: Ia.Islamic.Cl.Model.Chapter chapter;
85: Ia.Islamic.Cl.Model.Verse verse;
86: Ia.Islamic.Cl.Model.Word word;
87: Ia.Islamic.Cl.Model.WordVerse wordVerse;
88: List<Ia.Islamic.Cl.Model.Word> words;
89: List<Ia.Islamic.Cl.Model.WordVerse> wordVerses;
90:
91: arabicName = revealed = string.Empty;
92:
93: result = new Ia.Cl.Model.Result();
94:
95: var koranXDocument = Ia.Islamic.Koran.Wfa.Model.Data.Default.ReturnKoranByLanguage(language);
96:
97: var wordToVerseIdDictionary = new Dictionary<string, string>(10000); // assuming max num of words and derivatives in any one version of koran
98: var verseIdToVerseDictionary = new Dictionary<string, Ia.Islamic.Cl.Model.Verse>(10000);
99:
100: using (var db = new Ia.Islamic.Cl.Model.Context.Koran())
101: {
102: db.Database.EnsureCreated();
103:
104: db.Database.ExecuteSqlRaw("delete from Words where Id like '" + Ia.Islamic.Cl.Model.Business.Word.WordId(language.Id, "") + "%'");
105:
106: db.Database.ExecuteSqlRaw("delete from WordVerses where VerseId like '" + language.Id + "%'");
107: db.Database.ExecuteSqlRaw("delete from WordVerses where WordId like '" + language.Id + "%'");
108:
109: db.Database.ExecuteSqlRaw("delete from Verses where Id like '" + language.Id + "%'");
110: db.Database.ExecuteSqlRaw("delete from Chapters where Id like '" + language.Id + "%'");
111: db.Database.ExecuteSqlRaw("delete from Korans where Id like '" + language.Id + "%'");
112:
113: if (language.Id == "ja" || language.Id == "ko" || language.Id == "zh")
114: {
115: regularExpression = Ia.Cl.Model.Language.BasicWordsRegularExpression(language.Symbol) + "|[" + Ia.Cl.Model.Language.Ideograph(language.Symbol) + "]{1}";
116: regularExpression = regularExpression.Replace("|[]{1}", "");
117: }
118: else regularExpression = Ia.Cl.Model.Language.BasicWordsRegularExpression(language.Symbol);
119:
120: /*
121: // below: words regular
122: mc = Regex.Matches(content, @"(" + s + ")", RegexOptions.Compiled);
123: foreach (Match m in mc)
124: {
125: word0 = m.Groups[1].Captures[0].Value;
126:
127: if (ht[word0] == null) ht[word0] = verse.Id + " ";
128: else if (ht[word0].ToString().IndexOf(verse.Id) == -1) ht[word0] = ht[word0].ToString() + verse.Id + " ";
129: // above: exclude duplicate verse location values
130: }
131: */
132:
133: /*
134: mc = Regex.Matches(Ia.Cl.Model.Language.RemoveAccent(content), @"(" + s + ")", RegexOptions.Compiled);
135: foreach (Match m in mc)
136: {
137: word0 = m.Groups[1].Captures[0].Value;
138:
139: if (ht[word0] == null) ht[word0] = verse.Id + " ";
140: else if (ht[word0].ToString().IndexOf(verse.Id) == -1) ht[word0] = ht[word0].ToString() + verse.Id + " ";
141: }
142: */
143:
144: koran = new Ia.Islamic.Cl.Model.Koran
145: {
146: Id = language.Id,
147: Name = koranXDocument.Descendants("قرءان").Attributes("name").First().Value,
148: Introduction = string.Empty,
149: LanguageIso = language.Id
150: };
151:
152: db.Korans.Add(koran);
153:
154: chapterNumber = 1;
155:
156: foreach (XElement xe in koranXDocument.Descendants("قرءان").Descendants("سورة"))
157: {
158: if (chapterNumber == int.Parse(xe.Attributes("id").First().Value))
159: {
160: name = xe.Attributes("name").First().Value;
161:
162: if (language.Symbol != "ar")
163: {
164: arabicName = xe.Attributes("arabicName").First().Value;
165: revealed = xe.Attributes("revealed").First().Value;
166: }
167:
168: introduction = xe.Descendants("مقدمة").FirstOrDefault().Value;
169:
170: chapter = new Ia.Islamic.Cl.Model.Chapter
171: {
172: Id = language.Id + xe.Attributes("id").First().Value.PadLeft(3, '0'),
173: Number = chapterNumber,
174: Name = name,
175: Koran = (from q in db.Korans where q.Id == koran.Id select q).SingleOrDefault()
176: };
177:
178: // below: handle revealed according to language
179: if (revealed == "before") chapter.Revealed = false;
180: else chapter.Revealed = true;
181:
182: if (language.Symbol != "ar") chapter.ArabicName = arabicName;
183:
184: chapter.Introduction = introduction;
185:
186: koran.Chapters.Add(chapter);
187:
188: verseNumber = 1;
189:
190: foreach (XElement xElement in xe.Descendants("ءاية"))
191: {
192: if (verseNumber == int.Parse(xElement.Attributes("id").First().Value))
193: {
194: content = xElement.Value;
195:
196: verse = new Ia.Islamic.Cl.Model.Verse
197: {
198: Id = chapter.Id + xElement.Attributes("id").First().Value.PadLeft(3, '0'),
199: Chapter = chapter,
200: Number = verseNumber,
201: Content = content
202: };
203:
204: verseIdToVerseDictionary[verse.Id] = verse;
205:
206: // below: basic form lower case, no accents
207: matchCollection = Regex.Matches(Ia.Cl.Model.Language.BasicForm(content), @"(" + regularExpression + ")", RegexOptions.Compiled);
208:
209: foreach (Match match in matchCollection)
210: {
211: word0 = match.Groups[1].Captures[0].Value;
212:
213: if (!wordToVerseIdDictionary.ContainsKey(word0)) wordToVerseIdDictionary[word0] = verse.Id + " ";
214: else if (wordToVerseIdDictionary[word0].IndexOf(verse.Id) == -1) wordToVerseIdDictionary[word0] = wordToVerseIdDictionary[word0].ToString() + verse.Id + " ";
215: // above: this skips adding word if it already exists in this same verseId
216: }
217:
218: chapter.Verses.Add(verse);
219:
220: verseNumber++;
221: }
222: else
223: {
224: throw new ArgumentException("Inconsistant verse counter verse id=" + xElement.Attributes("id").First().Value + ", chapter id=" + xe.Attributes("id").First().Value);
225: }
226: }
227:
228: chapterNumber++;
229: }
230: else
231: {
232: throw new ArgumentException("Inconsistant chapter counter chapter id=" + xe.Attributes("id").First().Value);
233: }
234: }
235:
236: words = new List<Ia.Islamic.Cl.Model.Word>();
237: wordVerses = new List<Ia.Islamic.Cl.Model.WordVerse>();
238:
239: // below: populate the word table
240: foreach (string content2 in wordToVerseIdDictionary.Keys)
241: {
242: word = new Ia.Islamic.Cl.Model.Word
243: {
244: Id = Ia.Islamic.Cl.Model.Business.Word.WordId(language.Id, content2),
245: Content = content2
246: };
247:
248: // below: remove last " "
249: regularExpression = wordToVerseIdDictionary[content2].ToString().Trim();
250:
251: //foreach (string t in regularExpression.Split(' ')) word.Verses.Add((Ia.Islamic.Cl.Model.Verse)verseHashtable[t]);
252: foreach (string verseId in regularExpression.Split(' '))
253: {
254: wordVerse = new Ia.Islamic.Cl.Model.WordVerse
255: {
256: WordId = word.Id,
257: Word = word,
258: VerseId = verseId,
259: Verse = verseIdToVerseDictionary[verseId]
260: };
261:
262: wordVerses.Add(wordVerse);
263: }
264:
265: words.Add(word);
266: }
267:
268: db.Korans.Add(koran);
269: db.Words.AddRange(words);
270: db.WordVerses.AddRange(wordVerses);
271:
272: db.SaveChanges();
273: }
274: }
275:
276: ////////////////////////////////////////////////////////////////////////////
277:
278: /// <summary>
279: ///
280: /// </summary>
281: public static void DeleteDatabase(out Ia.Cl.Model.Result result)
282: {
283: bool databaseDeleted;
284:
285: result = new Ia.Cl.Model.Result();
286:
287: try
288: {
289: using (var db = new Ia.Islamic.Cl.Model.Context.Koran())
290: {
291: databaseDeleted = db.Database.EnsureDeleted();
292:
293: if (databaseDeleted) result.AddSuccess("Database deleted");
294: else result.AddError("Database delete error");
295: }
296: }
297: catch (Exception ex)
298: {
299: result.AddError("Database delete error. Exception: " + ex.ToString());
300: }
301: }
302:
303: ////////////////////////////////////////////////////////////////////////////
304:
305: /// <summary>
306: ///
307: /// </summary>
308: public static void WriteChapterFiles(Ia.Cl.Model.Language language, out Ia.Cl.Model.Result result)
309: {
310: bool b;
311: string className, fileName, u, content;
312:
313: result = new Ia.Cl.Model.Result();
314: var sb = new StringBuilder();
315:
316: var translation = new Ia.Islamic.Cl.Model.Translation(language.Id);
317: u = Ia.Cl.Model.Default.FirstLetterToUpper(language.Symbol);
318:
319: using (var db = new Ia.Islamic.Cl.Model.Context.Koran())
320: {
321: // db.Database.Connection.Open();
322:
323: var chapters = (from q in db.Chapters where q.Koran.LanguageIso == language.Id select q).ToList<Ia.Islamic.Cl.Model.Chapter>();
324:
325: if (chapters.Count() > 0)
326: {
327: foreach (Ia.Islamic.Cl.Model.Chapter chapter in chapters)
328: {
329: sb.Length = 0;
330:
331: className = u + "_" + chapter.Number;
332:
333: fileName = chapter.Number + ".aspx.cs";
334: sb.Append(ChapterFileHeader(className, fileName, translation.MainHome, translation.MainTitle, translation.MainBismillah, language, chapter.Id, chapter.Number, chapter.Name, chapter.ArabicName, chapter.Revealed, chapter.Introduction));
335:
336: // below: handle revealed according to language
337: //if (revealed == "before") revealed = "1";
338: //else if (revealed == "after") revealed = "2";
339: //else revealed = "0";
340:
341: var verses = (from q in db.Verses where q.Chapter.Koran.LanguageIso == language.Id && q.Chapter.Id == chapter.Id select q).ToList<Ia.Islamic.Cl.Model.Verse>();
342:
343: foreach (Ia.Islamic.Cl.Model.Verse verse in verses)
344: {
345: content = verse.Content;
346:
347: sb.Append(ChapterFileVerse(language, verse.Number, content));
348:
349: // below: if a حزب, ربع, نصف, ثلاث occures here will will add a space
350: // جزء/حزب/ربع/نصف/ثلاث/
351:
352: /*
353: if (verseString != "1")
354: {
355: //xd = jza_xd.SelectSingleNode("جزء/جزء/descendant::*[@سورة='" + chapter + "' and @ءاية='" + verse + "']");
356:
357: verseStartsHizb = data.Jza.Elements("جزء").Elements("جزء").DescendantsAndSelf().Where(x => x.HasAttributes && x.Attribute("سورة").Value == chapter && x.Attribute("ءاية").Value == verseString).Any();
358:
359: if (verseStartsHizb) sb.Append(ChapterFileSpace(language));
360: }
361: */
362:
363: //dr["id"] = long.Parse(ch_id.ToString().PadLeft(3, '0') + v_id.ToString().PadLeft(3, '0'));
364: }
365:
366: sb.Append(ChapterFileFooter(language));
367:
368: // below: write to webpage file
369:
370: fileName = websiteFilePath + language.Symbol + @"\" + chapter.Number + ".aspx";
371:
372: b = Ia.Cl.Model.File.Write(fileName, sb.ToString());
373:
374: if (!b) { result.AddError("WriteChapterFiles: Can't write file " + fileName); break; }
375:
376: // below: write *.aspx.cs file in webpage
377: sb = new StringBuilder(100000)
378: {
379: Length = 0
380: };
381:
382: sb.Append(ChapterFileCs(language, className));
383: fileName = websiteFilePath + language.Symbol + @"\" + chapter.Number + ".aspx.cs";
384:
385: b = Ia.Cl.Model.File.Write(fileName, sb.ToString());
386:
387: if (!b) { result.AddError("WriteChapterFiles: Can't write file " + fileName); break; }
388: }
389: }
390: else
391: {
392: result.AddError("No chapter files read from database");
393: }
394: }
395: }
396:
397: ////////////////////////////////////////////////////////////////////////////
398:
399: /// <summary>
400: ///
401: /// </summary>
402: public static string ChapterFileHeader(string className, string fileName, string home, string koran, string bismilla, Ia.Cl.Model.Language language, string ch_id, int chapter, string name, string arabicName, bool revealed, string intro)
403: {
404: string s, title;
405:
406: title = "";
407:
408: if (language.Id == "ar") title = name;
409: else
410: {
411: if (name.Length > 0 && arabicName.Length > 0) title = name + " (" + arabicName + ")";
412: else if (name.Length > 0) title = name;
413: else if (arabicName.Length > 0) title = arabicName;
414: }
415:
416: s = @"<%@ Page Language=""C#"" AutoEventWireup=""true"" Inherits=""" + className + @""" MasterPageFile=""~/1_" + language.Symbol + @".master"" Codebehind=""" + fileName + @""" %>
417: <asp:Content ContentPlaceHolderID=""contentContentPlaceHolder"" runat=""server"">
418:
419: <asp:HyperLink NavigateUrl=""~/default.aspx"" Text=""" + home + @""" runat=""server""/> » <asp:HyperLink NavigateUrl=""~/" + language.Symbol + @"/default.aspx"" Text=""" + koran + @""" runat=""server""/> » " + title;
420:
421: if (intro.Length > 0) s += @"<div id=""intro"">" + intro + @"</div>";
422:
423: s += @"<div id=""chapter"">";
424:
425: if (chapter != 1 && chapter != 9)
426: {
427: s += @"<span class=""bismilla"">" + bismilla + @"</span> ";
428: }
429:
430: // <p><a name=""1"">1</a>. In the name of Allah, Most Gracious, Most Merciful.</p>";
431:
432: return s;
433: }
434:
435: ////////////////////////////////////////////////////////////////////////////
436:
437: /// <summary>
438: ///
439: /// </summary>
440: public static string ChapterFileVerse(Ia.Cl.Model.Language language, int verse, string content)
441: {
442: string s;
443:
444: // below: I will keep no space between verse and number
445: if (language.Symbol == "ja") s = @"<div class=""verse"">" + content + @"<span class=""number""><a id=""" + verse + @""">" + verse + @"</a></span></div> ";
446: else s = @"<div class=""verse"">" + content + @" <span class=""number""><a id=""" + verse + @""">" + verse + @"</a></span></div> ";
447:
448: return s;
449: }
450:
451: ////////////////////////////////////////////////////////////////////////////
452:
453: /// <summary>
454: ///
455: /// </summary>
456: public string ChapterFileSpace(Ia.Cl.Model.Language language)
457: {
458: string s;
459:
460: s = @"<p><br/></p>";
461:
462: return s;
463: }
464:
465: ////////////////////////////////////////////////////////////////////////////
466:
467: /// <summary>
468: ///
469: /// </summary>
470: public static string ChapterFileFooter(Ia.Cl.Model.Language language)
471: {
472: string s;
473:
474: s = @"</div>
475: </asp:Content>";
476:
477: return s;
478: }
479:
480: ////////////////////////////////////////////////////////////////////////////
481:
482: /// <summary>
483: ///
484: /// </summary>
485: public static string ChapterFileCs(Ia.Cl.Model.Language language, string className)
486: {
487: string s;
488:
489: s = @"using System;
490: using System.Web;
491:
492: ////////////////////////////////////////////////////////////////////////////
493:
494: /// <summary>
495: ///
496: /// </summary>
497: public partial class " + className + @" : System.Web.UI.Page
498: {
499: ////////////////////////////////////////////////////////////////////////////
500:
501: /// <summary>
502: ///
503: /// </summary>
504: void Page_PreInit(object sender, System.EventArgs e)
505: {
506: Ia.Islamic.Koran.Wa.Model.Ui.Default.Theme(this, HttpContext.Current.Profile);
507: }
508:
509: ////////////////////////////////////////////////////////////////////////////
510:
511: /// <summary>
512: ///
513: /// </summary>
514: protected void Page_Load(object sender, EventArgs e)
515: {
516: }
517:
518: ////////////////////////////////////////////////////////////////////////////
519: ////////////////////////////////////////////////////////////////////////////
520: }
521: ";
522:
523: return s;
524: }
525:
526: ////////////////////////////////////////////////////////////////////////////
527: ////////////////////////////////////////////////////////////////////////////
528:
529:
530:
531:
532:
533: ////////////////////////////////////////////////////////////////////////////
534: ////////////////////////////////////////////////////////////////////////////
535:
536: /// <summary>
537: ///
538: /// </summary>
539: public static void WriteDefaultAndSearchFiles(Ia.Cl.Model.Language language, out Ia.Cl.Model.Result result)
540: {
541: bool b;
542: string u, fileName;
543: StringBuilder sb;
544:
545: result = new Ia.Cl.Model.Result();
546: sb = new StringBuilder(100000);
547:
548: Ia.Islamic.Cl.Model.Translation translation = new Ia.Islamic.Cl.Model.Translation(language.Id);
549:
550: u = Ia.Cl.Model.Default.FirstLetterToUpper(language.Symbol);
551:
552: /*
553: - "chapter": (id,chapter,language_id,name,arabicName,revealed_id,introduction)
554: */
555:
556: // below: write default.aspx file in webpage
557: sb = new StringBuilder(100000);
558: sb.Append(BuildDefaultFile(language, translation, "" + u + "_Default"));
559: fileName = websiteFilePath + language.Symbol + @"\default.aspx";
560: b = Ia.Cl.Model.File.Write(fileName, sb.ToString());
561: if (!b) result.AddError("WriteDefaultAndSearchFiles: Can't write file " + fileName);
562:
563: // below: write default.aspx.cs file in webpage
564: sb = new StringBuilder(100000);
565: sb.Append(DefaultFileCs(language, translation, "" + u + "_Default"));
566: fileName = websiteFilePath + language.Symbol + @"\default.aspx.cs";
567: b = Ia.Cl.Model.File.Write(fileName, sb.ToString());
568: if (!b) result.AddError("WriteDefaultAndSearchFiles: Can't write file " + fileName);
569:
570: // below: write search.aspx file in webpage
571: sb = new StringBuilder(100000);
572: sb.Append(SearchFile(language, translation, "" + u + "_Search"));
573: fileName = websiteFilePath + language.Symbol + @"\search.aspx";
574: b = Ia.Cl.Model.File.Write(fileName, sb.ToString());
575: if (!b) result.AddError("WriteDefaultAndSearchFiles: Can't write file " + fileName);
576:
577: // below: write search.aspx.cs file in webpage
578: sb = new StringBuilder(100000);
579: sb.Append(SearchFileCs(language, translation, "" + u + "_Search"));
580: fileName = websiteFilePath + language.Symbol + @"\search.aspx.cs";
581: b = Ia.Cl.Model.File.Write(fileName, sb.ToString());
582: if (!b) result.AddError("WriteDefaultAndSearchFiles: Can't write file " + fileName);
583: }
584:
585: ////////////////////////////////////////////////////////////////////////////
586:
587: /// <summary>
588: ///
589: /// </summary>
590: public static string DefaultFileHeader(Ia.Cl.Model.Language language, Ia.Islamic.Cl.Model.Translation translation, string className)
591: {
592: string s;
593:
594: s = @"<%@ Page Language=""C#"" AutoEventWireup=""True"" Inherits=""" + className + @""" MasterPageFile=""~/1_" + language.Symbol + @".master"" CodeBehind=""default.aspx.cs"" %>
595:
596: <asp:Content ContentPlaceHolderID=""contentContentPlaceHolder"" runat=""server"">
597:
598: <asp:HyperLink NavigateUrl=""~/default.aspx"" Text=""" + translation.MainHome + @""" runat=""server""/> » " + translation.MainTitle + @"
599:
600: <p id=""enter-words"">" + translation.SearchInstruction + @"</p>
601:
602: <p id=""text-box""><asp:TextBox id=""tb"" Maxlength=""32"" Columns=""16"" runat=""server""/> <asp:Button Text="" " + translation.SearchButton + @" "" runat=""server"" /></p>
603:
604: <p id=""hint""><span id=""head"">" + translation.SearchHintName + @"</span>: " + translation.SearchHint + @"</p>
605:
606: <p id=""search-result""><asp:Label id=""searchResultLabel"" EnableViewState=""false"" runat=""server""/></p>
607:
608: <ol>
609: ";
610:
611: return s;
612: }
613:
614: ////////////////////////////////////////////////////////////////////////////
615:
616: /// <summary>
617: ///
618: /// </summary>
619: public static string DefaultAndSearchFileChapterTitle(Ia.Cl.Model.Language language, Ia.Islamic.Cl.Model.Translation translation, Ia.Islamic.Cl.Model.Chapter chapter)
620: {
621: string s;
622:
623: if (language.Id == "ar")
624: {
625: s = @"<li><asp:HyperLink NavigateUrl=""~/" + language.Symbol + "/" + chapter.Number + @".aspx"" Text=""" + chapter.Name + @""" runat=""server""/></li>" + "\r\n";
626:
627: //if (language.Symbol == "ar" && chapter % 38 == 0) s += @"</td><td style=""vertical-align:top;"">";
628: //else if (language != "ar" && n % 57 == 0) s += @"</td><td style=""vertical-align:top;"">";
629: }
630: else
631: {
632: if (chapter.Name.Length > 0 && chapter.ArabicName.Length > 0) s = @"<li><asp:HyperLink NavigateUrl=""~/" + language.Symbol + "/" + chapter.Number + @".aspx"" Text=""" + chapter.Name + @""" runat=""server""/> (<asp:HyperLink NavigateUrl=""~/" + language.Symbol + "/" + chapter.Number + @".aspx"" Text=""" + chapter.ArabicName + @""" runat=""server""/>)</li>" + "\r\n";
633: else if (chapter.Name.Length > 0) s = @"<li><asp:HyperLink NavigateUrl=""~/" + language.Symbol + "/" + chapter.Number + @".aspx"" Text=""" + chapter.Name + @""" runat=""server""/></li>" + "\r\n";
634: else /*if (arabicName.Length > 0)*/ s = @"<li><asp:HyperLink NavigateUrl=""~/" + language.Symbol + "/" + chapter.Number + @".aspx"" Text=""" + chapter.ArabicName + @""" runat=""server""/></li>" + "\r\n";
635: }
636:
637: return s;
638: }
639:
640: ////////////////////////////////////////////////////////////////////////////
641:
642: /// <summary>
643: ///
644: /// </summary>
645: public static string DefaultFileFooter(Ia.Cl.Model.Language language, Ia.Islamic.Cl.Model.Translation translation)
646: {
647: string s;
648:
649: s = @"
650: </ol>
651: </asp:Content>";
652:
653: return s;
654: }
655:
656: ////////////////////////////////////////////////////////////////////////////
657:
658: /// <summary>
659: ///
660: /// </summary>
661: public static string BuildDefaultFile(Ia.Cl.Model.Language language, Ia.Islamic.Cl.Model.Translation translation, string className)
662: {
663: StringBuilder sb;
664: List<Ia.Islamic.Cl.Model.Chapter> chapters;
665:
666: sb = new StringBuilder(100000);
667: sb.Length = 0;
668:
669: sb.Append(DefaultFileHeader(language, translation, className));
670:
671: using (var db = new Ia.Islamic.Cl.Model.Context.Koran())
672: {
673: chapters = (from q in db.Chapters where q.Koran.LanguageIso == language.Id select q).ToList<Ia.Islamic.Cl.Model.Chapter>();
674:
675: foreach (Ia.Islamic.Cl.Model.Chapter chapter in chapters)
676: {
677: sb.Append(DefaultAndSearchFileChapterTitle(language, translation, chapter));
678: }
679: }
680:
681: sb.Append(DefaultFileFooter(language, translation));
682:
683: return sb.ToString();
684: }
685:
686: ////////////////////////////////////////////////////////////////////////////
687:
688: /// <summary>
689: ///
690: /// </summary>
691: public static string DefaultFileCs(Ia.Cl.Model.Language language, Ia.Islamic.Cl.Model.Translation translation, string className)
692: {
693: string s;
694:
695: s = @"using System;
696: using System.Web;
697:
698: ////////////////////////////////////////////////////////////////////////////
699:
700: /// <summary>
701: ///
702: /// </summary>
703: public partial class " + className + @" : System.Web.UI.Page
704: {
705: ////////////////////////////////////////////////////////////////////////////
706:
707: /// <summary>
708: ///
709: /// </summary>
710: void Page_PreInit(object sender, System.EventArgs e)
711: {
712: Ia.Islamic.Koran.Wa.Model.Ui.Default.Theme(this, HttpContext.Current.Profile);
713: }
714:
715: ////////////////////////////////////////////////////////////////////////////
716:
717: /// <summary>
718: ///
719: /// </summary>
720: protected void Page_Load(object sender, EventArgs e)
721: {
722: if (!IsPostBack)
723: {
724: }
725: else
726: {
727: Response.Redirect(""search.aspx?tb="" + tb.Text);
728: }
729: }
730:
731: ////////////////////////////////////////////////////////////////////////////
732: ////////////////////////////////////////////////////////////////////////////
733: }
734: ";
735:
736: return s;
737: }
738:
739: ////////////////////////////////////////////////////////////////////////////
740:
741: /// <summary>
742: ///
743: /// </summary>
744: public static string SearchFile(Ia.Cl.Model.Language language, Ia.Islamic.Cl.Model.Translation translation, string className)
745: {
746: string s;
747:
748: s = @"<%@ Page Language=""C#"" AutoEventWireup=""True"" Inherits=""" + className + @""" MasterPageFile=""~/1_" + language.Symbol + @".master"" CodeBehind=""search.aspx.cs"" %>
749:
750: <asp:Content ContentPlaceHolderID=""contentContentPlaceHolder"" runat=""server"">
751:
752: <asp:HyperLink NavigateUrl=""~/default.aspx"" Text=""" + translation.MainHome + @""" runat=""server""/> » <asp:HyperLink NavigateUrl=""~/" + language.Symbol + @"/default.aspx"" Text=""" + translation.MainTitle + @""" runat=""server""/> » " + translation.SearchTitle + @"
753:
754: <p id=""enter-words"">" + translation.SearchInstruction + @"</p>
755:
756: <p id=""text-box""><asp:TextBox id=""tb"" Maxlength=""32"" Columns=""16"" runat=""server""/> <asp:Button Text="" " + translation.SearchButton + @" "" runat=""server"" /></p>
757:
758: <p id=""hint""><span id=""head"">" + translation.SearchHintName + @"</span>: " + translation.SearchHint + @"</p>
759:
760: <p id=""search-result""><asp:Label id=""searchResultLabel"" EnableViewState=""false"" runat=""server""/></p>
761:
762: <asp:Repeater id=""verseRepeater"" OnItemDataBound=""Repeater_ItemDataBound"" EnableViewState=""false"" Visible=""false"" runat=""server"">
763:
764: <ItemTemplate>
765: <p><asp:HyperLink id=""hyperLink"" runat=""server"" /> <asp:Label id=""label"" runat=""server""/></p>
766: </ItemTemplate>
767:
768: <AlternatingItemTemplate>
769: <p><asp:HyperLink id=""hyperLink"" runat=""server"" /> <asp:Label id=""label"" runat=""server""/></p>
770: </AlternatingItemTemplate>
771:
772: </asp:Repeater>
773:
774: </asp:Content>
775: ";
776:
777: return s;
778: }
779:
780: ////////////////////////////////////////////////////////////////////////////
781:
782: /// <summary>
783: ///
784: /// </summary>
785: public static string SearchFileCs(Ia.Cl.Model.Language language, Ia.Islamic.Cl.Model.Translation translation, string className)
786: {
787: string s;
788:
789: s = @"using System;
790: using System.Web;
791: using System.Web.UI.WebControls;
792:
793: ////////////////////////////////////////////////////////////////////////////
794:
795: /// <summary>
796: ///
797: /// </summary>
798: public partial class " + className + @" : System.Web.UI.Page
799: {
800: private string language;
801:
802: ////////////////////////////////////////////////////////////////////////////
803:
804: /// <summary>
805: ///
806: /// </summary>
807: void Page_PreInit(object sender, System.EventArgs e)
808: {
809: Ia.Islamic.Koran.Wa.Model.Ui.Default.Theme(this, HttpContext.Current.Profile);
810: }
811:
812: ////////////////////////////////////////////////////////////////////////////
813:
814: /// <summary>
815: ///
816: /// </summary>
817: protected void Page_Init(object sender, EventArgs e)
818: {
819: language = """ + language.Symbol + @""";
820: }
821:
822: ////////////////////////////////////////////////////////////////////////////
823:
824: /// <summary>
825: ///
826: /// </summary>
827: protected void Page_Load(object sender, EventArgs e)
828: {
829: if (!IsPostBack)
830: {
831: if (Request.QueryString[""tb""] != null)
832: {
833: tb.Text = Server.HtmlEncode(Request.QueryString[""tb""].ToString());
834:
835: Search(sender, e);
836: }
837: else
838: {
839: tb.Text = null;
840: }
841: }
842: else
843: {
844: Search(sender, e);
845: }
846: }
847:
848: ////////////////////////////////////////////////////////////////////////////
849:
850: /// <summary>
851: ///
852: /// </summary>
853: public void Search(object sender, EventArgs e)
854: {
855: verseRepeater.Visible = false;
856:
857: var verseList = Ia.Islamic.Cl.Model.Business.Default.Search(Server.HtmlEncode(tb.Text), language, out Ia.Cl.Model.Result result);
858:
859: if (result.IsSuccessful)
860: {
861: verseRepeater.Visible = true;
862:
863: verseRepeater.DataSource = verseList;
864: verseRepeater.DataBind();
865:
866: if (!result.HasWarning)
867: {
868: searchResultLabel.Text = result.MessageWithoutCaption;
869: searchResultLabel.CssClass = ""success"";
870: }
871: else
872: {
873: searchResultLabel.Text = result.MessageWithoutCaption;
874: searchResultLabel.CssClass = ""warning"";
875: }
876: }
877: else
878: {
879: searchResultLabel.Text = result.MessageWithoutCaption;
880: searchResultLabel.CssClass = ""error"";
881: }
882: }
883:
884: ////////////////////////////////////////////////////////////////////////////
885:
886: /// <summary>
887: ///
888: /// </summary>
889: public void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
890: {
891: ListItemType itemType = e.Item.ItemType;
892: Ia.Islamic.Cl.Model.Ui.VerseUi verseUi;
893:
894: verseUi = (Ia.Islamic.Cl.Model.Ui.VerseUi)e.Item.DataItem;
895:
896: if (itemType == ListItemType.Item || itemType == ListItemType.AlternatingItem)
897: {
898: for (int i = 0; i < e.Item.Controls.Count; i++)
899: {
900: try
901: {
902: if (e.Item.Controls[i].GetType().ToString() == ""System.Web.UI.WebControls.Label"")
903: {
904: Label label = (Label)e.Item.Controls[i];
905:
906: if (label.ID == ""label"") label.Text = verseUi.Content;
907: }
908: else if (e.Item.Controls[i].GetType().ToString() == ""System.Web.UI.WebControls.HyperLink"")
909: {
910: HyperLink hyperLink = (HyperLink)e.Item.Controls[i];
911:
912: if (hyperLink.ID == ""hyperLink"")
913: {
914: hyperLink.Text = verseUi.ChapterNumber + "":"" + verseUi.Number;
915: hyperLink.NavigateUrl = verseUi.ChapterNumber + "".aspx#"" + verseUi.Number;
916: }
917: }
918: }
919: catch { }
920: }
921: }
922: }
923:
924: ////////////////////////////////////////////////////////////////////////////
925: ////////////////////////////////////////////////////////////////////////////
926: }
927: ";
928:
929: return s;
930: }
931:
932: ////////////////////////////////////////////////////////////////////////////
933: ////////////////////////////////////////////////////////////////////////////
934: }
935:
936: ////////////////////////////////////////////////////////////////////////////
937: ////////////////////////////////////////////////////////////////////////////
938: }