From 1fa7e85a581cd5d0ff715b2e6821524bfc46af84 Mon Sep 17 00:00:00 2001 From: Zaine Arch Date: Fri, 8 Aug 2025 18:27:52 +0100 Subject: [PATCH] Auto-publish on Fri 8 Aug 18:27:52 BST 2025 --- output/about.html | 349 +++++------------- output/assets/gr.png | Bin 0 -> 28047 bytes output/{ => assets}/script.js | 0 output/{ => assets}/style.css | 51 ++- output/blogs/2025/08/zettelkasten.html | 74 ++++ output/blogs/blogs-intro.html | 214 +---------- output/blogs/blogs-list.html | 219 ++--------- output/blogs/zettelkasten.html | 256 ------------- output/categories.html | 50 +++ output/contact.html | 213 +---------- output/index.html | 232 ++---------- output/posts.html | 219 ++--------- output/posts/posts-intro.html | 214 +---------- output/posts/posts-list.html | 217 +---------- output/setup.html | 478 +++++++++++-------------- output/sitemap.html | 65 ++++ output/tags/education.html | 49 +++ output/tags/introduction.html | 50 +++ 18 files changed, 752 insertions(+), 2198 deletions(-) create mode 100644 output/assets/gr.png rename output/{ => assets}/script.js (100%) rename output/{ => assets}/style.css (70%) create mode 100644 output/blogs/2025/08/zettelkasten.html delete mode 100644 output/blogs/zettelkasten.html create mode 100644 output/categories.html create mode 100644 output/sitemap.html create mode 100644 output/tags/education.html create mode 100644 output/tags/introduction.html diff --git a/output/about.html b/output/about.html index a35d157..062da79 100644 --- a/output/about.html +++ b/output/about.html @@ -3,208 +3,27 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + About Me - - - - - +
- -
Updated: 2025-08-07 Thu 17:59
+ + +
Updated: 2025-08-07 Thu 17:59

About Me

@@ -212,30 +31,30 @@

Table of Contents

-
-

About Me đź‘‹

-
+
+

1. About Me đź‘‹

+

I'm building a personal site using Emacs, Org-mode, and Cloudflare Pages.

@@ -245,9 +64,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl

-
-

Interests

-
+
+

2. Interests

+
  • Linux
  • Open source
  • @@ -256,9 +75,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

3. Interests

+
  • Linux
  • Open source
  • @@ -267,9 +86,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

4. Interests

+
  • Linux
  • Open source
  • @@ -278,9 +97,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

5. Interests

+
  • Linux
  • Open source
  • @@ -289,9 +108,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

6. Interests

+
  • Linux
  • Open source
  • @@ -300,9 +119,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

7. Interests

+
  • Linux
  • Open source
  • @@ -311,9 +130,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

8. Interests

+
  • Linux
  • Open source
  • @@ -322,9 +141,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

9. Interests

+
  • Linux
  • Open source
  • @@ -333,9 +152,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

10. Interests

+
  • Linux
  • Open source
  • @@ -344,9 +163,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

11. Interests

+
  • Linux
  • Open source
  • @@ -355,9 +174,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

12. Interests

+
  • Linux
  • Open source
  • @@ -366,9 +185,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

13. Interests

+
  • Linux
  • Open source
  • @@ -377,9 +196,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

14. Interests

+
  • Linux
  • Open source
  • @@ -388,9 +207,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

15. Interests

+
  • Linux
  • Open source
  • @@ -399,9 +218,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

16. Interests

+
  • Linux
  • Open source
  • @@ -410,9 +229,9 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Interests

-
+
+

17. Interests

+
  • Linux
  • Open source
  • @@ -421,8 +240,8 @@ I'm building a personal site using Emacs, Org-mode, and Cloudfl
-
-

Back to Home

+
+

18. Back to Home

diff --git a/output/assets/gr.png b/output/assets/gr.png new file mode 100644 index 0000000000000000000000000000000000000000..c8314b346b449100f6dceb8bcd8aad031a1253f5 GIT binary patch literal 28047 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 literal 0 HcmV?d00001 diff --git a/output/script.js b/output/assets/script.js similarity index 100% rename from output/script.js rename to output/assets/script.js diff --git a/output/style.css b/output/assets/style.css similarity index 70% rename from output/style.css rename to output/assets/style.css index f9f7184..3f35a07 100644 --- a/output/style.css +++ b/output/assets/style.css @@ -47,23 +47,51 @@ a:hover { color: var(--code-bg); } -/* Nav styling */ -nav { +.banner-header { + display: flex; + align-items: center; + justify-content: flex-start; + flex-wrap: wrap; /* allow items to wrap on small screens */ + background-color: var(--banner-bg, #fff); + padding: 0.5rem 1rem; border-radius: 6px; - margin-bottom: 1rem; +} + +.banner-logo { + height: 80px; + width: auto; + margin-right: 1.5rem; + border-radius: 50%; +} + +/* Keep nav horizontal on desktop */ +nav { + display: flex; + gap: 1rem; font-weight: 600; font-size: 1.1rem; } -nav a { - color: var(--link); - text-decoration: none; - font-weight: 600; +/* Mobile styles */ +@media (max-width: 600px) { + .banner-header { + flex-direction: column; /* stack logo + nav */ + align-items: center; + text-align: center; + } + + .banner-logo { + margin: 0 0 0.5rem 0; /* space under logo */ + } + + nav { + flex-wrap: wrap; /* allow nav links to wrap */ + justify-content: center; + gap: 0.5rem; + font-size: 1rem; /* slightly smaller text */ + } } -nav a:hover { - text-decoration: underline; -} /* Footer styling */ footer { @@ -123,3 +151,6 @@ pre.src { li { margin-bottom: 8px; } + + + diff --git a/output/blogs/2025/08/zettelkasten.html b/output/blogs/2025/08/zettelkasten.html new file mode 100644 index 0000000..cffbdbd --- /dev/null +++ b/output/blogs/2025/08/zettelkasten.html @@ -0,0 +1,74 @@ + + + + + + + +Zettelkasten Method + + + + + +
+ + +
Updated: 2025-08-08 Fri 18:17
+
+
+

Zettelkasten Method

+
+

The Zettelkasten Method

+
+

+This Zettelkasten method is growing in popularity for taking notes. Ever felt as though there's too much pieces of information but you don't know how to deal with it? This method solves exactly that problem and more. Think of it as forming a second brain, where you can jot down ideas and information whilst simultaneously being able to connect them together. +

+ +

+The official website describes in detail exactly what the Zettelkasten method is, providing use cases and benefits to this method. The part I wanted to highlighted in this is the following paragraph, where the author depicts how this concept would be explained to someone unfamiliar with it: +

+ +
+

+A Zettelkasten is a personal tool for thinking and writing. It has hypertextual features to make a web of thoughts possible. The difference to other systems is that you create a web of thoughts instead of notes of arbitrary size and form, and emphasize connection, not a collection. +

+
+ +

+This web of thoughts is exactly what makes it useful, it takes on the seemingly cluttered mess of information and is able to link the nodes together to create something meaningful and useful. +

+ +

+There are many personal knowledge management systems' (PKMS) out there that allow you to practice this method; the most common ones being Obsidian and Org Roam. After using Org Roam with Emacs for about a year or so, I realised how useful this method really is. A random idea can be jotted down and later connected to a bigger project or note system. The following picture below is a screenshot of a graph generated UI for all the nodes created in my Org Roam folder: +

+ + +
+

org-roam-ui-graph.png +

+
+
+
+
+
+
+ +
+Created with Emacs 30.1 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/blogs/blogs-intro.html b/output/blogs/blogs-intro.html index 0e44366..5c73db1 100644 --- a/output/blogs/blogs-intro.html +++ b/output/blogs/blogs-intro.html @@ -3,215 +3,33 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Blogs Introduction - - - - - +
- -
Updated: 2025-08-07 Thu 22:24
+ + +
Updated: 2025-08-08 Fri 17:31

Blogs Introduction

-
-

Introduction

-
+
+

Introduction

+

In this section you will find posts that are not as structured as the ones found in here. Mainly these will deal with findings, research, assorted writings and random bits and blobs.

diff --git a/output/blogs/blogs-list.html b/output/blogs/blogs-list.html index 008d309..5262a58 100644 --- a/output/blogs/blogs-list.html +++ b/output/blogs/blogs-list.html @@ -3,218 +3,39 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Blogs List - - - - - +
- -
Updated: 2025-08-07 Thu 22:36
+ + +
Updated: 2025-08-08 Fri 18:26

Blogs List

-
-

Posts:

-
+

+See the categories: Categories +

+
+

Blogs:

+
diff --git a/output/blogs/zettelkasten.html b/output/blogs/zettelkasten.html deleted file mode 100644 index 8dea7b5..0000000 --- a/output/blogs/zettelkasten.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - - -Zettelkasten Method - - - - - - - - -
- -
Updated: 2025-08-07 Thu 22:22
-
-
-

Zettelkasten Method

-
-

The Zettelkasten Method

-
-

-This Zettelkasten method is growing in popularity for taking notes. Ever felt as though there's too much pieces of information but you don't know how to deal with it? This method solves exactly that problem and more. Think of it as forming a second brain, where you can jot down ideas and information whilst simultaneously being able to connect them together. -

- -

-The official website describes in detail exactly what the Zettelkasten method is, providing use cases and benefits to this method. The part I wanted to highlighted in this is the following paragraph, where the author depicts how this concept would be explained to someone unfamiliar with it: -

- -
-

-A Zettelkasten is a personal tool for thinking and writing. It has hypertextual features to make a web of thoughts possible. The difference to other systems is that you create a web of thoughts instead of notes of arbitrary size and form, and emphasize connection, not a collection. -

-
- -

-This web of thoughts is exactly what makes it useful, it takes on the seemingly cluttered mess of information and is able to link the nodes together to create something meaningful and useful. -

- -

-There are many personal knowledge management systems' (PKMS) out there that allow you to practice this method; the most common ones being Obsidian and Org Roam. After using Org Roam with Emacs for about a year or so, I realised how useful this method really is. A random idea can be jotted down and later connected to a bigger project or note system. The following picture below is a screenshot of a graph generated UI for all the nodes created in my Org Roam folder: -

- - -
-

org-roam-ui-graph.png -

-
-
-
-
-
-
- -
-Created with Emacs 30.1 (Org mode 9.7.11) on Arch GNU/Linux -
-
-
- - diff --git a/output/categories.html b/output/categories.html new file mode 100644 index 0000000..ab9a372 --- /dev/null +++ b/output/categories.html @@ -0,0 +1,50 @@ + + + + + + + +Categories + + + + + +
+ + +
Updated: 2025-08-08 Fri 18:26
+
+
+
+

Categories (Includes both blogs and posts)

+
+ +
+
+
+
+
+ +
+Created with Emacs 30.1 (Org mode 9.7.11) on Arch GNU/Linux +
+
+
+ + diff --git a/output/contact.html b/output/contact.html index 735aa1e..9b79709 100644 --- a/output/contact.html +++ b/output/contact.html @@ -3,214 +3,33 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + Contact - - - - - +
- -
Updated: 2025-08-07 Thu 17:53
+ + +
Updated: 2025-08-07 Thu 17:53

Contact

-
-

Contact Using the Following:

-
+
+

Contact Using the Following:

+

> LinkedIn: LinkedIn

diff --git a/output/index.html b/output/index.html index 2afa56e..081c9d8 100644 --- a/output/index.html +++ b/output/index.html @@ -3,214 +3,32 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + -Zaine Qayyum +Home Page - - - - - +
- -
Updated: 2025-08-07 Thu 22:32
+ + +
Updated: 2025-08-08 Fri 16:09
-

Zaine Qayyum

-
-

Welcome! 🌱

-
+
+

Welcome! 🌱

+

This is a website built using Emacs Org-mode and published using org-publish.

@@ -224,12 +42,13 @@ Feel free to explore:
  • Posts Page
  • Blogs Page
  • Setup Page
  • +
  • Sitemap
  • -
    -

    How to publish web pages using org-publish

    -
    +
    +

    How to publish web pages using org-publish

    +

    This website is heavily inspired by some people who have decided to use org-publish as a way to convert org files into html. I came across a few that took the plunge and decided to migrate from platforms like Wordpress and instead opted for a more transparent, text-based workflow.

    @@ -246,6 +65,9 @@ So how does one go about publishing web pages through Emacs's org-publish< The first thing we will want to do is edit our init.el file, which is the initialization file. In this file we want to add the following:

    +

    +This is a simple and quick way of getting this setup, although there is a better and more scalable approach to this, where we have a build script that runs each time we want to generate the project. See here for more details. +

    @@ -320,9 +142,9 @@ And there we go! The files are now being hosted on http://localhost:8000/<
     

    -
    -

    Contact

    -
    +
    +

    Contact

    +

    Feel free to reach out on GitHub: https://github.com/zainezq

    diff --git a/output/posts.html b/output/posts.html index c1e634d..d616889 100644 --- a/output/posts.html +++ b/output/posts.html @@ -3,222 +3,43 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + Posts -
    - -
    Updated: 2025-08-06 Wed 21:03
    + + +
    Updated: 2025-08-06 Wed 21:03

    Posts

    -
    -

    Links

    -
    +
    +

    Links

    +
    -
    -

    Posts Introduction   intro

    +
    +

    Posts Introduction   intro

    -
    -

    Zettelkasten Method   education

    -
    +
    +

    Zettelkasten Method   education

    +

    <2025-08-06 Wed>

    diff --git a/output/posts/posts-intro.html b/output/posts/posts-intro.html index 862b7b0..1e1cf74 100644 --- a/output/posts/posts-intro.html +++ b/output/posts/posts-intro.html @@ -3,215 +3,33 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Posts Introduction - - - - - +
    - -
    Updated: 2025-08-07 Thu 21:58
    + + +
    Updated: 2025-08-07 Thu 21:58

    Posts Introduction

    -
    -

    Introduction

    -
    +
    +

    Introduction

    +

    In this section you will find posts related to both technical and non-technical topics. As Einstein said: “If you can’t explain it simply you don’t understand it well enough”, thus the goal with these posts is to develop the skill of being able to deliver habitual high quality explanations as well as reinforcing the topic(s) learnt.

    diff --git a/output/posts/posts-list.html b/output/posts/posts-list.html index c062a29..cf77548 100644 --- a/output/posts/posts-list.html +++ b/output/posts/posts-list.html @@ -3,215 +3,36 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Posts List - - - - - +
    - -
    Updated: 2025-08-07 Thu 22:36
    + + +
    Updated: 2025-08-08 Fri 18:26

    Posts List

    -
    -

    Posts:

    -
    +

    +See the categories: Categories +

    +
    +

    Posts:

    +
    diff --git a/output/setup.html b/output/setup.html index e78bf6a..35cc4ee 100644 --- a/output/setup.html +++ b/output/setup.html @@ -3,214 +3,33 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + Setup - - - - - +
    - -
    Updated: 2025-08-07 Thu 22:36
    + + +
    Updated: 2025-08-08 Fri 18:26

    Setup

    -
    -

    Introduction

    -
    +
    +

    Introduction

    +

    This page will highlight the build-script.el used to generate this website. This entire website is generated through org files using the command:

    @@ -221,45 +40,36 @@ This page will highlight the build-script.el used to generate this
    -
    -

    The script

    -
    +
    +

    The script

    +

    -The script is as follows, at the start I have commented out pieces of code (somewhat relevant to the script but never really used), followed by package management. Then there's the declaration of variables and functions and finally the org-publish-project-alist which handles nearly all of the project generation instructions. +The script is as follows, at the start I have some metadata relating to the file, followed by package management,then the declaration of variables/functions and finally the org-publish-project-alist which handles nearly all of the project generation instructions.

    -;; Commented out things:
    +;;; build-site.el --- Publish my website using org-publish -*- lexical-binding: t; -*-
     
    -;; (defvar z-head
    -;;   "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://gongzhitaao.org/orgcss/org.css\" />
    -;; <link rel=\"stylesheet\" href=\"/style.css\" />")
    +;; Author: Zaine Qayyum <zaineulabideen@outlook.com>
    +;; Created: 2025-08-08
    +;; Purpose: Build and publish my static site from Org files.
     
    -;; (setq org-html-validation-link nil
    -;;       org-html-head-include-scripts nil
    -;;       org-html-head-include-default-style nil
    -;;       org-html-head z-head)
    +;;; Commentary:
    +;; Run this file with:
    +;; emacs -Q --script build-site.el
     
    -;; (type-of (car '(rose violet daisy buttercup)))
    -;; (cadr (assoc "FILETAGS" (org-collect-keywords '("FILETAGS"))))
    +;;; Code:
     
    -;; (let ((list '(("post1.org") ("post2.org"))))
    -;;   (mapconcat (lambda (entry)
    -;;                (format "- [[file:%s]]" (car entry)))
    -;;              list
    -;;              "\n"))
    -
    -
    -
    -;;BEGIN:
    -;; Set the package installation directory so that packages aren't stored in the
    -;; ~/.emacs.d/elpa path.
    -(require 'package)
    +(require 'package)
     (setq package-user-dir (expand-file-name "./.packages"))
     (setq package-archives '(("melpa" . "https://melpa.org/packages/")
                              ("elpa" . "https://elpa.gnu.org/packages/")))
     
    +(require 'ox-publish)
    +(require 'cl-lib)
    +(require 'org)
    +
     ;; Initialize the package system
     (package-initialize)
     (unless package-archive-contents
    @@ -269,17 +79,25 @@ The script is as follows, at the start I have commented out pieces of code (some
     (package-install 'htmlize)
     
     ;; Load the publishing system
    -(require 'ox-publish)
    -(setq org-html-htmlize-output-type 'css)
    +(setq org-html-htmlize-output-type 'css)
    +(setq org-html-head-include-default-style nil)
    +
    +(defvar z-shared-head
    +      "
    +<link rel=\"stylesheet\" href=\"https://gongzhitaao.org/orgcss/org.css\" /> <link rel=\"stylesheet\" href=\"/assets/style.css\" /> <script src=\"/assets/script.js\" defer></script> ")
     
     (defvar z-preamble
    -  "<nav>
    -  <a href=\"/\">Home | </a>
    -  <a href=\"/posts/posts-list.html\">Posts | </a>
    -  <a href=\"/blogs/blogs-list.html\">Blogs | </a>
    -  <a href=\"/contact.html\">Contact</a>
    -</nav>
    -<div id=\"updated\">Updated: %C</div>"
    +  "
    +<div class=\"banner-header\">
    +  <a href=\"/\"> <img src=\"/assets/gr.png\" alt=\"Site Logo\" class=\"banner-logo\" /> </a>
    +  <nav>
    +    <a href=\"/\">Home | </a>
    +    <a href=\"/posts/posts-list.html\">Posts | </a>
    +    <a href=\"/blogs/blogs-list.html\">Blogs | </a>
    +    <a href=\"/contact.html\">Contact</a>
    +  </nav>
    +  </div>
    +  <div id=\"updated\">Updated: %C</div>"
     )
     
     (defvar z-postamble
    @@ -299,6 +117,7 @@ Created with %c on <a href=\"https://www.archlinux.org/\">Arch</a> &
       (concat
        "#+TITLE: " title "\n"
        "#+OPTIONS: toc:nil num:nil \n\n"
    +   "See the categories: @@html:<a href=\"../categories.html\">Categories</a>@@\n\n"
        "* Posts:\n"
        (mapconcat
         (lambda (entry)
    @@ -336,7 +155,8 @@ Created with %c on <a href=\"https://www.archlinux.org/\">Arch</a> &
       (concat
        "#+TITLE: " title "\n"
        "#+OPTIONS: toc:nil num:nil \n\n"
    -   "* Posts:\n"
    +   "See the categories: @@html:<a href=\"../categories.html\">Categories</a>@@\n\n"
    +   "* Blogs:\n"
        (mapconcat
         (lambda (entry)
           (let* ((link (car entry))
    @@ -368,9 +188,120 @@ Created with %c on <a href=\"https://www.archlinux.org/\">Arch</a> &
         "\n")))
     
     
    +
    +(defun z/categories-sitemap (title _list)
    +  "Generate a categories page by scanning tags across org-posts and org-blogs."
    +  (let* ((expanded (org-publish-expand-projects org-publish-project-alist))
    +         (posts    (assoc "org-posts" expanded))
    +         (blogs    (assoc "org-blogs" expanded))
    +         ;; DO NOT set :exclude to "" — it excludes everything
    +         (files (cl-remove-duplicates
    +                 (append (and posts (org-publish-get-base-files posts))
    +                         (and blogs (org-publish-get-base-files blogs)))
    +                 :test #'file-equal-p))
    +         ;; optional: drop the generated sitemaps
    +         (files (cl-remove-if
    +                 (lambda (f)
    +                   (member (file-name-nondirectory f)
    +                           '("posts-list.org" "blogs-list.org" "sitemap.org" "categories.org")))
    +                 files))
    +         (counts (make-hash-table :test 'equal)))
    +    ;;(message "files I will scan: %S" files)
    +    (dolist (f files)
    +      (when (file-readable-p f)
    +        (with-temp-buffer
    +          (insert-file-contents f)
    +          (org-mode)
    +          (let* ((kw (org-collect-keywords '("FILETAGS" "TAGS")))
    +                 (raw (car (or (cdr (assoc "FILETAGS" kw))
    +                               (cdr (assoc "TAGS" kw))))))
    +            (when raw
    +              (dolist (tag (split-string raw ":" t))
    +                (puthash tag (1+ (gethash tag counts 0)) counts)))))))
    +
    +    (let (tags)
    +      (maphash (lambda (k _) (push k tags)) counts)
    +      (setq tags (sort tags #'string-lessp))
    +      (concat
    +       "#+TITLE: " title "\n#+OPTIONS: toc:nil num:nil title:nil\n\n* Categories (Includes both blogs and posts)\n"
    +       (if tags
    +           (mapconcat
    +            (lambda (tag)
    +              (format "- [[file:tags/%s.org][@@html:<span class=\"post-tag\">%s</span>@@]] (%d)"
    +                      (z/tag-slug tag) tag (gethash tag counts))
    +              )
    +            tags
    +            "\n")
    +         "_No tags found yet._")))))
    +
    +
    +(defun z/tag-slug (s)
    +  "Turn a tag into a safe filename."
    +  (let ((down (downcase s)))
    +    (replace-regexp-in-string "[^a-z0-9]+" "-" down)))
    +
    +(defun z/collect-post-files ()
    +  "Return all .org files from org-posts and org-blogs."
    +  (let* ((expanded (org-publish-expand-projects org-publish-project-alist))
    +         (posts    (assoc "org-posts" expanded))
    +         (blogs    (assoc "org-blogs" expanded)))
    +    (cl-remove-duplicates
    +     (append (and posts (org-publish-get-base-files posts))
    +             (and blogs (org-publish-get-base-files blogs)))
    +     :test #'file-equal-p)))
    +
    +(defun z/gather-tag-index ()
    +  "Return hash: tag -> list of (FILE TITLE DATE-ISO)."
    +  (let ((idx (make-hash-table :test 'equal)))
    +    (dolist (f (z/collect-post-files))
    +      (when (and (string-match-p "\\.org\\'" f)
    +                 (file-readable-p f)
    +                 ;; ignore generated lists
    +                 (not (member (file-name-nondirectory f)
    +                              '("posts-list.org" "blogs-list.org" "sitemap.org" "categories.org"))))
    +        (with-temp-buffer
    +          (insert-file-contents f)
    +          (org-mode)
    +          (let* ((kw (org-collect-keywords '("TITLE" "FILETAGS" "TAGS" "DATE")))
    +                 (title (or (car (cdr (assoc "TITLE" kw)))
    +                            (file-name-base f)))
    +                 (date  (or (car (cdr (assoc "DATE" kw))) "")) ;; optional
    +                 (raw   (car (or (cdr (assoc "FILETAGS" kw))
    +                                 (cdr (assoc "TAGS" kw))))))
    +            (when raw
    +              (dolist (tag (split-string raw ":" t))
    +                (push (list f title date) (gethash tag idx))))))))
    +    idx))
    +
    +(defun z/write-tag-pages ()
    +  "Generate tags/*.org pages listing posts for each tag."
    +  (let* ((site-root (expand-file-name "~/master-folder/org_files/org_web/"))
    +         (tags-dir  (expand-file-name "tags" site-root)))
    +    (unless (file-directory-p tags-dir)
    +      (make-directory tags-dir t))
    +    (let ((idx (z/gather-tag-index)))
    +      (maphash
    +       (lambda (tag items)
    +         (let* ((slug (z/tag-slug tag))
    +                (outfile (expand-file-name (format "%s.org" slug) tags-dir)))
    +           (with-temp-file outfile
    +             (insert (format "#+TITLE: Tag: %s\n#+OPTIONS: toc:nil num:nil title:nil \n\n* Posts tagged %s\n"
    +                             tag tag))
    +             ;; sort newest first if DATE present
    +             (setq items (sort items (lambda (a b) (string> (nth 2 a) (nth 2 b)))))
    +             (dolist (it items)
    +               (let* ((file (nth 0 it))
    +                      (title (nth 1 it))
    +                      (rel   (file-relative-name file tags-dir)))
    +                 ;; link to the source .org; org-publish will rewrite to the .html
    +                 (insert (format "- [[file:%s][%s]]\n" rel title)))))))
    +       idx)
    +      )))
    +
    +
     ;; Define the publishing project
     (setq org-publish-project-alist
    -      `(("org-notes"
    +      `(("org-main"
              :recursive t
              :base-directory "~/master-folder/org_files/org_web/"
              :publishing-function org-html-publish-to-html
    @@ -381,17 +312,27 @@ Created with %c on <a href=\"https://www.archlinux.org/\">Arch</a> &
              :base-extension "org"
              :section-numbers nil
              :time-stamp-file nil
    +         :auto-sitemap t
    +         :sitemap-filename "sitemap.org"
    +         :sitemap-title "Sitemap"
    +         :sitemap-sort-files chronologically
              :html-preamble ,z-preamble
              :html-postamble ,z-postamble
    -         :html-head "
    -<link rel=\"stylesheet\" type=\"text/css\" href=\"https://gongzhitaao.org/orgcss/org.css\" />
    -<link rel=\"stylesheet\" href=\"style.css\" />
    -<script src=\"script.js\" defer></script>
    -"
    -        )
    +         :html-head ,z-shared-head)
    +        ("org-categories-sitemap"
    +         :recursive t
    +         :base-directory "~/master-folder/org_files/org_web/"
    +         :publishing-directory "~/master-folder/org_files/org_web/output"
    +         :base-extension "org"
    +         :auto-sitemap t
    +         :sitemap-filename "categories.org"
    +         :sitemap-title "Categories"
    +         :sitemap-function z/categories-sitemap
    +         :html-preamble ,z-preamble
    +         :html-postamble ,z-postamble
    +         :html-head ,z-shared-head)
             ("org-posts"
              :base-directory "~/master-folder/org_files/org_web/posts"
    -         :base-extension "org"
              :publishing-directory "~/master-folder/org_files/org_web/output/posts/"
              :recursive t
              :base-extension "org"
    @@ -408,15 +349,9 @@ Created with %c on <a href=\"https://www.archlinux.org/\">Arch</a> &
              :sitemap-title "Posts List"
              :sitemap-style list
              :sitemap-function z/posts-sitemap
    -         :html-head "
    -<link rel=\"stylesheet\" type=\"text/css\" href=\"https://gongzhitaao.org/orgcss/org.css\" />
    -<link rel=\"stylesheet\" href=\"../style.css\" />
    -<script src=\"../script.js\" defer></script>
    -"
    -         )
    +         :html-head ,z-shared-head)
             ("org-blogs"
              :base-directory "~/master-folder/org_files/org_web/blogs"
    -         :base-extension "org"
              :publishing-directory "~/master-folder/org_files/org_web/output/blogs/"
              :recursive t
              :base-extension "org"
    @@ -424,8 +359,6 @@ Created with %c on <a href=\"https://www.archlinux.org/\">Arch</a> &
              :with-author nil
              :with-creator nil
              :html-validation-link nil
    -         :with-toc t
    -         :section-numbers t
              :html-preamble ,z-preamble
              :html-postamble ,z-postamble
              :auto-sitemap t
    @@ -433,46 +366,45 @@ Created with %c on <a href=\"https://www.archlinux.org/\">Arch</a> &
              :sitemap-title "Blogs List"
              :sitemap-style list
              :sitemap-function z/blogs-sitemap
    -         :html-head "
    -<link rel=\"stylesheet\" type=\"text/css\" href=\"https://gongzhitaao.org/orgcss/org.css\" />
    -<link rel=\"stylesheet\" href=\"../style.css\" />
    -<script src=\"../script.js\" defer></script>
    -"
    -         )
    -
    -
    +         :html-head ,z-shared-head)
    +        ("org-tags"
    +         :base-directory "~/master-folder/org_files/org_web/tags"
    +         :publishing-directory "~/master-folder/org_files/org_web/output/tags"
    +         :recursive t
    +         :base-extension "org"
    +         :publishing-function org-html-publish-to-html
    +         :with-author nil
    +         :with-creator nil
    +         :html-preamble ,z-preamble
    +         :html-postamble ,z-postamble
    +         :html-head ,z-shared-head)
             ("org-assets"
              :base-directory "~/master-folder/org_files/org_web/assets/"
              :base-extension "css\\|js\\|png\\|jpg\\|gif\\|svg\\|pdf\\|woff\\|woff2\\|ttf"
              :publishing-directory "~/master-folder/org_files/org_web/output/assets/"
              :recursive t
              :publishing-function org-publish-attachment)
    -        ("org-static"
    -         :base-directory "~/master-folder/org_files/org_web/"
    -         :base-extension "css\\|js"
    -         :publishing-directory "~/master-folder/org_files/org_web/output"
    -         :recursive t
    -         :publishing-function org-publish-attachment)
    +        ))
     
    -        ("website"
    -         :components ("org-notes" "org-assets" "org-posts" "org-blogs" "org-static"))))
    -
    -;; Delete the output before generating the new one
    -(delete-directory "~/master-folder/org_files/org_web/output/" t)
    +(delete-directory "~/master-folder/org_files/org_web/output/" t)
    +(delete-directory "~/master-folder/org_files/org_web/tags/" t)
     (message "Directory deleted")
     
     ;; Generate the site output
    -(org-publish-all t)
    +(z/write-tag-pages)
    +(org-publish-all t)
     
     (message "Build complete!")
     
    +;;; build-site.el ends here
    +
     
    -
    -

    Publish Script

    -
    +
    +

    Publish Script

    +

    As the project is hosted on Github, I have created a small script that is able to push changes to the remote repository, which Cloudflare will automatically detect and rebuild the website:

    diff --git a/output/sitemap.html b/output/sitemap.html new file mode 100644 index 0000000..24e394e --- /dev/null +++ b/output/sitemap.html @@ -0,0 +1,65 @@ + + + + + + + +Sitemap + + + + + +
    + + +
    Updated: 2025-08-08 Fri 18:26
    +
    + +
    +
    + +
    +Created with Emacs 30.1 (Org mode 9.7.11) on Arch GNU/Linux +
    +
    +
    + + diff --git a/output/tags/education.html b/output/tags/education.html new file mode 100644 index 0000000..812d977 --- /dev/null +++ b/output/tags/education.html @@ -0,0 +1,49 @@ + + + + + + + +Tag: education + + + + + +
    + + +
    Updated: 2025-08-08 Fri 18:26
    +
    +
    +
    +

    Posts tagged education

    + +
    +
    +
    +
    + +
    +Created with Emacs 30.1 (Org mode 9.7.11) on Arch GNU/Linux +
    +
    +
    + + diff --git a/output/tags/introduction.html b/output/tags/introduction.html new file mode 100644 index 0000000..74e7e94 --- /dev/null +++ b/output/tags/introduction.html @@ -0,0 +1,50 @@ + + + + + + + +Tag: introduction + + + + + +
    + + +
    Updated: 2025-08-08 Fri 18:26
    +
    +
    +
    +

    Posts tagged introduction

    + +
    +
    +
    + +
    + +