From 41a0f2fa9ee42c686f583ef06afd67411b283dba Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Tue, 25 Jun 2013 09:05:46 +0200 Subject: [PATCH] ox-odt: Links to headlines are more consistent with other back-ends * lisp/ox-odt.el (org-odt-link): Fuzzy links to an headline with a description always use that description, even if the description is the same as the headline title. Reported by Georg Lehner. --- lisp/ox-odt.el | 103 +++++++++++++++++++++++++++------------------------------ 1 file changed, 49 insertions(+), 54 deletions(-) diff --git a/lisp/ox-odt.el b/lisp/ox-odt.el index a2a28f86a..bb1ebbf0b 100644 --- a/lisp/ox-odt.el +++ b/lisp/ox-odt.el @@ -2785,63 +2785,58 @@ INFO is a plist holding contextual information. See ;; Links pointing to a headline: Find destination and build ;; appropriate referencing command. ((member type '("custom-id" "fuzzy" "id")) - (let* ((destination (if (string= type "fuzzy") - (org-export-resolve-fuzzy-link link info) - (org-export-resolve-id-link link info)))) - (or - ;; Case 1: Fuzzy link points nowhere. - (when (null (org-element-type destination)) + (let ((destination (if (string= type "fuzzy") + (org-export-resolve-fuzzy-link link info) + (org-export-resolve-id-link link info)))) + (case (org-element-type destination) + ;; Case 1: Fuzzy link points nowhere. + ('nil (format "%s" - "Emphasis" (or desc (org-export-data - (org-element-property - :raw-link link) info)))) - ;; Case 2: Fuzzy link points to an invisible target. Strip it. - (when (eq (org-element-type destination) 'keyword) "") - ;; Case 3: LINK points to a headline. - (when (eq (org-element-type destination) 'headline) - ;; Case 3.1: LINK has a custom description that is - ;; different from headline's title. Create a hyperlink. - (when (and desc - (let ((link-desc (org-element-contents link))) - (not (string= (org-element-interpret-data link-desc) - (org-element-property :raw-value - destination))))) - (let* ((headline-no (org-export-get-headline-number - destination info)) - (label (format "sec-%s" (mapconcat 'number-to-string - headline-no "-")))) - (format "%s" - label desc)))) - ;; Case 4: LINK points to an Inline image, Math formula or a Table. - (let ((label-reference (ignore-errors (org-odt-format-label - destination info 'reference)))) - (when label-reference - (cond - ;; Case 4.1: LINK has no description. Create a - ;; cross-reference showing entity's sequence number. - ((not desc) label-reference) - ;; Case 4.2: LINK has description. Insert a hyperlink - ;; with user-provided description. - (t (let* ((caption-from (case (org-element-type destination) - (link (org-export-get-parent-element - destination)) - (t destination))) - ;; Get label and caption. - (label (org-element-property :name caption-from))) - (format "%s" - (org-export-solidify-link-text label) desc)))))) - ;; Case 5: Fuzzy link points to a TARGET. - (when (eq (org-element-type destination) 'target) - ;; Case 5.1: LINK has description. Create a hyperlink. - (when desc + "Emphasis" + (or desc + (org-export-data (org-element-property :raw-link link) + info)))) + ;; Case 2: Fuzzy link points to a headline. + (headline + ;; If there's a description, create a hyperlink. + ;; Otherwise, try to provide a meaningful description. + (if (not desc) (org-odt-link--infer-description destination info) + (let* ((headline-no + (org-export-get-headline-number destination info)) + (label + (format "sec-%s" + (mapconcat 'number-to-string headline-no "-")))) + (format + "%s" + label desc)))) + ;; Case 3: Fuzzy link points to a target. + (target + ;; If there's a description, create a hyperlink. + ;; Otherwise, try to provide a meaningful description. + (if (not desc) (org-odt-link--infer-description destination info) (let ((label (org-element-property :value destination))) (format "%s" - (org-export-solidify-link-text label) desc)))) - ;; LINK has no description. It points to either a HEADLINE or - ;; an ELEMENT with a #+NAME: LABEL attached to it. LINK to - ;; DESTINATION, but make a best effort to provide - ;; a *meaningful* description. - (org-odt-link--infer-description destination info)))) + (org-export-solidify-link-text label) + desc)))) + ;; Case 4: Fuzzy link points to some element (e.g., an + ;; inline image, a math formula or a table). + (otherwise + (let ((label-reference + (ignore-errors (org-odt-format-label + destination info 'reference)))) + (cond ((not label-reference) + (org-odt-link--infer-description destination info)) + ;; LINK has no description. Create + ;; a cross-reference showing entity's sequence + ;; number. + ((not desc) label-reference) + ;; LINK has description. Insert a hyperlink with + ;; user-provided description. + (t + (let ((label (org-element-property :name destination))) + (format "%s" + (org-export-solidify-link-text label) + desc))))))))) ;; Coderef: replace link with the reference name or the ;; equivalent line number. ((string= type "coderef") -- 2.11.4.GIT