浏览代码

org-e-odt.el: Handle links to headline, table etc that have a description

Jambunathan K 12 年之前
父节点
当前提交
d06f326f20
共有 1 个文件被更改,包括 57 次插入43 次删除
  1. 57 43
      contrib/lisp/org-e-odt.el

+ 57 - 43
contrib/lisp/org-e-odt.el

@@ -2160,13 +2160,20 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
 	      (setq label (or label (format  "%s-%s" default-category seqno)))
 	      (setq label (org-export-solidify-link-text label))
 	      (cons
-	       (format-spec
-		(cadr (assoc-string label-style org-e-odt-label-styles t))
-		`((?e . ,category)
-		  (?n . ,(format
-			  "<text:sequence text:ref-name=\"%s\" text:name=\"%s\" text:formula=\"ooow:%s+1\" style:num-format=\"1\">%s</text:sequence>"
-			  label counter counter seqno))
-		  (?c . ,(or caption ""))))
+	       (concat
+		;; Sneak in a bookmark.  The bookmark is used when the
+		;; labeled element is referenced with a link that
+		;; provides it's own description.
+		(format "\n<text:bookmark text:name=\"%s\"/>" label)
+		;; Label definition: Typically formatted as below:
+		;;     CATEGORY SEQ-NO: LONG CAPTION
+		(format-spec
+		 (cadr (assoc-string label-style org-e-odt-label-styles t))
+		 `((?e . ,category)
+		   (?n . ,(format
+			   "<text:sequence text:ref-name=\"%s\" text:name=\"%s\" text:formula=\"ooow:%s+1\" style:num-format=\"1\">%s</text:sequence>"
+			   label counter counter seqno))
+		   (?c . ,(or caption "")))))
 	       short-caption))
 	    ;; Case 2: Handle Label reference.
 	    (reference
@@ -2178,7 +2185,7 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
 	       (format "<text:sequence-ref text:reference-format=\"%s\" text:ref-name=\"%s\">%s</text:sequence-ref>"
 		       fmt1 label (format-spec fmt2 `((?e . ,category)
 						      (?n . ,seqno))))))
-	    (t (error "Unknow %S on label" op))))))))
+	    (t (error "Unknown %S on label" op))))))))
 
 
 ;;;; Links :: Inline Images
@@ -2665,25 +2672,26 @@ INFO is a plist holding contextual information.  See
 		  (label (format "sec-%s" (mapconcat 'number-to-string
 						     headline-no "-"))))
 	     (cond
-	      ;; Case 1: Headline is numbered and LINK has no
-	      ;; description or LINK's description matches headline's
-	      ;; title.  Display section number.
-	      ((and (org-export-numbered-headline-p destination info)
-		    (or (not desc) (string= desc (org-element-property
-						  :raw-value destination))))
-	       (format
-		"<text:bookmark-ref text:reference-format=\"chapter\" text:ref-name=\"OrgXref.%s\">%s</text:bookmark-ref>"
-		label (mapconcat 'number-to-string headline-no ".")))
-	      ;; Case 2: Either the headline is un-numbered or
-	      ;; LINK has a custom description.  Display LINK's
-	      ;; description or headline's title.
-	      (t
-	       (let ((desc (or desc (org-export-data
-				     (org-element-property :title destination)
-				     info))))
-		 (format
-		  "<text:bookmark-ref text:reference-format=\"text\" text:ref-name=\"OrgXref.%s\">%s</text:bookmark-ref>"
-		  label desc))))))
+	      ;; Case 1: LINK has a custom description that is
+	      ;; different from headline's title.  Create a hyperlink
+	      ;; that display LINK's description.
+	      ((and desc
+		    (let ((link-desc (org-element-contents link)))
+		      (not (string=
+			    (org-element-interpret-data link-desc)
+			    (org-element-property :raw-value destination))))
+		    (format "<text:a xlink:type=\"simple\" xlink:href=\"#%s\">%s</text:a>"
+			    label desc)))
+	      ;; Case 2: LINK has no custom description and HEADLINE
+	      ;; is numbered.  Display section number.
+	      ((org-export-numbered-headline-p destination info)
+	       (format "<text:bookmark-ref text:reference-format=\"chapter\" text:ref-name=\"OrgXref.%s\">%s</text:bookmark-ref>"
+		       label (mapconcat 'number-to-string headline-no ".")))
+	      ;; Case 3: LINK has no custom descripiton and HEADLINE
+	      ;; is un-numbered.  Display headline's title.
+	      (t (let ((title (org-element-property :title destination)))
+		   (format "<text:bookmark-ref text:reference-format=\"text\" text:ref-name=\"OrgXref.%s\">%s</text:bookmark-ref>"
+			   label (org-export-data title info)))))))
 	  ;; Fuzzy link points to a target.  Do as above.
 	  (target
 	   ;; Identify nearest meaningful container
@@ -2703,26 +2711,32 @@ INFO is a plist holding contextual information.  See
 		  (format
 		   "<text:bookmark-ref text:reference-format=\"number-all-superior\" text:ref-name=\"OrgXref.%s\">%s</text:bookmark-ref>"
 		   (org-export-solidify-link-text path)
-
 		   (mapconcat 'number-to-string
 			      (org-e-odt-resolve-numbered-paragraph
 			       container info) ".")))))))
 	  (otherwise
-	   ;; (unless desc
-	   ;;   (setq number (cond
-	   ;; 		   ((org-e-odt--standalone-link-p destination info)
-	   ;; 		    (org-export-get-ordinal
-	   ;; 		     (assoc 'link (org-element-contents destination))
-	   ;; 		     info 'link 'org-e-odt--standalone-link-p))
-	   ;; 		   (t (org-export-get-ordinal destination info))))
-	   ;;   (setq desc (when number
-	   ;; 		  (if (atom number) (number-to-string number)
-	   ;; 		    (mapconcat 'number-to-string number ".")))))
-
-	   (let ((label-reference
-		  (org-e-odt-format-label destination info 'reference)))
-	     (assert label-reference)
-	     label-reference)))))
+	   (let ((label-reference (ignore-errors
+				    (org-e-odt-format-label destination info
+							    'reference))))
+	     (cond
+	      ;; Case 1: Destination is a captioned/enumerated entity.
+	      ;; But LINK has no description.  Display the sequence
+	      ;; number.
+	      ((and label-reference (not desc)) label-reference)
+	      ;; Case 2: Destination is a captioned/enumerated entity
+	      ;; and LINK has description.  Insert a cross-reference
+	      ;; with user-provided description.
+	      (label-reference
+	       (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 3: Link is ending up in a no-man's land.
+	      (t (error "FIXME:  Link to no-man's land."))))))))
      ;; Coderef: replace link with the reference name or the
      ;; equivalent line number.
      ((string= type "coderef")