Диана обнови решението на 25.11.2014 01:36 (преди около 10 години)
+module UI
+ class TextScreen
+ attr_accessor :line
+
+ def label(text: ,border: nil, style: nil)
+ style = @case if style == nil
+ @line = [] if @line == nil
+ case style
+ when :upcase then text.upcase!
+ when :downcase then text.downcase!
+ end
+ @line << border.to_s + text + border.to_s
+ end
+
+ def vertical(border: nil, style: nil, &block)
+ @line = [] if @line == nil
+ old_line = @line.dup
+ layout(style, &block)
+ length = @line.max_by(&:length).length
+ @line = @line.map { |word| vertical_border(word, border, length) }
+ @line = old_line + [@line.join("\n")]
+ end
+
+ def horizontal(border: nil, style: nil, &block)
+ @line = [] if @line == nil
+ old_line = @line.dup
+ layout(style, &block)
+ @line.map {|word| border.to_s + word + border.to_s}
+ @line = old_line + [@line.join('')]
+ end
+
+ def layout(style, &block)
+ old_case = @case
+ @case = style
+ @line = []
+ @case = style unless style == nil
+ self.instance_eval(&block) if block_given?
+ @case = old_case
+ end
+
+ def vertical_border(word, border, length)
+ unless (word == "\n" or word == "")
+ border.to_s + word.ljust(length, ' ') + border.to_s
+ else
+ word
+ end
+ end
+
+ def self.draw(&block)
+ screen = self.new
+ screen.instance_eval(&block) if block_given?
+ screen.line.join('')
+ end
+ end
+end
Прегледай примерите, които сме дискутирали в темата във форума.
Винаги ще подаваме блок на TextScreen.draw
, horizontal
и vertical
. Няма нужда да се грижиш за друго поведение.
На 5-ти ред интервалът трябва да е след запетаята, а не преди.
Малко по-добро име за @line
? :)