From fe1ec403c9661a09171ffada42d6e4d1c897295f Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Mon, 10 Jul 2023 15:42:32 +1000 Subject: Fixing external links --- wiki-markup.el | 69 ++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 28 deletions(-) (limited to 'wiki-markup.el') 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 -- cgit v1.2.3