From fb818d9b0a58d342c26c79f4983f02345fb23df5 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Sun, 16 Apr 2023 18:10:35 +0300 Subject: [PATCH] Support building the site interactively --- .gitignore | 3 + assets/style.css | 230 -------- esy-publish.el | 515 ++++++++++++++++++ org/index.org | 136 ----- org/posts/2023-04-01-take-on-recursion.org | 111 ---- org/posts/index.org | 6 - publish.el | 278 ---------- {src => source}/changelog.org | 0 {src => source}/esy.org | 0 {assets => source}/favicon.ico | Bin {assets => source}/home.svg | 0 {src => source}/index.org | 0 {assets => source}/mail.svg | 0 {assets => source}/mastodon.svg | 0 source/notes/emacs.org | 17 + source/notes/gnu.org | 14 + source/notes/index.org | 6 + .../posts/2023-04-01-take-on-recursion.org | 0 ...23-04-05-the-self-healing-code-fallacy.org | 0 ...-shell-scripts-executable-just-in-time.org | 0 ...-optimizing-project-selection-in-emacs.org | 0 {src => source}/posts/index.org | 0 {org => source}/pub.org | 0 {assets => source}/rss.svg | 0 {src => source}/style.css | 0 {org => source}/sweep.org | 0 src/favicon.ico | Bin 4286 -> 0 bytes src/home.svg | 25 - src/mail.svg | 1 - src/mastodon.svg | 1 - src/pub.org | 9 - src/rss.svg | 1 - src/sweep.org | 1 - 33 files changed, 555 insertions(+), 799 deletions(-) delete mode 100644 assets/style.css create mode 100644 esy-publish.el delete mode 100644 org/index.org delete mode 100644 org/posts/2023-04-01-take-on-recursion.org delete mode 100644 org/posts/index.org delete mode 100644 publish.el rename {src => source}/changelog.org (100%) rename {src => source}/esy.org (100%) rename {assets => source}/favicon.ico (100%) rename {assets => source}/home.svg (100%) rename {src => source}/index.org (100%) rename {assets => source}/mail.svg (100%) rename {assets => source}/mastodon.svg (100%) create mode 100644 source/notes/emacs.org create mode 100644 source/notes/gnu.org create mode 100644 source/notes/index.org rename {src => source}/posts/2023-04-01-take-on-recursion.org (100%) rename {src => source}/posts/2023-04-05-the-self-healing-code-fallacy.org (100%) rename {src => source}/posts/2023-04-08-making-shell-scripts-executable-just-in-time.org (100%) rename {src => source}/posts/2023-04-11-optimizing-project-selection-in-emacs.org (100%) rename {src => source}/posts/index.org (100%) rename {org => source}/pub.org (100%) rename {assets => source}/rss.svg (100%) rename {src => source}/style.css (100%) rename {org => source}/sweep.org (100%) delete mode 100644 src/favicon.ico delete mode 100644 src/home.svg delete mode 100644 src/mail.svg delete mode 100644 src/mastodon.svg delete mode 100644 src/pub.org delete mode 100644 src/rss.svg delete mode 120000 src/sweep.org diff --git a/.gitignore b/.gitignore index c4ea624..f95f262 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ /src/theindex.inc /draft/ /html.bk.bk/ +/source/sitemap.org +/source/theindex.inc +/source/theindex.org diff --git a/assets/style.css b/assets/style.css deleted file mode 100644 index ab2cabd..0000000 --- a/assets/style.css +++ /dev/null @@ -1,230 +0,0 @@ -body { - color: #cfdfd5; - background-color: #111111; - margin-left: auto; - margin-right: auto; - width: 90%; - max-width: 90ch; - /* font-size: 1.1em; */ - font-family: "Helvetica Neue", sans-serif; -} - -a:link { - color: #00c089; -} - -a:visited { - color: #5dc0aa; -} - -time { - color: #9ac8e0; -} - -.home-link { - float: left; -} - -.other-links { - float: right; -} - -footer { - font-size: smaller; - text-align: center; -} - -.icon-links { - height: 40px; - text-decoration: none; -} - -blockquote { - border-left-style: solid; - padding-left: 1em; -} - -dt { - font-weight: bold; -} - -pre { - overflow: auto; - border-top-style: solid; - border-top-width: 2px; - border-left-style: solid; - border-left-width: 2px; - border-right-style: solid; - border-right-width: 1px; - border-bottom-style: solid; - border-bottom-width: 1px; - padding: 0.8em; - background-color: #222522; -} - -.footpara { - display: inline; -} - -code { - color: #78afff; - font-family: Hack,monospace; -} - -h2 { - color: #7fc500; -} -h3 { - color: #5dc0aa; -} -h4 { - color: #af9fff; -} -h5 { - color: #7fcfdf; -} -h6 { - color: #cfc04f; -} - -/* -Generated with `M-x org-html-htmlize-generate-css` after loading the -`ef-bio` theme by Protesilaos Stavrou. -*/ -.org-builtin { - /* font-lock-builtin-face */ - color: #3fb83f; - font-weight: bold; -} -.org-comment { - /* font-lock-comment-face */ - color: #b7a07f; - font-style: italic; -} -.org-comment-delimiter { - /* font-lock-comment-delimiter-face */ - color: #b7a07f; - font-style: italic; -} -.org-constant { - /* font-lock-constant-face */ - color: #37aff6; -} -.org-doc { - /* font-lock-doc-face */ - color: #7fc07f; - font-style: italic; -} -.org-doc-markup { - /* font-lock-doc-markup-face */ - color: #37aff6; -} -.org-escape { - /* font-lock-escape-face */ - color: #cfc04f; -} -.org-function-call { - /* font-lock-function-call-face */ - color: #7fc500; -} -.org-function-name { - /* font-lock-function-name-face */ - color: #7fc500; -} -.org-preprocessor { - /* font-lock-preprocessor-face */ - color: #3fb83f; -} -.org-property-name { - /* font-lock-property-name-face */ - color: #78afff; -} -.org-property-use { - /* font-lock-property-use-face */ - color: #78afff; -} -.org-rainbow-delimiters-depth-1 { - /* rainbow-delimiters-depth-1-face */ - color: #00c089; -} -.org-rainbow-delimiters-depth-2 { - /* rainbow-delimiters-depth-2-face */ - color: #7fc500; -} -.org-rainbow-delimiters-depth-3 { - /* rainbow-delimiters-depth-3-face */ - color: #5dc0aa; -} -.org-rainbow-delimiters-depth-4 { - /* rainbow-delimiters-depth-4-face */ - color: #af9fff; -} -.org-rainbow-delimiters-depth-5 { - /* rainbow-delimiters-depth-5-face */ - color: #7fcfdf; -} -.org-rainbow-delimiters-depth-6 { - /* rainbow-delimiters-depth-6-face */ - color: #cfc04f; -} -.org-rainbow-delimiters-depth-7 { - /* rainbow-delimiters-depth-7-face */ - color: #37aff6; -} -.org-rainbow-delimiters-depth-8 { - /* rainbow-delimiters-depth-8-face */ - color: #6fc5ef; -} -.org-rainbow-delimiters-depth-9 { - /* rainbow-delimiters-depth-9-face */ - color: #d38faf; -} -.org-rainbow-delimiters-mismatched { - /* rainbow-delimiters-mismatched-face */ - color: #ffffff; - background-color: #bd1f30; -} -.org-string { - /* font-lock-string-face */ - color: #af9fff; -} -.org-type { - /* font-lock-type-face */ - color: #7fcfdf; -} -.org-variable-name { - /* font-lock-variable-name-face */ - color: #78afff; -} -.org-variable-use { - /* font-lock-variable-use-face */ - color: #78afff; -} -.org-warning-1 { - /* font-lock-warning-face */ - color: #cfc04f; -} -.org-negation-char { - /* font-lock-negation-char-face */ - font-weight: bold; -} -.org-regexp { - /* font-lock-regexp-face */ - color: #af9fff; -} -.org-regexp-grouping-backslash { - /* font-lock-regexp-grouping-backslash */ - color: #cfc04f; -} -.org-regexp-grouping-construct { - /* font-lock-regexp-grouping-construct */ - color: #3fb83f; -} - -.timestamp { - color: #5dc0aa; -} - -.subtitle { - font-style: italic; -} diff --git a/esy-publish.el b/esy-publish.el new file mode 100644 index 0000000..02b0451 --- /dev/null +++ b/esy-publish.el @@ -0,0 +1,515 @@ +;;; esy-publish.el --- Simple Static Site Generator -*- lexical-binding:t -*- + +;; Copyright (C) 2023 Eshel Yaron + +;; Author: Eshel Yaron +;; Maintainer: Eshel Yaron +;; Keywords: languages extensions +;; URL: http://git.eshelyaron.com/gitweb/?p=esy-publish.git +;; Package-Version: 0.4.0 +;; Package-Requires: ((emacs "28.2")) + +;; This file is NOT part of GNU Emacs. + +;;; Commentary: + +;; Build a static websites from Org files + +;;; Code: + +(require 'org) +(require 'ox-publish) +(require 'ox-html) +(require 'org-transclusion) +(require 'dom) +(require 'xref) +(require 'htmlize) +(require 'rainbow-delimiters) + +(defvar esy-publish-did-setup-p nil) + +(defvar esy-publish-elisp-directory + (file-name-as-directory (file-name-directory (expand-file-name load-file-name)))) + +(defvar esy-publish-root-directory esy-publish-elisp-directory) + +(defvar esy-publish-drafts-directory + (file-name-as-directory (expand-file-name "drafts" + esy-publish-root-directory))) + +(defvar esy-publish-source-directory + (file-name-as-directory (expand-file-name "source" + esy-publish-root-directory))) + +(defvar esy-publish-notes-source-directory + (file-name-as-directory (expand-file-name "notes" + esy-publish-source-directory))) + +(defvar esy-publish-posts-source-directory + (file-name-as-directory (expand-file-name "posts" + esy-publish-source-directory))) + +(defvar esy-publish-remote-directory + "/rsync:root@direct.eshelyaron.com:/var/www/html") + +(defvar esy-publish-local-directory + (file-name-as-directory (expand-file-name "local" + esy-publish-root-directory))) + +(defvar esy-publish-local-posts-directory + (file-name-as-directory (expand-file-name "posts" + esy-publish-local-directory))) + +(defvar esy-publish-keywords '("emacs" + "prolog" + "language" + "politics" + "ai" + "lisp")) + +(defvar esy-publish-notes-completion-history nil) + +(defconst esy-publish-post-metadata-line + (concat "\n" + "@@html:" "
" "@@" + "Created on [{{{date}}}], " + "last updated [{{{modification-time(%Y-%m-%d, t)}}}]" + "@@html:" "
" "@@")) + +(defun esy-publish--title-to-file-base-name (title) + (downcase (string-join (string-split title (rx (+ (not alnum))) t) + "-"))) +(defun esy-publish--dom-to-string (&rest doms) + (with-temp-buffer + (mapc #'dom-print doms) + (buffer-string))) + +(defun esy-publish--file-url (file) + (concat + "https://eshelyaron.com/" + (let ((path (file-relative-name file esy-publish-local-directory))) + (if (string= (file-name-base file) "index") + (file-name-directory path) + path)))) + +;;;###autoload +(defun esy-publish-create-post (title subtitle description keywords) + (interactive (list (read-string "Post title: ") + (read-string "Post subtitle: ") + (read-string "Post description: ") + (completing-read-multiple "Post keywords: " esy-publish-keywords))) + (esy-publish-setup) + (let* ((date (format-time-string "%F")) + (base (concat date "-" (esy-publish--title-to-file-base-name title))) + (file (expand-file-name (file-name-with-extension base "org") + esy-publish-drafts-directory))) + (if (file-exists-p file) + (error "Post already exists!") + (find-file file) + (insert + "#+TITLE: " title "\n" + "#+SUBTITLE: " subtitle "\n" + "#+DESCRIPTION: " description "\n" + "#+KEYWORDS: " (string-join keywords ",") "\n" + "#+DATE: " date "\n" + esy-publish-post-metadata-line "\n") + (set-buffer-modified-p nil)))) + +(defun org-dblock-write:posts (params) + (let* ((dir (plist-get params :dir)) + (limit (plist-get params :limit)) + (all-posts (reverse (directory-files dir nil (rx bos digit (+ any) ".org" eos)))) + (posts (if limit (take limit all-posts) all-posts))) + (dolist (post posts) + (let ((file (expand-file-name post dir))) + (insert "- [" + "[file:" (file-relative-name file) "]" + "[" (substring post 0 10) " ~ " (org-get-title file) "]" + "]\n"))) + (when (and limit (< limit (length all-posts))) + (insert "- [[file:" (file-relative-name dir) "][...older posts]]")) + (delete-blank-lines))) + +(defun esy-publish-insert-posts-dblock (limit) + (interactive (list (when current-prefix-arg + (prefix-numeric-value current-prefix-arg)))) + (org-create-dblock (list :name "posts" + :dir esy-publish-posts-source-directory + :limit limit)) + (org-update-dblock)) + +(defun org-dblock-write:notes (params) + (let* ((dir (plist-get params :dir)) + (notes (delete "index.org" + (directory-files dir nil + (rx bos alnum (+ any) + ".org" eos))))) + (dolist (note notes) + (let* ((file (expand-file-name note dir)) + (buffer (find-file-noselect file)) + (titles (with-current-buffer buffer + (org-collect-keywords '("TITLE" "SUBTITLE")))) + (title (car (alist-get "TITLE" titles nil nil #'string=))) + (subtitle (car (alist-get "SUBTITLE" titles nil nil #'string=)))) + (insert "- [[file:" (file-relative-name file) "][" title "]] :: " subtitle "\n"))) + (delete-blank-lines))) + +(defun esy-publish-insert-notes-dblock () + (interactive) + (org-create-dblock (list :name "notes" + :dir esy-publish-notes-source-directory)) + (org-update-dblock)) + +(defun org-dblock-write:links-to-note (params) + (let* ((dir (plist-get params :dir)) + (files (sort + (delete-dups + (mapcar #'xref-location-group + (mapcar #'xref-match-item-location + (xref-matches-in-directory (rx "[[note:" (literal (file-name-base (buffer-file-name))) "][") + "*.org" + dir + nil)))) + #'string-lessp) )) + (dolist (file files) + (let* ((full (expand-file-name file dir)) + (titles (with-current-buffer (find-file-noselect full) + (org-collect-keywords '("TITLE" "SUBTITLE")))) + (title (car (alist-get "TITLE" titles nil nil #'string=))) + (subtitle (car (alist-get "SUBTITLE" titles nil nil #'string=)))) + (insert "- [[file:" (file-relative-name full) "][" title "]] :: " subtitle "\n"))) + (delete-blank-lines))) + +(defun esy-publish-insert-links-to-note-dblock () + (interactive) + (org-create-dblock (list :name "links-to-note" + :dir esy-publish-notes-source-directory)) + (org-update-dblock)) + +(defun esy-publish-follow-note-link (path arg) + (org-link-open-as-file + (expand-file-name (file-name-with-extension path "org") + esy-publish-notes-source-directory) + arg)) + +(defun esy-publish-export-note-link (path description backend &optional _info) + (when (eq backend 'html) + (esy-publish--dom-to-string + `(a ((href . ,(concat "/notes/" path ".html")) + (class . "note-link") + (title . ,(let* ((file (expand-file-name (file-name-with-extension path "org") + esy-publish-notes-source-directory)) + (buffer (find-file-noselect file)) + (titles (with-current-buffer buffer + (org-collect-keywords '("TITLE")))) + (title (car (alist-get "TITLE" titles nil nil #'string=)))) + (concat "Notes about " title)))) + ,description)))) + +(defun esy-publish--note-titles () + (mapcar (lambda (file) + (cons (org-get-title + (expand-file-name file esy-publish-notes-source-directory)) + (file-name-base file))) + (delete "index.org" + (directory-files esy-publish-notes-source-directory + nil (rx bos alnum (+ any) + ".org" eos))))) + +(defun esy-publish-create-empty-note (title) + (interactive (list (read-string "Note subject: "))) + (let ((base (esy-publish--title-to-file-base-name title))) + (with-temp-buffer + (insert + "#+TITLE: " title "\n" + "#+SUBTITLE: " (read-string "Subtitle: ") "\n" + "#+DESCRIPTION: Eshel Yaron's notes about " title "\n" + "#+KEYWORDS: " (read-string "Keywords: ") "\n" + "#+DATE: " (format-time-string "%F") "\n" + "\n" "\n" + "* References in published posts" "\n" + "#+BEGIN: links-to-note :dir \"" esy-publish-posts-source-directory "\"" "\n" + "#+END:" "\n" + "* References in other notes" "\n" + "#+BEGIN: links-to-note :dir \"" esy-publish-notes-source-directory "\"" "\n" + "#+END:" "\n") + (write-file (expand-file-name + (file-name-with-extension base "org") + esy-publish-notes-source-directory))) + base)) + +(defun esy-publish-complete-note-link (&optional _arg) + (let* ((title-name-alist (esy-publish--note-titles)) + (max-title-width (apply #'max + (mapcar #'length + (mapcar #'car + title-name-alist)))) + (completion-extra-properties + (list + :annotation-function + (lambda (title) + (let ((subtitle (with-current-buffer + (find-file-noselect + (expand-file-name + (file-name-with-extension + (alist-get title + title-name-alist + nil nil + #'string=) + "org") + esy-publish-notes-source-directory)) + (car (alist-get "SUBTITLE" + (org-collect-keywords + '("SUBTITLE")) + nil nil #'string=))))) + (concat (make-string (1+ (- max-title-width + (length title))) + ?\s) + subtitle))))) + (title (completing-read "Note: " + title-name-alist + nil 'confirm nil + 'esy-publish-notes-completion-history)) + (name (or (alist-get title + title-name-alist + nil nil + #'string=) + (esy-publish-create-empty-note title)))) + (concat "note:" name))) + +(defun esy-publish-describe-note-link (loc &optional _desc) + (org-get-title (expand-file-name (file-name-with-extension (substring loc 5) "org") + esy-publish-notes-source-directory))) + +(defun esy-publish-store-note-link () + (when (and (derived-mode-p 'org-mode) + (buffer-file-name) + (equal (file-name-as-directory (expand-file-name (file-name-directory (buffer-file-name)))) + esy-publish-notes-source-directory)) + (let* ((note (file-name-base (buffer-file-name))) + (link (concat "note:" note)) + (description (org-get-title))) + (org-link-store-props + :type "note" + :link link + :description description)))) + +(defface esy-publish-note-link + '((t :underline (:style wave) :slant italic)) + "Face applied to \"note:\" links.") + +;;;###autoload +(defun esy-publish-setup () + (unless esy-publish-did-setup-p + (dolist (cell '(("posts" . esy-publish-insert-posts-dblock) + ("notes" . esy-publish-insert-notes-dblock) + ("links-to-note" . esy-publish-insert-links-to-note-dblock))) + (org-dynamic-block-define (car cell) (cdr cell))) + (org-link-set-parameters "note" + :follow #'esy-publish-follow-note-link + :export #'esy-publish-export-note-link + :store #'esy-publish-store-note-link + :complete #'esy-publish-complete-note-link + :insert-description #'esy-publish-describe-note-link + :face 'esy-publish-note-link) + (function-put 'esy/init-step 'doc-string-elt 2) + (setq esy-publish-did-setup-p t))) + +(defun esy-publish--post-to-feed-item (file) + (with-current-buffer (find-file-noselect + (expand-file-name + file esy-publish-local-posts-directory)) + (let ((dom (libxml-parse-html-region (point-min) (point-max)))) + `(item nil + (title nil ,(string-join (dom-strings (car (dom-by-tag dom 'title))))) + (author nil ,user-full-name) + (category nil ,(car (string-split (dom-attr (seq-find (lambda (m) (pcase m (`(meta ((name . "keywords") . ,_)) t))) (dom-by-tag dom 'meta)) 'content) " "))) + (link nil ,(concat "https://eshelyaron.com/posts/" file)) + (guid ((isPermaLink . "true")) ,(concat "https://eshelyaron.com/posts/" file)) + (pubDate nil ,(substring file 0 10)) + (description nil ,(format "" (esy-publish--dom-to-string (car (dom-by-id dom "content"))))))))) + +(defun esy-publish--finalize-sitemap (plist) + (let ((locs (mapcar #'esy-publish--file-url + (directory-files-recursively esy-publish-local-directory + (rx ".html" eos))))) + (with-temp-buffer + (insert "\n") + (dom-print `(urlset ((xlmns . "http://www.sitemaps.org/schemas/sitemap/0.9")) + ,@(mapcar (lambda (loc) + `(url nil (loc nil ,loc))) + locs)) + t t) + (write-file (expand-file-name "sitemap.xml" (plist-get plist :publishing-directory)))))) + +(defun esy-publish--finalize-feed (plist) + (let ((posts (reverse (directory-files esy-publish-local-posts-directory + nil + (rx bos digit (+ any) ".html" eos))))) + (with-temp-buffer + (insert "\n") + (dom-print `(rss ((version . "2.0")) + (channel nil + (title nil ,user-full-name) + (generator nil "GNU Emacs") + (link nil "https://eshelyaron.com") + (description nil "RSS Feed of eshelyaron.com") + (pubDate nil ,(format-time-string "%F")) + ,@(mapcar #'esy-publish--post-to-feed-item posts))) + t t) + (write-file (expand-file-name "rss.xml" (plist-get plist :publishing-directory)))))) + +(defun esy-publish--transclude-config (&rest _) + (with-current-buffer + (find-file-noselect + (expand-file-name "esy.org" esy-publish-source-directory)) + (org-transclusion-add-all))) + +(defun esy-publish--prepare-indices (&rest _) + (dolist (dir (list esy-publish-notes-source-directory + esy-publish-posts-source-directory + esy-publish-source-directory)) + (with-current-buffer (find-file-noselect (expand-file-name "index.org" dir)) + (org-update-all-dblocks)))) + +(defun esy-publish--prepare-notes-links (&rest _) + (dolist (note (delete "index.org" + (directory-files esy-publish-notes-source-directory + t + (rx bos alnum (+ any) + ".org" eos)))) + (with-current-buffer (find-file-noselect note) + (org-update-all-dblocks)))) + +(defun esy-publish--prepare (&rest _) + (esy-publish--transclude-config) + (esy-publish--prepare-indices) + (esy-publish--prepare-notes-links)) + +(defun esy-publish--add-canonical-tags (_plist) + (dolist (file (directory-files-recursively esy-publish-local-directory + (rx ".html" eos))) + (with-current-buffer (find-file-noselect file) + (goto-char (point-min)) + (when (search-forward "" nil t) + (replace-match (format "" + (esy-publish--file-url file)) + nil t)) + (basic-save-buffer)))) + +(defun esy-publish--finalize (plist) + (esy-publish--add-canonical-tags plist) + (esy-publish--finalize-feed plist) + (esy-publish--finalize-sitemap plist)) + +;;;###autoload +(defun esy-publish (&optional force) + (interactive "P") + (esy-publish-setup) + (let* ((org-export-with-sub-superscripts '{}) + (org-export-with-section-numbers nil) + (org-export-with-toc nil) + (org-export-with-smart-quotes t) + (org-html-htmlize-output-type 'css) + (org-html-metadata-timestamp-format "%Y-%m-%d") + (org-time-stamp-formats '("%Y-%m-%d" . "%Y-%m-%d %H:%M")) + (org-confirm-babel-evaluate nil) + (org-src-lang-modes nil) + (prog-mode-hook '(rainbow-delimiters-mode)) + (make-backup-files nil) + (org-publish-project-alist + (list '("all" :components ("assets" "org")) + (list "assets" + :base-directory esy-publish-source-directory + :publishing-directory esy-publish-local-directory + :base-extension "svg\\|ico\\|css\\|png" + :publishing-function #'org-publish-attachment) + (list "org" + :completion-function #'esy-publish--finalize + :base-directory esy-publish-source-directory + :publishing-directory esy-publish-local-directory + :preparation-function #'esy-publish--prepare + :completion-function #'ignore + :base-extension "org" + :recursive t + :exclude nil + :include nil + :publishing-function #'org-html-publish-to-html + :html-doctype "html5" + :html-html5-fancy t + :auto-sitemap t + :sitemap-title "Sitemap for eshelyaron.com" + :makeindex t + :with-date t + :html-head-include-default-style nil + :html-head-include-scripts nil + :html-use-infojs nil + :html-link-org-files-as-html t + :html-head (esy-publish--dom-to-string '(link ((rel . "stylesheet") + (href . "/style.css") + (type . "text/css")))) + :html-head-extra (concat (esy-publish--dom-to-string + '(link ((rel . "alternate") + (href . "/rss.xml") + (type . "application/rss+xml") + (title . "RSS feed of eshelyaron.com")))) + "\n") + :html-preamble-format + (list + (list + "en" + (esy-publish--dom-to-string + '(nav ((id . "icon-links") + (class . "icon-links")) + (div ((class . "home-link")) + (a ((href . "/")) + (img ((src . "/home.svg") + (height . "35") + (width . "35") + (alt . "Home"))))) + (div ((class . "other-links")) + (a ((href . "mailto:me@eshelyaron.com")) + (img ((src . "/mail.svg") + (height . "30") + (width . "30") + (alt . "Mail")))) + " " + (a ((href . "https://emacs.ch/@eshel") + (rel . "me")) + (img ((src . "/mastodon.svg") + (height . "28") + (width . "28") + (alt . "Mastodon")))) + " " + (a ((href . "/rss.xml")) + (img ((src . "/rss.svg") + (height . "30") + (width . "30") + (alt . "RSS Feed")))))) + '(hr nil)))) + :html-postamble t + :html-postamble-format + (list + (list + "en" + (esy-publish--dom-to-string + '(footer ((id . "footer") + (class . "footer")) + (hr nil) + "© " + (time ((class . "copyright-year")) "2023") + " %a")))))))) + (org-publish "all" force))) + +(defun esy-publish-all () + (esy-publish t)) + +;;;###autoload +(defun esy-publish-to-remote () + (interactive) + (compile (format "rsync -vrz %s %s" + esy-publish-local-directory + esy-publish-remote-directory))) + +(provide 'esy-publish) +;;; esy-publish.el ends here diff --git a/org/index.org b/org/index.org deleted file mode 100644 index f02c566..0000000 --- a/org/index.org +++ /dev/null @@ -1,136 +0,0 @@ -#+TITLE: Eshel Yaron -#+AUTHOR: Eshel Yaron -#+DESCRIPTION: Personal home page of Eshel Yaron -#+KEYWORDS: eshel language emacs programming prolog -#+OPTIONS: toc:nil ^:{} - -Welcome to [[./index.org][my website]], the one true source of reliable curated information about me and my activities. - -#+begin_src prolog - ?- likes('Eshel', Stuff). - Stuff = 'logic programming'; - Stuff = 'linguistics'; - Stuff = 'cognition'; - Stuff = 'functional programming'; - Stuff = 'The cyber'; - Stuff = 'type systems'; - Stuff = 'coffee ☕️'; - Stuff = 'free software'. -#+end_src - -* Recent Posts -:PROPERTIES: -:CUSTOM_ID: recent-posts -:END: -#+BEGIN: posts :dir "/Users/eshelyaron/checkouts/eshelyaron.com/org/posts" :limit 5 -#+END: - - -* Projects -:PROPERTIES: -:CUSTOM_ID: projects -:END: - -** =sweep=: SWI-Prolog Embedded in Emacs -:PROPERTIES: -:CUSTOM_ID: sweep -:END: - -[[https://git.sr.ht/~eshel/sweep][Sweep]] is an Emacs module which uses the C interfaces of both -SWI-Prolog and Emacs to bring the two together into one address space. - -For more details, see [[file:sweep.org][the Sweep manual]]. - -** Sourcehut GraphQL client for SWI-Prolog -:PROPERTIES: -:CUSTOM_ID: sourcehut-pl -:END: - -[[https://git.sr.ht/~eshel/sourcehut.pl][sourcehut.pl]] - a SWI-Prolog package for interacting with the GraphQL -API of sourcehut instances. - -=sourcehut.pl= can be used to automate maintenance tasks for project -hosted on sourcehut, for example to attach a build artifact to a given -tag of a git repository from within SWI-Prolog: - -#+begin_src prolog - ?- sourcehut_git_repository("eshel", "sourcehut.pl", Repo, []), - get_dict(id, Repo, RepoId), - sourcehut_git_upload_artifact(RepoId, "v0.1.2", "/tmp/foo/baz.txt", Artifact, []). -#+end_src - -** [[https://git.sr.ht/~eshel/eshellisp][eshellisp]] -:PROPERTIES: -:CUSTOM_ID: eshellisp -:END: - -A [[https://git.sr.ht/~eshel/eshellisp][Scheme Lisp interpreter implemented in SWI-Prolog]]. - -#+begin_src sh - $ cat scheme/repl.scm - (define repl () (write (eval (read))) (repl)) - (repl) - - $ ./eshellisp scheme/repl.scm - % (cons (+ 1 2) 4) - % (3 . 4) -#+end_src - -** [[https://git.sr.ht/~eshel/flymake-swi-prolog][flymake-swi-prolog.el]] and [[https://git.sr.ht/~eshel/diagnostics.pl][diagnostics.pl]] -:PROPERTIES: -:CUSTOM_ID: flymake-swi-prolog -:END: - -=diagnostics.pl= is a SWI-Prolog package implementing a simple and -extensible inteface for diagnosing issues with SWI-Prolog source code, -exposing by default the powerful analysis used by the built-in -SWI-Prolog IDE. - -=flymake-swi-prolog= is an Emacs Lisp package implementing a Flymake -backend that leverages =diagnostics.pl= to provide diagnostics for -SWI-Prolog source code in =prolog-mode= Emacs buffers. - -** [[https://git.sr.ht/~eshel/ropes.pl][ropes.pl]] -:PROPERTIES: -:CUSTOM_ID: ropes-pl -:END: - -A (SWI-)Prolog implemantation of the [[https://en.wikipedia.org/wiki/Rope_(data_structure)][rope data structure]] for efficient -massive string editing. - -Based on [[https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.9450&rep=rep1&type=pdf][Ropes: An alternative to strings]]. - -#+begin_src prolog -test(edit) :- - string_rope("Hello, World!" , HW), - string_rope("Here be dragons", HD), - rope_split(HD, 8, _, D), % "Here be " + "dragons" - rope_split(HW, 7, H, W), % "Hello, " + "World!" - rope_split(W , 5, _, E), % "World" + "!" - rope_concat(H , D, HS), - rope_concat(HS, E, HE), - rope_string(HE, HF), - assertion(HF == "Hello, dragons!"). -#+end_src - -** [[https://github.com/oskardrums/ebpf][Erlang eBPF library]] -:PROPERTIES: -:CUSTOM_ID: erlang-ebpf -:END: - -A low level interface to the [[https://ebpf.io/][Linux eBPF system]] for [[https://www.erlang.org/][Erlang]]. - - -** [[https://git.sr.ht/~eshel/eshelyaron.com][This website]] -:PROPERTIES: -:CUSTOM_ID: this-website -:END: - -My first taste of web development, a practice that I have always -refrained from conducting. Created with pure [[https://orgmode.org/][org-mode]] to ease the -landing. - -Inspired by: -- https://taingram.org/ -- https://sachachua.com/blog/ -- https://occasionallycogent.com/ diff --git a/org/posts/2023-04-01-take-on-recursion.org b/org/posts/2023-04-01-take-on-recursion.org deleted file mode 100644 index bd463d5..0000000 --- a/org/posts/2023-04-01-take-on-recursion.org +++ /dev/null @@ -1,111 +0,0 @@ -#+TITLE: Take on Recursion -#+SUBTITLE: My take on a recursive Elisp function for accumulating a list while walking up an AST -#+DESCRIPTION: A post by Eshel Yaron describing his take on a recursive Elisp function for accumulating a list while walking up an AST -#+KEYWORDS: emacs -#+DATE: 2023-04-01 - -Over at [[https://takeonrules.com]], Jeremy Friesen has [[https://takeonrules.com/2023/03/25/using-built-in-emacs-29-tree-sitter-package-to-get-qualified-ruby-function-name/][a couple of]] [[https://takeonrules.com/2023/03/25/using-built-in-emacs-29-tree-sitter-package-to-get-qualified-ruby-function-name/][recent posts]] -about an Emacs command he wrote for grabbing the qualified name of the function -at point in Ruby files. - -I don't know much about Ruby, but the way he implemented this command caught my -attention because he's relying on the new =treesit= package from Emacs 29 to -examine the syntax tree of his Ruby code, and I've been playing around with this -nice parsing framework myself recently. - -Apparently, Ruby /functions/ can reside within nested /modules/. Jeremy's -command thus leverages the function ~treesit-defun-at-point~ to obtain the -syntax tree node corresponding to the Ruby function at point, and calls a -recursive helper function called ~jf/treesit/module_space~ that walks up the -syntax tree and accumulates the names of the enclosing modules it finds along -the way to the root of the syntax tree. There's just a tiny problem which is -that this helper function accumulates the module names in a rather awkward -manner... As Jeremy notes: - -#+begin_quote -The list returned by ~jf/treesit/module_space~ is ~'(nil ("Hello" ("World")))~; -which is a ugly but workable. Perhaps someone will write to me with a refactor -of this code. -#+end_quote - -Let's have a look at this function's implementation: - -#+begin_src emacs-lisp - (defun jf/treesit/module_space (node) - (when-let* ((parent (treesit-parent-until - node - (lambda (n) (member (treesit-node-type n) - '("class" "module" "assignment"))))) - (parent_name (treesit-node-text - (car - (treesit-filter-child - parent - (lambda (n) - (member (treesit-node-type n) - '("constant" "scope_resolution")))))))) - (list (jf/treesit/module_space parent) parent_name))) -#+end_src - -Basically what this does is climbing up the syntax tree with -~treesit-parent-until~ to find the next module boundary (if there is one) and -then grabbing its name with ~treesit-node-text~. Now all that's left is to -perform a recursive call and return its result along with the found module name, -but the way it bundles them together as two elements of a ~list~ causes the -result to be a nested tree structure, instead of a simple list. Then, to obtain -the desired list of module names, the calling command needs to apply the -~-flatten~ function to the tree that ~jf/treesit/module_space~ returns. - -Here's my take on this function: - -#+begin_src emacs-lisp - (defun esy/treesit/module_space (node &optional acc) - (if-let ((parent (treesit-parent-until - node - (lambda (n) (member (treesit-node-type n) - '("class" "module" "assignment"))))) - (parent_name (treesit-node-text - (car - (treesit-filter-child - parent - (lambda (n) - (member (treesit-node-type n) - '("constant" "scope_resolution")))))))) - (esy/treesit/module_space parent (cons parent_name acc)) - acc)) -#+end_src - -It's extremely similar to the original version, but the crucial difference is -that we use an accumulator argument ~ACC~ to hold the result of our syntax tree -traversal as we climb up to the root. At each step in the way, ~ACC~ holds a -list of module names which is the ~cdr~ of the list that we'll eventually -return. We extend this list with the name of the next parent module during the -recursive call, and when we reach the root of the syntax tree we simply return -the accumulated list. - -For example, if we have Ruby code that looks something like this: - -#+begin_src ruby -module Foo - module Bar - module Baz - def spam - :true - end - end - end -end -#+end_src - -With point inside the function definition we get a simple list: - -#+begin_src emacs-lisp - (esy/treesit/module_space (treesit-defun-at-point)) - ⇒ ("Foo" "Bar" "Baz") -#+end_src - -Which is a little cleaner than what we get with ~jf/treesit/module_space~: - -#+begin_src emacs-lisp - (jf/treesit/module_space (treesit-defun-at-point)) - ⇒ (((nil "Foo") "Bar") "Baz") -#+end_src diff --git a/org/posts/index.org b/org/posts/index.org deleted file mode 100644 index 9677968..0000000 --- a/org/posts/index.org +++ /dev/null @@ -1,6 +0,0 @@ -#+TITLE: All Posts -#+DESCRIPTION: Eshel Yaron's blog posts -#+KEYWORDS: eshel language emacs programming prolog - -#+BEGIN: posts :dir "/Users/eshelyaron/checkouts/eshelyaron.com/org/posts" :limit nil -#+END: diff --git a/publish.el b/publish.el deleted file mode 100644 index e194fce..0000000 --- a/publish.el +++ /dev/null @@ -1,278 +0,0 @@ -;;; publish.el --- generate and publish my site -*- lexical-binding: t -*- - -;; Copyright (C) 2021-2022 Eshel Yaron - -;;; Commentary: - -;;; Code: - -(package-initialize) - -(use-package htmlize :ensure t :demand t) -(use-package rainbow-delimiters :ensure t :demand t) -(use-package org-transclusion :ensure t :demand t) - -(add-hook 'prog-mode-hook #'rainbow-delimiters-mode) - -(require 'org) -(require 'ox-publish) -(require 'ox-html) -(require 'dom) - -(org-babel-do-load-languages - 'org-babel-load-languages - '((emacs-lisp . t) - (shell . t))) - -(setq org-confirm-babel-evaluate nil - make-backup-files nil) - -(defun esy/dom-to-string (&rest doms) - (with-temp-buffer - (mapc #'dom-print doms) - (buffer-string))) - -(defvar esy/publish-remote-directory - "/rsync:root@direct.eshelyaron.com:/var/www/html") - -(defvar esy/publish-root-directory - (file-name-directory load-file-name)) - -(defvar esy/publish-src-directory - (file-name-as-directory (expand-file-name - "src" - esy/publish-root-directory))) - -(defvar esy/publish-org-posts-directory - (file-name-as-directory (expand-file-name - "posts" - esy/publish-src-directory))) - -(defvar esy/publish-out-directory - (file-name-as-directory (expand-file-name - "html" - esy/publish-root-directory))) - -(defvar esy/publish-out-posts-directory - (file-name-as-directory (expand-file-name - "posts" - esy/publish-out-directory))) - -(defun esy/publish-post-to-dom (file) - (with-current-buffer (find-file-noselect - (expand-file-name - file esy/publish-out-posts-directory)) - (let ((dom (libxml-parse-html-region (point-min) (point-max)))) - `(item nil - (title nil ,(string-join (dom-strings (car (dom-by-tag dom 'title))))) - (author nil ,user-full-name) - (category nil ,(car (string-split (dom-attr (seq-find (lambda (m) (pcase m (`(meta ((name . "keywords") . ,_)) t))) (dom-by-tag dom 'meta)) 'content) " "))) - (link nil ,(concat "https://eshelyaron.com/posts/" file)) - (guid ((isPermaLink . "true")) ,(concat "https://eshelyaron.com/posts/" file)) - (pubDate nil ,(substring file 0 10)) - (description nil ,(format "" (esy/dom-to-string (car (dom-by-id dom "content"))))))))) - -(defun esy/publish-file-url (file) - (concat "https://eshelyaron.com/" - (let ((path (file-relative-name file esy/publish-out-directory))) - (if (string= (file-name-base file) "index") - (file-name-directory path) - path)))) - -(defun esy/publish-sitemap (plist) - (let ((locs (mapcar #'esy/publish-file-url - (directory-files-recursively esy/publish-out-directory - (rx ".html" eos))))) - (with-temp-buffer - (insert "\n") - (dom-print `(urlset ((xlmns . "http://www.sitemaps.org/schemas/sitemap/0.9")) - ,@(mapcar (lambda (loc) - `(url nil (loc nil ,loc))) - locs)) - t t) - (write-file (expand-file-name "sitemap.xml" (plist-get plist :publishing-directory)))))) - -(defun esy/publish-posts (plist) - (let ((posts (reverse (directory-files esy/publish-out-posts-directory - nil - (rx bos digit (+ any) ".html" eos))))) - (with-temp-buffer - (insert "\n") - (dom-print `(rss ((version . "2.0")) - (channel nil - (title nil ,user-full-name) - (generator nil "GNU Emacs") - (link nil "https://eshelyaron.com") - (description nil "RSS Feed of eshelyaron.com") - (pubDate nil ,(format-time-string "%F")) - ,@(mapcar #'esy/publish-post-to-dom posts))) - t t) - (write-file (expand-file-name "rss.xml" (plist-get plist :publishing-directory)))))) - -(defun esy/org-dblock-insert-posts (limit) - (interactive (list (when current-prefix-arg - (prefix-numeric-value current-prefix-arg)))) - (org-create-dblock (list :name "posts" - :dir esy/publish-org-posts-directory - :limit limit)) - (org-update-dblock)) - -(org-dynamic-block-define "posts" #'esy/org-dblock-insert-posts) - -(defun org-dblock-write:posts (params) - (let* ((dir (plist-get params :dir)) - (limit (plist-get params :limit)) - (all-posts (reverse (directory-files dir nil (rx bos digit (+ any) ".org" eos)))) - (posts (if limit (take limit all-posts) all-posts))) - (dolist (post posts) - (let ((file (expand-file-name post dir))) - (insert "- [[file:" (file-relative-name file) "][" (substring post 0 10) " ~ " (org-get-title file) "]]")) - (newline)) - (when (and limit (< limit (length all-posts))) - (insert "- [[file:" (file-relative-name dir) "][...older posts]]")) - (delete-blank-lines))) - - -(defun esy/publish-prepare (&rest _) - (esy/publish-transclude-config) - (esy/publish-posts-prepare-index)) - -(function-put 'esy/init-step 'doc-string-elt 2) - -(defun esy/publish-transclude-config (&rest _) - (with-current-buffer (find-file-noselect (expand-file-name "esy.org" esy/publish-src-directory)) - (org-transclusion-add-all))) - -(defun esy/publish-posts-prepare-index (&rest _) - (dolist (dir (list esy/publish-org-posts-directory esy/publish-src-directory)) - (with-current-buffer (find-file-noselect (expand-file-name "index.org" dir)) - (org-update-all-dblocks)))) - -(defun esy/publish-add-canonical-tags (_plist) - (dolist (file (directory-files-recursively esy/publish-out-directory - (rx ".html" eos))) - (with-current-buffer (find-file-noselect file) - (when (search-forward "" nil t) - (replace-match (format "" - (esy/publish-file-url file)) - nil t)) - (basic-save-buffer)))) - -(defun esy/publish-completion-function (plist) - (esy/publish-add-canonical-tags plist) - (esy/publish-posts plist) - (esy/publish-sitemap plist)) - -(defun esy/publish-to-remote () - (let ((files (directory-files-recursively esy/publish-out-directory - (rx (or ".html" - ".ico" - ".svg" - ".png" - ".xml" - ".css") - eos)))) - (dolist-with-progress-reporter (file files) "Copying files" - (copy-file file (expand-file-name - (file-relative-name file - esy/publish-out-directory) - esy/publish-remote-directory) - t)))) - -(defun esy/publish (&optional modified-only) - (interactive "P") - (let* ((publishing-directory esy/publish-out-directory) - (org-export-with-sub-superscripts '{}) - (org-export-with-section-numbers nil) - (org-export-with-toc nil) - (org-export-with-smart-quotes t) - (org-html-htmlize-output-type 'css) - (org-time-stamp-formats '("%Y-%m-%d" . "%Y-%m-%d %H:%M")) - (org-publish-project-alist - (list '("all" :components ("assets" "org")) - (list "assets" - :base-directory esy/publish-src-directory - :publishing-directory publishing-directory - :base-extension "svg\\|ico\\|css\\|png" - :publishing-function #'org-publish-attachment) - (list "org" - :completion-function #'esy/publish-completion-function - :base-directory esy/publish-src-directory - :publishing-directory publishing-directory - :preparation-function #'esy/publish-prepare - :completion-function #'ignore - :base-extension "org" - :recursive t - :exclude nil - :include nil - :publishing-function #'org-html-publish-to-html - :html-doctype "html5" - :html-html5-fancy t - :auto-sitemap t - :sitemap-title "Sitemap for eshelyaron.com" - :makeindex t - :with-date t - :html-head-include-default-style nil - :html-head-include-scripts nil - :html-use-infojs nil - :html-link-org-files-as-html t - :html-head (esy/dom-to-string '(link ((rel . "stylesheet") - (href . "/style.css") - (type . "text/css")))) - :html-head-extra (concat (esy/dom-to-string - '(link ((rel . "alternate") - (href . "/rss.xml") - (type . "application/rss+xml") - (title . "RSS feed of eshelyaron.com")))) - "\n") - :html-preamble-format - (list - (list - "en" - (esy/dom-to-string - '(nav ((id . "icon-links") - (class . "icon-links")) - (div ((class . "home-link")) - (a ((href . "/")) - (img ((src . "/home.svg") - (height . "35") - (width . "35") - (alt . "Home"))))) - (div ((class . "other-links")) - (a ((href . "mailto:me@eshelyaron.com")) - (img ((src . "/mail.svg") - (height . "30") - (width . "30") - (alt . "Mail")))) - " " - (a ((href . "https://emacs.ch/@eshel") - (rel . "me")) - (img ((src . "/mastodon.svg") - (height . "28") - (width . "28") - (alt . "Mastodon")))) - " " - (a ((href . "/rss.xml")) - (img ((src . "/rss.svg") - (height . "30") - (width . "30") - (alt . "RSS Feed")))))) - '(hr nil)))) - :html-postamble t - :html-postamble-format - (list - (list - "en" - (esy/dom-to-string - '(footer ((id . "footer") - (class . "footer")) - (hr nil) - "© " - (time ((class . "copyright-year")) "2023") - " %a")))))))) - (org-publish "all" (not modified-only)))) - -(defun esy/publish-update () (esy/publish t)) - -(provide 'publish) -;;; publish.el ends here diff --git a/src/changelog.org b/source/changelog.org similarity index 100% rename from src/changelog.org rename to source/changelog.org diff --git a/src/esy.org b/source/esy.org similarity index 100% rename from src/esy.org rename to source/esy.org diff --git a/assets/favicon.ico b/source/favicon.ico similarity index 100% rename from assets/favicon.ico rename to source/favicon.ico diff --git a/assets/home.svg b/source/home.svg similarity index 100% rename from assets/home.svg rename to source/home.svg diff --git a/src/index.org b/source/index.org similarity index 100% rename from src/index.org rename to source/index.org diff --git a/assets/mail.svg b/source/mail.svg similarity index 100% rename from assets/mail.svg rename to source/mail.svg diff --git a/assets/mastodon.svg b/source/mastodon.svg similarity index 100% rename from assets/mastodon.svg rename to source/mastodon.svg diff --git a/source/notes/emacs.org b/source/notes/emacs.org new file mode 100644 index 0000000..bc6b464 --- /dev/null +++ b/source/notes/emacs.org @@ -0,0 +1,17 @@ +#+TITLE: Emacs +#+SUBTITLE: The advanced, extensible, customizable, self-documenting editor +#+DESCRIPTION: Eshel Yaron's notes about Emacs +#+KEYWORDS: notes, emacs +#+DATE: 2023-04-12 + +The [[note:gnu][GNU]] [[https://www.gnu.org/software/emacs/][website]] describes Emacs as "an extensible, customizable, +free/libre text editor". + + +* References in published posts +#+BEGIN: links-to-note :dir "/Users/eshelyaron/checkouts/eshelyaron.com/src/posts" +#+END: + +* References in other notes +#+BEGIN: links-to-note :dir "/Users/eshelyaron/checkouts/eshelyaron.com/src/notes" +#+END: diff --git a/source/notes/gnu.org b/source/notes/gnu.org new file mode 100644 index 0000000..096c3a6 --- /dev/null +++ b/source/notes/gnu.org @@ -0,0 +1,14 @@ +#+TITLE: GNU +#+SUBTITLE: GNU's Not Unix +#+DESCRIPTION: Eshel Yaron's notes about GNU +#+KEYWORDS: notes, gnu +#+DATE: 2023-04-12 + + +* References in published posts +#+BEGIN: links-to-note :dir "/Users/eshelyaron/checkouts/eshelyaron.com/src/posts" +#+END: + +* References in other notes +#+BEGIN: links-to-note :dir "/Users/eshelyaron/checkouts/eshelyaron.com/src/notes" +#+END: diff --git a/source/notes/index.org b/source/notes/index.org new file mode 100644 index 0000000..caba0b2 --- /dev/null +++ b/source/notes/index.org @@ -0,0 +1,6 @@ +#+TITLE: All Notes +#+DESCRIPTION: Eshel Yaron's notes +#+KEYWORDS: eshel, language, emacs, programming, prolog, knowledge, management, notes + +#+BEGIN: notes :dir "/Users/eshelyaron/checkouts/eshelyaron.com/src/notes" +#+END: diff --git a/src/posts/2023-04-01-take-on-recursion.org b/source/posts/2023-04-01-take-on-recursion.org similarity index 100% rename from src/posts/2023-04-01-take-on-recursion.org rename to source/posts/2023-04-01-take-on-recursion.org diff --git a/src/posts/2023-04-05-the-self-healing-code-fallacy.org b/source/posts/2023-04-05-the-self-healing-code-fallacy.org similarity index 100% rename from src/posts/2023-04-05-the-self-healing-code-fallacy.org rename to source/posts/2023-04-05-the-self-healing-code-fallacy.org diff --git a/src/posts/2023-04-08-making-shell-scripts-executable-just-in-time.org b/source/posts/2023-04-08-making-shell-scripts-executable-just-in-time.org similarity index 100% rename from src/posts/2023-04-08-making-shell-scripts-executable-just-in-time.org rename to source/posts/2023-04-08-making-shell-scripts-executable-just-in-time.org diff --git a/src/posts/2023-04-11-optimizing-project-selection-in-emacs.org b/source/posts/2023-04-11-optimizing-project-selection-in-emacs.org similarity index 100% rename from src/posts/2023-04-11-optimizing-project-selection-in-emacs.org rename to source/posts/2023-04-11-optimizing-project-selection-in-emacs.org diff --git a/src/posts/index.org b/source/posts/index.org similarity index 100% rename from src/posts/index.org rename to source/posts/index.org diff --git a/org/pub.org b/source/pub.org similarity index 100% rename from org/pub.org rename to source/pub.org diff --git a/assets/rss.svg b/source/rss.svg similarity index 100% rename from assets/rss.svg rename to source/rss.svg diff --git a/src/style.css b/source/style.css similarity index 100% rename from src/style.css rename to source/style.css diff --git a/org/sweep.org b/source/sweep.org similarity index 100% rename from org/sweep.org rename to source/sweep.org diff --git a/src/favicon.ico b/src/favicon.ico deleted file mode 100644 index f744115af0cf3749452017dbd6ffa5063034499a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc&&`A<|=6n_5RS-=4Xt7Q}hv1!@F1=L}2qbk}OY6;k;b|YvoS{qVpgNcTyHN}AY z($dCMY_Nn1ZXgy!WF2-HaM${Oe7)bDzL6PbkQpCw$eH)vefOU4?B_6wGEMwhEDFDs zi$+BWRTL#gkXTaE1aVz{#Jk8?Cpi}sB`7Ee{*u99fL^bc#CxOB=r<34F^OT&8(=n@ zG4I_NELfC;#VHFBmk7kcB$ViJXlu^S9u)%Cl&^dmZilx6v`sf|l-E z`1{5s96C~hwd+4Xc(@td@2`Ho_8SdGq^8?&vF1GPJ?X{B^8q-X^*y%$Ldw$QDYpURAb;Ce7L}=c_7&ADlgqKDgW4jJ+j4Vt!KMl;JZD-;aF{m+C5Axk&8# zmMh3yyISS|_h_Z7Cm)l^goC9eE^OMpYp4|)HfBwE{8O)_1@qnNF!R6sRH<8EWsImj znDdgS4uL+C=O=j|yUhTc2l774fnMkAe@0^vX1qNEA7-yd!S;OVE3I;p_?&IV)E%O}W|7{cnHbQ%?3I=0&flQ>!vpxXI_Kmp{+!gRC)( zJI*0${IUPg_Vl&xEgg0iZI|z)eS|->>W{=&VoSlTwi}W^?a(vQfnDG4K+L?kh!8W* zaxst8iFudvcWpy8qM{--@xN*(>bNE=(>V`{9zYu~4{nOySbMV?9fNlyw%yStX68Ii zu~ivp2hN1W`}asWXlKem>J;^;>hc8{tE^Y*8Lh9Bfjq6zR{1|!)<^5)EXw}#PQ)y~ a=j=e`V~t~c>2x|tybrYIsJ{cesq24+SfiQ% diff --git a/src/home.svg b/src/home.svg deleted file mode 100644 index 222fdec..0000000 --- a/src/home.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - Layer 1 - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/mail.svg b/src/mail.svg deleted file mode 100644 index 5752d47..0000000 --- a/src/mail.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/mastodon.svg b/src/mastodon.svg deleted file mode 100644 index 350c222..0000000 --- a/src/mastodon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/pub.org b/src/pub.org deleted file mode 100644 index c761cb3..0000000 --- a/src/pub.org +++ /dev/null @@ -1,9 +0,0 @@ -#+TITLE: Public PGP Key -#+AUTHOR: Eshel Yaron -#+OPTIONS: toc:nil ^:{} - -* My PGP public key - -#+begin_src shell :results code :exports both - gpg --armor --export me@eshelyaron.com -#+end_src diff --git a/src/rss.svg b/src/rss.svg deleted file mode 100644 index 3ea2cd9..0000000 --- a/src/rss.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/sweep.org b/src/sweep.org deleted file mode 120000 index b077d19..0000000 --- a/src/sweep.org +++ /dev/null @@ -1 +0,0 @@ -../sweep/README.org \ No newline at end of file -- 2.39.2