Commit b859be43cd01bc74bf12576e0c6d56059527a6be

Authored by Braulio Bhavamitra
1 parent 608ddc9d

metadata: customize og_type via param and use controllers class

plugins/metadata/config.yml.dist
1 open_graph: 1 open_graph:
2 domain: domainregisteredonfacebook.com 2 domain: domainregisteredonfacebook.com
3 environment_logo: 'http://example.com/designs/themes/environmenttheme/images/logo.png' 3 environment_logo: 'http://example.com/designs/themes/environmenttheme/images/logo.png'
  4 + namespace: app_scope
4 types: 5 types:
5 article: article 6 article: article
6 product: facebook_app:sse_product 7 product: facebook_app:sse_product
plugins/metadata/lib/ext/article.rb
@@ -3,8 +3,13 @@ require_dependency 'article' @@ -3,8 +3,13 @@ require_dependency 'article'
3 class Article 3 class Article
4 4
5 metadata_spec namespace: :og, key_attr: :property, tags: { 5 metadata_spec namespace: :og, key_attr: :property, tags: {
6 - type: MetadataPlugin.og_types[:article] || :article,  
7 - url: proc{ |a, plugin| plugin.og_url_for a.url }, 6 + type: proc do |a, plugin|
  7 + plugin.context.params[:og_type] || MetadataPlugin.og_types[:article] || :article
  8 + end,
  9 + url: proc do |a, plugin|
  10 + url = a.url.merge! profile: a.profile.identifier, og_type: plugin.context.params[:og_type]
  11 + plugin.og_url_for url
  12 + end,
8 title: proc{ |a, plugin| "#{a.title} - #{a.profile.name}" }, 13 title: proc{ |a, plugin| "#{a.title} - #{a.profile.name}" },
9 image: proc do |a, plugin| 14 image: proc do |a, plugin|
10 result = a.body_images_paths 15 result = a.body_images_paths
plugins/metadata/lib/ext/community.rb
@@ -4,7 +4,7 @@ require_dependency "#{File.dirname __FILE__}/profile" @@ -4,7 +4,7 @@ require_dependency "#{File.dirname __FILE__}/profile"
4 class Community 4 class Community
5 5
6 metadata_spec namespace: :og, tags: { 6 metadata_spec namespace: :og, tags: {
7 - type: MetadataPlugin.og_types[:community] || :community, 7 + type: proc{ |c, plugin| plugin.context.params[:og_type] || MetadataPlugin.og_types[:community] || :community },
8 } 8 }
9 9
10 end 10 end
plugins/metadata/lib/ext/enterprise.rb
@@ -4,7 +4,7 @@ require_dependency "#{File.dirname __FILE__}/profile" @@ -4,7 +4,7 @@ require_dependency "#{File.dirname __FILE__}/profile"
4 class Enterprise 4 class Enterprise
5 5
6 metadata_spec namespace: :og, tags: { 6 metadata_spec namespace: :og, tags: {
7 - type: MetadataPlugin.og_types[:enterprise] || :enterprise, 7 + type: proc{ |e, plugin| plugin.context.params[:og_type] || MetadataPlugin.og_types[:enterprise] || :enterprise },
8 } 8 }
9 9
10 metadata_spec namespace: 'business:contact_data', tags: { 10 metadata_spec namespace: 'business:contact_data', tags: {
plugins/metadata/lib/ext/environment.rb
@@ -7,7 +7,7 @@ class Environment @@ -7,7 +7,7 @@ class Environment
7 } 7 }
8 8
9 metadata_spec namespace: :og, tags: { 9 metadata_spec namespace: :og, tags: {
10 - type: 'website', 10 + type: proc{ |e, plugin| plugin.context.params[:og_type] || 'website' },
11 title: proc{ |e, plugin| e.name }, 11 title: proc{ |e, plugin| e.name },
12 site_name: proc{ |e, plugin| e.name }, 12 site_name: proc{ |e, plugin| e.name },
13 description: proc{ |e, plugin| e.name }, 13 description: proc{ |e, plugin| e.name },
plugins/metadata/lib/ext/person.rb
@@ -4,7 +4,7 @@ require_dependency "#{File.dirname __FILE__}/profile" @@ -4,7 +4,7 @@ require_dependency "#{File.dirname __FILE__}/profile"
4 class Person 4 class Person
5 5
6 metadata_spec namespace: :og, tags: { 6 metadata_spec namespace: :og, tags: {
7 - type: MetadataPlugin.og_types[:person] || :person, 7 + type: proc{ |p, plugin| plugin.context.params[:og_type] || MetadataPlugin.og_types[:person] || :person },
8 } 8 }
9 9
10 end 10 end
plugins/metadata/lib/ext/product.rb
@@ -3,8 +3,12 @@ require_dependency 'product' @@ -3,8 +3,12 @@ require_dependency 'product'
3 class Product 3 class Product
4 4
5 metadata_spec namespace: :og, tags: { 5 metadata_spec namespace: :og, tags: {
6 - type: MetadataPlugin.og_types[:product] || :product, 6 + type: proc{ |p, plugin| plugin.context.params[:og_type] || MetadataPlugin.og_types[:product] || :product },
7 url: proc{ |p, plugin| plugin.og_url_for p.url }, 7 url: proc{ |p, plugin| plugin.og_url_for p.url },
  8 + url: proc do |p, plugin|
  9 + url = p.url.merge! profile: p.profile.identifier, og_type: plugin.context.params[:og_type]
  10 + plugin.og_url_for url
  11 + end,
8 gr_hascurrencyvalue: proc{ |p, plugin| p.price.to_f }, 12 gr_hascurrencyvalue: proc{ |p, plugin| p.price.to_f },
9 gr_hascurrency: proc{ |p, plugin| p.environment.currency_unit }, 13 gr_hascurrency: proc{ |p, plugin| p.environment.currency_unit },
10 title: proc{ |p, plugin| "#{p.name} - #{p.profile.name}" if p }, 14 title: proc{ |p, plugin| "#{p.name} - #{p.profile.name}" if p },
plugins/metadata/lib/ext/profile.rb
@@ -3,7 +3,7 @@ require_dependency 'profile' @@ -3,7 +3,7 @@ require_dependency 'profile'
3 class Profile 3 class Profile
4 4
5 metadata_spec namespace: :og, tags: { 5 metadata_spec namespace: :og, tags: {
6 - type: MetadataPlugin.og_types[:profile] || :profile, 6 + type: proc{ |p, plugin| plugin.context.params[:og_type] || MetadataPlugin.og_types[:profile] || :profile },
7 image: proc{ |p, plugin| "#{p.environment.top_url}#{p.image.public_filename}" if p.image }, 7 image: proc{ |p, plugin| "#{p.environment.top_url}#{p.image.public_filename}" if p.image },
8 title: proc{ |p, plugin| if p.nickname.present? then p.nickname else p.name end }, 8 title: proc{ |p, plugin| if p.nickname.present? then p.nickname else p.name end },
9 url: proc do |p, plugin| 9 url: proc do |p, plugin|
plugins/metadata/lib/ext/uploaded_file.rb
@@ -6,9 +6,12 @@ class UploadedFile @@ -6,9 +6,12 @@ class UploadedFile
6 metadata_spec namespace: :og, tags: { 6 metadata_spec namespace: :og, tags: {
7 type: proc do |u, plugin| 7 type: proc do |u, plugin|
8 type = if u.image? then :image else :uploaded_file end 8 type = if u.image? then :image else :uploaded_file end
9 - MetadataPlugin.og_types[type] || type 9 + plugin.context.params[:og_type] || MetadataPlugin.og_types[type] || type
  10 + end,
  11 + url: proc do |u, plugin|
  12 + url = u.url.merge! profile: u.profile.identifier, view: true, og_type: plugin.context.params[:og_type]
  13 + plugin.og_url_for url
10 end, 14 end,
11 - url: proc{ |u, plugin| plugin.og_url_for u.url.merge(view: true) },  
12 title: proc{ |u, plugin| u.title }, 15 title: proc{ |u, plugin| u.title },
13 image: proc{ |u, plugin| "#{u.environment.top_url}#{u.public_filename}" if u.image? }, 16 image: proc{ |u, plugin| "#{u.environment.top_url}#{u.public_filename}" if u.image? },
14 description: proc{ |u, plugin| u.abstract || u.title }, 17 description: proc{ |u, plugin| u.abstract || u.title },
plugins/metadata/lib/metadata_plugin.rb
1 1
2 -class MetadataPlugin < Noosfero::Plugin 2 +module MetadataPlugin
  3 +
  4 + extend Noosfero::Plugin::ParentMethods
3 5
4 def self.plugin_name 6 def self.plugin_name
5 _('Export metadata') 7 _('Export metadata')
@@ -13,89 +15,14 @@ class MetadataPlugin &lt; Noosfero::Plugin @@ -13,89 +15,14 @@ class MetadataPlugin &lt; Noosfero::Plugin
13 @config ||= HashWithIndifferentAccess.new(YAML.load File.read("#{File.dirname __FILE__}/../config.yml")) rescue {} 15 @config ||= HashWithIndifferentAccess.new(YAML.load File.read("#{File.dirname __FILE__}/../config.yml")) rescue {}
14 end 16 end
15 17
16 - def self.og_types  
17 - @og_types ||= self.config[:open_graph][:types] rescue {}  
18 - end  
19 -  
20 - CONTROLLERS = {  
21 - manage_products: {  
22 - variable: :@product,  
23 - },  
24 - content_viewer: {  
25 - variable: proc do  
26 - if profile and @page and profile.home_page_id == @page.id  
27 - @profile  
28 - elsif @page.respond_to? :encapsulated_file  
29 - @page.encapsulated_file  
30 - else  
31 - @page  
32 - end  
33 - end,  
34 - },  
35 - profile: {  
36 - variable: :@profile,  
37 - },  
38 - # fallback  
39 - environment: {  
40 - variable: :@environment,  
41 - },  
42 - }  
43 -  
44 - def head_ending  
45 - plugin = self  
46 - lambda do  
47 - options = MetadataPlugin::CONTROLLERS[controller.controller_path.to_sym]  
48 - options ||= MetadataPlugin::CONTROLLERS[:profile] if controller.is_a? ProfileController  
49 - options ||= MetadataPlugin::CONTROLLERS[:environment]  
50 - return unless options  
51 -  
52 - return unless object = case variable = options[:variable]  
53 - when Proc then instance_exec(&variable)  
54 - else instance_variable_get variable  
55 - end  
56 - return if object.respond_to? :public? and not object.public?  
57 - return unless specs = (object.class.metadata_specs rescue nil)  
58 -  
59 - r = []  
60 - specs.each do |namespace, spec|  
61 - namespace = "#{namespace}:" if namespace.present?  
62 - key_attr = spec[:key_attr] || :property  
63 - value_attr = spec[:value_attr] || :content  
64 - tags = spec[:tags]  
65 -  
66 - tags.each do |key, values|  
67 - key = "#{namespace}#{key}"  
68 - values = values.call(object, plugin) if values.is_a? Proc  
69 - next if values.blank?  
70 -  
71 - Array(values).each do |value|  
72 - value = value.call(object, plugin) if value.is_a? Proc  
73 - next if value.blank?  
74 - r << tag(:meta, key_attr => key, value_attr => value)  
75 - end  
76 - end  
77 - end  
78 - r.join  
79 - end  
80 - end  
81 -  
82 - # context HELPERS  
83 - def og_url_for options  
84 - options.delete :port  
85 - options[:host] = self.class.config[:open_graph][:domain] rescue context.send(:environment).default_hostname  
86 - Noosfero::Application.routes.url_helpers.url_for options 18 + def self.og_config
  19 + @og_config ||= self.config[:open_graph] rescue {}
87 end 20 end
88 -  
89 - def helpers  
90 - self.context.class.helpers 21 + def self.og_types
  22 + @og_types ||= self.og_config[:types] rescue {}
91 end 23 end
92 24
93 - protected  
94 -  
95 -end 25 + mattr_accessor :controllers
  26 + self.controllers = MetadataPlugin::Controllers.new
96 27
97 -ActiveSupport.run_load_hooks :metadata_plugin, MetadataPlugin  
98 -ActiveSupport.on_load :active_record do  
99 - ActiveRecord::Base.extend MetadataPlugin::Specs::ClassMethods  
100 end 28 end
101 -  
plugins/metadata/lib/metadata_plugin/base.rb 0 → 100644
@@ -0,0 +1,80 @@ @@ -0,0 +1,80 @@
  1 +
  2 +class MetadataPlugin::Base < Noosfero::Plugin
  3 +
  4 + def self.plugin_name
  5 + _('Export metadata')
  6 + end
  7 +
  8 + def self.plugin_description
  9 + _('Export metadata for models on meta tags')
  10 + end
  11 +
  12 + def self.config
  13 + @config ||= HashWithIndifferentAccess.new(YAML.load File.read("#{File.dirname __FILE__}/../config.yml")) rescue {}
  14 + end
  15 +
  16 + def self.og_types
  17 + @og_types ||= self.config[:open_graph][:types] rescue {}
  18 + end
  19 +
  20 + class_attribute :controllers
  21 + self.controllers = MetadataPlugin::Controllers.new
  22 +
  23 + def head_ending
  24 + plugin = self
  25 + lambda do
  26 + variable = plugin.class.controllers.send controller.controller_path rescue nil
  27 + variable ||= plugin.class.controllers.send :profile if controller.is_a? ProfileController
  28 + variable ||= plugin.class.controllers.send :home
  29 + return unless variable
  30 +
  31 + return unless object = case variable
  32 + when Proc then instance_exec(&variable)
  33 + else instance_variable_get variable
  34 + end
  35 + return if object.respond_to? :public? and not object.public?
  36 + return unless specs = (object.class.metadata_specs rescue nil)
  37 +
  38 + r = []
  39 + specs.each do |namespace, spec|
  40 + namespace = "#{namespace}:" if namespace.present?
  41 + key_attr = spec[:key_attr] || :property
  42 + value_attr = spec[:value_attr] || :content
  43 + tags = spec[:tags]
  44 +
  45 + tags.each do |key, values|
  46 + key = "#{namespace}#{key}"
  47 + values = values.call(object, plugin) if values.is_a? Proc rescue nil
  48 + next if values.blank?
  49 +
  50 + Array(values).each do |value|
  51 + value = value.call(object, plugin) if value.is_a? Proc rescue nil
  52 + next if value.blank?
  53 + r << tag(:meta, key_attr => key, value_attr => CGI.escape_html(value.to_s))
  54 + end
  55 + end
  56 + end
  57 + r.join
  58 + end
  59 + end
  60 +
  61 + # context HELPERS
  62 + def og_url_for options
  63 + options.delete :port
  64 + options[:host] = self.class.config[:open_graph][:domain] rescue context.send(:environment).default_hostname
  65 + Noosfero::Application.routes.url_helpers.url_for options
  66 + end
  67 +
  68 + def helpers
  69 + self.context.class.helpers
  70 + end
  71 +
  72 + protected
  73 +
  74 +end
  75 +
  76 +ActiveSupport.run_load_hooks :metadata_plugin, MetadataPlugin
  77 +ActiveSupport.on_load :active_record do
  78 + ActiveRecord::Base.extend MetadataPlugin::Specs::ClassMethods
  79 +end
  80 +
plugins/metadata/lib/metadata_plugin/controllers.rb 0 → 100644
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +class MetadataPlugin::Controllers
  2 +
  3 + def manage_products
  4 + :@product
  5 + end
  6 +
  7 + def content_viewer
  8 + lambda do
  9 + if profile and @page and profile.home_page_id == @page.id
  10 + @profile
  11 + elsif @page.respond_to? :encapsulated_file
  12 + @page.encapsulated_file
  13 + else
  14 + @page
  15 + end
  16 + end
  17 + end
  18 +
  19 + def profile
  20 + :@profile
  21 + end
  22 +
  23 + def home
  24 + :@environment
  25 + end
  26 +
  27 +end