# Each character encodes 3 bits of x and 3 of y, so there are extra characters
# tacked on the end to make the zoom levels "work".
module ShortLink
-
# array of 64 chars to encode 6 bits. this is almost like base64 encoding, but
# the symbolic chars are different, as base64's + and / aren't very
# URL-friendly.
- ARRAY = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + ['_','~']
+ ARRAY = ("A".."Z").to_a + ("a".."z").to_a + ("0".."9").to_a + ["_", "~"]
##
# Given a string encoding a location, returns the [lon, lat, z] tuple of that
# keep support for old shortlinks which use the @ character, now
# replaced by the ~ character because twitter is horribly broken
# and we can't have that.
- str.gsub!("@","~")
+ str.tr!("@", "~")
str.each_char do |c|
t = ARRAY.index c
z_offset -= 1
else
3.times do
- x <<= 1; x = x | 1 unless (t & 32).zero?; t <<= 1
- y <<= 1; y = y | 1 unless (t & 32).zero?; t <<= 1
+ x <<= 1
+ x |= 1 unless (t & 32).zero?
+ t <<= 1
+
+ y <<= 1
+ y |= 1 unless (t & 32).zero?
+ t <<= 1
end
z += 3
end
# given a location and zoom, return a short string representing it.
def self.encode(lon, lat, z)
code = interleave_bits(((lon + 180.0) * 2**32 / 360.0).to_i,
- ((lat + 90.0) * 2**32 / 180.0).to_i)
+ ((lat + 90.0) * 2**32 / 180.0).to_i)
str = ""
# add eight to the zoom level, which approximates an accuracy of
# one pixel in a tile.
- ((z + 8)/3.0).ceil.times do |i|
+ ((z + 8) / 3.0).ceil.times do |i|
digit = (code >> (58 - 6 * i)) & 0x3f
str << ARRAY[digit]
end
# of 3 zoom levels).
((z + 8) % 3).times { str << "-" }
- return str
+ str
end
private
end
c
end
-
end