module Parser def parser_context(page_content, attributes = {}) Radius::Context.new do |c| c.define_tag 'content' do |tag| page_content end 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 else tag.attr[I18n.locale.to_s] rescue nil end 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| asset = Asset.find(tag.attr['id']) if asset res = "' end end end end def parse_content(page_content, attributes = {}) context = parser_context(page_content, attributes) parser = Radius::Parser.new(context, :tag_prefix => 'r') parser.parse(page_content) end def parse_page(page) if page._type == 'Page' layout_content = (page.layout)? page.layout.content : "" context = parser_context(page.content) 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