branch: elpa/markdown-mode
commit 360abf5ff51b99a07d7ecde53b88090428f77acd
Author: Joe Reinhart <[email protected]>
Commit: Joe Reinhart <[email protected]>
Reintroduce public functions that had been removed
---
markdown-mode.el | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 118 insertions(+)
diff --git a/markdown-mode.el b/markdown-mode.el
index 063df8ed40..ba220d63a2 100644
--- a/markdown-mode.el
+++ b/markdown-mode.el
@@ -3395,6 +3395,23 @@ the buffer)."
(defun markdown-match-yaml-metadata-key (last)
(markdown-match-propertized-text 'markdown-metadata-key last))
+(defun markdown-match-wiki-link (last)
+ "Match wiki links from point to LAST."
+ (when (and markdown-enable-wiki-links
+ (not markdown-wiki-link-fontify-missing)
+ (markdown-match-inline-generic markdown-regex-wiki-link last))
+ (let ((begin (match-beginning 1)) (end (match-end 1)))
+ (if (or (markdown-in-comment-p begin)
+ (markdown-in-comment-p end)
+ (markdown-inline-code-at-pos-p begin)
+ (markdown-inline-code-at-pos-p end)
+ (markdown-code-block-at-pos begin))
+ (progn (goto-char (min (1+ begin) last))
+ (when (< (point) last)
+ (markdown-match-wiki-link last)))
+ (set-match-data (list begin end))
+ t))))
+
(defun markdown-match-inline-attributes (last)
"Match inline attributes from point to LAST."
;; #428 re-search-forward markdown-regex-inline-attributes is very slow.
@@ -8510,6 +8527,39 @@ See `markdown-wiki-link-p' and
`markdown-follow-wiki-link'."
(markdown-follow-wiki-link (markdown-wiki-link-link) arg)
(user-error "Point is not at a Wiki Link")))
+(defun markdown-highlight-wiki-link (from to face)
+ "Highlight the wiki link in the region between FROM and TO using FACE."
+ (put-text-property from to 'font-lock-face face))
+
+(defun markdown-unfontify-region-wiki-links (from to)
+ "Remove wiki link faces from the region specified by FROM and TO."
+ (interactive "*r")
+ (let ((modified (buffer-modified-p)))
+ (remove-text-properties from to '(font-lock-face markdown-link-face))
+ (remove-text-properties from to '(font-lock-face
markdown-missing-link-face))
+ ;; remove-text-properties marks the buffer modified in emacs 24.3,
+ ;; undo that if it wasn't originally marked modified
+ (set-buffer-modified-p modified)))
+
+(defun markdown-fontify-region-wiki-links (from to)
+ "Search region given by FROM and TO for wiki links and fontify them.
+If a wiki link is found check to see if the backing file exists
+and highlight accordingly."
+ (goto-char from)
+ (save-match-data
+ (while (re-search-forward markdown-regex-wiki-link to t)
+ (when (not (markdown-code-block-at-point-p))
+ (let ((highlight-beginning (match-beginning 1))
+ (highlight-end (match-end 1))
+ (file-name
+ (markdown-convert-wiki-link-to-filename
+ (markdown-wiki-link-link))))
+ (if (condition-case nil (file-exists-p file-name) (error nil))
+ (markdown-highlight-wiki-link
+ highlight-beginning highlight-end 'markdown-link-face)
+ (markdown-highlight-wiki-link
+ highlight-beginning highlight-end
'markdown-missing-link-face)))))))
+
(defun markdown-extend-changed-region (from to)
"Extend region given by FROM and TO so that we can fontify all links.
The region is extended to the first newline before and the first
@@ -8528,6 +8578,50 @@ newline after."
(setq new-to (point)))
(cl-values new-from new-to)))
+(defun markdown-check-change-for-wiki-link (from to)
+ "Check region between FROM and TO for wiki links and re-fontify as needed."
+ (interactive "*r")
+ (let* ((modified (buffer-modified-p))
+ (buffer-undo-list t)
+ (inhibit-read-only t)
+ deactivate-mark
+ buffer-file-truename)
+ (unwind-protect
+ (save-excursion
+ (save-match-data
+ (save-restriction
+ (cursor-intangible-mode +1) ;; inhibit-point-motion-hooks is
obsoleted since Emacs 29
+ ;; Extend the region to fontify so that it starts
+ ;; and ends at safe places.
+ (cl-multiple-value-bind (new-from new-to)
+ (markdown-extend-changed-region from to)
+ (goto-char new-from)
+ ;; Only refontify when the range contains text with a
+ ;; wiki link face or if the wiki link regexp matches.
+ (when (or (markdown-range-property-any
+ new-from new-to 'font-lock-face
+ '(markdown-link-face markdown-missing-link-face))
+ (re-search-forward
+ markdown-regex-wiki-link new-to t))
+ ;; Unfontify existing fontification (start from scratch)
+ (markdown-unfontify-region-wiki-links new-from new-to)
+ ;; Now do the fontification.
+ (markdown-fontify-region-wiki-links new-from new-to))))))
+ (cursor-intangible-mode -1)
+ (and (not modified)
+ (buffer-modified-p)
+ (set-buffer-modified-p nil)))))
+
+(defun markdown-check-change-for-wiki-link-after-change (from to _)
+ "Check region between FROM and TO for wiki links and re-fontify as needed.
+Designed to be used with the `after-change-functions' hook."
+ (markdown-check-change-for-wiki-link from to))
+
+(defun markdown-fontify-buffer-wiki-links ()
+ "Refontify all wiki links in the buffer."
+ (interactive)
+ (markdown-check-change-for-wiki-link (point-min) (point-max)))
+
(defun markdown-toggle-wiki-links (&optional arg)
"Toggle support for wiki links.
With a prefix argument ARG, enable wiki link support if ARG is positive,
@@ -8542,6 +8636,30 @@ and disable it otherwise."
(if markdown-enable-wiki-links "enabled" "disabled")))
(markdown-reload-extensions))
+(defun markdown-setup-wiki-link-hooks ()
+ "Add or remove hooks for fontifying wiki links.
+These are only enabled when `markdown-wiki-link-fontify-missing' is non-nil."
+ ;; Anytime text changes make sure it gets fontified correctly
+ (if (and markdown-enable-wiki-links
+ markdown-wiki-link-fontify-missing)
+ (add-hook 'after-change-functions
+ #'markdown-check-change-for-wiki-link-after-change t t)
+ (remove-hook 'after-change-functions
+ #'markdown-check-change-for-wiki-link-after-change t))
+ ;; If we left the buffer there is a really good chance we were
+ ;; creating one of the wiki link documents. Make sure we get
+ ;; refontified when we come back.
+ (if (and markdown-enable-wiki-links
+ markdown-wiki-link-fontify-missing)
+ (progn
+ (add-hook 'window-configuration-change-hook
+ #'markdown-fontify-buffer-wiki-links t t)
+ (markdown-fontify-buffer-wiki-links))
+ (remove-hook 'window-configuration-change-hook
+ #'markdown-fontify-buffer-wiki-links t)
+ (markdown-unfontify-region-wiki-links (point-min) (point-max))))
+
+
;;; Following & Doing =========================================================
(defun markdown-follow-thing-at-point (arg)