diff options
| author | Yuchen Pei <id@ypei.org> | 2023-07-10 15:42:32 +1000 | 
|---|---|---|
| committer | Yuchen Pei <id@ypei.org> | 2023-07-10 15:42:32 +1000 | 
| commit | fe1ec403c9661a09171ffada42d6e4d1c897295f (patch) | |
| tree | f9acaf9546e8d8a0acb8922f1755c9c5d735dc1b | |
| parent | ee05d3e0f77c16155e145f95a6c3099e7d7bdaf8 (diff) | |
Fixing external links
| -rw-r--r-- | wiki-faces.el | 4 | ||||
| -rw-r--r-- | wiki-markup.el | 69 | 
2 files changed, 45 insertions, 28 deletions
diff --git a/wiki-faces.el b/wiki-faces.el index d58ded7..b7d0783 100644 --- a/wiki-faces.el +++ b/wiki-faces.el @@ -104,5 +104,9 @@  (defvar wiki-link 'wiki-link "Wiki link face") +(defface wiki-comment '((t :inherit font-lock-comment-face)) "Wiki comment face") + +(defvar wiki-comment 'wiki-comment "Wiki comment face") +  (provide 'wiki-faces)  ;;; wiki-faces.el ends here 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  | 
