From 7c854cf6fa8f82f01768db048fa37c69a446cc60 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Mon, 10 Jul 2023 18:05:27 +1000 Subject: Start adding template markup rendering Not working yet --- wiki-faces.el | 6 +++++ wiki-markup.el | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 80 insertions(+), 11 deletions(-) diff --git a/wiki-faces.el b/wiki-faces.el index b7d0783..f0ea4a6 100644 --- a/wiki-faces.el +++ b/wiki-faces.el @@ -108,5 +108,11 @@ (defvar wiki-comment 'wiki-comment "Wiki comment face") +(defface wiki-special-keyword '((t :inherit org-special-keyword)) + "Wiki special keyword face") + +(defvar wiki-special-keyword 'wiki-special-keyword + "Wiki special keyword face") + (provide 'wiki-faces) ;;; wiki-faces.el ends here diff --git a/wiki-markup.el b/wiki-markup.el index e0926da..2993a56 100644 --- a/wiki-markup.el +++ b/wiki-markup.el @@ -27,7 +27,7 @@ ;;; Code: (require 'wiki-faces) -(defvar wiki-url-regexp "https?://[^ ]+") +(defvar wiki-url-re "https?://[^ |}]+") (defvar wiki-external-link-re (rx (seq "[" @@ -62,13 +62,18 @@ ;; Comments ("" . wiki-comment) + ;; Templates + ("{{}}") + ("^ .*$" . wiki-pre-face) (wiki-do-emphasis-faces) + ;; (wiki-set-template-face) (wiki-activate-external-links) (wiki-activate-internal-links) + (wiki-activate-raw-links) )) -(defvar wiki-outline-regexp "=+.*=+\ *$") +(defvar wiki-outline-re "=+.*=+\ *$") (defvar-local wiki-site nil "The identifier of the wiki site") @@ -77,14 +82,17 @@ (funcall (wiki-site-fetcher wiki-site) (alist-get 'target data))) (defun wiki-guess-site () - "Guess the wiki-site from the default directory." - (setq-local wiki-site - (let ((guessed - (intern (file-name-base - (directory-file-name default-directory))))) - (if (alist-get guessed wiki-sites) - guessed - 'local))) + "Guess `wiki-site' from the default directory. + +This can be overriden with .dir-locals.el." + (unless wiki-site + (setq-local wiki-site + (let ((guessed + (intern (file-name-base + (directory-file-name default-directory))))) + (if (alist-get guessed wiki-sites) + guessed + 'local)))) ) (defun wiki-outline-level () @@ -93,6 +101,58 @@ (length (match-string 2)) 6))) +(defun wiki-set-template-face (limit) + "Set template faces." + (while (search-forward "{{" limit t) + (save-excursion + (let* ((name-start (point)) + (visible-start name-start) + (start (progn (backward-char 2) (point))) + (end (progn (forward-sexp) (point))) + (visible-end (- end 2)) + (name-end (progn + (goto-char name-start) + (if (search-forward "|" visible-end t) + (1- (point)) + visible-end)))) + (put-text-property start visible-start 'invisible t) + (put-text-property visible-end end 'invisible t) + (add-face-text-property name-start name-end 'wiki-special-keyword) + (goto-char name-end) + (while (looking-at "|") + (wiki-do-one-template-arg visible-end)) + ) + ) + )) + +;; We assume the arg name cannot contain (nested) templates +(defun wiki-do-one-template-arg (limit) + (let ((found (re-search-forward "|\\ *\\([^|= \t\n]+\\ *[=|]\\)" + limit 'move)) + (name-start (match-beginning 1)) + (name-end (match-end 1))) + (add-face-text-property name-start name-end 'wiki-special-keyword) + (when found + (while (and (not (progn (backward-char 1) (looking-at "|"))) + (progn (forward-char 1) + (re-search-forward "\\({{\\|\\[\\[\\||\\)" + limit t))) + (setq found (match-string 1)) + (pcase found + ;; A nested template in arg value, gotta recurse + ("{{" + (backward-char 2) + (let ((right-bound + (save-excursion (forward-sexp) (point)))) + (wiki-set-template-face right-bound))) + ;; A link is found, leave it alone and skip over + ("[[" + (backward-char 2) + (forward-sexp)) + ;; Do nothing + ("|"))))) + ) + ;; Like `org-do-emphasis-faces' (defun wiki-do-emphasis-faces (limit) (while (re-search-forward "\\(''+\\)[^ \t\n].*?[^ \t\n']\\(''+\\)" limit t) @@ -146,6 +206,9 @@ (defun wiki-activate-external-links (limit) (wiki-activate-links wiki-external-link-re 'external limit)) +(defun wiki-activate-raw-links (limit) + (wiki-activate-links (format "\\(%s\\)" wiki-url-re) 'external limit)) + (define-derived-mode wiki-mode outline-mode "Wiki" "A wikitext mode." @@ -160,7 +223,7 @@ (font-lock-extra-managed-props invisible font-lock-face button-data action category button htmlize-link help-echo))) - (setq-local outline-regexp wiki-outline-regexp) + (setq-local outline-regexp wiki-outline-re) (setq-local outline-level 'wiki-outline-level) ;; We have to do this again because `outline-mode' used the default ;; `outline-regexp'. -- cgit v1.2.3