Forum: Italian Ruby user group Sostituzione caratteri special

Posted by Luigi Maresca (luigi-s-w-net)
on 2009-12-18 09:13
Salve ancora,
nel mio controller di gestione e aggiornamento del DB ho la seguente
stringa, nel modulo di invio dati al DB, in admin_controller:

@guide.description=@guide.description.gsub(/à/,"à")
@guide.description=@guide.description.gsub(/è/,"è")
@guide.description=@guide.description.gsub(/ì/,"ì")
@guide.description=@guide.description.gsub(/ò/,"ò")
@guide.description=@guide.description.gsub(/ù/,"ù")
@guide.description=@guide.description.gsub(/é/,"é")
...
@guide.save

al fine di sostituire tutti i caratteri special con i relativi tag
html.

(ho scritto "special" altrimenti il forum lo prende per spam)

Dato che questa sostituzione la faccio per più campi del db vorrei
scriverla una sola volta come subroutine per poi richiamarla
all'occorrenza, una cosa del tipo:

def special_chars(table,item)
table.item=table.item.gsub(/à/,"à")
table.item=table.item.gsub(/è/,"è")
table.item=table.item.gsub(/ì/,"ì")
table.item=table.item.gsub(/ò/,"ò")
table.item=table.item.gsub(/ù/,"ù")
table.item=table.item.gsub(/é/,"é")
table.item=table.item.gsub(/ & /," & ")
table.item=table.item.gsub(/>"/,">"")
table.item=table.item.gsub(/"</,"&quot;<")
table.item=table.item.gsub(/μ/,"&mu;")
end

Ho provato a scriverla sia in application_helper che admin_helper ma non
funge, dove la devo inserire?

Grazie mille
Posted by Luigi Maresca (luigi-s-w-net)
on 2009-12-18 14:27
chi mi aiuta, per piacere?


Grazie
Posted by gabriele renzi (Guest)
on 2009-12-18 15:13
(Received via mailing list)
2009/12/18 Luigi Maresca <marluigi@libero.it>:

> Ho provato a scriverla sia in application_helper che admin_helper ma non

in application_helper dovrebbe andare. Comunque guardati
htmlentities[1] che fa quel che fai tu, ma (probabilmente) meglio e in
modo più generico :)

[1] http://htmlentities.rubyforge.org/
Posted by FEj (Guest)
on 2009-12-18 15:36
(Received via mailing list)
Ciao,

prova ad usare il suggerimento riportato all'url
http://stackoverflow.com/questions/1649825/how-to-convert-with-ruby-accented-characters-in-html-special-entities

Devi installare le gemme htmlentities e unicode

# coding: utf-8
require 'rubygems'
require 'htmlentities'
require 'unicode'
$KCODE = 'UTF-8'
coder = HTMLEntities.new
string = "Scròfina"
puts coder.encode(string, :named)


Ciao,
FEj


On Fri, Dec 18, 2009 at 2:27 PM, Luigi Maresca <marluigi@libero.it> 
wrote:
>
--
Emilio Frusciante

“Go and spread the free software. Happy hacking!” - RMS
Posted by Luigi Maresca (luigi-s-w-net)
on 2009-12-18 16:09
Vi ringrazio per le risposte,
ma dato che la stessa funzione mi serve per fare anche altro come:

@guide.description=@guide.description.gsub(/ PPC /," <acronym 
title=#{34.chr}Pocket PC#{34.chr}>PPC</acronym> ")

avrei bisogno di sapere come farlo funzionare con una subroutine.

In application_helper.rb ho provato ma sembra non funzionare se la 
subroutine è richiamata da un controller, funge se invece è chiamata da 
una view.

Aiuto!

Grazie
Posted by Paolo Montrasio (pmontrasio)
on 2009-12-18 19:31
Luigi Maresca wrote:
> 
> Vi ringrazio per le risposte,
> ma dato che la stessa funzione mi serve per fare anche altro come:
> 
> @guide.description=@guide.description.gsub(/ PPC /," <acronym 
> title=#{34.chr}Pocket PC#{34.chr}>PPC</acronym> ")
> 
> avrei bisogno di sapere come farlo funzionare con una subroutine.
> 
> In application_helper.rb ho provato ma sembra non funzionare se la 
> subroutine è richiamata da un controller, funge se invece è chiamata da 
> una view.
> 
> Aiuto!
> 
> Grazie

Può darsi che il problema che stai cercando di risolvere sia del tutto 
diverso, ma casomai fosse la consueta trasformazione di caratteri non 
ASCII in html entities per prevenire problemi di encoding, potrebbe 
essere più semplice forzare il browser su un charset (ad esempio utf8) 
inserendo

<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

nel layout di ogni pagina html. In questo modo tutti gli input e tutti 
gli output saranno in utf8 e non ci sarà bisogno di convertire stringhe 
in html entities né in un senso né nell'altro. Il db deve essere creato 
in utf8 pure lui.


Paolo
Posted by Luigi Maresca (luigi-s-w-net)
on 2009-12-19 00:36
Attachment: snippet.rb (13,5 KB)
Veramente già uso la definizione charset... il mio problema è un pò più 
generico infatti ho bisogno di risolverlo non tanto per i caratteri 
speciali ma quanto per la sostituzione degli acronimi che nulla hanno a 
che vedere con i charset.

La soluzione vale per entrambe le sostituzione.

Io nel mio controller di gestione e aggiornamento del DB ho una valanga 
di codice di troppo e poco gestibile che devo poter riassumere con una 
subroutine.

In allegato un esempio del problema e una parte del controller di cui 
parlo, gisuto per farvi rendere conto.
Posted by Paolo Montrasio (pmontrasio)
on 2009-12-22 11:35
Luigi Maresca wrote:
> Veramente già uso la definizione charset... il mio problema è un pò più 
> generico infatti ho bisogno di risolverlo non tanto per i caratteri 
> speciali ma quanto per la sostituzione degli acronimi che nulla hanno a 
> che vedere con i charset.
> 
> La soluzione vale per entrambe le sostituzione.
> 
> Io nel mio controller di gestione e aggiornamento del DB ho una valanga 
> di codice di troppo e poco gestibile che devo poter riassumere con una 
> subroutine.
> 
> In allegato un esempio del problema e una parte del controller di cui 
> parlo, gisuto per farvi rendere conto.

Luigi, intanto un'istruzione come

" PPC ".gsub(/ PPC /, " <acronym title=#{34.chr}Pocket 
PC#{34.chr}>PPC</acronym> ")

si può scrivere più succintamente e più leggibilmente come

" PPC ".gsub(/ PPC /, %( <acronym title="Pocket PC">PPC</acronym> ))

%() sono spesso d'aiuto

Dopo di che, se @guide è un'istanza della class Guide potresti creare un 
metodo Guide#expand_acronyms! (passami il nome) che fa un loop su un 
array i cui elementi sono del tipo ["PPC", "Pocket PC"] ed applica tutte 
le gsub.

ACRONYMS = [ ["PPC", "Pocket PC"], ... ]
def expand_acronyms!
  ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ", " #{a[1]} ") }
end

Il controller diventerebbe

def acronym_guide
  @guide = Guide.find(params[:id])
  @guide.expand_acronyms!
  if @guide.save
    flash[:notice] = 'Acronimi sostituiti.'
    redirect_to :action => 'modifica', :id => @guide
  end
end


Non l'ho provato ma è plausibile.
Idem per Page e Picture.

Paolo
Posted by Paolo Montrasio (pmontrasio)
on 2009-12-22 11:39
Rileggendomi dopo il post mi sono accorto di un errore.

Questa linea

>   ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ", " #{a[1]} ") }

doveva essere

ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ",
  %( <acronym title="#{a[1]}">#{a[0]}</acronym> )) }

Te ne saresti accorto subito ma già che ci siamo facciamo le cose per 
bene

Paolo
Posted by Luigi Maresca (luigi-s-w-net)
on 2009-12-22 12:27
Ciao Paolo,
grazie mille sono sicuro che questa è la strada giusta.

Perdona la mia ignoranza ma non ho capito, non so e non ho mai usato i 
metodi:
ACRONYMS = [ ["PPC", "Pocket PC"], ... ]
def expand_acronyms!
  ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ",
  %( <acronym title="#{a[1]}">#{a[0]}</acronym> )) }
end

questo dove lo devo scrivere.

Ti prego di farmi un esempio un pò più esplicativo.

Grazie mille
Posted by Paolo Montrasio (pmontrasio)
on 2009-12-22 22:04
Luigi Maresca wrote:
> Ciao Paolo,
> grazie mille sono sicuro che questa è la strada giusta.
> 
> Perdona la mia ignoranza ma non ho capito, non so e non ho mai usato i 
> metodi:

Luigi, annoto un po' il codice, che va in app/models/guide.rb

> ACRONYMS = [ ["PPC", "Pocket PC"], ... ]

Questo definisce la costante ACRONYMS con tutto l'array delle 
abbreviazioni e i nomi per esteso, ma fin qui dovremmo esserci, giusto?

Il metodo expand_acronims! ha il punto esclamativo in fondo solo perché 
è una convenzione Ruby quella di usare ! per i metodi che modificano 
l'oggetto su cui si applicano ma non è obbligatorio usarlo.

> def expand_acronyms!
>   ACRONYMS.each { |a| self.description.gsub!(" #{a[0]} ",
>   %( <acronym title="#{a[1]}">#{a[0]}</acronym> )) }
> end
> 
> questo dove lo devo scrivere.

L'ultima nota è che se non è immediatamente chiaro dove vadano questi 
metodi allora siamo ancora agli inizi dell'uso di Rails. Mi raccomando: 
tutto ciò che opera sui dati va nei modelli e se un controller diventa 
più lungo di 10 righe ci si deve insospettire e chiedere se c'è del 
codice da estrarre.

Paolo

> Ti prego di farmi un esempio un pò più esplicativo.
> 
> Grazie mille
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.