Added an icon and support for automatically serving favicon.ico
parent
9b30000a36
commit
9fa85fac47
|
@ -0,0 +1 @@
|
|||
include src/milla/milla.ico
|
|
@ -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 |
|
@ -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,13 +35,28 @@ 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:
|
||||
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)
|
||||
|
|
|
@ -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
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 92 KiB |
Loading…
Reference in New Issue