123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- 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();
- }
- }
- }
- }
|