PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/plugins/saykanji.rb

https://github.com/Epictetus/termtter
Ruby | 81 lines | 67 code | 8 blank | 6 comment | 3 complexity | a360c3ab64c22d417be9aa405a719dc8 MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. ## Need install "SayKana" & "MeCab (UTF-8)"
  3. ## SayKana
  4. ## http://www.a-quest.com/aquestalk/saykana/
  5. ## MeCab
  6. ## http://mecab.sourceforge.net/
  7. require 'uri'
  8. config.plugins.saykanji.set_default(:user_to_say, [])
  9. config.plugins.saykanji.set_default(:keyword_to_say, [])
  10. config.plugins.saykanji.set_default(:say_speed, 100)
  11. config.plugins.saykanji.set_default(:kana_english_dict_path, "#{Termtter::CONF_DIR}/tmp/kana_english_dict.csv")
  12. if config.plugins.saykanji.user_to_say.empty? &&
  13. config.plugins.saykanji.keyword_to_say.empty?
  14. config.plugins.saykanji.keyword_to_say = /./
  15. end
  16. def saykanji(text, say_speed)
  17. text_without_uri = text.gsub(URI.regexp(['http', 'https']), 'URI').
  18. gsub('~', '〜').gsub(/[]/, 'ー').gsub('&', 'アンド').
  19. delete("\n\`\'\"<>[]()|:;#")
  20. text_wakati = `echo #{text_without_uri}|mecab -O wakati`.split(' ')
  21. text_wakati.map!{ |i|
  22. if /[@a-zA-Z]/ =~ i && File.file?(config.plugins.saykanji.kana_english_dict_path)
  23. kana_english = `grep -i "\\"#{i}\\"" #{config.plugins.saykanji.kana_english_dict_path}`
  24. unless kana_english.empty?
  25. /^"(.+?)"/.match(kana_english).to_a[1]
  26. else
  27. i
  28. end
  29. elsif i == 'は'
  30. 'ワ'
  31. elsif i == 'へ'
  32. 'エ'
  33. else
  34. i
  35. end
  36. }
  37. text_to_say = `echo #{text_wakati.join}|mecab -O yomi`
  38. system "SayKana -s #{say_speed} \"#{text_to_say}\" 2>/dev/null"
  39. end
  40. def say(who, text)
  41. text_to_say = text.gsub(URI.regexp(['http', 'https']), 'U.R.I.')
  42. voices = %w(Alex Alex Bruce Fred Ralph Agnes Kathy Vicki)
  43. voice = voices[who.hash % voices.size]
  44. system 'say', '-v', voice, text_to_say
  45. end
  46. module Termtter::Client
  47. say_threads = []
  48. register_hook(:name => :saykanji,
  49. :point => :output,
  50. :exec_proc => lambda {|statuses, event|
  51. return unless event == :update_friends_timeline
  52. say_threads << Thread.start do
  53. (say_threads - [Thread.current]).each { |t| t.join }
  54. statuses.each do |s|
  55. if /[-んァ-ヴ一-]/ =~ s.text
  56. saykanji(s.text, config.plugins.saykanji.say_speed.to_i)
  57. else
  58. say(s.screen_name, s.text)
  59. end
  60. end
  61. end
  62. }
  63. )
  64. register_hook(:name => :saykanji_filter,
  65. :point => :filter_for_saykanji,
  66. :exec => lambda { |statuses, event|
  67. statuses.select do |s|
  68. config.plugins.saykanji.user_to_say.include?(s.user.screen_name) ||
  69. Regexp.union(*config.plugins.saykanji.keyword_to_say) =~ s.text
  70. end
  71. }
  72. )
  73. end