SpontaneousCMS/spontaneous

View on GitHub
lib/spontaneous/field/location.rb

Summary

Maintainability
A
35 mins
Test Coverage
# encoding: UTF-8

require 'open-uri'

module Spontaneous::Field
  class Location < String

    def outputs
      [:html, :lat, :lng]
    end

    def generate_outputs(input, site)
      values = {}
      values[:html] = escape_html(input)
      values.update(geolocate(input))
      values
    end

    def geolocate(address)
      return {} if address.blank?
      url = "http://maps.google.com/maps/api/geocode/json?address=#{URI.escape(address)}&sensor=false"

      response = open(url).read rescue "{}"
      data = Spontaneous.parse_json(response) rescue {}
      return {} unless data[:results]
      # bad/unknown addresses return `{:results=>[], :status=>"ZERO_RESULTS"}`
      values = {}
      result = data[:results].first
      return {} if result.nil?
      values[:formatted_address] = result[:formatted_address]
      geometry = result[:geometry]
      values[:lat] = geometry[:location][:lat]
      values[:lng] = geometry[:location][:lng]
      country = (result[:address_components].detect { |c| c[:types].first == "country" } || {})[:long_name]
      values[:country] = country
      values
    end

    def latitude
      value(:lat)
    end

    def longitude
      value(:lng)
    end

    def country
      value(:country)
    end

    def formatted_address
      value(:formatted_address)
    end

    alias_method :lat, :latitude
    alias_method :lng, :longitude

    self.register
  end # LongStringField
end