require 'rexml/document' require 'rexml/xpath' module BuildMaster class Logo attr_accessor :path, :link, :text def initialize @link = 'index.html' @text = 'logo' end end class MenuGroup attr_reader :title, :link, :items, :more attr_writer :title, :link, :more def initialize(title, link) @title = title @link = link @items = Array.new end def add_to_menu_items item = MenuItem.new('item', nil) @items.push(item) return item end def menu_item(title, link) add_item(MenuItem.new(title, link)) end def add_item(item) @items.push(item) end end class MenuItem attr_reader :title, :link attr_writer :title, :link def initialize(title, link) @title = title @link = link end end class Releases attr_reader :stable_version, :pre_release_version, :snap_shot_version, :download_link, :versioning_link attr_writer :stable_version, :pre_release_version, :snap_shot_version, :download_link, :versioning_link def initialize @pre_release_version = 'n/a' @snap_shot_version = 'n/a' @download_link = 'download.html' @versioning_link = 'versioning.html' end end class TemplateBuilder attr_accessor :title_header, :css_path, :news_rss, :contact_admin attr_reader :logo, :menu_groups def initialize @title_header = '' @css_path = 'buildmaster.css' @logo = Logo.new @menu_groups = Array.new @contact_admin = 'contact.html' end def add_to_menu_groups group = MenuGroup.new('group', nil) menu_groups.push(group) return group end def menu_group(title, link = nil) group = MenuGroup.new(title, link) menu_groups.push(group) return group end def left_bottom_logo if (@left_bottom_logo.nil?) @left_bottom_logo = Logo.new end return @left_bottom_logo end def releases if (@releases.nil?) @releases = Releases.new end return @releases end def generate return load_template end def content return load_template_content end private def load_template content = load_template_content return REXML::Document.new(content) end def generate_logo_text if (logo.path) return "<img id=\"logo\" alt=\"#{logo.text}\"><template:href url=\"#{logo.path}\"/></img>" else return logo.text end end def generate_menu_groups result = "" menu_groups.each do |menu_group| menu_group_content = <<CONTENT <div class="MenuGroup"> <h1>#{generate_menu_group_content(menu_group)}</h1> <ul> #{generate_menu_group_item_content(menu_group.items)} #{generate_more_item(menu_group.more)} </ul> </div> CONTENT result += menu_group_content end return result end def generate_menu_group_content(menu_group) if (menu_group.link) return "<template:link href=\"#{menu_group.link}\">#{menu_group.title}</template:link>" else return menu_group.title end end def generate_menu_group_item_content(items) result = '' items.each do |item| item_content = <<CONTENT <li><template:link href=\"#{item.link}\">#{item.title}</template:link></li> CONTENT result = result + item_content end return result end def generate_more_item(link) return '' unless link return "<li class=\"More\"><a><template:href url=\"#{link}\"/>More...</a></li>" end def generate_left_bottom_logo() content = '' logo = left_bottom_logo() if (logo.path) content = <<CONTENT <div class="logo"> <a href="#{logo.link}"> <img alt="#{logo.text}" src="#{logo.path}" width="170"/> </a> </div> CONTENT end return content end def generate_releases if (releases.download_link.nil?) return '' end content = <<CONTENT <div class="NewsGroup"> <h1>Latest Versions</h1> <table> <tr> <td><template:link href="#{releases.download_link}#stable">Stable:</template:link></td> <td><template:link href="#{releases.download_link}#stable">#{releases.stable_version}</template:link></td> </tr> <tr> <td><template:link href="#{releases.download_link}#prerelease">Prerelease:</template:link></td> <td><template:link href="#{releases.download_link}#prerelease">#{releases.pre_release_version}</template:link></td> </tr> <tr> <td><template:link href="#{releases.download_link}#snapshot">Snapshot:</template:link></td> <td><template:link href="#{releases.download_link}#snapshot">#{releases.snap_shot_version}</template:link></td> </tr> </table> <p class="NewsMore"><template:link href="#{releases.versioning_link}">About version numbers...</template:link></p> </div> CONTENT return content end def generate_news if (news_rss.nil?) return '' end content = <<CONTENT <div class="NewsGroup"> <h1>Recent News</h1> <template:each source="#{news_rss}" select="/rss/channel/item" count="3"> <div class="NewsItem"> <p class="NewsTitle"><template:include elements="./title/text()"/></p> <p class="NewsDate"><template:include elements="./pubDate/text()"/></p> <p class="NewsText"><template:include elements="./xhtml:div/node()"/></p> </div> </template:each> <p class="NewsMore"><template:link href="#{news_rss}">News feed (RSS 2.0)</template:link></p> </div> CONTENT end def load_template_content return <<CONTENT <html xmlns="http://www.w3.org/1999/xhtml" xmlns:template="http://buildmaster.rubyforge.org/xtemplate/1.0"> <head> <title>#{title_header}<template:include elements="/html/head/title/text()"/></title> <link rel="stylesheet" type="text/css"><template:href url="#{css_path}"/></link> <template:include elements="/html/head/*[not(title()='title')]"/> </head> <body> <div class="header"> <a class="header"> <template:href url="#{logo.link}"/> #{generate_logo_text} </a> </div> <div class="left"> #{generate_menu_groups} #{generate_left_bottom_logo} </div> <template:when test="index_file?"> <div class="right"> #{generate_releases} #{generate_news} </div> </template:when> <div> <template:attribute name="class" eval="center_class"/> <div class="content"><template:include elements="/html/body/*"/></div> </div> <div class="footer"> <div class="bottomshadow"/> <div class="poweredby"> Powered by <a href="http://buildmaster.rubyforge.org" class="footer">BuildMaster</a> - <a class="footer"><template:href url="#{contact_admin}" />Contact Administrators</a> <br/> </div> </div> <div> </div> </body> </html> CONTENT end end end