Added blog stuff
This commit is contained in:
parent
981210140a
commit
e2f904f038
|
@ -0,0 +1,6 @@
|
|||
@@TITLE Blog post 1
|
||||
|
||||
@@BLOGPOSTTITLE Blog Post 1
|
||||
@@BLOGPOSTDATE 1677804254
|
||||
# Blog post 1
|
||||
blog text 1!
|
|
@ -0,0 +1,6 @@
|
|||
@@TITLE Blog post 2
|
||||
|
||||
@@BLOGPOSTTITLE Blog Post 2
|
||||
@@BLOGPOSTDATE 1677804290
|
||||
# Blog post 2
|
||||
blog text 2 text!
|
|
@ -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 "<div class=blogpost>" "\n"
|
||||
"<a href=\"" (nth 2 elt) "\"><h4>" (nth 0 elt) "</h4></a>" "\n"
|
||||
"<h5>" (format-time-string "%Y %B %d %H:%M" (string-to-number (nth 1 elt))) "</h5>" "\n"
|
||||
"</div>"))
|
||||
|
||||
(defun md4tj-all-blogs-list-to-html (abl)
|
||||
"Convert all blogs list ABL to html."
|
||||
(mapconcat 'md4tj-all-blogs-list-elt-to-html (md4tj-all-blogs-list) "\n"))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
(provide 'md4tj-blog)
|
||||
;;; md4tj-blog.el ends here
|
|
@ -0,0 +1,36 @@
|
|||
;;; md4tj-util --- Summary
|
||||
|
||||
;; A collection of useful utilities that can be used by anything
|
||||
;; relating to md4tj
|
||||
;;; Commentary:
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
|
||||
(defun md4tj-util-getline ()
|
||||
"Get current line from loaded buffer."
|
||||
(buffer-substring-no-properties (line-beginning-position) (line-end-position)))
|
||||
|
||||
(defun md4tj-util-clean-multiline (line)
|
||||
"Clean LINE of markdown syntax for ul's, ol's and code's."
|
||||
(replace-regexp-in-string
|
||||
"^```" ""
|
||||
(replace-regexp-in-string
|
||||
"^[0-9]+\\. " ""
|
||||
(replace-regexp-in-string "^- " "" line))))
|
||||
|
||||
(defun md4tj-util-escape-chars (line)
|
||||
"Escape characters in LINE that would be misinterpreted by the browser."
|
||||
(string-replace
|
||||
"<" "<"
|
||||
(string-replace ">" ">" line)))
|
||||
|
||||
(defun md4tj-util-zip (ls)
|
||||
"Turn list of lists LS into list of tuples."
|
||||
(cl-labels ((zip-help (ll) (if (not (car ll)) nil (cons (cl-map 'listp #'car ll) (zip-help (cl-map 'listp 'cdr ll))))))
|
||||
(zip-help ls)))
|
||||
|
||||
|
||||
(provide 'md4tj-util)
|
||||
;;; md4tj-util.el ends here
|
29
md4tj.el
29
md4tj.el
|
@ -5,10 +5,7 @@
|
|||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
|
||||
(defun getline ()
|
||||
"Get current line from loaded buffer."
|
||||
(buffer-substring-no-properties (line-beginning-position) (line-end-position)))
|
||||
;(load "md4tj-util.el")
|
||||
|
||||
(defun md4tj-begin-tag (tag &optional attrs)
|
||||
"Return beginning html tag for TAG with optional ATTRS."
|
||||
|
@ -68,23 +65,9 @@
|
|||
"`\\(.*\\)`"
|
||||
"<code>\\1</code>" 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) "<hr>") ;; horizontal line
|
||||
((= (length cleanline) 0) "<br>") ;; blank line
|
||||
|
@ -185,7 +168,7 @@
|
|||
(let ((meta-list nil))
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward "^@@" nil t)
|
||||
(setq meta-list (cons (split-string (getline)) meta-list)))
|
||||
(setq meta-list (cons (split-string (md4tj-util-getline)) meta-list)))
|
||||
meta-list)))
|
||||
|
||||
(defun md4tj-list-to-tuple-list (list)
|
||||
|
@ -226,7 +209,7 @@
|
|||
(insert (with-current-buffer inbuf (md4tj-head)))
|
||||
(insert (md4tj-begin-tag "body"))
|
||||
(while (with-current-buffer inbuf (< (point) (point-max)))
|
||||
(setq line (with-current-buffer inbuf (getline)))
|
||||
(setq line (with-current-buffer inbuf (md4tj-util-getline)))
|
||||
(setq fullstate (md4tj-next-state line (nth 1 fullstate)))
|
||||
;; Insert next line(s) into output file
|
||||
(insert (concat (md4tj-convert-line-to-html line fullstate) "\n"))
|
||||
|
@ -245,7 +228,7 @@
|
|||
(insert-file-contents mdfile)
|
||||
(goto-char (point-min))
|
||||
(while (< (point) (point-max))
|
||||
(setq line (getline))
|
||||
(setq line (md4tj-util-getline))
|
||||
(setq fullstate (md4tj-next-state line (nth 1 fullstate)))
|
||||
(setq acc (concat acc (md4tj-convert-line-to-html line fullstate) "\n"))
|
||||
(forward-line))
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
@@RSSENABLE
|
||||
@@RSSCHANNELtitle RSS Test
|
||||
@@RSSCHANNELlink http://example.com
|
||||
@@RSSCHANNELdescription An example blog for testing RSS capability of md4tj.
|
||||
@@RSSCHANNELlanguage en-US
|
||||
@@RSSCHANNELpubDate Tue, 10 Jun 2003 04:00:00 GMT
|
||||
@@RSSCHANNELlastBuildDate Tue, 10 Jun 2003 04:00:00 GMT
|
||||
@@RSSCHANNELdocs https://www.rssboard.org/rss-specification
|
||||
@@RSSCHANNELmanagingEditor editor@example.com
|
||||
@@RSSCHANNELwebMaster webmaster@example.com
|
||||
|
||||
@@BLOGENABLE
|
||||
@@BLOGBASEURL ./blog/
|
||||
@@BLOGBASEDIR ./blog/
|
||||
|
||||
@@BLOGPOST blogpost1
|
||||
@@BLOGPOST blogpost2
|
Loading…
Reference in New Issue