0001"""
0002Javascript Helpers
0003
0004Provides functionality for working with JavaScript in your views.
0005
0006Ajax, controls and visual effects
0007---------------------------------
0008
0009* For information on using Ajax, see `Prototype Helpers
0010 <module-railshelpers.helpers.prototype.html>`_.
0011* For information on using controls and visual effects, see `Scriptaculous Helpers
0012 <module-railshelpers.helpers.scriptaculous.html>`_.
0013"""
0014
0015
0016import re
0017from tags import *
0018
0019def link_to_function(name, function, **html_options):
0020 """
0021 Returns a link that'll trigger a JavaScript ``function`` using the
0022 onclick handler and return false after the fact.
0023
0024 Example::
0025
0026 link_to_function("Greeting", "alert('Hello world!')")
0027 """
0028 options = dict(href="#", onclick="%s; return false;" % function)
0029 options.update(html_options)
0030 return content_tag("a", name, **options)
0031
0032def button_to_function(name, function, **html_options):
0033 """
0034 Returns a link that'll trigger a JavaScript ``function`` using the
0035 onclick handler and return false after the fact.
0036
0037 Example::
0038
0039 button_to_function("Greeting", "alert('Hello world!')")
0040 """
0041 options = dict(type_="button", value=name, onclick="%s; " % function)
0042 options.update(html_options)
0043 return content_tag("input", "", **options)
0044
0045def escape_javascript(javascript):
0046 """
0047 Escape carriage returns and single and double quotes for JavaScript segments.
0048 """
0049 javascript = re.sub(r'\\', r'\\\\', (javascript or ''))
0050 javascript = re.sub(r'\r\n|\n|\r', r'\\n', javascript)
0051 javascript = re.sub(r'(["\'])', r'\\\1', javascript)
0052 return javascript
0053
0054def javascript_tag(content, **html_options):
0055 """
0056 Returns a JavaScript tag with the ``content`` inside.
0057
0058 Example::
0059
0060 >>> javascript_tag("alert('All is good')")
0061 '<script type="text/javascript">\\n//<![CDATA[\\nalert(\\'All is good\\')\\n//]]>\\n</script>'
0062 """
0063 return content_tag("script", javascript_cdata_section(content), type="text/javascript",
0064 **html_options)
0065
0066def javascript_cdata_section(content):
0067 return "\n//%s\n" % cdata_section("\n%s\n//" % content)
0068
0069def options_for_javascript(options):
0070 optionlist = []
0071 for key, value in options.iteritems():
0072 if isinstance(value, bool):
0073 value = str(value).lower()
0074 optionlist.append('%s:%s' % (key, value))
0075 optionlist.sort()
0076 return '{' + ', '.join(optionlist) + '}'
0077
0078def array_or_string_for_javascript(option):
0079 jsoption = None
0080 if isinstance(option, list):
0081 jsoption = "['%s']" % '\',\''.join(option)
0082 elif isinstance(option, bool):
0083 jsoption = str(option).lower()
0084 else:
0085 jsoption = "'%s'" % option
0086 return jsoption
0087
0088__all__ = ['link_to_function', 'button_to_function', 'escape_javascript', 'javascript_tag']