Lekce 6 - Konverter, práce s textem - ISIM
Je také velmi nápomocná třída Converter, která obsahuje metody například GetContactName/ID/Avatar atd. které rozpoznají daný parametr a najdou v něm požadovanou informaci a vrátí ji. Což velmi usnadní práci, tam, kde se objevují objekty různých druhů. Ovšem například v třídách pro práci s knihovnou Skype, kde vím, co chci použít a neplete se to, můžu klidně psát hned co potřebuji.
Jen lehký příkládek:
public static class Converter { public static Availability GetContactAvailability(object contact) { if (contact is SktContact) { switch ((contact as SktContact).P_AVAILABILITY) { case SktContact.AVAILABILITY.NOT_AVAILABLE: case SktContact.AVAILABILITY.NOT_AVAILABLE_FROM_MOBILE: case SktContact.AVAILABILITY.AWAY_FROM_MOBILE: case SktContact.AVAILABILITY.AWAY: return Availability.Away; ... default: return Availability.Invisible; } } if (contact is PresenceType) { switch ((PresenceType)contact) { case PresenceType.available: return Availability.Online; ... } } if (contact is IcqSharp.Base.Status) { switch ((IcqSharp.Base.Status)contact) { case IcqSharp.Base.Status.Online: case IcqSharp.Base.Status.FreeForChat: return Availability.Online; .... } } return Availability.Offline; } }
Pak také používám třídu TextEdit, která zajišťuje práci s textem. Přidává rozšíření například Split která se využívá u SMS a Facebooku, kde je třeba zprávu rozdělit, pokud má více znaků, než je možné poslat. Nebo odstranění XML tagů, které posílá Skype, smajlíci aj.
Zase vypíšu jen to zajímavé a popíšu co to dělá.
public static class TextEdit {
Pokud dám klíčové slůvko this
před datový typ parametru,
udělám si pro něj rozšíření. Takže teď můžu napsat ->
"něco".SplitString(2). Je nutné mít takovou metodu v nevnořené
třídě.
public static IEnumerable<string> SplitString(this string input, int outputStringLength) { var count = 0; while (count < input.Length) { var length = Math.Min(outputStringLength, input.Length - count); yield return string.Format("{0}", input.Substring(count, length)); count += outputStringLength; } } public static string RemoveDiacritics(this string inputString) { String normalizedString = inputString.Normalize(NormalizationForm.FormD); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < normalizedString.Length; i++) { Char c = normalizedString[i]; if (System.Globalization.CharUnicodeInfo.GetUnicodeCategory(c) != System.Globalization.UnicodeCategory.NonSpacingMark) stringBuilder.Append(c); } return stringBuilder.ToString(); }
/// <summary> /// Smaže neplatné znaky - používá se pro zápis do souboru, aby neobsahoval neplatné znaky /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static string RemoveInvalidCharactersFromFileName(string fileName) { if ((fileName.Length > 0) && (fileName.Substring(0, 1) == "-")) fileName = fileName.Substring(1); return Strip(fileName, "\\", "/", ":", "*", "?", "\"", "<", ">", "|"); } private static string Strip(string input, params string[] removals) { foreach (string removal in removals) { input = input.Replace(removal, ""); } return input; }
Dycky mě štvalo, jak zkracovali název a přidávali ... tečky ... do slov jako napříkla... kde bylo zřejmé, že stačí jedno dvě pímenka aby to slovo skončilo a ty tečky mu to skazily. Proto tam je to + 3.
/// <summary> /// ZKrátí text na danou délku /// </summary> /// <param name="text"></param> /// <param name="length"></param> /// <returns></returns> public static string SortText(this string text, int length) { if (text.Length > length + 3) return text.Substring(0, length) + "..."; return text; }
Tohle mi všude tvrdili, že nejde a že je třeba strašně moc externích knihoven. Ale já jim nevěřil... Používá se u Skype, který posílá zprávy v XML. Doporučuji shlédnout je to něco jako <ss type="smile">:-)</ss>
/// <summary> /// Smaže html tagy /// </summary> /// <param name="text">Text</param> /// <returns>Text bez html tagů</returns> public static string StripHtmlTags(string text) { return System.Text.RegularExpressions.Regex.Replace(text, "<.*?>", string.Empty); } /// <summary> /// Dekóduje html entity /// </summary> /// <param name="text">Text</param> /// <returns>Text s dekódovanýma entitama</returns> public static string DecodeHtmlEntities(string text) { // dekóduje základní entity string decodedText = System.Web.HttpUtility.HtmlDecode(text); // přidání speciálních entit, které to nedekóduje Dictionary<string, string> entityExtended = new Dictionary<string, string>(); entityExtended.Add("'", "'"); foreach (var entity in entityExtended) decodedText = decodedText.Replace(entity.Key, entity.Value); return decodedText; }