aboutsummaryrefslogtreecommitdiff
path: root/wiki-markup.el
diff options
context:
space:
mode:
authorYuchen Pei <id@ypei.org>2023-07-10 18:05:27 +1000
committerYuchen Pei <id@ypei.org>2023-07-10 18:05:27 +1000
commit7c854cf6fa8f82f01768db048fa37c69a446cc60 (patch)
treeef5d2d2f7c21398da5af9adf6e28a25005725fce /wiki-markup.el
parentfe1ec403c9661a09171ffada42d6e4d1c897295f (diff)
Start adding template markup rendering
Not working yet
Diffstat (limited to 'wiki-markup.el')
-rw-r--r--wiki-markup.el85
1 files changed, 74 insertions, 11 deletions
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'.