LrcKanjiHiraganaInjectPage.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. using System.Drawing;
  3. using System.IO;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Windows.Forms;
  7. namespace LrcTool
  8. {
  9. internal static class LrcKanjiHiraganaInjectPage
  10. {
  11. public static Control Create(Form frmMain)
  12. {
  13. var split = new SplitContainer
  14. {
  15. Dock = DockStyle.Fill,
  16. SplitterDistance = 70,
  17. Font = new Font("MS Gothic", 9),
  18. Orientation = Orientation.Vertical,
  19. };
  20. var rbLeft = new RichTextBox { Dock = DockStyle.Fill, AllowDrop = true };
  21. var rbRight = new RichTextBox { Dock = DockStyle.Fill, ReadOnly = true };
  22. split.Panel1.Controls.Add(rbLeft);
  23. split.Panel2.Controls.Add(rbRight);
  24. rbLeft.DragEnter += (sender, args) =>
  25. {
  26. string[] items;
  27. args.Effect = args.Data.GetDataPresent(DataFormats.FileDrop)
  28. && 1 == (items = (string[])args.Data.GetData(DataFormats.FileDrop)).Length
  29. && File.Exists(items[0])
  30. ? DragDropEffects.Copy
  31. : DragDropEffects.None;
  32. };
  33. rbLeft.DragDrop += (sender, args) =>
  34. {
  35. var items = (string[])args.Data.GetData(DataFormats.FileDrop);
  36. var bytes = File.ReadAllBytes(items[0]);
  37. rbLeft.Text = 0 == args.KeyState
  38. ? Encoding.Default.GetString(bytes)
  39. : Encoding.UTF8.GetString(bytes);
  40. };
  41. rbLeft.TextChanged += (sender, args) =>
  42. {
  43. try
  44. {
  45. rbRight.Text = HiraganaInject(rbLeft.Lines);
  46. }
  47. catch (Exception e)
  48. {
  49. rbRight.Text = e.ToString();
  50. }
  51. };
  52. frmMain.Shown += delegate
  53. {
  54. rbLeft.Text = "[00:00.00]漢字のひらがなを自動に生成する";
  55. };
  56. return split;
  57. }
  58. private static string HiraganaInject(string[] lines)
  59. {
  60. using (var helper = new HiraganaPhoneticHelper())
  61. {
  62. var sb = new StringBuilder();
  63. foreach (var line in lines)
  64. {
  65. //split by pattern
  66. // kanji-kana -> handle
  67. // other -> copy
  68. var preMatch = Regex.Match(line, @"(\[\d\d:\d\d\.\d\d])(.*)");
  69. var lineProcessed = preMatch.Groups[1].Value;
  70. var content = preMatch.Groups[2].Value;
  71. var matches = Regex.Matches(content, "(?:\\p{IsCJKUnifiedIdeographs}+?\\p{IsHiragana}+|\\p{IsCJKUnifiedIdeographs}+)");
  72. if (0 == matches.Count)
  73. {
  74. sb.AppendLine(line);
  75. continue;
  76. }
  77. var caret = 0;
  78. foreach (Match match in matches)
  79. {
  80. if (match.Index != caret) lineProcessed += content.Substring(caret, match.Index - caret);
  81. var matchValue = match.Value;
  82. if (false == Regex.IsMatch(matchValue, "\\p{IsCJKUnifiedIdeographs}+"))
  83. {
  84. lineProcessed += matchValue;
  85. caret = match.Index + match.Length;
  86. continue;
  87. }
  88. var result = helper.GetPhonetic(matchValue);
  89. var postMatch = Regex.Match(matchValue, "(\\w+?)(\\p{IsHiragana}+)");
  90. if (postMatch.Success)
  91. {
  92. var kanji = postMatch.Groups[1].Value;
  93. var after = postMatch.Groups[2].Value;
  94. lineProcessed += kanji + $"({result.Substring(0, result.Length - after.Length)})" + after;
  95. }
  96. else
  97. {
  98. lineProcessed += $"{matchValue}({result})";
  99. }
  100. caret = match.Index + match.Length;
  101. }
  102. if (caret != content.Length) lineProcessed += content.Substring(caret);
  103. sb.AppendLine(lineProcessed);
  104. }
  105. return sb.ToString();
  106. }
  107. }
  108. }
  109. }