Recentemente, tive a necessidade de um bookmarklet dinâmico. Eu precisava das seguintes coisas ..
- algumas variáveis de rubi para serem embutidas no bookmarklet
- Eu não queria trabalhar com código compactado ou minimizado quando queria fazer alterações no meu javascript
- o bookmarklet precisava ser gerado sob demanda por solicitação do usuário com o token de API do usuário no código do bookmarklet
Minha solução foi um helper Ruby em minha pilha Rails para gerar o bookmarklet de um arquivo Javascript que continha chaves de modelo.
Digamos que você tenha um arquivo hello.js assim …
alert("Hello {{user_name}}, It is nice to see you!");
O Ruby Helper para processar o Javascript
require 'uri'
module BookmarkletHelper
def get_bookmarklet(file, hash)
# read the javascript file
js = File.open( "#{Rails.root}/app/assets/javascripts/#{file}", 'r' ).read
# Kill comments.
js.gsub!( //*.+?*/|//.*(?=[nr])/, '' )
# Tabs to spaces
js.gsub!( /s{t}{ }gm/, '' )
# Space runs to one space
js.gsub!( /s{ +}{ }gm/, '' )
# Kill line-leading whitespace
js.gsub!( /s{^s+}{}gm/, '' )
# Kill line-ending whitespace
js.gsub!( /s{s+$}{}gm/, '' )
# Kill newlines
js.gsub!( /s{n}{}gm/, '' )
hash.each_pair do |k,v|
js.gsub!( "{{#{k.to_s}}}", v )
end
js = URI.escape(js)
"javascript:(function(){#{js}}());"
end
end
Então, o uso seria assim
<% hash = { :user_name => 'David' } %>
<a href="<%= get_bookmarklet('hello.js', hash) %>">Your Bookmarklet</a>
Isso criaria um link para o minimizado e formatado para bookmartlet Javascript, com o {{user_name}} substituído pelo valor do hash.