From 13846d2702639c018507a5231b2efcfc5ff6683f Mon Sep 17 00:00:00 2001 From: hukl Date: Thu, 5 Mar 2009 21:11:46 +0100 Subject: rewriting url in body fields to include the locale before saving the page. xpath magick for the win! added corresponding test of course --- app/models/page.rb | 28 +++++++++++++++++++++++++ test/unit/page_test.rb | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) 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 belongs_to :node belongs_to :user + # Filter + before_save :rewrite_links_in_body + # Security attr_accessible :title, :abstract, :body, :template_name @@ -116,4 +119,29 @@ class Page < ActiveRecord::Base I18n.locale = locale_before end + + private + + def rewrite_links_in_body + if self.body + tmp_body = "
#{self.body}
" + xml_string = XML::Parser.string( tmp_body ) + xml_doc = xml_string.parse + links = xml_doc.find("a[not(starts-with(@href, 'http://'))]") + + locales = I18n.available_locales.reject {|l| l == :root} + + links.each do |link| + unless locales.include? link[:href].slice(1,2).to_sym + link[:href] = link[:href].sub(/^\//, "/#{I18n.locale}/") + end + end + + tmp_body = xml_doc.to_s.gsub(/(\n\|\<\/div\>\n)/, "") + tmp_body.gsub!("", "") + + self.body = tmp_body + end + end + end \ 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 assert_equal 4, Page.find_tagged_with( "update" ).count assert_equal [d2.id, d4.id], Page.aggregate( options1 ).map {|x| x.id} end + + def test_before_save_rewrite_links_in_body + n = Node.create :slug => "link_test" + n.move_to_child_of Node.root + d = n.find_or_create_draft @user1 + + before = "

Hello World

\n" \ + "Linkme" + + after = "

Hello World

\n" \ + "Linkme" + + I18n.locale = :de + + d.body = before + d.save + + assert_equal after, d.body + end + + def test_before_save_rewrite_links_in_body_if_no_locale_prefix_present + n = Node.create :slug => "link_test" + n.move_to_child_of Node.root + d = n.find_or_create_draft @user1 + + before = "

Hello World

\n" \ + "Linkme" + + after = "

Hello World

\n" \ + "Linkme" + + I18n.locale = :de + + d.body = before + d.save + + assert_equal after, d.body + end + + def test_before_save_rewrite_links_skips_on_external_links + n = Node.create :slug => "link_test" + n.move_to_child_of Node.root + d = n.find_or_create_draft @user1 + + before = "

Hello World

\n" \ + "Linkme" + + after = "

Hello World

\n" \ + "Linkme" + + I18n.locale = :de + + d.body = before + d.save + + assert_equal after, d.body + end end -- cgit v1.3