Divide parser into sub-parsers
This commit is contained in:
		
							parent
							
								
									1f9197e438
								
							
						
					
					
						commit
						a9f06b9517
					
				|  | @ -43,7 +43,8 @@ GEM | ||||||
|     arel (2.2.1) |     arel (2.2.1) | ||||||
|     bcrypt-ruby (3.0.1) |     bcrypt-ruby (3.0.1) | ||||||
|     bson (1.5.2) |     bson (1.5.2) | ||||||
|     bson_ext (1.5.1) |     bson_ext (1.5.2) | ||||||
|  |       bson (= 1.5.2) | ||||||
|     builder (3.0.0) |     builder (3.0.0) | ||||||
|     carrierwave (0.5.4) |     carrierwave (0.5.4) | ||||||
|       activesupport (~> 3.0) |       activesupport (~> 3.0) | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| class ApplicationController < ActionController::Base | class ApplicationController < ActionController::Base | ||||||
|   protect_from_forgery |   protect_from_forgery | ||||||
|    |    | ||||||
|   include Parser |   include ParserFrontEnd | ||||||
|    |    | ||||||
|   helper :all |   helper :all | ||||||
|   before_filter :set_locale, :set_site |   before_filter :set_locale, :set_site | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| class Layout < DesignFile | class Layout < DesignFile | ||||||
|   include Parser |   include ParserLayout | ||||||
|    |    | ||||||
|   attr_reader :content |   attr_reader :content | ||||||
|    |    | ||||||
|  |  | ||||||
|  | @ -27,6 +27,7 @@ module PrototypeR4 | ||||||
|     # Custom directories with classes and modules you want to be autoloadable. |     # Custom directories with classes and modules you want to be autoloadable. | ||||||
|     # config.autoload_paths += %W(#{config.root}/extras) |     # config.autoload_paths += %W(#{config.root}/extras) | ||||||
|     config.autoload_paths += %W(#{config.root}/lib) |     config.autoload_paths += %W(#{config.root}/lib) | ||||||
|  |     config.autoload_paths += %W(#{config.root}/lib/parsers) | ||||||
|     config.autoload_paths += %W(#{config.root}/app/models/ckeditor ) |     config.autoload_paths += %W(#{config.root}/app/models/ckeditor ) | ||||||
|     config.autoload_paths += %W(#{config.root}/app/models/design) |     config.autoload_paths += %W(#{config.root}/app/models/design) | ||||||
|     config.autoload_paths += %W(#{config.root}/app/models/purchase) |     config.autoload_paths += %W(#{config.root}/app/models/purchase) | ||||||
|  |  | ||||||
							
								
								
									
										320
									
								
								lib/parser.rb
								
								
								
								
							
							
						
						
									
										320
									
								
								lib/parser.rb
								
								
								
								
							|  | @ -1,320 +0,0 @@ | ||||||
| module Parser |  | ||||||
|   require 'radius' |  | ||||||
|    |  | ||||||
|   def parser_context(page, attributes = {},appfront_url = nil) |  | ||||||
|     Radius::Context.new do |c| |  | ||||||
|       c.define_tag 'snippet' do |tag| |  | ||||||
|         snippet = Snippet.first(:conditions => {:name => tag.attr['name']}) |  | ||||||
|         if snippet |  | ||||||
|           snippet.content |  | ||||||
|         else |  | ||||||
|           t('nothing') |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|       c.define_tag 'language_bar' do |  | ||||||
|         @site.in_use_locales.map{ |locale| |  | ||||||
|           lang = I18nVariable.first(:conditions => {:key => locale})[locale] |  | ||||||
|           if I18n.locale.to_s.eql?(locale) |  | ||||||
|             lang |  | ||||||
|           else |  | ||||||
|             "<a href='?locale=#{locale}'>#{lang}</a>" |  | ||||||
|           end |  | ||||||
|         }.join(' | ') |  | ||||||
|       end |  | ||||||
|       c.define_tag 'locale' do |tag| |  | ||||||
|         case attributes[:locale] |  | ||||||
|           when 'create' |  | ||||||
|             var = I18nVariable.new(:key => (tag.attr['name'] rescue nil), :document_class => 'Text') |  | ||||||
|             @site.valid_locales.each do |locale| |  | ||||||
|               var[locale] = tag.attr[locale] rescue nil |  | ||||||
|             end |  | ||||||
|             var.save! |  | ||||||
|             res = '' |  | ||||||
|             res << "<r:locale id='#{var.id}' "  |  | ||||||
|             res << "name='#{var.key}' " if var.key |  | ||||||
|             @site.valid_locales.each do |locale| |  | ||||||
|               res << "#{locale}='#{var[locale]}' " |  | ||||||
|             end |  | ||||||
|             res << '/>' |  | ||||||
|           when 'show' |  | ||||||
|             var = I18nVariable.find(tag.attr['id']) |  | ||||||
|             res = '' |  | ||||||
|             res << "<r:locale "  |  | ||||||
|             res << "name='#{var.key}' " if var.key |  | ||||||
|             @site.valid_locales.each do |locale| |  | ||||||
|               res << "#{locale}='#{var[locale]}' " |  | ||||||
|             end |  | ||||||
|             res << '/>' |  | ||||||
|           when 'destroy' |  | ||||||
|             var = I18nVariable.find(tag.attr['id']) |  | ||||||
|             var.destroy |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|       c.define_tag 'multi_lang' do |tag| |  | ||||||
|         tag.expand |  | ||||||
|       end |  | ||||||
|       c.define_tag 'multi_lang:lang' do |tag| |  | ||||||
|         tag.expand if tag.attr['name'].eql?(I18n.locale.to_s) |  | ||||||
|       end |  | ||||||
|       c.define_tag 'css' do |tag| |  | ||||||
|         assets = Asset.any_in(:filename => tag.attr['name'].split(',').map(&:strip)) |  | ||||||
|         res = '' |  | ||||||
|         assets.each do |asset| |  | ||||||
|           res << "<link href='#{asset.data.file.url}' rel='stylesheet' type='text/css' /> " if asset.data.file.content_type.eql?('text/css') |  | ||||||
|         end |  | ||||||
|         res |  | ||||||
|       end |  | ||||||
|       c.define_tag 'stylesheets' do |tag| |  | ||||||
|         res = '' |  | ||||||
|         res << "<link href='#{page.design.reset_css.file.url}' rel='stylesheet' type='text/css' />" if page.design.reset_css |  | ||||||
|         res << "<link href='#{page.design.default_css.file.url}' rel='stylesheet' type='text/css' /> " if page.design.default_css |  | ||||||
|         theme = page.design.themes.detect{ |d| d.id == page.theme_id  } |  | ||||||
|         res << "<link href='#{theme.file.url}' rel='stylesheet' type='text/css' />" if theme |  | ||||||
|         res |  | ||||||
|       end |  | ||||||
|       c.define_tag 'javascripts' do |tag| |  | ||||||
|         res = '' |  | ||||||
|         page.design.javascripts.each do |js| |  | ||||||
|           res << "<script type='text/javascript' src='#{js.file.url}'></script>" |  | ||||||
|         end |  | ||||||
|         res << "<script type='text/javascript' src='/static/jquery.js'></script>" |  | ||||||
|         res << "<script type='text/javascript' src='/static/kernel.js'></script>" |  | ||||||
|         res |  | ||||||
|       end |  | ||||||
|       c.define_tag 'image' do |tag| |  | ||||||
|         image = page.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } |  | ||||||
|         image = page.design.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } unless image |  | ||||||
|         image = page.design.images.detect{|image| image.name.eql?(tag.attr['name']) } unless image |  | ||||||
|         if image |  | ||||||
|           res = "<img src=#{image.file.url} " |  | ||||||
|           tag.attr.each do |l| |  | ||||||
|             res << "#{l[0]}='#{l[1]}' " |  | ||||||
|           end |  | ||||||
|           res << '>' |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|       c.define_tag 'layout_part' do |tag| |  | ||||||
|         part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } rescue nil |  | ||||||
|         part.content |  | ||||||
|       end |  | ||||||
|       c.define_tag 'content' do |tag| |  | ||||||
|         ret = '' |  | ||||||
|         if (tag.attributes["main"] == "true" && !page.module_app.nil?) |  | ||||||
|           ret << "<div id='appfrontend' class='dymanic_load' path='#{appfront_url.nil?? page.app_frontend_url : appfront_url}'></div>" |  | ||||||
|         else |  | ||||||
|           part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } rescue nil |  | ||||||
|           ret << part.content |  | ||||||
|         end |  | ||||||
|         ret |  | ||||||
|       end |  | ||||||
|       c.define_tag 'link' do |tag| |  | ||||||
|         item = Item.first(:conditions => { :full_name => tag.attr['name'] }) |  | ||||||
|         ret = '' |  | ||||||
|         ret << "<a href='#{tag.attr['name']}'>" |  | ||||||
|         ret << item.i18n_variable[I18n.locale] |  | ||||||
|         ret << '</a>' |  | ||||||
|       end |  | ||||||
|       c.define_tag 'menu' do |tag| |  | ||||||
|         home = get_homepage |  | ||||||
|         menu = page.design.layout.menu |  | ||||||
|         menu_level(home, 1, menu) |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   def parse_page(page ,appfront_url) |  | ||||||
|     if page._type == 'Page' |  | ||||||
|       layout_content = page.design.layout.content.force_encoding('UTF-8') rescue '' |  | ||||||
|       context = parser_context(page,{}, appfront_url) |  | ||||||
|       parser = Radius::Parser.new(context, :tag_prefix => 'r') |  | ||||||
|       parser.parse(parser.parse(layout_content)) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   def parse_page_edit(page) |  | ||||||
|     if page._type == 'Page' |  | ||||||
|       layout_content = page.design.layout.content.force_encoding('UTF-8') rescue '' |  | ||||||
|       context = parser_context_edit(page) |  | ||||||
|       parser = Radius::Parser.new(context, :tag_prefix => 'r') |  | ||||||
|       parser.parse(parser.parse(layout_content)) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   def parser_context_edit(page, attributes = {}) |  | ||||||
|     Radius::Context.new do |c| |  | ||||||
|       c.define_tag 'snippet' do |tag| |  | ||||||
|         snippet = Snippet.first(:conditions => {:name => tag.attr['name']}) |  | ||||||
|         if snippet |  | ||||||
|           snippet.content |  | ||||||
|         else |  | ||||||
|           t('nothing') |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|       c.define_tag 'language_bar' do |  | ||||||
|         @site.in_use_locales.map{ |locale| |  | ||||||
|           lang = I18nVariable.first(:conditions => {:key => locale})[locale] |  | ||||||
|           if I18n.locale.to_s.eql?(locale) |  | ||||||
|             lang |  | ||||||
|           else |  | ||||||
|             "<a href='?locale=#{locale}'>#{lang}</a>" |  | ||||||
|           end |  | ||||||
|         }.join(' | ') |  | ||||||
|       end |  | ||||||
|       c.define_tag 'multi_lang' do |tag| |  | ||||||
|         tag.expand |  | ||||||
|       end |  | ||||||
|       c.define_tag 'multi_lang:lang' do |tag| |  | ||||||
|         tag.expand if tag.attr['name'].eql?(I18n.locale.to_s) |  | ||||||
|       end |  | ||||||
|       c.define_tag 'css' do |tag| |  | ||||||
|         assets = Asset.any_in(:filename => tag.attr['name'].split(',').map(&:strip)) |  | ||||||
|         res = '' |  | ||||||
|         assets.each do |asset| |  | ||||||
|           res << "<link href='#{asset.data.file.url}' rel='stylesheet' type='text/css' /> " if asset.data.file.content_type.eql?('text/css') |  | ||||||
|         end |  | ||||||
|         res |  | ||||||
|       end |  | ||||||
|       c.define_tag 'image' do |tag| |  | ||||||
|         image = page.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } |  | ||||||
|         image = page.design.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } unless image |  | ||||||
|         image = page.design.images.detect{|image| image.name.eql?(tag.attr['name']) } unless image |  | ||||||
|         if image |  | ||||||
|           res = "<img src=#{image.file.url} " |  | ||||||
|           tag.attr.each do |l| |  | ||||||
|             res << "#{l[0]}='#{l[1]}' " |  | ||||||
|           end |  | ||||||
|           res << '>' |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|       c.define_tag 'stylesheets' do |tag| |  | ||||||
|         res = '' |  | ||||||
|         res << "<link href='#{page.design.reset_css.file.url}' rel='stylesheet' type='text/css' />" if page.design.reset_css |  | ||||||
|         res << "<link href='#{page.design.default_css.file.url}' rel='stylesheet' type='text/css' />" if page.design.default_css |  | ||||||
|         theme = page.design.themes.detect{ |d| d.id == page.theme_id  } |  | ||||||
|         res << "<link href='#{theme.file.url}' rel='stylesheet' type='text/css' />" if theme |  | ||||||
|         res |  | ||||||
|       end |  | ||||||
|       c.define_tag 'javascripts' do |tag| |  | ||||||
|         res = '' |  | ||||||
|         page.design.javascripts.each do |js| |  | ||||||
|           res << "<script type='text/javascript' src='#{js.file.url}'></script>" |  | ||||||
|         end |  | ||||||
|         res << "<script type='text/javascript' src='/static/jquery.js'></script>" |  | ||||||
|         res << "<script type='text/javascript' src='/static/kernel.js'></script>" |  | ||||||
|         res |  | ||||||
|       end |  | ||||||
|       c.define_tag 'layout_part' do |tag| |  | ||||||
|         part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } |  | ||||||
|         ret = '' |  | ||||||
|         ret << "<div id='#{tag.attr['name']}' part_id='#{part.id}'>" |  | ||||||
|         ret << tag.expand |  | ||||||
|         ret << '</div>' |  | ||||||
|       end |  | ||||||
|       c.define_tag 'content' do |tag| |  | ||||||
|         ret = '' |  | ||||||
|         if (tag.attributes["main"] == "true" && !page.module_app.nil?) |  | ||||||
|           ret << "<div id='appfrontend' class='dymanic_load' path='#{page.app_frontend_url}'></div>" |  | ||||||
|         else |  | ||||||
|            part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } |  | ||||||
|             ret << "<div id='#{tag.attr['name']}' part_id='#{part.id}' class='editable' style='border:solid 1px; margin:5px; padding:5px;'>" |  | ||||||
|             ret << "<div class='edit_link' style='display:none'>" |  | ||||||
|             ret << " <a href='#{edit_admin_page_part_path(part.id)}' class='nav'>#{t(:edit)}</a>" |  | ||||||
|             ret << '</div>' |  | ||||||
|             ret << part.i18n_variable[I18n.locale.to_s] rescue '' |  | ||||||
|             ret << '</div>' |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|       c.define_tag 'link' do |tag| |  | ||||||
|         item = Item.first(:conditions => { :full_name => tag.attr['name'] }) |  | ||||||
|         ret = '' |  | ||||||
|         ret << "<a href='" |  | ||||||
|         ret << eval("admin_#{item._type.downcase}_path(item.id)") |  | ||||||
|         ret << "' class='nav'>" |  | ||||||
|         ret << item.i18n_variable[I18n.locale] |  | ||||||
|         ret << "</a>" |  | ||||||
|       end |  | ||||||
|       c.define_tag 'menu' do |tag| |  | ||||||
|         home = get_homepage |  | ||||||
|         menu = page.design.layout.menu |  | ||||||
|         menu_level(home, 1, menu, true) |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   def menu_level(page, current, menu, edit = false) |  | ||||||
|     if current <= menu.levels |  | ||||||
|       res = "<ul id=" |  | ||||||
|       res << menu.values["id_#{current}"] |  | ||||||
|       res << " class=" |  | ||||||
|       res << menu.values["class_#{current}"] |  | ||||||
|       res << ">" |  | ||||||
|       i = nil |  | ||||||
|       i = 1 if menu.values["li_incremental_#{current}"] |  | ||||||
|       if current == 1 && menu.values['home'].eql?('true') |  | ||||||
|         res << menu_li(page, current, menu, i, edit) |  | ||||||
|         i += 1 if i |  | ||||||
|       end |  | ||||||
|       page.children.each do |child| |  | ||||||
|         res << menu_li(child, current, menu, i, edit) |  | ||||||
|         i += 1 if i |  | ||||||
|       end |  | ||||||
|       res << "</ul>" |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   def menu_li(page, current, menu, i, edit) |  | ||||||
|     res = "<li class=" |  | ||||||
|     res << menu.values["li_class_#{current}"] |  | ||||||
|     res << "_#{i}" if i |  | ||||||
|     res << ">" |  | ||||||
|     res << "<a href='#{edit ? admin_page_path(page.id) : page.full_name}'>#{page.name}</a>"   |  | ||||||
|     res << menu_level(page, current + 1, menu, edit) if page.children.size > 0 && !page.is_home? |  | ||||||
|     res << "</li>" |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   #============= |  | ||||||
|   def parse_layout_contents(layout) |  | ||||||
|     content = layout.content.force_encoding('UTF-8') |  | ||||||
|     context = parser_layout_contents(layout) |  | ||||||
|     parser = Radius::Parser.new(context, :tag_prefix => 'r') |  | ||||||
|     parser.parse(content) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def parser_layout_contents(layout ) |  | ||||||
|     Radius::Context.new do |c| |  | ||||||
|       c.define_tag 'javascripts' do |tag| |  | ||||||
|       end |  | ||||||
|       c.define_tag 'stylesheets' do |tag| |  | ||||||
|       end |  | ||||||
|       c.define_tag 'menu' do |tag| |  | ||||||
|         layout.build_menu(:levels => 0, :values => {}) unless layout.menu |  | ||||||
|         layout.menu.levels = i = tag.attr['level'].to_i |  | ||||||
|         layout.menu.values.merge!({'home' => tag.attr['home']}) if i == 1 |  | ||||||
|         layout.menu.values.merge!({"id_#{i}" => tag.attr['id'], "class_#{i}" => tag.attr['class'], "li_class_#{i}" => tag.attr['li_class'], "li_incremental_#{i}" => tag.attr['li_incremental']}) |  | ||||||
|         layout.menu.save |  | ||||||
|         tag.expand |  | ||||||
|       end |  | ||||||
|       c.define_tag 'content' do |tag| |  | ||||||
|         layout.layout_parts.create(:name => tag.attr['name'], :editable => true) |  | ||||||
|       end |  | ||||||
|       c.define_tag 'image' do |tag| |  | ||||||
|         image = layout.design.images.detect{ |i| i.file_filename.eql?(parse_html_image(tag.expand)) } |  | ||||||
|         image.update_attributes(:name => tag.attr['name'], :html_id => tag.attr['id'], :html_class => tag.attr['class']) |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|    |  | ||||||
|   def parse_html_image(html) |  | ||||||
|     html.scan(/(?<=\<img)(.*?)(?=\/\>)/){ |  | ||||||
|       $1.gsub(' ','').scan(/(?<=src=\")(.*?)(?=\")/){ |  | ||||||
|         return File.basename($1).gsub(/[\\\"]/, '') |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def self.included(base) |  | ||||||
|     base.send :helper_method, :parse_page if base.respond_to? :helper_method |  | ||||||
|     base.send :helper_method, :parse_page_edit if base.respond_to? :helper_method |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
| end |  | ||||||
|  | @ -0,0 +1,119 @@ | ||||||
|  | module ParserBackEnd | ||||||
|  |   require 'radius' | ||||||
|  |   include ParserCommon | ||||||
|  |    | ||||||
|  |   def parse_page_edit(page) | ||||||
|  |     if page._type == 'Page' | ||||||
|  |       layout_content = page.design.layout.content.force_encoding('UTF-8') rescue '' | ||||||
|  |       context = parser_context_edit(page) | ||||||
|  |       parser = Radius::Parser.new(context, :tag_prefix => 'r') | ||||||
|  |       parser.parse(parser.parse(layout_content)) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |    | ||||||
|  |   def parser_context_edit(page, attributes = {}) | ||||||
|  |     Radius::Context.new do |c| | ||||||
|  |       c.define_tag 'snippet' do |tag| | ||||||
|  |         snippet = Snippet.first(:conditions => {:name => tag.attr['name']}) | ||||||
|  |         if snippet | ||||||
|  |           snippet.content | ||||||
|  |         else | ||||||
|  |           t('nothing') | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |       c.define_tag 'language_bar' do | ||||||
|  |         @site.in_use_locales.map{ |locale| | ||||||
|  |           lang = I18nVariable.first(:conditions => {:key => locale})[locale] | ||||||
|  |           if I18n.locale.to_s.eql?(locale) | ||||||
|  |             lang | ||||||
|  |           else | ||||||
|  |             "<a href='?locale=#{locale}'>#{lang}</a>" | ||||||
|  |           end | ||||||
|  |         }.join(' | ') | ||||||
|  |       end | ||||||
|  |       c.define_tag 'multi_lang' do |tag| | ||||||
|  |         tag.expand | ||||||
|  |       end | ||||||
|  |       c.define_tag 'multi_lang:lang' do |tag| | ||||||
|  |         tag.expand if tag.attr['name'].eql?(I18n.locale.to_s) | ||||||
|  |       end | ||||||
|  |       c.define_tag 'css' do |tag| | ||||||
|  |         assets = Asset.any_in(:filename => tag.attr['name'].split(',').map(&:strip)) | ||||||
|  |         res = '' | ||||||
|  |         assets.each do |asset| | ||||||
|  |           res << "<link href='#{asset.data.file.url}' rel='stylesheet' type='text/css' /> " if asset.data.file.content_type.eql?('text/css') | ||||||
|  |         end | ||||||
|  |         res | ||||||
|  |       end | ||||||
|  |       c.define_tag 'image' do |tag| | ||||||
|  |         image = page.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } | ||||||
|  |         image = page.design.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } unless image | ||||||
|  |         image = page.design.images.detect{|image| image.name.eql?(tag.attr['name']) } unless image | ||||||
|  |         if image | ||||||
|  |           res = "<img src=#{image.file.url} " | ||||||
|  |           tag.attr.each do |l| | ||||||
|  |             res << "#{l[0]}='#{l[1]}' " | ||||||
|  |           end | ||||||
|  |           res << '>' | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |       c.define_tag 'stylesheets' do |tag| | ||||||
|  |         res = '' | ||||||
|  |         res << "<link href='#{page.design.reset_css.file.url}' rel='stylesheet' type='text/css' />" if page.design.reset_css | ||||||
|  |         res << "<link href='#{page.design.default_css.file.url}' rel='stylesheet' type='text/css' />" if page.design.default_css | ||||||
|  |         theme = page.design.themes.detect{ |d| d.id == page.theme_id  } | ||||||
|  |         res << "<link href='#{theme.file.url}' rel='stylesheet' type='text/css' />" if theme | ||||||
|  |         res | ||||||
|  |       end | ||||||
|  |       c.define_tag 'javascripts' do |tag| | ||||||
|  |         res = '' | ||||||
|  |         page.design.javascripts.each do |js| | ||||||
|  |           res << "<script type='text/javascript' src='#{js.file.url}'></script>" | ||||||
|  |         end | ||||||
|  |         res << "<script type='text/javascript' src='/static/jquery.js'></script>" | ||||||
|  |         res << "<script type='text/javascript' src='/static/kernel.js'></script>" | ||||||
|  |         res | ||||||
|  |       end | ||||||
|  |       c.define_tag 'layout_part' do |tag| | ||||||
|  |         part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } | ||||||
|  |         ret = '' | ||||||
|  |         ret << "<div id='#{tag.attr['name']}' part_id='#{part.id}'>" | ||||||
|  |         ret << tag.expand | ||||||
|  |         ret << '</div>' | ||||||
|  |       end | ||||||
|  |       c.define_tag 'content' do |tag| | ||||||
|  |         ret = '' | ||||||
|  |         if (tag.attributes["main"] == "true" && !page.module_app.nil?) | ||||||
|  |           ret << "<div id='appfrontend' class='dymanic_load' path='#{page.app_frontend_url}'></div>" | ||||||
|  |         else | ||||||
|  |            part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } | ||||||
|  |             ret << "<div id='#{tag.attr['name']}' part_id='#{part.id}' class='editable' style='border:solid 1px; margin:5px; padding:5px;'>" | ||||||
|  |             ret << "<div class='edit_link' style='display:none'>" | ||||||
|  |             ret << " <a href='#{edit_admin_page_part_path(part.id)}' class='nav'>#{t(:edit)}</a>" | ||||||
|  |             ret << '</div>' | ||||||
|  |             ret << part.i18n_variable[I18n.locale.to_s] rescue '' | ||||||
|  |             ret << '</div>' | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |       c.define_tag 'link' do |tag| | ||||||
|  |         item = Item.first(:conditions => { :full_name => tag.attr['name'] }) | ||||||
|  |         ret = '' | ||||||
|  |         ret << "<a href='" | ||||||
|  |         ret << eval("admin_#{item._type.downcase}_path(item.id)") | ||||||
|  |         ret << "' class='nav'>" | ||||||
|  |         ret << item.i18n_variable[I18n.locale] | ||||||
|  |         ret << "</a>" | ||||||
|  |       end | ||||||
|  |       c.define_tag 'menu' do |tag| | ||||||
|  |         home = get_homepage | ||||||
|  |         menu = page.design.layout.menu | ||||||
|  |         menu_level(home, 1, menu, true) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |    | ||||||
|  |   def self.included(base) | ||||||
|  |     base.send :helper_method, :parse_page_edit if base.respond_to? :helper_method | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  | end | ||||||
|  | @ -0,0 +1,34 @@ | ||||||
|  | module ParserCommon | ||||||
|  |   | ||||||
|  |   def menu_level(page, current, menu, edit = false) | ||||||
|  |     if current <= menu.levels | ||||||
|  |       res = "<ul id=" | ||||||
|  |       res << menu.values["id_#{current}"] | ||||||
|  |       res << " class=" | ||||||
|  |       res << menu.values["class_#{current}"] | ||||||
|  |       res << ">" | ||||||
|  |       i = nil | ||||||
|  |       i = 1 if menu.values["li_incremental_#{current}"] | ||||||
|  |       if current == 1 && menu.values['home'].eql?('true') | ||||||
|  |         res << menu_li(page, current, menu, i, edit) | ||||||
|  |         i += 1 if i | ||||||
|  |       end | ||||||
|  |       page.children.each do |child| | ||||||
|  |         res << menu_li(child, current, menu, i, edit) | ||||||
|  |         i += 1 if i | ||||||
|  |       end | ||||||
|  |       res << "</ul>" | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |    | ||||||
|  |   def menu_li(page, current, menu, i, edit) | ||||||
|  |     res = "<li class=" | ||||||
|  |     res << menu.values["li_class_#{current}"] | ||||||
|  |     res << "_#{i}" if i | ||||||
|  |     res << ">" | ||||||
|  |     res << "<a href='#{edit ? admin_page_path(page.id) : page.full_name}'>#{page.name}</a>"   | ||||||
|  |     res << menu_level(page, current + 1, menu, edit) if page.children.size > 0 && !page.is_home? | ||||||
|  |     res << "</li>" | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  | end | ||||||
|  | @ -0,0 +1,139 @@ | ||||||
|  | module ParserFrontEnd | ||||||
|  |   require 'radius' | ||||||
|  |   include ParserCommon | ||||||
|  | 
 | ||||||
|  |   def parser_context(page, attributes = {},appfront_url = nil) | ||||||
|  |     Radius::Context.new do |c| | ||||||
|  |       c.define_tag 'snippet' do |tag| | ||||||
|  |         snippet = Snippet.first(:conditions => {:name => tag.attr['name']}) | ||||||
|  |         if snippet | ||||||
|  |           snippet.content | ||||||
|  |         else | ||||||
|  |           t('nothing') | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |       c.define_tag 'language_bar' do | ||||||
|  |         @site.in_use_locales.map{ |locale| | ||||||
|  |           lang = I18nVariable.first(:conditions => {:key => locale})[locale] | ||||||
|  |           if I18n.locale.to_s.eql?(locale) | ||||||
|  |             lang | ||||||
|  |           else | ||||||
|  |             "<a href='?locale=#{locale}'>#{lang}</a>" | ||||||
|  |           end | ||||||
|  |         }.join(' | ') | ||||||
|  |       end | ||||||
|  |       c.define_tag 'locale' do |tag| | ||||||
|  |         case attributes[:locale] | ||||||
|  |           when 'create' | ||||||
|  |             var = I18nVariable.new(:key => (tag.attr['name'] rescue nil), :document_class => 'Text') | ||||||
|  |             @site.valid_locales.each do |locale| | ||||||
|  |               var[locale] = tag.attr[locale] rescue nil | ||||||
|  |             end | ||||||
|  |             var.save! | ||||||
|  |             res = '' | ||||||
|  |             res << "<r:locale id='#{var.id}' "  | ||||||
|  |             res << "name='#{var.key}' " if var.key | ||||||
|  |             @site.valid_locales.each do |locale| | ||||||
|  |               res << "#{locale}='#{var[locale]}' " | ||||||
|  |             end | ||||||
|  |             res << '/>' | ||||||
|  |           when 'show' | ||||||
|  |             var = I18nVariable.find(tag.attr['id']) | ||||||
|  |             res = '' | ||||||
|  |             res << "<r:locale "  | ||||||
|  |             res << "name='#{var.key}' " if var.key | ||||||
|  |             @site.valid_locales.each do |locale| | ||||||
|  |               res << "#{locale}='#{var[locale]}' " | ||||||
|  |             end | ||||||
|  |             res << '/>' | ||||||
|  |           when 'destroy' | ||||||
|  |             var = I18nVariable.find(tag.attr['id']) | ||||||
|  |             var.destroy | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |       c.define_tag 'multi_lang' do |tag| | ||||||
|  |         tag.expand | ||||||
|  |       end | ||||||
|  |       c.define_tag 'multi_lang:lang' do |tag| | ||||||
|  |         tag.expand if tag.attr['name'].eql?(I18n.locale.to_s) | ||||||
|  |       end | ||||||
|  |       c.define_tag 'css' do |tag| | ||||||
|  |         assets = Asset.any_in(:filename => tag.attr['name'].split(',').map(&:strip)) | ||||||
|  |         res = '' | ||||||
|  |         assets.each do |asset| | ||||||
|  |           res << "<link href='#{asset.data.file.url}' rel='stylesheet' type='text/css' /> " if asset.data.file.content_type.eql?('text/css') | ||||||
|  |         end | ||||||
|  |         res | ||||||
|  |       end | ||||||
|  |       c.define_tag 'stylesheets' do |tag| | ||||||
|  |         res = '' | ||||||
|  |         res << "<link href='#{page.design.reset_css.file.url}' rel='stylesheet' type='text/css' />" if page.design.reset_css | ||||||
|  |         res << "<link href='#{page.design.default_css.file.url}' rel='stylesheet' type='text/css' /> " if page.design.default_css | ||||||
|  |         theme = page.design.themes.detect{ |d| d.id == page.theme_id  } | ||||||
|  |         res << "<link href='#{theme.file.url}' rel='stylesheet' type='text/css' />" if theme | ||||||
|  |         res | ||||||
|  |       end | ||||||
|  |       c.define_tag 'javascripts' do |tag| | ||||||
|  |         res = '' | ||||||
|  |         page.design.javascripts.each do |js| | ||||||
|  |           res << "<script type='text/javascript' src='#{js.file.url}'></script>" | ||||||
|  |         end | ||||||
|  |         res << "<script type='text/javascript' src='/static/jquery.js'></script>" | ||||||
|  |         res << "<script type='text/javascript' src='/static/kernel.js'></script>" | ||||||
|  |         res | ||||||
|  |       end | ||||||
|  |       c.define_tag 'image' do |tag| | ||||||
|  |         image = page.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } | ||||||
|  |         image = page.design.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } unless image | ||||||
|  |         image = page.design.images.detect{|image| image.name.eql?(tag.attr['name']) } unless image | ||||||
|  |         if image | ||||||
|  |           res = "<img src=#{image.file.url} " | ||||||
|  |           tag.attr.each do |l| | ||||||
|  |             res << "#{l[0]}='#{l[1]}' " | ||||||
|  |           end | ||||||
|  |           res << '>' | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  |       c.define_tag 'layout_part' do |tag| | ||||||
|  |         part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } rescue nil | ||||||
|  |         part.content | ||||||
|  |       end | ||||||
|  |       c.define_tag 'content' do |tag| | ||||||
|  |         ret = '' | ||||||
|  |         if (tag.attributes["main"] == "true" && !page.module_app.nil?) | ||||||
|  |           ret << "<div id='appfrontend' class='dymanic_load' path='#{appfront_url.nil?? page.app_frontend_url : appfront_url}'></div>" | ||||||
|  |         else | ||||||
|  |           part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } rescue nil | ||||||
|  |           ret << part.content | ||||||
|  |         end | ||||||
|  |         ret | ||||||
|  |       end | ||||||
|  |       c.define_tag 'link' do |tag| | ||||||
|  |         item = Item.first(:conditions => { :full_name => tag.attr['name'] }) | ||||||
|  |         ret = '' | ||||||
|  |         ret << "<a href='#{tag.attr['name']}'>" | ||||||
|  |         ret << item.i18n_variable[I18n.locale] | ||||||
|  |         ret << '</a>' | ||||||
|  |       end | ||||||
|  |       c.define_tag 'menu' do |tag| | ||||||
|  |         home = get_homepage | ||||||
|  |         menu = page.design.layout.menu | ||||||
|  |         menu_level(home, 1, menu) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |    | ||||||
|  |   def parse_page(page ,appfront_url) | ||||||
|  |     if page._type == 'Page' | ||||||
|  |       layout_content = page.design.layout.content.force_encoding('UTF-8') rescue '' | ||||||
|  |       context = parser_context(page,{}, appfront_url) | ||||||
|  |       parser = Radius::Parser.new(context, :tag_prefix => 'r') | ||||||
|  |       parser.parse(parser.parse(layout_content)) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |    | ||||||
|  |   def self.included(base) | ||||||
|  |     base.send :helper_method, :parse_page if base.respond_to? :helper_method | ||||||
|  |   end | ||||||
|  |    | ||||||
|  | end | ||||||
|  | @ -0,0 +1,36 @@ | ||||||
|  | module ParserLayout | ||||||
|  |   require 'radius' | ||||||
|  |   include ParserCommon | ||||||
|  | 
 | ||||||
|  |   def parse_layout_contents(layout) | ||||||
|  |     content = layout.content.force_encoding('UTF-8') | ||||||
|  |     context = parser_layout_contents(layout) | ||||||
|  |     parser = Radius::Parser.new(context, :tag_prefix => 'r') | ||||||
|  |     parser.parse(content) | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def parser_layout_contents(layout) | ||||||
|  |     Radius::Context.new do |c| | ||||||
|  |       c.define_tag 'javascripts' do |tag| | ||||||
|  |       end | ||||||
|  |       c.define_tag 'stylesheets' do |tag| | ||||||
|  |       end | ||||||
|  |       c.define_tag 'menu' do |tag| | ||||||
|  |         layout.build_menu(:levels => 0, :values => {}) unless layout.menu | ||||||
|  |         layout.menu.levels = i = tag.attr['level'].to_i | ||||||
|  |         layout.menu.values.merge!({'home' => tag.attr['home']}) if i == 1 | ||||||
|  |         layout.menu.values.merge!({"id_#{i}" => tag.attr['id'], "class_#{i}" => tag.attr['class'], "li_class_#{i}" => tag.attr['li_class'], "li_incremental_#{i}" => tag.attr['li_incremental']}) | ||||||
|  |         layout.menu.save | ||||||
|  |         tag.expand | ||||||
|  |       end | ||||||
|  |       c.define_tag 'content' do |tag| | ||||||
|  |         layout.layout_parts.create(:name => tag.attr['name'], :editable => true) | ||||||
|  |       end | ||||||
|  |       c.define_tag 'image' do |tag| | ||||||
|  |         image = layout.design.images.detect{ |i| i.file_filename.eql?(parse_html_image(tag.expand)) } | ||||||
|  |         image.update_attributes(:name => tag.attr['name'], :html_id => tag.attr['id'], :html_class => tag.attr['class']) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |    | ||||||
|  | end | ||||||
		Loading…
	
		Reference in New Issue