"""
Asset Tag Helpers
Provides functionality for linking an HTML page together with other assets, such as
javascripts, stylesheets, and feeds.
"""
# Last synced with Rails copy at Revision 4103 on Aug 19th, 2006.
import os
import urlparse
from tags import *
from routes import request_config
# The absolute path of the WebHelpers javascripts directory
javascript_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
'javascripts')
# WebHelpers' built-in javascripts. Note: scriptaculous automatically includes all of its
# supporting .js files
javascript_builtins = ('prototype.js', 'scriptaculous.js')
def auto_discovery_link_tag(source, type='rss', **kwargs):
"""
Returns a link tag allowing browsers and news readers (that support it) to auto-detect
an RSS or ATOM feed for current page.
``source``
The URL of the feed. The URL is ultimately prepended with the environment's
``SCRIPT_NAME`` (the root path of the web application), unless the URL is
fully-fledged (e.g. http://example.com).
``type``
The type of feed. Specifying 'rss' or 'atom' automatically translates to a type of
'application/rss+xml' or 'application/atom+xml', respectively. Otherwise the type
is used as specified. Defaults to 'rss'.
Examples::
>>> auto_discovery_link_tag('http://feed.com/feed.xml')
''
>>> auto_discovery_link_tag('http://feed.com/feed.xml', type='atom')
''
>>> auto_discovery_link_tag('app.rss', type='atom', title='atom feed')
''
>>> auto_discovery_link_tag('/app.html', type='text/html')
''
"""
title = ''
if type.lower() in ('rss', 'atom'):
title = type.upper()
type='application/%s+xml' % type.lower()
tag_args = dict(rel='alternate', type=type, title=title,
href=compute_public_path(source))
kwargs.pop('href', None)
kwargs.pop('type', None)
tag_args.update(kwargs)
return tag('link', **tag_args)
def image_tag(source, alt=None, size=None, **options):
"""
Returns an image tag for the specified ``source``.
``source``
The source URL of the image. The URL is prepended with '/images/', unless its full
path is specified. The URL is ultimately prepended with the environment's
``SCRIPT_NAME`` (the root path of the web application), unless the URL is
fully-fledged (e.g. http://example.com). A source with no filename extension will
be automatically appended with the '.png' extension.
``alt``
The img's alt tag. Defaults to the source's filename, title cased.
``size``
The img's size, specified in the format "XxY". "30x45" becomes
width="30", height="45". "x20" becomes height="20".
Examples::
>>> image_tag('xml')
''
>>> image_tag('rss', 'rss syndication')
''
"""
options['src'] = compute_public_path(source, 'images', 'png')
if not alt:
alt = os.path.splitext(os.path.basename(source))[0].title()
options['alt'] = alt
if size:
width, height = size.split('x')
if width:
options['width'] = width
if height:
options['height'] = height
return tag('img', **options)
def javascript_include_tag(*sources, **options):
"""
Returns script include tags for the specified javascript ``sources``.
Each source's URL path is prepended with '/javascripts/' unless their full path is
specified. Each source's URL path is ultimately prepended with the environment's
``SCRIPT_NAME`` (the root path of the web application), unless the URL path is a
full-fledged URL (e.g. http://example.com). Sources with no filename extension will be
appended with the '.js' extension.
Optionally includes (prepended) WebHelpers' built-in javascripts when passed the
``builtins=True`` keyword argument.
Examples::
>>> print javascript_include_tag(builtins=True)
>>> print javascript_include_tag('prototype', '/other-javascripts/util.js')
>>> print javascript_include_tag('app', '/test/test.1.js', builtins=True)
"""
if options.get('builtins'):
sources = javascript_builtins + sources
tags = [content_tag('script', None,
**dict(type='text/javascript',
src=compute_public_path(source, 'javascripts', 'js'))) \
for source in sources]
return '\n'.join(tags)
def stylesheet_link_tag(*sources, **options):
"""
Returns CSS link tags for the specified stylesheet ``sources``.
Each source's URL path is prepended with '/stylesheets/' unless their full path is
specified. Each source's URL path is ultimately prepended with the environment's
``SCRIPT_NAME`` (the root path of the web application), unless the URL path is a
full-fledged URL (e.g. http://example.com). Sources with no filename extension will be
appended with the '.css' extension.
Examples::
>>> stylesheet_link_tag('style')
''
>>> stylesheet_link_tag('/dir/file', media='all')
''
"""
tag_options = dict(rel='Stylesheet', type='text/css', media='screen')
tag_options.update(options)
tag_options.pop('href', None)
tags = [tag('link', **dict(href=compute_public_path(source, 'stylesheets', 'css'),
**tag_options)) for source in sources]
return '\n'.join(tags)
def compute_public_path(source, root_path=None, ext=None):
"""
Format the specified source for publishing, via the public directory, if applicable.
"""
if ext and not os.path.splitext(os.path.basename(source))[1]:
source = '%s.%s' % (source, ext)
# Avoid munging fully-fledged URLs, including 'mailto:'
parsed = urlparse.urlparse(source)
if not (parsed[0] and (parsed[1] or parsed[2])):
# Prefix apps deployed under any SCRIPT_NAME path
if not root_path or source.startswith('/'):
source = '%s%s' % (get_script_name(), source)
else:
source = '%s/%s/%s' % (get_script_name(), root_path, source)
return source
def get_script_name():
"""
Determine the current web application's ``SCRIPT_NAME``.
"""
script_name = ''
config = request_config()
if hasattr(config, 'environ'):
script_name = config.environ.get('SCRIPT_NAME', '')
return script_name
__all__ = ['javascript_path', 'javascript_builtins', 'auto_discovery_link_tag',
'image_tag', 'javascript_include_tag', 'stylesheet_link_tag']