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',
  'blue'      => '34',
  'magenta'   => '35',
  'cyan'      => '36',
  'bold'      => '1',
  'italic'    => '3',
  'underline' => '4',
  'reset'     => '0',

  # semantic
  'error'   => '31', # red
  'success' => '32', # success
  'warning' => '33', # yellow
  'info'    => '34', # blue
  'command' => '36', # cyan
}.freeze
BEGIN_EXPR =
'{{'
END_EXPR =
'}}'
SCAN_FUNCNAME =
/\w+:/
SCAN_GLYPH =
/.}}/
SCAN_BODY =
/
  .*?
  (
    #{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



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

def initialize(text)
  @text = text
end

Instance Method Details

#format(sgr_map = SGR_MAP, enable_color: true) ⇒ 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



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

def format(sgr_map = SGR_MAP, enable_color: true)
  @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