X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/5cbd4038edb32b0304bd766e70fc680ea447b52b..a6dd1ec4b8abeaa6e577633ba2fb05f84683d78e:/lib/potlatch.rb diff --git a/lib/potlatch.rb b/lib/potlatch.rb index 879972e03..605d69db3 100644 --- a/lib/potlatch.rb +++ b/lib/potlatch.rb @@ -1,4 +1,4 @@ -require 'stringio' +require "stringio" # The Potlatch module provides helper functions for potlatch and its communication with the server module Potlatch @@ -24,47 +24,45 @@ module Potlatch # Return eight-byte double-precision float def self.getdouble(s) - a = s.read(8).unpack('G') # G big-endian, E little-endian + a = s.read(8).unpack("G") # G big-endian, E little-endian a[0] end # Return numeric array def self.getarray(s) - getlong(s).times.collect do - getvalue(s) - end + Array.new(getlong(s)) { getvalue(s) } end # Return object/hash def self.getobject(s) arr = {} while (key = getstring(s)) - break if key == '' + break if key == "" + arr[key] = getvalue(s) end - s.getbyte # skip the 9 'end of object' value + s.getbyte # skip the 9 'end of object' value arr end # Parse and get value def self.getvalue(s) case s.getbyte - when 0 then return getdouble(s) # number - when 1 then return s.getbyte # boolean - when 2 then return getstring(s) # string - when 3 then return getobject(s) # object/hash - when 5 then return nil # null - when 6 then return nil # undefined - when 8 then s.read(4) # mixedArray - return getobject(s) # | - when 10 then return getarray(s) # array - else return nil # error + when 0 then getdouble(s) # number + when 1 then s.getbyte # boolean + when 2 then getstring(s) # string + when 3 then getobject(s) # object/hash + when 5 then nil # null + when 6 then nil # undefined + when 8 then s.read(4) # mixedArray + getobject(s) # | + when 10 then getarray(s) # array end end # Envelope data into AMF writeable form def self.putdata(index, n) - d = encodestring(index + "/onResult") + d = encodestring("#{index}/onResult") d += encodestring("null") d += [-1].pack("N") d += encodevalue(n) @@ -73,31 +71,31 @@ module Potlatch # Pack variables as AMF def self.encodevalue(n) - case n.class.to_s - when 'Array' + case n + when Array a = 10.chr + encodelong(n.length) n.each do |b| a += encodevalue(b) end a - when 'Hash' + when Hash a = 3.chr n.each do |k, v| a += encodestring(k.to_s) + encodevalue(v) end a + 0.chr + 0.chr + 9.chr - when 'String' + when String 2.chr + encodestring(n) - when 'Bignum', 'Fixnum', 'Float' + when Numeric, GeoRecord::Coord 0.chr + encodedouble(n) - when 'NilClass' + when NilClass 5.chr - when 'TrueClass' + when TrueClass 0.chr + encodedouble(1) - when 'FalseClass' + when FalseClass 0.chr + encodedouble(0) else - Rails.logger.error("Unexpected Ruby type for AMF conversion: " + n.class.to_s) + raise "Unexpected Ruby type for AMF conversion: #{n.class.name}" end end @@ -110,19 +108,19 @@ module Potlatch # Encode number as eight-byte double precision float def self.encodedouble(n) - [n].pack('G') + [n.to_f].pack("G") end # Encode number as four-byte long def self.encodelong(n) - [n].pack('N') + [n].pack("N") end end # The Dispatcher class handles decoding a series of RPC calls # from the request, dispatching them, and encoding the response class Dispatcher - def initialize(request, &_block) + def initialize(request, &block) # Get stream for request data @request = StringIO.new(request + 0.chr) @@ -137,7 +135,7 @@ module Potlatch end # Capture the dispatch routine - @dispatch = Proc.new + @dispatch = block end def each(&_block) @@ -146,7 +144,7 @@ module Potlatch # Output response header a, b = bodies.divmod(256) - yield 0.chr + 0.chr + 0.chr + 0.chr + a.chr + b.chr + yield 0.chr * 4 + a.chr + b.chr # Process the bodies bodies.times do # Read each body @@ -165,36 +163,36 @@ module Potlatch # The Potlatch class is a helper for Potlatch class Potlatch # ----- getpresets - # in: none - # does: reads tag preset menus, colours, and autocomplete config files - # out: [0] presets, [1] presetmenus, [2] presetnames, - # [3] colours, [4] casing, [5] areas, [6] autotags - # (all hashes) + # in: none + # does: reads tag preset menus, colours, and autocomplete config files + # out: [0] presets, [1] presetmenus, [2] presetnames, + # [3] colours, [4] casing, [5] areas, [6] autotags + # (all hashes) def self.get_presets Rails.logger.info(" Message: getpresets") # Read preset menus presets = {} - presetmenus = { 'point' => [], 'way' => [], 'POI' => [] } - presetnames = { 'point' => {}, 'way' => {}, 'POI' => {} } - presettype = '' - presetcategory = '' - # StringIO.open(txt) do |file| - File.open("#{Rails.root}/config/potlatch/presets.txt") do |file| - file.each_line do|line| - t = line.chomp - if t =~ /(\w+)\/(\w+)/ - presettype = $1 - presetcategory = $2 + presetmenus = { "point" => [], "way" => [], "POI" => [] } + presetnames = { "point" => {}, "way" => {}, "POI" => {} } + presettype = "" + presetcategory = "" + # StringIO.open(txt) do |file| + File.open(Rails.root.join("config/potlatch/presets.txt")) do |file| + file.each_line do |line| + case line.chomp + when %r{(\w+)/(\w+)} + presettype = Regexp.last_match(1) + presetcategory = Regexp.last_match(2) presetmenus[presettype].push(presetcategory) presetnames[presettype][presetcategory] = ["(no preset)"] - elsif t =~ /^([\w\s]+):\s?(.+)$/ - pre = $1 - kv = $2 + when /^([\w\s]+):\s?(.+)$/ + pre = Regexp.last_match(1) + kv = Regexp.last_match(2) presetnames[presettype][presetcategory].push(pre) presets[pre] = {} - kv.split(',').each do|a| - presets[pre][$1] = $2 if a =~ /^(.+)=(.*)$/ + kv.split(",").each do |a| + presets[pre][Regexp.last_match(1)] = Regexp.last_match(2) if a =~ /^(.+)=(.*)$/ end end end @@ -204,14 +202,14 @@ module Potlatch colours = {} casing = {} areas = {} - File.open("#{Rails.root}/config/potlatch/colours.txt") do |file| + File.open(Rails.root.join("config/potlatch/colours.txt")) do |file| file.each_line do |line| next unless line.chomp =~ /(\w+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)/ - tag = $1 - colours[tag] = $2.hex if $2 != '-' - casing[tag] = $3.hex if $3 != '-' - areas[tag] = $4.hex if $4 != '-' + tag = Regexp.last_match(1) + colours[tag] = Regexp.last_match(2).hex if Regexp.last_match(2) != "-" + casing[tag] = Regexp.last_match(3).hex if Regexp.last_match(3) != "-" + areas[tag] = Regexp.last_match(4).hex if Regexp.last_match(4) != "-" end end @@ -219,21 +217,21 @@ module Potlatch relcolours = {} relalphas = {} relwidths = {} - File.open("#{Rails.root}/config/potlatch/relation_colours.txt") do |file| + File.open(Rails.root.join("config/potlatch/relation_colours.txt")) do |file| file.each_line do |line| next unless line.chomp =~ /(\w+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)/ - tag = $1 - relcolours[tag] = $2.hex if $2 != '-' - relalphas[tag] = $3.to_i if $3 != '-' - relwidths[tag] = $4.to_i if $4 != '-' + tag = Regexp.last_match(1) + relcolours[tag] = Regexp.last_match(2).hex if Regexp.last_match(2) != "-" + relalphas[tag] = Regexp.last_match(3).to_i if Regexp.last_match(3) != "-" + relwidths[tag] = Regexp.last_match(4).to_i if Regexp.last_match(4) != "-" end end # Read POI presets icon_list = [] icon_tags = {} - File.open("#{Rails.root}/config/potlatch/icon_presets.txt") do |file| + File.open(Rails.root.join("config/potlatch/icon_presets.txt")) do |file| file.each_line do |line| (icon, tags) = line.chomp.split("\t") icon_list.push(icon) @@ -243,19 +241,19 @@ module Potlatch icon_list.reverse! # Read auto-complete - autotags = { 'point' => {}, 'way' => {}, 'POI' => {} } - File.open("#{Rails.root}/config/potlatch/autocomplete.txt") do |file| - file.each_line do|line| - next unless line.chomp =~ /^([\w:]+)\/(\w+)\s+(.+)$/ - - tag = $1 - type = $2 - values = $3 - if values == '-' - autotags[type][tag] = [] - else - autotags[type][tag] = values.split(',').sort.reverse - end + autotags = { "point" => {}, "way" => {}, "POI" => {} } + File.open(Rails.root.join("config/potlatch/autocomplete.txt")) do |file| + file.each_line do |line| + next unless line.chomp =~ %r{^([\w:]+)/(\w+)\s+(.+)$} + + tag = Regexp.last_match(1) + type = Regexp.last_match(2) + values = Regexp.last_match(3) + autotags[type][tag] = if values == "-" + [] + else + values.split(",").sort.reverse + end end end