app/assets/javascripts/ultimate/helpers/url.js.coffee in ultimate-base-0.3.1.1 vs app/assets/javascripts/ultimate/helpers/url.js.coffee in ultimate-base-0.3.2

- old
+ new

@@ -1,19 +1,24 @@ #= require ./base #= require ./tag +#= require ./javascript +__char_encode = (char) -> "%#{char.charCodeAt(0).toString(16)}" +escape_path = (str) -> str.replace(/[^*\-.0-9A-Z_a-z]/g, __char_encode).replace(/\+/g, '%20') +__string_encode = (str) -> _.map(str, (char) -> "&##{char.charCodeAt(0)};" ).join('') + @Ultimate.Helpers.Url = url_for: (options = null) -> if _.isString(options) - if options is "back" + if options is 'back' 'javascript:history.back();' else options else unless _.isEmpty(options) url = _.result(options, 'url') ? '' - if _.isObject(options) + if $.isPlainObject(options) options = _.clone(options) delete options['url'] anchor = _.outcasts.delete(options, 'anchor') url += "?#{_.map(options, (value, key) -> "#{key}=#{value}").sort().join('&')}" unless _.isEmpty(options) url += "##{anchor}" if anchor @@ -24,15 +29,48 @@ link_to: (name = null, options = null, html_options = null, block = null) -> [html_options, options] = [options, name] if block = _.outcasts.blockGiven(arguments) options ||= {} url = @url_for(options) html_options = @_convert_options_to_data_attributes(options, html_options) - html_options["href"] ||= url - Ultimate.Helpers.Tag.content_tag("a", name or url, html_options, false, block) + html_options['href'] ||= url + if block + Ultimate.Helpers.Tag.content_tag('a', html_options, null, false, block) + else + Ultimate.Helpers.Tag.content_tag('a', name or url, html_options, false) + link_to_js: (name = null, html_options = null, block = null) -> + [options, name] = [name, null] if block = _.outcasts.blockGiven(arguments) + @link_to [name, options, html_options, block]... + + mail_to: (email_address, name = null, html_options = {}) -> + email_address = _.string.escapeHTML(email_address) + encode = _.outcasts.delete(html_options, 'encode') + extras = _.compact _.map _.string.words('cc bcc body subject'), (item) -> + option = _.outcasts.delete(html_options, item) + if option? + "#{item}=#{escape_path(option)}" + extras = if _.isEmpty(extras) then '' else '?' + _.string.escapeHTML(extras.join('&')) + email_address_obfuscated = email_address + email_address_obfuscated = email_address_obfuscated.replace('@', _.outcasts.delete(html_options, 'replace_at')) if 'replace_at' of html_options + email_address_obfuscated = email_address_obfuscated.replace('.', _.outcasts.delete(html_options, 'replace_dot')) if 'replace_dot' of html_options + switch encode + when 'javascript' + html = @link_to(name or email_address_obfuscated, "mailto:#{email_address}#{extras}", html_options) + html = Ultimate.Helpers.Javascript.escape_javascript(html) + string = _.map("document.write('#{html}');", __char_encode).join('') + "<script>eval(decodeURIComponent('#{string}'))</script>" + when 'hex' + email_address_encoded = __string_encode(email_address_obfuscated) + string = __string_encode('mailto:') + _.map(email_address, (char) -> if /\w/.test(char) then __char_encode(char) else char).join('') + @link_to name or email_address_encoded, "#{string}#{extras}", html_options + else + @link_to name or email_address_obfuscated, "mailto:#{email_address}#{extras}", html_options + + + _convert_options_to_data_attributes: (options, html_options) -> if html_options html_options['data-remote'] = 'true' if @_link_to_remote_options(options) or @_link_to_remote_options(html_options) method = _.outcasts.delete(html_options, 'method') @_add_method_to_attributes(html_options, method) if method @@ -42,8 +80,25 @@ _link_to_remote_options: (options) -> _.isObject(options) and _.outcasts.delete(options, 'remote') _add_method_to_attributes: (html_options, method) -> - if _.isString(method) and method.toLowerCase() isnt "get" and not /nofollow/.test(html_options["rel"]) - html_options["rel"] = _.string.lstrip("#{html_options["rel"]} nofollow") - html_options["data-method"] = method + if _.isString(method) and method.toLowerCase() isnt 'get' and not /nofollow/.test(html_options['rel']) + html_options['rel'] = _.string.lstrip("#{html_options['rel']} nofollow") + html_options['data-method'] = method + + _convert_boolean_attributes: (html_options, bool_attrs) -> + html_options[x] = x for x in bool_attrs when _.outcasts.delete(html_options, x) + html_options + + __protect_against_forgery: false + __form_authenticity_token: 'secret' + __request_forgery_protection_token: 'form_token' + + _token_tag: (token = @__form_authenticity_token) -> + if token isnt false and @__protect_against_forgery + Ultimate.Helpers.Tag.tag 'input', type: 'hidden', name: @__request_forgery_protection_token, value: token + else + '' + + _method_tag: (method) -> + Ultimate.Helpers.Tag.tag 'input', type: 'hidden', name: '_method', value: method