blob: 9da8735356834301b652db1eed79c93c609a4a82 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
# coding: utf-8
class HighLine
# Take the task of paginating some piece of text given a HighLine context
class Paginator
# @return [HighLine] HighLine context
attr_reader :highline
# Returns a HighLine::Paginator instance where you can
# call {#page_print} on it.
# @param highline [HighLine] context
# @example
# HighLine::Paginator.new(highline).page_print(statement)
def initialize(highline)
@highline = highline
end
#
# Page print a series of at most _page_at_ lines for _output_. After each
# page is printed, HighLine will pause until the user presses enter/return
# then display the next page of data.
#
# Note that the final page of _output_ is *not* printed, but returned
# instead. This is to support any special handling for the final sequence.
#
# @param text [String] text to be paginated
# @return [String] last line if paging is aborted
def page_print(text)
return text unless highline.page_at
lines = text.lines.to_a
while lines.size > highline.page_at
highline.puts lines.slice!(0...highline.page_at).join
highline.puts
# Return last line if user wants to abort paging
return "...\n#{lines.last}" unless continue_paging?
end
lines.join
end
#
# Ask user if they wish to continue paging output. Allows them to
# type "q" to cancel the paging process.
#
def continue_paging?
command = highline.new_scope.ask(
"-- press enter/return to continue or q to stop -- "
) { |q| q.character = true }
command !~ /\A[qQ]\Z/ # Only continue paging if Q was not hit.
end
end
end
|