Class: CLI::UI::Formatter

Inherits:
Object
  • Object
show all
Defined in:
lib/cli/ui/formatter.rb

Defined Under Namespace

Classes: FormatError

Constant Summary collapse

SGR_MAP =

Available mappings of formattings To use any of them, you can use {<key>:<string>} There are presentational (colours and formatters) and semantic (error, info, command) formatters available

{
  # presentational
  'red'       => '31',
  'green'     => '32',
  'yellow'    => '33',
  # default blue is low-contrast against black in some default terminal color scheme
  'blue'      => '94', # 9x = high-intensity fg color x
  'magenta'   => '35',
  'cyan'      => '36',
  'bold'      => '1',
  'italic'    => '3',
  'underline' => '4',
  'reset'     => '0',

  # semantic
  'error'   => '31', # red
  'success' => '32', # success
  'warning' => '33', # yellow
  'info'    => '94', # bright blue
  'command' => '36', # cyan
}.freeze
BEGIN_EXPR =
'{{'
END_EXPR =
'}}'
SCAN_WIDGET =
%r[@widget/(?<handle>\w+):(?<args>.*?)}}]
SCAN_FUNCNAME =
/\w+:/
SCAN_GLYPH =
/.}}/
SCAN_BODY =
%r{
  .*?
  (
    #{BEGIN_EXPR} |
    #{END_EXPR}   |
    \z
  )
}mx
DISCARD_BRACES =
0..-3
LITERAL_BRACES =
:__literal_braces__

Instance Method Summary collapse

Constructor Details

#initialize(text) ⇒ Formatter

Initialize a formatter with text.

Attributes
  • text - the text to format


70
71
72
# File 'lib/cli/ui/formatter.rb', line 70

def initialize(text)
  @text = text
end

Instance Method Details

#format(sgr_map = SGR_MAP, enable_color: CLI::UI.enable_color?) ⇒ Object

Format the text using a map.

Attributes
  • sgr_map - the mapping of the formattings. Defaults to SGR_MAP

Options
  • :enable_color - enable color output? Default is true unless output is redirected


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/cli/ui/formatter.rb', line 84

def format(sgr_map = SGR_MAP, enable_color: CLI::UI.enable_color?)
  @nodes = []
  stack = parse_body(StringScanner.new(@text))
  prev_fmt = nil
  content = @nodes.each_with_object(+'') do |(text, fmt), str|
    if prev_fmt != fmt && enable_color
      text = apply_format(text, fmt, sgr_map)
    end
    str << text
    prev_fmt = fmt
  end

  stack.reject! { |e| e == LITERAL_BRACES }

  return content unless enable_color
  return content if stack == prev_fmt

  unless stack.empty? && (@nodes.size.zero? || @nodes.last[1].empty?)
    content << apply_format('', stack, sgr_map)
  end
  content
end