diff --git a/Scripts/CentOS-Web/Apps/page.py b/Scripts/CentOS-Web/Apps/page.py new file mode 100755 index 0000000..ce958c6 --- /dev/null +++ b/Scripts/CentOS-Web/Apps/page.py @@ -0,0 +1,483 @@ +#!/usr/bin/python +# +# Apps.xhtml -- This module encapsulates XHTML output code needed by +# web applications. +# +# Copyright (C) 2011 The CentOS Project +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# ---------------------------------------------------------------------- +# $Id$ +# ---------------------------------------------------------------------- + +import os +import cgi +import cgitb; cgitb.enable() + +class Page: + """Xhtml page modeling.""" + + + def __init__(self): + """Initialize page data.""" + self.qs = cgi.parse_qs(os.environ['QUERY_STRING']) + self.name = 'Home' + self.title = 'The CentOS Project' + self.description = 'Community Enterprise Operating System' + self.keywords = 'centos, project, community, enterprise, operating system' + self.copyright = '2009-2011 The CentOS Project. All rights reserved.' + self.language = 'en' + + + def tag(self, name, attrs, indent=[8,1], content="", has_child=0): + """Returns XHTML tag definition. + + Arguments: + + name: The XHTML tag's name. Notice that this function doesn't + verify nor validate the XHTML tags you provide. It is up + to you write them correctly considering the XHTML standard + definition. + + attrs: The XHTML tag's attribute. Notice that this function + doesn't verify the attributes assignation to tags. You + need to know what attributes are considered valid to the + tag you are creating in order to build a well-formed XHTML + document. Such verification can be achived inside firefox + browser through the `firebug' plugin. + + indent: The XHTML tag's indentation (Optional). This argument + is a list of two numerical values. The first value in the + list represents the amount of horizontal spaces between + the beginning of line and the opening tag. The second + value in the list represents the amount of vertical spaces + (new lines) between tags. + + content: The XHTML tag's content (Optional). This argument + provides the information the tag encloses. When this + argument is empty, tag is rendered without content. + + has_child: The XHTML tag has a child? (Optional). This + argument is specifies whether a tag has another tag inside + (1) or not (0). When a tag has not a child tag, + indentation is applied between the tag content and the + closing tag provoking an unecessary spaces to be shown. + Such kind of problems are prevented by setting this option + to `0'. On the other hand, when a tag has a child tag + inside, using the value `1' will keep the closing tag + indentation aligned with the opening one. + + This function encapsulates the construction of XHTML tags. + Use this function wherever you need to create XHTML tags. It + helps to standardize tag constructions and their final output + and. This function provides a consistent way of producing + output for XHTML documents. + """ + if indent[0] > 0: + h_indent = ' '*indent[0] + else: + h_indent = '' + + if indent[1] > 0: + v_indent = "\n"*indent[1] + else: + v_indent = '' + + output = v_indent + h_indent + '<' + str(name) + if len(attrs) > 0: + attr_names = attrs.keys() + attr_names.sort() + for attr_name in attr_names: + output += ' ' + str(attr_name) + '="' + str(attrs[attr_name]) + '"' + if content == '': + output += ' />' + else: + output += '>' + output += str(content) + if has_child == 1: + output += h_indent + '' + else: + output += '' + output += v_indent + + return output + + + def page_preamble(self): + """Return XHTML code of page preamble. + + The page preamble sets the document type definition required + by the XHTML standard. + + """ + output = '' + "\n" + output += '' + "\n" + + return output + + + def page_logo(self): + """Returns XHTML code of page logo. + + The page logo is displayed on the top-left corner of the page. + We use this area to show The CentOS Logo, the main visual + representation of The CentOS Project. In order to print the + page logo correctly, the image related must be 78 pixels of + height. + + """ + attrs = [] + attrs.append({'id': 'logo'}) + attrs.append({'title': 'Community Enterprise Operating System', 'href': '/centos-web/'}) + attrs.append({'src': '/centos-web-pub/Images/centos-logo.png', 'alt': 'CentOS'}) + + return self.tag('div', attrs[0], [8,1], self.tag('a', attrs[1], [12,1], self.tag('img', attrs[2], [0,0], '', 0), 0), 1) + + + def page_ads_google(self): + """Returns XHTML code of Google advertisement (468x60 pixels).""" + output = """ +
+ Google Advertisement + + +
+ +

+ """ + return output + + + def page_navibar_top(self): + """Returns XHTML code of top-level navigation bar. + + The top-level navigation bar organizes links to the web + application The CentOS Project makes use of. Links in the + top-level navigation bar remain always visible, no matter what + web application you be visiting. + + Notice that web application differe one another and is not + convenient to point them all to this definition. Instead, a + specific definition for each web application will be created + (based on this definition) in order for them to give the + impression of being connected. In this process, the top-level + navigation bar is adapted to each web application + characteristics and the related tab is set as current. + + """ + names = ['Home', 'Wiki', 'Lists', 'Forums', 'Projects', 'Bugs', 'Docs', 'Downloads', 'Sponsors'] + attrs = [] + focus = self.name + + for i in range(len(names)): + attrs.append({'href': '/centos-web/?app=' + names[i].lower()}) + + tabs = self.page_navibar_tabs(names, attrs, focus) + tabs += self.page_line() + + return tabs + + + def page_navibar_tabs(self, names, attrs, focus=''): + """Returns navigation tabs. + + Arguments: + + names: List of tab names. + + attrs: List of dictionaries for each tab name inside the + `names' list. Dictionaries inside attrs argument contain + the XHTML link attributes (e.g., accesskey, title, and + href) used by tab names so they can be linkable once + rendered. + + focus: Name of the tab marked as current. When no value is + passed to this argument the `Home' value is used as + default value. + + """ + navibar_tabs = '' + + for i in range(len(names)): + content = self.tag('span', '', [0,0], str(names[i])) + content = self.tag('a', attrs[i], [16,1], content) + if str(names[i]).lower() == focus.lower(): + content = self.tag('span', {'class': 'current'}, [12,1], content, 1) + else: + content = self.tag('span', '', [12,1], content, 1) + navibar_tabs += content + + return self.tag('div', {'class': 'tabs'}, [8,1], navibar_tabs, 1) + + + def page_lastreleases(self, names=['6.0'], attrs=[{'href': '/centos-web/?p=releases&id=6.0'}]): + """Returns last-release information and related RSS link.""" + releases = '' + + title = self.tag('a', {'href': '/centos-web/?p=releases'}, [0,0], 'Last Releases') + ':' + title = self.tag('span', {'class': 'title'}, [16,1], title) + + for i in range(len(names)): + link = self.tag('a', attrs[i], [20,1], names[i]) + if i == len(names) - 1: + span = self.tag('span', {'class': 'last release'}, [16,1], link, 1) + else: + span = self.tag('span', {'class': 'release'}, [16,1], link, 1) + releases += span + releases = self.tag('div', {'class': 'left'}, [12,1], title + releases, 1) + + rsslink = self.tag('span', '', [0,0], 'RSS') + rsslink = self.tag('a', {'href': '/centos-web/?print=rss', 'title': 'RSS'}, [20,1], rsslink) + rsslink = self.tag('span', {'class': 'rss'}, [16,1], rsslink, 1) + rsslink = self.tag('div', {'class': 'right'}, [12, 1], rsslink, 1) + + return self.tag('div', {'id': 'last-releases'}, [8,1], releases + rsslink, 1) + + + def page_appslinks(self): + """Returns application related links.""" + appslinks = self.page_userlinks() + return self.tag('div', {'id': 'appslinks'}, [8,1], appslinks, 1) + + + def page_lastvisit(self): + last_visit = self.tag('a', {'href': '/centos-web/?p=lastvisit'}, [0,0], 'Your last visit was at') + last_visit = self.tag('span', {'class': 'title'}, [16, 1], last_visit) + last_visit += self.tag('span', {'class': 'datetime'}, [16, 1], '...') + return self.tag('div', {'class': 'lastvisit'}, [12, 1], last_visit, 1) + + + def page_session(self): + """Returns information related to user's session.""" + names = [] + attrs = [] + session = '' + + names.append('Lost your password?') + attrs.append({'href': '/centos-web/?p=lostpwd'}) + names.append('Register') + attrs.append({'href': '/centos-web/?p=register'}) + names.append('Login') + attrs.append({'href': '/centos-web/?p=login'}) + + for i in range(len(names)): + output = self.tag('a', attrs[i], [20,1], str(names[i]), 0) + if i == len(names) - 1: + output = self.tag('span', {'class': 'last'}, [16,1], output, 1) + else: + output = self.tag('span', '', [16,1], output, 1) + session += output + + return self.tag('div', {'class': 'session'}, [12,1], session, 1) + + + def page_trail(self, names=['None'], attrs=[{'href': '/centos-web/'}]): + """Returns page trails (a.k.a. breadcrumbs). + + The page breadcrumbs record the last pages visited inside the + current web application. Notice that page breadcrumbs are + user-specific information, so it isn't possible to implement + them until a way to manage user sessions be implemeneted + inside `centos-web.cgi' script. Until then, keep the tag + construction commented and return an empty value. + + """ + links = '' + + for i in range(len(names)): + if i == len(names) - 1: + content = self.tag('span', {'class':'last'}, [16,1], self.tag('a', attrs[i], [20, 1], names[i]), 1) + else: + content = self.tag('span', '', [16,1], self.tag('a', attrs[i], [20, 1], names[i], 0), 1) + links += content + + return self.tag('div', {'class': 'trail'}, [12,1], links, 1) + + + def page_userlinks(self): + """Returns user links. + + Arguments: + + names: List of links you want to have. + + attrs: List of dictionaries with link attributes. In order for + links to be built correctly, both names and attrs lists + must coincide their indexes. + + The user links are specific to each web application. They are + shown in the right-top corner of the application navigation + bar, just over the application navigation tabs. + + """ + userlinks = self.page_lastvisit() + userlinks += self.page_session() + userlinks += self.page_trail() + + return self.tag('div', {'class': 'userlinks'}, [8,1], userlinks, 1) + + + def page_navibar_app(self, names=['Welcome'], attrs=[{'href':'/centos-web/?p=welcome'}], focus='Welcome'): + """Returns application's navigation bar.""" + + navibar_app = self.page_navibar_tabs(names, attrs, focus) + navibar_app += self.page_line({'class': 'page-line white'}, [8,1]) + + return navibar_app + + + def page_line(self, attrs={'class': 'page-line'}, indent=[8,1]): + """Returns a division line.""" + page_line = self.tag('hr', {'style': 'display:none;'}, [0,0]) + page_line = self.tag('div', attrs, indent, page_line) + + return page_line + + + def page_license(self): + """Retruns link to page license.""" + license = 'Creative Commons Attribution-Share Alike 3.0 Unported License' + license = self.tag('a', {'href': 'http://creativecommons.org/licenses/by-sa/3.0/'}, [0,0], license) + '.' + + return license + + + def page_metadata(self): + """Returns page metadata.""" + metadata = self.tag('meta', {'http-equiv': 'content-type', 'content': 'text/html; charset=UTF-8'}, [4,1]) + metadata += self.tag('meta', {'http-equiv': 'content-style-type', 'content': 'text/css'}, [4,0]) + metadata += self.tag('meta', {'http-equiv': 'content-language', 'content': str(self.language)}, [4,1]) + metadata += self.tag('meta', {'name': 'keywords', 'content': str(self.keywords)}, [4,0]) + metadata += self.tag('meta', {'name': 'description', 'content': str(self.description)}, [4,1]) + metadata += self.tag('meta', {'name': 'copyright', 'content': 'Copyright © ' + str(self.copyright)}, [4,0]) + metadata += self.tag('title', '', [4,1], self.title) + metadata += self.tag('link', {'href': '/centos-web-pub/stylesheet.css','rel': 'stylesheet', 'type': 'text/css'}, [4,0]) + metadata += self.tag('link', {'href': '/centos-web-pub/Images/centos-fav.png', 'rel': 'shortcut icon', 'type': 'image/png'}, [4,1]) + + return self.tag('head', '', [0,1], metadata) + + + def page_content(self, content='Page empty.'): + """Returns page content.""" + return content + + + def page_admonition(self, title='Note', subtitle="", content=""): + """Returns page admonition. + + Arguments: + + title: Admonition's title. + + subtitle: Admonition's subtitle. The value of this argument is + concatenated on the right side of title using a colon (:) + as separator. Notice that this value is expanded inside + the

tag and there is no need to introduce extra tags + here. + + content: Admonition's content. The values passed through this + arguments needs to be XHTML code returned from + `self.tag()'. Preferably, paragraphs (p), tables (table), + lists (ul, ol, dl) and pre-formatted texts (pre). + + """ + if title == '': + return '' + else: + title = str(title.capitalize()) + + if subtitle != '': + subtitle = ': ' + str(subtitle.capitalize()) + + if content != '': + content = str(content) + + admonitions = ['Note', 'Tip', 'Important', 'Caution', 'Warning', 'Redirected', 'Success', 'Error'] + + if title in admonitions: + attrs = {'class': 'admonition ' + title.lower()} + image = self.tag('img', {'src': '/centos-web-pub/Images/' + title.lower() + '.png', 'alt': title}, [0,0]) + title = self.tag('h3', {'class': 'title'}, [0,0], title + subtitle, 0) + output = image + title + content + self.page_line() + else: + attrs = {'class': 'admonition unknown'} + title = self.tag('h3', {'class': 'title'}, [16,1], title + subtitle, 1) + output = title + content + + return self.tag('div', attrs, [12,1], output, 1) + + + def page_credits(self): + """Returns page credits.""" + copyright = self.tag('p', {'class': 'copyright'}, [12,1], 'Copyright © ' + str(self.copyright)) + license = self.tag('p', {'class': 'license'}, [12,1], 'This website is licensed under a ' + str(self.page_license())) + credits = self.tag('img', {'src': '/centos-web-pub/Images/top.png', 'alt': 'Top'}, [0,0]) + credits = self.tag('a', {'title': 'Top', 'href': '#top'}, [16,1], credits) + credits = self.tag('div', {'class': 'top'}, [12,1], credits, 1) + credits = str(credits) + str(copyright) + str(license) + credits = self.tag('div', {'class': 'credits'}, [8,1], credits, 1) + + return credits + + + def page(self): + """Returns page final output.""" + page_header = self.page_logo() + page_header += self.page_ads_google() + page_header += self.page_navibar_top() + page_header += self.page_lastreleases() + page_header += self.page_appslinks() + page_header += self.page_navibar_app() + page_header = self.tag('div', {'id': 'page-header'}, [4,1], page_header, 1) + + page_body = self.page_content() + page_body = self.tag('div', {'id':'content'}, [8,1], page_body, 1) + page_body = self.tag('div', {'id':'page-body'}, [4,1], page_body, 1) + + page_footer = self.tag('div', {'id': 'page-footer'}, [4,1], self.page_credits(), 1) + + top = self.tag('a', {'name':'top'}, [0,1]) + wrap = self.tag('div', {'id': 'wrap'}, [0,1], page_header + page_body + page_footer, 1) + body = self.tag('body', '', [0,1], top + wrap) + + html = self.page_preamble() + html += self.tag('html', {'xmlns': 'http://www.w3.org/1999/xhtml', 'dir': 'ltr', + 'lang': str(self.language), 'xml:lang': + str(self.language)}, [0,1], self.page_metadata() + body) + + return html + + + def main(self): + """The Xhtml code of a complete page.""" + print self.page() diff --git a/Scripts/CentOS-Web/Apps/xhtml.py b/Scripts/CentOS-Web/Apps/xhtml.py deleted file mode 100755 index ce958c6..0000000 --- a/Scripts/CentOS-Web/Apps/xhtml.py +++ /dev/null @@ -1,483 +0,0 @@ -#!/usr/bin/python -# -# Apps.xhtml -- This module encapsulates XHTML output code needed by -# web applications. -# -# Copyright (C) 2011 The CentOS Project -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# ---------------------------------------------------------------------- -# $Id$ -# ---------------------------------------------------------------------- - -import os -import cgi -import cgitb; cgitb.enable() - -class Page: - """Xhtml page modeling.""" - - - def __init__(self): - """Initialize page data.""" - self.qs = cgi.parse_qs(os.environ['QUERY_STRING']) - self.name = 'Home' - self.title = 'The CentOS Project' - self.description = 'Community Enterprise Operating System' - self.keywords = 'centos, project, community, enterprise, operating system' - self.copyright = '2009-2011 The CentOS Project. All rights reserved.' - self.language = 'en' - - - def tag(self, name, attrs, indent=[8,1], content="", has_child=0): - """Returns XHTML tag definition. - - Arguments: - - name: The XHTML tag's name. Notice that this function doesn't - verify nor validate the XHTML tags you provide. It is up - to you write them correctly considering the XHTML standard - definition. - - attrs: The XHTML tag's attribute. Notice that this function - doesn't verify the attributes assignation to tags. You - need to know what attributes are considered valid to the - tag you are creating in order to build a well-formed XHTML - document. Such verification can be achived inside firefox - browser through the `firebug' plugin. - - indent: The XHTML tag's indentation (Optional). This argument - is a list of two numerical values. The first value in the - list represents the amount of horizontal spaces between - the beginning of line and the opening tag. The second - value in the list represents the amount of vertical spaces - (new lines) between tags. - - content: The XHTML tag's content (Optional). This argument - provides the information the tag encloses. When this - argument is empty, tag is rendered without content. - - has_child: The XHTML tag has a child? (Optional). This - argument is specifies whether a tag has another tag inside - (1) or not (0). When a tag has not a child tag, - indentation is applied between the tag content and the - closing tag provoking an unecessary spaces to be shown. - Such kind of problems are prevented by setting this option - to `0'. On the other hand, when a tag has a child tag - inside, using the value `1' will keep the closing tag - indentation aligned with the opening one. - - This function encapsulates the construction of XHTML tags. - Use this function wherever you need to create XHTML tags. It - helps to standardize tag constructions and their final output - and. This function provides a consistent way of producing - output for XHTML documents. - """ - if indent[0] > 0: - h_indent = ' '*indent[0] - else: - h_indent = '' - - if indent[1] > 0: - v_indent = "\n"*indent[1] - else: - v_indent = '' - - output = v_indent + h_indent + '<' + str(name) - if len(attrs) > 0: - attr_names = attrs.keys() - attr_names.sort() - for attr_name in attr_names: - output += ' ' + str(attr_name) + '="' + str(attrs[attr_name]) + '"' - if content == '': - output += ' />' - else: - output += '>' - output += str(content) - if has_child == 1: - output += h_indent + '' - else: - output += '' - output += v_indent - - return output - - - def page_preamble(self): - """Return XHTML code of page preamble. - - The page preamble sets the document type definition required - by the XHTML standard. - - """ - output = '' + "\n" - output += '' + "\n" - - return output - - - def page_logo(self): - """Returns XHTML code of page logo. - - The page logo is displayed on the top-left corner of the page. - We use this area to show The CentOS Logo, the main visual - representation of The CentOS Project. In order to print the - page logo correctly, the image related must be 78 pixels of - height. - - """ - attrs = [] - attrs.append({'id': 'logo'}) - attrs.append({'title': 'Community Enterprise Operating System', 'href': '/centos-web/'}) - attrs.append({'src': '/centos-web-pub/Images/centos-logo.png', 'alt': 'CentOS'}) - - return self.tag('div', attrs[0], [8,1], self.tag('a', attrs[1], [12,1], self.tag('img', attrs[2], [0,0], '', 0), 0), 1) - - - def page_ads_google(self): - """Returns XHTML code of Google advertisement (468x60 pixels).""" - output = """ -
- Google Advertisement - - -
- -

- """ - return output - - - def page_navibar_top(self): - """Returns XHTML code of top-level navigation bar. - - The top-level navigation bar organizes links to the web - application The CentOS Project makes use of. Links in the - top-level navigation bar remain always visible, no matter what - web application you be visiting. - - Notice that web application differe one another and is not - convenient to point them all to this definition. Instead, a - specific definition for each web application will be created - (based on this definition) in order for them to give the - impression of being connected. In this process, the top-level - navigation bar is adapted to each web application - characteristics and the related tab is set as current. - - """ - names = ['Home', 'Wiki', 'Lists', 'Forums', 'Projects', 'Bugs', 'Docs', 'Downloads', 'Sponsors'] - attrs = [] - focus = self.name - - for i in range(len(names)): - attrs.append({'href': '/centos-web/?app=' + names[i].lower()}) - - tabs = self.page_navibar_tabs(names, attrs, focus) - tabs += self.page_line() - - return tabs - - - def page_navibar_tabs(self, names, attrs, focus=''): - """Returns navigation tabs. - - Arguments: - - names: List of tab names. - - attrs: List of dictionaries for each tab name inside the - `names' list. Dictionaries inside attrs argument contain - the XHTML link attributes (e.g., accesskey, title, and - href) used by tab names so they can be linkable once - rendered. - - focus: Name of the tab marked as current. When no value is - passed to this argument the `Home' value is used as - default value. - - """ - navibar_tabs = '' - - for i in range(len(names)): - content = self.tag('span', '', [0,0], str(names[i])) - content = self.tag('a', attrs[i], [16,1], content) - if str(names[i]).lower() == focus.lower(): - content = self.tag('span', {'class': 'current'}, [12,1], content, 1) - else: - content = self.tag('span', '', [12,1], content, 1) - navibar_tabs += content - - return self.tag('div', {'class': 'tabs'}, [8,1], navibar_tabs, 1) - - - def page_lastreleases(self, names=['6.0'], attrs=[{'href': '/centos-web/?p=releases&id=6.0'}]): - """Returns last-release information and related RSS link.""" - releases = '' - - title = self.tag('a', {'href': '/centos-web/?p=releases'}, [0,0], 'Last Releases') + ':' - title = self.tag('span', {'class': 'title'}, [16,1], title) - - for i in range(len(names)): - link = self.tag('a', attrs[i], [20,1], names[i]) - if i == len(names) - 1: - span = self.tag('span', {'class': 'last release'}, [16,1], link, 1) - else: - span = self.tag('span', {'class': 'release'}, [16,1], link, 1) - releases += span - releases = self.tag('div', {'class': 'left'}, [12,1], title + releases, 1) - - rsslink = self.tag('span', '', [0,0], 'RSS') - rsslink = self.tag('a', {'href': '/centos-web/?print=rss', 'title': 'RSS'}, [20,1], rsslink) - rsslink = self.tag('span', {'class': 'rss'}, [16,1], rsslink, 1) - rsslink = self.tag('div', {'class': 'right'}, [12, 1], rsslink, 1) - - return self.tag('div', {'id': 'last-releases'}, [8,1], releases + rsslink, 1) - - - def page_appslinks(self): - """Returns application related links.""" - appslinks = self.page_userlinks() - return self.tag('div', {'id': 'appslinks'}, [8,1], appslinks, 1) - - - def page_lastvisit(self): - last_visit = self.tag('a', {'href': '/centos-web/?p=lastvisit'}, [0,0], 'Your last visit was at') - last_visit = self.tag('span', {'class': 'title'}, [16, 1], last_visit) - last_visit += self.tag('span', {'class': 'datetime'}, [16, 1], '...') - return self.tag('div', {'class': 'lastvisit'}, [12, 1], last_visit, 1) - - - def page_session(self): - """Returns information related to user's session.""" - names = [] - attrs = [] - session = '' - - names.append('Lost your password?') - attrs.append({'href': '/centos-web/?p=lostpwd'}) - names.append('Register') - attrs.append({'href': '/centos-web/?p=register'}) - names.append('Login') - attrs.append({'href': '/centos-web/?p=login'}) - - for i in range(len(names)): - output = self.tag('a', attrs[i], [20,1], str(names[i]), 0) - if i == len(names) - 1: - output = self.tag('span', {'class': 'last'}, [16,1], output, 1) - else: - output = self.tag('span', '', [16,1], output, 1) - session += output - - return self.tag('div', {'class': 'session'}, [12,1], session, 1) - - - def page_trail(self, names=['None'], attrs=[{'href': '/centos-web/'}]): - """Returns page trails (a.k.a. breadcrumbs). - - The page breadcrumbs record the last pages visited inside the - current web application. Notice that page breadcrumbs are - user-specific information, so it isn't possible to implement - them until a way to manage user sessions be implemeneted - inside `centos-web.cgi' script. Until then, keep the tag - construction commented and return an empty value. - - """ - links = '' - - for i in range(len(names)): - if i == len(names) - 1: - content = self.tag('span', {'class':'last'}, [16,1], self.tag('a', attrs[i], [20, 1], names[i]), 1) - else: - content = self.tag('span', '', [16,1], self.tag('a', attrs[i], [20, 1], names[i], 0), 1) - links += content - - return self.tag('div', {'class': 'trail'}, [12,1], links, 1) - - - def page_userlinks(self): - """Returns user links. - - Arguments: - - names: List of links you want to have. - - attrs: List of dictionaries with link attributes. In order for - links to be built correctly, both names and attrs lists - must coincide their indexes. - - The user links are specific to each web application. They are - shown in the right-top corner of the application navigation - bar, just over the application navigation tabs. - - """ - userlinks = self.page_lastvisit() - userlinks += self.page_session() - userlinks += self.page_trail() - - return self.tag('div', {'class': 'userlinks'}, [8,1], userlinks, 1) - - - def page_navibar_app(self, names=['Welcome'], attrs=[{'href':'/centos-web/?p=welcome'}], focus='Welcome'): - """Returns application's navigation bar.""" - - navibar_app = self.page_navibar_tabs(names, attrs, focus) - navibar_app += self.page_line({'class': 'page-line white'}, [8,1]) - - return navibar_app - - - def page_line(self, attrs={'class': 'page-line'}, indent=[8,1]): - """Returns a division line.""" - page_line = self.tag('hr', {'style': 'display:none;'}, [0,0]) - page_line = self.tag('div', attrs, indent, page_line) - - return page_line - - - def page_license(self): - """Retruns link to page license.""" - license = 'Creative Commons Attribution-Share Alike 3.0 Unported License' - license = self.tag('a', {'href': 'http://creativecommons.org/licenses/by-sa/3.0/'}, [0,0], license) + '.' - - return license - - - def page_metadata(self): - """Returns page metadata.""" - metadata = self.tag('meta', {'http-equiv': 'content-type', 'content': 'text/html; charset=UTF-8'}, [4,1]) - metadata += self.tag('meta', {'http-equiv': 'content-style-type', 'content': 'text/css'}, [4,0]) - metadata += self.tag('meta', {'http-equiv': 'content-language', 'content': str(self.language)}, [4,1]) - metadata += self.tag('meta', {'name': 'keywords', 'content': str(self.keywords)}, [4,0]) - metadata += self.tag('meta', {'name': 'description', 'content': str(self.description)}, [4,1]) - metadata += self.tag('meta', {'name': 'copyright', 'content': 'Copyright © ' + str(self.copyright)}, [4,0]) - metadata += self.tag('title', '', [4,1], self.title) - metadata += self.tag('link', {'href': '/centos-web-pub/stylesheet.css','rel': 'stylesheet', 'type': 'text/css'}, [4,0]) - metadata += self.tag('link', {'href': '/centos-web-pub/Images/centos-fav.png', 'rel': 'shortcut icon', 'type': 'image/png'}, [4,1]) - - return self.tag('head', '', [0,1], metadata) - - - def page_content(self, content='Page empty.'): - """Returns page content.""" - return content - - - def page_admonition(self, title='Note', subtitle="", content=""): - """Returns page admonition. - - Arguments: - - title: Admonition's title. - - subtitle: Admonition's subtitle. The value of this argument is - concatenated on the right side of title using a colon (:) - as separator. Notice that this value is expanded inside - the

tag and there is no need to introduce extra tags - here. - - content: Admonition's content. The values passed through this - arguments needs to be XHTML code returned from - `self.tag()'. Preferably, paragraphs (p), tables (table), - lists (ul, ol, dl) and pre-formatted texts (pre). - - """ - if title == '': - return '' - else: - title = str(title.capitalize()) - - if subtitle != '': - subtitle = ': ' + str(subtitle.capitalize()) - - if content != '': - content = str(content) - - admonitions = ['Note', 'Tip', 'Important', 'Caution', 'Warning', 'Redirected', 'Success', 'Error'] - - if title in admonitions: - attrs = {'class': 'admonition ' + title.lower()} - image = self.tag('img', {'src': '/centos-web-pub/Images/' + title.lower() + '.png', 'alt': title}, [0,0]) - title = self.tag('h3', {'class': 'title'}, [0,0], title + subtitle, 0) - output = image + title + content + self.page_line() - else: - attrs = {'class': 'admonition unknown'} - title = self.tag('h3', {'class': 'title'}, [16,1], title + subtitle, 1) - output = title + content - - return self.tag('div', attrs, [12,1], output, 1) - - - def page_credits(self): - """Returns page credits.""" - copyright = self.tag('p', {'class': 'copyright'}, [12,1], 'Copyright © ' + str(self.copyright)) - license = self.tag('p', {'class': 'license'}, [12,1], 'This website is licensed under a ' + str(self.page_license())) - credits = self.tag('img', {'src': '/centos-web-pub/Images/top.png', 'alt': 'Top'}, [0,0]) - credits = self.tag('a', {'title': 'Top', 'href': '#top'}, [16,1], credits) - credits = self.tag('div', {'class': 'top'}, [12,1], credits, 1) - credits = str(credits) + str(copyright) + str(license) - credits = self.tag('div', {'class': 'credits'}, [8,1], credits, 1) - - return credits - - - def page(self): - """Returns page final output.""" - page_header = self.page_logo() - page_header += self.page_ads_google() - page_header += self.page_navibar_top() - page_header += self.page_lastreleases() - page_header += self.page_appslinks() - page_header += self.page_navibar_app() - page_header = self.tag('div', {'id': 'page-header'}, [4,1], page_header, 1) - - page_body = self.page_content() - page_body = self.tag('div', {'id':'content'}, [8,1], page_body, 1) - page_body = self.tag('div', {'id':'page-body'}, [4,1], page_body, 1) - - page_footer = self.tag('div', {'id': 'page-footer'}, [4,1], self.page_credits(), 1) - - top = self.tag('a', {'name':'top'}, [0,1]) - wrap = self.tag('div', {'id': 'wrap'}, [0,1], page_header + page_body + page_footer, 1) - body = self.tag('body', '', [0,1], top + wrap) - - html = self.page_preamble() - html += self.tag('html', {'xmlns': 'http://www.w3.org/1999/xhtml', 'dir': 'ltr', - 'lang': str(self.language), 'xml:lang': - str(self.language)}, [0,1], self.page_metadata() + body) - - return html - - - def main(self): - """The Xhtml code of a complete page.""" - print self.page()