PageRenderTime 41ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/rex/ui/text/color.rb

https://bitbucket.org/jrossi/metasploit
Ruby | 97 lines | 68 code | 9 blank | 20 comment | 4 complexity | b77a0a9f463c14e8adc7bfde0d288e93 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, BSD-3-Clause
  1. module Rex
  2. module Ui
  3. module Text
  4. ###
  5. #
  6. # This module provides an interface to getting ANSI color codes.
  7. # It's taken mostly from perl's Term::ANSIColor by Russ Allbery
  8. # <rra@stanford.edu> and Zenin <zenin@best.com>.
  9. #
  10. ###
  11. module Color
  12. AnsiAttributes =
  13. {
  14. 'clear' => 0,
  15. 'reset' => 0,
  16. 'bold' => 1,
  17. 'dark' => 2,
  18. 'underline' => 4,
  19. 'underscore' => 4,
  20. 'blink' => 5,
  21. 'reverse' => 7,
  22. 'concealed' => 8,
  23. 'black' => 30, 'on_black' => 40,
  24. 'red' => 31, 'on_red' => 41,
  25. 'green' => 32, 'on_green' => 42,
  26. 'yellow' => 33, 'on_yellow' => 43,
  27. 'blue' => 34, 'on_blue' => 44,
  28. 'magenta' => 35, 'on_magenta' => 45,
  29. 'cyan' => 36, 'on_cyan' => 46,
  30. 'white' => 37, 'on_white' => 47
  31. }
  32. #
  33. # Return a string with ANSI codes substituted. Derived from code
  34. # written by The FaerieMUD Consortium.
  35. #
  36. def ansi(*attrs)
  37. attr = attrs.collect {|a| AnsiAttributes[a] ? AnsiAttributes[a] : nil}.compact.join(';')
  38. attr = "\e[%sm" % attr if (attr.empty? == false)
  39. return attr
  40. end
  41. #
  42. # Colorize if this shell supports it
  43. #
  44. def colorize(*color)
  45. supports_color?() ? ansi(*color) : ''
  46. end
  47. def substitute_colors(msg, in_prompt = nil)
  48. str = msg.dup
  49. pre_color = post_color = ''
  50. if (in_prompt)
  51. pre_color = "\x01" # RL_PROMPT_START_IGNORE
  52. post_color = "\x02" # RL_PROMPT_END_IGNORE
  53. end
  54. str.gsub!(/%cya/, pre_color+colorize('cyan')+post_color)
  55. str.gsub!(/%red/, pre_color+colorize('red')+post_color)
  56. str.gsub!(/%grn/, pre_color+colorize('green')+post_color)
  57. str.gsub!(/%blu/, pre_color+colorize('blue')+post_color)
  58. str.gsub!(/%yel/, pre_color+colorize('yellow')+post_color)
  59. str.gsub!(/%whi/, pre_color+colorize('white')+post_color)
  60. str.gsub!(/%mag/, pre_color+colorize('magenta')+post_color)
  61. str.gsub!(/%blk/, pre_color+colorize('black')+post_color)
  62. str.gsub!(/%dred/, pre_color+colorize('dark', 'red')+post_color)
  63. str.gsub!(/%dgrn/, pre_color+colorize('dark', 'green')+post_color)
  64. str.gsub!(/%dblu/, pre_color+colorize('dark', 'blue')+post_color)
  65. str.gsub!(/%dyel/, pre_color+colorize('dark', 'yellow')+post_color)
  66. str.gsub!(/%dcya/, pre_color+colorize('dark', 'cyan')+post_color)
  67. str.gsub!(/%dwhi/, pre_color+colorize('dark', 'white')+post_color)
  68. str.gsub!(/%dmag/, pre_color+colorize('dark', 'magenta')+post_color)
  69. str.gsub!(/%und/, pre_color+colorize('underline')+post_color)
  70. str.gsub!(/%bld/, pre_color+colorize('bold')+post_color)
  71. str.gsub!(/%clr/, pre_color+colorize('clear')+post_color)
  72. str
  73. end
  74. #
  75. # Resets coloring so that it's back to normal.
  76. #
  77. def reset_color
  78. return if not supports_color?
  79. print(colorize('clear'))
  80. end
  81. #
  82. # Colorize if this shell supports it
  83. #
  84. def do_colorize(*color)
  85. supports_color?() ? ansi(*color) : ''
  86. end
  87. end
  88. end end end