From a9f06b951787160ee501bd06c71fd421f45fd7e0 Mon Sep 17 00:00:00 2001 From: chris2tof Date: Thu, 22 Dec 2011 16:23:48 +0800 Subject: [PATCH] Divide parser into sub-parsers --- Gemfile.lock | 3 +- app/controllers/application_controller.rb | 2 +- app/models/design/layout.rb | 2 +- config/application.rb | 1 + lib/parser.rb | 320 ---------------------- lib/parsers/parser_back_end.rb | 119 ++++++++ lib/parsers/parser_common.rb | 34 +++ lib/parsers/parser_front_end.rb | 139 ++++++++++ lib/parsers/parser_layout.rb | 36 +++ 9 files changed, 333 insertions(+), 323 deletions(-) delete mode 100644 lib/parser.rb create mode 100644 lib/parsers/parser_back_end.rb create mode 100644 lib/parsers/parser_common.rb create mode 100644 lib/parsers/parser_front_end.rb create mode 100644 lib/parsers/parser_layout.rb diff --git a/Gemfile.lock b/Gemfile.lock index 8e073610..fcf8f0b9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index cf04bfe0..481c893f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,7 +1,7 @@ class ApplicationController < ActionController::Base protect_from_forgery - include Parser + include ParserFrontEnd helper :all before_filter :set_locale, :set_site diff --git a/app/models/design/layout.rb b/app/models/design/layout.rb index 7ae4ceef..0b3bf7d9 100644 --- a/app/models/design/layout.rb +++ b/app/models/design/layout.rb @@ -1,5 +1,5 @@ class Layout < DesignFile - include Parser + include ParserLayout attr_reader :content diff --git a/config/application.rb b/config/application.rb index 0e438497..36e1006e 100644 --- a/config/application.rb +++ b/config/application.rb @@ -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) diff --git a/lib/parser.rb b/lib/parser.rb deleted file mode 100644 index 389ea35a..00000000 --- a/lib/parser.rb +++ /dev/null @@ -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 - "#{lang}" - 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 << "' - when 'show' - var = I18nVariable.find(tag.attr['id']) - res = '' - 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 << " " if asset.data.file.content_type.eql?('text/css') - end - res - end - c.define_tag 'stylesheets' do |tag| - res = '' - res << "" if page.design.reset_css - res << " " if page.design.default_css - theme = page.design.themes.detect{ |d| d.id == page.theme_id } - res << "" if theme - res - end - c.define_tag 'javascripts' do |tag| - res = '' - page.design.javascripts.each do |js| - res << "" - end - res << "" - res << "" - 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 = "' - 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 << "
" - 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 << "" - ret << item.i18n_variable[I18n.locale] - ret << '' - 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 - "#{lang}" - 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 << " " 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 = "' - end - end - c.define_tag 'stylesheets' do |tag| - res = '' - res << "" if page.design.reset_css - res << "" if page.design.default_css - theme = page.design.themes.detect{ |d| d.id == page.theme_id } - res << "" if theme - res - end - c.define_tag 'javascripts' do |tag| - res = '' - page.design.javascripts.each do |js| - res << "" - end - res << "" - res << "" - 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 << "
" - ret << tag.expand - ret << '
' - end - c.define_tag 'content' do |tag| - ret = '' - if (tag.attributes["main"] == "true" && !page.module_app.nil?) - ret << "
" - else - part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } - ret << "
" - ret << "' - ret << part.i18n_variable[I18n.locale.to_s] rescue '' - ret << '
' - end - end - c.define_tag 'link' do |tag| - item = Item.first(:conditions => { :full_name => tag.attr['name'] }) - ret = '' - ret << "" - ret << item.i18n_variable[I18n.locale] - ret << "" - 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 = "" - end - end - - def menu_li(page, current, menu, i, edit) - res = "" - 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(/(?<=\)/){ - $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 diff --git a/lib/parsers/parser_back_end.rb b/lib/parsers/parser_back_end.rb new file mode 100644 index 00000000..d11ce9b2 --- /dev/null +++ b/lib/parsers/parser_back_end.rb @@ -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 + "#{lang}" + 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 << " " 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 = "' + end + end + c.define_tag 'stylesheets' do |tag| + res = '' + res << "" if page.design.reset_css + res << "" if page.design.default_css + theme = page.design.themes.detect{ |d| d.id == page.theme_id } + res << "" if theme + res + end + c.define_tag 'javascripts' do |tag| + res = '' + page.design.javascripts.each do |js| + res << "" + end + res << "" + res << "" + 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 << "
" + ret << tag.expand + ret << '
' + end + c.define_tag 'content' do |tag| + ret = '' + if (tag.attributes["main"] == "true" && !page.module_app.nil?) + ret << "
" + else + part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } + ret << "
" + ret << "' + ret << part.i18n_variable[I18n.locale.to_s] rescue '' + ret << '
' + end + end + c.define_tag 'link' do |tag| + item = Item.first(:conditions => { :full_name => tag.attr['name'] }) + ret = '' + ret << "" + ret << item.i18n_variable[I18n.locale] + ret << "" + 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 diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb new file mode 100644 index 00000000..e96c9201 --- /dev/null +++ b/lib/parsers/parser_common.rb @@ -0,0 +1,34 @@ +module ParserCommon + + def menu_level(page, current, menu, edit = false) + if current <= menu.levels + res = "" + end + end + + def menu_li(page, current, menu, i, edit) + res = "" + end + +end diff --git a/lib/parsers/parser_front_end.rb b/lib/parsers/parser_front_end.rb new file mode 100644 index 00000000..660a779b --- /dev/null +++ b/lib/parsers/parser_front_end.rb @@ -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 + "#{lang}" + 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 << "' + when 'show' + var = I18nVariable.find(tag.attr['id']) + res = '' + 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 << " " if asset.data.file.content_type.eql?('text/css') + end + res + end + c.define_tag 'stylesheets' do |tag| + res = '' + res << "" if page.design.reset_css + res << " " if page.design.default_css + theme = page.design.themes.detect{ |d| d.id == page.theme_id } + res << "" if theme + res + end + c.define_tag 'javascripts' do |tag| + res = '' + page.design.javascripts.each do |js| + res << "" + end + res << "" + res << "" + 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 = "' + 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 << "
" + 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 << "" + ret << item.i18n_variable[I18n.locale] + ret << '' + 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 diff --git a/lib/parsers/parser_layout.rb b/lib/parsers/parser_layout.rb new file mode 100644 index 00000000..c97b8df2 --- /dev/null +++ b/lib/parsers/parser_layout.rb @@ -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