diff --git a/blog/blogpost1.md4tj b/blog/blogpost1.md4tj new file mode 100644 index 0000000..cf8f81e --- /dev/null +++ b/blog/blogpost1.md4tj @@ -0,0 +1,6 @@ +@@TITLE Blog post 1 + +@@BLOGPOSTTITLE Blog Post 1 +@@BLOGPOSTDATE 1677804254 +# Blog post 1 +blog text 1! \ No newline at end of file diff --git a/blog/blogpost2.md4tj b/blog/blogpost2.md4tj new file mode 100644 index 0000000..0879c84 --- /dev/null +++ b/blog/blogpost2.md4tj @@ -0,0 +1,6 @@ +@@TITLE Blog post 2 + +@@BLOGPOSTTITLE Blog Post 2 +@@BLOGPOSTDATE 1677804290 +# Blog post 2 +blog text 2 text! \ No newline at end of file diff --git a/md4tj-blog.el b/md4tj-blog.el new file mode 100644 index 0000000..ba3c8be --- /dev/null +++ b/md4tj-blog.el @@ -0,0 +1,100 @@ +;;; md4tj --- Summary + +;;; Commentary: + +;;; Code: + +(require 'cl-lib) +;(load "./md4tj-util.el") + +(defun md4tj-blog-enabled () + "Determine if the current buffer corresponds to a blog." + (save-excursion + (goto-char (point-min)) + (not (not (search-forward-regexp "^@@BLOGENABLE" (point-max) t))))) + +(defun md4tj-blog-base-url () + "Find base URL of blog." + (save-excursion + (goto-char (point-min)) + (if (search-forward-regexp "^@@BLOGBASEURL" (point-max) t) + (replace-regexp-in-string "^@@BLOGBASEURL[ \\\t]+" "" (md4tj-util-getline)) + nil))) + +(defun md4tj-blog-base-dir () + "Find base directory of blog." + (save-excursion + (goto-char (point-min)) + (if (search-forward-regexp "^@@BLOGBASEDIR" (point-max) t) + (replace-regexp-in-string "^@@BLOGBASEDIR[ \\\t]+" "" (md4tj-util-getline)) + ""))) + +(defun md4tj-blog-names () + "Find all blogs on blog page." + (cl-map #'listp (lambda (l) (nth 1 l)) (cl-map #'listp 'split-string (cl-remove-if-not (lambda (s) (string-match "^@@BLOGPOST" s)) (split-string (buffer-string) "\n"))))) + +(defun md4tj-blog-links () + "Get all links on the blog page." + (let ((base-url (md4tj-blog-base-url))) + (cl-map #'listp (lambda (s) (concat base-url s)) (md4tj-blog-names)))) + +(defun md4tj-blog-file (name) + "Get full filename from NAME." + (concat (md4tj-blog-base-dir) name ".md4tj")) + +(defun md4tj-blog-files () + "Get all blog .md4tj files." + (cl-map #'listp 'md4tj-blog-file (md4tj-blog-names))) + +(defun md4tj-blog-title (f) + "Get blog title from file F." + (with-temp-buffer + (insert-file-contents f) + (goto-char (point-min)) + (if (search-forward-regexp "^@@BLOGPOSTTITLE" (point-max) t) + (replace-regexp-in-string "^@@BLOGPOSTTITLE[ \t]+" "" (md4tj-util-getline)) + ""))) + +(defun md4tj-blog-titles () + "Get all blog titles in current file." + (cl-map #'listp 'md4tj-blog-title (md4tj-blog-files))) + +(defun md4tj-blog-time (f) + "Get blog time (unix time) from file F." + (with-temp-buffer + (insert-file-contents f) + (goto-char (point-min)) + (if (search-forward-regexp "^@@BLOGPOSTDATE" (point-max) t) + (replace-regexp-in-string "^@@BLOGPOSTDATE[ \t]+" "" (md4tj-util-getline)) + ""))) + +(defun md4tj-blog-times () + "Get all blog times in current file." + (cl-map #'listp 'md4tj-blog-time (md4tj-blog-files))) + + +;; triple of +;; Title +;; Time +;; Link +(defun md4tj-all-blogs-list () + "Get all blogs in current buffer." + (-sort (lambda (l1 l2) (< (string-to-number (nth 1 l1)) (string-to-number (nth 1 l2)))) (md4tj-util-zip (list (md4tj-blog-titles) (md4tj-blog-times) (md4tj-blog-links))))) + +(defun md4tj-all-blogs-list-elt-to-html (elt) + "Convert abl list elt ELT to html." + (concat "
\\1
" line)))))))))
-
-(defun md4tj-clean-multiline (line)
- "Clean LINE of markdown syntax for ul."
- (replace-regexp-in-string
- "^```" ""
- (replace-regexp-in-string
- "^[0-9]+\\. " ""
- (replace-regexp-in-string "^- " "" line))))
-
-(defun md4tj-clean-code-for-html (line)
- "Escape characters in LINE that would be misinterpreted by the browser."
- (string-replace
- "<" "<"
- (string-replace ">" ">" line)))
(defun md4tj-convert-line-to-html (line state)
"Process LINE with STATE and return html."
- (let ((cleanline (md4tj-clean-multiline line)))
+ (let ((cleanline (md4tj-util-clean-multiline line)))
;; If this is a signal to include another file
(cond ((string-match "^@@INCLUDE" line) (md4tj-parse-to-string (nth 1 (split-string line))))
((string-match "^@@LASTUPDATED" line) (concat
@@ -115,7 +98,7 @@
(mapconcat #'md4tj-state-to-html state "\n")
;; Body
- (cond ((or (eq (nth 1 state) 'code) (eq (nth 1 state) 'begincode)) (md4tj-clean-code-for-html cleanline))
+ (cond ((or (eq (nth 1 state) 'code) (eq (nth 1 state) 'begincode)) (md4tj-util-escape-chars cleanline))
((string-match "^#+ " cleanline) (md4tj-process-header (md4tj-process-line cleanline)))
((string= "---" cleanline) "