RMarK0

Task1 ViewModel

Jun 19th, 2021 (edited)
1,009
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Text;
  7. using System.Text.RegularExpressions;
  8. using System.Windows;
  9. using System.Windows.Controls;
  10. using Newtonsoft.Json.Linq;
  11.  
  12. namespace Task1
  13. {
  14.     /*
  15.      * Class, which contains most of the logic
  16.      * of the app.
  17.      */
  18.  
  19.     static class ViewModelHelper
  20.     {
  21.         internal static List<int> badStringsId = new List<int>(); // List that contains incorrect IDs (< 1 && > 20)
  22.  
  23.         public static List<int> CleanInputString(string input) // Method that cleans up selection of input IDs
  24.         {
  25.             char[] stringSeparators = { ',',';' };
  26.             string[] inputSubstrings = input.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
  27.             List<int> cleanInput = new List<int>();
  28.  
  29.             foreach (var substring in inputSubstrings)
  30.             {
  31.                 bool isClean;
  32.                 int temp = 0;
  33.                 try
  34.                 {
  35.                     temp = Convert.ToInt32(substring.Trim()); // If substring can be converted to int and (0 < input < 21), it is considered as "clean"
  36.                     if (temp > 0 && temp < 21)
  37.                         isClean = true;
  38.                     else
  39.                     {
  40.                         badStringsId.Add(temp);               // If not, it is considered "unclean" and will be put at special list
  41.                         isClean = false;
  42.                     }
  43.                 }
  44.                 catch (Exception)
  45.                 {
  46.                     isClean = false;                           // Same pattern here
  47.                 }
  48.                 if (isClean)
  49.                 {
  50.                     cleanInput.Add(temp);
  51.                 }
  52.             }
  53.  
  54.             cleanInput = cleanInput.Distinct().ToList();     // Removing all duplicates in lists
  55.             badStringsId = badStringsId.Distinct().ToList(); //
  56.             return cleanInput;
  57.         }
  58.  
  59.         private static TextBlock CreateTextBlock() // Preset for data node TextBlock
  60.         {
  61.             TextBlock output = new TextBlock()
  62.             {
  63.                 FontSize = 18,
  64.                 TextWrapping = TextWrapping.Wrap,
  65.                 VerticalAlignment = VerticalAlignment.Center,
  66.                 HorizontalAlignment = HorizontalAlignment.Left,
  67.                 Margin = new Thickness(15)
  68.             };
  69.             return output;
  70.         }
  71.  
  72.         public static void CreateTextNode(TextData item, MainWindow window) // Method that creates new data node in TextViewer
  73.         {
  74.             window.TextViewerGrid.RowDefinitions.Add(new RowDefinition()
  75.             {
  76.                 Height = GridLength.Auto
  77.             });
  78.  
  79.             for (int i = 0; i < window.TextViewerGrid.ColumnDefinitions.Count; i++) // For each grid.column we create 3 TextBlocks,
  80.                                                                                     // which contain text, words count and vowels count
  81.             {
  82.                 TextBlock dataNode = CreateTextBlock();
  83.                 window.TextViewerGrid.Children.Add(dataNode);
  84.                 Grid.SetRow(dataNode, window.TextViewerGrid.RowDefinitions.Count - 1);
  85.                 Grid.SetColumn(dataNode, i);
  86.  
  87.                 switch (i) // For each column we assign, whether it will be text,words count or vowels count TextBlock
  88.                 {
  89.                     case (0):
  90.                         dataNode.Text = item.Text;
  91.                         break;
  92.                     case (1):
  93.                         dataNode.Text = item.WordsCount.ToString();
  94.                         break;
  95.                     case (2):
  96.                         dataNode.Text = item.VowelsCount.ToString();
  97.                         break;
  98.                     default:
  99.                         throw new NotImplementedException();
  100.                 }
  101.             }
  102.         }
  103.  
  104.         public static void ClearPreviousResults(MainWindow window) // Method that clears the table
  105.         {
  106.             window.TextViewerGrid.Children.Clear();
  107.             window.TextViewerGrid.RowDefinitions.Clear();
  108.         }
  109.  
  110.         public static JObject ObtainJObject(int index, MainWindow window) // Method that gets JSON object from the server
  111.         {
  112.             string uri = $"https://tmgwebtest.azurewebsites.net/api/textstrings/{index}"; // Lovely TMG link <3
  113.  
  114.             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
  115.             request.Headers.Add("TMG-Api-Key", "0J/RgNC40LLQtdGC0LjQutC4IQ==");
  116.             HttpWebResponse response;
  117.  
  118.             try // Trying to get response on our request
  119.             {
  120.                 response = (HttpWebResponse)request.GetResponse();
  121.             }
  122.             catch (Exception e)
  123.             {
  124.                 Console.WriteLine(e.Message);
  125.                 throw;
  126.             }
  127.  
  128.             Stream receiveStream = response.GetResponseStream();
  129.             Encoding encoding = Encoding.UTF8;
  130.             StreamReader readStream = new StreamReader(receiveStream ?? throw new InvalidOperationException("Cannot open StreamReader"), encoding);
  131.  
  132.             // Opening stream to read incoming files from server
  133.  
  134.             char[] bytes = new char[256]; // Buffer array
  135.             int count = readStream.Read(bytes, 0, 256); // Collects data from incoming stream
  136.             StringBuilder sb = new StringBuilder();
  137.  
  138.             while (count > 0)
  139.             {
  140.                 sb.Append(new String(bytes, 0, count)); // Brings data from bytes to StringBuilder
  141.                 count = readStream.Read(bytes, 0, 256);
  142.             }
  143.             response.Close();
  144.             readStream.Close();
  145.  
  146.             JObject json;
  147.  
  148.             try // Trying to convert StringBuilder to JSON object
  149.             {
  150.                 json = JObject.Parse(sb.ToString());
  151.             }
  152.             catch (Exception e)
  153.             {
  154.                 CreateNotification(window, e.Message);
  155.                 throw;
  156.             }
  157.  
  158.             return json;
  159.         }
  160.  
  161.         public static void CreateNotification(MainWindow window, string text) // Method that creates notification TextBlock
  162.         {
  163.             TextBlock exceptionTextBlock = new TextBlock()
  164.             {
  165.                 Text = text,
  166.                 Margin = new Thickness(10)
  167.             };
  168.             window.mainGrid.Children.Add(exceptionTextBlock);
  169.             Grid.SetRow(exceptionTextBlock, 0);
  170.             Grid.SetColumn(exceptionTextBlock, 0);
  171.             Grid.SetColumnSpan(exceptionTextBlock, 3);
  172.         }
  173.  
  174.         public static string GetTextFromJson(JObject json, MainWindow window) // Method that gets content of the token named "text"
  175.         {
  176.             bool containsText = false;
  177.  
  178.             foreach (var pair in json) // if code finds token named "text", it switches flag containsText to true
  179.                 if (pair.Key == "text")
  180.                     containsText = true;
  181.  
  182.             if (!containsText)
  183.                 throw new ArgumentException("Current JSON don't have any tokens named 'text'");
  184.  
  185.             try
  186.             {
  187.                 string text = json.SelectToken("text").Value<string>(); // if it finds text, it returns it
  188.                 return text;
  189.             }
  190.             catch (Exception e)
  191.             {
  192.                 CreateNotification(window, e.Message);
  193.                 throw;
  194.             }
  195.         }
  196.  
  197.         public static TextData CalculateTextData(string text) // For each data node we call this method to calculate words and vowels count
  198.         {
  199.             int vowelsCount = 0;
  200.             int wordsCount = 0;
  201.  
  202.             var vowels = new HashSet<char>() // It is possible that it contains not all vowel letters
  203.             {
  204.                 'a', 'e', 'i', 'o', 'u', 'æ', 'ø', 'ǫ', 'ö', 'ü', 'ä', 'y', 'а', 'е', 'ё', 'и', 'о', 'у', 'ы', 'э', 'ю',
  205.                 'я', 'è', 'ê', 'é', 'à', 'á', 'â', 'ã', 'ä', 'å', 'ë', 'ё', 'ì', 'í', 'î', 'ï', 'ò', 'ó', 'ô', 'õ', 'ù',
  206.                 'ú', 'û', 'ý', 'ÿ', 'ı', 'ō', 'ŏ', 'ő', 'œ', 'ũ', 'ū', 'ŭ', 'ů', 'ű', 'ų', 'ŷ', 'ƣ', 'ơ', 'ư', 'ƴ', 'ƹ',
  207.                 'ƺ', 'ӧ', 'і'
  208.             };
  209.            
  210.             text = text.ToLower();
  211.             for (int i = 0; i < text.Length; i++) // Checks if current letter is vowel
  212.             {
  213.                 if (vowels.Contains(text[i]))
  214.                 {
  215.                     vowelsCount++;
  216.                 }
  217.             }
  218.  
  219.             var matches = Regex.Matches(text,                                           //
  220.                 @"[\w']+", RegexOptions.CultureInvariant | RegexOptions.Multiline       // Counts words in input string with regex [\w']+
  221.                                                          | RegexOptions.IgnoreCase);    //
  222.             wordsCount = matches.Count;
  223.  
  224.             return new TextData(vowelsCount, wordsCount, text);
  225.         }
  226.     }
  227. }
  228.  
RAW Paste Data