Vlnka
dond Úterý, 23 únor, 2010 v 11:38 odp.(Varování: Tento text není o 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 do <a href=...
s/\([^<]\)\<\([AaIiKkOoSsUuVvZz]\)\>\s\+/\1\2\ /g
" spocitame, kolik jsme nezlomitelnych mezer jsme nahradili
let s:currLine=getline(".")
let s:index=0
let s:nbspCount=0
while match(s:currLine,' ',s:index)>-1
let s:found=match(s:currLine,' ',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ě).