subject.rb 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. module Ticket::Subject
  3. =begin
  4. build new subject with ticket number in there
  5. ticket = Ticket.find(123)
  6. prefix_mode = :reply # :forward, nil
  7. result = ticket.subject_build('some subject', prefix_mode)
  8. returns
  9. result = "[Ticket#1234567] some subject"
  10. =end
  11. def subject_build(subject, prefix_mode = nil)
  12. # clean subject
  13. subject_parts = [subject_clean(subject)]
  14. # add hook
  15. case Setting.get('ticket_hook_position')
  16. when 'left'
  17. subject_parts.unshift subject_build_hook
  18. when 'right'
  19. subject_parts.push subject_build_hook
  20. end
  21. # add prefix
  22. subject_parts
  23. .unshift(subject_build_prefix(prefix_mode))
  24. .compact!
  25. subject_parts.join ' '
  26. end
  27. =begin
  28. clean subject remove ticket number and other not needed chars
  29. ticket = Ticket.find(123)
  30. result = ticket.subject_clean('[Ticket#1234567] some subject')
  31. returns
  32. result = "some subject"
  33. =end
  34. def subject_clean(subject)
  35. return '' if subject.blank?
  36. ticket_hook = Setting.get('ticket_hook')
  37. ticket_hook_divider = Setting.get('ticket_hook_divider')
  38. ticket_subject_size = Setting.get('ticket_subject_size')
  39. # remove all possible ticket hook formats with []
  40. subject = subject.gsub(%r{\[#{ticket_hook}: #{number}\](\s+?|)}, '')
  41. subject = subject.gsub(%r{\[#{ticket_hook}:#{number}\](\s+?|)}, '')
  42. subject = subject.gsub(%r{\[#{ticket_hook}#{ticket_hook_divider}#{number}\](\s+?|)}, '')
  43. # remove all possible ticket hook formats without []
  44. subject = subject.gsub(%r{#{ticket_hook}: #{number}(\s+?|)}, '')
  45. subject = subject.gsub(%r{#{ticket_hook}:#{number}(\s+?|)}, '')
  46. subject = subject.gsub(%r{#{ticket_hook}#{ticket_hook_divider}#{number}(\s+?|)}, '')
  47. # remove leading "..:\s" and "..[\d+]:\s" e. g. "Re: " or "Re[5]: "
  48. subject = subject.gsub(%r{^(..(\[\d+\])?:\s)+}, '')
  49. # resize subject based on config
  50. if subject.length > ticket_subject_size.to_i
  51. subject = "#{subject[ 0, ticket_subject_size.to_i ]}[...]"
  52. end
  53. subject.strip!
  54. subject
  55. end
  56. private
  57. def subject_build_hook
  58. ticket_hook = Setting.get('ticket_hook')
  59. ticket_hook_divider = Setting.get('ticket_hook_divider')
  60. "[#{ticket_hook}#{ticket_hook_divider}#{number}]"
  61. end
  62. def subject_build_prefix(prefix_mode)
  63. prefix = case prefix_mode
  64. when 'reply'
  65. Setting.get('ticket_subject_re')
  66. when 'forward'
  67. Setting.get('ticket_subject_fwd')
  68. end
  69. prefix.present? ? "#{prefix}:" : nil
  70. end
  71. end