using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace Edge.Core { public static class ExtentionMethod { /// /// Extract the localized content string from source, the source should follow the format-> lang-zh-cn:稳Dart加油机lang-en-us:WayneDartPump /// /// should follow the format-> lang-zh-cn:稳Dart加油机lang-en-us:WayneDartPumplang-xx:xContent /// like-> en-us, zh-cn, or en, zh /// if target language is not searched from source, then content with 'en' locale will be returned, if 'en' locale is not searched, content with 'zh-cn' locale will be returned original, otherwise source will be returned public static string LocalizedContent(this string source, string language) { if (string.IsNullOrEmpty(source)) return source; //if (string.IsNullOrEmpty(language)) return source; //var langDeclareRegexStr = @"(lang-\w\w-\w\w\:).+?((?=lang-\w\w-\w\w\:)|(?=$))"; var allLangDeclareRegexStr = @"(lang-\w\w(-\w\w)?\:).+?((?=lang-\w\w(-\w\w)?\:)|(?=$))"; var allLangMatches = Regex.Matches(source, allLangDeclareRegexStr).Cast(); foreach (var langMatch in allLangMatches) { var targetLangPrefix = "^lang-" + language + @"(-\w\w)?\:"; var m = Regex.Match(langMatch.Value, targetLangPrefix, RegexOptions.IgnoreCase); if (m.Success) return langMatch.Value.Substring(m.Length); } var default_match = allLangMatches.FirstOrDefault(m => m.Value.Split(':')[0].Contains("en", StringComparison.OrdinalIgnoreCase)); if (default_match == null) default_match = allLangMatches.FirstOrDefault(m => m.Value.Split(':')[0].Contains("zh-cn", StringComparison.OrdinalIgnoreCase)); return default_match?.Value?.Substring(default_match.Value.Split(':')[0].Length + 1) ?? source; } /// /// Extract the localized content string from the json schema source. /// the multi-language text in json schema is like-> "title": "lang-zh-cn:停止位lang-en-us:StopBits" /// /// /// like-> en-us, zh-cn, or en, zh /// public static string LocalizedJsonSchema(this string jsonSchemaSource, string language) { if (string.IsNullOrEmpty(jsonSchemaSource)) return jsonSchemaSource; //if (string.IsNullOrEmpty(language)) return jsonSchemaSource; // sample: "title": "lang-zh-cn:停止位lang-en-us:StopBits" var targetContentRegexStr = @"(?<=\""(title|infoText)\""\s*?\:\s*?\"").+?((?=\"")|(?=$))"; var matches = Regex.Matches(jsonSchemaSource, targetContentRegexStr, RegexOptions.Multiline | RegexOptions.IgnoreCase).Cast(); foreach (var ma in matches) { jsonSchemaSource = jsonSchemaSource.Replace(ma.Value, ma.Value.LocalizedContent(language)); } //var allInfoTextContentRegexStr = @"(?<=\""infoText\""\s*?\:\s*?\"").+?((?=\"")|(?=$))"; //var allInfoTextContentMatches = Regex.Matches(jsonSchemaSource, allInfoTextContentRegexStr, RegexOptions.Multiline | RegexOptions.IgnoreCase).Cast(); //foreach (var infoTextNodeContentMatch in allInfoTextContentMatches) //{ // jsonSchemaSource = // jsonSchemaSource.Replace(infoTextNodeContentMatch.Value, // infoTextNodeContentMatch.Value.LocalizedContent(language)); //} return jsonSchemaSource; } /// /// Search the target byte list in src. /// /// /// /// -1 indicates can not find target in src, otherwise, return the index in src, 0 based. public static int IndexOfSubList(this List src, List target) { if (src.Count < target.Count) return -1; int everFound = 0; int srcIndex = 0; int targetIndex = 0; for (int i = 0; i < src.Count; i++) { //if (srcIndex == src.Count - 1) //{ // if (everFound == target.Count) return srcIndex - target.Count + 1; // else return -1; //} if (everFound == target.Count) return srcIndex - target.Count; if (src[srcIndex] == target[targetIndex]) { everFound++; srcIndex++; targetIndex++; } else { if (everFound > 0) { targetIndex = 0; everFound = 0; } else { srcIndex++; } } } if (everFound == target.Count) return srcIndex - target.Count; return -1; } /// /// create a custom logger if it does not exists, otherwise get the logger. /// This is only for NLog implementation. /// /// /// custom logger file name will be created or get. /// public static ILogger CreateOrGetCustomLogger(this ILoggerFactory loggerFactory, string loggerFileName, LogLevel logLevel) { if (string.IsNullOrEmpty(loggerFileName)) throw new ArgumentException("loggerFileName must not be null or empty"); ILogger logger = null; switch (logLevel) { case LogLevel.Trace: logger = loggerFactory.CreateLogger("DynamicPrivate_Trace_" + loggerFileName); break; case LogLevel.Debug: logger = loggerFactory.CreateLogger("DynamicPrivate_Debug_" + loggerFileName); break; case LogLevel.Information: logger = loggerFactory.CreateLogger("DynamicPrivate_Info_" + loggerFileName); break; case LogLevel.Warning: logger = loggerFactory.CreateLogger("DynamicPrivate_Warn_" + loggerFileName); break; case LogLevel.Error: logger = loggerFactory.CreateLogger("DynamicPrivate_Error_" + loggerFileName); break; case LogLevel.Critical: logger = loggerFactory.CreateLogger("DynamicPrivate_Fatal_" + loggerFileName); break; } return logger; } } }