Automatické zalamovanie riadkov

Ak máme na našom blogu vstupné dáta zadané od používateľa, potrebujeme často oddeliť jednotlivé riadky. Typickým príkladom sú komentáre pod článkom. Autor snaživo rozčlení svoj dlhší komentár na riadky, pri čom na výstupe uvidí všetko v jednom riadku. Poďme to napraviť!Ak používateľ pošle formulárom viacej riadkov textu, premenná obsahuje text v takejto forme:

@text = "Prvy riadok\n\nDruhy riadok"

Ako vidíme, \n označuje zalomenie riadku. Ak však tento text pošleme na HTML výstup, uvidíme len jeden riadok.
Preto potrebujeme n nahradiť niečim, čo nám riadky zalomí. Máme 3 možnosti:

  1. nahradiť \n za tag <br />
  2. nahradiť \n za tag <p>, resp. obaliť jednolivé riadky do <p> a </p>
  3. použiť helper simple_format, ktorý všetko spraví za nás.

1. Nahradiť \n za tag <br />

Použijeme metódu gsub, ktorou môžeme nahradiť časti reťazca:

@text = “Prvy riadok\n\nDruhy riadok”
@text.gsub(“\n”, “<br />\n”)
# => “Prvy riadok<br />\n<br />\nDruhy riadok”

2. Nahradiť \n za tag <p>

Opäť použijeme metódu gsub, ale tentokrát si spravíme helper. Umiestnime ho do app/helpers/application_helper.rb:

def break_lines(text)
  return_str = ""
  lines = text.split("\n\n")
  lines.each do |line|
    return_str << "<p>" + line.gsub("\n", "<br />") + "</p>"
  end
  return return_str
end

Vstupný text pomocou split-u rozdelíme na jednotlivé riadky. Ten zistíme výskytom “dvojitého” enteru, teda \n\n. Each-om prejdeme každý riadok a obalíme ho tagmi <p> a </p>. A nakoniec: ak ešte v jednotlivom riadku narazíme na výskyt \n, tak ho nahradíme iba <br />. To všetko priebežne ukladáme do premennej return_str, ktorú nakonci vrátime na výstup.

Použitie:

@text = break_lines("Prvy riadok\n\nDruhy riadok")
# => "<p>Prvy riadok</p><p>Druhy riadok</p>"

Použitie s riadkmi, aj zalomením:

@text = break_lines("Prvy\n\nDruhy\ndotatok\n\nTreti")
# => "<p>Prvy</p><p>Druhy<br />dodatok</p><p>Treti</p>"

3. Použiť helper simple_format

Nakoniec najpohodlnejším riešením je využiť helper priamo v Ruby on Rails – simple_format. V princípe robí to isté, ako náš vlastný helper.

Výhodou však je možnosť poslať akýkoľvek HTML atribút. Napríklad:

@text = simple_format("Prvy riadok\n\nDruhy riadok", :class => "red")
# => "<p class="red">Prvy riadok</p><p>Druhy riadok</p>"

Odporúčam používať vstavaný helper v Railsoch. Cieľom tohto článku bolo hlavne ukázať ako zalamovanie riadkov docieliť svojimi silami.

About Štefan Húska

Ruby on Rails programátor
This entry was posted in Ruby on Rails and tagged . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>