;; Elisp source code header -*- coding: utf-8 -*-
;; Created: [22-55:36 Май 19 2008]
;; Modified: [23-45:37 Май 31 2008]
;; Description:
;;  The idea of using muse as a site backend and some code was taken from Alex Ott
;; Author: Stanislav M. Ivankin
;; Email: stas@concat.info
;; Tags: muse, emacs, elisp
;; License: 

(require 'muse)
(require 'muse-mode)
(require 'muse-publish)
(require 'muse-html)
(require 'muse-project)
(require 'muse-colors)
(require 'muse-wiki)

(defvar concat.info-muse-menu '(("index.html" . "Главная")
                                ("emacs/" . "Дот файлы emacs и прочее")
                                ("about/" . "Резюме")
                                ("about/more-about.html" . "Немного за жисть")
                                ("literature/" . "Литература"))
  "Site main menu")

(defvar my-muse-publish-files '("/home/esgal/emacs/emacs-rc/www-stuff.el"
                                "/home/esgal/emacs/emacs-rc/helpers.el"
                                "/home/esgal/emacs/emacs-rc/devel.el"
                                "/home/esgal/emacs/emacs-rc/features.el"
                                "/home/esgal/emacs/emacs-rc/my-muse.el"
                                "/home/esgal/emacs/emacs-rc/mytramp.el"
                                "/home/esgal/.gnus"
                                "/home/esgal/.emacs")
  "Files to publish with muse project")

(defvar my-muse-protected-files '("/home/esgal/emacs/emacs-rc/www-stuff.el"
                                  "/home/esgal/emacs/emacs-rc/features.el"
                                  "/home/esgal/.gnus")
  "Files that needs to be edited before publishing")

(defun my-muse-mode-hook ()
  (setq auto-fill-mode t)
  (footnote-mode 1))

(defun set-rel-path ()
  (file-name-directory (muse-wiki-resolve-project-page (muse-project))))

(defun my-muse-prepare-els ()
  "Prepare el files to publish with concat.info muse project,
if files has some private data, clean it first by hand"
  (interactive)
  (dolist (file my-muse-publish-files)
    (if (find-in-lst my-muse-protected-files file)
        (let ((buf (generate-new-buffer (concat "concat.info->" file))))
          (switch-to-buffer buf)
          (emacs-lisp-mode)
          (insert-file-contents file nil))
      (let ((pos (position ?/ file :from-end t))
            (fname))
        (if pos
            (setq fname (subseq file (1+ pos) (length file)))
          (setq fname file))
        (htmlize-file file (concat (set-rel-path) "emacs/" fname ".html"))))))

(defun generate-concat.info-menu ()
  (let* ((current-muse-file (muse-current-file))
         (link-path (replace-regexp-in-string "\\.muse" ".html" current-muse-file))
         (dir (if (> (length (file-name-directory (muse-wiki-resolve-project-page (muse-project)))) 2)
                  "../"
                "")))
    (apply #'concat
           (mapcar #'(lambda (x) (concat "<li><a href=\"" dir (car x) "\">" (cdr x) "</a></li>"))
                   concat.info-muse-menu))))

(add-to-list 'auto-mode-alist '("\\.muse$" . muse-mode))
(custom-set-variables
 '(muse-html-encoding-default (quote utf-8))
 '(muse-html-meta-content-encoding (quote utf-8))
 '(muse-html-charset-default "utf-8")
 '(muse-file-extension "muse")
 '(muse-mode-auto-p nil)
 '(muse-wiki-allow-nonexistent-wikiword nil)
 '(muse-wiki-use-wikiword nil)
 '(muse-ignored-extensions (quote ("bz2" "gz" "[Zz]" "rej" "orig" "png" "hgignore" "gif"
                                   "css" "jpg" "html" "sh" "lftp" "pdf"))))

(add-hook 'muse-mode-hook 'my-muse-mode-hook)

(muse-derive-style "concat-info-muse-html" "html"
                   :header "~/Projects/concat.info/muse/header.tmpl"
                   :footer "~/Projects/concat.info/muse/footer.tmpl")

(setq muse-project-alist `(("muse-concat-info"
                            (,@(muse-project-alist-dirs  "~/Projects/concat.info/muse/") :default "index")
                            ,@(muse-project-alist-styles "~/Projects/concat.info/muse/"
                                                         "~/Projects/concat.info/muse/"
                                                         "concat-info-muse-html"))))

(defun muse-mp-generate-menu ()
  (let* ((menu-lang (muse-mp-detect-language))
         (menu-struct (assoc menu-lang my-page-menu))
         (menu-string "")
         (rel-dir (file-name-directory (muse-wiki-resolve-project-page (muse-project))))
         (rel-path (if (> (length rel-dir) 2)   (substring rel-dir 3) ""))
         (cur-path-muse (muse-current-file))
         (cur-path-html (replace-regexp-in-string "\\.muse" ".html" cur-path-muse))
         )
      (when menu-struct
        (let ((menu-list (if (not (null menu-struct)) (cdr menu-struct))))
          (setq menu-string
                (concat "<ul class=\"avmenu\">"
                        (apply #'concat
                               (mapcar
                                (lambda (x)
                                  (concat "<li><a href=\"" rel-path (car x)
                                          (if (string-match (concat "/" menu-lang "/" (car x))
                                                            cur-path-html)
                                              "\" class=\"current\""
                                            "\"")
                                          ">" (cdr x) "</a></li>"))
                                menu-list))
                        "</ul>"))))
      menu-string))