charshift 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/charshift.rb +49 -0
- data/lib/charshifthelper.rb +93 -0
- metadata +56 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e93427a0056651708796614d95babdb69ed48cce
|
4
|
+
data.tar.gz: 7e68b07ef714040b7be31de6789dc2a32b6251a1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: eb90ecb90fdfedb901cda1fade292ea7970a8e173687fa2fbbd59291ee7ebf15360ca752369e88e2cbf7a96050b21304d3dd885a554a83545d0da6c9f7e1e998
|
7
|
+
data.tar.gz: ab7c345e18f1cbfd98a57d2e229ea1bf75caff4995b88cc895da0617d6aba5f184fa87ab41e3167d3ff1964740a5302ee1c932aed571cc17cc88c6ff27c79bf9
|
data/lib/charshift.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'charshifthelper'
|
2
|
+
|
3
|
+
class String
|
4
|
+
def charshift char_shift_val, custom_encoding = nil
|
5
|
+
begin
|
6
|
+
CharshiftHelper.confirm_fixnum(char_shift_val)
|
7
|
+
rescue TypeError => e
|
8
|
+
raise
|
9
|
+
else
|
10
|
+
output = ""
|
11
|
+
split_string = CharshiftHelper.encoding_ind_split(self)
|
12
|
+
if custom_encoding
|
13
|
+
if CharshiftHelper.check_for_valid_array_elements(custom_encoding) == false
|
14
|
+
raise ArgumentError, "Custom encoding must only contain single character string elements"
|
15
|
+
elsif CharshiftHelper.check_for_uniqueness(custom_encoding) == false
|
16
|
+
raise ArgumentError, "All elements in custom encoding must be unique"
|
17
|
+
else
|
18
|
+
split_string.each_with_index do |char, index|
|
19
|
+
encoding_length = custom_encoding.length
|
20
|
+
current_char_ord = custom_encoding.index(char)
|
21
|
+
if current_char_ord.nil?
|
22
|
+
raise RuntimeError, "Given custom encoding does not contain all characters in the target string"
|
23
|
+
end
|
24
|
+
shifted_position = CharshiftHelper.get_shift_position(current_char_ord, char_shift_val, encoding_length)
|
25
|
+
output << custom_encoding[shifted_position]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
else
|
29
|
+
split_string.each do |char|
|
30
|
+
char_encoding_type = CharshiftHelper.get_encoding(char)
|
31
|
+
encoding_length = CharshiftHelper.get_encoding_length(char_encoding_type) - 1
|
32
|
+
current_char_ord = CharshiftHelper.get_ord_by_char(char)
|
33
|
+
shifted_position = CharshiftHelper.get_shift_position(current_char_ord, char_shift_val, encoding_length)
|
34
|
+
output << CharshiftHelper.get_char_by_ord(shifted_position, char_encoding_type)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
return output
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def charshift! char_shift_val, custom_encoding = nil
|
42
|
+
updated_string = charshift char_shift_val, custom_encoding = nil
|
43
|
+
return self.replace(updated_string)
|
44
|
+
end
|
45
|
+
|
46
|
+
def getEncodingLength
|
47
|
+
return CharshiftHelper.get_encoding_length(self.encoding)
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module CharshiftHelper
|
2
|
+
|
3
|
+
def self.confirm_fixnum input_val
|
4
|
+
if !input_val.instance_of? Fixnum
|
5
|
+
raise TypeError, 'Input value must be of type fixnum'
|
6
|
+
else
|
7
|
+
return true
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.encoding_ind_split input_string
|
12
|
+
split_string = []
|
13
|
+
|
14
|
+
input_string.each_char do |chr|
|
15
|
+
split_string << chr
|
16
|
+
end
|
17
|
+
return split_string
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.get_shift_distance_minus_loops input_val, collection_length
|
21
|
+
absloute_input_val = input_val.abs
|
22
|
+
remaining_difference = absloute_input_val % collection_length
|
23
|
+
if absloute_input_val > collection_length
|
24
|
+
return input_val > 0 ? remaining_difference : 0 - remaining_difference
|
25
|
+
else
|
26
|
+
return input_val
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.get_shift_position starting_pos, shift_val, encoding_length
|
31
|
+
collection_length = encoding_length
|
32
|
+
shift_difference = self.get_shift_distance_minus_loops(shift_val, collection_length)
|
33
|
+
start_plus_shift = starting_pos + shift_difference
|
34
|
+
if shift_difference + starting_pos == encoding_length
|
35
|
+
return 0
|
36
|
+
elsif start_plus_shift > collection_length
|
37
|
+
return 0 + start_plus_shift - collection_length
|
38
|
+
elsif start_plus_shift < 0
|
39
|
+
return collection_length + start_plus_shift
|
40
|
+
else
|
41
|
+
return start_plus_shift
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.get_char_by_ord ordinal_value, char_encoding_type
|
46
|
+
return ordinal_value.chr(char_encoding_type)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.get_ord_by_char character
|
50
|
+
return character.ord
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.get_encoding string
|
54
|
+
return string.encoding.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.get_encoding_length encoding
|
58
|
+
max = 100000000000
|
59
|
+
min = 0
|
60
|
+
guess = 50000000000
|
61
|
+
|
62
|
+
while true
|
63
|
+
begin guess.chr(encoding)
|
64
|
+
if (min > max)
|
65
|
+
return max + 1
|
66
|
+
else
|
67
|
+
min = guess + 1
|
68
|
+
guess = (max + min) / 2
|
69
|
+
end
|
70
|
+
rescue
|
71
|
+
if min > max
|
72
|
+
return max + 1
|
73
|
+
else
|
74
|
+
max = guess - 1
|
75
|
+
guess = (max + min) / 2
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.check_for_valid_array_elements string_array
|
82
|
+
string_array.each do |chr|
|
83
|
+
if !chr.is_a?(String) || chr.length != 1
|
84
|
+
return false
|
85
|
+
end
|
86
|
+
end
|
87
|
+
return true
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.check_for_uniqueness string_array
|
91
|
+
return string_array.uniq.length == string_array.length
|
92
|
+
end
|
93
|
+
end
|
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: charshift
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jonathon Nordquist
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-10 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: " Charshift is a simple gem which adds functionality
|
14
|
+
to the\n String class. It's primary function is to act on a given\n
|
15
|
+
\ string, taking a fixnum parameter, then shifting each \n character
|
16
|
+
in that string to a higher or lower ordinal \n position in that
|
17
|
+
strings encoding.\n\n Charshift works with all of Ruby's included
|
18
|
+
encodings and \n also works with devloper supplied 'custom encodings.'
|
19
|
+
\ \n Simply provide an ordered set of characters as an optional\n
|
20
|
+
\ parameter and charshift will work on the string using that\n set
|
21
|
+
instead of the strings native encoding.\n\n Charshift also includes
|
22
|
+
a '.getEncodingLength' method which\n returns the number of of
|
23
|
+
characters which a given strings \n encoding contains. Finally,
|
24
|
+
strings can be shifted in place\n using the '.charshift!' method.\n\n"
|
25
|
+
email: https://github.com/cugamer/charshift
|
26
|
+
executables: []
|
27
|
+
extensions: []
|
28
|
+
extra_rdoc_files: []
|
29
|
+
files:
|
30
|
+
- lib/charshift.rb
|
31
|
+
- lib/charshifthelper.rb
|
32
|
+
homepage: http://www.jonathonnordquist.com
|
33
|
+
licenses:
|
34
|
+
- MIT
|
35
|
+
metadata: {}
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options: []
|
38
|
+
require_paths:
|
39
|
+
- lib
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
requirements: []
|
51
|
+
rubyforge_project:
|
52
|
+
rubygems_version: 2.4.6
|
53
|
+
signing_key:
|
54
|
+
specification_version: 4
|
55
|
+
summary: Facilitate character change by ordinal position
|
56
|
+
test_files: []
|