Divide parser into sub-parsers
This commit is contained in:
		
							parent
							
								
									1f9197e438
								
							
						
					
					
						commit
						a9f06b9517
					
				|  | @ -43,7 +43,8 @@ GEM | |||
|     arel (2.2.1) | ||||
|     bcrypt-ruby (3.0.1) | ||||
|     bson (1.5.2) | ||||
|     bson_ext (1.5.1) | ||||
|     bson_ext (1.5.2) | ||||
|       bson (= 1.5.2) | ||||
|     builder (3.0.0) | ||||
|     carrierwave (0.5.4) | ||||
|       activesupport (~> 3.0) | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| class ApplicationController < ActionController::Base | ||||
|   protect_from_forgery | ||||
|    | ||||
|   include Parser | ||||
|   include ParserFrontEnd | ||||
|    | ||||
|   helper :all | ||||
|   before_filter :set_locale, :set_site | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| class Layout < DesignFile | ||||
|   include Parser | ||||
|   include ParserLayout | ||||
|    | ||||
|   attr_reader :content | ||||
|    | ||||
|  |  | |||
|  | @ -27,6 +27,7 @@ module PrototypeR4 | |||
|     # Custom directories with classes and modules you want to be autoloadable. | ||||
|     # config.autoload_paths += %W(#{config.root}/extras) | ||||
|     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/design) | ||||
|     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