dialogue_merger.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package sub_helper
  2. import "github.com/allanpk716/ChineseSubFinder/internal/types/subparser"
  3. // DialogueMerger 合并分散的对白,目标是搞定英文字幕
  4. type DialogueMerger struct {
  5. dialogueMap map[string]*subparser.OneDialogueEx
  6. dialogueIndex []string
  7. lastStartTime string
  8. }
  9. func NewDialogueMerger() *DialogueMerger {
  10. return &DialogueMerger{
  11. dialogueMap: make(map[string]*subparser.OneDialogueEx, 0),
  12. dialogueIndex: make([]string, 0),
  13. lastStartTime: "",
  14. }
  15. }
  16. func (d *DialogueMerger) Add(inDialogueEx subparser.OneDialogueEx) bool {
  17. // 第一个首字母是否是大写
  18. isUpper := isFirstLetterIsEngUpper(inDialogueEx.EnLine)
  19. isLower := isFirstLetterIsEngLower(inDialogueEx.EnLine)
  20. if isUpper == true {
  21. // 大写就新增
  22. d.dialogueMap[inDialogueEx.StartTime] = &inDialogueEx
  23. d.lastStartTime = inDialogueEx.StartTime
  24. d.dialogueIndex = append(d.dialogueIndex, inDialogueEx.StartTime)
  25. return true
  26. } else if isLower == true {
  27. // 小写就跟上一条的大写进行匹配,看是否能够附加到后面
  28. if d.lastStartTime == "" {
  29. return false
  30. }
  31. // 这里除了拼接 EnLine,还需要把 offsetEndTime 更新
  32. d.dialogueMap[d.lastStartTime].EnLine += " " + inDialogueEx.EnLine
  33. d.dialogueMap[d.lastStartTime].EndTime = inDialogueEx.EndTime
  34. //d.lastStartTime = ""
  35. return true
  36. } else {
  37. // 其他情况也新增
  38. d.dialogueMap[inDialogueEx.StartTime] = &inDialogueEx
  39. d.dialogueIndex = append(d.dialogueIndex, inDialogueEx.StartTime)
  40. }
  41. return false
  42. }
  43. func (d *DialogueMerger) Clear() {
  44. d.lastStartTime = ""
  45. }
  46. func (d *DialogueMerger) Get() []subparser.OneDialogueEx {
  47. var outDialogueExList = make([]subparser.OneDialogueEx, 0)
  48. for _, startString := range d.dialogueIndex {
  49. outDialogueExList = append(outDialogueExList, *d.dialogueMap[startString])
  50. }
  51. return outDialogueExList
  52. }
  53. // isFirstLetterIsEngUpper 字符开头的是英文大写的字幕
  54. func isFirstLetterIsEngUpper(instring string) bool {
  55. if len(instring) <= 0 {
  56. return false
  57. }
  58. if 64 < instring[0] && instring[0] < 91 {
  59. return true
  60. }
  61. return false
  62. }
  63. // isFirstLetterIsEngLower 字符开头的是英文小写的字幕
  64. func isFirstLetterIsEngLower(instring string) bool {
  65. if len(instring) <= 0 {
  66. return false
  67. }
  68. if 96 < instring[0] && instring[0] < 123 {
  69. return true
  70. }
  71. return false
  72. }