infopark_cloud_connector 6.9.4 → 6.9.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/README +1 -3
- data/app/controllers/cms_controller.rb +7 -0
- data/app/controllers/rails_connector/default_cms_controller.rb +43 -0
- data/app/controllers/rails_connector/objs_controller.rb +29 -0
- data/app/controllers/rails_connector/widget_renderer.rb +1 -1
- data/app/controllers/rails_connector/workspaces_controller.rb +4 -0
- data/app/helpers/cms_helper.rb +7 -0
- data/app/helpers/cms_routing_helper.rb +7 -0
- data/app/helpers/rails_connector/cms_asset_helper.rb +24 -17
- data/app/helpers/rails_connector/cms_tag_helper.rb +9 -6
- data/app/helpers/rails_connector/default_cms_helper.rb +23 -0
- data/app/helpers/rails_connector/default_cms_routing_helper.rb +101 -0
- data/app/helpers/rails_connector/display_helper.rb +4 -30
- data/app/helpers/rails_connector/editing_helper.rb +3 -0
- data/app/helpers/rails_connector/layout_helper.rb +29 -0
- data/app/helpers/rails_connector/table_of_contents_helper.rb +22 -0
- data/app/models/named_link.rb +2 -0
- data/app/views/cms/_index.html.erb +7 -0
- data/app/views/cms/index.html.erb +1 -0
- data/app/views/errors/403_forbidden.html.erb +3 -0
- data/app/views/errors/410_gone.html.erb +7 -0
- data/app/views/rails_connector/_editing_javascript.html.erb +2 -0
- data/config/ca-bundle.crt +1 -1
- data/config/cms_routes.rb +14 -0
- data/config/locales/de.rails_connector.errors.yml +11 -0
- data/config/locales/de.rails_connector.lib.yml +6 -0
- data/config/locales/de.rails_connector.views.yml +9 -0
- data/config/locales/en.rails_connector.errors.yml +10 -0
- data/config/locales/en.rails_connector.lib.yml +6 -0
- data/config/locales/en.rails_connector.views.yml +9 -0
- data/config/routes.rb +4 -0
- data/lib/assets/javascripts/infopark_editing.js +689 -285
- data/lib/assets/stylesheets/infopark_editing.css +17 -0
- data/lib/infopark_cloud_connector.rb +22 -0
- data/lib/obj.rb +3 -0
- data/lib/rails_connector/attribute_content.rb +190 -0
- data/lib/rails_connector/authenticable.rb +30 -0
- data/lib/rails_connector/basic_obj.rb +25 -139
- data/lib/rails_connector/basic_widget.rb +35 -0
- data/lib/rails_connector/cms_accessible.rb +114 -0
- data/lib/rails_connector/cms_cache_storage.rb +1 -1
- data/lib/rails_connector/cms_dispatch_controller.rb +46 -0
- data/lib/rails_connector/cms_env.rb +68 -0
- data/lib/rails_connector/cms_test_request.rb +23 -0
- data/lib/rails_connector/configuration.rb +3 -2
- data/lib/rails_connector/core_extensions.rb +1 -0
- data/lib/rails_connector/core_extensions/time.rb +18 -0
- data/lib/rails_connector/date_attribute.rb +1 -17
- data/lib/rails_connector/engine.rb +57 -0
- data/lib/rails_connector/html_string.rb +19 -0
- data/lib/rails_connector/link.rb +102 -17
- data/lib/rails_connector/link_resolvable.rb +9 -0
- data/lib/rails_connector/migrations/migrator.rb +8 -4
- data/lib/rails_connector/migrations/workspace_lock.rb +3 -2
- data/lib/rails_connector/named_link.rb +1 -1
- data/lib/rails_connector/obj_data_from_service.rb +18 -0
- data/lib/rails_connector/string_tagging.rb +29 -0
- data/lib/rails_connector/type_computer.rb +30 -0
- data/lib/widget.rb +3 -0
- metadata +103 -18
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NjQxZDQ1MTE2NzI2YjU3MTQ3Zjg0MDY0MWFjZDEyZTE4Y2Q0MzQzMg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YmNmZjYwMGZiYWRmZjRmODEzNGZlNGEwMWY4YmVlOTIyOTBiOTZjNA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
Mzk1OGU2Y2FjNmY0Mzc4ZDA5MmFhOTVkZDI4ZWQ0ZjA2YjI0NmEyNjYzZDMw
|
10
|
+
MDRiNzIwNDNjMzhkZjI4MDJjNTliNDI0NDg5ZDM3NzllOTBiNDcwZjg3NjQy
|
11
|
+
ODI5NGNhZjNhMzQ0MzgzNTE3MDVjMGRlMzg3NzUwMDM2MDU2MDU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZmNiYjYyMTkzY2M3NzkzYTcwM2NlODk0YjRlNDExZDQ2MzM2ZTA0ZDc3M2U2
|
14
|
+
YmRlM2EyNTUzNzlmMGJlOTg4YzA2NjhjOGNhNzFiOWNlMDhhMzEyNDVjNDg5
|
15
|
+
N2QyNWI0MjhmZDU2OTFhZWZkMTkzOGZlYzA4NmNjOGMzMjFkNTc=
|
data/README
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
= Infopark Cloud Connector
|
2
2
|
|
3
|
-
Infopark Cloud Connector is part of {https://rubygems.org/gems/infopark_rails_connector Infopark Rails Connector}.
|
4
|
-
|
5
3
|
The Cloud Connector makes CMS objects maintained by means of the cloud-based Infopark CMS available to your Rails application. It offers easy-to-use functionality for rendering CMS content, doing searches, etc.
|
6
4
|
|
7
|
-
For more information about Infopark
|
5
|
+
For more information about Infopark Cloud Connector, please visit {http://dev.infopark.net/ the Infopark Dev Center}. For details regarding recent changes to the Infopark CMS and the Cloud Connector can be found in our {http://dev.infopark.net/blog Dev Center Blog}.
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
# This controller provides some default includes ({CmsAccessible}),
|
4
|
+
# before filters (+load_object+, among others), and actions to simplify
|
5
|
+
# CMS object handling. It should never be used directly, but only as a
|
6
|
+
# super class to {CmsController}.
|
7
|
+
# @api public
|
8
|
+
class DefaultCmsController < ApplicationController
|
9
|
+
include CmsAccessible
|
10
|
+
before_filter :load_object
|
11
|
+
before_filter :ensure_object_is_active
|
12
|
+
before_filter :ensure_object_is_permitted
|
13
|
+
before_filter :set_google_expire_header
|
14
|
+
|
15
|
+
# Default Action. Delivers files directly if their mime type is not text/html
|
16
|
+
# @api public
|
17
|
+
def index
|
18
|
+
deliver_file if @obj.mime_type != "text/html"
|
19
|
+
end
|
20
|
+
|
21
|
+
# Toggles edit markers. The current status is stored in the session.
|
22
|
+
# @api public
|
23
|
+
def toggle_editmarkers
|
24
|
+
session[:hide_editmarkers] = !session[:hide_editmarkers]
|
25
|
+
redirect_to cms_id_url(@obj)
|
26
|
+
end
|
27
|
+
|
28
|
+
# This method indicates if this controller should be used automatically when an Obj is
|
29
|
+
# requested via the Rails Connector's standard routes. It returns true by default.
|
30
|
+
#
|
31
|
+
# Overwrite it to return false if you do want your controller to be excluded from Obj dispatching.
|
32
|
+
#
|
33
|
+
# You may also implement a method with the name {use_for_obj_dispatch?} in controllers not
|
34
|
+
# descending from {DefaultCmsController} to include them in Obj dispatching.
|
35
|
+
#
|
36
|
+
# @see Obj#controller_name
|
37
|
+
# @api public
|
38
|
+
def self.use_for_obj_dispatch?
|
39
|
+
true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -33,6 +33,16 @@ module RailsConnector
|
|
33
33
|
render json: {}
|
34
34
|
end
|
35
35
|
|
36
|
+
def copy
|
37
|
+
render json: copy_obj(get_obj_attributes(params[:id]), params[:parent_path])
|
38
|
+
end
|
39
|
+
|
40
|
+
def duplicate
|
41
|
+
attributes = get_obj_attributes(params[:id])
|
42
|
+
|
43
|
+
render json: copy_obj(attributes, parent_path(attributes['_path']))
|
44
|
+
end
|
45
|
+
|
36
46
|
def page_class_selection
|
37
47
|
valid_page_classes = Obj.valid_page_classes_beneath(params[:parent_path]) || all_page_classes
|
38
48
|
valid_page_classes.map!(&:to_s)
|
@@ -104,6 +114,25 @@ module RailsConnector
|
|
104
114
|
end
|
105
115
|
end
|
106
116
|
|
117
|
+
def copy_obj(copied_attributes, target_path=nil)
|
118
|
+
copied_attributes.delete('id')
|
119
|
+
copied_attributes.delete('_last_changed')
|
120
|
+
|
121
|
+
copied_attributes['_path'] = "#{target_path}/#{SecureRandom.hex(6)}"
|
122
|
+
|
123
|
+
CmsRestApi.task_unaware_request(
|
124
|
+
:post, "revisions/#{Workspace.current.revision_id}/objs", obj: copied_attributes)
|
125
|
+
end
|
126
|
+
|
127
|
+
def get_obj_attributes(id)
|
128
|
+
CmsRestApi.task_unaware_request(
|
129
|
+
:get, "revisions/#{Workspace.current.revision_id}/objs/#{id}")
|
130
|
+
end
|
131
|
+
|
132
|
+
def parent_path(path)
|
133
|
+
path.split('/')[0..-2].join('/')
|
134
|
+
end
|
135
|
+
|
107
136
|
def current_page
|
108
137
|
Obj.find(params[:current_page_id]) if params[:current_page_id].present?
|
109
138
|
end
|
@@ -31,7 +31,7 @@ class WidgetRenderer < AbstractController::Base
|
|
31
31
|
rescue ActionView::MissingTemplate => e
|
32
32
|
view_context.widget_thumbnail(
|
33
33
|
widget_dir.titleize,
|
34
|
-
'thumbnail.html.erb does not
|
34
|
+
'thumbnail.html.erb does not exist. Please provide one.',
|
35
35
|
view_context.image_tag('180x120.gif')
|
36
36
|
)
|
37
37
|
end
|
@@ -25,6 +25,10 @@ module RailsConnector
|
|
25
25
|
render json: CmsRestApi.task_unaware_request(:put, "workspaces/#{params[:id]}/publish", {})
|
26
26
|
end
|
27
27
|
|
28
|
+
def rebase
|
29
|
+
render json: CmsRestApi.task_unaware_request(:put, "workspaces/#{params[:id]}/rebase", {})
|
30
|
+
end
|
31
|
+
|
28
32
|
private
|
29
33
|
|
30
34
|
def workspace_params
|
@@ -44,12 +44,6 @@ module RailsConnector
|
|
44
44
|
if args.second.nil? || args.second.is_a?(Hash)
|
45
45
|
# Backwards compatibility.
|
46
46
|
target = args.first
|
47
|
-
if target.is_a?(LinkList)
|
48
|
-
ActiveSupport::Deprecation.warn(%{
|
49
|
-
Calling "cms_image_tag" with a "LinkList" is not allowed anymore.
|
50
|
-
Please use following syntax instead: cms_image_tag(@obj, :linklist).
|
51
|
-
})
|
52
|
-
end
|
53
47
|
|
54
48
|
tag_options = args.second || {}
|
55
49
|
tag_options.symbolize_keys!
|
@@ -63,7 +57,7 @@ module RailsConnector
|
|
63
57
|
tag_options = args.third || {}
|
64
58
|
editing_options = args.fourth || {}
|
65
59
|
|
66
|
-
cms_tag('img', obj, field_name, cms_image_tag_options(
|
60
|
+
cms_tag('img', obj, field_name, cms_image_tag_options(obj, field_name,
|
67
61
|
tag_options.symbolize_keys, editing_options.symbolize_keys))
|
68
62
|
end
|
69
63
|
|
@@ -71,16 +65,29 @@ module RailsConnector
|
|
71
65
|
|
72
66
|
private
|
73
67
|
|
74
|
-
def cms_image_tag_options(
|
75
|
-
tag_options.reverse_merge(
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
68
|
+
def cms_image_tag_options(obj, field_name, tag_options, editing_options)
|
69
|
+
tag_options.reverse_merge(src: cms_image_tag_src(obj, field_name, editing_options),
|
70
|
+
alt: cms_image_tag_alt(obj, field_name))
|
71
|
+
end
|
72
|
+
|
73
|
+
def cms_image_tag_src(obj, field_name, editing_options)
|
74
|
+
cms_image_tag_path(obj, field_name) || editing_options[:placeholder] ||
|
75
|
+
image_path('rails_connector/image_placeholder.png')
|
76
|
+
end
|
77
|
+
|
78
|
+
def cms_image_tag_alt(obj, field_name)
|
79
|
+
display_title(obj[field_name])
|
80
|
+
end
|
81
|
+
|
82
|
+
def cms_image_tag_path(obj, field_name)
|
83
|
+
field_type = obj.type_of_attribute(field_name)
|
84
|
+
field_value = obj[field_name]
|
85
|
+
|
86
|
+
case field_type
|
87
|
+
when 'reference' then field_value && cms_path(field_value)
|
88
|
+
when 'linklist'
|
89
|
+
path = cms_path(field_value)
|
90
|
+
path == DefaultCmsRoutingHelper::LINK_TO_EMPTY_LINKLIST ? nil : path
|
84
91
|
end
|
85
92
|
end
|
86
93
|
|
@@ -46,7 +46,7 @@ module RailsConnector
|
|
46
46
|
end
|
47
47
|
|
48
48
|
options = options.merge({
|
49
|
-
'data-ip-field-id' => obj.id,
|
49
|
+
'data-ip-private-field-id' => obj.id,
|
50
50
|
'data-ip-field-obj-class' => obj.obj_class,
|
51
51
|
'data-ip-field-name' => field_name,
|
52
52
|
'data-ip-field-type' => field_type,
|
@@ -61,7 +61,7 @@ module RailsConnector
|
|
61
61
|
if inplace_editing_allowed? && FIELD_TYPES_WITH_ORIGINAL_CONTENT.include?(field_type)
|
62
62
|
original_value = display_original_value(obj[field_name])
|
63
63
|
original_content = cms_tag_original_content(field_type, original_value)
|
64
|
-
options['data-ip-field-original-content'] = MultiJson.encode(original_content)
|
64
|
+
options['data-ip-private-field-original-content'] = MultiJson.encode(original_content)
|
65
65
|
end
|
66
66
|
|
67
67
|
inner_html = block_given? ? capture { yield } : display_value(obj[field_name])
|
@@ -150,8 +150,11 @@ module RailsConnector
|
|
150
150
|
inner_html << list.output
|
151
151
|
end
|
152
152
|
|
153
|
+
valid_page_classes = Obj.valid_page_classes_beneath(obj.path)
|
154
|
+
|
153
155
|
options = options.merge({
|
154
|
-
'data-ip-child-list-path' => obj.path,
|
156
|
+
'data-ip-private-child-list-path' => obj.path,
|
157
|
+
'data-ip-private-child-list-allowed-classes' => valid_page_classes.to_json,
|
155
158
|
}) if inplace_editing_allowed?
|
156
159
|
|
157
160
|
content_tag(tag_name, inner_html, options)
|
@@ -163,9 +166,9 @@ module RailsConnector
|
|
163
166
|
options = {}
|
164
167
|
|
165
168
|
if inplace_editing_allowed?
|
166
|
-
options['data-ip-widget-id'] = widget.id
|
167
|
-
options['data-ip-widget-obj-class'] = widget.obj_class
|
168
|
-
options['data-ip-widget-has-edit-view'] = true if renderer.has_edit_view?(widget.obj_class)
|
169
|
+
options['data-ip-private-widget-id'] = widget.id
|
170
|
+
options['data-ip-private-widget-obj-class'] = widget.obj_class
|
171
|
+
options['data-ip-private-widget-has-edit-view'] = true if renderer.has_edit_view?(widget.obj_class)
|
169
172
|
end
|
170
173
|
|
171
174
|
content_tag(:div, options) do
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
# This is a wrapper module for the default set of Rails Connector helper modules.
|
4
|
+
#
|
5
|
+
# To make autoloading from +CmsController+ work, this module must be wrapped
|
6
|
+
# by a module named +CmsHelper+:
|
7
|
+
#
|
8
|
+
# module CmsHelper
|
9
|
+
# include RailsConnector::DefaultCmsHelper
|
10
|
+
# end
|
11
|
+
# @api public
|
12
|
+
module DefaultCmsHelper
|
13
|
+
include DisplayHelper
|
14
|
+
include MarkerHelper
|
15
|
+
include CmsAssetHelper
|
16
|
+
include RailsConnector::CmsAssetHelper
|
17
|
+
include RailsConnector::TableOfContentsHelper
|
18
|
+
include RailsConnector::EditingHelper
|
19
|
+
include RailsConnector::LayoutHelper
|
20
|
+
include RailsConnector::CmsTagHelper
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
module DefaultCmsRoutingHelper
|
5
|
+
# Returns the path for +target+ using the +CmsController+ routes.
|
6
|
+
# +target+ can be an +Obj+ or a +Link+ or a +LinkList+.
|
7
|
+
# If +target+ is a +Linklist+, it must be non-empty. The first +Link+ from the +LinkList+ will be used.
|
8
|
+
# +options+ are optional and include url settings such as path parameters or protocol.
|
9
|
+
# @return [String]
|
10
|
+
# @api public
|
11
|
+
def cms_path(target, options = {})
|
12
|
+
cms_path_or_url(target, "path", options)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns the absolute URL for target using the +CmsController+ routes.
|
16
|
+
# +target+ can be an +Obj+ or a +Link+ or a +LinkList+.
|
17
|
+
# If +target+ is a +Linklist+, it must be non-empty. The first +Link+ from the +LinkList+ will be used.
|
18
|
+
# +options+ are optional and include url settings such as path parameters or protocol.
|
19
|
+
# @return [String]
|
20
|
+
# @api public
|
21
|
+
def cms_url(target, options = {})
|
22
|
+
cms_path_or_url(target, "url", options)
|
23
|
+
end
|
24
|
+
|
25
|
+
LINK_TO_UNREACHABLE = "#__target_object_not_reachable"
|
26
|
+
LINK_TO_EMPTY_LINKLIST = "#__empty_linklist"
|
27
|
+
|
28
|
+
def cms_path_or_url(target, path_or_url, options = {})
|
29
|
+
if target.is_a?(Link)
|
30
|
+
cms_path_or_url_for_links(target, path_or_url, options)
|
31
|
+
elsif target.is_a?(Obj)
|
32
|
+
cms_path_or_url_for_objs(target, path_or_url, options)
|
33
|
+
elsif target.respond_to?(:first)
|
34
|
+
if target.first.is_a?(Link)
|
35
|
+
cms_path_or_url_for_links(target.first, path_or_url, options)
|
36
|
+
else
|
37
|
+
return LINK_TO_EMPTY_LINKLIST
|
38
|
+
end
|
39
|
+
else
|
40
|
+
raise "cms_path or cms_url was called with an instance of #{target.class}. "+
|
41
|
+
"It must only be called with an Obj or a Link or a non-empty LinkList."
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def cms_path_or_url_for_links(link, path_or_url, options = {})
|
46
|
+
return LINK_TO_UNREACHABLE if link.internal? && link.obj.nil?
|
47
|
+
url = basic_url_or_path_for_link(link, path_or_url, options)
|
48
|
+
url = url + "?#{link.query}" if link.query.present? && options.empty?
|
49
|
+
url = url + "##{link.fragment}" if link.fragment.present?
|
50
|
+
url
|
51
|
+
end
|
52
|
+
|
53
|
+
def cms_path_or_url_for_objs(obj, path_or_url, options = {})
|
54
|
+
permalink = obj.permalink
|
55
|
+
ignore_body_data_url = options.delete(:ignore_body_data_url)
|
56
|
+
if permalink && !Configuration.editor_interface_enabled?
|
57
|
+
__send__("cms_permalink_#{path_or_url}", options.merge(:permalink => permalink))
|
58
|
+
elsif obj.homepage? && !Configuration.editor_interface_enabled?
|
59
|
+
__send__("root_#{path_or_url}", options)
|
60
|
+
else
|
61
|
+
if obj.body_data_url && !ignore_body_data_url
|
62
|
+
enforce_protocol_from_request(obj.body_data_url)
|
63
|
+
elsif obj.binary? && !obj.file_extension.blank?
|
64
|
+
__send__("cms_id_#{path_or_url}",
|
65
|
+
options.merge(:id => obj.id, :slug => obj.slug.presence, :format => obj.file_extension))
|
66
|
+
else
|
67
|
+
routing_options = options.merge(:id => obj.id, :slug => obj.slug.presence)
|
68
|
+
__send__("cms_id_#{path_or_url}", routing_options)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def basic_url_or_path_for_link(link, path_or_url, options = {})
|
76
|
+
if link.internal?
|
77
|
+
__send__("cms_#{path_or_url}", link.obj, options)
|
78
|
+
else
|
79
|
+
url = link.external_url
|
80
|
+
options.delete(:ignore_body_data_url)
|
81
|
+
url = merge_options(url, options) if options.any?
|
82
|
+
url
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def merge_options(url, options)
|
87
|
+
parsed_url = URI.parse(url)
|
88
|
+
|
89
|
+
query = Rack::Utils.parse_query(parsed_url.query)
|
90
|
+
merged_query = query.merge(options.stringify_keys)
|
91
|
+
parsed_url.query = merged_query.to_query
|
92
|
+
|
93
|
+
parsed_url.to_s
|
94
|
+
end
|
95
|
+
|
96
|
+
def enforce_protocol_from_request(url)
|
97
|
+
request.ssl? && !url.starts_with?('https') ? url.gsub(/^http/, 'https') : url
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -67,39 +67,13 @@ module RailsConnector
|
|
67
67
|
|
68
68
|
private
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
return content_attribute unless content_attribute =~ LINK_EXPRESSION
|
75
|
-
link_map = content_attribute.source.text_links.each_with_object({}) do |link, map|
|
76
|
-
map[link.id.to_s] = link
|
77
|
-
end
|
78
|
-
content_attribute.gsub(%r(#{LINK_PATTERN}(['"]?))) do
|
79
|
-
link = link_map[$1.to_s]
|
80
|
-
if link.blank?
|
81
|
-
"#{CmsRoutingHelper::LINK_TO_UNREACHABLE}#{$2}"
|
82
|
-
else
|
83
|
-
uri = "#{cms_path(link, cms_path_options)}#{$2}"
|
84
|
-
html_link(link, uri)
|
70
|
+
def convert_links(html, cms_path_options = {})
|
71
|
+
if html
|
72
|
+
html.gsub(%r{<?\bobjid:([a-f0-9]{16})\b>?}) do
|
73
|
+
cms_path(Obj.find($1), cms_path_options)
|
85
74
|
end
|
86
75
|
end
|
87
76
|
end
|
88
77
|
|
89
|
-
def html_link(link, uri)
|
90
|
-
subst = uri
|
91
|
-
name, value =
|
92
|
-
case link.tag_name
|
93
|
-
when 'img', 'input'
|
94
|
-
['alt', link.title || ""]
|
95
|
-
when 'a', 'link'
|
96
|
-
['title', begin link.title unless link.title.blank? end]
|
97
|
-
end
|
98
|
-
if value
|
99
|
-
subst << %( #{name}="#{h(value)}")
|
100
|
-
end
|
101
|
-
subst << %( target="#{h(link.target)}") unless link.target.blank?
|
102
|
-
subst
|
103
|
-
end
|
104
78
|
end
|
105
79
|
end
|