using JD.MapFileFontReader.Service.Configuration; using Newtonsoft.Json; using Plume.Interfaces.Services; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace JD.MapFileFontReader.Service { public class MapFileFontReaderService : IMapFileFontReaderService { private FontReaderConfiguration _configuration; private readonly ICsvDataReader _reader; public MapFileFontReaderService(ICsvDataReader reader) { _reader = reader; } public MapFileFontReaderService() // Use EPPlus as default data reader :this(new EPPlusCsvDataReader()) { } /// /// Returns all characters from a list of files /// /// /// public HashSet GetAllCharacters(IEnumerable files) { var characters = new HashSet(); foreach (var file in files) { var fileCharacters = GetAllCharacters(file).Distinct(); characters.UnionWith(fileCharacters); } return characters; } /// /// Returns all characters from a file /// /// /// private IEnumerable GetAllCharacters(string filePath) { if (Path.GetExtension(filePath) == _configuration.WorksheetFileExtension) { var csv = _reader.FromExcelFile(filePath, _configuration.FontWorksheetName); foreach (var row in csv.Rows) { foreach (var character in row[_configuration.FontColumnName]) { yield return character; } } } else { var characters = File.ReadAllText(filePath).ToCharArray(); foreach (var character in characters) { yield return character; } } } /// /// Get all unicode blocks for asian languages /// public UnicodeBlock[] GetAsianUnicodeBlocks() { return new[] { UnicodeBlock.CJKUnifiedIdeographs, UnicodeBlock.CJKUnifiedIdeographsExtensionsA, UnicodeBlock.CJKCompatibilityIdeographs, UnicodeBlock.CJKCompatibilityForms, UnicodeBlock.CJKRadicalsSupplement, UnicodeBlock.CJKSymbolsandPunctuation, UnicodeBlock.Katakana, UnicodeBlock.Hiragana, UnicodeBlock.Kanbun, UnicodeBlock.HangulSyllables, UnicodeBlock.HangulJamo, UnicodeBlock.HangulCompatibilityJamo, UnicodeBlock.CombiningDiacriticalMarks, UnicodeBlock.PrivateUse, UnicodeBlock.HalfwidthandFullwidthForms, UnicodeBlock.LatinExtendedAdditional, }; } /// /// Get all unicode blocks for european languages /// public UnicodeBlock[] GetEuropeanUnicodeBlocks() { return new[] { UnicodeBlock.BasicLatin, UnicodeBlock.Latin1Supplement, UnicodeBlock.LatinExtendedA, UnicodeBlock.LatinExtendedB, UnicodeBlock.SpacingModifierLetters, UnicodeBlock.CombiningDiacriticalMarks, UnicodeBlock.GeneralPunctuation, UnicodeBlock.CurrencySymbols, UnicodeBlock.Cyrillic, UnicodeBlock.CyrillicSupplement, UnicodeBlock.LetterlikeSymbols, UnicodeBlock.NumberForms, UnicodeBlock.MathematicalOperators, UnicodeBlock.GeometricShapes, UnicodeBlock.Specials, UnicodeBlock.IsGreek, }; } public bool IsAsianLanguage(string fileName) { return _configuration.AsianLanguageNames.Any(fileName.Contains); } public string ConvertToUnicode(string contentToConvert) { var conversionResult = contentToConvert.Select(t => $"U+{Convert.ToUInt16(t):X4}"); return string.Concat(conversionResult); } public void Initialize(IServiceContext serviceContext) { var configFilePath = @"Configuration/FontReaderConfiguration.json"; if (!File.Exists(configFilePath)) { throw new FileNotFoundException("Unable to load the configuration file", configFilePath); } _configuration = JsonConvert.DeserializeObject(File.ReadAllText(configFilePath)); } public void Dispose() { } } }