Sha256: 4f88c9e2d09f82214b199c2ae52d2c9126cac905ac3a8516ae4423d36bb4cfe0

Contents?: true

Size: 1.48 KB

Versions: 2

Compression:

Stored size: 1.48 KB

Contents

module Vedeu
  class Wordwrap
    class << self
      def this(value, options = {})
        new(value, options).reformat
      end
    end

    def initialize(value, options = {})
      @value   = value
      @options = options || {}
    end

    def reformat
      return pruned if prune?
      wordwrapped
    end

    def wordwrapped
      processed = []
      value.split(/\n/).map do |unprocessed|
        line_length = 0
        reformatted = []

        unprocessed.split(/\s/).map do |word|
          word_length = word.length + 1

          if (line_length += word_length) >= maximum_width
            line_length = word_length
            processed   << reformatted
            reformatted = []
          end

          reformatted << word
        end

        processed << reformatted
      end

      output(processed)
    end

    private

    attr_reader :value, :options

    def output(paragraph)
      paragraph.reduce([]) do |output, line|
        output << line.join(' ')
      end.join("\n")
    end

    def pruned
      if value.size <= pruned_width
        value
      else
        [
          value.chomp.slice(0..pruned_width),
          '...'
        ].join
      end
    end

    def pruned_width
      maximum_width - 3
    end

    def prune?
      options.fetch(:prune)
    end

    def maximum_width
      options.fetch(:width)
    end

    def options
      defaults.merge!(@options)
    end

    def defaults
      {
        width: 70,
        prune: false
      }
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
vedeu-0.0.25 lib/vedeu/output/wordwrap.rb
vedeu-0.0.24 lib/vedeu/output/wordwrap.rb