mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-29 06:32:40 -06:00
476 lines
9.2 KiB
Python
Executable file
476 lines
9.2 KiB
Python
Executable file
# -- Text content for the landing page. You should change these for yours! --
|
|
|
|
from direct.showbase import ElementTree as ET
|
|
|
|
title = "Landing Page"
|
|
defaultTitle = title
|
|
|
|
description = "To set this description, call WebRequestDispatcher.setDescription!<BR><BR>You can also add stats to the table below by calling WebRequestDispatcher.addQuickStat(Name,Value,PositionInTable)."
|
|
defaultDesc = description
|
|
|
|
contactInfo = "M. Ian Graham - ian.graham@dig.com"
|
|
|
|
|
|
# -- Begin fancy layout stuff, change at your own risk --
|
|
|
|
stylesheet = '''
|
|
body
|
|
{
|
|
margin: 0;
|
|
padding: 0;
|
|
font-size: 90%;
|
|
font-family: Verdana, sans-serif;
|
|
background-color: #fff;
|
|
color: #333;
|
|
}
|
|
|
|
p
|
|
{
|
|
margin: 0;
|
|
padding: 10px;
|
|
background-color: #eee;
|
|
}
|
|
|
|
h2
|
|
{
|
|
font-size: 140%;
|
|
color: #666;
|
|
background-color: #fff;
|
|
width: 22em;
|
|
margin-left: 150px;
|
|
margin-top: 0px;
|
|
}
|
|
|
|
h3
|
|
{
|
|
padding-top: 10px;
|
|
margin-top: 0px;
|
|
margin-left: 20px;
|
|
}
|
|
|
|
pre
|
|
{
|
|
margin-left: 20px;
|
|
margin-bottom: 0px;
|
|
padding-bottom: 10px;
|
|
}
|
|
|
|
a
|
|
{
|
|
text-decoration: none;
|
|
color: #333;
|
|
}
|
|
|
|
a:hover
|
|
{
|
|
text-decoration: underline;
|
|
}
|
|
|
|
#header
|
|
{
|
|
margin: 0;
|
|
padding: 0;
|
|
background-color: #fff;
|
|
}
|
|
|
|
#footer
|
|
{
|
|
margin: 0;
|
|
padding: 3px;
|
|
text-align: right;
|
|
background-color: #fff;
|
|
border-top: 1px solid #778;
|
|
font: 10px Verdana, sans-serif;
|
|
}
|
|
|
|
#contents
|
|
{
|
|
margin: 0;
|
|
padding: 25;
|
|
background-color: #eee;
|
|
min-height:600px;
|
|
height:auto !important;
|
|
height:600px;
|
|
}
|
|
|
|
<!-- Tab menu -->
|
|
|
|
#navcontainer
|
|
{
|
|
margin:0;
|
|
padding: 0;
|
|
}
|
|
|
|
#navlist
|
|
{
|
|
padding: 3px 0;
|
|
margin-left: 0;
|
|
margin: 0;
|
|
border-bottom: 1px solid #778;
|
|
font: bold 12px Verdana, sans-serif;
|
|
background-color: transparent;
|
|
}
|
|
|
|
#navlist li
|
|
{
|
|
list-style: none;
|
|
margin: 0;
|
|
display: inline;
|
|
}
|
|
|
|
#navlist li a
|
|
{
|
|
padding: 3px 0.5em;
|
|
margin-left: 3px;
|
|
border: 1px solid #778;
|
|
border-bottom: none;
|
|
background: #DDE;
|
|
text-decoration: none;
|
|
}
|
|
|
|
#navlist li a:link { color: #448; }
|
|
#navlist li a:visited { color: #667; }
|
|
|
|
#navlist li a:hover
|
|
{
|
|
color: #000;
|
|
background: #AAE;
|
|
border-color: #227;
|
|
}
|
|
|
|
#navlist li a#current
|
|
{
|
|
background: #eee;
|
|
border-bottom: 1px solid #eee;
|
|
}
|
|
|
|
#navlist li.first
|
|
{
|
|
margin-left: 150px;
|
|
}
|
|
|
|
<!-- Table formatting -->
|
|
|
|
table
|
|
{
|
|
border-spacing:1px;
|
|
background:#E7E7E7;
|
|
color:#333;
|
|
}
|
|
|
|
caption
|
|
{
|
|
border: #666666;
|
|
border-bottom: 2px solid #666666;
|
|
margin-left: 2px;
|
|
margin-right: 2px;
|
|
padding: 10px;
|
|
background: #cfcfdf;
|
|
font: 15px 'Verdana', Arial, Helvetica, sans-serif;
|
|
font-weight: bold;
|
|
}
|
|
|
|
td, th
|
|
{
|
|
font:13px 'Courier New',monospace;
|
|
padding: 4px;
|
|
}
|
|
|
|
thead th
|
|
{
|
|
text-align: center;
|
|
background: #dde;
|
|
color: #666666;
|
|
border: 1px solid #ffffff;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
tbody th
|
|
{
|
|
font-weight: bold;
|
|
}
|
|
|
|
tbody tr
|
|
{
|
|
background: #efeffc;
|
|
text-align: left;
|
|
}
|
|
|
|
tbody tr.odd
|
|
{
|
|
background: #ffffff;
|
|
border-top: 1px solid #ffffff;
|
|
}
|
|
|
|
tbody th a:hover
|
|
{
|
|
color: #009900;
|
|
}
|
|
|
|
tbody tr td
|
|
{
|
|
text-align: left
|
|
height: 30px;
|
|
background: #ffffff;
|
|
border: 1px solid #ffffff;
|
|
color: #333;
|
|
}
|
|
|
|
tbody tr.odd td
|
|
{
|
|
background: #efeffc;
|
|
border-top: 1px solid #ffffff;
|
|
}
|
|
|
|
tbody tr[altColoring="1"] td
|
|
{
|
|
background: LightCyan;
|
|
border-top: 1px solid #ffffff;
|
|
}
|
|
|
|
tbody tr[altColoring="1"].odd td
|
|
{
|
|
background: PaleTurquoise;
|
|
border-top: 1px solid #ffffff;
|
|
}
|
|
|
|
tbody tr[altColoring="2"] td
|
|
{
|
|
background: LightSalmon;
|
|
border-top: 1px solid #ffffff;
|
|
}
|
|
|
|
tbody tr[altColoring="2"].odd td
|
|
{
|
|
background: SandyBrown;
|
|
border-top: 1px solid #ffffff;
|
|
}
|
|
|
|
tbody tr.dead td
|
|
{
|
|
background:#ff0000;
|
|
border-top: 1px solid #ffffff;
|
|
}
|
|
|
|
table td a:link, table td a:visited
|
|
{
|
|
display: block;
|
|
padding: 0px;
|
|
margin: 0px;
|
|
width: 100%;
|
|
text-decoration: none;
|
|
color: #333;
|
|
}
|
|
|
|
html>body #navcontainer li a { width: auto; }
|
|
|
|
table td a:hover
|
|
{
|
|
color: #000000;
|
|
background: #aae;
|
|
}
|
|
|
|
tfoot th, tfoot td
|
|
{
|
|
background: #dfdfdf;
|
|
padding: 3px;
|
|
text-align: center;
|
|
font: 14px 'Verdana', Arial, Helvetica, sans-serif;
|
|
font-weight: bold;
|
|
border-bottom: 1px solid #cccccc;
|
|
border-top: 1px solid #DFDFDF;
|
|
}
|
|
\r\n'''
|
|
|
|
header = '''
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<html>
|
|
%(headTag)s
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
|
<title>%(titlestring)s</title>
|
|
<link rel="stylesheet" type="text/css" href="/default.css">
|
|
</head>
|
|
|
|
%(bodyTag)s
|
|
'''
|
|
|
|
# this portion of the body is now added dynamically in order to support changes to the body tag
|
|
# attributes
|
|
'''
|
|
<!-- HEADER -->
|
|
|
|
<div id="header">
|
|
<h2>%(titlestring)s</h2>
|
|
<div id="navcontainer">
|
|
<ul id="navlist">
|
|
%(menustring)s</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- CONTENT -->
|
|
|
|
<div id="contents">
|
|
<center>
|
|
|
|
'''
|
|
|
|
# caller must remove '</div>' from end of output string derived from what is returned
|
|
def addBodyHeaderAndContent(bodyTag, titleString, menuTags):
|
|
SE = ET.SubElement
|
|
bodyTag.append(ET.Comment('HEADER'))
|
|
header = SE(bodyTag, 'div', id='header')
|
|
h2 = SE(header, 'h2')
|
|
h2.text = titleString
|
|
navContainer = SE(header, 'div', id='navcontainer')
|
|
navList = SE(navContainer, 'ul', id='navlist')
|
|
for menuTag in menuTags:
|
|
navList.append(menuTag)
|
|
bodyTag.append(ET.Comment('CONTENT'))
|
|
contents = SE(bodyTag, 'div', id='contents')
|
|
center = SE(contents, 'center')
|
|
# for ease of removal of center tag closer
|
|
center.append(ET.Comment(''))
|
|
|
|
mainPageBody = '''
|
|
<P>%(description)s</P>
|
|
|
|
<P>%(quickstats)s</P>
|
|
'''
|
|
|
|
footer = '''
|
|
</center>
|
|
</div>
|
|
|
|
<!-- FOOTER -->
|
|
|
|
<div id="footer">
|
|
Contact: %(contact)s
|
|
</div>
|
|
</body>
|
|
</html>
|
|
\r\n'''
|
|
|
|
|
|
def getRowClassString(rowNum):
|
|
if rowNum % 2 == 0:
|
|
return ""
|
|
else:
|
|
return " class=\"odd\""
|
|
|
|
def getURITable(title,uriList,uriToHandler):
|
|
output = "\n<P>\n<table>\n<caption>%s</caption><thead><tr><th scope=col>URI</th><th scope=col>Handler</th></tr></thead>\n" % title
|
|
output += "<tbody>\n"
|
|
|
|
rowNum = 0
|
|
for uri in uriList:
|
|
handlerFunc = str(uriToHandler[uri][0]).split(" ")[2]
|
|
|
|
output += "<tr%s><td><a href=%s>%s</a></td><td>%s</td></tr>\n" % \
|
|
(getRowClassString(rowNum),
|
|
uri,
|
|
uri,
|
|
handlerFunc)
|
|
rowNum += 1
|
|
|
|
output += "</tbody>\n</table>\n</P>\n"
|
|
|
|
return output
|
|
|
|
def getTabs(menu,activeTab):
|
|
tabList = menu.keys()
|
|
if "Main" in tabList:
|
|
tabList.remove("Main")
|
|
if "Services" in tabList:
|
|
tabList.remove("Services")
|
|
|
|
tabList.sort()
|
|
|
|
if "Main" in menu.keys():
|
|
tabList.insert(0, "Main")
|
|
if "Services" in menu.keys():
|
|
tabList.insert(1, "Services")
|
|
|
|
s = ""
|
|
tabNum = 0
|
|
|
|
for tab in tabList:
|
|
if tabNum == 0:
|
|
if tab == activeTab:
|
|
s += "<li id=\"active\" class=\"first\"><a href=\"%s\" id=\"current\">%s</a></li>\n" % \
|
|
(menu[tab], tab)
|
|
else:
|
|
s += "<li class=\"first\"><a href=\"%s\">%s</a></li>\n" % \
|
|
(menu[tab], tab)
|
|
else:
|
|
if tab == activeTab:
|
|
s += "<li id=\"active\"><a href=\"%s\" id=\"current\">%s</a></li>\n" % \
|
|
(menu[tab], tab)
|
|
else:
|
|
s += "<li><a href=\"%s\">%s</a></li>\n" % \
|
|
(menu[tab], tab)
|
|
tabNum += 1
|
|
|
|
return s
|
|
|
|
def getTabTags(menu,activeTab):
|
|
tabList = menu.keys()
|
|
if "Main" in tabList:
|
|
tabList.remove("Main")
|
|
if "Services" in tabList:
|
|
tabList.remove("Services")
|
|
|
|
tabList.sort()
|
|
|
|
if "Main" in menu.keys():
|
|
tabList.insert(0, "Main")
|
|
if "Services" in menu.keys():
|
|
tabList.insert(1, "Services")
|
|
|
|
tabNum = 0
|
|
|
|
tags = []
|
|
|
|
for tab in tabList:
|
|
if tabNum == 0:
|
|
if tab == activeTab:
|
|
li = ET.Element('li', id='active')
|
|
li.set('class', 'first')
|
|
a = ET.SubElement(li, 'a', href=menu[tab], id='current')
|
|
a.text = tab
|
|
tags.append(li)
|
|
else:
|
|
li = ET.Element('li')
|
|
li.set('class', 'first')
|
|
a = ET.SubElement(li, 'a', href=menu[tab])
|
|
a.text = tab
|
|
tags.append(li)
|
|
else:
|
|
if tab == activeTab:
|
|
li = ET.Element('li', id='active')
|
|
a = ET.SubElement(li, 'a', href=menu[tab], id='current')
|
|
a.text = tab
|
|
tags.append(li)
|
|
else:
|
|
li = ET.Element('li')
|
|
a = ET.SubElement(li, 'a', href=menu[tab])
|
|
a.text = tab
|
|
tags.append(li)
|
|
tabNum += 1
|
|
|
|
return tags
|
|
|
|
def getQuickStatsTable(quickStats):
|
|
output = "\n<table>\n<caption>Quick Stats</caption>\n<thead><tr><th scope=col>Item</th><th scope=col>Value</th></tr></thead>\n"
|
|
output += "<tbody>\n"
|
|
|
|
rowNum = 0
|
|
for item in quickStats[0]:
|
|
output += "<tr%s><td>%s</td><td>%s</td></tr>\n" % \
|
|
(getRowClassString(rowNum),
|
|
item,
|
|
quickStats[1][item])
|
|
rowNum += 1
|
|
|
|
output += "</tbody>\n</table>\n"
|
|
|
|
return output
|