# frozen_string_literal: true
#
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
#
# ronin-support is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ronin-support is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with ronin-support. If not, see .
#
require 'chars'
module Ronin
module Support
module Text
#
# Methods for generating random text.
#
# @api public
#
# @since 1.0.0
#
module Random
#
# Creates a new String by randomizing the case of each character in the
# string.
#
# @param [String] string
# The string to randomize the case of.
#
# @return [String]
# The new String with randomized case.
#
# @example
# Text::Random.swapcase("a")
# # => "A"
# Text::Random.swapcase("ab")
# # => "aB"
# Text::Random.swapcase("foo")
# # => "FoO"
# Text::Random.swapcase("The quick brown fox jumps over 13 lazy dogs.")
# # => "the quIcK broWn fox Jumps oveR 13 lazY Dogs."
#
def self.swapcase(string)
candidates = []
string.each_char.with_index do |char,index|
if char =~ /\p{L}/
candidates << index
end
end
new_string = string.dup
# ensure that at least one character is swap-cased, but not all
num_swaps = rand(1..(candidates.length - 1)) || 1
candidates.sample(num_swaps).each do |index|
new_string[index] = new_string[index].swapcase
end
return new_string
end
#
# Generates a random String of numeric characters.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random decimal-digit string.
#
# @see https://rubydoc.info/gems/chars/Chars#NUMERIC-constant
#
def self.numeric(n=1)
Chars::NUMERIC.random_string(n)
end
#
# Alias for {numeric}.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random decimal-digit string.
#
# @see random_numeric
#
def self.digits(n=1)
numeric(n)
end
#
# A random octal-digit string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random octal-digit string.
#
# @see https://rubydoc.info/gems/chars/Chars#OCTAL-constant
#
def self.octal(n=1)
Chars::OCTAL.random_string(n)
end
#
# The upper-case hexadecimal character set.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# The upper-case hexadecimal character set.
#
# @see https://rubydoc.info/gems/chars/Chars#UPPERCASE_HEXADECIMAL#constant
#
def self.uppercase_hex(n=1)
Chars::UPPERCASE_HEXADECIMAL.random_string(n)
end
#
# Alias for {uppercase_hex}.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# The upper-case hexadecimal character set.
#
# @see uppercase_hex
#
def self.upper_hex(n=1)
uppercase_hex(n)
end
#
# The lower-case hexadecimal character set.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# The lower-case hexadecimal character set.
#
# @see https://rubydoc.info/gems/chars/Chars#LOWERCASE_HEXADECIMAL-constant
#
def self.lowercase_hex(n=1)
Chars::LOWERCASE_HEXADECIMAL.random_string(n)
end
#
# Alias for {lowercase_hex}.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# The lower-case hexadecimal character set.
#
# @see lowercase_hex
#
def self.lower_hex(n=1)
lowercase_hex(n)
end
#
# A random hexadecimal string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random hexadecimal string.
#
# @see https://rubydoc.info/gems/chars/Chars#HEXADECIMAL-constant
#
def self.hex(n=1)
Chars::HEXADECIMAL.random_string(n)
end
#
# The upper-case alphabetic character set.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# The upper-case alphabetic character set.
#
# @see https://rubydoc.info/gems/chars/Chars#UPPERCASE_ALPHA-constant
#
def self.uppercase_alpha(n=1)
Chars::UPPERCASE_ALPHA.random_string(n)
end
#
# Alias for {uppercase_alpha}.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# The upper-case alphabetic character set.
#
# @see uppercase_alpha
#
def self.upper_alpha(n=1)
uppercase_alpha(n)
end
#
# The lower-case alphabetic character set.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# The lower-case alphabetic character set.
#
# @see https://rubydoc.info/gems/chars/Chars#LOWERCASE_ALPHA-constant
#
def self.lowercase_alpha(n=1)
Chars::LOWERCASE_ALPHA.random_string(n)
end
#
# Alias for {lowercase_alpha}.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# The lower-case alphabetic character set.
#
# @see lowercase_alpha
#
def self.lower_alpha(n=1)
lowercase_alpha(n)
end
#
# A random alphabetic string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random alphabetic string.
#
# @see https://rubydoc.info/gems/chars/Chars#ALPHA-constant
#
def self.alpha(n=1)
Chars::ALPHA.random_string(n)
end
#
# A random alpha-numeric string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random alpha-numeric string.
#
# @see https://rubydoc.info/gems/chars/Chars#ALPHA_NUMERIC-constant
#
def self.alpha_numeric(n=1)
Chars::ALPHA_NUMERIC.random_string(n)
end
#
# A random punctuation string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random punctuation string.
#
# @see https://rubydoc.info/gems/chars/Chars#PUNCTUATION-constant
#
def self.punctuation(n=1)
Chars::PUNCTUATION.random_string(n)
end
#
# A random symbolic string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random symbolic string.
#
# @see https://rubydoc.info/gems/chars/Chars#SYMBOLS-constant
#
def self.symbols(n=1)
Chars::SYMBOLS.random_string(n)
end
#
# A random whitespace string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random whitespace string.
#
# @see https://rubydoc.info/gems/chars/Chars#WHITESPACE-constant
#
def self.whitespace(n=1)
Chars::WHITESPACE.random_string(n)
end
#
# A random whitespace string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
#
# @see whitespace
#
def self.space(n=1)
whitespace(n)
end
#
# The set of printable characters, not including spaces.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random visible string.
#
# @see https://rubydoc.info/gems/chars/Chars#VISIBLE-constant
#
def self.visible(n=1)
Chars::VISIBLE.random_string(n)
end
#
# The set of printable characters, including spaces.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random printable string.
#
# @see https://rubydoc.info/gems/chars/Chars#PRINTABLE-constant
#
def self.printable(n=1)
Chars::PRINTABLE.random_string(n)
end
#
# A random control-character string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random control-character string.
#
# @see https://rubydoc.info/gems/chars/Chars#CONTROL-constant
#
def self.control(n=1)
Chars::CONTROL.random_string(n)
end
#
# The signed ASCII character set.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# The signed ASCII character set.
#
# @see https://rubydoc.info/gems/chars/Chars#SIGNED_ASCII-constant
#
def self.signed_ascii(n=1)
Chars::SIGNED_ASCII.random_string(n)
end
#
# A random ASCII string.
#
# @param [Integer, Range] n
# The desired length of the String.
#
# @return [String]
# A random ASCII string.
#
# @see https://rubydoc.info/gems/chars/Chars#ASCII-constant
#
def self.ascii(n=1)
Chars::ASCII.random_string(n)
end
end
end
end
end