Added an icon and support for automatically serving favicon.ico

master
Dustin C. Hatch 2011-03-27 15:24:41 -05:00
parent 9b30000a36
commit 9fa85fac47
5 changed files with 374 additions and 2 deletions

1
MANIFEST.in Normal file
View File

@ -0,0 +1 @@
include src/milla/milla.ico

324
milla.svg Executable file
View File

@ -0,0 +1,324 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="304.02127"
height="282.39316"
id="svg2"
version="1.1"
inkscape:version="0.48.0 r9654"
sodipodi:docname="New document 1">
<defs
id="defs4">
<linearGradient
id="linearGradient3908">
<stop
id="stop3910"
offset="0"
style="stop-color:#ff0000;stop-opacity:1;" />
<stop
style="stop-color:#ff3b3b;stop-opacity:1;"
offset="0.31020308"
id="stop3912" />
<stop
id="stop3914"
offset="1"
style="stop-color:#ff7676;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient3898">
<stop
id="stop3900"
offset="0"
style="stop-color:#ff0000;stop-opacity:1;" />
<stop
style="stop-color:#ff3b3b;stop-opacity:1;"
offset="0.29182136"
id="stop3902" />
<stop
id="stop3904"
offset="1"
style="stop-color:#ff7676;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient3882">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3884" />
<stop
id="stop3896"
offset="0.26570448"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
style="stop-color:#999999;stop-opacity:1;"
offset="1"
id="stop3886" />
</linearGradient>
<linearGradient
id="linearGradient3872">
<stop
style="stop-color:#908282;stop-opacity:1;"
offset="0"
id="stop3874" />
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop3876" />
</linearGradient>
<linearGradient
id="linearGradient3839">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3841" />
<stop
id="stop3847"
offset="0.90277779"
style="stop-color:#7f7f7f;stop-opacity:1;" />
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop3843" />
</linearGradient>
<linearGradient
id="linearGradient3823">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop3825" />
<stop
id="stop3831"
offset="0.4357639"
style="stop-color:#a9a9a9;stop-opacity:1;" />
<stop
style="stop-color:#a9a9a9;stop-opacity:1;"
offset="0.48820892"
id="stop3835" />
<stop
style="stop-color:#494949;stop-opacity:1;"
offset="0.63748133"
id="stop3833" />
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop3827" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3823"
id="linearGradient3829"
x1="365.02081"
y1="448.80029"
x2="376.57785"
y2="448.80029"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(29.89719,-37.06928)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3839"
id="linearGradient3845"
x1="-87.388168"
y1="553.36212"
x2="-77.388168"
y2="553.36212"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,2.2456712,483.14719,-617.82691)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3872"
id="radialGradient3878"
cx="-190.59984"
cy="707.85187"
fx="-190.59984"
fy="707.85187"
r="30.265625"
gradientTransform="matrix(1,0,0,1.0516246,568,-25.272557)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3898"
id="linearGradient3894"
gradientUnits="userSpaceOnUse"
x1="-10.895081"
y1="560.81372"
x2="-157.5869"
y2="409.81375"
gradientTransform="translate(568,11)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3908"
id="linearGradient3906"
gradientUnits="userSpaceOnUse"
x1="-178.89508"
y1="408.81375"
x2="-331.58688"
y2="573.81372"
gradientTransform="translate(568,11)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3882"
id="linearGradient3922"
x1="-166.27892"
y1="407.81375"
x2="-112.20305"
y2="634.81372"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(568,11)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3839"
id="linearGradient3932"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,2.2456712,483.14719,-617.82691)"
x1="-87.388168"
y1="553.36212"
x2="-77.388168"
y2="553.36212" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3898"
id="linearGradient3934"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(568,11)"
x1="-10.895081"
y1="560.81372"
x2="-157.5869"
y2="409.81375" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3908"
id="linearGradient3936"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(568,11)"
x1="-178.89508"
y1="408.81375"
x2="-331.58688"
y2="573.81372" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3882"
id="linearGradient3938"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(568,11)"
x1="-166.27892"
y1="407.81375"
x2="-112.20305"
y2="634.81372" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3823"
id="linearGradient3940"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(29.89719,-37.06928)"
x1="365.02081"
y1="448.80029"
x2="376.57785"
y2="448.80029" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3872"
id="radialGradient3942"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.0516246,568,-25.272557)"
cx="-190.59984"
cy="707.85187"
fx="-190.59984"
fy="707.85187"
r="30.265625" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="35.831886"
inkscape:cy="75.747926"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1028"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-253.6846,-418.23257)">
<g
id="g3924"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,524.09286,-114.91327)">
<rect
ry="0"
rx="0"
y="564.25049"
x="395.82922"
height="121.18411"
width="9.859622"
id="rect3837"
style="fill:url(#linearGradient3932);fill-opacity:1;stroke:#000000;stroke-width:0.21036388;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
inkscape:connector-curvature="0"
id="path3892"
d="m 468.25902,588.36312 c 0,0 47.77582,-45.77863 97.65409,-1.63704 -2.12263,-47.76743 -22.0447,-89.60252 -52.11934,-119.76092 -30.07464,-30.15839 -70.30184,-48.6401 -113.03475,-49.70075 0,0 69.3904,53.89675 67.5,171.09871 z"
style="fill:url(#linearGradient3934);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
inkscape:connector-curvature="0"
id="path3799"
d="m 333.25902,588.36312 c 0,0 -47.77582,-45.77863 -97.65409,-1.63704 2.12263,-47.76743 22.0447,-89.60252 52.11934,-119.76092 30.07464,-30.15839 70.30184,-48.64009 113.03475,-49.70075 0,0 -69.3904,53.89675 -67.5,171.09871 z"
style="fill:url(#linearGradient3936);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
id="path3807"
style="fill:url(#linearGradient3938);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 468.25902,588.36312 c 1.8904,-117.20196 -67.5,-171.09871 -67.5,-171.09871 0,0 -69.3904,53.89675 -67.5,171.09871 67.5,-47.09359 135,0 135,0 z"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<rect
rx="4.4194174"
ry="1.6793786"
y="405.10883"
x="394.918"
height="13.244527"
width="11.557027"
id="rect3821"
style="fill:url(#linearGradient3940);fill-opacity:1;stroke:#000000;stroke-width:0.40000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="csssccccccssscc"
inkscape:connector-curvature="0"
id="rect3860"
d="m 346.63454,711.44999 0,4.4375 c 0,15.82565 12.92789,28.5625 28.96875,28.5625 l 0.375,0 c 16.04086,0 28.96875,-12.73685 28.96875,-28.5625 l 0.21875,-33.09365 -8.71657,0.0312 -0.002,9.1876 0,-5e-5 -0.1875,23.1875 c 0,11.10032 -9.06122,20.03125 -20.3125,20.03125 l -0.25,0 c -11.25128,0 -20.3125,-8.93093 -20.3125,-20.03125 l 0,-3.125 c 0,-5.85033 -7.25018,-7.32575 -8.75018,-0.6251 z"
style="fill:url(#radialGradient3942);fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -7,6 +7,7 @@ Please give me a docstring!
:Updated: $Date$
:Updater: $Author$
'''
from milla.controllers import FaviconController
from webob.exc import HTTPNotFound, WSGIHTTPException
import milla.dispatch
import webob
@ -34,14 +35,29 @@ class Application(object):
def __init__(self, dispatcher):
self.dispatcher = dispatcher
self.config = {}
self.config = {'milla.favicon': True}
def __call__(self, environ, start_response):
path_info = environ['PATH_INFO']
try:
func = self.dispatcher.resolve(path_info)
except milla.dispatch.UnresolvedPath:
return HTTPNotFound()(environ, start_response)
def asbool(val):
if not val:
return False
try:
val = val.lower()
except AttributeError:
pass
if val in ('false', 'no', 'f', 'n', 'off'):
return False
return True
if asbool(self.config.get('milla.favicon')) and \
path_info == '/favicon.ico':
func = FaviconController()
else:
return HTTPNotFound()(environ, start_response)
request = webob.Request(environ)
request.config = self.config.copy()

View File

@ -9,6 +9,11 @@ from one or more of these classes can make things significantly easier.
:Updated: $Date$
:Updater: $Author$
'''
import milla
import os
__all__ = ['Controller', 'FaviconController']
class Controller(object):
'''The base controller class
@ -21,3 +26,29 @@ class Controller(object):
def __after__(self, request):
pass
class FaviconController(Controller):
'''A controller for the "favicon"
This controller is specifically suited to serve a site "favicon" or
bookmark icon. By default, it will serve the *Milla* icon, but you
can pass an alternate file time to the constructor.
:param icon: Path to an icon to serve
'''
def __init__(self, icon=None):
if not icon:
icon = os.path.join(os.path.dirname(milla.__file__), 'milla.ico')
try:
self.icon = open(icon)
except (IOError, OSError):
self.icon = None
def __call__(self, request):
if not self.icon:
raise milla.HTTPNotFound
response = milla.Response()
response.app_iter = self.icon
response.headers['Content-Type'] = 'image/x-icon'
return response

BIN
src/milla/milla.ico Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB