B. ZH eredmények listaállományának elkészítése

ssec:zh-adm. szakaszban ismertettem a ZH eredmények offline adminisztrálásának egy lehetséges módját. Ugyanitt megemlítettem egy programot, amely az ehhez szükséges állomány előállításához nyújt segítséget. Ebben a függelékben ezt mutatom be.

A ,,program'' a Unixos világban ismert GNU Emacs szövegszerkesztő ELisp programozási nyelvén készült, amely a LISP egy nyelvjárása. Azért írtam a program szót idézőjelben, mert az Emacs-hoz jár egy forms névre hallgató csomag, amely segítségével kevés programozás árán egyszerű szöveges űrlapokat lehet létrehozni. Az ilyen űrlapok adataikat egy szöveges adatbázisból veszik és oda is írják vissza. Az adatállomány formátuma ugyan rögzített, de definiálhatók beolvasó- és kiíró-filterek, amelyekkel tetszőleges formátumú állomány kezelhetővé tehető. Az űrlap létrehozásához egy rövid ELisp programot kell írni, amely beállítja a paramétereket és definiál bizonyos függvényeket.

A rövid ismertető után következzék a ZH eredmények beírásához készített program forrása.

(defun zhform-grep (file str)
  (= 0 (call-process "grep" file nil nil str)))

(setq forms-file (read-file-name "Az adatállomány neve: ")
      zhform-languages '(("prolog" . pl)
                         ("sml" . ml))
      zhform-lang (or
                   (and (zhform-grep forms-file "pl") 'pl)
                   (and (zhform-grep forms-file "ml") 'ml)
                   (cdr (assoc (completing-read
                                "Új állomány! A javított nyelv: "
                                zhform-languages nil t)
                               zhform-languages))
                   'pl)
      zhform-firstex (cdr (assoc zhform-lang '((pl . 1) (ml . 6)))))

(setq forms-number-of-fields
      (forms-enumerate
       '(neptun                   ; 1
         p1                       ; 2
         p2                       ; 3
         p3                       ; 4
         p4                       ; 5
         p5)))                    ; 6


(defun zhform-read-filter ()
  (beginning-of-buffer)
  (while (re-search-forward (format"^%s('\\(.*\\)', \\[\\(.*\\),\\(.*\\),\
\\(.*\\),\\(.*\\),\\(.*\\)\\])\\.$" zhform-lang) nil t)
    (replace-match "\\1\t\\2\t\\3\t\\4\t\\5\t\\6" t)))

(defun zhform-write-filter ()
  (beginning-of-buffer)
  (while (re-search-forward "^\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\
\\(.*\\)\t\\(.*\\)$" nil t)
    (replace-match (format "%s('\\1', [\\2,\\3,\\4,\\5,\\6])."
                           zhform-lang) t)))

(defun zhform-new-record (record)
  (aset record neptun "??????")
  (aset record p1 "-")
  (aset record p2 "-")
  (aset record p3 "-")
  (aset record p4 "-")
  (aset record p5 "-")
  record)

(setq forms-read-file-filter  'zhform-read-filter
      forms-write-file-filter 'zhform-write-filter
      forms-new-record-filter 'zhform-new-record)

(setq forms-format-list 
      (list
       "=================== ZH eredmények ===================\n\n"
       "PgUp:    előző rekord       PgDn:    következő rekord\n"
       "C-c <:   első rekord        C-c >:   utolsó rekord\n"
       "C-c C-o: rekord beszúrása   C-c C-d: rekord törlése\n"
       "S-TAB:   előző mező         TAB:     következő mező\n"
       "C-c C-x: kilépés            C-h m:   segítség\n\n"
       "=====================================================\n\n"
       "   Neptun kód: " neptun "\n"
       (format "  %2d. feladat: " zhform-firstex)       p1 "\n"
       (format "  %2d. feladat: " (+ zhform-firstex 1)) p2 "\n"
       (format "  %2d. feladat: " (+ zhform-firstex 2)) p3 "\n"
       (format "  %2d. feladat: " (+ zhform-firstex 3)) p4 "\n"
       (format "  %2d. feladat: " (+ zhform-firstex 4)) p5))

(setq forms-read-only nil
      forms-forms-scroll t        ; pgup/pgdn = next/prev record
      forms-forms-jump t          ; home/end = first/last record
      forms-insert-after t)       ; always insert *after* current record

Ezt töltsük be az Emacs szövegszerkesztőbe és adjuk ki a M-x forms-mode parancsot. Ekkor a program megkérdezi a szerkeszteni kívánt adatállomány nevét. Ha ilyen állomány létezik, felismeri, hogy abban a ZH melyik fele van pontozva (Prolog: 1-5 feladat, vagy SML: 6-10 feladat). Ha az állomány még nem létezik bekéri a nyelv nevét. Végül megjelenik az űrlap, amellyel kényelmesen feltölthetjük az ,,adatbázist''.

Hanák Dávid <dhanak@inf.bme.hu>