diff options
| author | hukl <contact@smyck.org> | 2009-03-05 21:11:46 +0100 |
|---|---|---|
| committer | hukl <contact@smyck.org> | 2009-03-05 21:11:46 +0100 |
| commit | 13846d2702639c018507a5231b2efcfc5ff6683f (patch) | |
| tree | 554041d14687d91336d070e9f0bce26869d03c28 | |
| parent | a006c9c54bf19273fca2f0607c82c069623a4125 (diff) | |
rewriting url in body fields to include the locale before saving the page. xpath magick for the win!
added corresponding test of course
| -rw-r--r-- | app/models/page.rb | 28 | ||||
| -rw-r--r-- | test/unit/page_test.rb | 57 |
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 | |||
| 119 | end \ No newline at end of file | 147 | 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 | |||
| 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 | ||
| 51 | end | 108 | end |
