Commit 3259a393a5afb3d419fa63672a7a1abd5e6ad31d
1 parent
4c75b9bd
Exists in
master
and in
27 other branches
New plugin VariablesPlugin
This plugin add a macro that converts {profile} string by the profile identifier. Also: - fix a bug in the MacrosHelper - fix the usage of the jQuery UI dialog widget (Noosfero uses jQuery UI v1.8) Thanks to Serpro and UnB! (ActionItem2907)
Showing
7 changed files
with
186 additions
and
8 deletions
Show diff stats
app/helpers/macros_helper.rb
... | ... | @@ -20,14 +20,16 @@ module MacrosHelper |
20 | 20 | jQuery('<div>'+#{macro_configuration_dialog(macro).to_json}+'</div>').dialog({ |
21 | 21 | title: #{macro_title(macro).to_json}, |
22 | 22 | modal: true, |
23 | - buttons: [ | |
24 | - {text: #{_('Ok').to_json}, click: function(){ | |
23 | + buttons: { | |
24 | + #{_('Ok').to_json}: function(){ | |
25 | 25 | tinyMCE.activeEditor.execCommand('mceInsertContent', false, |
26 | 26 | (function(dialog){ #{macro_generator(macro)} })(this)); |
27 | 27 | jQuery(this).dialog('close'); |
28 | - }}, | |
29 | - {text: #{_('Cancel').to_json}, click: function(){jQuery(this).dialog('close');}} | |
30 | - ] | |
28 | + }, | |
29 | + #{_('Cancel').to_json}: function(){ | |
30 | + jQuery(this).dialog('close'); | |
31 | + } | |
32 | + } | |
31 | 33 | }); |
32 | 34 | }" |
33 | 35 | end |
... | ... | @@ -57,7 +59,11 @@ module MacrosHelper |
57 | 59 | |
58 | 60 | def macro_generator(macro) |
59 | 61 | if macro.configuration[:generator] |
60 | - macro.configuration[:generator] | |
62 | + if macro.configuration[:generator].respond_to?(:call) | |
63 | + macro.configuration[:generator].call(macro) | |
64 | + else | |
65 | + macro.configuration[:generator] | |
66 | + end | |
61 | 67 | else |
62 | 68 | macro_default_generator(macro) |
63 | 69 | end |
... | ... | @@ -66,8 +72,7 @@ module MacrosHelper |
66 | 72 | |
67 | 73 | def macro_default_generator(macro) |
68 | 74 | code = "var params = {};" |
69 | - configuration = macro_configuration(macro) | |
70 | - configuration[:params].map do |field| | |
75 | + macro.configuration[:params].map do |field| | |
71 | 76 | code += "params.#{field[:name]} = jQuery('*[name=#{field[:name]}]', dialog).val();" |
72 | 77 | end |
73 | 78 | code + " | ... | ... |
... | ... | @@ -0,0 +1,39 @@ |
1 | +h1. Variables Plugin | |
2 | + | |
3 | +A set of simple variables to be used in a macro context. | |
4 | + | |
5 | +h2. Usage | |
6 | + | |
7 | +* Create a HTML content using RawHTMLBlock, TinyMceArticle or other | |
8 | + article with HTML support | |
9 | +* Add a HTML div tag with css class "macro" (see Example) | |
10 | +* Add inner that div tag the variable desired, like {profile} | |
11 | + | |
12 | +h2. Usage with TinyMceArticle | |
13 | + | |
14 | +The Noosfero's macros add a extra button in toolbar of the editor | |
15 | +to use macros in a single way, that way this plugin add a option | |
16 | +called "Variables" under this option. | |
17 | + | |
18 | +h2. Supported variables | |
19 | + | |
20 | +* {profile} - will be replaced by the identifier of the profile | |
21 | +* {name} - will be replaced by the name of the profile | |
22 | + | |
23 | +h2. Example | |
24 | + | |
25 | +<pre> | |
26 | +<div class="macro" data-macro="variables_plugin/profile"> | |
27 | + the identifier of the profile = {profile} | |
28 | + the name of the profile = {name} | |
29 | +</div> | |
30 | +</pre> | |
31 | + | |
32 | +h2. Info | |
33 | + | |
34 | +This plugin was inspired by the solution proposed by the Serpro in | |
35 | +the merge-request #419 on the Gitorious: | |
36 | + | |
37 | +* https://gitorious.org/noosfero/noosfero/merge_requests/419 | |
38 | + | |
39 | +And improved by the guys from the UnB. | ... | ... |
... | ... | @@ -0,0 +1,13 @@ |
1 | +class VariablesPlugin < Noosfero::Plugin | |
2 | + | |
3 | + def self.plugin_name | |
4 | + "Variables Plugin" | |
5 | + end | |
6 | + | |
7 | + def self.plugin_description | |
8 | + _("A set of simple variables to be used in a macro context") | |
9 | + end | |
10 | + | |
11 | +end | |
12 | + | |
13 | +require_dependency 'variables_plugin/macros/profile' | ... | ... |
plugins/variables/lib/variables_plugin/macros/profile.rb
0 → 100644
... | ... | @@ -0,0 +1,37 @@ |
1 | +ActionView::Base.sanitized_allowed_attributes += ['data-macro'] | |
2 | + | |
3 | +class VariablesPlugin::Profile < Noosfero::Plugin::Macro | |
4 | + | |
5 | + def self.configuration | |
6 | + { | |
7 | + :title => _('Variables'), | |
8 | + :skip_dialog => false, | |
9 | + :generator => method(:macro_default_generator), | |
10 | + :params => [ | |
11 | + { | |
12 | + :name => 'variable', | |
13 | + :label => _('Select the desired variable'), | |
14 | + :type => 'select', | |
15 | + :values => ['{profile}', '{name}'] | |
16 | + } | |
17 | + ], | |
18 | + } | |
19 | + end | |
20 | + | |
21 | + def self.macro_default_generator(macro) | |
22 | + " | |
23 | + '<div class=\"macro mceNonEditable\" data-macro=\"#{macro.identifier}\">' | |
24 | + + jQuery('*[name=variable]', dialog).val() | |
25 | + + '</div>'; | |
26 | + " | |
27 | + end | |
28 | + | |
29 | + def parse(params, inner_html, source) | |
30 | + if context.profile | |
31 | + inner_html.gsub!(/\{profile\}/, context.profile.identifier) | |
32 | + inner_html.gsub!(/\{name\}/, context.profile.name) | |
33 | + end | |
34 | + inner_html | |
35 | + end | |
36 | + | |
37 | +end | ... | ... |
... | ... | @@ -0,0 +1,41 @@ |
1 | +class ProfileTest < ActiveSupport::TestCase | |
2 | + | |
3 | + def setup | |
4 | + @macro = VariablesPlugin::Profile.new | |
5 | + @macro.context = mock() | |
6 | + @profile = fast_create(Community) | |
7 | + @macro.context.stubs(:profile).returns(@profile) | |
8 | + end | |
9 | + | |
10 | + attr_reader :macro, :profile | |
11 | + | |
12 | + should 'have a configuration' do | |
13 | + assert VariablesPlugin::Profile.configuration | |
14 | + end | |
15 | + | |
16 | + should 'substitute the {profile} variable by the profile idenfifier' do | |
17 | + html = 'the profile identifier is {profile}' | |
18 | + content = macro.parse({}, html, profile) | |
19 | + assert_equal "the profile identifier is #{profile.identifier}", content | |
20 | + end | |
21 | + | |
22 | + should 'substitute the {name} variable by the profile name' do | |
23 | + html = 'the profile name is {name}' | |
24 | + content = macro.parse({}, html, profile) | |
25 | + assert_equal "the profile name is #{profile.name}", content | |
26 | + end | |
27 | + | |
28 | + should 'do not change the content if the variable is not supported' do | |
29 | + html = 'the variable {unsupported} is not supported' | |
30 | + content = macro.parse({}, html, profile) | |
31 | + assert_equal html, content | |
32 | + end | |
33 | + | |
34 | + should 'do nothing out of profile context' do | |
35 | + macro.context.stubs(:profile).returns(nil) | |
36 | + html = 'there is no {support} out of profile context' | |
37 | + content = macro.parse({}, html, profile) | |
38 | + assert_equal html, content | |
39 | + end | |
40 | + | |
41 | +end | ... | ... |
... | ... | @@ -0,0 +1,20 @@ |
1 | +require 'test_helper' | |
2 | + | |
3 | +class VariablesPluginTest < ActiveSupport::TestCase | |
4 | + | |
5 | + def setup | |
6 | + @environment = Environment.default | |
7 | + @plugin = VariablesPlugin.new | |
8 | + end | |
9 | + | |
10 | + attr_reader :environment, :plugin | |
11 | + | |
12 | + should 'have a name' do | |
13 | + assert_not_equal Noosfero::Plugin.plugin_name, VariablesPlugin::plugin_name | |
14 | + end | |
15 | + | |
16 | + should 'describe yourself' do | |
17 | + assert_not_equal Noosfero::Plugin.plugin_description, VariablesPlugin::plugin_description | |
18 | + end | |
19 | + | |
20 | +end | ... | ... |
test/unit/macros_helper_test.rb
... | ... | @@ -129,4 +129,27 @@ class MacrosHelperTest < ActiveSupport::TestCase |
129 | 129 | assert_equal 'macro_generator', macro_generator(Plugin1::Macro) |
130 | 130 | end |
131 | 131 | |
132 | + should 'get macro default generator' do | |
133 | + class Plugin1::Macro < Noosfero::Plugin::Macro | |
134 | + def self.configuration | |
135 | + { :params => [] } | |
136 | + end | |
137 | + end | |
138 | + assert_nothing_raised NoMethodError do | |
139 | + assert macro_generator(Plugin1::Macro) | |
140 | + end | |
141 | + end | |
142 | + | |
143 | + should 'can use a code reference as macro generator' do | |
144 | + class Plugin1::Macro < Noosfero::Plugin::Macro | |
145 | + def self.configuration | |
146 | + { :params => [], :generator => method(:macro_generator_method) } | |
147 | + end | |
148 | + def self.macro_generator_method(macro) | |
149 | + "macro generator method return" | |
150 | + end | |
151 | + end | |
152 | + assert_equal "macro generator method return", macro_generator(Plugin1::Macro) | |
153 | + end | |
154 | + | |
132 | 155 | end | ... | ... |