Class List Method List File List

# Class: Cri::StringFormatter

Inherits:
  Object
  - Object
  - Cri::StringFormatter
  show all
Defined in:
  lib/cri/string_formatter.rb

## Instance Method Summary (collapse)

- - (String) format_as_command(s, io)

  The string, formatted to be used as the name of a command in the help.

- - (String) format_as_option(s, io)

  The string, formatted to be used as an option definition of a command in the help.

- - (String) format_as_title(s, io)

  The string, formatted to be used as a title in a section in the help.

- - (Array<String>) to_paragraphs(s)

  Extracts individual paragraphs (separated by two newlines).

- - (String) wrap_and_indent(s, width, indentation, first_line_already_indented = false)

  Word-wraps and indents the string.

## Instance Method Details

### - (`String`) format_as_command(s, io)

Returns The string, formatted to be used as the name of a command in the help

Parameters:

- s (`String`) —

  The string to format

Returns:

- (`String`) —

  The string, formatted to be used as the name of a command in the help

    93
    94
    95
    96
    97
    98
    99

    # File 'lib/cri/string_formatter.rb', line 93

    def format_as_command(s, io)
      if Cri::Platform.color?(io)
        s.green
      else
        s
      end
    end

### - (`String`) format_as_option(s, io)

Returns The string, formatted to be used as an option definition of a command in the help

Parameters:

- s (`String`) —

  The string to format

Returns:

- (`String`) —

  The string, formatted to be used as an option definition of a command in the help

    105
    106
    107
    108
    109
    110
    111

    # File 'lib/cri/string_formatter.rb', line 105

    def format_as_option(s, io)
      if Cri::Platform.color?(io)
        s.yellow
      else
        s
      end
    end

### - (`String`) format_as_title(s, io)

Returns The string, formatted to be used as a title in a section in the help

Parameters:

- s (`String`) —

  The string to format

Returns:

- (`String`) —

  The string, formatted to be used as a title in a section in the help

    81
    82
    83
    84
    85
    86
    87

    # File 'lib/cri/string_formatter.rb', line 81

    def format_as_title(s, io)
      if Cri::Platform.color?(io)
        s.upcase.red.bold
      else
        s.upcase
      end
    end

### - (`Array<String>`) to_paragraphs(s)

Extracts individual paragraphs (separated by two newlines).

Parameters:

- s (`String`) —

  The string to format

Returns:

- (`Array<String>`) —

  A list of paragraphs in the string

    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    # File 'lib/cri/string_formatter.rb', line 12

    def to_paragraphs(s)
      lines = s.scan(/([^\n]+\n|[^\n]*$)/).map { |l| l[0].strip }

      paragraphs = [[]]
      lines.each do |line|
        if line.empty?
          paragraphs << []
        else
          paragraphs.last << line
        end
      end

      paragraphs.reject { |p| p.empty? }.map { |p| p.join(' ') }
    end

### - (`String`) wrap_and_indent(s, width, indentation, first_line_already_indented = false)

Word-wraps and indents the string.

Parameters:

- s (`String`) —

  The string to format

- width (`Number`) —

  The maximal width of each line. This also includes indentation, i.e. the actual maximal width of the text is `width`-`indentation`.

- indentation (`Number`) —

  The number of spaces to indent each line.

- first_line_already_indented (`Boolean`) (defaults to: `false`) —

  Whether or not the first line is already indented

Returns:

- (`String`) —

  The word-wrapped and indented string

    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75

    # File 'lib/cri/string_formatter.rb', line 41

    def wrap_and_indent(s, width, indentation, first_line_already_indented = false)
      indented_width = width - indentation
      indent = ' ' * indentation
      # Split into paragraphs
      paragraphs = to_paragraphs(s)

      # Wrap and indent each paragraph
      text = paragraphs.map do |paragraph|
        # Initialize
        lines = []
        line = ''

        # Split into words
        paragraph.split(/\s/).each do |word|
          # Begin new line if it's too long
          if (line + ' ' + word).length >= indented_width
            lines << line
            line = ''
          end

          # Add word to line
          line += (line == '' ? '' : ' ') + word
        end
        lines << line

        # Join lines
        lines.map { |l| indent + l }.join("\n")
      end.join("\n\n")

      if first_line_already_indented
        text[indentation..-1]
      else
        text
      end
    end