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 1 open_graph:
2 2 domain: domainregisteredonfacebook.com
3 3 environment_logo: 'http://example.com/designs/themes/environmenttheme/images/logo.png'
  4 + namespace: app_scope
4 5 types:
5 6 article: article
6 7 product: facebook_app:sse_product
... ...
plugins/metadata/lib/ext/article.rb
... ... @@ -3,8 +3,13 @@ require_dependency 'article'
3 3 class Article
4 4  
5 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 13 title: proc{ |a, plugin| "#{a.title} - #{a.profile.name}" },
9 14 image: proc do |a, plugin|
10 15 result = a.body_images_paths
... ...
plugins/metadata/lib/ext/community.rb
... ... @@ -4,7 +4,7 @@ require_dependency "#{File.dirname __FILE__}/profile"
4 4 class Community
5 5  
6 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 10 end
... ...
plugins/metadata/lib/ext/enterprise.rb
... ... @@ -4,7 +4,7 @@ require_dependency "#{File.dirname __FILE__}/profile"
4 4 class Enterprise
5 5  
6 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 10 metadata_spec namespace: 'business:contact_data', tags: {
... ...
plugins/metadata/lib/ext/environment.rb
... ... @@ -7,7 +7,7 @@ class Environment
7 7 }
8 8  
9 9 metadata_spec namespace: :og, tags: {
10   - type: 'website',
  10 + type: proc{ |e, plugin| plugin.context.params[:og_type] || 'website' },
11 11 title: proc{ |e, plugin| e.name },
12 12 site_name: proc{ |e, plugin| e.name },
13 13 description: proc{ |e, plugin| e.name },
... ...
plugins/metadata/lib/ext/person.rb
... ... @@ -4,7 +4,7 @@ require_dependency "#{File.dirname __FILE__}/profile"
4 4 class Person
5 5  
6 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 10 end
... ...
plugins/metadata/lib/ext/product.rb
... ... @@ -3,8 +3,12 @@ require_dependency 'product'
3 3 class Product
4 4  
5 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 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 12 gr_hascurrencyvalue: proc{ |p, plugin| p.price.to_f },
9 13 gr_hascurrency: proc{ |p, plugin| p.environment.currency_unit },
10 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 3 class Profile
4 4  
5 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 7 image: proc{ |p, plugin| "#{p.environment.top_url}#{p.image.public_filename}" if p.image },
8 8 title: proc{ |p, plugin| if p.nickname.present? then p.nickname else p.name end },
9 9 url: proc do |p, plugin|
... ...
plugins/metadata/lib/ext/uploaded_file.rb
... ... @@ -6,9 +6,12 @@ class UploadedFile
6 6 metadata_spec namespace: :og, tags: {
7 7 type: proc do |u, plugin|
8 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 14 end,
11   - url: proc{ |u, plugin| plugin.og_url_for u.url.merge(view: true) },
12 15 title: proc{ |u, plugin| u.title },
13 16 image: proc{ |u, plugin| "#{u.environment.top_url}#{u.public_filename}" if u.image? },
14 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 6 def self.plugin_name
5 7 _('Export metadata')
... ... @@ -13,89 +15,14 @@ class MetadataPlugin &lt; Noosfero::Plugin
13 15 @config ||= HashWithIndifferentAccess.new(YAML.load File.read("#{File.dirname __FILE__}/../config.yml")) rescue {}
14 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 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 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 28 end
101   -
... ...
plugins/metadata/lib/metadata_plugin/base.rb 0 → 100644
... ... @@ -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 @@
  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
... ...