Crie Bookmarklets dinâmicos com Ruby

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.