| 1 | """ |
|---|
| 2 | Javascript Helpers |
|---|
| 3 | |
|---|
| 4 | Provides functionality for working with JavaScript in your views. |
|---|
| 5 | |
|---|
| 6 | Ajax, controls and visual effects |
|---|
| 7 | --------------------------------- |
|---|
| 8 | |
|---|
| 9 | * For information on using Ajax, see `Prototype Helpers <module-railshelpers.helpers.prototype.html>`_. |
|---|
| 10 | * For information on using controls and visual effects, see `Scriptaculous Helpers <module-railshelpers.helpers.scriptaculous.html>`_. |
|---|
| 11 | """ |
|---|
| 12 | # Last synced with Rails copy at Revision 4235 on Aug 19th, 2006. |
|---|
| 13 | |
|---|
| 14 | import re |
|---|
| 15 | from tags import * |
|---|
| 16 | |
|---|
| 17 | def link_to_function(name, function, **html_options): |
|---|
| 18 | """ |
|---|
| 19 | Returns a link that'll trigger a JavaScript ``function`` using the |
|---|
| 20 | onclick handler and return false after the fact. |
|---|
| 21 | |
|---|
| 22 | Example:: |
|---|
| 23 | |
|---|
| 24 | link_to_function("Greeting", "alert('Hello world!')") |
|---|
| 25 | """ |
|---|
| 26 | options = dict(href="#", onclick="%s; return false;" % function) |
|---|
| 27 | options.update(html_options) |
|---|
| 28 | return content_tag("a", name, **options) |
|---|
| 29 | |
|---|
| 30 | def button_to_function(name, function, **html_options): |
|---|
| 31 | """ |
|---|
| 32 | Returns a link that'll trigger a JavaScript ``function`` using the |
|---|
| 33 | onclick handler and return false after the fact. |
|---|
| 34 | |
|---|
| 35 | Example:: |
|---|
| 36 | |
|---|
| 37 | button_to_function("Greeting", "alert('Hello world!')") |
|---|
| 38 | """ |
|---|
| 39 | options = dict(type_="button", value=name, onclick="%s; " % function) |
|---|
| 40 | options.update(html_options) |
|---|
| 41 | return content_tag("input", "", **options) |
|---|
| 42 | |
|---|
| 43 | def escape_javascript(javascript): |
|---|
| 44 | """ |
|---|
| 45 | Escape carriage returns and single and double quotes for JavaScript segments. |
|---|
| 46 | """ |
|---|
| 47 | javascript = re.sub(r'\r\n|\n|\r', r'\\n', (javascript or '')) |
|---|
| 48 | javascript = re.sub(r'(["\'])', r'\\\1', javascript) |
|---|
| 49 | return javascript |
|---|
| 50 | |
|---|
| 51 | def javascript_tag(content): |
|---|
| 52 | """ |
|---|
| 53 | Returns a JavaScript tag with the ``content`` inside. |
|---|
| 54 | |
|---|
| 55 | Example:: |
|---|
| 56 | |
|---|
| 57 | >>> javascript_tag("alert('All is good')" |
|---|
| 58 | '<script type="text/javascript">alert('All is good')</script>' |
|---|
| 59 | """ |
|---|
| 60 | return content_tag("script", javascript_cdata_section(content), type="text/javascript") |
|---|
| 61 | |
|---|
| 62 | def javascript_cdata_section(content): |
|---|
| 63 | return "\n//%s\n" % cdata_section("\n%s\n//" % content) |
|---|
| 64 | |
|---|
| 65 | def options_for_javascript(options): |
|---|
| 66 | optionlist = [] |
|---|
| 67 | for key, value in options.iteritems(): |
|---|
| 68 | if isinstance(value, bool): |
|---|
| 69 | value = str(value).lower() |
|---|
| 70 | optionlist.append('%s:%s' % (key, value)) |
|---|
| 71 | optionlist.sort() |
|---|
| 72 | return '{' + ', '.join(optionlist) + '}' |
|---|
| 73 | |
|---|
| 74 | def array_or_string_for_javascript(option): |
|---|
| 75 | jsoption = None |
|---|
| 76 | if isinstance(option, list): |
|---|
| 77 | jsoption = "['%s']" % '\',\''.join(option) |
|---|
| 78 | elif isinstance(option, bool): |
|---|
| 79 | jsoption = str(option).lower() |
|---|
| 80 | else: |
|---|
| 81 | jsoption = "'%s'" % option |
|---|
| 82 | return jsoption |
|---|
| 83 | |
|---|
| 84 | __all__ = ['link_to_function', 'button_to_function', 'escape_javascript', 'javascript_tag'] |
|---|