« Vysavač je zlo & tipovací soutěž | intrakosmologie | Tipovací soutěž ještě jednou »

Šablona dokumentu pro ConTeXt

dond Pátek, 13 březen, 2009 v 2:10 odp.

Varování: tenhle článek je technický (a hodně). Povídání o blondýnkách bude zase příště.

V souvislosti s přípravou deníčku o Španělsku jsem se zase začal trochu věnovat lámání v TeXu – konkrétně v ConTeXtu (o tom jindy). Při přípravě maker jsem hodně experimentoval, studoval a zkoušel, což mj. znamená, že jsem vytvářel spoustu souborů. Pro ty účely jsem zrevidoval některé postupy, které jsem dlouho používal pro editaci TeXových zdrojáků. Kupříkladu, narozdíl od dob, kdy jsem všechno (tj. diplomku, články a dokumentaci k tehdy několika zdrojákům) psal v PlainTeXu, už mě nebaví při vytváření každého nového dokumentu ťukat záhlaví, v němž je typicky definice velikosti stránky, písma, popis, co je to za soubor, atp.

Zapátral jsem v paměti a vzpomněl si, že jsem si kdysi podle jakéhosi návodu na webu připravil šablonu pro vytváření nových Java tříd. Pohrabal jsem se ve vimfiles a trochu oprášil experimentování s makry ViMu. Výsledek je k vidění níže – není to žádná světobornost, ale funguje to a ušetří to ruční psaní pár řádek. Původní článek o systému šablon (v článku se jim říká kostry) však doporučuji pozornosti, v něm popsaný systém je flexibilnější a může se hodit, pokud chce mít člověk šablon víc.

A jak to funguje? Do _vimrc přibyla řádka

au BufEnter *.context source ~/vimfiles/template_context.vim

která ViMu říká, že při otevření souboru s příponou .context má provést, co najde v template_context.vim. Korektní by bylo tenhle soubor načíst při události BufNewFile, ale z nějakého důvodu to na Windows nefunguje (v linuxu ano). Kód v šabloně proto obsahuje pojistku, která zjistí, jestli načítaný soubor něco obsahuje – pokud ano, šablona se nevkládá. Do prázdného souboru se načte obsah template.context, který obsahuje samotnou šablonu. Funkce pro načtení šablony poté zavolá několik regulárních výrazů, které v načteném textu vymění vzorové řetězce za aktuální hodnoty (jméno souboru, datum, příp. další) a skočí na určený řádek. Obsah template_context.vim vypadá takhle

"" 
" vkladani sablony pro ConTeXt, 11. 3. 2009 dond

" fce pro nacteni obsahu sablony
function! TEMPLATE_on_new_context_file()
  if(&modifiable==0)
    return
  endif

  " kontrola, jestli editor otevira neprazdny soubor (do nej se sablona nenacita)
  if(line2byte(line("$")+1)>1)
    return
  endif

  " nacteme sablonu
  let template=expand("~/vimfiles/templates/template.context")
  exe "0r ".template

  " odstranime posledni prazdny radek, ktery vznikl :0r
  $d

  " nahradime retezce v sablone
  call TEMPLATE_replace()

  " skocime na zacatek textu
  1
  :18
endfunction

" fce pro vlozeni aktualnich informaci
function! TEMPLATE_replace()
  exe "%s/TEMPLATE_CREATION_DATE/".strftime("%d. %m. %Y")."/ge"
  exe "%s/TEMPLATE_FILE_NAME/".expand("%:t")."/ge"
  exe "%s/TEMPLATE_USERNAME/".$USERNAME."/ge"
endfunction

" nakonec zavolame pripravenou funkci
call TEMPLATE_on_new_context_file()

a šablona template.context obsahuje

%%%
% TEMPLATE_FILE_NAME
% 
% TEMPLATE_USERNAME TEMPLATE_CREATION_DATE

\setupoutput[pdftex]
\enableregime[utf]
\mainlanguage[cz]

\usetypescript[modern][ec]
\setupbodyfont[rm,12pt]
%\setuppagenumbering[location=]

\setuppapersize[A4][A4]
\setuplayout[backspace=2cm,header=0pt,footer=0pt,width=middle,topspace=2cm,height=middle,location=middle]

\starttext

\stoptext

% TEMPLATE_FILE_NAME
% vim: set enc=utf-8 : 

Nakonec to nebylo nic těžkého, líbí se mi (esteticky) způsob zjištění (ne)prázdnosti načítaného souboru v bufferu. Mám rád svůj oblíbený editor. :-)

« Vysavač je zlo & tipovací soutěž | Nahoru | Tipovací soutěž ještě jednou »