aboutsummaryrefslogtreecommitdiff
path: root/wiki-markup.el
diff options
context:
space:
mode:
authorYuchen Pei <id@ypei.org>2023-07-10 15:42:32 +1000
committerYuchen Pei <id@ypei.org>2023-07-10 15:42:32 +1000
commitfe1ec403c9661a09171ffada42d6e4d1c897295f (patch)
treef9acaf9546e8d8a0acb8922f1755c9c5d735dc1b /wiki-markup.el
parentee05d3e0f77c16155e145f95a6c3099e7d7bdaf8 (diff)
Fixing external links
Diffstat (limited to 'wiki-markup.el')
-rw-r--r--wiki-markup.el69
1 files changed, 41 insertions, 28 deletions
diff --git a/wiki-markup.el b/wiki-markup.el
index d146c18..e0926da 100644
--- a/wiki-markup.el
+++ b/wiki-markup.el
@@ -30,13 +30,13 @@
(defvar wiki-url-regexp "https?://[^ ]+")
(defvar wiki-external-link-re
- (rx (seq "[["
+ (rx (seq "["
(group (seq "http"
(opt "s")
"://"
(+ (not " "))))
(opt (seq " " (group (+? anything))))
- "]]")))
+ "]")))
(defvar wiki-internal-link-re
(rx (seq "[["
@@ -50,31 +50,31 @@
)
(defvar wiki-font-lock-keywords
- (list
- ;; Headers
- (cons "^======.*======\\ *$" 'wiki-level-6)
- (cons "^=====.*=====\\ *$" 'wiki-level-5)
- (cons "^====.*====\\ *$" 'wiki-level-4)
- (cons "^===.*===\\ *$" 'wiki-level-3)
- (cons "^==.*==\\ *$" 'wiki-level-2)
- (cons "^=.*=\\ *$" 'wiki-level-1)
- (cons "^----+\\ *$" 'wiki-hr-face)
-
- (cons "^ .*$" 'wiki-pre-face)
- '(wiki-do-emphasis-faces)
- '(wiki-activate-external-links)
- '(wiki-activate-internal-links)
- ))
+ '(;; Headers
+ ("^======.*======\\ *$" . wiki-level-6)
+ ("^=====.*=====\\ *$" . wiki-level-5)
+ ("^====.*====\\ *$" . wiki-level-4)
+ ("^===.*===\\ *$" . wiki-level-3)
+ ("^==.*==\\ *$" . wiki-level-2)
+ ("^=.*=\\ *$" . wiki-level-1)
+ ("^----+\\ *$" . wiki-hr-face)
+
+ ;; Comments
+ ("<!-- \\([^->]\\|>\\|-\\([^-]\\|-[^>]\\)\\)*-->" . wiki-comment)
+
+ ("^ .*$" . wiki-pre-face)
+ (wiki-do-emphasis-faces)
+ (wiki-activate-external-links)
+ (wiki-activate-internal-links)
+ ))
(defvar wiki-outline-regexp "=+.*=+\ *$")
-(defvar wiki-mode-hook '(wiki-guess-site))
-
(defvar-local wiki-site nil
"The identifier of the wiki site")
(defun wiki-follow-wikilink-action (data)
"Button action to follow a wikilink"
- (funcall (wiki-site-fetcher wiki-site) (alist-get 'title data)))
+ (funcall (wiki-site-fetcher wiki-site) (alist-get 'target data)))
(defun wiki-guess-site ()
"Guess the wiki-site from the default directory."
@@ -105,7 +105,7 @@
))))
;; Like `org-activate-links'
-(defun wiki-activate-links (link-re limit)
+(defun wiki-activate-links (link-re type limit)
(save-excursion
(goto-char (point-min))
(while (re-search-forward link-re limit t)
@@ -115,13 +115,16 @@
(target-end (match-end 1))
(label-start (or (match-beginning 2) (match-beginning 1)))
(label-end (or (match-end 2) (match-end 1)))
- (title (buffer-substring-no-properties (match-beginning 1)
- (match-end 1)))
+ (target (buffer-substring-no-properties (match-beginning 1)
+ (match-end 1)))
)
(put-text-property start label-start 'invisible t)
(make-text-button start end
- 'action 'wiki-follow-wikilink-action
- 'button-data `((title . ,title)))
+ 'action
+ (if (eq type 'internal)
+ 'wiki-follow-wikilink-action
+ 'wiki-browse-url-action)
+ 'button-data `((target . ,target)))
(put-text-property start end 'help-echo
(format "LINK: %s"
(buffer-substring-no-properties
@@ -134,11 +137,14 @@
'(rear-nonsticky (invisible)))
))))
+(defun wiki-browse-url-action (data)
+ (browse-url (alist-get 'target data)))
+
(defun wiki-activate-internal-links (limit)
- (wiki-activate-links wiki-internal-link-re limit))
+ (wiki-activate-links wiki-internal-link-re 'internal limit))
(defun wiki-activate-external-links (limit)
- (wiki-activate-links wiki-external-link-re limit))
+ (wiki-activate-links wiki-external-link-re 'external limit))
(define-derived-mode wiki-mode outline-mode "Wiki"
"A wikitext mode."
@@ -148,7 +154,7 @@
(setq-local font-lock-defaults
'(wiki-font-lock-keywords
- t
+ nil
nil
nil
(font-lock-extra-managed-props
@@ -156,6 +162,11 @@
button htmlize-link help-echo)))
(setq-local outline-regexp wiki-outline-regexp)
(setq-local outline-level 'wiki-outline-level)
+ ;; We have to do this again because `outline-mode' used the default
+ ;; `outline-regexp'.
+ (setq-local imenu-generic-expression
+ (list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0))
+ imenu-space-replacement nil)
)
(defun set-wiki-site (wiki-site)
@@ -164,5 +175,7 @@
(mapcar 'car wiki-sites))))
(setq-local wiki-site (intern wiki-site)))
+(add-hook 'wiki-mode-hook 'wiki-guess-site)
+
(provide 'wiki-markup)
;;; wiki-markup.el ends here