(defun szotar-span-accent (word)
  "Replaces every occurence of .\" with an accent span."
  (let ((match (string-match ".\"" word)))
    (if match
        (concat (substring word 0 match)
                "<span class=\"accent\">"
                (substring word match (1+ match))
                "</span>"
                (szotar-span-accent (substring word (+ match 2))))
      word)))

(defun szotar-next-line ()
  "Takes the next line and prints its HTML representation."
  (if (re-search-forward "^\\(.*\\) = \\(.*\\)$" (point-max) t)
      (let* ((definition (match-string 2))
             (russian (szotar-span-accent (match-string 1))))
        (princ (concat "<p>\n"
                       "<span class=\"russian\">" russian "</span>\n"
                       "<span class=\"definition\">" definition "</span>\n"
                       "</p>\n"))
        t)
      nil))

(defun szotar-htmlize ()
  "Generates a CSS-driven HTML file from the current buffer.
The buffer is assumed to be in UTF-8 encoding."
  (interactive)
  (with-output-to-temp-buffer (concat (buffer-name (current-buffer)) ".html")
    (princ (concat "<html>\n"
                   "<head>\n"
                   "<title>" (buffer-name (current-buffer)) "</title>\n"
                   "<link rel=\"stylesheet\" type=\"text/css\""
                   " href=\"szotar.css\" media=\"all\" />\n"
                   "</head>\n"
                   "<meta http-equiv=\"Content-Type\""
                   " content=\"text/html;charset=utf-8\" />\n"
                   "<body>\n"))
    (save-excursion
      (goto-char (point-min))
      (while (szotar-next-line)))
    (princ "</body>\n</html>")))