summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/page.rb28
-rw-r--r--test/unit/page_test.rb57
2 files changed, 85 insertions, 0 deletions
diff --git a/app/models/page.rb b/app/models/page.rb
index 950d9f2..a4817a3 100644
--- a/app/models/page.rb
+++ b/app/models/page.rb
@@ -13,6 +13,9 @@ class Page < ActiveRecord::Base
13 belongs_to :node 13 belongs_to :node
14 belongs_to :user 14 belongs_to :user
15 15
16 # Filter
17 before_save :rewrite_links_in_body
18
16 # Security 19 # Security
17 attr_accessible :title, :abstract, :body, :template_name 20 attr_accessible :title, :abstract, :body, :template_name
18 21
@@ -116,4 +119,29 @@ class Page < ActiveRecord::Base
116 119
117 I18n.locale = locale_before 120 I18n.locale = locale_before
118 end 121 end
122
123 private
124
125 def rewrite_links_in_body
126 if self.body
127 tmp_body = "<div>#{self.body}</div>"
128 xml_string = XML::Parser.string( tmp_body )
129 xml_doc = xml_string.parse
130 links = xml_doc.find("a[not(starts-with(@href, 'http://'))]")
131
132 locales = I18n.available_locales.reject {|l| l == :root}
133
134 links.each do |link|
135 unless locales.include? link[:href].slice(1,2).to_sym
136 link[:href] = link[:href].sub(/^\//, "/#{I18n.locale}/")
137 end
138 end
139
140 tmp_body = xml_doc.to_s.gsub(/(\n\<div\>|\<\/div\>\n)/, "")
141 tmp_body.gsub!("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "")
142
143 self.body = tmp_body
144 end
145 end
146
119end \ No newline at end of file 147end \ No newline at end of file
diff --git a/test/unit/page_test.rb b/test/unit/page_test.rb
index 21b8910..461472e 100644
--- a/test/unit/page_test.rb
+++ b/test/unit/page_test.rb
@@ -48,4 +48,61 @@ class PageTest < ActiveSupport::TestCase
48 assert_equal 4, Page.find_tagged_with( "update" ).count 48 assert_equal 4, Page.find_tagged_with( "update" ).count
49 assert_equal [d2.id, d4.id], Page.aggregate( options1 ).map {|x| x.id} 49 assert_equal [d2.id, d4.id], Page.aggregate( options1 ).map {|x| x.id}
50 end 50 end
51
52 def test_before_save_rewrite_links_in_body
53 n = Node.create :slug => "link_test"
54 n.move_to_child_of Node.root
55 d = n.find_or_create_draft @user1
56
57 before = "<h1>Hello World</h1>\n" \
58 "<a href=\"/club\" target=\"_blank\">Linkme</a>"
59
60 after = "<h1>Hello World</h1>\n" \
61 "<a href=\"/de/club\" target=\"_blank\">Linkme</a>"
62
63 I18n.locale = :de
64
65 d.body = before
66 d.save
67
68 assert_equal after, d.body
69 end
70
71 def test_before_save_rewrite_links_in_body_if_no_locale_prefix_present
72 n = Node.create :slug => "link_test"
73 n.move_to_child_of Node.root
74 d = n.find_or_create_draft @user1
75
76 before = "<h1>Hello World</h1>\n" \
77 "<a href=\"/de/club\" target=\"_blank\">Linkme</a>"
78
79 after = "<h1>Hello World</h1>\n" \
80 "<a href=\"/de/club\" target=\"_blank\">Linkme</a>"
81
82 I18n.locale = :de
83
84 d.body = before
85 d.save
86
87 assert_equal after, d.body
88 end
89
90 def test_before_save_rewrite_links_skips_on_external_links
91 n = Node.create :slug => "link_test"
92 n.move_to_child_of Node.root
93 d = n.find_or_create_draft @user1
94
95 before = "<h1>Hello World</h1>\n" \
96 "<a href=\"http://www.ccc.de/club\" target=\"_blank\">Linkme</a>"
97
98 after = "<h1>Hello World</h1>\n" \
99 "<a href=\"http://www.ccc.de/club\" target=\"_blank\">Linkme</a>"
100
101 I18n.locale = :de
102
103 d.body = before
104 d.save
105
106 assert_equal after, d.body
107 end
51end 108end