branch: externals/org
commit e77ccd504667b3efc304a707ca53fefa97460380
Author: Ian Martins <ia...@jhu.edu>
Commit: Ihor Radchenko <yanta...@posteo.net>

    ox-md.el: New option `org-md-link-org-files-as-md'
    
    * lisp/org-md.el: Define `org-md-link-org-files-as-md' and add an
    entry to `:options-alist'.
    (org-md-link): Disable mapping of linked org files to md during export
    to Markdown.
    * testing/lisp/text-ox-md.el: Add tests.
---
 etc/ORG-NEWS               |  6 ++++++
 lisp/ox-md.el              | 28 +++++++++++++++++++++++-----
 testing/lisp/test-ox-md.el | 29 +++++++++++++++++++++++++++++
 3 files changed, 58 insertions(+), 5 deletions(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 43ef7fd2de..cd1a4cb9ad 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -356,6 +356,12 @@ This option makes ~org-cite~'s ~basic~ insert processor use
 It can also be set to dynamically compute ~crm-separator~ so that the
 separator does not appear in completion candidates.
 
+*** New Option ~org-md-link-org-files-as-md~
+
+This option makes it possible to disable mapping of linked org files
+to markdown during export to Markdown. This is analogous to how
+~org-html-link-org-files-as-html~ works in export to HTML.
+
 ** New functions and changes in function arguments
 
 # This also includes changes in function behavior from Elisp perspective.
diff --git a/lisp/ox-md.el b/lisp/ox-md.el
index 0aa0970338..0f621851d5 100644
--- a/lisp/ox-md.el
+++ b/lisp/ox-md.el
@@ -93,6 +93,21 @@ headings for its own use."
   ;; Avoid `natnum' because that's not available until Emacs 28.1.
   :type 'integer)
 
+(defcustom org-md-link-org-files-as-md t
+  "Non-nil means make file links to \"file.org\" point to \"file.md\".
+
+When Org mode is exporting an Org file to markdown, links to
+non-markdown files are directly put into a \"href\" tag in
+markdown.  However, links to other Org files \(recognized by the
+extension \".org\") should become links to the corresponding
+markdown file, assuming that the linked Org file will also be
+converted to markdown.
+
+When nil, the links still point to the plain \".org\" file."
+  :group 'org-export-md
+  :package-version '(Org . "9.8")
+  :type 'boolean)
+
 
 
 ;;; Define Backend
@@ -144,7 +159,8 @@ headings for its own use."
   '((:md-footnote-format nil nil org-md-footnote-format)
     (:md-footnotes-section nil nil org-md-footnotes-section)
     (:md-headline-style nil nil org-md-headline-style)
-    (:md-toplevel-hlevel nil nil org-md-toplevel-hlevel)))
+    (:md-toplevel-hlevel nil nil org-md-toplevel-hlevel)
+    (:md-link-org-files-as-md nil nil org-md-link-org-files-as-md)))
 
 
 ;;; Filters
@@ -540,17 +556,19 @@ channel."
 DESC is the description part of the link, or the empty string.
 INFO is a plist holding contextual information.  See
 `org-export-data'."
-  (let* ((link-org-files-as-md
+  (let* ((link-org-files-as-md-maybe
          (lambda (raw-path)
            ;; Treat links to `file.org' as links to `file.md'.
-           (if (string= ".org" (downcase (file-name-extension raw-path ".")))
+           (if (and
+                (plist-get info :md-link-org-files-as-md)
+                (string= ".org" (downcase (file-name-extension raw-path "."))))
                (concat (file-name-sans-extension raw-path) ".md")
              raw-path)))
         (type (org-element-property :type link))
         (raw-path (org-element-property :path link))
         (path (cond
                ((string-equal  type "file")
-                (org-export-file-uri (funcall link-org-files-as-md raw-path)))
+                (org-export-file-uri (funcall link-org-files-as-md-maybe 
raw-path)))
                (t (concat type ":" raw-path)))))
     (cond
      ;; Link type is handled by a special function.
@@ -561,7 +579,7 @@ INFO is a plist holding contextual information.  See
                           (org-export-resolve-id-link link info))))
        (pcase (org-element-type destination)
          (`plain-text                  ; External file.
-          (let ((path (funcall link-org-files-as-md destination)))
+          (let ((path (funcall link-org-files-as-md-maybe destination)))
             (if (not desc) (format "<%s>" path)
               (format "[%s](%s)" desc path))))
          (`headline
diff --git a/testing/lisp/test-ox-md.el b/testing/lisp/test-ox-md.el
index dd2128a095..8f5b473d16 100644
--- a/testing/lisp/test-ox-md.el
+++ b/testing/lisp/test-ox-md.el
@@ -101,5 +101,34 @@
         (should (search-forward "10. item"))
         (should (search-forward "101. item"))))))
 
+(ert-deftest ox-md/link-org-mapping-enabled ()
+  "Test `org-md-link' with org to md link mapping enabled."
+(org-test-with-temp-text "
+[[file:examples/babel.org][babel org file]]
+[[file:examples/babel.el][babel script]]
+"
+    (let ((export-buffer "*Test MD Export*")
+          (org-export-show-temporary-export-buffer nil))
+      (org-export-to-buffer 'md export-buffer)
+      (with-current-buffer export-buffer
+        (goto-char (point-min))
+        (should (search-forward "[babel org file](examples/babel.md)"))
+        (should (search-forward "[babel script](examples/babel.el)"))))))
+
+(ert-deftest ox-md/link-org-mapping-disabled ()
+  "Test `org-md-link' with org link to md link mapping disabled."
+(org-test-with-temp-text "
+[[file:examples/babel.org][babel org file]]
+[[file:examples/babel.el][babel script]]
+"
+    (let ((export-buffer "*Test MD Export*")
+          (org-export-show-temporary-export-buffer nil)
+          (org-md-link-org-files-as-md nil))
+      (org-export-to-buffer 'md export-buffer)
+      (with-current-buffer export-buffer
+        (goto-char (point-min))
+        (should (search-forward "[babel org file](examples/babel.org)"))
+        (should (search-forward "[babel script](examples/babel.el)"))))))
+
 (provide 'test-ox-md)
 ;;; test-ox-md.el ends here

Reply via email to