From 9101a2921e5f0aecdc1bae807c5606faa12ad5ea Mon Sep 17 00:00:00 2001 From: chris2tof Date: Thu, 1 Sep 2011 19:08:45 +0800 Subject: [PATCH] Modifications for image urls Find and replace the urls by the file urls in DB, in the theme files and layout.html file. Save a copy of those files under "file_orig". --- app/controllers/gridfs_controller.rb | 38 ------------------------ app/models/design/design.rb | 35 +++++++++++++++------- app/models/design/layout.rb | 43 +++++++++++++++++++++++++--- app/models/design/theme.rb | 31 ++++++++++++++++++++ config/routes.rb | 10 ++++--- 5 files changed, 100 insertions(+), 57 deletions(-) diff --git a/app/controllers/gridfs_controller.rb b/app/controllers/gridfs_controller.rb index 89b1e69b..8a95a581 100644 --- a/app/controllers/gridfs_controller.rb +++ b/app/controllers/gridfs_controller.rb @@ -4,34 +4,6 @@ class GridfsController < ActionController::Metal def serve gridfs_path = env["PATH_INFO"].gsub("/gridfs/", "") - gridfs_file = Mongo::GridFileSystem.new(Mongoid.database).open(gridfs_path, 'r') rescue nil - if gridfs_file - self.response_body = gridfs_file.read - self.content_type = gridfs_file.content_type - else - serve_rescue(gridfs_path.split('/').pop) - end - end - - def serve_images - gridfs_path = env["PATH_INFO"] - serve_rescue(gridfs_path.split('/').pop) - end - - def serve_rescue(file_name) - referer = request.env['HTTP_REFERER'] - if referer.include?('admin') - page = Page.find(referer.split('/').pop) - else - vars = request.env['HTTP_REFERER'].split('/') - names = get_names(vars, []) - page = Page.find_by_name(names.pop) - names.reverse_each do |name| - page = page.children.find_by_name(name) - end - end - image = page.design.images.detect{|i| i.file_filename == file_name} - gridfs_path = image.file.url.gsub("/gridfs/", "") begin gridfs_file = Mongo::GridFileSystem.new(Mongoid.database).open(gridfs_path, 'r') self.response_body = gridfs_file.read @@ -43,14 +15,4 @@ class GridfsController < ActionController::Metal end end - def get_names(vars, names) - page = Page.all(:conditions => {:name => vars.last}) - names << vars.pop - if page.count > 1 - get_names(vars, names) - else - names - end - end - end \ No newline at end of file diff --git a/app/models/design/design.rb b/app/models/design/design.rb index f4eef5df..9ad94146 100644 --- a/app/models/design/design.rb +++ b/app/models/design/design.rb @@ -60,6 +60,7 @@ class Design end protected + def del_embedded_objects [[self.layout],self.themes, self.javascripts, self.images].each do |objects| objects.each do |object| @@ -67,20 +68,32 @@ class Design end end end + def procs_embedded_objects - [[self.layout],self.themes, self.javascripts, self.images].each do |objects| + [[self.layout], self.javascripts, self.images].each do |objects| objects.each do |object| - if object.file.blank? - object.to_save = false - end - if object.to_save - object.to_save = false - object.save - end - if object.to_destroy - object.destroy - end + process_object(object) end end + self.layout.parse_urls + self.themes.each do |theme| + to_parse_url = theme.to_save ? true : false + process_object(theme) + theme.parse_urls if to_parse_url + end end + + def process_object(object) + if object.file.blank? + object.to_save = false + end + if object.to_save + object.to_save = false + object.save + end + if object.to_destroy + object.destroy + end + end + end diff --git a/app/models/design/layout.rb b/app/models/design/layout.rb index aaac1b3f..729153df 100644 --- a/app/models/design/layout.rb +++ b/app/models/design/layout.rb @@ -1,10 +1,15 @@ class Layout < DesignFile include Parser + + mount_uploader :file_orig, AssetUploader + + attr_reader :content + embeds_one :menu embedded_in :design - - attr_reader :content embeds_many :layout_parts + + after_save :parse_layout def content self.file.read @@ -14,9 +19,39 @@ class Layout < DesignFile Layout.count > 0 end - after_save:parse_layout - def parse_layout parse_layout_layout_part(self) end + + def parse_urls + orig_content = content = self.file.read.force_encoding("UTF-8") + self.remove_file! + self.remove_file_orig! + names = [] + images = self.design.images + content.scan(/(?<=\)/){ + html_name = $1 + name = File.basename(html_name).gsub(/[\\\"]/, '').strip + file_name = images.detect{ |i| i.file_filename.eql?(name) }.file_url rescue nil + names << [html_name, file_name] + } + names.each do |name| + content.gsub!(name[0], name[1]) + end + Dir.mktmpdir('f_path') { |dir| + orig_file_name = self.file_filename + + temp_file = File.new(dir + '/' + orig_file_name, 'w+') + temp_file.write orig_content.force_encoding("UTF-8") + self.file_orig = temp_file + + temp_file = File.new(dir + '/' + orig_file_name, 'w+') + temp_file.write content.force_encoding("UTF-8") + self.file = temp_file + + Layout.without_callback(:save) do + self.save + end + } + end end diff --git a/app/models/design/theme.rb b/app/models/design/theme.rb index e6974181..c1c2caf6 100644 --- a/app/models/design/theme.rb +++ b/app/models/design/theme.rb @@ -1,9 +1,40 @@ class Theme < Stylesheet embedded_in :design field :name + mount_uploader :file_orig, AssetUploader before_save :set_name + def parse_urls + orig_content = content = self.file.read + self.remove_file! + self.remove_file_orig! + names = [] + images = self.design.images + content.scan(/(?<=url\()(.*?)(?=\))/){ + css_name = $1 + name = File.basename(css_name).gsub(/[\\\"]/, '') + file_name = images.detect{ |i| i.file_filename.eql?(name) }.file_url rescue nil + names << [css_name, file_name] + } + names.each do |name| + content.gsub!(name[0], name[1]) + end + Dir.mktmpdir('f_path') { |dir| + orig_file_name = self.file_filename + + temp_file = File.new(dir + '/' + orig_file_name, 'w+') + temp_file.write orig_content.force_encoding("UTF-8") + self.file_orig = temp_file + + temp_file = File.new(dir + '/' + orig_file_name, 'w+') + temp_file.write content.force_encoding("UTF-8") + self.file = temp_file + + self.save + } + end + protected def set_name diff --git a/config/routes.rb b/config/routes.rb index 5971900a..ddeddb56 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,8 +12,10 @@ PrototypeR4::Application.routes.draw do namespace :admin do resources :assets resources :designs do - get 'upload_package' ,:on => :collection - post 'upload_package' ,:on => :collection + collection do + get 'upload_package' + post 'upload_package' + end member do post 'edit_file' => 'designs#edit_file' end @@ -50,8 +52,8 @@ PrototypeR4::Application.routes.draw do # routes for gridfs files match "/gridfs/*path" => "gridfs#serve" - match "/images/*path" => "gridfs#serve_images" - match "/admin/pages/images/*path" => "gridfs#serve_images" + # match "/images/*path" => "gridfs#serve_images" + # match "/admin/pages/images/*path" => "gridfs#serve_images" # routes for pages to generate match '*page_name' => 'pages#show', :as => :page, :constraints => lambda{|request|