lib/tty/pager.rb
# frozen_string_literal: true
require_relative "pager/basic"
require_relative "pager/null"
require_relative "pager/system"
require_relative "pager/version"
module TTY
module Pager
Error = Class.new(StandardError)
# Raised when pager is closed
PagerClosed = Class.new(Error)
# Raised when user provides unnexpected argument
InvalidArgument = Class.new(Error)
module ClassMethods
# Create a pager
#
# @param [Boolean] :enabled
# disable/enable text paging
# @param [String] :command
# the paging command
# @param [IO] :input
# the object to send input to
# @param [IO] :output
# the object to send output to
# @param [Proc] :prompt
# a proc object that accepts page number
# @param [Integer] :width
# the terminal width
# @param [Integer] :height
# the terminal height
#
# @api public
def new(enabled: true, command: nil, **options)
select_pager(enabled: enabled, command: command).new(
enabled: enabled, command: command, **options)
end
# Paginate content through null, basic or system pager.
#
# @example
# TTY::Pager.page do |pager|
# pager.write "some text"
# end
#
# @param [String] :text
# an optional blob of content
# @param [String] :path
# a path to a file
# @param [Boolean] :enabled
# whether or not to use null pager
# @param [String] :command
# the paging command
# @param [IO] :input
# the object to send input to
# @param [IO] :output
# the object to send output to
#
# @api public
def page(text = nil, path: nil, enabled: true, command: nil,
**options, &block)
select_pager(enabled: enabled, command: command).
page(text, path: path, enabled: enabled, command: command,
**options, &block)
end
# Select an appriopriate pager
#
# If the user disabled paging then a NullPager is returned,
# otherwise a check is performed to find native system
# command to perform pagination with SystemPager. Finally,
# if no system command is found, a BasicPager is used which
# is a pure Ruby implementation known to work on any platform.
#
# @param [Boolean] enabled
# whether or not to allow paging
# @param [String] command
# the command to run if available
#
# @api private
def select_pager(enabled: true, command: nil)
commands = Array(command)
if !enabled
NullPager
elsif SystemPager.exec_available?(*commands)
SystemPager
else
BasicPager
end
end
end
extend ClassMethods
private_class_method :select_pager
end # Pager
end # TTY