class WriteSeoSnippet # Writes a json script for structured data (https://developers.google.com/structured-data/) # => The script can have three parts: logo, corporate contacts and social profiles # => The finished script unites all this parts in one script, where @type, @context and url are mandatory # => In the end (with all parts included) it looks like this: # <script type="application/ld+json"> # { # "@context": "http://schema.org", # "@type": "Organization", # "url": "http://www.example.com", # "logo": "http://www.example.com/images/logo.png", # "contactPoint" : [{ # "@type" : "ContactPoint", # "telephone" : "+1-401-555-1212", # "contactType" : "customer service" # }], # "sameAs" : [ # "http://www.facebook.com/your-profile", # "http://www.twitter.com/yourProfile", # "http://plus.google.com/your_profile" # ] # } # </script> # Important: # => Redundant commas crashes json script # => Corporate contacts must have url or telephone to be valid class << self def write_snippet(params) handle_params(params) end def handle_params(params) time = Time.new.strftime("%m-%d-%Y_%H%M%S") params[:snippet] = {} params[:snippet][:label] = "#{params[:seo_snippet][:label]}_#{time}" params[:snippet][:identifier] = "#{params[:seo_snippet][:label]}_#{time}" params[:snippet][:content] = seo_scripter(params).to_s params end def seo_scripter(params) mandatory_and_logo, contacts, profile = fill_content(params) seo_script = '' seo_script << '<script type="application/ld+json">' seo_script << '{' mandatory_and_logo.each do |k,v| unless v.blank? if k == 'context' || k == 'type' seo_script << '"@'+k+'" : "'+v+'"' else seo_script << '"'+k+'" : "'+v+'"' end seo_script << ',' end end seo_script << '"contactPoint" : [{' contacts.each do |contact_number, contact_content| puts 'contact:' puts contact_content seo_script << '"@type" : "ContactPoint"' contact_content.each do |k,v| #v counter to check if all v blank, to delete seo_script << '"@type" : "ContactPoint",' if v.class == Array unless v.join.blank? seo_script << ',' new_v = delete_select_attributes_empty_quotes(v) (seo_script << '"'+k+'" : ['+new_v+']') unless new_v.blank? end else unless v.blank? seo_script << ',' v.gsub!(/_/, ' ') seo_script << '"'+k+'" : "'+v+'"' end end end seo_script << '},{' end seo_script << '}]' seo_script.gsub!(/,\{\}/, '') seo_script << ',"sameAs" : [' profile.each do |url| unless url.blank? seo_script << '"'+url+'"' seo_script << ',' end end seo_script.chop! seo_script << ']' seo_script << '}' seo_script << '</script>' new_seo_script = delete_script_errors(seo_script) new_seo_script end def fill_content(params) mandatory_and_logo = {} mandatory_and_logo['context'] = params[:seo_snippet][:context] mandatory_and_logo['type'] = params[:seo_snippet][:type] mandatory_and_logo['url'] = params[:seo_snippet][:url] mandatory_and_logo['logo'] = params[:seo_snippet][:logo] contacts = {} params[:seo_snippet][:corporate_contacts_attributes].each do |contact_id, contact_values| contacts[contact_id] = {} contacts[contact_id]['contactType'] = contact_values[:contact_type] contacts[contact_id]['telephone'] = contact_values[:telephone] contacts[contact_id]['url'] = contact_values[:contact_url] contacts[contact_id]['areaServed'] = contact_values[:area_served] contacts[contact_id]['availableLanguage'] = contact_values[:available_language] end profile = [] profile << params[:seo_snippet][:facebook_url] profile << params[:seo_snippet][:twitter_url] profile << params[:seo_snippet][:google_plus_url] profile << params[:seo_snippet][:instagram_url] profile << params[:seo_snippet][:pinterest_url] profile << params[:seo_snippet][:linkedin_url] profile << params[:seo_snippet][:youtube_url] return mandatory_and_logo, contacts, profile end def delete_select_attributes_empty_quotes(v) v.join('","') num = v.index("") v.slice!(num) unless num.nil? v.to_s end def delete_script_errors(seo_script) seo_script.sub!(/,"sameAs" : \]/, '') seo_script.sub!(/,"contactPoint" : \[\{"@type" : "ContactPoint"\}\]/, '') seo_script.sub!(/,\{"@type" : "ContactPoint"\}/, '') seo_script end end end