el feRoRcarril
Patch Server y coloreado de parches
Mayo 31st, 2006 - [Enlace local]
Ayer comentaba que había hecho dos cosas interesantes que podían interesar a algunos.
Hoy le he dedicado un ratillo al coloreado de los parches (formatos diff normal, unificado y contextual), y ya tengo algo enseñable. Hay que probarlo mejor, y probablemente dé algunos problemillas con parches recursivos (de varios ficheros a la vez, vamos), pero ya se puede empezar a usar. Lo único que hay que hacer para usarlo es dejarlo disponible en algún sitio, de tal manera que se pueda cargar con require 'syntax/lang/diff' (por ejemplo, dejarlo como lib/syntax/lang/diff.rb en una aplicación Rails). El uso, como se puede ver en el helper colorize_patch de patch_server, es tan sencillo como:
require 'syntax/convertors/html' conv = Syntax::Convertors::HTML.for_syntax 'diff' conv.convert(contenido_del_parche)
Teniendo, por supuesto, instalado Syntax.
In-place editing
Sobre la caja para modificar campos sueltos por Ajax, sigue estando igual de poco pulida que ayer, pero como he subido todo patch_server para poner disponible el coloreador de parches, ha quedado visible. Ahora mismo es solamente un helper (ajax_field_updater, que por ahora está en application_helper) bastante simple. Hay un ejemplo en la vista patches/edit:
<%= ajax_field_updater :patch, :description, :data_html => textilize(@patch.description) %>
Los dos primeros parámetros son los típicos de los helpers de controles de formulario de Rails, y el tercero son opciones. La que yo he especificado en el ejemplo hace que, en vez de mostrarse el contenido del campo tal cual, se muestre el resultado de textilize, es decir, que se interprete de tal forma que haya formato con los guiones bajos, asteriscos, etc. Ver la api y la referencia de Markdown para más detalles.
La parte del servidor es un poco más compleja, porque todavía no he escrito nada para hacerlo más cómodo. Por tanto, hay que hacerlo todo a mano, añadiendo un método (en este caso concreto) llamado update_patch_description. La implementación es trivial:
def update_patch_description
@patch = Patch.find(params[:id])
if params[:patch][:description]
@patch.description = params[:patch][:description]
@patch.save
end
render :inline => "<%= textilize_without_paragraph(@patch.description) %>"
end
Espero que les guste ;-)