summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2013-06-25 09:05:46 +0200
committerNicolas Goaziou <n.goaziou@gmail.com>2013-06-25 09:05:46 +0200
commit41a0f2fa9ee42c686f583ef06afd67411b283dba (patch)
tree7e052832d3e467d3c9a57ff6d4184ee3941f4451
parentb4f90c687d647e401e59e0dba88042d410105e51 (diff)
downloadorg-mode-41a0f2fa9ee42c686f583ef06afd67411b283dba.tar.gz
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.
-rw-r--r--lisp/ox-odt.el103
1 files changed, 49 insertions, 54 deletions
diff --git a/lisp/ox-odt.el b/lisp/ox-odt.el
index a2a28f8..bb1ebbf 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 "<text:span text:style-name=\"%s\">%s</text:span>"
- "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 "<text:a xlink:type=\"simple\" xlink:href=\"#%s\">%s</text:a>"
- 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 "<text:a xlink:type=\"simple\" xlink:href=\"#%s\">%s</text:a>"
- (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
+ "<text:a xlink:type=\"simple\" xlink:href=\"#%s\">%s</text:a>"
+ 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 "<text:a xlink:type=\"simple\" xlink:href=\"#%s\">%s</text:a>"
- (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 "<text:a xlink:type=\"simple\" xlink:href=\"#%s\">%s</text:a>"
+ (org-export-solidify-link-text label)
+ desc)))))))))
;; Coderef: replace link with the reference name or the
;; equivalent line number.
((string= type "coderef")