(require 'package)
(add-to-list 'package-archives '("gnu"   . "https://elpa.gnu.org/packages/"))
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(package-initialize)

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))
(eval-and-compile
  (setq use-package-always-ensure t
        use-package-expand-minimally t))

(use-package org
  :ensure org-plus-contrib)
(use-package ox-rss
  :after org)
(use-package htmlize
  :after org)
(use-package yaml-mode)
(use-package nix-mode)
(use-package plz)

(require 'org)
(require 'ox-html)
(require 'plz)

(defun my/org-publish-org-sitemap-format (entry style project)
  (cond ((not (directory-name-p entry))
         (format "(%s) [[file:blog/%s][%s]]\n"
                 (format-time-string "%Y-%m-%d"
                                     (org-publish-find-date entry project))
                 entry
                 (org-publish-find-title entry project)))))

(defun posts-rss-feed (title list)
  (concat
   "#+TITLE: " title "\n\n"
   (org-list-to-subtree list)))

(defun get-file-contents (filename)
  (with-temp-buffer
    (insert-file-contents filename)
    (buffer-string)))

(defun format-posts-rss-feed-entry (entry _style project)
  (let* (
         (title (org-publish-find-title entry project))
         (link (concat (file-name-sans-extension entry) ".html"))
         (file (org-publish--expand-file-name entry project))
         (pubdate (format-time-string (car org-time-stamp-formats)
                                      (org-publish-find-date entry project))))
    (message pubdate)
    (format "%s
:properties:
:rss_permalink: blog/%s
:pubdate: %s
:author: jjanzen
:end:\n%s"
            title
            link
            pubdate
            (get-file-contents file))))

(defun publish-posts-rss-feed (plist filename dir)
  (if (equal "rss.org" (file-name-nondirectory filename))
      (progn
        (message "publishing %s with plist %s and dir %s" filename plist dir)
        (org-rss-publish-to-rss plist filename dir))))

(defvar jj/html-head "\
<link rel='stylesheet' href='/css/stylesheet.css' type='text/css'/>\
<script src='/scripts/cssa-webring.js'></script>")
(defvar jj/html-preamble "\
<div class='topnav'>\
  <a href='/'>Home</a>\
  <a href='/projects.html'>Projects</a>\
  <a href='/blog'>Blog</a>\
  <a href='/dotfiles/'>Dotfiles</a>\
  <a href='/about.html'>About Me</a>\
  <a href='/rss.xml'>RSS</a>\
  <a target='_blank' href='https://git.jjanzen.ca/jjanzen/'>Git</a>\
</div>")
(defvar jj/html-postamble "\
<footer>\
  <aside id='cssa-webring-container' class='cssa-webring-container'></aside>\
  <section class='copyright-notice'>copyright © jjanzen 2024-2025</section>\
  <script src='/scripts/oneko.js'></script>\
</footer>")

(setq org-html-htmlize-output-type 'css)
(setq org-publish-project-alist
      `(
        ("org-core"
         :base-directory "~/website/"
         :base-extension "org"
         :publishing-directory "~/public_html/"
         :recursive t
         :publishing-function org-html-publish-to-html
         :with-toc nil
         :headline-levels 4
         :section-numbers nil
         :html-head ,jj/html-head
         :html-preamble ,jj/html-preamble
         :html-postamble ,jj/html-postamble)
        ("org-static-website"
         :base-directory "~/website/"
         :base-extension "txt\\|css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
         :publishing-directory "~/public_html"
         :recursive t
         :publishing-function org-publish-attachment)
        ("org-blog"
         :base-directory "~/blog/"
         :base-extension "org"
         :publishing-directory "~/public_html/blog"
         :recursive t
         :publishing-function org-html-publish-to-html
         :with-toc nil
         :with-properties t
         :with-date t
         :with-timestamps nil
         :headline-levels 4
         :section-numbers nil
         :html-head ,jj/html-head
         :html-preamble ,jj/html-preamble
         :html-postamble ,jj/html-postamble
         :auto-sitemap t
         :sitemap-filename "index.org"
         :sitemap-format-entry my/org-publish-org-sitemap-format
         :sitemap-sort-files anti-chronologically
         :sitemap-title "Blog")
        ("org-rss"
         :publishing-directory "~/public_html"
         :base-directory "~/blog/"
         :base-extension "org"
         :exclude "index.org"
         :publishing-function publish-posts-rss-feed
         :rss-extension "xml"
         :html-link-home "https://jjanzen.ca"
         :html-link-use-abs-url t
         :html-link-org-files-as-html t
         :auto-sitemap t
         :sitemap-function posts-rss-feed
         :sitemap-title "jjanzen's Blog"
         :sitemap-filename "rss.org"
         :sitemap-style list
         :sitemap-sort-files anti-chronologically
         :sitemap-format-entry format-posts-rss-feed-entry)
        ("org-config"
         :base-directory "~/dotfiles/"
         :base-extension "org"
         :html-head ,jj/html-head
         :html-preamble ,jj/html-preamble
         :html-postamble ,jj/html-postamble
         :html-wrap-src-lines t
         :with-toc nil
         :section-numbers nil
         :recursive t
         :publishing-directory "~/public_html/dotfiles"
         :publishing-function org-html-publish-to-html
         :headline-levels 4
         :auto-preamble t)
        ("org-static-config"
         :base-directory "~/.dotfiles/"
         :base-extension "txt\\|css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
         :publishing-directory "~/public_html/dotfiles"
         :recursive t
         :publishing-function org-publish-attachment)
        ("org" :components ("org-core" "org-static-website" "org-config" "org-blog" "org-rss"))))
(org-publish-all t)
