diff --git a/Scripts/Python/Webenv/cgi-bin/Apps/Home/__init__.py b/Scripts/Python/Webenv/cgi-bin/Apps/Home/__init__.py
deleted file mode 100755
index e69de29..0000000
--- a/Scripts/Python/Webenv/cgi-bin/Apps/Home/__init__.py
+++ /dev/null
diff --git a/Scripts/Python/Webenv/cgi-bin/Apps/Home/page.py b/Scripts/Python/Webenv/cgi-bin/Apps/Home/page.py
deleted file mode 100755
index 97e12eb..0000000
--- a/Scripts/Python/Webenv/cgi-bin/Apps/Home/page.py
+++ /dev/null
@@ -1,91 +0,0 @@
-"""Support module for page layout inside `Home' web application.
-
-"""
-from Apps import page
-
-app = page.Layout()
-
-
-def page_navibar():
- """Returns application main pages.
-
- The application main pages are organized as tabs in the
- application navigation bar. There is one tab for each main page
- inside the application.
-
- """
- names = ['Page1', 'Page2', 'Page3']
- attrs = []
-
- for i in names:
- attrs.append({'href': '/webenv/?p=' + i.lower()})
-
- if 'p' in page.qs.keys():
- focus = page.qs['p'][0].lower()
- else:
- focus = ''
-
- return app.page_navibar(names, attrs, focus)
-
-
-def page_content():
- """Returns page content.
-
- The page content is determined from the query string, specifically
- from the value of `p' variable.
-
- """
- if 'p' in page.qs.keys():
- p = page.qs['p'][0].lower()
- else:
- p = ''
-
- if p == 'page1':
- output = app.tag_p('', [12, 1], 'Page Empty.')
- elif p == 'page2':
- output = app.tag_p('', [12, 1], 'Page Empty.')
- elif p == 'page3':
- output = app.tag_p({}, [12, 1], 'Page Empty' )
- elif p == 'entry':
- output = app.content_details()
- else:
- output = app.content_list()
-
- return output
-
-
-def main():
- """Returns final output."""
-
- # Define page name. This value is used as reference to determine
- # which application to load and what tab in the navigation bar to
- # focus on.
- app.name = 'Home'
-
- # Define page title. This value is dislayed on the browser's title
- # bar. Notice that we concatenated the page class default value
- # here.
- app.title += ' :: Home'
-
- # Define page header. This is the information displayed
- # between the page top and page content.
- app.header = app.logo()
- app.header += app.google_ad_example()
- app.header += app.navibar()
- app.header += app.releases()
- app.header += app.page_links()
- app.header += page_navibar()
-
- # Define page body. This is the information displayed between the
- # page header and page footer.
- app.body = page_content()
-
- # Define page footer. This is the information displayed between
- # the page bottom and the page content, the last information
- # displayed in the page.
- app.footer = app.credits()
-
- # Define page final layout.
- html = app.page()
-
- return html
diff --git a/Scripts/Python/Webenv/cgi-bin/Apps/Sponsors/__init__.py b/Scripts/Python/Webenv/cgi-bin/Apps/Sponsors/__init__.py
deleted file mode 100755
index e69de29..0000000
--- a/Scripts/Python/Webenv/cgi-bin/Apps/Sponsors/__init__.py
+++ /dev/null
diff --git a/Scripts/Python/Webenv/cgi-bin/Apps/Sponsors/page.py b/Scripts/Python/Webenv/cgi-bin/Apps/Sponsors/page.py
deleted file mode 100755
index 1791750..0000000
--- a/Scripts/Python/Webenv/cgi-bin/Apps/Sponsors/page.py
+++ /dev/null
@@ -1,91 +0,0 @@
-"""Support module for page layout inside `Sponsors' web application.
-
-"""
-from Apps import page
-
-app = page.Layout()
-
-
-def page_navibar():
- """Returns application's main pages.
-
- The application's main pages are organized as tabs in the
- application navigation bar. There is one tab for each main page
- inside the application.
-
- """
- names = ['Hardware', 'Hosting', 'Others']
- attrs = []
-
- for i in names:
- if 'app' in page.qs.keys():
- attrs.append({'href': '/webenv/?app=' + page.qs['app'][0].lower() + '&p=' + i.lower()})
- else:
- attrs.append({'href': '/webenv/?p=' + i.lower()})
-
- if 'p' in page.qs.keys():
- focus = page.qs['p'][0].lower()
- else:
- focus = names[0].lower()
-
- return app.page_navibar(names, attrs, focus)
-
-
-def page_content():
- """Returns page content.
-
- The page content to show is determined from the query string,
- specifically from the value of `p' variable.
-
- """
- if 'p' in page.qs.keys():
- p = page.qs['p'][0].lower()
- else:
- p = 'hardware'
-
- if p == 'hardware':
- output = app.tag_h1({'class': 'title'}, [12, 1], 'Hardware Sponsors' )
- elif p == 'hosting':
- output = app.tag_h1({'class': 'title'}, [12, 1], 'Hosting Sponsors' )
- elif p == 'others':
- output = app.tag_h1({'class': 'title'}, [12, 1], 'Other Sponsors' )
- else:
- output = app.tag_p('', [12, 1], 'Page empty.')
-
- return output
-
-
-def main():
- """Returns final output."""
-
- # Define page name. This value is used as reference to determine
- # which application to load and what tab in the navigation bar to
- # focus on.
- app.name = 'Sponsors'
-
- # Define page title. This value is dislayed on the browser's title
- # bar. Notice that we concatenated the page class default value
- # here.
- app.title += ' :: Sponsors'
-
- # Define page header. This is the information displayed
- # between the page top and the page content.
- app.header = app.logo()
- app.header += app.google_ad_example()
- app.header += app.navibar()
- app.header += app.page_links()
- app.header += page_navibar()
-
- # Define page body. This is the information displayed between the
- # page header and page footer.
- app.body = page_content()
-
- # Define page footer. This is the information displayed between
- # the page bottom and the page content, the last information
- # displayed in the page.
- app.footer = app.credits()
-
- # Define page final layout.
- html = app.page()
-
- return html
diff --git a/Scripts/Python/Webenv/cgi-bin/Apps/Unknown/__init__.py b/Scripts/Python/Webenv/cgi-bin/Apps/Unknown/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/Scripts/Python/Webenv/cgi-bin/Apps/Unknown/__init__.py
+++ /dev/null
diff --git a/Scripts/Python/Webenv/cgi-bin/Apps/Unknown/page.py b/Scripts/Python/Webenv/cgi-bin/Apps/Unknown/page.py
deleted file mode 100755
index f7c564e..0000000
--- a/Scripts/Python/Webenv/cgi-bin/Apps/Unknown/page.py
+++ /dev/null
@@ -1,54 +0,0 @@
-"""The `Unknown' web application.
-
-The Unknown web application is automatically triggered when the page
-requested is not defined as valid in `webenv.cgi' script. The
-Unknown web application is basically an admonition message describing
-the `page not found' issue and where to find the correct links to
-start all over.
-
-"""
-from Apps import page
-
-app = page.Layout()
-
-
-def page_content():
- """Returns page content."""
- output = app.tag_p('', [16,1], 'The page you tried to open was not found in this server. Try one of the links above to start over.')
- output = app.admonition('Warning', 'Page not found.', output)
- output = app.tag_div({'id':'content-unknown'}, [8,1], output, 1)
- return output
-
-
-def main():
- """Returns final output."""
-
- # Define page name. This value is used as reference to determine
- # which application to load and what tab in the navigation bar to
- # focus on.
- app.name = 'Unknown'
-
- # Define page title. This value is dislayed on the browser's title
- # bar. Notice that we concatenated the page class default value
- # here.
- app.title += ' :: Page not found'
-
- # Define page header. This is the information displayed
- # between the page top and the page content.
- app.header = app.logo()
- app.header += app.google_ad_example()
- app.header += app.navibar()
-
- # Define page body. This is the information displayed between the
- # page header and page footer.
- app.body = page_content()
-
- # Define page footer. This is the information displayed between
- # the page bottom and the page content, the last information
- # displayed in the page.
- app.footer = app.credits()
-
- # Define page final layout.
- html = app.page()
-
- return html
diff --git a/Scripts/Python/Webenv/cgi-bin/Apps/__init__.py b/Scripts/Python/Webenv/cgi-bin/Apps/__init__.py
deleted file mode 100755
index e69de29..0000000
--- a/Scripts/Python/Webenv/cgi-bin/Apps/__init__.py
+++ /dev/null
diff --git a/Scripts/Python/Webenv/cgi-bin/Apps/page.py b/Scripts/Python/Webenv/cgi-bin/Apps/page.py
deleted file mode 100755
index 9a449b9..0000000
--- a/Scripts/Python/Webenv/cgi-bin/Apps/page.py
+++ /dev/null
@@ -1,970 +0,0 @@
-# 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$
-# ------------------------------------------------------------------
-"""Support page construction.
-
-The page construction is an XHTML document consisting of several
-independent components that, when put together, provide organization
-to content. Each of these components is set as a method of Layout
-class that can be instantiated later from application specific modules.
-
-When you create a new application package, you need to create a page
-module for it and instantiate the Layout class provided here inside
-it. Later, the following functions must be created: page_content(),
-page_navibar() and main(). These functions are used to define the
-content and navigation bar of your application. Both application
-content and application navigation are logically organized using
-variables passed through the URL.
-
-Application
-===========
-
-URL variable: app
-
-This variable contains the application id. It is a unique numerical
-value that starts at 0 and increments one for each new application
-that might be added. The application identified by number 0 is the one
-used as default when no other application is provided. The
-application identified by number 0 is added to database the first time
-it is created as part of the initial configuration process.
-
-Application is the highest level of organization inside
-`webenv.cgi' script. Inside applications, there is content in form
-of pages and entries. Content can be grouped by categories.
-
-Pages
-=====
-
-URL variable: page
-
-This variable contains the page id. It is a unique numerical value
-that starts at 0 and increments in one for each new page added to the
-application. In contrast to applications, the page identified by
-number 0 is not used as default page when no other page is provided.
-This configuration is specific to each application and can be
-customized inside each application individually, using string values
-instead of numerical values when passing values to page variable.
-
-Generally, when a page variable isn't passed through the URL, the
-application module uses the `content_list()' method from Layout class
-to display a list of all available content entries while links to
-content pages are displayed in the application navigation bar so users
-can access them. The unique numerical value of content pages is
-specific to each application, so there is one page 0 for each
-application available. No page is added to database the first time the
-database is created as part of the initial configuration process.
-
-Pages contain similar information to that described by contents with
-few exceptions. Pages, in contrast to entries, can differentiate the
-page title from the page name. The page title goes in the page content
-itself and describes what the page is about with a phrase. On the
-other hand, the page name is generaly one word describing the page
-content and is used as link on the application navigation bar. When
-no page name is explicitly provided, the first word of page title is
-used instead.
-
-Pages are always accessible inside the same application while contents
-aren't. Pages are permanently visible and linkend from each
-application specific navigation bar. This kind of pages can be
-managed by editors or administrators and can be marked as `draft' to
-put it on a special state where it is possible for administrator,
-editors and authors to work on it, but impossible for others to read
-it until the page be marked as `published' by either the page author
-or any members of editor's or administrator's groups.
-
-Pages can be converted to entires and the oposite. When convertion
-occurs, unused information looses its meaning and is kept for
-informative purpose, specially in situations when it might be needed
-to realize a convertion back into the former state. Notice that in
-order to realize such a back and forth convertion it is required that
-both pages and entires share the same definition structure. In fact,
-that they be the same thing, but able to differentiate themselves
-either as page or entry (e.g., through a `type' field.).
-
-Pages content is under version control. When a page (or entry) is
-changed, a verification is performed to determine whether the
-information entered in edition matches the last record in the page
-history table. When both the information coming from edition and the
-last record in the page history table are the same (e.g., no change
-happened) the edition action is cancelled and a message is printed out
-to notify the action. Otherwise, when the information entered in
-edition differs from the last record in the page history table, the
-information comming from edition passes to be the last record in the
-page history table. In case, a page be reverted to a revision
-different to that one being currently the active page, the reverted
-revision becomes the active page (e.g., by changing a `status' field
-from `false' to `true' in the history table).
-
-Categories
-==========
-
-Categories exists to organize contents. When an entry is created it is
-automatically linked to a category. Categories are managed by
-administrators and editors only. Categories can be nested one another
-and provide another way of finding information inside the web
-environment. Categories are specific to each web application, just as
-contents and pages are. The `Unknown' category is created when the
-categories table is created for first time, as part of the initial
-configuration process so if no explicit category assignation is set by
-the user, a default value (the `Unknown' category in this case) is
-used to satisfy the connection between contents and categories.
-
-Referential integrity
-=====================
-
-Referential integrity is not handle in the logic layer provided by
-this module, but set inside the database system used to store the
-information handled by this module. The most we do about it here, is
-to display a confirmation message before committing such actions, so
-you can be aware of them.
-
-"""
-
-import cgi
-import cgitb; cgitb.enable()
-from Apps import xhtml
-
-qs = cgi.parse()
-
-
-def qs_args( names={}):
- """Returns query string arguments.
-
- The query string arguments are used to build links dynamically
- and, this way, to create a browsable and logically organized web
- environment. Such a construction generally needs to retrive some
- of the values previously passed to the query string and add new
- ones to it.
-
- names: A dictionary containing the variable name and value pair
- used to build a new query string.
-
- When a variable is provied without a value, then its value is
- retrived from the current query string. If a value isn't found
- there neither, then the variable is removed from the new query
- string.
-
- When a variable is provided with its value, then its value is used
- to build the new query string.
-
- """
- output = ''
-
- names_keys = names.keys()
- names_keys.sort()
- for key in names_keys:
- if names[key] == '':
- if key in qs:
- names[key] = qs[key][0]
- else:
- continue
- if output == '':
- output = '?'
- else:
- output += '&'
- output += key + '=' + str(names[key])
-
- return '/webenv/' + output
-
-
-class Layout(xhtml.Strict):
- """The Page Layout.
-
- The page layout is made by combining XHTML tags in specific ways.
- These specific combinations make the page components which in turn
- can be also combined. Some of these components can be reused and
- others don't. The goal of this class is to define what such
- components are and describe them well in order to understand how
- to use them from application modules when building XHTML documents
- dynamically.
-
- The page layout is initialized with a functional layout that can
- be used as reference inside application modules, to create
- variations of it. Generally, inside application packages, this
- class is instantiated in a module named `page', variables are
- reset and functions created in order to satisfy that application
- needs. When you need to output one of the page components then you
- use this class instantiated methods. When the method you need
- doesn't exist in this class, then it is a good time for it to be
- created, here ;).
-
- Notice that most methods defined in this class make direct use of
- methods defined by Strict class inside the `xhtml' module. The
- Strict class inside xhtml module is inherited inside this class so
- all the methods there are also available here. Methods which
- doesn't make a direct use of Strict methods are dependencies of
- those which do make direct use of Strict methods.
-
- """
-
-
- def __init__(self):
- """Initialize page data."""
- 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'
-
- # Define page header. This is the information displayed
- # between the page top and the page content.
- self.header = self.logo()
- self.header += self.google_ad()
- self.header += self.navibar()
- self.header += self.releases()
- self.header += self.page_links()
- self.header += self.page_navibar()
-
- # Define page body. This is the information displayed between
- # the page header and page footer.
- self.body = 'None'
-
- # Define page footer. This is the information displayed
- # between the page bottom and the page content, the last
- # information displayed in the page.
- self.footer = self.credits()
-
-
- def logo(self):
- """Returns The CentOS 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': '/webenv/'})
- attrs.append({'src': '/public/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), 1)
-
-
- def google_ad_example(self):
- """Returns Google advertisement for offline testings."""
- title = 'Google Advertisement'
- url = '/public/Images/ads-sample-468x60.png'
- image = self.tag_img({'src': url, 'alt': title}, [0,0])
- link = self.tag_a({'href': url, 'title': title}, [12,1], image)
- output = self.tag_div({'class':'google-ad'}, [8,1], link, 1)
- output += self.separator({'class':'page-line'}, [8,1])
-
- return output
-
-
- def google_ad(self):
- """Returns Google advertisement for online using."""
-
- properties = {}
- properties['google_ad_client'] = 'pub-6973128787810819'
- properties['google_ad_width'] = '468'
- properties['google_ad_height'] = '60'
- properties['google_ad_format'] = '468x60_as'
- properties['google_ad_type'] = 'text_image'
- properties['google_ad_channel'] = ''
- properties['google_color_border'] = '204c8d'
- properties['google_color_bg'] = '345c97'
- properties['google_color_link'] = '0000FF'
- properties['google_color_text'] = 'FFFFFF'
- properties['google_color_url'] = '008000'
-
- attrs = {}
- attrs['type'] = "text/javascript"
-
- output = '\n'
-
- properties = self.tag_script(attrs, [12,1], output, 1)
-
- attrs['src'] = "http://pagead2.googlesyndication.com/pagead/show_ads.js"
-
- source = self.tag_script(attrs, [12,1], ' ', 0)
-
- output = self.tag_div({'class':'google-ad'}, [8,1], properties + source, 1)
- output += self.separator({'class':'page-line'}, [8,1])
-
- return output
-
-
- def navibar(self):
- """Returns webenv navigation bar.
-
- The webenv navigation bar organizes links to main web
- applications The CentOS Project makes use of. Links to these
- web applications stay always visible, no matter what web
- application the user be visiting (e.g., Wiki, Lists, Forums,
- Projects, Bugs, Docs, Downloads and Sponsors.). Notice that
- some of these web applications are out of `webenv.cgi'
- scope and they need to code their own webenv navigation bars
- in a way that coincide the one set by `webenv.cgi'.
-
- """
- names = ['Home', 'Wiki', 'Lists', 'Forums', 'Projects', 'Bugs', 'Docs', 'Downloads', 'Sponsors']
- attrs = []
- focus = self.name
-
- for i in range(len(names)):
- if names[i].lower() == 'home':
- attrs.append({'href': '/webenv/'})
- else:
- attrs.append({'href': '/webenv/?app=' + names[i].lower()})
-
- tabs = self.navibar_tabs(names, attrs, focus)
- tabs += self.separator()
-
- return tabs
-
-
- def navibar_tabs(self, names, attrs, focus=''):
- """Returns navigation tabs.
-
- The navigation tabs are the smaller components a navigation
- bar like "top-level navigation bar" and "application
- navigation bar" are made of.
-
- names: List containing link names of tabs.
-
- attrs: List containing a dictionary for each tab link name
- inside the `names' list. Dictionaries inside attrs
- argument contain the link attributes (e.g., accesskey,
- title, and href) used by link names so they can be
- linkable once rendered.
-
- focus: Name of the link marked as current.
-
- """
- navibar_tabs = ''
-
- for i in range(len(names)):
- output = self.tag_span('', [0,0], str(names[i]))
- output = self.tag_a(attrs[i], [16,1], output)
- if str(names[i]).lower() == focus.lower():
- output = self.tag_span({'class': 'current'}, [12,1], output, 1)
- else:
- output = self.tag_span('', [12,1], output, 1)
- navibar_tabs += output
-
- return self.tag_div({'class': 'tabs'}, [8,1], navibar_tabs, 1)
-
-
- def releases(self):
- """Returns The CentOS Distribution last releases.
-
- This method introduces the `releases' method by providing
- links to it.
-
- names: List containing release numbers in the form M.N, where M
- means major release and N minor release.
-
- attrs: List containing a dictionary for each release number
- provided in `names' argument. These dictionaries provide
- the link attributes required by release numbers in order
- for them to be transformed into valid links once the page
- be rendered.
-
- """
- releases = ''
-
- names = []
- names.append('6.0')
-
- attrs = []
- attrs.append({'href': qs_args({'p':'releases', 'id': 6.0})})
-
-
- title = self.tag_a({'href': qs_args({'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': qs_args({'rss':'releases'}), '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 user_links_logs(self):
- """Return links related to user's logs.
-
- This function introduces the `logs' module. The `logs' module
- registers all user's activity, from login to logout. This link
- must be display/accessible only after a user has successfully
- login.
-
- """
- last_visit = self.tag_a({'href': qs_args({'app':'', 'p':'logs'})}, [0,0], 'Logs')
- return self.tag_div({'class': 'logs'}, [12, 1], last_visit, 1)
-
-
- def user_links_session(self):
- """Returns links related to user's session.
-
- This function introduces the `session' module. The `session'
- module provides state to user interactions so their action can
- be registered individually.
-
- """
- names = []
- attrs = []
- session = ''
-
- names.append('Lost your password?')
- attrs.append({'href': qs_args({'app':'', 'p':'lostpwd'})})
- names.append('Register')
- attrs.append({'href': qs_args({'app':'', 'p':'register'})})
- names.append('Login')
- attrs.append({'href': qs_args({'app':'', '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 user_links_trails(self, names=['None'], attrs=[{'href': '/webenv/'}]):
- """Returns page trails (a.k.a. breadcrumbs).
-
- The page breadcrumbs record the last pages the user 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 `webenv.cgi' script. Until then,
- keep the tag construction commented and return an empty value.
-
- names: List with trail link names.
-
- attrs: Dictionary with trail link attributes.
-
- """
- links = ''
-
- for i in range(len(names)):
- if i == len(names) - 1:
- output = self.tag_span({'class':'last'}, [16,1], self.tag_a(attrs[i], [20, 1], names[i]), 1)
- else:
- output = self.tag_span('', [16,1], self.tag_a(attrs[i], [20, 1], names[i], 0), 1)
- links += output
-
- return self.tag_div({'class': 'trail'}, [12,1], links, 1)
-
-
- def user_links(self):
- """Returns user related links.
-
- The user links are specific to each web application. They are
- shown over the application navigation bar.
-
- """
- userlinks = self.user_links_logs()
- userlinks += self.user_links_session()
- userlinks += self.user_links_trails()
-
- return self.tag_div({'class': 'userlinks'}, [8,1], userlinks, 1)
-
-
- def page_navibar(self, names=['Welcome'], attrs=[{'href':'/webenv/?p=welcome'}], focus='Welcome'):
- """Returns navigation bar for application main pages.
-
- names: List containing link names.
-
- attrs: List containing one dictionary for each link name in
- `names' argument. Dictionaries here contain the link
- attributes needed to make linkable tabs once the page is
- rendered.
-
- """
- navibar_app = self.navibar_tabs(names, attrs, focus)
- navibar_app += self.separator({'class': 'page-line white'}, [8,1])
-
- return navibar_app
-
-
- def separator(self, attrs={'class': 'page-line'}, indent=[16,1]):
- """Returns separator.
-
- The separator construction is mainly used to clear both sides
- inside the page, specially when floating elements are around.
-
- attrs: Dictionary containing hr's div attributes.
-
- indent: List containing hr's div indentation values.
-
- """
- line = self.tag_hr({'style': 'display:none;'}, [0,0])
- line = self.tag_div(attrs, indent, line)
-
- return line
-
-
- def license(self):
- """Retruns license link."""
- 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 metadata(self):
- """Returns 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': '/public/stylesheet.css','rel': 'stylesheet', 'type': 'text/css'}, [4,0])
- metadata += self.tag_link({'href': '/public/centos-fav.png', 'rel': 'shortcut icon', 'type': 'image/png'}, [4,1])
-
- return self.tag_head('', [0,1], metadata)
-
-
-
-
- def searchform(self, size=15):
- """Returns search form.
-
- The search form redirects user from the current page onto the
- search page, where the keywords previously introduced in the
- input field are processed then.
-
- size: A number discribing how large the search box is.
-
- """
- input = self.tag_input({'type':'text', 'value':'', 'size':size}, [0,0])
-
- action = self.tag_dt({}, [20,1], 'Search')
- action += self.tag_dd({}, [20,1], input)
- action = self.tag_dl({'class':'search'}, [16,1], action, 1)
-
- return self.tag_form({'action': qs_args({'app':'', 'p':'search'}),
- 'method':'post', 'title':'Search'},
- [12,1], action, 1)
-
-
- def content_resumen(self, attrs, id, title, user_id, commit_date,
- update_date, category_id, comments, abstract):
- """Returns content resumen.
-
- The content resumen is used to build the list of contents,
- output by `content_list()' method. The content resumen intends
- to be concise and informative so the user can grab a general
- idea about the related content and what it is about.
-
- attrs: A dictionary discribing the rows style. This is useful
- to alternate the row background colors.
-
- id: A unique numerical value referring the content
- identification. This is the value used on administrative
- tasks like updating and deleting.
-
- title: A few words phrase describing the content, up to 255
- characters.
-
- author_id: A string referring the user email address, as
- specified by RFC2822. The user email address is used as id
- inside The CentOS User LDAP server, where user specific
- information (e.g., surname, lastname, office, phone, etc.)
- are stored in. This is the field that bonds the user with
- the content he/she produces.
-
- commit_date: A string referring the timestamp the content
- arrived to database for time.
-
- update_date: A string representing the timestamp the content
- was updated/revised for last time.
-
- category_id: A number refering the category id the content is
- attached to.
-
- abstract: One paragraphs describing the content. This
- information is used to build the page metadata
- information. When this value is not provided no abstract
- information is displayed in the page, but the is built using article's first 255
- characters.
-
- comments: A number representing how many comments the content
- has received since it is in the database.
-
- The content itself is not displayed in the resumen, but in
- `content_details()'.
-
- """
- title = self.tag_a({'href': qs_args({'app':'', 'p':'entry', 'id':id})}, [0,0], title)
- title = self.tag_h3({'class': 'title'}, [20,1], title, 0)
- info = self.content_info(id, user_id, commit_date,
- update_date, category_id, comments,
- abstract)
- return self.tag_div(attrs, [16,1], title + info, 1)
-
-
- def pagination(self):
- """Return content pagination."""
- previous = self.tag_a({'href':''}, [0,0], 'Previous')
- previous = self.tag_span({'class':'previous'}, [20,1], previous)
- next = self.tag_a({'href':''}, [0,0], 'Next')
- next = self.tag_span({'class':'next'}, [20,1], next)
- separator = self.separator({'class':'page-line'}, [20,1])
- return self.tag_div({'class':'pagination'}, [16,1], previous +
- next + separator, 1)
-
-
- def content_info(self, content_id, user_id, commit_date,
- update_date, category_id, comments, abstract):
- """Return content information.
-
- The content information provides a reduced view of content so
- people can make themselves an idea of what the content talks
- about. The content information displays content's title,
- author, timestamp, related category, number of comments and an
- abstract of the whole content.
-
- """
- categories = []
- categories.append('Unknown')
- categories.append('Erratas')
- categories.append('Articles')
- categories.append('Events')
-
- if category_id <= len(categories):
- category_name = categories[category_id].capitalize()
- else:
- category_id = 0
- category_name = categories[category_id].capitalize()
-
- category_name = self.tag_a({'href': qs_args({'app':'', 'p':'categories', 'id':category_id})}, [0,0], category_name)
- category_name = self.tag_span({'class':'category'}, [24,1], category_name)
-
- users = {}
- users['al@centos.org'] = 'Alain Reguera Delgado'
- users['ana@centos.org'] = 'Ana Tamara Reguera Gattorno'
- users['alina@centos.org'] = 'Alina Reguera Gattorno'
-
- if user_id in users.keys():
- user_name = self.tag_a({'href':'mailto:' + user_id}, [0,0], users[user_id])
- user_name = self.tag_span({'class':'author'}, [24,1], 'Written by ' + user_name)
-
- if update_date != commit_date:
- date = self.tag_span({'class':'date'}, [24,1], update_date)
- else:
- date = self.tag_span({'class':'date'}, [24,1], commit_date)
-
-
- comments_attrs = {'href': qs_args({'app':'', 'p':'entry', 'id':content_id}) + '#comments'}
- if comments == 1:
- comments = self.tag_a(comments_attrs, [0,0], str(comments) + ' comment')
- elif comments > 1:
- comments = self.tag_a(comments_attrs, [0,0], str(comments) + ' comments')
- else:
- comments = 'No comments'
- comments = self.tag_span({'class':'comment'}, [24,1], comments)
-
- abstract = self.tag_p({'class':'abstract'}, [24,1], abstract)
-
- return self.tag_div({'class': 'info'}, [20,1], user_name + date + category_name + comments + abstract, 1)
-
-
- def content_list(self):
- """Return list of content.
-
- The list of content is used to explore the content available
- inside specific pages of specific web applications. The
- information is displayed through paginated rows of content
- that can be filtered to reduce the search results based on
- patterns. By default, the list of content displays 15 rows,
- but this value can be changed in user's preferences.
-
- """
- output = ''
- count = 0
- rows = []
- rows.append([0, 'Introduction to CentOS Web Environment',
- 'al@centos.org',
- '2011-8-30 12:33:11',
- '2011-8-30 12:33:11',
- 0,
- 0,
- 'This is the abstract paragrah of content. '*10])
- rows.append([1, 'Creating New Applications',
- 'al@centos.org',
- '2011-8-30 12:33:11',
- '2011-8-30 12:33:11',
- 2,
- 1,
- 'This is the abstract paragrah of content. '*5])
- rows.append([2, 'Texinfo Documentation Backend',
- 'al@centos.org',
- '2011-8-30 12:33:11',
- '2011-8-30 12:33:11',
- 1,
- 5,
- 'This is the abstract paragrah of content. '*8])
-
- for row in rows:
- if count == 0:
- attrs = {'class': 'dark row'}
- count += 1
- else:
- attrs = {'class': 'light row'}
- count = 0
- output += self.content_resumen(attrs, *row)
-
- list = output + self.pagination() + self.separator()
- list = self.tag_div({'id':'content-list'}, [12,1], list, 1)
- actions = self.searchform() + self.categories() + self.archives()
- actions = self.tag_div({'id':'content-actions'}, [8,1], actions, 1)
-
- return actions + list
-
-
- def content_details(self):
- """Return content details.
-
- The content detail is shown for contents and pages.
- """
- output = ''
- rows = []
- rows.append([0, 'Introduction to CentOS Web Environment',
- 'al@centos.org',
- '2011-8-30 12:33:11',
- '2011-8-30 12:33:11',
- 0,
- 0,
- 'This is the abstract paragrah of content. '*10,
- 'This is the first paragraph of content'*10 + "\n"
- 'This is the second paragraph of content'*20 +
- "\n" + 'This is the third paragraph of content.'*10 + "\n"])
- rows.append([1, 'Creating New Applications',
- 'al@centos.org',
- '2011-8-30 12:33:11',
- '2011-8-30 12:33:11',
- 2,
- 1,
- 'This is the abstract paragrah of content. '*5,
- "This is the first paragraph of content\n\
- This is the second paragraph of content.\n\
- This is the third paragraph of content."])
- rows.append([2, 'Texinfo Documentation Backend',
- 'al@centos.org',
- '2011-8-30 12:33:11',
- '2011-8-30 12:33:11',
- 1,
- 5,
- 'This is the abstract paragrah of content. '*8,
- "This is the first paragraph of content.\n\
- This is the second paragraph of content.\n\
- This is the third paragraph of content."])
-
- if 'id' in qs:
- id = int(qs['id'][0])
- title = rows[id][1]
- email = rows[id][2]
- commit_date = rows[id][3]
- update_date = rows[id][4]
- category = rows[id][5]
- comments = rows[id][6]
- abstract = self.tag_p({}, [0,0], rows[id][7])
-
- output = self.tag_h1({'class':'title'}, [12,1], title)
- output += self.content_info(id, email, commit_date, update_date, category, comments, abstract)
- output += self.tag_p({}, [20,1], rows[id][8])
- output += self.comments()
-
- return self.tag_div({'id':'content-details'}, [12,1], output, 1)
-
-
- def comments(self):
- """Returns content specific list of comments.
-
- """
- output = self.tag_a({'name':'comments'}, [0,0], 'Comments')
- output = self.tag_h2({'class':'title comments'}, [12,1], output, 0)
-
- return output
-
-
- def categories(self):
- """Returns list of categories.
-
- """
- categories = ['Unknown', 'Articles', 'Erratas', 'Events']
- dt = self.tag_dt({}, [16,1], 'Categories')
- dd = ''
- for id in range(len(categories)):
- category_attrs = {'href': qs_args({'app':'', 'p':'categories', 'id':id})}
- a = self.tag_a(category_attrs, [0,0], categories[id] + ' (0)')
- dd += self.tag_dd({}, [16,1], a)
-
- return self.tag_dl({},[12,1], dt + dd, 1)
-
-
- def archives(self):
- """Returns archives."""
- archives = {}
- archives['2011'] = ['January', 'February', 'March', 'April', 'May']
- archives['2010'] = ['January', 'February']
-
- dt = self.tag_dt({}, [16,1], 'Archives')
- year_dl = ''
- year_dd = ''
-
- for key in archives.keys():
- year_dt = self.tag_dt({},[20,1], key)
- for id in range(len(archives[key])):
- a = self.tag_a({'href': qs_args({'app':'', 'p':'archives', 'year': key, 'month': id + 1})}, [0,0], archives[key][id] + ' (0)')
- year_dd += self.tag_dd({}, [20,1], a)
- year_dl += self.tag_dl({'class':'year'}, [16,1], year_dt + year_dd, 1)
- year_dd = ''
-
- return self.tag_dl({},[12,1], dt + year_dl, 1)
-
-
- def page_top(self):
- """Returns page top anchor."""
- return self.tag_a({'name':'top'}, [0,1])
-
-
- def page_header(self):
- """Returns page header.
-
- The page_header is common to all application modules and
- """
- return self.tag_div({'id': 'page-header'}, [4,1], self.header, 1)
-
-
- def page_body(self):
- """Returns page body.
-
- The page_body is specific to each application module and is
- there where it must be constructed. The construction itself
- takes place through the `page_content()' function which does a
- return through an instantiated `content_' prefixed method.
- The `content_' prefixed method used depends on the kind of
- content you want to print out (e.g., `content_list()' for a
- content list, `detail()' for a detailed view of content,
- etc.). Later, the `body' variable instantiated from this class
- is reset in the `main()' function with the value returned from
- `page_content()' so the desired content layout can be printed
- out.
-
- """
- return self.tag_div({'id':'page-body'}, [4,1], self.body, 1)
-
-
- def page_links(self):
- """Returns page links."""
- page_links = self.user_links()
- return self.tag_div({'id': 'pagelinks'}, [8,1], page_links, 1)
-
-
- def page_footer(self):
- """Retruns page footer."""
- return self.tag_div({'id': 'page-footer'}, [4,1], self.credits(), 1)
-
-
- def page_wrap(self):
- """Returns page wrap."""
- return self.tag_div({'id': 'wrap'}, [0,1], self.page_header() + self.page_body() + self.page_footer(), 1)
-
-
- def admonition(self, title='Note', subtitle="", body=""):
- """Returns page admonition.
-
- 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.
-
- body: Admonition's body. 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 body != '':
- body = str(body)
-
- admonitions = ['Note', 'Tip', 'Important', 'Caution', 'Warning', 'Redirected', 'Success', 'Error']
-
- if title in admonitions:
- attrs = {'class': 'admonition ' + title.lower()}
- image = self.tag_img({'src': '/public/Images/' + title.lower() + '.png', 'alt': title}, [16,1])
- title = self.tag_h3({'class': 'title'}, [16,1], title + subtitle, 0)
- output = image + title + body + self.separator()
- else:
- attrs = {'class': 'admonition unknown'}
- title = self.tag_h3({'class': 'title'}, [16,1], title + subtitle, 1)
- output = title + body
-
- return self.tag_div(attrs, [12,1], output, 1)
-
-
- def 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.license()))
- credits = self.tag_img({'src': '/public/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."""
- html = self.doctype()
- 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.metadata() + self.page_top() + self.page_wrap())
-
- return html
diff --git a/Scripts/Python/Webenv/cgi-bin/Apps/xhtml.py b/Scripts/Python/Webenv/cgi-bin/Apps/xhtml.py
deleted file mode 100755
index be646b5..0000000
--- a/Scripts/Python/Webenv/cgi-bin/Apps/xhtml.py
+++ /dev/null
@@ -1,1451 +0,0 @@
-# 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$
-# ------------------------------------------------------------------
-"""Support XHTML construction.
-
-XHTML construction, as set here, uses the Extensible HTML version 1.0
-DTDs (/usr/share/sgml/xhtml1/xhtml1-20020801/DTD/) as reference. XHTML
-construction is required by page module.
-"""
-
-
-class Strict:
- """Implements XHTML strict document type definition."""
-
-
- # Core attributes common to most elements.
- coreattrs = ['id', # document-wide unique id
- 'class', # space separated list of classes
- 'style', # associated style info
- 'title' # advisory title/amplification
- ]
-
- # Internationalization attributes.
- i18n = ['lang', # language code (backwards compatible)
- 'xml:lang', # language code (as per XML 1.0 spec)
- 'dir' # direction for weak/neutral text
- ]
-
- # Attributes for common UI events.
- events = ['onclick', # a pointer button was clicked
- 'ondblclick', # a pointer button was double clicked
- 'onmousedown', # a pointer button was pressed down
- 'onmouseup', # a pointer button was released
- 'onmousemove', # a pointer was moved onto the element
- 'onmouseout', # a pointer was moved away from the element
- 'onkeypress', # a key was pressed and released
- 'onkeydown', # a key was pressed down
- 'onkeyup' # a key was released
- ]
-
- # Attributes for elements that can get the focus.
- focus = ['accesskey', # accessibility key character
- 'tabindex', # position in tabbing order
- 'onfocus', # the element got the focus
- 'onblur' # the element lost the focus
- ]
-
- # Attributes generic format.
- attrs = coreattrs + i18n + events
-
-
- def __init__(self):
- """Initialize class data."""
- pass
-
-
- def tag(self, name, attrs, indent=[8,1], content="", has_child=0):
- """Returns generic 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 + '' + str(name) + '>'
- else:
- output += '' + str(name) + '>'
- output += v_indent
-
- return output
-
-
- # ------------------------------------------------------------------
- # Document Type Definition
- # ------------------------------------------------------------------
-
- def doctype(self):
- """Return document type definition."""
- output = '' + "\n"
- output += '' + "\n"
-
- return output
-
-
- # ------------------------------------------------------------------
- # Document Structure
- # ------------------------------------------------------------------
-
- def tag_html(self, attrs, indent, content, has_child=1):
- """Returns document structure definition.
-
-
-
-
- The namespace URI designates the document profile.
-
- """
- return self.tag('html', attrs, indent, content, has_child=1)
-
-
- # ------------------------------------------------------------------
- # Document Head
- # ------------------------------------------------------------------
-
- def tag_head(self, attrs, indent, content, has_child=1):
- """Returns document head definition.
-
-
-
-
-
-
- Content model is %head.misc; combined with a single title and
- an optional base element in any order.
-
- """
- return self.tag('head', attrs, indent, content, has_child)
-
-
- def tag_title(self, attrs, indent, content, has_child=0):
- """Returns title definition.
-
-
-
-
- The title element is not considered part of the flow of text.
- It should be displayed, for example as the page header or
- window title. Exactly one title is required per document.
-
- """
- return self.tag('title', attrs, indent, content, has_child)
-
-
- def tag_base(self, attrs, indent):
- """Returns document base URI.
-
-
-
-
- """
- return self.tag('base', attrs, indent)
-
-
- def tag_meta(self, attrs, indent):
- """Returns generic metainformation.
-
-
-
-
- """
- return self.tag('meta', attrs, indent)
-
-
- def tag_link(self, attrs, indent):
- """Returns relationship values.
-
-
-
-
- Relationship values can be used in principle:
-
- a) for document specific toolbars/menus when used with the
- link element in document head e.g. start, contents,
- previous, next, index, end, help.
-
- b) to link to a separate style sheet (rel="stylesheet").
-
- c) to make a link to a script (rel="script").
-
- d) by stylesheets to control how collections of html nodes
- are rendered into printed documents.
-
- e) to make a link to a printable version of this document
- e.g. a PostScript or PDF version (rel="alternate"
- media="print").
-
- """
- return self.tag('link', attrs, indent)
-
-
- def tag_style(self, attrs, indent, content, has_child=0):
- """Returns style info.
-
-
-
-
- """
- return self.tag('style', attrs, indent, content, has_child)
-
-
- def tag_script(self, attrs, indent, content="", has_child=0):
- """Returns script statement.
-
-
-
-
-
- """
- return self.tag('script', attrs, indent, content, has_child)
-
-
- def tag_noscript(self, attrs, indent, content, has_child=1):
- """Returns alternate content container for non script-based
- rendering.
-
-
-
-
- """
- return self.tag(self, attrs, indent, content, has_child)
-
-
- # ------------------------------------------------------------------
- # Document Body
- # ------------------------------------------------------------------
-
- def tag_body(self, attrs, indent, content, has_child=1):
- """Returns document body definition.
-
-
-
-
- """
- return self.tag('body', attrs, indent, content, has_child)
-
-
- def tag_div(self, attrs, indent, content, has_child=0):
- """Returns generic language/style container.
-
-
-
-
- """
- return self.tag('div', attrs, indent, content, has_child)
-
-
- # ------------------------------------------------------------------
- # Paragraphs
- # ------------------------------------------------------------------
-
- def tag_p(self, attrs, indent, content, has_child=0):
- """Returns paragraph definition.
-
-
-
-
- When content is introduced inside the database, it goes
- without any XHTML markup. This method transforms newline
- separated strings into XHTML paragraphs.
-
- """
- output = ''
- for line in content.splitlines():
- if line == '': continue
- output += self.tag('p', attrs, indent, line.strip(), has_child)
- return output
-
-
- # ------------------------------------------------------------------
- # Headings
- # ------------------------------------------------------------------
- # There are six levels of headings from h1 (the most important) to
- # h6 (the least important).
- # ------------------------------------------------------------------
-
- def tag_h1(self, attrs, indent, content, has_child=0):
- """Returns h1 definition.
-
-
-
-
- """
- return self.tag('h1', attrs, indent, content, has_child)
-
-
- def tag_h2(self, attrs, indent, content, has_child=0):
- """Returns h2 definition.
-
-
-
-
- """
- return self.tag('h2', attrs, indent, content, has_child)
-
-
- def tag_h3(self, attrs, indent, content, has_child):
- """Returns h3 definition.
-
-
-
-
- """
- return self.tag('h3', attrs, indent, content, has_child)
-
-
- def tag_h4(self, attrs, indent, content, has_child):
- """Returns h4 definition.
-
-
-
-
- """
- return self.tag('h4', attrs, indent, content, has_child)
-
-
- def tag_h5(self, attrs, indent, content, has_child=0):
- """Returns h5 definition.
-
-
-
-
- """
- return self.tag('h5', attrs, indent, content, has_child)
-
-
- def tag_h6(self, attrs, indent, content, has_child=0):
- """Returns h6 definition.
-
-
-
-
- """
- return self.tag('h6', attrs, indent, content, has_child)
-
-
- # ------------------------------------------------------------------
- # Lists
- # ------------------------------------------------------------------
-
- def tag_ul(self, attrs, indent, content, has_child=1):
- """Returns unordered list definition.
-
-
-
-
- """
- return self.tag('ul', attrs, indent, content, has_child)
-
-
- def tag_ol(self, attrs, indent, content, has_child=1):
- """Returns ordered (numbered) list definition.
-
-
-
-
- """
- return self.tag('ol', attrs, indent, content, has_child)
-
-
- def tag_li(self, attrs, indent, content, has_child=0):
- """Returns item definition for both ordered (ol) and unordered
- (ul) lists.
-
-
-
-
- """
- return self.tag('li', attrs, indent, content, has_child)
-
-
- def tag_dl(self, attrs, indent, content, has_child=1):
- """Returns definition list definition.
-
-
-
-
- """
- return self.tag('dl', attrs, indent, content, has_child)
-
-
- def tag_dt(self, attrs, indent, content, has_child=0):
- """Returns term of definition lists.
-
-
-
-
- """
- return self.tag('dt', attrs, indent, content, has_child)
-
-
- def tag_dd(self, attrs, indent, content, has_child=0):
- """Returns definition of definition lists.
-
-
-
-
- """
- return self.tag('dd', attrs, indent, content, has_child)
-
-
- # ------------------------------------------------------------------
- # Address
- # ------------------------------------------------------------------
-
- def tag_address(self, attrs, indent, content='', has_child=0):
- """Returns information on author.
-
-
-
-
- """
- return self.tag('address', attrs, indent, content)
-
-
- # ------------------------------------------------------------------
- # Horizontal Rule
- # ------------------------------------------------------------------
-
- def tag_hr(self, attrs, indent):
- """Returns horizontal rule.
-
-
-
-
- """
- return self.tag('hr', attrs, indent)
-
-
- # ------------------------------------------------------------------
- # Preformatted text
- # ------------------------------------------------------------------
-
- def tag_pre(self, attrs, indent, content):
- """Returns preformatted text.
-
-
-
-
- content is %Inline; excluding "img|object|big|small|sub|sup"
-
- """
- return self.tag('pre', attrs, indent, content)
-
-
- # ------------------------------------------------------------------
- # Block-line Quotes
- # ------------------------------------------------------------------
-
- def tag_blockquote(self, attrs, indent, content):
- """Returns block-line quote.
-
-
-
-
- """
- return self.tag('blockquote', attrs, indent, content)
-
-
- # ------------------------------------------------------------------
- # Inserted/Deleted Text
- # ------------------------------------------------------------------
-
- def tag_ins(self, attrs, indent, content):
- """Returns inserted text.
-
-
-
-
- Inserted texts are allowed in block and inline content, but
- its inappropriate to include block content within an ins
- element occurring in inline content.
-
- """
- return self.tag('ins', attrs, indent, content)
-
-
- def tag_del(self, attrs, indent, content):
- """Returns deleted text.
-
-
-
-
- Deleted texts are allowed in block and inline content, but its
- inappropriate to include block content within an ins element
- occurring in inline content.
-
- """
- return self.tag('ins', attrs, indent, content)
-
-
- # ------------------------------------------------------------------
- # The Anchor Element
- # ------------------------------------------------------------------
-
- def tag_a(self, attrs, indent, content='', has_child=0):
- """Returns the anchor element.
-
-
-
-
- content is %Inline; except that anchors shouldn't be nested.
- """
- return self.tag('a', attrs, indent, content, has_child)
-
-
- # ------------------------------------------------------------------
- # Inline Elements
- # ------------------------------------------------------------------
-
- def tag_span(self, attrs, indent, content, has_child=0):
- """Returns span definition.
-
-
-
-
- """
- return self.tag('span', attrs, indent, content, has_child)
-
-
- def tag_dbo(self, attrs, indent, content, has_child=0):
- """Returns dbo definition.
-
-
-
-
- """
- return self.tag('dbo', attrs, indent, content, has_child)
-
-
- def tag_br(self, attrs, indent):
- """Returns break definition.
-
-
-
-
- """
- return self.tag('br', attrs, indent)
-
-
- def tag_em(self, attrs, indent, content, has_child=0):
- """Returns emphasis definition.
-
-
-
-
- """
- return self.tag('em', attrs, indent, content, has_child)
-
-
- def tag_strong(self, attrs, indent, content, has_child=0):
- """Returns strong emphasis definition.
-
-
-
-
- """
- return self.tag('strong', attrs, indent, content, has_child)
-
-
- def tag_dfn(self, attrs, indent, content, has_child=0):
- """Returns definitional definition.
-
-
-
-
- """
- return self.tag('dfn', attrs, indent, content, has_child)
-
-
- def tag_code(self, attrs, indent, content, has_child=0):
- """Returns program code definition.
-
-
-
-
- """
- return self.tag('code', attrs, indent, content, has_child)
-
-
- def tag_samp(self, attrs, indent, content, has_child=0):
- """Returns sample definition.
-
-
-
-
- """
- return self.tag('samp', attrs, indent, content, has_child)
-
-
- def tag_kbd(self, attrs, indent, content, has_child=0):
- """Returns definition for something user would type.
-
-
-
-
- """
- return self.tag('kbd', attrs, indent, content, has_child)
-
-
- def tag_var(self, attrs, indent, content, has_child=0):
- """Returns variable definition.
-
-
-
-
- """
- return self.tag('var', attrs, indent, content, has_child)
-
-
- def tag_cite(self, attrs, indent, content, has_child=0):
- """Returns citation definition.
-
-
-
-
- """
- return self.tag('cite', attrs, indent, content, has_child)
-
-
- def tag_abbr(self, attrs, indent, content, has_child=0):
- """Returns abbreviation definition.
-
-
-
-
- """
- return self.tag('abbr', attrs, indent, content, has_child)
-
-
- def tag_acronym(self, attrs, indent, content, has_child=0):
- """Returns the acronym definition.
-
-
-
-
- """
- return self.tag('acronym', attrs, indent, content, has_child)
-
-
- def tag_q(self, attrs, indent, content, has_child=0):
- """Returns inline quote definition.
-
-
-
-
- """
- return self.tag('q', attrs, indent, content, has_child)
-
-
- def tag_sub(self, attrs, indent, content, has_child=0):
- """Returns subscript definition.
-
-
-
-
- """
- return self.tag('sub', attrs, indent, content, has_child)
-
-
- def tag_sup(self, attrs, indent, content, has_child=0):
- """Returns superscript definition.
-
-
-
-
- """
- return self.tag('sup', attrs, indent, content, has_child)
-
-
- def tag_tt(self, attrs, indent, content, has_child=0):
- """Returns fixed pitch font definition.
-
-
-
-
- """
- return self.tag('tt', attrs, indent, content, has_child)
-
-
- def tag_i(self, attrs, indent, content, has_child=0):
- """Returns italic font definition.
-
-
-
-
- """
- return self.tag('i', attrs, indent, content, has_child)
-
-
- def tag_b(self, attrs, indent, content, has_child=0):
- """Returns bold font definition.
-
-
-
-
- """
- return self.tag('b', attrs, indent, content, has_child)
-
-
- def tag_big(self, attrs, indent, content, has_child=0):
- """Returns bigger font definition.
-
-
-
-
- """
- return self.tag('big', attrs, indent, content, has_child)
-
-
- def tag_small(self, attrs, indent, content, has_child=0):
- """Returns smaller font definition.
-
-
-
-
- """
- return self.tag('small', attrs, indent, content, has_child)
-
-
- # ------------------------------------------------------------------
- # Object
- # ------------------------------------------------------------------
-
- def tag_object(self, attrs, indent, content, has_child=1):
- """Returns object definition.
-
-
-
-
- The object definition is used to embed objects as part of HTML
- pages. param elements should precede other content.
- Parameters can also be expressed as attribute/value pairs on
- the object element itself when brevity is desired.
-
- """
- return self.tag('object', attrs, indent, content, has_child)
-
-
- def tag_param(self, attrs, indent):
- """Returns param definition.
-
-
-
-
- The param definition is used to supply a named property value.
- In XML it would seem natural to follow RDF and support an
- abbreviated syntax where the param elements are replaced by
- attribute value pairs on the object start tag.
-
- """
- return self.tag('object', attrs, indent)
-
-
- # ------------------------------------------------------------------
- # Images
- # ------------------------------------------------------------------
-
- def tag_img(self, attrs, indent):
- """Returns image definition.
-
-
-
-
- To avoid accessibility problems for people who aren't able to
- see the image, you should provide a text description using the
- alt and longdesc attributes. In addition, avoid the use of
- server-side image maps. Note that in this DTD there is no
- name attribute. That is only available in the transitional
- and frameset DTD.
-
- usemap points to a map element which may be in this document
- or an external document, although the latter is not widely
- supported.
-
- """
- return self.tag('img', attrs, indent)
-
-
- # ------------------------------------------------------------------
- # Client-side image maps
- # ------------------------------------------------------------------
-
- def tag_map(self, attrs, indent, content, has_child=1):
- """Returns map definition.
-
-
-
-
- This can be placed in the same document or grouped in a
- separate document although this isn't yet widely supported.
-
- """
- return self.tag('map', attrs, indent, indent, content, has_child)
-
-
- def tag_area(self, attrs, indent):
- """Returns area definition.
-
-
-
-
- This can be placed in the same document or grouped in a
- separate document although this isn't yet widely supported.
-
- """
- return self.tag('area', attrs, indent)
-
-
- # ------------------------------------------------------------------
- # Forms
- # ------------------------------------------------------------------
-
- def tag_form(self, attrs, indent, content, has_child=1):
- """Returns form definition.
-
-
-
-
- """
- return self.tag('form', attrs, indent, content, has_child)
-
-
- def tag_label(self, attrs, indent, content, has_child=0):
- """Returns label definition.
-
-
-
-
- Each label must not contain more than ONE field Label elements
- shouldn't be nested.
-
- """
- return self.tag('label', attrs, indent, content, has_child)
-
-
- def tag_input(self, attrs, indent):
- """Returns input definition for form control.
-
-
-
-
-
-
- The name attribute is required for all but submit & reset.
-
- """
- return self.tag('input', attrs, indent)
-
-
- def tag_select(self, attrs, indent, content, has_child=0):
- """Returns select definition.
-
-
-
-
- """
- return self.tag('select', attrs, indent, content, has_child)
-
-
- def tag_optgroup(self, attrs, indent, content, has_child=1):
- """Returns option group definition.
-
-
-
-
- """
- return self.tag('optgroup', attrs, indent, content, has_child)
-
-
- def tag_option(self, attrs, indent, content, has_child=0):
- """Returns option definition.
-
-
-
-
- """
- return self.tag('option', attrs, indent, content, has_child)
-
-
- def tag_textarea(self, attrs, indent, content):
- """Returns textarea definition.
-
-
-
-
- """
- return self.textarea('textarea', attrs, indent, content)
-
-
- def tag_fieldset(self, attrs, indent, content, has_child=1):
- """Returns fieldset definition.
-
-
-
-
- The fieldset element is used to group form fields. Only one
- legend element should occur in the content and if present
- should only be preceded by whitespace.
-
- """
- return self.tag('filedset', attrs, indent, content, has_child)
-
-
- def tag_legend(self, attrs, indent, content):
- """Retruns legend definition.
-
-
-
-
- """
- return self.tag('legend', attrs, indent, content)
-
-
- def tag_button(self, attrs, indent, content):
- """Returns button definition.
-
-
-
-
- content is %Flow; excluding a, form and form controls.
-
- """
- return self.tag('button', attrs, indent, content)
-
-
- def tag_table(self, attrs, indent, content, has_child=1):
- """Returns table definition.
-
-
-
-
-
-
-
-
-
-
- Derived from IETF HTML table standard, see [RFC1942]
-
- The border attribute sets the thickness of the frame around
- the table. The default units are screen pixels. The frame
- attribute specifies which parts of the frame around the table
- should be rendered. The values are not the same as CALS to
- avoid a name clash with the valign attribute. The rules
- attribute defines which rules to draw between cells: If rules
- is absent then assume: "none" if border is absent or
- border="0" otherwise "all". Horizontal alignment attributes
- for cell contents:
- char alignment char, e.g. char=':'
- charoff offset for alignment char
-
- """
- return self.tag('table', attrs, indent, content, has_child)
-
-
- def tag_caption(self, attrs, indent, content):
- """Returns caption definition.
-
-
-
-
- """
- return self.tag('caption', attrs, indent, content)
-
-
- def tag_thead(self, attrs, indent, content, has_child=1):
- """Returns thead definition.
-
-
-
-
- Use thead to duplicate headers when breaking table across page
- boundaries, or for static headers when tbody sections are
- rendered in scrolling panel.
-
- """
- return self.tag('thead', attrs, indent, content, has_child)
-
-
- def tag_tbody(self, attrs, indent, content, has_child=1):
- """Returns tbody definition.
-
-
-
-
- Use tbody to duplicate footers when breaking table across page
- boundaries, or for static footers when tbody sections are
- rendered in scrolling panel.
-
- """
- return self.tag('tbody', attrs, indent, content, has_child)
-
-
- def tag_tbody(self, attrs, indent, content, has_child=1):
- """Returns tbody definition.
-
-
-
-
- Use multiple tbody sections when rules are needed between
- groups of table rows.
-
- """
- return self.tag('tbody', attrs, indent, content, has_child)
-
-
- def tag_colgroup(self, attrs, indent, content, has_child=1):
- """Returns colgroup definition.
-
-
-
-
- colgroup groups a set of col elements. It allows you to group
- several semantically related columns together.
-
- """
- return self.tag('colgroup', attrs, indent, content, has_child)
-
-
- def tag_col(self, attrs, indent):
- """Returns col definition.
-
-
-
-
- col elements define the alignment properties for cells in one
- or more columns. The width attribute specifies the width of
- the columns, e.g.
-
- width=64 width in screen pixels
- width=0.5* relative width of 0.5
-
- The span attribute causes the attributes of one col element to
- apply to more than one column.
-
- """
- return self.tag('col', attrs, indent)
-
-
- def tag_tr(self, attrs, indent, content, has_child=1):
- """Returns table row definition.
-
-
-
-
- """
- return self.tag('tr', attrs, indent, content, has_child)
-
-
- def tag_th(self, attrs, indent, content, has_child):
- """Returns table header definition.
-
-
-
-
-
-
- Scope is simpler than headers attribute for common tables. th
- is for headers, td for data and for cells acting as both.
-
- """
- return self.tab('th', attrs, indent, content, has_child)
-
-
- def tag_td(self, attrs, indent, content, has_child=1):
- """Returns table data definition.
-
-
-
-
- """
- return self.tag('td', attrs, indent, content, has_child)
diff --git a/Scripts/Python/Webenv/cgi-bin/webenv.cgi b/Scripts/Python/Webenv/cgi-bin/webenv.cgi
deleted file mode 100755
index d137638..0000000
--- a/Scripts/Python/Webenv/cgi-bin/webenv.cgi
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/python
-#
-# centos-web.cgi -- This script is an effort to organize The CentOS
-# Project information in XHTML format for its publication on the
-# Internet. The script is organized in a package named `Apps' which,
-# in turn, is subdivided in other packages (e.g., `Home', `Sponsors',
-# etc.) to cover each web application the organization demands.
-#
-# Notice that some of the web applications demanded (e.g., Wiki,
-# Lists, Forums, Bugs, etc.) are not included in this script, but
-# linked to their own locations. Moreover, in order to provide
-# accessability among all different web applications, they need to be
-# redesigned to share one unique visual style and one unique top-level
-# navigation bar so the current web application can be remarked.
-#
-# Copyright (C) 2011 Alain Reguera Delgado
-#
-# 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 cgi
-import cgitb; cgitb.enable()
-
-def main():
-
- qs = cgi.parse()
-
- if 'app' in qs:
- app = qs['app'][0].lower()
- else:
- app = 'home'
-
- if app == 'home':
- from Apps.Home import page
- elif app == 'sponsors':
- from Apps.Sponsors import page
- else:
- from Apps.Unknown import page
-
- print 'Content-type: text/html' + "\n"
- print page.main()
-
-if __name__ == '__main__': main()
diff --git a/Scripts/Python/Webenv/public/Images/a-attach.png b/Scripts/Python/Webenv/public/Images/a-attach.png
deleted file mode 100644
index d6a41e7..0000000
Binary files a/Scripts/Python/Webenv/public/Images/a-attach.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/a-mail.png b/Scripts/Python/Webenv/public/Images/a-mail.png
deleted file mode 100644
index 355a998..0000000
Binary files a/Scripts/Python/Webenv/public/Images/a-mail.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/a-www.png b/Scripts/Python/Webenv/public/Images/a-www.png
deleted file mode 100644
index e5a0483..0000000
Binary files a/Scripts/Python/Webenv/public/Images/a-www.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/ads-sample-468x60.png b/Scripts/Python/Webenv/public/Images/ads-sample-468x60.png
deleted file mode 100644
index f634d10..0000000
Binary files a/Scripts/Python/Webenv/public/Images/ads-sample-468x60.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/ads-sample-728x90.png b/Scripts/Python/Webenv/public/Images/ads-sample-728x90.png
deleted file mode 100644
index 5401e60..0000000
Binary files a/Scripts/Python/Webenv/public/Images/ads-sample-728x90.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/caution.png b/Scripts/Python/Webenv/public/Images/caution.png
deleted file mode 100644
index efcec04..0000000
Binary files a/Scripts/Python/Webenv/public/Images/caution.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/centos-logo.png b/Scripts/Python/Webenv/public/Images/centos-logo.png
deleted file mode 100644
index 506c65d..0000000
Binary files a/Scripts/Python/Webenv/public/Images/centos-logo.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/convenction.png b/Scripts/Python/Webenv/public/Images/convenction.png
deleted file mode 100644
index e516c0e..0000000
Binary files a/Scripts/Python/Webenv/public/Images/convenction.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/error.png b/Scripts/Python/Webenv/public/Images/error.png
deleted file mode 100644
index 0f52b4d..0000000
Binary files a/Scripts/Python/Webenv/public/Images/error.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/h1-bg.png b/Scripts/Python/Webenv/public/Images/h1-bg.png
deleted file mode 100644
index e609c59..0000000
Binary files a/Scripts/Python/Webenv/public/Images/h1-bg.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/h2-bg.png b/Scripts/Python/Webenv/public/Images/h2-bg.png
deleted file mode 100644
index 826fbec..0000000
Binary files a/Scripts/Python/Webenv/public/Images/h2-bg.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/html-bg.png b/Scripts/Python/Webenv/public/Images/html-bg.png
deleted file mode 100644
index 0c6dca6..0000000
Binary files a/Scripts/Python/Webenv/public/Images/html-bg.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/important.png b/Scripts/Python/Webenv/public/Images/important.png
deleted file mode 100644
index 509ec86..0000000
Binary files a/Scripts/Python/Webenv/public/Images/important.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/msg-bg-blue.png b/Scripts/Python/Webenv/public/Images/msg-bg-blue.png
deleted file mode 100644
index 47bc405..0000000
Binary files a/Scripts/Python/Webenv/public/Images/msg-bg-blue.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/msg-bg-gray.png b/Scripts/Python/Webenv/public/Images/msg-bg-gray.png
deleted file mode 100644
index a8a9246..0000000
Binary files a/Scripts/Python/Webenv/public/Images/msg-bg-gray.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/msg-bg-green.png b/Scripts/Python/Webenv/public/Images/msg-bg-green.png
deleted file mode 100644
index f1bfe2b..0000000
Binary files a/Scripts/Python/Webenv/public/Images/msg-bg-green.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/msg-bg-orange.png b/Scripts/Python/Webenv/public/Images/msg-bg-orange.png
deleted file mode 100644
index 0866bb8..0000000
Binary files a/Scripts/Python/Webenv/public/Images/msg-bg-orange.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/msg-bg-red.png b/Scripts/Python/Webenv/public/Images/msg-bg-red.png
deleted file mode 100644
index 2dc3e70..0000000
Binary files a/Scripts/Python/Webenv/public/Images/msg-bg-red.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/msg-bg-violet.png b/Scripts/Python/Webenv/public/Images/msg-bg-violet.png
deleted file mode 100644
index 8b1075d..0000000
Binary files a/Scripts/Python/Webenv/public/Images/msg-bg-violet.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/note.png b/Scripts/Python/Webenv/public/Images/note.png
deleted file mode 100644
index b58a224..0000000
Binary files a/Scripts/Python/Webenv/public/Images/note.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/redirect.png b/Scripts/Python/Webenv/public/Images/redirect.png
deleted file mode 100644
index 16a8c41..0000000
Binary files a/Scripts/Python/Webenv/public/Images/redirect.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/success.png b/Scripts/Python/Webenv/public/Images/success.png
deleted file mode 100644
index 74cc874..0000000
Binary files a/Scripts/Python/Webenv/public/Images/success.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/tabs-bg-1.png b/Scripts/Python/Webenv/public/Images/tabs-bg-1.png
deleted file mode 100644
index 22cff37..0000000
Binary files a/Scripts/Python/Webenv/public/Images/tabs-bg-1.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/tabs-bg-2.png b/Scripts/Python/Webenv/public/Images/tabs-bg-2.png
deleted file mode 100644
index 5d8e178..0000000
Binary files a/Scripts/Python/Webenv/public/Images/tabs-bg-2.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/tip.png b/Scripts/Python/Webenv/public/Images/tip.png
deleted file mode 100644
index cfcf6db..0000000
Binary files a/Scripts/Python/Webenv/public/Images/tip.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/top.png b/Scripts/Python/Webenv/public/Images/top.png
deleted file mode 100644
index 1557422..0000000
Binary files a/Scripts/Python/Webenv/public/Images/top.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/ul.png b/Scripts/Python/Webenv/public/Images/ul.png
deleted file mode 100644
index efcf485..0000000
Binary files a/Scripts/Python/Webenv/public/Images/ul.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Images/warning.png b/Scripts/Python/Webenv/public/Images/warning.png
deleted file mode 100644
index e36c02a..0000000
Binary files a/Scripts/Python/Webenv/public/Images/warning.png and /dev/null differ
diff --git a/Scripts/Python/Webenv/public/Stylesheet/admonition.css b/Scripts/Python/Webenv/public/Stylesheet/admonition.css
deleted file mode 100755
index a08eff5..0000000
--- a/Scripts/Python/Webenv/public/Stylesheet/admonition.css
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Webenv -> Quotation
- *
- * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
- *
- * This CSS 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 CSS 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$
- * ----------------------------------------------------------------------
- */
-
-div#page-body div.admonition {
- border: 1px solid;
- border-left: 5px solid;
- padding: 10px 20px 10px 10px;
- margin: 1.5em 0 1.5em 0;
- }
-
-div#page-body div.admonition pre {
- border: none;
- background-color: #333;
- color: #FFFFFF;
- }
-
-div#page-body div.admonition img {
- float: left;
- }
-
-
-div#page-body div.admonition h3 {
- margin-top: 10px;
- line-height: 1.5em;
- }
-
-div#page-body div.admonition h3,
-div#page-body div.admonition p,
-div#page-body div.admonition pre,
-div#page-body div.admonition table {
- margin-left: 60px;
- }
-
-div#page-body div.admonition ul,
-div#page-body div.admonition ol,
-div#page-body div.admonition dl {
- margin-left: 110px;
- }
-
-div#page-body div.admonition ul dl,
-div#page-body div.admonition ul ol,
-div#page-body div.admonition ul ul,
-div#page-body div.admonition ol dl,
-div#page-body div.admonition ol ol,
-div#page-body div.admonition ol ul,
-div#page-body div.admonition dl dl,
-div#page-body div.admonition dl ol,
-div#page-body div.admonition dl ul {
- margin-left: 2.5em;
- }
-
-div#page-body div.admonition.unknown pre,
-div#page-body div.admonition.unknown h3,
-div#page-body div.admonition.unknown p,
-div#page-body div.admonition.unknown table {
- margin-left: 20px;
- }
-
-div#page-body div.admonition.success,
-div#page-body div.admonition.redirected,
-div#page-body div.admonition.error {
- border: none;
- border-top: 5px solid;
- border-bottom: 5px solid;
- border-color: #CFCFCF;
- }
-
-div#page-body div.admonition.unknown,
-div#page-body div.admonition.redirected,
-div#page-body div.admonition.note {
- background-image: url("https://projects.centos.org/public/Images/msg-bg-blue.png");
- border-color: #D2E0F6;
- background-color: #ECF4FF;
- }
-
-div#page-body div.admonition.tip,
-div#page-body div.admonition.important,
-div#page-body div.admonition.caution,
-div#page-body div.admonition.warning {
- border-color: #F6E7D2;
- background-color: #FFF8EC;
- background-image: url("https://projects.centos.org/public/Images/msg-bg-orange.png");
- }
-
-div#page-body div.admonition.violet {
- border-color: #F6D2F6;
- background-color: #FFECFF;
- background-image: url("https://projects.centos.org/public/Images/msg-bg-violet.png");
- }
-
-div#page-body div.admonition.error {
- border-color: #E0B7B7;
- background-color: #FFECEC;
- background-image: url("https://projects.centos.org/public/Images/msg-bg-red.png");
- }
-
-div#page-body div.admonition.success {
- border-color: #D6F6D2;
- background-color: #EEFFEC;
- background-image: url("https://projects.centos.org/public/Images/msg-bg-green.png");
- }
diff --git a/Scripts/Python/Webenv/public/Stylesheet/base.css b/Scripts/Python/Webenv/public/Stylesheet/base.css
deleted file mode 100755
index d062cdc..0000000
--- a/Scripts/Python/Webenv/public/Stylesheet/base.css
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Webenv -> Main Blocks
- *
- * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
- *
- * This CSS 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 CSS 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$
- * ----------------------------------------------------------------------
- */
-
-div#page-header,
-div#wrap,
-div#page-body,
-div#page-footer {
- min-width: 728px;
- }
-
-/* Header
---------------------------------------------------------------------*/
-div#page-header {
- background: #204C8D url("https://projects.centos.org/public/Images/h1-bg.png") 0 0 repeat;
- min-height: 46px;
- }
-
-/* Content
---------------------------------------------------------------------*/
-
-div#wrap {
- padding: 0 10px 0 10px;
- background-color: #FFF;
- }
-
-div#page-body {
- clear: both;
- background-color: #F8F8F8;
- }
-
-div#page-body div#content-list {
- padding: 10px;
- padding-left: 0;
- padding-top: 8px;
- background-color: #FFF;
- }
-
-/* Paragraphs
---------------------------------------------------------------------*/
-
-/* Footer
---------------------------------------------------------------------*/
-
-div#page-footer {
- background: #204C8D url("https://projects.centos.org/public/Images/h1-bg.png") 0 0 repeat;
- }
-
-div#page-footer div.credits {
- padding: 8px;
- }
-
-div#page-footer div.credits .copyright,
-div#page-footer div.credits .license {
- font-size: x-small;
- color: #FFF;
- margin: 3px;
- }
-
-div#page-footer div.credits a {
- color: #FFF;
- font-style: italic;
- }
-
-div#page-footer div.top {
- float:right;
- }
-
-/* Logo
---------------------------------------------------------------------*/
-
-div#page-header div#logo img {
- border: none;
- float: left;
- margin-left: 10px;
- }
-
-/* Google advertisement (468x60px)
---------------------------------------------------------------------*/
-
-div#page-header div.google-ad {
- float: right;
- margin: 5px;
- }
-
-div#page-header div.google-ad img {
- border: none;
- }
-
-/* Last releases and related RSS link.
---------------------------------------------------------------------*/
-
-div#page-header div#last-releases {
- clear: both;
- min-height: 35px;
- border-top: 3px solid #FFF;
- background: #3465A4;
- }
-
-div#page-header div#last-releases a {
- color: #fff;
- }
-
-div#page-header div#last-releases div.left {
- display: block;
- float: left;
- width: 450px;
- margin-top: 10px;
- margin-left: 10px;
- font-size: small;
- }
-
-div#page-header div#last-releases div.right {
- float: right;
- margin-top: 9px;
- margin-right: 5px;
- }
-
-div#page-header div#last-releases div.right span.rss span {
- text-align: center;
- font-weight: bold;
- background: #729fcf;
- padding: 4px 10px;
- }
-
-div#page-header div#last-releases div span.title {
- font-weight: bold;
- color: #FFF;
- }
-
-div#page-header div#last-releases div span.release {
- border-right: 1px dotted #FFF;
- padding-left: 10px;
- padding-right: 10px;
- font-weight: bold;
- }
-
-div#page-header div#last-releases div span.last {
- border-right: 0px;
- }
-
-/* Application links
---------------------------------------------------------------------*/
-
-div#page-header div#pagelinks {
- border-top: 3px solid #FFF;
- }
-
-/* User related links (e.g., last visit, session info and page trails)
---------------------------------------------------------------------*/
-
-div#page-header div.userlinks {
- padding: 10px;
- text-align: right;
- font-size: x-small;
- clear: both;
- }
-
-div#page-header div.userlinks a {
- color: #fff;
- }
-
-div#page-header div.userlinks div.logs {
- width: 50%;
- float: left;
- text-align: left;
- }
-
-div#page-header div.userlinks div.logs span {
- border: none;
- }
-
-div#page-header div.userlinks div.logs span.title {
- color: #FFF;
- }
-
-div#page-header div.userlinks div.logs span.datetime {
- font-style: italic;
- color: #FFF;
- }
-
-div#page-header div.userlinks div.session {
- width: 50%;
- float: right;
- }
-
-div#page-header div.userlinks div.session span {
- border-right: 1px dotted #FFF;
- }
-
-div#page-header div.userlinks div.session span a {
- margin-right: 10px;
- margin-left: 10px;
- }
-
-
-div#page-header div.userlinks div.session span.last {
- border-right: none;
- }
-
-div#page-header div.userlinks div.session span.last a {
- margin-right: 0;
- }
-
-div#page-header div.userlinks div.session span.last:after {
- content: none;
- }
-
-div#page-header div.userlinks div.trail {
- text-align: right;
- clear: both;
- padding-top: 5px;
- }
-
-div#page-header div.userlinks div.trail span {
- display: inline;
- }
-
-div#page-header div.userlinks div.trail span.last {
- border-right: none;
- padding-right: 0;
- }
-
-div#page-header div.userlinks div.trail span:after {
- content: "»";
- color: #FFF;
- margin-left: 5px;
- margin-right: 3px;
- }
-
-div#page-header div.userlinks div.trail span.last:after {
- content: none;
- }
-
-/* Page lines.
---------------------------------------------------------------------*/
-
-.page-line {
- clear: both;
- margin: 0;
- padding: 0;
- background-color: transparent;
- }
-
-.page-line.white {
- height: 3px;
- background-color: #FFF;
- }
-
-/* Page body
---------------------------------------------------------------------*/
-
-div#page-body .info {
- margin-top: 5px;
- }
-
-div#page-body .info span {
- font-size: small;
- border-right: 1px dotted #AAA;
- padding-right: 10px;
- padding-left: 7px;
- }
-
-div#page-body .info span.author {
- padding-left: 0;
- }
-
-div#page-body .info span.comment {
- border-right: 0;
- }
-
-/* Content Listing - One column
---------------------------------------------------------------------*/
-
-div#page-body div#content-list {
- margin-right: 200px;
- border-right: 3px #EEE solid;
- }
-
-div#page-body div#content-actions {
- float:right;
- width: 180px;
- border-left: 3px #EEE solid;
- padding: 10px;
- font-size: small;
- }
-
-div#page-body div#content-actions form input[type="text"] {
- border: 1px solid #AAA;
- }
-
-div#page-body div#content-list div.search {
- }
-
-div#page-body div#content-list div.row {
- padding: 10px 20px;
- }
-
-div#page-body div#content-list div.dark {
- background: #F8F8F8;
- }
-
-div#page-body div#content-list div.light {
- background: #FFF;
- }
-
-div#page-body div#content-list h3.title {
- margin-top: 0;
- }
-
-div#page-body div#content-list .abstract {
- margin-bottom: 1em;
- }
-
-div#page-body div#content-list .pagination {
- border-top: 1px solid #AAA;
- font-size: small;
- padding: 10px;
- border-top: 1px #AAA solid;
- margin-bottom: 0;
- padding-bottom: 0;
- }
-
-div#page-body div#content-list .pagination span.previous {
- float: left;
- }
-
-div#page-body div#content-list .pagination span.previous a:before {
- content: "«";
- padding-right: 3px;
- }
-
-div#page-body div#content-list .pagination span.next a:after {
- content: "»";
- padding-left: 3px;
- }
-
-div#page-body div#content-list .pagination span.next {
- float: right;
- }
-
-/* Content Details - One column
---------------------------------------------------------------------*/
-
-div#page-body div#content-details {
- padding: 30px 10% 30px 10%;
- background: #FFF;
- }
-
-/* Content Unkown - Not page found.
---------------------------------------------------------------------*/
-
-div#page-body div#content-unknown {
- padding: 0 15% 0 15%;
- background: #FFF;
- }
diff --git a/Scripts/Python/Webenv/public/Stylesheet/forms.css b/Scripts/Python/Webenv/public/Stylesheet/forms.css
deleted file mode 100755
index 9a39fc2..0000000
--- a/Scripts/Python/Webenv/public/Stylesheet/forms.css
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Webenv -> Forms
- *
- * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
- *
- * This CSS 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 CSS 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$
- * ----------------------------------------------------------------------
- */
-
-div#page-body div.row1 {
- clear: both;
- background: #F8F8F8;
- padding: 10px;
- }
-
-div#page-body div.row2 {
- clear: both;
- background: #FFFFFF;
- padding: 10px;
- }
-
-div#page-body div.row3 {
- clear: both;
- border-top: 1px solid #CCC;
- padding: 10px;
- margin-top: 10px;
- }
-
-div#page-body fieldset div.row1 span.descrip,
-div#page-body fieldset div.row2 span.descrip {
- float: left;
- }
-
-div#page-body fieldset div.field {
- display: block;
- margin-left: 30%;
- }
-
-div#page-body fieldset div.field div.column {
- float: left;
- margin-right: 1em;
- padding-right: 1em;
- border-right: 1px dotted #AAA;
- }
-
-div#page-body fieldset div.row3 div.descrip {
- display: block;
- font-size: small;
- color: #AAA;
- font-style: italic;
- width: 70%
- }
-
-div#page-body fieldset span.submit {
- float: right;
- }
-
-/* */
-
-div#page-body form div {
- padding-bottom: 10px;
- }
-
-div#page-body form div span {
- display: inline;
- margin: 0;
- padding-right: 10px;
- }
-
-div#page-body div span.results {
- padding-left: 10px;
- border-left: 1px dotted #AAA;
- }
-
-/* */
-
-
-/* */
-
-div#page-body div.records-list {
- display: block;
- }
-
-div#page-body div.records-list ul {
- margin: 0;
- padding: 0;
- list-style: none;
- }
-
-div#page-body div.records-list ul li {
- padding: 0.5em;
- }
-
-div#page-body div.records-list ul li.row1 {
- background: #F8F8F8;
- }
-
-div#page-body div.records-list ul li span.col0 {
- display: block;
- float:left;
- text-align: center;
- padding-right: 0.5em;
- margin-right: 0.5em;
- border-right: 1px solid #FFF;
- }
-
-div#page-body div.records-list ul li span.col1 {
- width: 250px;
- display: block;
- float:left;
- }
-
-div#page-body div.records-list ul li span.col2 {
- border-left: 1px solid #FFF;
- padding-left: 0.5em;
- }
-
-div#page-body div.records-list ul li.title {
- font-weight: bold;
- background: #eee;
- border-bottom: 1px #AAA solid;
- }
diff --git a/Scripts/Python/Webenv/public/Stylesheet/links.css b/Scripts/Python/Webenv/public/Stylesheet/links.css
deleted file mode 100755
index d0ae637..0000000
--- a/Scripts/Python/Webenv/public/Stylesheet/links.css
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Webenv -> Links
- *
- * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
- *
- * This CSS 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 CSS 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$
- * ----------------------------------------------------------------------
- */
-
-/* Broken or nonexistent links.
---------------------------------------------------------------------*/
-
-div#page-body a.nonexistent,
-div#page-body a.nonexistent:hover { color: gray; }
-
-/* Special decoration for some links' classes
---------------------------------------------------------------------*/
-
-div#page-body a.www:before {
- white-space:nowrap;
- content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-www.png);
- margin: 0 0.2em;
- }
-
-div#page-body a.http:before {
- white-space:nowrap;
- content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-www.png);
- margin: 0 0.2em;
- }
-
-div#page-body a.https:before {
- white-space:nowrap;
- content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-www.png);
- margin: 0 0.2em;
- }
-
-div#page-body a.mailto:before {
- white-space:nowrap;
- content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-mail.png);
- margin: 0 0.2em;
- }
-
-div#page-body a.attachment:before {
- white-space:nowrap;
- content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-attach.png);
- margin: 0 0.2em;
- }
diff --git a/Scripts/Python/Webenv/public/Stylesheet/lists.css b/Scripts/Python/Webenv/public/Stylesheet/lists.css
deleted file mode 100755
index cdea058..0000000
--- a/Scripts/Python/Webenv/public/Stylesheet/lists.css
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Webenv -> Lists
- *
- * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
- *
- * This CSS 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 CSS 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$
- * ----------------------------------------------------------------------
- */
-
-div#page-body ul {
- /*
- list-style: url("https://projects.centos.org/public/Images/ul.png") disc;
- */
- }
-
-div#page-body ul,
-div#page-body ol {
- margin-left: 2.5em;
- }
-
-div#page-body ul ol,
-div#page-body ol ul,
-div#page-body dl ul,
-div#page-body dl ol {
- margin-left: 1.5em;
- }
-
-div#page-body div#links ul {
- padding: 0.5em 0.5em 1em 1em;
- margin: 0;
- list-style: none;
- border-top: 1px #EEE solid;
- }
-
-div#page-body div#links ul.first {
- border-top: none;
- }
-
-div#page-body div#links ul li {
- padding: 2px;
- }
-
-/* Table of content (toc)
---------------------------------------------------------------------*/
-
-div#page-body div.toc {
- font-size: small;
- text-align:left;
- margin-bottom: 2em;
- }
-
-div#page-body div.toc p {
- font-weight: bold;
- margin: 0.5em 0 0.5em 0;
- }
-
-div#page-body div#content div.toc dl {
- margin: 0;
- }
-
-div#page-body div#content div.toc dl dl {
- margin-left: 2.5em;
- }
-
-/* Content actions links (e.g., categories and archives).
---------------------------------------------------------------------*/
-
-div#page-body div#content-actions dl {
- margin-top: 0;
- margin-left: 0;
- }
-
-div#page-body div#content-actions dl dt {
- font-weight: bold;
- border-bottom: 1px solid #EEE;
- margin-bottom: 1em;
- }
-
-div#page-body div#content-actions dl dd {
- margin-left: 1.5em;
- }
-
-div#page-body div#content-actions dl dl {
- margin-left: 1.5em;
- margin-top: 0px;
- border-top: none;
- padding-top: 0;
- }
-
-div#page-body div#content-actions dl dl.year {
- margin-bottom: 1em;
- }
-
-div#page-body div#content-actions dl dl.year dd {
- margin-left: 0;
- }
diff --git a/Scripts/Python/Webenv/public/Stylesheet/reset.css b/Scripts/Python/Webenv/public/Stylesheet/reset.css
deleted file mode 100755
index 202310d..0000000
--- a/Scripts/Python/Webenv/public/Stylesheet/reset.css
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Webenv (reset) -- This file resets the browser's default visual
- * style and sets The CentOS Web Environment visual style as default
- * visual style. This file sets default values to tags like `html',
- * `body', as well as those controlling links, tables, paragrphs,
- * headings, lists, forms and quotation.
- *
- * The CentOS Web Environment (Webenv) is specially conceived to
- * achieve one unique visual style and easy navegation through all
- * different web applications The CentOS Project uses to show its
- * existence in the World Wide Web medium.
- *
- * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
- *
- * This CSS 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 CSS 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$
- * -------------------------------------------------------------------
- */
-
-
-/* Reset browsers default margins and paddings
------------------------------------------------*/
-
-* {
- margin: 0;
- padding: 0;
- }
-
-/* Define html
------------------------------------------------*/
-
-html {
- background-color: #FFF;
- background-image: url("https://projects.centos.org/public/Images/html-bg.png");
- }
-
-/* Define body
------------------------------------------------*/
-
-body {
- font-family: "DejaVu Sans", "Liberation Sans", sans-serif;
- font-size: 0.85em;
- /* margin: 0; /* <- full screen */
- /* margin: 0 1% 0 1%; /* <- with 1% of left and right margin */
- /* margin: 0 2% 0 2%; /* <- with 2% of left and right margin */
- margin: 0 3% 0 3%; /* <- with 3% of left and right margin */
- /* margin: 0 10% 0 10%; /* <- with 10% of left and right margin */
- color: #333;
- }
-
-/* Links
------------------------------------------------*/
-
-a:link { text-decoration: none; color: #0044B3; }
-a:hover { text-decoration: underline; color: green; }
-a:active { text-decoration: underline; color: green; }
-a:visited { text-decoration: none; color: #0044B3; }
-a:visited:hover { text-decoration: underline; color: green; }
-
-.title,
-.title a:link,
-.title a:active,
-.title a:hover,
-.title a:visited,
-.title a:visited:hover {
- /* color: #072B61; */
- color: #000000;
- }
-
-/* Headings
------------------------------------------------*/
-
-h1 {
- font-size: 2em;
- line-height: 1.3em;
- }
-
-h2 {
- font-size: 1.5em;
- line-height: 1.5em;
- margin-top: 1.5em;
- }
-
-h3 {
- font-size: 1.4em;
- line-height: 1.4em;
- margin-top: 1.4em;
- }
-
-h4 {
- font-size: 1.2em;
- line-height: 1.2em;
- margin-top: 1.2em;
- }
-
-h5 {
- font-size: 1.1em;
- line-height: 1.1em;
- margin-top: 1.1em;
- }
-
-h6 {
- font-size: 1em;
- line-height: 1em;
- margin-top: 1em;
- }
-
-/* Paragraphs
------------------------------------------------*/
-
-p {
- margin: 1em 0 1.5em 0;
- line-height: 1.5em;
- text-align: justify;
- }
-
-/* Images
------------------------------------------------*/
-
-img {
- border: none;
- }
-
-/* Quotations
------------------------------------------------*/
-
-blockquote {
- background: #fafafa;
- border-color: #eeeeee;
- border-width: 1px;
- border-style: solid;
- border-left-width: 4px;
- margin-left: 1.5em;
- padding: 0.5em;
- margin-top: 1em;
- margin-bottom: 1.3em;
- }
-
-q:before {
- content: " “";
- }
-
-q:after {
- content: "” ";
- }
-
-q q:before {
- content: " ‘";
- }
-
-q q:after {
- content: "’ ";
- }
-
-address {
- margin-left: 1.5em;
- }
-
-/* Preformatted Texts
------------------------------------------------*/
-
-pre {
- font-family: "DejaVu Sans Mono", "Liberation Mono", monospace;
- padding: 0.5em 1em 0.5em 1em;
- margin: 1em 0 1em 0;
- white-space: pre;
- border-width: 1px;
- border-style: solid;
- border-color: #E5E5E5;
- border-left-width: 4px;
- background: #FFFAE9;
- overflow: auto;
- }
-
-/* Phrase Elements
------------------------------------------------*/
-
-tt,
-samp,
-kbd,
-code {
- font-family: "DejaVu Sans Mono", "Liberation Mono", monospace;
- }
-
-/* Page Lines
------------------------------------------------*/
-
-hr {
- clear: both;
- height: 1px ! important;
- border: none;
- background-color: #DADADA;
- }
-
-/* Lists
------------------------------------------------*/
-
-ul,
-ol,
-dl {
- margin: 1.5em 0 1.5em 2.5em;
- }
-
-ul {
- list-style: disc;
- }
-
-ol {
- list-style-image: none !important;
- }
-
-ul li,
-ol li {
- line-height: 1.5em;
- }
-
-ul ul,
-ul ol,
-ol ul,
-ol ol {
- margin-top: 0.3em;
- margin-bottom: 0.3em;
- }
-
-ul li p,
-ol li p {
- margin-bottom: 0.3em;
- }
-
-dl dd {
- margin-left: 2.5em;
- }
-
-dl ol,
-dl ul {
- margin-left: 3.5em;
- }
-
-/* Tables
------------------------------------------------*/
-
-table {
- border-collapse: collapse;
- }
-
-table caption {
- font-style: italic;
- text-align: center;
- }
-
-table tr th {
- font-weight: bold;
- }
-
-table tr td,
-table tr th {
- border: 1pt;
- border-style: solid;
- border-color: #CCC;
- padding-top: 0.25em;
- padding-right: 0.5em;
- padding-bottom: 0.25em;
- padding-left: 0.5em;
- vertical-align: top;
- }
-
-table tr td p,
-table tr td pre {
- margin: 0;
- padding: 0;
- }
-
-/* Forms
------------------------------------------------*/
-
-form {
- display: inline;
- }
-
-input[type="submit"],
-input[type="button"] {
- padding: 1px;
- display: inline;
- text-decoration: none;
- }
-
-input[type="text"],
-input[type="password"],
-textarea {
- display: inline;
- padding: 2px;
- }
-
-select {
- display: inline;
- padding: 1px;
- }
-
-form p {
- display: inline;
- margin-left: 5px;
- margin-right: 5px;
- }
-
-/* Select
----------------------------------------- */
-
-select option {
- padding-left: 3px;
- padding-right: 3px;
- }
-
-select optgroup {
- font-style: normal;
- font-weight: bold;
- padding-left: 3px;
- }
-
-select optgroup option {
- margin-left: 1em;
- }
-
-input[type="radio"],
-input[type="checkbox"] {
- vertical-align: middle;
- }
-
-fieldset {
- margin: 1em 0 1em 0;
- padding: 1em;
- padding-bottom: 5px;
- border: 1px solid #AAA;
- }
-
-fieldset legend {
- font-weight: bold;
- color: #AAA;
- }
diff --git a/Scripts/Python/Webenv/public/Stylesheet/tabs.css b/Scripts/Python/Webenv/public/Stylesheet/tabs.css
deleted file mode 100755
index 158b539..0000000
--- a/Scripts/Python/Webenv/public/Stylesheet/tabs.css
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Webenv -> Tabs (Style 2: Two Rounded Borders)
- *
- * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
- *
- * This CSS 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 CSS 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$
- * ----------------------------------------------------------------------
- */
-
-div#page-header div.tabs {
- margin-left: 10px;
- margin-right: 10px;
- }
-
-div#page-header div.tabs a {
- color: #FFF;
- float: left;
- font-weight: bold;
- margin-right: 3px;
- padding: 0px 8px 0 0px;
- text-decoration: none;
- }
-
-div#page-header div.tabs span.current a,
-div#page-header div.tabs span.current a:hover,
-div#page-header div.tabs span.current a span,
-div#page-header div.tabs span.current a:hover span {
- color: #204A87;
- text-decoration: none;
- }
-
-div#page-header div.tabs a span {
- float: left;
- padding: 5px 0px 3px 8px;
- }
-
-/* */
-
-div#page-header div.tabs a {
- background: none;
- }
-
-div#page-header div.tabs a span {
- background: none;
- }
-
-div#page-header div.tabs span.current a,
-div#page-header div.tabs span.current a:hover {
- background: url("https://projects.centos.org/public/Images/tabs-bg-1.png") 100% -50px no-repeat;
- }
-
-div#page-header div.tabs span.current a span,
-div#page-header div.tabs span.current a:hover span {
- background: url("https://projects.centos.org/public/Images/tabs-bg-2.png") 0 -50px no-repeat;
- }
-
-div#page-header div.tabs span:hover a {
- background: url("https://projects.centos.org/public/Images/tabs-bg-1.png") 100% 0 no-repeat;
- }
-
-div#page-header div.tabs span:hover a span {
- background: url("https://projects.centos.org/public/Images/tabs-bg-2.png") 0 0;
- }
-
-/* Application level navigation bar.
---------------------------------------------------------------------*/
-div#page-header div#appslinks div.tabs span:hover a span {
- }
diff --git a/Scripts/Python/Webenv/public/stylesheet.css b/Scripts/Python/Webenv/public/stylesheet.css
deleted file mode 100755
index 00015ea..0000000
--- a/Scripts/Python/Webenv/public/stylesheet.css
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Webenv
- *
- * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
- *
- * This CSS 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 CSS 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$
- * ----------------------------------------------------------------------
- */
-
-/* Reset browser's default definitions.
---------------------------------------------------------------------*/
-@import url("https://projects.centos.org/public/Stylesheet/reset.css");
-
-/* Customize default definitions.
---------------------------------------------------------------------*/
-@import url("https://projects.centos.org/public/Stylesheet/base.css");
-@import url("https://projects.centos.org/public/Stylesheet/links.css");
-@import url("https://projects.centos.org/public/Stylesheet/lists.css");
-@import url("https://projects.centos.org/public/Stylesheet/admonition.css");
-@import url("https://projects.centos.org/public/Stylesheet/forms.css");
-
-/* Miscellaneous definitions.
---------------------------------------------------------------------*/
-@import url("https://projects.centos.org/public/Stylesheet/tabs.css");
diff --git a/Scripts/Python/Webenv/webenv.conf b/Scripts/Python/Webenv/webenv.conf
deleted file mode 100644
index 6361087..0000000
--- a/Scripts/Python/Webenv/webenv.conf
+++ /dev/null
@@ -1,88 +0,0 @@
-# This file provides the configuration required by Apache HTTP server
-# in order for `webenv.cgi' script to be able of running through it.
-# The configuration provided in this file is splitted in two, one
-# through aliases and other through virtual domains (see bellow) you
-# need to comment/uncomment in order to get a functional configuration.
-# ------------------------------------------------------------------
-# $Id$
-# ------------------------------------------------------------------
-
-# ------------------------------------------------------------------
-# The `Aliases' Configuration:
-#
-# This configuration assumes you are a web developer whom needs to
-# prepare a workstation for downloading a working copy of `webenv.cgi'
-# in order to test the changes you made locally before commit them up
-# to the central repository.
-#
-# A possible solution would be to download the `webenv.cgi' tree from
-# the central repository into your home directory using the following
-# directory structure:
-#
-# ~/user
-# `-- public_html
-# `-- webenv
-# |-- cgi-bin
-# | |-- apps
-# | `-- webenv.cgi
-# `-- public
-# |-- images
-# |-- stylesheets
-# `-- stylesheets.css
-#
-# In this structure, the `cgi-bin' directory must be set with a
-# `httpd_sys_script_exec_t' selinux context in order for cgi scripts
-# inside to be executed correctly. So, inside `cgi-bin' directory is
-# where we put the `webenv.cgi' script and all related `.py' files it
-# needs to run. Outside the `cgi-bin' directory, we put all public
-# information (e.g., images and css files) and then configure apache
-# to work with such structure.
-#
-# Be sure to enable requests to `/~user/' to serve the user's
-# public_html directory inside the `/etc/httpd/conf/httpd.conf' file
-# and copy this file (i.e., `webenv.conf') to `/etc/httpd/conf.d/'
-# directory in order to make the web application available at the URL:
-# `http://projects.centos.org/webenv/'.
-
-#FIXME: The css file uses absolute urls to call image files and other
-# css related files which aren't loaded when the domain is different
-# to that one specified inside the css files.
-
-ScriptAliasMatch ^/centos-web/(.*)$ "/home/centos/public_html/centos-web/cgi-bin/webenv.cgi"
-AliasMatch ^/public/(.*)$ "/home/centos/public_html/centos-web/public"
-
-# ------------------------------------------------------------------
-# The `Virtual Domain' Configuration
-#
-# This configuration assumes you are a system administrator whom needs
-# to put the `webenv.cgi' script in production. For example, if you
-# administer the `centos.org' domain, this configuration would let you
-# to run the `webenv.cgi' script with an URL like
-# `http://www.centos.org/'.
-#
-# This configuration requires that you set up your DNS to point such
-# URLs to the same IP address and copy this file (i.e., `webenv.conf')
-# into the `/etc/httpd/conf.d/' directory. Once you've done this,
-# reload the httpd service (e.g., /sbin/service httpd reload) and use
-# the URL you set up to reach the application.
-#
-# Notice that, in this configuration you don't make changes inside the
-# `webenv.cgi' script source code. In this configuration, the
-# application's source code would be in a place accesable by apache
-# and root users only (e.g., `/var/www/cgi-bin') with the only purpose
-# of being productive there. Of course, you as system administrtors
-# can update the `webenv.cgi' source code in this location when web
-# developers do release new version of it.
-
-#NameVirtualHost *:80
-#
-#
-# ServerName projects.centos.org
-# DocumentRoot /var/www/html
-#
-#
-#
-# ServerName www.centos.org
-# ScriptAliasMatch ^/[^public](.*)$ "/var/www/cgi-bin/webenv.cgi"
-# Alias /public "/var/www/html"
-#
diff --git a/Scripts/Python/centos-web/cgi-bin/Apps/Home/__init__.py b/Scripts/Python/centos-web/cgi-bin/Apps/Home/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/Apps/Home/__init__.py
diff --git a/Scripts/Python/centos-web/cgi-bin/Apps/Home/page.py b/Scripts/Python/centos-web/cgi-bin/Apps/Home/page.py
new file mode 100755
index 0000000..97e12eb
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/Apps/Home/page.py
@@ -0,0 +1,91 @@
+"""Support module for page layout inside `Home' web application.
+
+"""
+from Apps import page
+
+app = page.Layout()
+
+
+def page_navibar():
+ """Returns application main pages.
+
+ The application main pages are organized as tabs in the
+ application navigation bar. There is one tab for each main page
+ inside the application.
+
+ """
+ names = ['Page1', 'Page2', 'Page3']
+ attrs = []
+
+ for i in names:
+ attrs.append({'href': '/webenv/?p=' + i.lower()})
+
+ if 'p' in page.qs.keys():
+ focus = page.qs['p'][0].lower()
+ else:
+ focus = ''
+
+ return app.page_navibar(names, attrs, focus)
+
+
+def page_content():
+ """Returns page content.
+
+ The page content is determined from the query string, specifically
+ from the value of `p' variable.
+
+ """
+ if 'p' in page.qs.keys():
+ p = page.qs['p'][0].lower()
+ else:
+ p = ''
+
+ if p == 'page1':
+ output = app.tag_p('', [12, 1], 'Page Empty.')
+ elif p == 'page2':
+ output = app.tag_p('', [12, 1], 'Page Empty.')
+ elif p == 'page3':
+ output = app.tag_p({}, [12, 1], 'Page Empty' )
+ elif p == 'entry':
+ output = app.content_details()
+ else:
+ output = app.content_list()
+
+ return output
+
+
+def main():
+ """Returns final output."""
+
+ # Define page name. This value is used as reference to determine
+ # which application to load and what tab in the navigation bar to
+ # focus on.
+ app.name = 'Home'
+
+ # Define page title. This value is dislayed on the browser's title
+ # bar. Notice that we concatenated the page class default value
+ # here.
+ app.title += ' :: Home'
+
+ # Define page header. This is the information displayed
+ # between the page top and page content.
+ app.header = app.logo()
+ app.header += app.google_ad_example()
+ app.header += app.navibar()
+ app.header += app.releases()
+ app.header += app.page_links()
+ app.header += page_navibar()
+
+ # Define page body. This is the information displayed between the
+ # page header and page footer.
+ app.body = page_content()
+
+ # Define page footer. This is the information displayed between
+ # the page bottom and the page content, the last information
+ # displayed in the page.
+ app.footer = app.credits()
+
+ # Define page final layout.
+ html = app.page()
+
+ return html
diff --git a/Scripts/Python/centos-web/cgi-bin/Apps/Sponsors/__init__.py b/Scripts/Python/centos-web/cgi-bin/Apps/Sponsors/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/Apps/Sponsors/__init__.py
diff --git a/Scripts/Python/centos-web/cgi-bin/Apps/Sponsors/page.py b/Scripts/Python/centos-web/cgi-bin/Apps/Sponsors/page.py
new file mode 100755
index 0000000..1791750
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/Apps/Sponsors/page.py
@@ -0,0 +1,91 @@
+"""Support module for page layout inside `Sponsors' web application.
+
+"""
+from Apps import page
+
+app = page.Layout()
+
+
+def page_navibar():
+ """Returns application's main pages.
+
+ The application's main pages are organized as tabs in the
+ application navigation bar. There is one tab for each main page
+ inside the application.
+
+ """
+ names = ['Hardware', 'Hosting', 'Others']
+ attrs = []
+
+ for i in names:
+ if 'app' in page.qs.keys():
+ attrs.append({'href': '/webenv/?app=' + page.qs['app'][0].lower() + '&p=' + i.lower()})
+ else:
+ attrs.append({'href': '/webenv/?p=' + i.lower()})
+
+ if 'p' in page.qs.keys():
+ focus = page.qs['p'][0].lower()
+ else:
+ focus = names[0].lower()
+
+ return app.page_navibar(names, attrs, focus)
+
+
+def page_content():
+ """Returns page content.
+
+ The page content to show is determined from the query string,
+ specifically from the value of `p' variable.
+
+ """
+ if 'p' in page.qs.keys():
+ p = page.qs['p'][0].lower()
+ else:
+ p = 'hardware'
+
+ if p == 'hardware':
+ output = app.tag_h1({'class': 'title'}, [12, 1], 'Hardware Sponsors' )
+ elif p == 'hosting':
+ output = app.tag_h1({'class': 'title'}, [12, 1], 'Hosting Sponsors' )
+ elif p == 'others':
+ output = app.tag_h1({'class': 'title'}, [12, 1], 'Other Sponsors' )
+ else:
+ output = app.tag_p('', [12, 1], 'Page empty.')
+
+ return output
+
+
+def main():
+ """Returns final output."""
+
+ # Define page name. This value is used as reference to determine
+ # which application to load and what tab in the navigation bar to
+ # focus on.
+ app.name = 'Sponsors'
+
+ # Define page title. This value is dislayed on the browser's title
+ # bar. Notice that we concatenated the page class default value
+ # here.
+ app.title += ' :: Sponsors'
+
+ # Define page header. This is the information displayed
+ # between the page top and the page content.
+ app.header = app.logo()
+ app.header += app.google_ad_example()
+ app.header += app.navibar()
+ app.header += app.page_links()
+ app.header += page_navibar()
+
+ # Define page body. This is the information displayed between the
+ # page header and page footer.
+ app.body = page_content()
+
+ # Define page footer. This is the information displayed between
+ # the page bottom and the page content, the last information
+ # displayed in the page.
+ app.footer = app.credits()
+
+ # Define page final layout.
+ html = app.page()
+
+ return html
diff --git a/Scripts/Python/centos-web/cgi-bin/Apps/Unknown/__init__.py b/Scripts/Python/centos-web/cgi-bin/Apps/Unknown/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/Apps/Unknown/__init__.py
diff --git a/Scripts/Python/centos-web/cgi-bin/Apps/Unknown/page.py b/Scripts/Python/centos-web/cgi-bin/Apps/Unknown/page.py
new file mode 100755
index 0000000..f7c564e
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/Apps/Unknown/page.py
@@ -0,0 +1,54 @@
+"""The `Unknown' web application.
+
+The Unknown web application is automatically triggered when the page
+requested is not defined as valid in `webenv.cgi' script. The
+Unknown web application is basically an admonition message describing
+the `page not found' issue and where to find the correct links to
+start all over.
+
+"""
+from Apps import page
+
+app = page.Layout()
+
+
+def page_content():
+ """Returns page content."""
+ output = app.tag_p('', [16,1], 'The page you tried to open was not found in this server. Try one of the links above to start over.')
+ output = app.admonition('Warning', 'Page not found.', output)
+ output = app.tag_div({'id':'content-unknown'}, [8,1], output, 1)
+ return output
+
+
+def main():
+ """Returns final output."""
+
+ # Define page name. This value is used as reference to determine
+ # which application to load and what tab in the navigation bar to
+ # focus on.
+ app.name = 'Unknown'
+
+ # Define page title. This value is dislayed on the browser's title
+ # bar. Notice that we concatenated the page class default value
+ # here.
+ app.title += ' :: Page not found'
+
+ # Define page header. This is the information displayed
+ # between the page top and the page content.
+ app.header = app.logo()
+ app.header += app.google_ad_example()
+ app.header += app.navibar()
+
+ # Define page body. This is the information displayed between the
+ # page header and page footer.
+ app.body = page_content()
+
+ # Define page footer. This is the information displayed between
+ # the page bottom and the page content, the last information
+ # displayed in the page.
+ app.footer = app.credits()
+
+ # Define page final layout.
+ html = app.page()
+
+ return html
diff --git a/Scripts/Python/centos-web/cgi-bin/Apps/__init__.py b/Scripts/Python/centos-web/cgi-bin/Apps/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/Apps/__init__.py
diff --git a/Scripts/Python/centos-web/cgi-bin/Apps/page.py b/Scripts/Python/centos-web/cgi-bin/Apps/page.py
new file mode 100755
index 0000000..9a449b9
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/Apps/page.py
@@ -0,0 +1,970 @@
+# 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$
+# ------------------------------------------------------------------
+"""Support page construction.
+
+The page construction is an XHTML document consisting of several
+independent components that, when put together, provide organization
+to content. Each of these components is set as a method of Layout
+class that can be instantiated later from application specific modules.
+
+When you create a new application package, you need to create a page
+module for it and instantiate the Layout class provided here inside
+it. Later, the following functions must be created: page_content(),
+page_navibar() and main(). These functions are used to define the
+content and navigation bar of your application. Both application
+content and application navigation are logically organized using
+variables passed through the URL.
+
+Application
+===========
+
+URL variable: app
+
+This variable contains the application id. It is a unique numerical
+value that starts at 0 and increments one for each new application
+that might be added. The application identified by number 0 is the one
+used as default when no other application is provided. The
+application identified by number 0 is added to database the first time
+it is created as part of the initial configuration process.
+
+Application is the highest level of organization inside
+`webenv.cgi' script. Inside applications, there is content in form
+of pages and entries. Content can be grouped by categories.
+
+Pages
+=====
+
+URL variable: page
+
+This variable contains the page id. It is a unique numerical value
+that starts at 0 and increments in one for each new page added to the
+application. In contrast to applications, the page identified by
+number 0 is not used as default page when no other page is provided.
+This configuration is specific to each application and can be
+customized inside each application individually, using string values
+instead of numerical values when passing values to page variable.
+
+Generally, when a page variable isn't passed through the URL, the
+application module uses the `content_list()' method from Layout class
+to display a list of all available content entries while links to
+content pages are displayed in the application navigation bar so users
+can access them. The unique numerical value of content pages is
+specific to each application, so there is one page 0 for each
+application available. No page is added to database the first time the
+database is created as part of the initial configuration process.
+
+Pages contain similar information to that described by contents with
+few exceptions. Pages, in contrast to entries, can differentiate the
+page title from the page name. The page title goes in the page content
+itself and describes what the page is about with a phrase. On the
+other hand, the page name is generaly one word describing the page
+content and is used as link on the application navigation bar. When
+no page name is explicitly provided, the first word of page title is
+used instead.
+
+Pages are always accessible inside the same application while contents
+aren't. Pages are permanently visible and linkend from each
+application specific navigation bar. This kind of pages can be
+managed by editors or administrators and can be marked as `draft' to
+put it on a special state where it is possible for administrator,
+editors and authors to work on it, but impossible for others to read
+it until the page be marked as `published' by either the page author
+or any members of editor's or administrator's groups.
+
+Pages can be converted to entires and the oposite. When convertion
+occurs, unused information looses its meaning and is kept for
+informative purpose, specially in situations when it might be needed
+to realize a convertion back into the former state. Notice that in
+order to realize such a back and forth convertion it is required that
+both pages and entires share the same definition structure. In fact,
+that they be the same thing, but able to differentiate themselves
+either as page or entry (e.g., through a `type' field.).
+
+Pages content is under version control. When a page (or entry) is
+changed, a verification is performed to determine whether the
+information entered in edition matches the last record in the page
+history table. When both the information coming from edition and the
+last record in the page history table are the same (e.g., no change
+happened) the edition action is cancelled and a message is printed out
+to notify the action. Otherwise, when the information entered in
+edition differs from the last record in the page history table, the
+information comming from edition passes to be the last record in the
+page history table. In case, a page be reverted to a revision
+different to that one being currently the active page, the reverted
+revision becomes the active page (e.g., by changing a `status' field
+from `false' to `true' in the history table).
+
+Categories
+==========
+
+Categories exists to organize contents. When an entry is created it is
+automatically linked to a category. Categories are managed by
+administrators and editors only. Categories can be nested one another
+and provide another way of finding information inside the web
+environment. Categories are specific to each web application, just as
+contents and pages are. The `Unknown' category is created when the
+categories table is created for first time, as part of the initial
+configuration process so if no explicit category assignation is set by
+the user, a default value (the `Unknown' category in this case) is
+used to satisfy the connection between contents and categories.
+
+Referential integrity
+=====================
+
+Referential integrity is not handle in the logic layer provided by
+this module, but set inside the database system used to store the
+information handled by this module. The most we do about it here, is
+to display a confirmation message before committing such actions, so
+you can be aware of them.
+
+"""
+
+import cgi
+import cgitb; cgitb.enable()
+from Apps import xhtml
+
+qs = cgi.parse()
+
+
+def qs_args( names={}):
+ """Returns query string arguments.
+
+ The query string arguments are used to build links dynamically
+ and, this way, to create a browsable and logically organized web
+ environment. Such a construction generally needs to retrive some
+ of the values previously passed to the query string and add new
+ ones to it.
+
+ names: A dictionary containing the variable name and value pair
+ used to build a new query string.
+
+ When a variable is provied without a value, then its value is
+ retrived from the current query string. If a value isn't found
+ there neither, then the variable is removed from the new query
+ string.
+
+ When a variable is provided with its value, then its value is used
+ to build the new query string.
+
+ """
+ output = ''
+
+ names_keys = names.keys()
+ names_keys.sort()
+ for key in names_keys:
+ if names[key] == '':
+ if key in qs:
+ names[key] = qs[key][0]
+ else:
+ continue
+ if output == '':
+ output = '?'
+ else:
+ output += '&'
+ output += key + '=' + str(names[key])
+
+ return '/webenv/' + output
+
+
+class Layout(xhtml.Strict):
+ """The Page Layout.
+
+ The page layout is made by combining XHTML tags in specific ways.
+ These specific combinations make the page components which in turn
+ can be also combined. Some of these components can be reused and
+ others don't. The goal of this class is to define what such
+ components are and describe them well in order to understand how
+ to use them from application modules when building XHTML documents
+ dynamically.
+
+ The page layout is initialized with a functional layout that can
+ be used as reference inside application modules, to create
+ variations of it. Generally, inside application packages, this
+ class is instantiated in a module named `page', variables are
+ reset and functions created in order to satisfy that application
+ needs. When you need to output one of the page components then you
+ use this class instantiated methods. When the method you need
+ doesn't exist in this class, then it is a good time for it to be
+ created, here ;).
+
+ Notice that most methods defined in this class make direct use of
+ methods defined by Strict class inside the `xhtml' module. The
+ Strict class inside xhtml module is inherited inside this class so
+ all the methods there are also available here. Methods which
+ doesn't make a direct use of Strict methods are dependencies of
+ those which do make direct use of Strict methods.
+
+ """
+
+
+ def __init__(self):
+ """Initialize page data."""
+ 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'
+
+ # Define page header. This is the information displayed
+ # between the page top and the page content.
+ self.header = self.logo()
+ self.header += self.google_ad()
+ self.header += self.navibar()
+ self.header += self.releases()
+ self.header += self.page_links()
+ self.header += self.page_navibar()
+
+ # Define page body. This is the information displayed between
+ # the page header and page footer.
+ self.body = 'None'
+
+ # Define page footer. This is the information displayed
+ # between the page bottom and the page content, the last
+ # information displayed in the page.
+ self.footer = self.credits()
+
+
+ def logo(self):
+ """Returns The CentOS 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': '/webenv/'})
+ attrs.append({'src': '/public/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), 1)
+
+
+ def google_ad_example(self):
+ """Returns Google advertisement for offline testings."""
+ title = 'Google Advertisement'
+ url = '/public/Images/ads-sample-468x60.png'
+ image = self.tag_img({'src': url, 'alt': title}, [0,0])
+ link = self.tag_a({'href': url, 'title': title}, [12,1], image)
+ output = self.tag_div({'class':'google-ad'}, [8,1], link, 1)
+ output += self.separator({'class':'page-line'}, [8,1])
+
+ return output
+
+
+ def google_ad(self):
+ """Returns Google advertisement for online using."""
+
+ properties = {}
+ properties['google_ad_client'] = 'pub-6973128787810819'
+ properties['google_ad_width'] = '468'
+ properties['google_ad_height'] = '60'
+ properties['google_ad_format'] = '468x60_as'
+ properties['google_ad_type'] = 'text_image'
+ properties['google_ad_channel'] = ''
+ properties['google_color_border'] = '204c8d'
+ properties['google_color_bg'] = '345c97'
+ properties['google_color_link'] = '0000FF'
+ properties['google_color_text'] = 'FFFFFF'
+ properties['google_color_url'] = '008000'
+
+ attrs = {}
+ attrs['type'] = "text/javascript"
+
+ output = '\n'
+
+ properties = self.tag_script(attrs, [12,1], output, 1)
+
+ attrs['src'] = "http://pagead2.googlesyndication.com/pagead/show_ads.js"
+
+ source = self.tag_script(attrs, [12,1], ' ', 0)
+
+ output = self.tag_div({'class':'google-ad'}, [8,1], properties + source, 1)
+ output += self.separator({'class':'page-line'}, [8,1])
+
+ return output
+
+
+ def navibar(self):
+ """Returns webenv navigation bar.
+
+ The webenv navigation bar organizes links to main web
+ applications The CentOS Project makes use of. Links to these
+ web applications stay always visible, no matter what web
+ application the user be visiting (e.g., Wiki, Lists, Forums,
+ Projects, Bugs, Docs, Downloads and Sponsors.). Notice that
+ some of these web applications are out of `webenv.cgi'
+ scope and they need to code their own webenv navigation bars
+ in a way that coincide the one set by `webenv.cgi'.
+
+ """
+ names = ['Home', 'Wiki', 'Lists', 'Forums', 'Projects', 'Bugs', 'Docs', 'Downloads', 'Sponsors']
+ attrs = []
+ focus = self.name
+
+ for i in range(len(names)):
+ if names[i].lower() == 'home':
+ attrs.append({'href': '/webenv/'})
+ else:
+ attrs.append({'href': '/webenv/?app=' + names[i].lower()})
+
+ tabs = self.navibar_tabs(names, attrs, focus)
+ tabs += self.separator()
+
+ return tabs
+
+
+ def navibar_tabs(self, names, attrs, focus=''):
+ """Returns navigation tabs.
+
+ The navigation tabs are the smaller components a navigation
+ bar like "top-level navigation bar" and "application
+ navigation bar" are made of.
+
+ names: List containing link names of tabs.
+
+ attrs: List containing a dictionary for each tab link name
+ inside the `names' list. Dictionaries inside attrs
+ argument contain the link attributes (e.g., accesskey,
+ title, and href) used by link names so they can be
+ linkable once rendered.
+
+ focus: Name of the link marked as current.
+
+ """
+ navibar_tabs = ''
+
+ for i in range(len(names)):
+ output = self.tag_span('', [0,0], str(names[i]))
+ output = self.tag_a(attrs[i], [16,1], output)
+ if str(names[i]).lower() == focus.lower():
+ output = self.tag_span({'class': 'current'}, [12,1], output, 1)
+ else:
+ output = self.tag_span('', [12,1], output, 1)
+ navibar_tabs += output
+
+ return self.tag_div({'class': 'tabs'}, [8,1], navibar_tabs, 1)
+
+
+ def releases(self):
+ """Returns The CentOS Distribution last releases.
+
+ This method introduces the `releases' method by providing
+ links to it.
+
+ names: List containing release numbers in the form M.N, where M
+ means major release and N minor release.
+
+ attrs: List containing a dictionary for each release number
+ provided in `names' argument. These dictionaries provide
+ the link attributes required by release numbers in order
+ for them to be transformed into valid links once the page
+ be rendered.
+
+ """
+ releases = ''
+
+ names = []
+ names.append('6.0')
+
+ attrs = []
+ attrs.append({'href': qs_args({'p':'releases', 'id': 6.0})})
+
+
+ title = self.tag_a({'href': qs_args({'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': qs_args({'rss':'releases'}), '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 user_links_logs(self):
+ """Return links related to user's logs.
+
+ This function introduces the `logs' module. The `logs' module
+ registers all user's activity, from login to logout. This link
+ must be display/accessible only after a user has successfully
+ login.
+
+ """
+ last_visit = self.tag_a({'href': qs_args({'app':'', 'p':'logs'})}, [0,0], 'Logs')
+ return self.tag_div({'class': 'logs'}, [12, 1], last_visit, 1)
+
+
+ def user_links_session(self):
+ """Returns links related to user's session.
+
+ This function introduces the `session' module. The `session'
+ module provides state to user interactions so their action can
+ be registered individually.
+
+ """
+ names = []
+ attrs = []
+ session = ''
+
+ names.append('Lost your password?')
+ attrs.append({'href': qs_args({'app':'', 'p':'lostpwd'})})
+ names.append('Register')
+ attrs.append({'href': qs_args({'app':'', 'p':'register'})})
+ names.append('Login')
+ attrs.append({'href': qs_args({'app':'', '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 user_links_trails(self, names=['None'], attrs=[{'href': '/webenv/'}]):
+ """Returns page trails (a.k.a. breadcrumbs).
+
+ The page breadcrumbs record the last pages the user 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 `webenv.cgi' script. Until then,
+ keep the tag construction commented and return an empty value.
+
+ names: List with trail link names.
+
+ attrs: Dictionary with trail link attributes.
+
+ """
+ links = ''
+
+ for i in range(len(names)):
+ if i == len(names) - 1:
+ output = self.tag_span({'class':'last'}, [16,1], self.tag_a(attrs[i], [20, 1], names[i]), 1)
+ else:
+ output = self.tag_span('', [16,1], self.tag_a(attrs[i], [20, 1], names[i], 0), 1)
+ links += output
+
+ return self.tag_div({'class': 'trail'}, [12,1], links, 1)
+
+
+ def user_links(self):
+ """Returns user related links.
+
+ The user links are specific to each web application. They are
+ shown over the application navigation bar.
+
+ """
+ userlinks = self.user_links_logs()
+ userlinks += self.user_links_session()
+ userlinks += self.user_links_trails()
+
+ return self.tag_div({'class': 'userlinks'}, [8,1], userlinks, 1)
+
+
+ def page_navibar(self, names=['Welcome'], attrs=[{'href':'/webenv/?p=welcome'}], focus='Welcome'):
+ """Returns navigation bar for application main pages.
+
+ names: List containing link names.
+
+ attrs: List containing one dictionary for each link name in
+ `names' argument. Dictionaries here contain the link
+ attributes needed to make linkable tabs once the page is
+ rendered.
+
+ """
+ navibar_app = self.navibar_tabs(names, attrs, focus)
+ navibar_app += self.separator({'class': 'page-line white'}, [8,1])
+
+ return navibar_app
+
+
+ def separator(self, attrs={'class': 'page-line'}, indent=[16,1]):
+ """Returns separator.
+
+ The separator construction is mainly used to clear both sides
+ inside the page, specially when floating elements are around.
+
+ attrs: Dictionary containing hr's div attributes.
+
+ indent: List containing hr's div indentation values.
+
+ """
+ line = self.tag_hr({'style': 'display:none;'}, [0,0])
+ line = self.tag_div(attrs, indent, line)
+
+ return line
+
+
+ def license(self):
+ """Retruns license link."""
+ 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 metadata(self):
+ """Returns 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': '/public/stylesheet.css','rel': 'stylesheet', 'type': 'text/css'}, [4,0])
+ metadata += self.tag_link({'href': '/public/centos-fav.png', 'rel': 'shortcut icon', 'type': 'image/png'}, [4,1])
+
+ return self.tag_head('', [0,1], metadata)
+
+
+
+
+ def searchform(self, size=15):
+ """Returns search form.
+
+ The search form redirects user from the current page onto the
+ search page, where the keywords previously introduced in the
+ input field are processed then.
+
+ size: A number discribing how large the search box is.
+
+ """
+ input = self.tag_input({'type':'text', 'value':'', 'size':size}, [0,0])
+
+ action = self.tag_dt({}, [20,1], 'Search')
+ action += self.tag_dd({}, [20,1], input)
+ action = self.tag_dl({'class':'search'}, [16,1], action, 1)
+
+ return self.tag_form({'action': qs_args({'app':'', 'p':'search'}),
+ 'method':'post', 'title':'Search'},
+ [12,1], action, 1)
+
+
+ def content_resumen(self, attrs, id, title, user_id, commit_date,
+ update_date, category_id, comments, abstract):
+ """Returns content resumen.
+
+ The content resumen is used to build the list of contents,
+ output by `content_list()' method. The content resumen intends
+ to be concise and informative so the user can grab a general
+ idea about the related content and what it is about.
+
+ attrs: A dictionary discribing the rows style. This is useful
+ to alternate the row background colors.
+
+ id: A unique numerical value referring the content
+ identification. This is the value used on administrative
+ tasks like updating and deleting.
+
+ title: A few words phrase describing the content, up to 255
+ characters.
+
+ author_id: A string referring the user email address, as
+ specified by RFC2822. The user email address is used as id
+ inside The CentOS User LDAP server, where user specific
+ information (e.g., surname, lastname, office, phone, etc.)
+ are stored in. This is the field that bonds the user with
+ the content he/she produces.
+
+ commit_date: A string referring the timestamp the content
+ arrived to database for time.
+
+ update_date: A string representing the timestamp the content
+ was updated/revised for last time.
+
+ category_id: A number refering the category id the content is
+ attached to.
+
+ abstract: One paragraphs describing the content. This
+ information is used to build the page metadata
+ information. When this value is not provided no abstract
+ information is displayed in the page, but the is built using article's first 255
+ characters.
+
+ comments: A number representing how many comments the content
+ has received since it is in the database.
+
+ The content itself is not displayed in the resumen, but in
+ `content_details()'.
+
+ """
+ title = self.tag_a({'href': qs_args({'app':'', 'p':'entry', 'id':id})}, [0,0], title)
+ title = self.tag_h3({'class': 'title'}, [20,1], title, 0)
+ info = self.content_info(id, user_id, commit_date,
+ update_date, category_id, comments,
+ abstract)
+ return self.tag_div(attrs, [16,1], title + info, 1)
+
+
+ def pagination(self):
+ """Return content pagination."""
+ previous = self.tag_a({'href':''}, [0,0], 'Previous')
+ previous = self.tag_span({'class':'previous'}, [20,1], previous)
+ next = self.tag_a({'href':''}, [0,0], 'Next')
+ next = self.tag_span({'class':'next'}, [20,1], next)
+ separator = self.separator({'class':'page-line'}, [20,1])
+ return self.tag_div({'class':'pagination'}, [16,1], previous +
+ next + separator, 1)
+
+
+ def content_info(self, content_id, user_id, commit_date,
+ update_date, category_id, comments, abstract):
+ """Return content information.
+
+ The content information provides a reduced view of content so
+ people can make themselves an idea of what the content talks
+ about. The content information displays content's title,
+ author, timestamp, related category, number of comments and an
+ abstract of the whole content.
+
+ """
+ categories = []
+ categories.append('Unknown')
+ categories.append('Erratas')
+ categories.append('Articles')
+ categories.append('Events')
+
+ if category_id <= len(categories):
+ category_name = categories[category_id].capitalize()
+ else:
+ category_id = 0
+ category_name = categories[category_id].capitalize()
+
+ category_name = self.tag_a({'href': qs_args({'app':'', 'p':'categories', 'id':category_id})}, [0,0], category_name)
+ category_name = self.tag_span({'class':'category'}, [24,1], category_name)
+
+ users = {}
+ users['al@centos.org'] = 'Alain Reguera Delgado'
+ users['ana@centos.org'] = 'Ana Tamara Reguera Gattorno'
+ users['alina@centos.org'] = 'Alina Reguera Gattorno'
+
+ if user_id in users.keys():
+ user_name = self.tag_a({'href':'mailto:' + user_id}, [0,0], users[user_id])
+ user_name = self.tag_span({'class':'author'}, [24,1], 'Written by ' + user_name)
+
+ if update_date != commit_date:
+ date = self.tag_span({'class':'date'}, [24,1], update_date)
+ else:
+ date = self.tag_span({'class':'date'}, [24,1], commit_date)
+
+
+ comments_attrs = {'href': qs_args({'app':'', 'p':'entry', 'id':content_id}) + '#comments'}
+ if comments == 1:
+ comments = self.tag_a(comments_attrs, [0,0], str(comments) + ' comment')
+ elif comments > 1:
+ comments = self.tag_a(comments_attrs, [0,0], str(comments) + ' comments')
+ else:
+ comments = 'No comments'
+ comments = self.tag_span({'class':'comment'}, [24,1], comments)
+
+ abstract = self.tag_p({'class':'abstract'}, [24,1], abstract)
+
+ return self.tag_div({'class': 'info'}, [20,1], user_name + date + category_name + comments + abstract, 1)
+
+
+ def content_list(self):
+ """Return list of content.
+
+ The list of content is used to explore the content available
+ inside specific pages of specific web applications. The
+ information is displayed through paginated rows of content
+ that can be filtered to reduce the search results based on
+ patterns. By default, the list of content displays 15 rows,
+ but this value can be changed in user's preferences.
+
+ """
+ output = ''
+ count = 0
+ rows = []
+ rows.append([0, 'Introduction to CentOS Web Environment',
+ 'al@centos.org',
+ '2011-8-30 12:33:11',
+ '2011-8-30 12:33:11',
+ 0,
+ 0,
+ 'This is the abstract paragrah of content. '*10])
+ rows.append([1, 'Creating New Applications',
+ 'al@centos.org',
+ '2011-8-30 12:33:11',
+ '2011-8-30 12:33:11',
+ 2,
+ 1,
+ 'This is the abstract paragrah of content. '*5])
+ rows.append([2, 'Texinfo Documentation Backend',
+ 'al@centos.org',
+ '2011-8-30 12:33:11',
+ '2011-8-30 12:33:11',
+ 1,
+ 5,
+ 'This is the abstract paragrah of content. '*8])
+
+ for row in rows:
+ if count == 0:
+ attrs = {'class': 'dark row'}
+ count += 1
+ else:
+ attrs = {'class': 'light row'}
+ count = 0
+ output += self.content_resumen(attrs, *row)
+
+ list = output + self.pagination() + self.separator()
+ list = self.tag_div({'id':'content-list'}, [12,1], list, 1)
+ actions = self.searchform() + self.categories() + self.archives()
+ actions = self.tag_div({'id':'content-actions'}, [8,1], actions, 1)
+
+ return actions + list
+
+
+ def content_details(self):
+ """Return content details.
+
+ The content detail is shown for contents and pages.
+ """
+ output = ''
+ rows = []
+ rows.append([0, 'Introduction to CentOS Web Environment',
+ 'al@centos.org',
+ '2011-8-30 12:33:11',
+ '2011-8-30 12:33:11',
+ 0,
+ 0,
+ 'This is the abstract paragrah of content. '*10,
+ 'This is the first paragraph of content'*10 + "\n"
+ 'This is the second paragraph of content'*20 +
+ "\n" + 'This is the third paragraph of content.'*10 + "\n"])
+ rows.append([1, 'Creating New Applications',
+ 'al@centos.org',
+ '2011-8-30 12:33:11',
+ '2011-8-30 12:33:11',
+ 2,
+ 1,
+ 'This is the abstract paragrah of content. '*5,
+ "This is the first paragraph of content\n\
+ This is the second paragraph of content.\n\
+ This is the third paragraph of content."])
+ rows.append([2, 'Texinfo Documentation Backend',
+ 'al@centos.org',
+ '2011-8-30 12:33:11',
+ '2011-8-30 12:33:11',
+ 1,
+ 5,
+ 'This is the abstract paragrah of content. '*8,
+ "This is the first paragraph of content.\n\
+ This is the second paragraph of content.\n\
+ This is the third paragraph of content."])
+
+ if 'id' in qs:
+ id = int(qs['id'][0])
+ title = rows[id][1]
+ email = rows[id][2]
+ commit_date = rows[id][3]
+ update_date = rows[id][4]
+ category = rows[id][5]
+ comments = rows[id][6]
+ abstract = self.tag_p({}, [0,0], rows[id][7])
+
+ output = self.tag_h1({'class':'title'}, [12,1], title)
+ output += self.content_info(id, email, commit_date, update_date, category, comments, abstract)
+ output += self.tag_p({}, [20,1], rows[id][8])
+ output += self.comments()
+
+ return self.tag_div({'id':'content-details'}, [12,1], output, 1)
+
+
+ def comments(self):
+ """Returns content specific list of comments.
+
+ """
+ output = self.tag_a({'name':'comments'}, [0,0], 'Comments')
+ output = self.tag_h2({'class':'title comments'}, [12,1], output, 0)
+
+ return output
+
+
+ def categories(self):
+ """Returns list of categories.
+
+ """
+ categories = ['Unknown', 'Articles', 'Erratas', 'Events']
+ dt = self.tag_dt({}, [16,1], 'Categories')
+ dd = ''
+ for id in range(len(categories)):
+ category_attrs = {'href': qs_args({'app':'', 'p':'categories', 'id':id})}
+ a = self.tag_a(category_attrs, [0,0], categories[id] + ' (0)')
+ dd += self.tag_dd({}, [16,1], a)
+
+ return self.tag_dl({},[12,1], dt + dd, 1)
+
+
+ def archives(self):
+ """Returns archives."""
+ archives = {}
+ archives['2011'] = ['January', 'February', 'March', 'April', 'May']
+ archives['2010'] = ['January', 'February']
+
+ dt = self.tag_dt({}, [16,1], 'Archives')
+ year_dl = ''
+ year_dd = ''
+
+ for key in archives.keys():
+ year_dt = self.tag_dt({},[20,1], key)
+ for id in range(len(archives[key])):
+ a = self.tag_a({'href': qs_args({'app':'', 'p':'archives', 'year': key, 'month': id + 1})}, [0,0], archives[key][id] + ' (0)')
+ year_dd += self.tag_dd({}, [20,1], a)
+ year_dl += self.tag_dl({'class':'year'}, [16,1], year_dt + year_dd, 1)
+ year_dd = ''
+
+ return self.tag_dl({},[12,1], dt + year_dl, 1)
+
+
+ def page_top(self):
+ """Returns page top anchor."""
+ return self.tag_a({'name':'top'}, [0,1])
+
+
+ def page_header(self):
+ """Returns page header.
+
+ The page_header is common to all application modules and
+ """
+ return self.tag_div({'id': 'page-header'}, [4,1], self.header, 1)
+
+
+ def page_body(self):
+ """Returns page body.
+
+ The page_body is specific to each application module and is
+ there where it must be constructed. The construction itself
+ takes place through the `page_content()' function which does a
+ return through an instantiated `content_' prefixed method.
+ The `content_' prefixed method used depends on the kind of
+ content you want to print out (e.g., `content_list()' for a
+ content list, `detail()' for a detailed view of content,
+ etc.). Later, the `body' variable instantiated from this class
+ is reset in the `main()' function with the value returned from
+ `page_content()' so the desired content layout can be printed
+ out.
+
+ """
+ return self.tag_div({'id':'page-body'}, [4,1], self.body, 1)
+
+
+ def page_links(self):
+ """Returns page links."""
+ page_links = self.user_links()
+ return self.tag_div({'id': 'pagelinks'}, [8,1], page_links, 1)
+
+
+ def page_footer(self):
+ """Retruns page footer."""
+ return self.tag_div({'id': 'page-footer'}, [4,1], self.credits(), 1)
+
+
+ def page_wrap(self):
+ """Returns page wrap."""
+ return self.tag_div({'id': 'wrap'}, [0,1], self.page_header() + self.page_body() + self.page_footer(), 1)
+
+
+ def admonition(self, title='Note', subtitle="", body=""):
+ """Returns page admonition.
+
+ 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.
+
+ body: Admonition's body. 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 body != '':
+ body = str(body)
+
+ admonitions = ['Note', 'Tip', 'Important', 'Caution', 'Warning', 'Redirected', 'Success', 'Error']
+
+ if title in admonitions:
+ attrs = {'class': 'admonition ' + title.lower()}
+ image = self.tag_img({'src': '/public/Images/' + title.lower() + '.png', 'alt': title}, [16,1])
+ title = self.tag_h3({'class': 'title'}, [16,1], title + subtitle, 0)
+ output = image + title + body + self.separator()
+ else:
+ attrs = {'class': 'admonition unknown'}
+ title = self.tag_h3({'class': 'title'}, [16,1], title + subtitle, 1)
+ output = title + body
+
+ return self.tag_div(attrs, [12,1], output, 1)
+
+
+ def 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.license()))
+ credits = self.tag_img({'src': '/public/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."""
+ html = self.doctype()
+ 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.metadata() + self.page_top() + self.page_wrap())
+
+ return html
diff --git a/Scripts/Python/centos-web/cgi-bin/Apps/xhtml.py b/Scripts/Python/centos-web/cgi-bin/Apps/xhtml.py
new file mode 100755
index 0000000..be646b5
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/Apps/xhtml.py
@@ -0,0 +1,1451 @@
+# 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$
+# ------------------------------------------------------------------
+"""Support XHTML construction.
+
+XHTML construction, as set here, uses the Extensible HTML version 1.0
+DTDs (/usr/share/sgml/xhtml1/xhtml1-20020801/DTD/) as reference. XHTML
+construction is required by page module.
+"""
+
+
+class Strict:
+ """Implements XHTML strict document type definition."""
+
+
+ # Core attributes common to most elements.
+ coreattrs = ['id', # document-wide unique id
+ 'class', # space separated list of classes
+ 'style', # associated style info
+ 'title' # advisory title/amplification
+ ]
+
+ # Internationalization attributes.
+ i18n = ['lang', # language code (backwards compatible)
+ 'xml:lang', # language code (as per XML 1.0 spec)
+ 'dir' # direction for weak/neutral text
+ ]
+
+ # Attributes for common UI events.
+ events = ['onclick', # a pointer button was clicked
+ 'ondblclick', # a pointer button was double clicked
+ 'onmousedown', # a pointer button was pressed down
+ 'onmouseup', # a pointer button was released
+ 'onmousemove', # a pointer was moved onto the element
+ 'onmouseout', # a pointer was moved away from the element
+ 'onkeypress', # a key was pressed and released
+ 'onkeydown', # a key was pressed down
+ 'onkeyup' # a key was released
+ ]
+
+ # Attributes for elements that can get the focus.
+ focus = ['accesskey', # accessibility key character
+ 'tabindex', # position in tabbing order
+ 'onfocus', # the element got the focus
+ 'onblur' # the element lost the focus
+ ]
+
+ # Attributes generic format.
+ attrs = coreattrs + i18n + events
+
+
+ def __init__(self):
+ """Initialize class data."""
+ pass
+
+
+ def tag(self, name, attrs, indent=[8,1], content="", has_child=0):
+ """Returns generic 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 + '' + str(name) + '>'
+ else:
+ output += '' + str(name) + '>'
+ output += v_indent
+
+ return output
+
+
+ # ------------------------------------------------------------------
+ # Document Type Definition
+ # ------------------------------------------------------------------
+
+ def doctype(self):
+ """Return document type definition."""
+ output = '' + "\n"
+ output += '' + "\n"
+
+ return output
+
+
+ # ------------------------------------------------------------------
+ # Document Structure
+ # ------------------------------------------------------------------
+
+ def tag_html(self, attrs, indent, content, has_child=1):
+ """Returns document structure definition.
+
+
+
+
+ The namespace URI designates the document profile.
+
+ """
+ return self.tag('html', attrs, indent, content, has_child=1)
+
+
+ # ------------------------------------------------------------------
+ # Document Head
+ # ------------------------------------------------------------------
+
+ def tag_head(self, attrs, indent, content, has_child=1):
+ """Returns document head definition.
+
+
+
+
+
+
+ Content model is %head.misc; combined with a single title and
+ an optional base element in any order.
+
+ """
+ return self.tag('head', attrs, indent, content, has_child)
+
+
+ def tag_title(self, attrs, indent, content, has_child=0):
+ """Returns title definition.
+
+
+
+
+ The title element is not considered part of the flow of text.
+ It should be displayed, for example as the page header or
+ window title. Exactly one title is required per document.
+
+ """
+ return self.tag('title', attrs, indent, content, has_child)
+
+
+ def tag_base(self, attrs, indent):
+ """Returns document base URI.
+
+
+
+
+ """
+ return self.tag('base', attrs, indent)
+
+
+ def tag_meta(self, attrs, indent):
+ """Returns generic metainformation.
+
+
+
+
+ """
+ return self.tag('meta', attrs, indent)
+
+
+ def tag_link(self, attrs, indent):
+ """Returns relationship values.
+
+
+
+
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used with the
+ link element in document head e.g. start, contents,
+ previous, next, index, end, help.
+
+ b) to link to a separate style sheet (rel="stylesheet").
+
+ c) to make a link to a script (rel="script").
+
+ d) by stylesheets to control how collections of html nodes
+ are rendered into printed documents.
+
+ e) to make a link to a printable version of this document
+ e.g. a PostScript or PDF version (rel="alternate"
+ media="print").
+
+ """
+ return self.tag('link', attrs, indent)
+
+
+ def tag_style(self, attrs, indent, content, has_child=0):
+ """Returns style info.
+
+
+
+
+ """
+ return self.tag('style', attrs, indent, content, has_child)
+
+
+ def tag_script(self, attrs, indent, content="", has_child=0):
+ """Returns script statement.
+
+
+
+
+
+ """
+ return self.tag('script', attrs, indent, content, has_child)
+
+
+ def tag_noscript(self, attrs, indent, content, has_child=1):
+ """Returns alternate content container for non script-based
+ rendering.
+
+
+
+
+ """
+ return self.tag(self, attrs, indent, content, has_child)
+
+
+ # ------------------------------------------------------------------
+ # Document Body
+ # ------------------------------------------------------------------
+
+ def tag_body(self, attrs, indent, content, has_child=1):
+ """Returns document body definition.
+
+
+
+
+ """
+ return self.tag('body', attrs, indent, content, has_child)
+
+
+ def tag_div(self, attrs, indent, content, has_child=0):
+ """Returns generic language/style container.
+
+
+
+
+ """
+ return self.tag('div', attrs, indent, content, has_child)
+
+
+ # ------------------------------------------------------------------
+ # Paragraphs
+ # ------------------------------------------------------------------
+
+ def tag_p(self, attrs, indent, content, has_child=0):
+ """Returns paragraph definition.
+
+
+
+
+ When content is introduced inside the database, it goes
+ without any XHTML markup. This method transforms newline
+ separated strings into XHTML paragraphs.
+
+ """
+ output = ''
+ for line in content.splitlines():
+ if line == '': continue
+ output += self.tag('p', attrs, indent, line.strip(), has_child)
+ return output
+
+
+ # ------------------------------------------------------------------
+ # Headings
+ # ------------------------------------------------------------------
+ # There are six levels of headings from h1 (the most important) to
+ # h6 (the least important).
+ # ------------------------------------------------------------------
+
+ def tag_h1(self, attrs, indent, content, has_child=0):
+ """Returns h1 definition.
+
+
+
+
+ """
+ return self.tag('h1', attrs, indent, content, has_child)
+
+
+ def tag_h2(self, attrs, indent, content, has_child=0):
+ """Returns h2 definition.
+
+
+
+
+ """
+ return self.tag('h2', attrs, indent, content, has_child)
+
+
+ def tag_h3(self, attrs, indent, content, has_child):
+ """Returns h3 definition.
+
+
+
+
+ """
+ return self.tag('h3', attrs, indent, content, has_child)
+
+
+ def tag_h4(self, attrs, indent, content, has_child):
+ """Returns h4 definition.
+
+
+
+
+ """
+ return self.tag('h4', attrs, indent, content, has_child)
+
+
+ def tag_h5(self, attrs, indent, content, has_child=0):
+ """Returns h5 definition.
+
+
+
+
+ """
+ return self.tag('h5', attrs, indent, content, has_child)
+
+
+ def tag_h6(self, attrs, indent, content, has_child=0):
+ """Returns h6 definition.
+
+
+
+
+ """
+ return self.tag('h6', attrs, indent, content, has_child)
+
+
+ # ------------------------------------------------------------------
+ # Lists
+ # ------------------------------------------------------------------
+
+ def tag_ul(self, attrs, indent, content, has_child=1):
+ """Returns unordered list definition.
+
+
+
+
+ """
+ return self.tag('ul', attrs, indent, content, has_child)
+
+
+ def tag_ol(self, attrs, indent, content, has_child=1):
+ """Returns ordered (numbered) list definition.
+
+
+
+
+ """
+ return self.tag('ol', attrs, indent, content, has_child)
+
+
+ def tag_li(self, attrs, indent, content, has_child=0):
+ """Returns item definition for both ordered (ol) and unordered
+ (ul) lists.
+
+
+
+
+ """
+ return self.tag('li', attrs, indent, content, has_child)
+
+
+ def tag_dl(self, attrs, indent, content, has_child=1):
+ """Returns definition list definition.
+
+
+
+
+ """
+ return self.tag('dl', attrs, indent, content, has_child)
+
+
+ def tag_dt(self, attrs, indent, content, has_child=0):
+ """Returns term of definition lists.
+
+
+
+
+ """
+ return self.tag('dt', attrs, indent, content, has_child)
+
+
+ def tag_dd(self, attrs, indent, content, has_child=0):
+ """Returns definition of definition lists.
+
+
+
+
+ """
+ return self.tag('dd', attrs, indent, content, has_child)
+
+
+ # ------------------------------------------------------------------
+ # Address
+ # ------------------------------------------------------------------
+
+ def tag_address(self, attrs, indent, content='', has_child=0):
+ """Returns information on author.
+
+
+
+
+ """
+ return self.tag('address', attrs, indent, content)
+
+
+ # ------------------------------------------------------------------
+ # Horizontal Rule
+ # ------------------------------------------------------------------
+
+ def tag_hr(self, attrs, indent):
+ """Returns horizontal rule.
+
+
+
+
+ """
+ return self.tag('hr', attrs, indent)
+
+
+ # ------------------------------------------------------------------
+ # Preformatted text
+ # ------------------------------------------------------------------
+
+ def tag_pre(self, attrs, indent, content):
+ """Returns preformatted text.
+
+
+
+
+ content is %Inline; excluding "img|object|big|small|sub|sup"
+
+ """
+ return self.tag('pre', attrs, indent, content)
+
+
+ # ------------------------------------------------------------------
+ # Block-line Quotes
+ # ------------------------------------------------------------------
+
+ def tag_blockquote(self, attrs, indent, content):
+ """Returns block-line quote.
+
+
+
+
+ """
+ return self.tag('blockquote', attrs, indent, content)
+
+
+ # ------------------------------------------------------------------
+ # Inserted/Deleted Text
+ # ------------------------------------------------------------------
+
+ def tag_ins(self, attrs, indent, content):
+ """Returns inserted text.
+
+
+
+
+ Inserted texts are allowed in block and inline content, but
+ its inappropriate to include block content within an ins
+ element occurring in inline content.
+
+ """
+ return self.tag('ins', attrs, indent, content)
+
+
+ def tag_del(self, attrs, indent, content):
+ """Returns deleted text.
+
+
+
+
+ Deleted texts are allowed in block and inline content, but its
+ inappropriate to include block content within an ins element
+ occurring in inline content.
+
+ """
+ return self.tag('ins', attrs, indent, content)
+
+
+ # ------------------------------------------------------------------
+ # The Anchor Element
+ # ------------------------------------------------------------------
+
+ def tag_a(self, attrs, indent, content='', has_child=0):
+ """Returns the anchor element.
+
+
+
+
+ content is %Inline; except that anchors shouldn't be nested.
+ """
+ return self.tag('a', attrs, indent, content, has_child)
+
+
+ # ------------------------------------------------------------------
+ # Inline Elements
+ # ------------------------------------------------------------------
+
+ def tag_span(self, attrs, indent, content, has_child=0):
+ """Returns span definition.
+
+
+
+
+ """
+ return self.tag('span', attrs, indent, content, has_child)
+
+
+ def tag_dbo(self, attrs, indent, content, has_child=0):
+ """Returns dbo definition.
+
+
+
+
+ """
+ return self.tag('dbo', attrs, indent, content, has_child)
+
+
+ def tag_br(self, attrs, indent):
+ """Returns break definition.
+
+
+
+
+ """
+ return self.tag('br', attrs, indent)
+
+
+ def tag_em(self, attrs, indent, content, has_child=0):
+ """Returns emphasis definition.
+
+
+
+
+ """
+ return self.tag('em', attrs, indent, content, has_child)
+
+
+ def tag_strong(self, attrs, indent, content, has_child=0):
+ """Returns strong emphasis definition.
+
+
+
+
+ """
+ return self.tag('strong', attrs, indent, content, has_child)
+
+
+ def tag_dfn(self, attrs, indent, content, has_child=0):
+ """Returns definitional definition.
+
+
+
+
+ """
+ return self.tag('dfn', attrs, indent, content, has_child)
+
+
+ def tag_code(self, attrs, indent, content, has_child=0):
+ """Returns program code definition.
+
+
+
+
+ """
+ return self.tag('code', attrs, indent, content, has_child)
+
+
+ def tag_samp(self, attrs, indent, content, has_child=0):
+ """Returns sample definition.
+
+
+
+
+ """
+ return self.tag('samp', attrs, indent, content, has_child)
+
+
+ def tag_kbd(self, attrs, indent, content, has_child=0):
+ """Returns definition for something user would type.
+
+
+
+
+ """
+ return self.tag('kbd', attrs, indent, content, has_child)
+
+
+ def tag_var(self, attrs, indent, content, has_child=0):
+ """Returns variable definition.
+
+
+
+
+ """
+ return self.tag('var', attrs, indent, content, has_child)
+
+
+ def tag_cite(self, attrs, indent, content, has_child=0):
+ """Returns citation definition.
+
+
+
+
+ """
+ return self.tag('cite', attrs, indent, content, has_child)
+
+
+ def tag_abbr(self, attrs, indent, content, has_child=0):
+ """Returns abbreviation definition.
+
+
+
+
+ """
+ return self.tag('abbr', attrs, indent, content, has_child)
+
+
+ def tag_acronym(self, attrs, indent, content, has_child=0):
+ """Returns the acronym definition.
+
+
+
+
+ """
+ return self.tag('acronym', attrs, indent, content, has_child)
+
+
+ def tag_q(self, attrs, indent, content, has_child=0):
+ """Returns inline quote definition.
+
+
+
+
+ """
+ return self.tag('q', attrs, indent, content, has_child)
+
+
+ def tag_sub(self, attrs, indent, content, has_child=0):
+ """Returns subscript definition.
+
+
+
+
+ """
+ return self.tag('sub', attrs, indent, content, has_child)
+
+
+ def tag_sup(self, attrs, indent, content, has_child=0):
+ """Returns superscript definition.
+
+
+
+
+ """
+ return self.tag('sup', attrs, indent, content, has_child)
+
+
+ def tag_tt(self, attrs, indent, content, has_child=0):
+ """Returns fixed pitch font definition.
+
+
+
+
+ """
+ return self.tag('tt', attrs, indent, content, has_child)
+
+
+ def tag_i(self, attrs, indent, content, has_child=0):
+ """Returns italic font definition.
+
+
+
+
+ """
+ return self.tag('i', attrs, indent, content, has_child)
+
+
+ def tag_b(self, attrs, indent, content, has_child=0):
+ """Returns bold font definition.
+
+
+
+
+ """
+ return self.tag('b', attrs, indent, content, has_child)
+
+
+ def tag_big(self, attrs, indent, content, has_child=0):
+ """Returns bigger font definition.
+
+
+
+
+ """
+ return self.tag('big', attrs, indent, content, has_child)
+
+
+ def tag_small(self, attrs, indent, content, has_child=0):
+ """Returns smaller font definition.
+
+
+
+
+ """
+ return self.tag('small', attrs, indent, content, has_child)
+
+
+ # ------------------------------------------------------------------
+ # Object
+ # ------------------------------------------------------------------
+
+ def tag_object(self, attrs, indent, content, has_child=1):
+ """Returns object definition.
+
+
+
+
+ The object definition is used to embed objects as part of HTML
+ pages. param elements should precede other content.
+ Parameters can also be expressed as attribute/value pairs on
+ the object element itself when brevity is desired.
+
+ """
+ return self.tag('object', attrs, indent, content, has_child)
+
+
+ def tag_param(self, attrs, indent):
+ """Returns param definition.
+
+
+
+
+ The param definition is used to supply a named property value.
+ In XML it would seem natural to follow RDF and support an
+ abbreviated syntax where the param elements are replaced by
+ attribute value pairs on the object start tag.
+
+ """
+ return self.tag('object', attrs, indent)
+
+
+ # ------------------------------------------------------------------
+ # Images
+ # ------------------------------------------------------------------
+
+ def tag_img(self, attrs, indent):
+ """Returns image definition.
+
+
+
+
+ To avoid accessibility problems for people who aren't able to
+ see the image, you should provide a text description using the
+ alt and longdesc attributes. In addition, avoid the use of
+ server-side image maps. Note that in this DTD there is no
+ name attribute. That is only available in the transitional
+ and frameset DTD.
+
+ usemap points to a map element which may be in this document
+ or an external document, although the latter is not widely
+ supported.
+
+ """
+ return self.tag('img', attrs, indent)
+
+
+ # ------------------------------------------------------------------
+ # Client-side image maps
+ # ------------------------------------------------------------------
+
+ def tag_map(self, attrs, indent, content, has_child=1):
+ """Returns map definition.
+
+
+
+
+ This can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported.
+
+ """
+ return self.tag('map', attrs, indent, indent, content, has_child)
+
+
+ def tag_area(self, attrs, indent):
+ """Returns area definition.
+
+
+
+
+ This can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported.
+
+ """
+ return self.tag('area', attrs, indent)
+
+
+ # ------------------------------------------------------------------
+ # Forms
+ # ------------------------------------------------------------------
+
+ def tag_form(self, attrs, indent, content, has_child=1):
+ """Returns form definition.
+
+
+
+
+ """
+ return self.tag('form', attrs, indent, content, has_child)
+
+
+ def tag_label(self, attrs, indent, content, has_child=0):
+ """Returns label definition.
+
+
+
+
+ Each label must not contain more than ONE field Label elements
+ shouldn't be nested.
+
+ """
+ return self.tag('label', attrs, indent, content, has_child)
+
+
+ def tag_input(self, attrs, indent):
+ """Returns input definition for form control.
+
+
+
+
+
+
+ The name attribute is required for all but submit & reset.
+
+ """
+ return self.tag('input', attrs, indent)
+
+
+ def tag_select(self, attrs, indent, content, has_child=0):
+ """Returns select definition.
+
+
+
+
+ """
+ return self.tag('select', attrs, indent, content, has_child)
+
+
+ def tag_optgroup(self, attrs, indent, content, has_child=1):
+ """Returns option group definition.
+
+
+
+
+ """
+ return self.tag('optgroup', attrs, indent, content, has_child)
+
+
+ def tag_option(self, attrs, indent, content, has_child=0):
+ """Returns option definition.
+
+
+
+
+ """
+ return self.tag('option', attrs, indent, content, has_child)
+
+
+ def tag_textarea(self, attrs, indent, content):
+ """Returns textarea definition.
+
+
+
+
+ """
+ return self.textarea('textarea', attrs, indent, content)
+
+
+ def tag_fieldset(self, attrs, indent, content, has_child=1):
+ """Returns fieldset definition.
+
+
+
+
+ The fieldset element is used to group form fields. Only one
+ legend element should occur in the content and if present
+ should only be preceded by whitespace.
+
+ """
+ return self.tag('filedset', attrs, indent, content, has_child)
+
+
+ def tag_legend(self, attrs, indent, content):
+ """Retruns legend definition.
+
+
+
+
+ """
+ return self.tag('legend', attrs, indent, content)
+
+
+ def tag_button(self, attrs, indent, content):
+ """Returns button definition.
+
+
+
+
+ content is %Flow; excluding a, form and form controls.
+
+ """
+ return self.tag('button', attrs, indent, content)
+
+
+ def tag_table(self, attrs, indent, content, has_child=1):
+ """Returns table definition.
+
+
+
+
+
+
+
+
+
+
+ Derived from IETF HTML table standard, see [RFC1942]
+
+ The border attribute sets the thickness of the frame around
+ the table. The default units are screen pixels. The frame
+ attribute specifies which parts of the frame around the table
+ should be rendered. The values are not the same as CALS to
+ avoid a name clash with the valign attribute. The rules
+ attribute defines which rules to draw between cells: If rules
+ is absent then assume: "none" if border is absent or
+ border="0" otherwise "all". Horizontal alignment attributes
+ for cell contents:
+ char alignment char, e.g. char=':'
+ charoff offset for alignment char
+
+ """
+ return self.tag('table', attrs, indent, content, has_child)
+
+
+ def tag_caption(self, attrs, indent, content):
+ """Returns caption definition.
+
+
+
+
+ """
+ return self.tag('caption', attrs, indent, content)
+
+
+ def tag_thead(self, attrs, indent, content, has_child=1):
+ """Returns thead definition.
+
+
+
+
+ Use thead to duplicate headers when breaking table across page
+ boundaries, or for static headers when tbody sections are
+ rendered in scrolling panel.
+
+ """
+ return self.tag('thead', attrs, indent, content, has_child)
+
+
+ def tag_tbody(self, attrs, indent, content, has_child=1):
+ """Returns tbody definition.
+
+
+
+
+ Use tbody to duplicate footers when breaking table across page
+ boundaries, or for static footers when tbody sections are
+ rendered in scrolling panel.
+
+ """
+ return self.tag('tbody', attrs, indent, content, has_child)
+
+
+ def tag_tbody(self, attrs, indent, content, has_child=1):
+ """Returns tbody definition.
+
+
+
+
+ Use multiple tbody sections when rules are needed between
+ groups of table rows.
+
+ """
+ return self.tag('tbody', attrs, indent, content, has_child)
+
+
+ def tag_colgroup(self, attrs, indent, content, has_child=1):
+ """Returns colgroup definition.
+
+
+
+
+ colgroup groups a set of col elements. It allows you to group
+ several semantically related columns together.
+
+ """
+ return self.tag('colgroup', attrs, indent, content, has_child)
+
+
+ def tag_col(self, attrs, indent):
+ """Returns col definition.
+
+
+
+
+ col elements define the alignment properties for cells in one
+ or more columns. The width attribute specifies the width of
+ the columns, e.g.
+
+ width=64 width in screen pixels
+ width=0.5* relative width of 0.5
+
+ The span attribute causes the attributes of one col element to
+ apply to more than one column.
+
+ """
+ return self.tag('col', attrs, indent)
+
+
+ def tag_tr(self, attrs, indent, content, has_child=1):
+ """Returns table row definition.
+
+
+
+
+ """
+ return self.tag('tr', attrs, indent, content, has_child)
+
+
+ def tag_th(self, attrs, indent, content, has_child):
+ """Returns table header definition.
+
+
+
+
+
+
+ Scope is simpler than headers attribute for common tables. th
+ is for headers, td for data and for cells acting as both.
+
+ """
+ return self.tab('th', attrs, indent, content, has_child)
+
+
+ def tag_td(self, attrs, indent, content, has_child=1):
+ """Returns table data definition.
+
+
+
+
+ """
+ return self.tag('td', attrs, indent, content, has_child)
diff --git a/Scripts/Python/centos-web/cgi-bin/webenv.cgi b/Scripts/Python/centos-web/cgi-bin/webenv.cgi
new file mode 100755
index 0000000..d137638
--- /dev/null
+++ b/Scripts/Python/centos-web/cgi-bin/webenv.cgi
@@ -0,0 +1,58 @@
+#!/usr/bin/python
+#
+# centos-web.cgi -- This script is an effort to organize The CentOS
+# Project information in XHTML format for its publication on the
+# Internet. The script is organized in a package named `Apps' which,
+# in turn, is subdivided in other packages (e.g., `Home', `Sponsors',
+# etc.) to cover each web application the organization demands.
+#
+# Notice that some of the web applications demanded (e.g., Wiki,
+# Lists, Forums, Bugs, etc.) are not included in this script, but
+# linked to their own locations. Moreover, in order to provide
+# accessability among all different web applications, they need to be
+# redesigned to share one unique visual style and one unique top-level
+# navigation bar so the current web application can be remarked.
+#
+# Copyright (C) 2011 Alain Reguera Delgado
+#
+# 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 cgi
+import cgitb; cgitb.enable()
+
+def main():
+
+ qs = cgi.parse()
+
+ if 'app' in qs:
+ app = qs['app'][0].lower()
+ else:
+ app = 'home'
+
+ if app == 'home':
+ from Apps.Home import page
+ elif app == 'sponsors':
+ from Apps.Sponsors import page
+ else:
+ from Apps.Unknown import page
+
+ print 'Content-type: text/html' + "\n"
+ print page.main()
+
+if __name__ == '__main__': main()
diff --git a/Scripts/Python/centos-web/public/Images/a-attach.png b/Scripts/Python/centos-web/public/Images/a-attach.png
new file mode 100644
index 0000000..d6a41e7
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/a-attach.png differ
diff --git a/Scripts/Python/centos-web/public/Images/a-mail.png b/Scripts/Python/centos-web/public/Images/a-mail.png
new file mode 100644
index 0000000..355a998
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/a-mail.png differ
diff --git a/Scripts/Python/centos-web/public/Images/a-www.png b/Scripts/Python/centos-web/public/Images/a-www.png
new file mode 100644
index 0000000..e5a0483
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/a-www.png differ
diff --git a/Scripts/Python/centos-web/public/Images/ads-sample-468x60.png b/Scripts/Python/centos-web/public/Images/ads-sample-468x60.png
new file mode 100644
index 0000000..f634d10
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/ads-sample-468x60.png differ
diff --git a/Scripts/Python/centos-web/public/Images/ads-sample-728x90.png b/Scripts/Python/centos-web/public/Images/ads-sample-728x90.png
new file mode 100644
index 0000000..5401e60
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/ads-sample-728x90.png differ
diff --git a/Scripts/Python/centos-web/public/Images/caution.png b/Scripts/Python/centos-web/public/Images/caution.png
new file mode 100644
index 0000000..efcec04
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/caution.png differ
diff --git a/Scripts/Python/centos-web/public/Images/centos-logo.png b/Scripts/Python/centos-web/public/Images/centos-logo.png
new file mode 100644
index 0000000..506c65d
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/centos-logo.png differ
diff --git a/Scripts/Python/centos-web/public/Images/convenction.png b/Scripts/Python/centos-web/public/Images/convenction.png
new file mode 100644
index 0000000..e516c0e
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/convenction.png differ
diff --git a/Scripts/Python/centos-web/public/Images/error.png b/Scripts/Python/centos-web/public/Images/error.png
new file mode 100644
index 0000000..0f52b4d
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/error.png differ
diff --git a/Scripts/Python/centos-web/public/Images/h1-bg.png b/Scripts/Python/centos-web/public/Images/h1-bg.png
new file mode 100644
index 0000000..e609c59
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/h1-bg.png differ
diff --git a/Scripts/Python/centos-web/public/Images/h2-bg.png b/Scripts/Python/centos-web/public/Images/h2-bg.png
new file mode 100644
index 0000000..826fbec
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/h2-bg.png differ
diff --git a/Scripts/Python/centos-web/public/Images/html-bg.png b/Scripts/Python/centos-web/public/Images/html-bg.png
new file mode 100644
index 0000000..0c6dca6
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/html-bg.png differ
diff --git a/Scripts/Python/centos-web/public/Images/important.png b/Scripts/Python/centos-web/public/Images/important.png
new file mode 100644
index 0000000..509ec86
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/important.png differ
diff --git a/Scripts/Python/centos-web/public/Images/msg-bg-blue.png b/Scripts/Python/centos-web/public/Images/msg-bg-blue.png
new file mode 100644
index 0000000..47bc405
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/msg-bg-blue.png differ
diff --git a/Scripts/Python/centos-web/public/Images/msg-bg-gray.png b/Scripts/Python/centos-web/public/Images/msg-bg-gray.png
new file mode 100644
index 0000000..a8a9246
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/msg-bg-gray.png differ
diff --git a/Scripts/Python/centos-web/public/Images/msg-bg-green.png b/Scripts/Python/centos-web/public/Images/msg-bg-green.png
new file mode 100644
index 0000000..f1bfe2b
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/msg-bg-green.png differ
diff --git a/Scripts/Python/centos-web/public/Images/msg-bg-orange.png b/Scripts/Python/centos-web/public/Images/msg-bg-orange.png
new file mode 100644
index 0000000..0866bb8
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/msg-bg-orange.png differ
diff --git a/Scripts/Python/centos-web/public/Images/msg-bg-red.png b/Scripts/Python/centos-web/public/Images/msg-bg-red.png
new file mode 100644
index 0000000..2dc3e70
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/msg-bg-red.png differ
diff --git a/Scripts/Python/centos-web/public/Images/msg-bg-violet.png b/Scripts/Python/centos-web/public/Images/msg-bg-violet.png
new file mode 100644
index 0000000..8b1075d
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/msg-bg-violet.png differ
diff --git a/Scripts/Python/centos-web/public/Images/note.png b/Scripts/Python/centos-web/public/Images/note.png
new file mode 100644
index 0000000..b58a224
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/note.png differ
diff --git a/Scripts/Python/centos-web/public/Images/redirect.png b/Scripts/Python/centos-web/public/Images/redirect.png
new file mode 100644
index 0000000..16a8c41
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/redirect.png differ
diff --git a/Scripts/Python/centos-web/public/Images/success.png b/Scripts/Python/centos-web/public/Images/success.png
new file mode 100644
index 0000000..74cc874
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/success.png differ
diff --git a/Scripts/Python/centos-web/public/Images/tabs-bg-1.png b/Scripts/Python/centos-web/public/Images/tabs-bg-1.png
new file mode 100644
index 0000000..22cff37
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/tabs-bg-1.png differ
diff --git a/Scripts/Python/centos-web/public/Images/tabs-bg-2.png b/Scripts/Python/centos-web/public/Images/tabs-bg-2.png
new file mode 100644
index 0000000..5d8e178
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/tabs-bg-2.png differ
diff --git a/Scripts/Python/centos-web/public/Images/tip.png b/Scripts/Python/centos-web/public/Images/tip.png
new file mode 100644
index 0000000..cfcf6db
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/tip.png differ
diff --git a/Scripts/Python/centos-web/public/Images/top.png b/Scripts/Python/centos-web/public/Images/top.png
new file mode 100644
index 0000000..1557422
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/top.png differ
diff --git a/Scripts/Python/centos-web/public/Images/ul.png b/Scripts/Python/centos-web/public/Images/ul.png
new file mode 100644
index 0000000..efcf485
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/ul.png differ
diff --git a/Scripts/Python/centos-web/public/Images/warning.png b/Scripts/Python/centos-web/public/Images/warning.png
new file mode 100644
index 0000000..e36c02a
Binary files /dev/null and b/Scripts/Python/centos-web/public/Images/warning.png differ
diff --git a/Scripts/Python/centos-web/public/Stylesheet/admonition.css b/Scripts/Python/centos-web/public/Stylesheet/admonition.css
new file mode 100755
index 0000000..a08eff5
--- /dev/null
+++ b/Scripts/Python/centos-web/public/Stylesheet/admonition.css
@@ -0,0 +1,122 @@
+/*
+ * Webenv -> Quotation
+ *
+ * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
+ *
+ * This CSS 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 CSS 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$
+ * ----------------------------------------------------------------------
+ */
+
+div#page-body div.admonition {
+ border: 1px solid;
+ border-left: 5px solid;
+ padding: 10px 20px 10px 10px;
+ margin: 1.5em 0 1.5em 0;
+ }
+
+div#page-body div.admonition pre {
+ border: none;
+ background-color: #333;
+ color: #FFFFFF;
+ }
+
+div#page-body div.admonition img {
+ float: left;
+ }
+
+
+div#page-body div.admonition h3 {
+ margin-top: 10px;
+ line-height: 1.5em;
+ }
+
+div#page-body div.admonition h3,
+div#page-body div.admonition p,
+div#page-body div.admonition pre,
+div#page-body div.admonition table {
+ margin-left: 60px;
+ }
+
+div#page-body div.admonition ul,
+div#page-body div.admonition ol,
+div#page-body div.admonition dl {
+ margin-left: 110px;
+ }
+
+div#page-body div.admonition ul dl,
+div#page-body div.admonition ul ol,
+div#page-body div.admonition ul ul,
+div#page-body div.admonition ol dl,
+div#page-body div.admonition ol ol,
+div#page-body div.admonition ol ul,
+div#page-body div.admonition dl dl,
+div#page-body div.admonition dl ol,
+div#page-body div.admonition dl ul {
+ margin-left: 2.5em;
+ }
+
+div#page-body div.admonition.unknown pre,
+div#page-body div.admonition.unknown h3,
+div#page-body div.admonition.unknown p,
+div#page-body div.admonition.unknown table {
+ margin-left: 20px;
+ }
+
+div#page-body div.admonition.success,
+div#page-body div.admonition.redirected,
+div#page-body div.admonition.error {
+ border: none;
+ border-top: 5px solid;
+ border-bottom: 5px solid;
+ border-color: #CFCFCF;
+ }
+
+div#page-body div.admonition.unknown,
+div#page-body div.admonition.redirected,
+div#page-body div.admonition.note {
+ background-image: url("https://projects.centos.org/public/Images/msg-bg-blue.png");
+ border-color: #D2E0F6;
+ background-color: #ECF4FF;
+ }
+
+div#page-body div.admonition.tip,
+div#page-body div.admonition.important,
+div#page-body div.admonition.caution,
+div#page-body div.admonition.warning {
+ border-color: #F6E7D2;
+ background-color: #FFF8EC;
+ background-image: url("https://projects.centos.org/public/Images/msg-bg-orange.png");
+ }
+
+div#page-body div.admonition.violet {
+ border-color: #F6D2F6;
+ background-color: #FFECFF;
+ background-image: url("https://projects.centos.org/public/Images/msg-bg-violet.png");
+ }
+
+div#page-body div.admonition.error {
+ border-color: #E0B7B7;
+ background-color: #FFECEC;
+ background-image: url("https://projects.centos.org/public/Images/msg-bg-red.png");
+ }
+
+div#page-body div.admonition.success {
+ border-color: #D6F6D2;
+ background-color: #EEFFEC;
+ background-image: url("https://projects.centos.org/public/Images/msg-bg-green.png");
+ }
diff --git a/Scripts/Python/centos-web/public/Stylesheet/base.css b/Scripts/Python/centos-web/public/Stylesheet/base.css
new file mode 100755
index 0000000..d062cdc
--- /dev/null
+++ b/Scripts/Python/centos-web/public/Stylesheet/base.css
@@ -0,0 +1,376 @@
+/*
+ * Webenv -> Main Blocks
+ *
+ * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
+ *
+ * This CSS 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 CSS 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$
+ * ----------------------------------------------------------------------
+ */
+
+div#page-header,
+div#wrap,
+div#page-body,
+div#page-footer {
+ min-width: 728px;
+ }
+
+/* Header
+--------------------------------------------------------------------*/
+div#page-header {
+ background: #204C8D url("https://projects.centos.org/public/Images/h1-bg.png") 0 0 repeat;
+ min-height: 46px;
+ }
+
+/* Content
+--------------------------------------------------------------------*/
+
+div#wrap {
+ padding: 0 10px 0 10px;
+ background-color: #FFF;
+ }
+
+div#page-body {
+ clear: both;
+ background-color: #F8F8F8;
+ }
+
+div#page-body div#content-list {
+ padding: 10px;
+ padding-left: 0;
+ padding-top: 8px;
+ background-color: #FFF;
+ }
+
+/* Paragraphs
+--------------------------------------------------------------------*/
+
+/* Footer
+--------------------------------------------------------------------*/
+
+div#page-footer {
+ background: #204C8D url("https://projects.centos.org/public/Images/h1-bg.png") 0 0 repeat;
+ }
+
+div#page-footer div.credits {
+ padding: 8px;
+ }
+
+div#page-footer div.credits .copyright,
+div#page-footer div.credits .license {
+ font-size: x-small;
+ color: #FFF;
+ margin: 3px;
+ }
+
+div#page-footer div.credits a {
+ color: #FFF;
+ font-style: italic;
+ }
+
+div#page-footer div.top {
+ float:right;
+ }
+
+/* Logo
+--------------------------------------------------------------------*/
+
+div#page-header div#logo img {
+ border: none;
+ float: left;
+ margin-left: 10px;
+ }
+
+/* Google advertisement (468x60px)
+--------------------------------------------------------------------*/
+
+div#page-header div.google-ad {
+ float: right;
+ margin: 5px;
+ }
+
+div#page-header div.google-ad img {
+ border: none;
+ }
+
+/* Last releases and related RSS link.
+--------------------------------------------------------------------*/
+
+div#page-header div#last-releases {
+ clear: both;
+ min-height: 35px;
+ border-top: 3px solid #FFF;
+ background: #3465A4;
+ }
+
+div#page-header div#last-releases a {
+ color: #fff;
+ }
+
+div#page-header div#last-releases div.left {
+ display: block;
+ float: left;
+ width: 450px;
+ margin-top: 10px;
+ margin-left: 10px;
+ font-size: small;
+ }
+
+div#page-header div#last-releases div.right {
+ float: right;
+ margin-top: 9px;
+ margin-right: 5px;
+ }
+
+div#page-header div#last-releases div.right span.rss span {
+ text-align: center;
+ font-weight: bold;
+ background: #729fcf;
+ padding: 4px 10px;
+ }
+
+div#page-header div#last-releases div span.title {
+ font-weight: bold;
+ color: #FFF;
+ }
+
+div#page-header div#last-releases div span.release {
+ border-right: 1px dotted #FFF;
+ padding-left: 10px;
+ padding-right: 10px;
+ font-weight: bold;
+ }
+
+div#page-header div#last-releases div span.last {
+ border-right: 0px;
+ }
+
+/* Application links
+--------------------------------------------------------------------*/
+
+div#page-header div#pagelinks {
+ border-top: 3px solid #FFF;
+ }
+
+/* User related links (e.g., last visit, session info and page trails)
+--------------------------------------------------------------------*/
+
+div#page-header div.userlinks {
+ padding: 10px;
+ text-align: right;
+ font-size: x-small;
+ clear: both;
+ }
+
+div#page-header div.userlinks a {
+ color: #fff;
+ }
+
+div#page-header div.userlinks div.logs {
+ width: 50%;
+ float: left;
+ text-align: left;
+ }
+
+div#page-header div.userlinks div.logs span {
+ border: none;
+ }
+
+div#page-header div.userlinks div.logs span.title {
+ color: #FFF;
+ }
+
+div#page-header div.userlinks div.logs span.datetime {
+ font-style: italic;
+ color: #FFF;
+ }
+
+div#page-header div.userlinks div.session {
+ width: 50%;
+ float: right;
+ }
+
+div#page-header div.userlinks div.session span {
+ border-right: 1px dotted #FFF;
+ }
+
+div#page-header div.userlinks div.session span a {
+ margin-right: 10px;
+ margin-left: 10px;
+ }
+
+
+div#page-header div.userlinks div.session span.last {
+ border-right: none;
+ }
+
+div#page-header div.userlinks div.session span.last a {
+ margin-right: 0;
+ }
+
+div#page-header div.userlinks div.session span.last:after {
+ content: none;
+ }
+
+div#page-header div.userlinks div.trail {
+ text-align: right;
+ clear: both;
+ padding-top: 5px;
+ }
+
+div#page-header div.userlinks div.trail span {
+ display: inline;
+ }
+
+div#page-header div.userlinks div.trail span.last {
+ border-right: none;
+ padding-right: 0;
+ }
+
+div#page-header div.userlinks div.trail span:after {
+ content: "»";
+ color: #FFF;
+ margin-left: 5px;
+ margin-right: 3px;
+ }
+
+div#page-header div.userlinks div.trail span.last:after {
+ content: none;
+ }
+
+/* Page lines.
+--------------------------------------------------------------------*/
+
+.page-line {
+ clear: both;
+ margin: 0;
+ padding: 0;
+ background-color: transparent;
+ }
+
+.page-line.white {
+ height: 3px;
+ background-color: #FFF;
+ }
+
+/* Page body
+--------------------------------------------------------------------*/
+
+div#page-body .info {
+ margin-top: 5px;
+ }
+
+div#page-body .info span {
+ font-size: small;
+ border-right: 1px dotted #AAA;
+ padding-right: 10px;
+ padding-left: 7px;
+ }
+
+div#page-body .info span.author {
+ padding-left: 0;
+ }
+
+div#page-body .info span.comment {
+ border-right: 0;
+ }
+
+/* Content Listing - One column
+--------------------------------------------------------------------*/
+
+div#page-body div#content-list {
+ margin-right: 200px;
+ border-right: 3px #EEE solid;
+ }
+
+div#page-body div#content-actions {
+ float:right;
+ width: 180px;
+ border-left: 3px #EEE solid;
+ padding: 10px;
+ font-size: small;
+ }
+
+div#page-body div#content-actions form input[type="text"] {
+ border: 1px solid #AAA;
+ }
+
+div#page-body div#content-list div.search {
+ }
+
+div#page-body div#content-list div.row {
+ padding: 10px 20px;
+ }
+
+div#page-body div#content-list div.dark {
+ background: #F8F8F8;
+ }
+
+div#page-body div#content-list div.light {
+ background: #FFF;
+ }
+
+div#page-body div#content-list h3.title {
+ margin-top: 0;
+ }
+
+div#page-body div#content-list .abstract {
+ margin-bottom: 1em;
+ }
+
+div#page-body div#content-list .pagination {
+ border-top: 1px solid #AAA;
+ font-size: small;
+ padding: 10px;
+ border-top: 1px #AAA solid;
+ margin-bottom: 0;
+ padding-bottom: 0;
+ }
+
+div#page-body div#content-list .pagination span.previous {
+ float: left;
+ }
+
+div#page-body div#content-list .pagination span.previous a:before {
+ content: "«";
+ padding-right: 3px;
+ }
+
+div#page-body div#content-list .pagination span.next a:after {
+ content: "»";
+ padding-left: 3px;
+ }
+
+div#page-body div#content-list .pagination span.next {
+ float: right;
+ }
+
+/* Content Details - One column
+--------------------------------------------------------------------*/
+
+div#page-body div#content-details {
+ padding: 30px 10% 30px 10%;
+ background: #FFF;
+ }
+
+/* Content Unkown - Not page found.
+--------------------------------------------------------------------*/
+
+div#page-body div#content-unknown {
+ padding: 0 15% 0 15%;
+ background: #FFF;
+ }
diff --git a/Scripts/Python/centos-web/public/Stylesheet/forms.css b/Scripts/Python/centos-web/public/Stylesheet/forms.css
new file mode 100755
index 0000000..9a39fc2
--- /dev/null
+++ b/Scripts/Python/centos-web/public/Stylesheet/forms.css
@@ -0,0 +1,137 @@
+/*
+ * Webenv -> Forms
+ *
+ * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
+ *
+ * This CSS 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 CSS 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$
+ * ----------------------------------------------------------------------
+ */
+
+div#page-body div.row1 {
+ clear: both;
+ background: #F8F8F8;
+ padding: 10px;
+ }
+
+div#page-body div.row2 {
+ clear: both;
+ background: #FFFFFF;
+ padding: 10px;
+ }
+
+div#page-body div.row3 {
+ clear: both;
+ border-top: 1px solid #CCC;
+ padding: 10px;
+ margin-top: 10px;
+ }
+
+div#page-body fieldset div.row1 span.descrip,
+div#page-body fieldset div.row2 span.descrip {
+ float: left;
+ }
+
+div#page-body fieldset div.field {
+ display: block;
+ margin-left: 30%;
+ }
+
+div#page-body fieldset div.field div.column {
+ float: left;
+ margin-right: 1em;
+ padding-right: 1em;
+ border-right: 1px dotted #AAA;
+ }
+
+div#page-body fieldset div.row3 div.descrip {
+ display: block;
+ font-size: small;
+ color: #AAA;
+ font-style: italic;
+ width: 70%
+ }
+
+div#page-body fieldset span.submit {
+ float: right;
+ }
+
+/* */
+
+div#page-body form div {
+ padding-bottom: 10px;
+ }
+
+div#page-body form div span {
+ display: inline;
+ margin: 0;
+ padding-right: 10px;
+ }
+
+div#page-body div span.results {
+ padding-left: 10px;
+ border-left: 1px dotted #AAA;
+ }
+
+/* */
+
+
+/* */
+
+div#page-body div.records-list {
+ display: block;
+ }
+
+div#page-body div.records-list ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ }
+
+div#page-body div.records-list ul li {
+ padding: 0.5em;
+ }
+
+div#page-body div.records-list ul li.row1 {
+ background: #F8F8F8;
+ }
+
+div#page-body div.records-list ul li span.col0 {
+ display: block;
+ float:left;
+ text-align: center;
+ padding-right: 0.5em;
+ margin-right: 0.5em;
+ border-right: 1px solid #FFF;
+ }
+
+div#page-body div.records-list ul li span.col1 {
+ width: 250px;
+ display: block;
+ float:left;
+ }
+
+div#page-body div.records-list ul li span.col2 {
+ border-left: 1px solid #FFF;
+ padding-left: 0.5em;
+ }
+
+div#page-body div.records-list ul li.title {
+ font-weight: bold;
+ background: #eee;
+ border-bottom: 1px #AAA solid;
+ }
diff --git a/Scripts/Python/centos-web/public/Stylesheet/links.css b/Scripts/Python/centos-web/public/Stylesheet/links.css
new file mode 100755
index 0000000..d0ae637
--- /dev/null
+++ b/Scripts/Python/centos-web/public/Stylesheet/links.css
@@ -0,0 +1,62 @@
+/*
+ * Webenv -> Links
+ *
+ * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
+ *
+ * This CSS 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 CSS 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$
+ * ----------------------------------------------------------------------
+ */
+
+/* Broken or nonexistent links.
+--------------------------------------------------------------------*/
+
+div#page-body a.nonexistent,
+div#page-body a.nonexistent:hover { color: gray; }
+
+/* Special decoration for some links' classes
+--------------------------------------------------------------------*/
+
+div#page-body a.www:before {
+ white-space:nowrap;
+ content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-www.png);
+ margin: 0 0.2em;
+ }
+
+div#page-body a.http:before {
+ white-space:nowrap;
+ content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-www.png);
+ margin: 0 0.2em;
+ }
+
+div#page-body a.https:before {
+ white-space:nowrap;
+ content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-www.png);
+ margin: 0 0.2em;
+ }
+
+div#page-body a.mailto:before {
+ white-space:nowrap;
+ content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-mail.png);
+ margin: 0 0.2em;
+ }
+
+div#page-body a.attachment:before {
+ white-space:nowrap;
+ content: url(/home/centos/artwork/trunk/Identity/Images/Webenv/a-attach.png);
+ margin: 0 0.2em;
+ }
diff --git a/Scripts/Python/centos-web/public/Stylesheet/lists.css b/Scripts/Python/centos-web/public/Stylesheet/lists.css
new file mode 100755
index 0000000..cdea058
--- /dev/null
+++ b/Scripts/Python/centos-web/public/Stylesheet/lists.css
@@ -0,0 +1,111 @@
+/*
+ * Webenv -> Lists
+ *
+ * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
+ *
+ * This CSS 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 CSS 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$
+ * ----------------------------------------------------------------------
+ */
+
+div#page-body ul {
+ /*
+ list-style: url("https://projects.centos.org/public/Images/ul.png") disc;
+ */
+ }
+
+div#page-body ul,
+div#page-body ol {
+ margin-left: 2.5em;
+ }
+
+div#page-body ul ol,
+div#page-body ol ul,
+div#page-body dl ul,
+div#page-body dl ol {
+ margin-left: 1.5em;
+ }
+
+div#page-body div#links ul {
+ padding: 0.5em 0.5em 1em 1em;
+ margin: 0;
+ list-style: none;
+ border-top: 1px #EEE solid;
+ }
+
+div#page-body div#links ul.first {
+ border-top: none;
+ }
+
+div#page-body div#links ul li {
+ padding: 2px;
+ }
+
+/* Table of content (toc)
+--------------------------------------------------------------------*/
+
+div#page-body div.toc {
+ font-size: small;
+ text-align:left;
+ margin-bottom: 2em;
+ }
+
+div#page-body div.toc p {
+ font-weight: bold;
+ margin: 0.5em 0 0.5em 0;
+ }
+
+div#page-body div#content div.toc dl {
+ margin: 0;
+ }
+
+div#page-body div#content div.toc dl dl {
+ margin-left: 2.5em;
+ }
+
+/* Content actions links (e.g., categories and archives).
+--------------------------------------------------------------------*/
+
+div#page-body div#content-actions dl {
+ margin-top: 0;
+ margin-left: 0;
+ }
+
+div#page-body div#content-actions dl dt {
+ font-weight: bold;
+ border-bottom: 1px solid #EEE;
+ margin-bottom: 1em;
+ }
+
+div#page-body div#content-actions dl dd {
+ margin-left: 1.5em;
+ }
+
+div#page-body div#content-actions dl dl {
+ margin-left: 1.5em;
+ margin-top: 0px;
+ border-top: none;
+ padding-top: 0;
+ }
+
+div#page-body div#content-actions dl dl.year {
+ margin-bottom: 1em;
+ }
+
+div#page-body div#content-actions dl dl.year dd {
+ margin-left: 0;
+ }
diff --git a/Scripts/Python/centos-web/public/Stylesheet/reset.css b/Scripts/Python/centos-web/public/Stylesheet/reset.css
new file mode 100755
index 0000000..202310d
--- /dev/null
+++ b/Scripts/Python/centos-web/public/Stylesheet/reset.css
@@ -0,0 +1,352 @@
+/*
+ * Webenv (reset) -- This file resets the browser's default visual
+ * style and sets The CentOS Web Environment visual style as default
+ * visual style. This file sets default values to tags like `html',
+ * `body', as well as those controlling links, tables, paragrphs,
+ * headings, lists, forms and quotation.
+ *
+ * The CentOS Web Environment (Webenv) is specially conceived to
+ * achieve one unique visual style and easy navegation through all
+ * different web applications The CentOS Project uses to show its
+ * existence in the World Wide Web medium.
+ *
+ * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
+ *
+ * This CSS 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 CSS 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$
+ * -------------------------------------------------------------------
+ */
+
+
+/* Reset browsers default margins and paddings
+-----------------------------------------------*/
+
+* {
+ margin: 0;
+ padding: 0;
+ }
+
+/* Define html
+-----------------------------------------------*/
+
+html {
+ background-color: #FFF;
+ background-image: url("https://projects.centos.org/public/Images/html-bg.png");
+ }
+
+/* Define body
+-----------------------------------------------*/
+
+body {
+ font-family: "DejaVu Sans", "Liberation Sans", sans-serif;
+ font-size: 0.85em;
+ /* margin: 0; /* <- full screen */
+ /* margin: 0 1% 0 1%; /* <- with 1% of left and right margin */
+ /* margin: 0 2% 0 2%; /* <- with 2% of left and right margin */
+ margin: 0 3% 0 3%; /* <- with 3% of left and right margin */
+ /* margin: 0 10% 0 10%; /* <- with 10% of left and right margin */
+ color: #333;
+ }
+
+/* Links
+-----------------------------------------------*/
+
+a:link { text-decoration: none; color: #0044B3; }
+a:hover { text-decoration: underline; color: green; }
+a:active { text-decoration: underline; color: green; }
+a:visited { text-decoration: none; color: #0044B3; }
+a:visited:hover { text-decoration: underline; color: green; }
+
+.title,
+.title a:link,
+.title a:active,
+.title a:hover,
+.title a:visited,
+.title a:visited:hover {
+ /* color: #072B61; */
+ color: #000000;
+ }
+
+/* Headings
+-----------------------------------------------*/
+
+h1 {
+ font-size: 2em;
+ line-height: 1.3em;
+ }
+
+h2 {
+ font-size: 1.5em;
+ line-height: 1.5em;
+ margin-top: 1.5em;
+ }
+
+h3 {
+ font-size: 1.4em;
+ line-height: 1.4em;
+ margin-top: 1.4em;
+ }
+
+h4 {
+ font-size: 1.2em;
+ line-height: 1.2em;
+ margin-top: 1.2em;
+ }
+
+h5 {
+ font-size: 1.1em;
+ line-height: 1.1em;
+ margin-top: 1.1em;
+ }
+
+h6 {
+ font-size: 1em;
+ line-height: 1em;
+ margin-top: 1em;
+ }
+
+/* Paragraphs
+-----------------------------------------------*/
+
+p {
+ margin: 1em 0 1.5em 0;
+ line-height: 1.5em;
+ text-align: justify;
+ }
+
+/* Images
+-----------------------------------------------*/
+
+img {
+ border: none;
+ }
+
+/* Quotations
+-----------------------------------------------*/
+
+blockquote {
+ background: #fafafa;
+ border-color: #eeeeee;
+ border-width: 1px;
+ border-style: solid;
+ border-left-width: 4px;
+ margin-left: 1.5em;
+ padding: 0.5em;
+ margin-top: 1em;
+ margin-bottom: 1.3em;
+ }
+
+q:before {
+ content: " “";
+ }
+
+q:after {
+ content: "” ";
+ }
+
+q q:before {
+ content: " ‘";
+ }
+
+q q:after {
+ content: "’ ";
+ }
+
+address {
+ margin-left: 1.5em;
+ }
+
+/* Preformatted Texts
+-----------------------------------------------*/
+
+pre {
+ font-family: "DejaVu Sans Mono", "Liberation Mono", monospace;
+ padding: 0.5em 1em 0.5em 1em;
+ margin: 1em 0 1em 0;
+ white-space: pre;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #E5E5E5;
+ border-left-width: 4px;
+ background: #FFFAE9;
+ overflow: auto;
+ }
+
+/* Phrase Elements
+-----------------------------------------------*/
+
+tt,
+samp,
+kbd,
+code {
+ font-family: "DejaVu Sans Mono", "Liberation Mono", monospace;
+ }
+
+/* Page Lines
+-----------------------------------------------*/
+
+hr {
+ clear: both;
+ height: 1px ! important;
+ border: none;
+ background-color: #DADADA;
+ }
+
+/* Lists
+-----------------------------------------------*/
+
+ul,
+ol,
+dl {
+ margin: 1.5em 0 1.5em 2.5em;
+ }
+
+ul {
+ list-style: disc;
+ }
+
+ol {
+ list-style-image: none !important;
+ }
+
+ul li,
+ol li {
+ line-height: 1.5em;
+ }
+
+ul ul,
+ul ol,
+ol ul,
+ol ol {
+ margin-top: 0.3em;
+ margin-bottom: 0.3em;
+ }
+
+ul li p,
+ol li p {
+ margin-bottom: 0.3em;
+ }
+
+dl dd {
+ margin-left: 2.5em;
+ }
+
+dl ol,
+dl ul {
+ margin-left: 3.5em;
+ }
+
+/* Tables
+-----------------------------------------------*/
+
+table {
+ border-collapse: collapse;
+ }
+
+table caption {
+ font-style: italic;
+ text-align: center;
+ }
+
+table tr th {
+ font-weight: bold;
+ }
+
+table tr td,
+table tr th {
+ border: 1pt;
+ border-style: solid;
+ border-color: #CCC;
+ padding-top: 0.25em;
+ padding-right: 0.5em;
+ padding-bottom: 0.25em;
+ padding-left: 0.5em;
+ vertical-align: top;
+ }
+
+table tr td p,
+table tr td pre {
+ margin: 0;
+ padding: 0;
+ }
+
+/* Forms
+-----------------------------------------------*/
+
+form {
+ display: inline;
+ }
+
+input[type="submit"],
+input[type="button"] {
+ padding: 1px;
+ display: inline;
+ text-decoration: none;
+ }
+
+input[type="text"],
+input[type="password"],
+textarea {
+ display: inline;
+ padding: 2px;
+ }
+
+select {
+ display: inline;
+ padding: 1px;
+ }
+
+form p {
+ display: inline;
+ margin-left: 5px;
+ margin-right: 5px;
+ }
+
+/* Select
+---------------------------------------- */
+
+select option {
+ padding-left: 3px;
+ padding-right: 3px;
+ }
+
+select optgroup {
+ font-style: normal;
+ font-weight: bold;
+ padding-left: 3px;
+ }
+
+select optgroup option {
+ margin-left: 1em;
+ }
+
+input[type="radio"],
+input[type="checkbox"] {
+ vertical-align: middle;
+ }
+
+fieldset {
+ margin: 1em 0 1em 0;
+ padding: 1em;
+ padding-bottom: 5px;
+ border: 1px solid #AAA;
+ }
+
+fieldset legend {
+ font-weight: bold;
+ color: #AAA;
+ }
diff --git a/Scripts/Python/centos-web/public/Stylesheet/tabs.css b/Scripts/Python/centos-web/public/Stylesheet/tabs.css
new file mode 100755
index 0000000..158b539
--- /dev/null
+++ b/Scripts/Python/centos-web/public/Stylesheet/tabs.css
@@ -0,0 +1,83 @@
+/*
+ * Webenv -> Tabs (Style 2: Two Rounded Borders)
+ *
+ * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
+ *
+ * This CSS 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 CSS 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$
+ * ----------------------------------------------------------------------
+ */
+
+div#page-header div.tabs {
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+
+div#page-header div.tabs a {
+ color: #FFF;
+ float: left;
+ font-weight: bold;
+ margin-right: 3px;
+ padding: 0px 8px 0 0px;
+ text-decoration: none;
+ }
+
+div#page-header div.tabs span.current a,
+div#page-header div.tabs span.current a:hover,
+div#page-header div.tabs span.current a span,
+div#page-header div.tabs span.current a:hover span {
+ color: #204A87;
+ text-decoration: none;
+ }
+
+div#page-header div.tabs a span {
+ float: left;
+ padding: 5px 0px 3px 8px;
+ }
+
+/* */
+
+div#page-header div.tabs a {
+ background: none;
+ }
+
+div#page-header div.tabs a span {
+ background: none;
+ }
+
+div#page-header div.tabs span.current a,
+div#page-header div.tabs span.current a:hover {
+ background: url("https://projects.centos.org/public/Images/tabs-bg-1.png") 100% -50px no-repeat;
+ }
+
+div#page-header div.tabs span.current a span,
+div#page-header div.tabs span.current a:hover span {
+ background: url("https://projects.centos.org/public/Images/tabs-bg-2.png") 0 -50px no-repeat;
+ }
+
+div#page-header div.tabs span:hover a {
+ background: url("https://projects.centos.org/public/Images/tabs-bg-1.png") 100% 0 no-repeat;
+ }
+
+div#page-header div.tabs span:hover a span {
+ background: url("https://projects.centos.org/public/Images/tabs-bg-2.png") 0 0;
+ }
+
+/* Application level navigation bar.
+--------------------------------------------------------------------*/
+div#page-header div#appslinks div.tabs span:hover a span {
+ }
diff --git a/Scripts/Python/centos-web/public/stylesheet.css b/Scripts/Python/centos-web/public/stylesheet.css
new file mode 100755
index 0000000..00015ea
--- /dev/null
+++ b/Scripts/Python/centos-web/public/stylesheet.css
@@ -0,0 +1,39 @@
+/*
+ * Webenv
+ *
+ * Copyright (C) 2009, 2010, 2011 The CentOS Artwork SIG
+ *
+ * This CSS 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 CSS 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$
+ * ----------------------------------------------------------------------
+ */
+
+/* Reset browser's default definitions.
+--------------------------------------------------------------------*/
+@import url("https://projects.centos.org/public/Stylesheet/reset.css");
+
+/* Customize default definitions.
+--------------------------------------------------------------------*/
+@import url("https://projects.centos.org/public/Stylesheet/base.css");
+@import url("https://projects.centos.org/public/Stylesheet/links.css");
+@import url("https://projects.centos.org/public/Stylesheet/lists.css");
+@import url("https://projects.centos.org/public/Stylesheet/admonition.css");
+@import url("https://projects.centos.org/public/Stylesheet/forms.css");
+
+/* Miscellaneous definitions.
+--------------------------------------------------------------------*/
+@import url("https://projects.centos.org/public/Stylesheet/tabs.css");
diff --git a/Scripts/Python/centos-web/webenv.conf b/Scripts/Python/centos-web/webenv.conf
new file mode 100644
index 0000000..6361087
--- /dev/null
+++ b/Scripts/Python/centos-web/webenv.conf
@@ -0,0 +1,88 @@
+# This file provides the configuration required by Apache HTTP server
+# in order for `webenv.cgi' script to be able of running through it.
+# The configuration provided in this file is splitted in two, one
+# through aliases and other through virtual domains (see bellow) you
+# need to comment/uncomment in order to get a functional configuration.
+# ------------------------------------------------------------------
+# $Id$
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# The `Aliases' Configuration:
+#
+# This configuration assumes you are a web developer whom needs to
+# prepare a workstation for downloading a working copy of `webenv.cgi'
+# in order to test the changes you made locally before commit them up
+# to the central repository.
+#
+# A possible solution would be to download the `webenv.cgi' tree from
+# the central repository into your home directory using the following
+# directory structure:
+#
+# ~/user
+# `-- public_html
+# `-- webenv
+# |-- cgi-bin
+# | |-- apps
+# | `-- webenv.cgi
+# `-- public
+# |-- images
+# |-- stylesheets
+# `-- stylesheets.css
+#
+# In this structure, the `cgi-bin' directory must be set with a
+# `httpd_sys_script_exec_t' selinux context in order for cgi scripts
+# inside to be executed correctly. So, inside `cgi-bin' directory is
+# where we put the `webenv.cgi' script and all related `.py' files it
+# needs to run. Outside the `cgi-bin' directory, we put all public
+# information (e.g., images and css files) and then configure apache
+# to work with such structure.
+#
+# Be sure to enable requests to `/~user/' to serve the user's
+# public_html directory inside the `/etc/httpd/conf/httpd.conf' file
+# and copy this file (i.e., `webenv.conf') to `/etc/httpd/conf.d/'
+# directory in order to make the web application available at the URL:
+# `http://projects.centos.org/webenv/'.
+
+#FIXME: The css file uses absolute urls to call image files and other
+# css related files which aren't loaded when the domain is different
+# to that one specified inside the css files.
+
+ScriptAliasMatch ^/centos-web/(.*)$ "/home/centos/public_html/centos-web/cgi-bin/webenv.cgi"
+AliasMatch ^/public/(.*)$ "/home/centos/public_html/centos-web/public"
+
+# ------------------------------------------------------------------
+# The `Virtual Domain' Configuration
+#
+# This configuration assumes you are a system administrator whom needs
+# to put the `webenv.cgi' script in production. For example, if you
+# administer the `centos.org' domain, this configuration would let you
+# to run the `webenv.cgi' script with an URL like
+# `http://www.centos.org/'.
+#
+# This configuration requires that you set up your DNS to point such
+# URLs to the same IP address and copy this file (i.e., `webenv.conf')
+# into the `/etc/httpd/conf.d/' directory. Once you've done this,
+# reload the httpd service (e.g., /sbin/service httpd reload) and use
+# the URL you set up to reach the application.
+#
+# Notice that, in this configuration you don't make changes inside the
+# `webenv.cgi' script source code. In this configuration, the
+# application's source code would be in a place accesable by apache
+# and root users only (e.g., `/var/www/cgi-bin') with the only purpose
+# of being productive there. Of course, you as system administrtors
+# can update the `webenv.cgi' source code in this location when web
+# developers do release new version of it.
+
+#NameVirtualHost *:80
+#
+#
+# ServerName projects.centos.org
+# DocumentRoot /var/www/html
+#
+#
+#
+# ServerName www.centos.org
+# ScriptAliasMatch ^/[^public](.*)$ "/var/www/cgi-bin/webenv.cgi"
+# Alias /public "/var/www/html"
+#