using System; using System.Drawing; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; namespace LrcTool { internal static class LrcKanjiHiraganaInjectPage { public static Control Create(Form frmMain) { var split = new SplitContainer { Dock = DockStyle.Fill, SplitterDistance = 70, Font = new Font("MS Gothic", 9), Orientation = Orientation.Vertical, }; var rbLeft = new RichTextBox { Dock = DockStyle.Fill, AllowDrop = true }; var rbRight = new RichTextBox { Dock = DockStyle.Fill, ReadOnly = true }; split.Panel1.Controls.Add(rbLeft); split.Panel2.Controls.Add(rbRight); rbLeft.DragEnter += (sender, args) => { string[] items; args.Effect = args.Data.GetDataPresent(DataFormats.FileDrop) && 1 == (items = (string[])args.Data.GetData(DataFormats.FileDrop)).Length && File.Exists(items[0]) ? DragDropEffects.Copy : DragDropEffects.None; }; rbLeft.DragDrop += (sender, args) => { var items = (string[])args.Data.GetData(DataFormats.FileDrop); var bytes = File.ReadAllBytes(items[0]); rbLeft.Text = 0 == args.KeyState ? Encoding.Default.GetString(bytes) : Encoding.UTF8.GetString(bytes); }; rbLeft.TextChanged += (sender, args) => { try { rbRight.Text = HiraganaInject(rbLeft.Lines); } catch (Exception e) { rbRight.Text = e.ToString(); } }; frmMain.Shown += delegate { rbLeft.Text = "[00:00.00]漢字のひらがなを自動に生成する"; }; return split; } private static string HiraganaInject(string[] lines) { using (var helper = new HiraganaPhoneticHelper()) { var sb = new StringBuilder(); foreach (var line in lines) { //split by pattern // kanji-kana -> handle // other -> copy var preMatch = Regex.Match(line, @"(\[\d\d:\d\d\.\d\d])(.*)"); var lineProcessed = preMatch.Groups[1].Value; var content = preMatch.Groups[2].Value; var matches = Regex.Matches(content, "(?:\\p{IsCJKUnifiedIdeographs}+?\\p{IsHiragana}+|\\p{IsCJKUnifiedIdeographs}+)"); if (0 == matches.Count) { sb.AppendLine(line); continue; } var caret = 0; foreach (Match match in matches) { if (match.Index != caret) lineProcessed += content.Substring(caret, match.Index - caret); var matchValue = match.Value; if (false == Regex.IsMatch(matchValue, "\\p{IsCJKUnifiedIdeographs}+")) { lineProcessed += matchValue; caret = match.Index + match.Length; continue; } var result = helper.GetPhonetic(matchValue); var postMatch = Regex.Match(matchValue, "(\\w+?)(\\p{IsHiragana}+)"); if (postMatch.Success) { var kanji = postMatch.Groups[1].Value; var after = postMatch.Groups[2].Value; lineProcessed += kanji + $"({result.Substring(0, result.Length - after.Length)})" + after; } else { lineProcessed += $"{matchValue}({result})"; } caret = match.Index + match.Length; } if (caret != content.Length) lineProcessed += content.Substring(caret); sb.AppendLine(lineProcessed); } return sb.ToString(); } } } }