« Noční čtení | intrakosmologie | Vzpomínky na štěstí »

Vlnka

dond Úterý, 23 únor, 2010 v 11:38 odp.

(Varování: Tento text neníGoogle Wave. Tento text naopak je dost technický.)

Protože často píšu příspěvky (sem, do diskuzí, do Astropisího redakčního systému) v HTML a často je píšu buď jenom částečně (tedy kousek, který se pak někam vloží), nebo před zamýšleným zveřejněním (do foroty – ostatně jako tomu bylo v případě tohoto textu), píšu je pochopitelně ve svém oblíbeném editoru. Jelikož tento disponuje vnitřním skriptovacím rozhraním, připravil jsem si jednoduchou pomůcku, která mi vloží nezlomitelné mezery tam, kde to je (většinou) vhodné. Jde o velmi primitivní náhradu za program vlna od Petra Olšáka, ale pro moje potřeby naprosto stačí.

Funguje to tak, že z inicializačního .vimrc souboru načtu soubor HtmlVlna.vim, který obsahuje definici funkce Vlna_recode(), jejíž volání je namapované na funkční klávesu F12.

au FileType html source ~/.vim/plugin/HtmlVlna.vim
au FileType html map <F12> :call VLNA_recode()

Takže píšu, když mám pocit, že jsem sepsal všechno, co jsem chtěl světu sdělit, zmáčknu F12 a funkce VLNA_recode() najde mezery za jednopísmennými předložkami a spojkami a nahradí je nezlomitelnou mezerou. Mechanizmus hledání je velmi primitivní a celá funkce vypadá takhle:

function! VLNA_recode()
  " skocime na zacatek souboru
  execute "normal gg"

  " najdeme vsechno, co chceme nahradit
  while search('[^<]\<[AaIiKkOoSsUuVvZz]\>\s\+',"W")>0
" vypisem cislo radky, kterou menime
echo "Vlnkuju radek ".line(".")

" samotna vymena znaku - hlidani pocatecniho '<' zabrani vlozeni &nbsp; do <a href=...
s/\([^<]\)\<\([AaIiKkOoSsUuVvZz]\)\>\s\+/\1\2\&nbsp;/g

" spocitame, kolik jsme nezlomitelnych mezer jsme nahradili
let s:currLine=getline(".")
let s:index=0
let s:nbspCount=0
while match(s:currLine,'&nbsp;',s:index)>-1
  let s:found=match(s:currLine,'&nbsp;',s:index)
  let s:index=s:found+5 " posunem kurzor na konec
  let s:nbspCount=s:nbspCount+1
endwhile

let s:tmp=trunc(s:nbspCount/10.0)
let s:nbspCount=s:nbspCount-float2nr(10*s:tmp)

" vypiseme pocet nalezenych nezlom. mezer
if s:nbspCount==1
  echon " [".s:nbspCount." nezlomitelna mezera]\n"
elseif s:nbspCount>2&&s:nbspCount<5
  echon " [".s:nbspCount." nezlomitelne mezery]\n"
else
  echon " [".s:nbspCount." nezlomitelnych mezer]\n"
endif
  endwhile
endfunction

Všechnu práci tedy obstará jeden regulární výraz (na ř. 11), zbytek je jen omáčka okolo, která vypisuje informace o vyměněných mezerách.

V tomhle příspěvku funkce našla a nahradila 17 mezer. :-)

Pochopitelně vím, že snažit se na webu o splnění typografických pravidel tímto způsobem je poněkud nesystematické (přinejlepším), ale o ničem lepším nevím. Přinejmenším mně vadí jednopísmenné částice na koncích řádků, proto tuhle úpravu dělám – vím, že podle typografických pravidel patří nezlomitelná mezera pouze za neslabičné předložky nebo předložky na začátku věty; většinou ji ale dávám všude, protože samotná písmena na koncích řádků prostě vypadají divně (a obvykle jsou tam poměrně bezdůvodně).

Aktualizováno: Úterý, 23 únor, 2010 11:48 odp.

« Noční čtení | Nahoru | Vzpomínky na štěstí »