Browse Source

org-e-odt.el: Merge category strings and short caption changes

Jambunathan K 13 years ago
parent
commit
8cded57cdb
1 changed files with 128 additions and 56 deletions
  1. 128 56
      EXPERIMENTAL/org-e-odt.el

+ 128 - 56
EXPERIMENTAL/org-e-odt.el

@@ -27,12 +27,6 @@
 (eval-when-compile
 (eval-when-compile
   (require 'cl))
   (require 'cl))
 
 
-(defgroup org-export-e-odt nil
-  "Options specific for ODT export of Org-mode files."
-  :tag "Org Export ODT"
-  :group 'org-export
-  :version "24.1")
-
 ;; FIXMES
 ;; FIXMES
 ;; org-e-odt-preprocess-latex-fragments
 ;; org-e-odt-preprocess-latex-fragments
 ;; org-export-as-e-odt-and-open
 ;; org-export-as-e-odt-and-open
@@ -314,7 +308,7 @@ new entry in `org-e-odt-automatic-styles'.  Return (OBJECT-NAME
      col-nos "\n")))
      col-nos "\n")))
 
 
 
 
-(defun org-e-odt-begin-table (caption label attributes)
+(defun org-e-odt-begin-table (caption label attributes short-caption)
   ;; (setq org-e-odt-table-indentedp (not (null org-lparse-list-stack)))
   ;; (setq org-e-odt-table-indentedp (not (null org-lparse-list-stack)))
   (setq org-e-odt-table-indentedp nil)	; FIXME
   (setq org-e-odt-table-indentedp nil)	; FIXME
   (when org-e-odt-table-indentedp
   (when org-e-odt-table-indentedp
@@ -333,11 +327,11 @@ new entry in `org-e-odt-automatic-styles'.  Return (OBJECT-NAME
   (concat
   (concat
    (org-e-odt-format-stylized-paragraph
    (org-e-odt-format-stylized-paragraph
     'table (org-e-odt-format-entity-caption label caption "__Table__"))
     'table (org-e-odt-format-entity-caption label caption "__Table__"))
-   (let ((name-and-style (org-e-odt-add-automatic-style "Table" attributes)))
+   (let ((automatic-name (org-e-odt-add-automatic-style "Table" attributes)))
      (format
      (format
       "\n<table:table table:name=\"%s\" table:style-name=\"%s\">\n"
       "\n<table:table table:name=\"%s\" table:style-name=\"%s\">\n"
-      (car name-and-style) (or (nth 1 org-e-odt-table-style-spec)
-			       (cdr name-and-style) "OrgTable")))
+      (or short-caption (car automatic-name))
+      (or (nth 1 org-e-odt-table-style-spec) (cdr automatic-name) "OrgTable")))
    (org-e-odt-format-table-columns) "\n")
    (org-e-odt-format-table-columns) "\n")
 
 
   ;; (org-e-html-pp  table-info)
   ;; (org-e-html-pp  table-info)
@@ -697,7 +691,7 @@ Update styles.xml with styles that were collected as part of
 			   (org-e-odt-remap-stylenames s)) style "")
 			   (org-e-odt-remap-stylenames s)) style "")
 	      (org-e-odt-remap-stylenames parent-style)))
 	      (org-e-odt-remap-stylenames parent-style)))
 	   (t (error "Don't how to handle style %s"  style)))))
 	   (t (error "Don't how to handle style %s"  style)))))
-    (org-e-odt-format-tags
+    (org-e-odt-format-tags-simple
      '("<text:span text:style-name=\"%s\">" . "</text:span>")
      '("<text:span text:style-name=\"%s\">" . "</text:span>")
      text style-name)))
      text style-name)))
 
 
@@ -713,7 +707,12 @@ Update styles.xml with styles that were collected as part of
 	   (file-name-directory (org-e-odt-copy-formula-file src))))
 	   (file-name-directory (org-e-odt-copy-formula-file src))))
 	 ;; FIXME
 	 ;; FIXME
 	 ;; (caption (org-find-text-property-in-string 'org-caption src))
 	 ;; (caption (org-find-text-property-in-string 'org-caption src))
+	 ;; (short-caption
+	 ;;  (or (org-find-text-property-in-string 'org-caption-shortn src)
+	 ;; 	caption))
 	 ;; (caption (and caption (org-xml-format-desc caption)))
 	 ;; (caption (and caption (org-xml-format-desc caption)))
+	 ;; (short-caption (and short-caption
+	 ;; 		     (org-xml-encode-plain-text short-caption)))
 	 ;; (label (org-find-text-property-in-string 'org-label src))
 	 ;; (label (org-find-text-property-in-string 'org-label src))
 	 ;; (latex-frag (org-find-text-property-in-string 'org-latex-src src))
 	 ;; (latex-frag (org-find-text-property-in-string 'org-latex-src src))
 	 (embed-as (or
 	 (embed-as (or
@@ -743,10 +742,15 @@ Update styles.xml with styles that were collected as part of
 	    )				; FIXME
 	    )				; FIXME
 	(org-e-odt-list-table
 	(org-e-odt-list-table
 	 `((,(org-e-odt-format-entity
 	 `((,(org-e-odt-format-entity
-	      (if caption "CaptionedDisplayFormula" "DisplayFormula")
-	      href width height :caption caption :label nil)
-	    ,(if (not label) ""
-	       (org-e-odt-format-entity-caption label nil "__MathFormula__"))))
+	      (if (not (or caption label)) "DisplayFormula"
+		"CaptionedDisplayFormula")
+	      href width height :caption caption :label label
+	      :short-caption short-caption)
+	    ,(if (not (or caption label)) ""
+	       (let* ((label-props (car org-e-odt-entity-labels-alist)))
+		 (setcar (last label-props) "math-label")
+		 (apply 'org-e-odt-format-label-definition
+			caption label-props)))))
 	 nil nil ":style \"OrgEquation\"" ;; nil '((1 "c" 8) (2 "c" 1)) FIXME
 	 nil nil ":style \"OrgEquation\"" ;; nil '((1 "c" 8) (2 "c" 1)) FIXME
 	 ))
 	 ))
 
 
@@ -883,12 +887,12 @@ ATTR is a string of other attributes of the a element."
   (let ((id (concat  "fn" n))
   (let ((id (concat  "fn" n))
 	(note-class "footnote")
 	(note-class "footnote")
 	(par-style "Footnote"))
 	(par-style "Footnote"))
-    (org-e-odt-format-tags
+    (org-e-odt-format-tags-simple
      '("<text:note text:id=\"%s\" text:note-class=\"%s\">" . "</text:note>")
      '("<text:note text:id=\"%s\" text:note-class=\"%s\">" . "</text:note>")
      (concat
      (concat
       (org-e-odt-format-tags-simple
       (org-e-odt-format-tags-simple
        '("<text:note-citation>" . "</text:note-citation>") n)
        '("<text:note-citation>" . "</text:note-citation>") n)
-      (org-e-odt-format-tags
+      (org-e-odt-format-tags-simple
        '("<text:note-body>" . "</text:note-body>") def))
        '("<text:note-body>" . "</text:note-body>") def))
      id note-class)))
      id note-class)))
 
 
@@ -902,7 +906,7 @@ ATTR is a string of other attributes of the a element."
   (let ((note-class "footnote")
   (let ((note-class "footnote")
 	(ref-format "text")
 	(ref-format "text")
 	(ref-name (concat "fn" n)))
 	(ref-name (concat "fn" n)))
-    (org-e-odt-format-tags
+    (org-e-odt-format-tags-simple
      '("<text:span text:style-name=\"%s\">" . "</text:span>")
      '("<text:span text:style-name=\"%s\">" . "</text:span>")
      (org-e-odt-format-tags-simple
      (org-e-odt-format-tags-simple
       '("<text:note-ref text:note-class=\"%s\" text:reference-format=\"%s\" text:ref-name=\"%s\">" . "</text:note-ref>")
       '("<text:note-ref text:note-class=\"%s\" text:reference-format=\"%s\" text:ref-name=\"%s\">" . "</text:note-ref>")
@@ -927,7 +931,12 @@ ATTR is a string of other attributes of the a element."
 		"<draw:image xlink:href=\"%s\" xlink:type=\"simple\" xlink:show=\"embed\" xlink:actuate=\"onLoad\"/>" ""
 		"<draw:image xlink:href=\"%s\" xlink:type=\"simple\" xlink:show=\"embed\" xlink:actuate=\"onLoad\"/>" ""
 		(org-e-odt-copy-image-file src)))
 		(org-e-odt-copy-image-file src)))
 	 ;; (caption (org-find-text-property-in-string 'org-caption src))
 	 ;; (caption (org-find-text-property-in-string 'org-caption src))
+	 ;; (short-caption
+	 ;;  (or (org-find-text-property-in-string 'org-caption-shortn src)
+	 ;;      caption))
 	 ;; (caption (and caption (org-xml-format-desc caption)))
 	 ;; (caption (and caption (org-xml-format-desc caption)))
+	 ;; (short-caption (and short-caption
+	 ;; 		     (org-xml-encode-plain-text short-caption)))
 	 ;; (attr (org-find-text-property-in-string 'org-attributes src))
 	 ;; (attr (org-find-text-property-in-string 'org-attributes src))
 	 ;; (label (org-find-text-property-in-string 'org-label src))
 	 ;; (label (org-find-text-property-in-string 'org-label src))
 	 ;; (latex-frag (org-find-text-property-in-string
 	 ;; (latex-frag (org-find-text-property-in-string
@@ -966,6 +975,7 @@ ATTR is a string of other attributes of the a element."
       (org-e-odt-format-entity
       (org-e-odt-format-entity
        frame-style-handle href width height
        frame-style-handle href width height
        :caption caption :label label :category category
        :caption caption :label label :category category
+       :short-caption short-caption
        :user-frame-params user-frame-params))))
        :user-frame-params user-frame-params))))
 
 
 (defun org-e-odt-format-object-description (title description)
 (defun org-e-odt-format-object-description (title description)
@@ -1011,7 +1021,7 @@ ATTR is a string of other attributes of the a element."
 
 
 (defun* org-e-odt-format-entity (entity href width height
 (defun* org-e-odt-format-entity (entity href width height
 					&key caption label category
 					&key caption label category
-					user-frame-params)
+					user-frame-params short-caption)
   (let* ((entity-style (assoc-string entity org-e-odt-entity-frame-styles t))
   (let* ((entity-style (assoc-string entity org-e-odt-entity-frame-styles t))
 	 default-frame-params frame-params)
 	 default-frame-params frame-params)
     (cond
     (cond
@@ -1029,7 +1039,15 @@ ATTR is a string of other attributes of the a element."
 	      'illustration
 	      'illustration
 	      (concat
 	      (concat
 	       (apply 'org-e-odt-format-frame href width height
 	       (apply 'org-e-odt-format-frame href width height
-		      (nth 2 entity-style))
+		      (let ((entity-style-1 (copy-sequence
+					     (nth 2 entity-style))))
+			(setcar (cdr entity-style-1)
+				(concat
+				 (cadr entity-style-1)
+				 (and short-caption
+				      (format " draw:name=\"%s\" "
+					      short-caption))))
+			entity-style-1))
 	       (org-e-odt-format-entity-caption
 	       (org-e-odt-format-entity-caption
 		label caption (or category (nth 1 entity-style)))))
 		label caption (or category (nth 1 entity-style)))))
 	     width height frame-params)))))
 	     width height frame-params)))))
@@ -1117,19 +1135,29 @@ ATTR is a string of other attributes of the a element."
 
 
 (defun org-e-odt-add-label-definition (label default-category)
 (defun org-e-odt-add-label-definition (label default-category)
   "Create an entry in `org-e-odt-entity-labels-alist' and return it."
   "Create an entry in `org-e-odt-entity-labels-alist' and return it."
-  (setq label (substring-no-properties label))
   (let* ((label-props (assoc default-category org-e-odt-category-map-alist))
   (let* ((label-props (assoc default-category org-e-odt-category-map-alist))
-	 (category (nth 1 label-props))
-	 (counter category)
-	 (label-style (nth 2 label-props))
-	 (sequence-var (intern (mapconcat
-				'downcase
-				(org-split-string counter) "-")))
+	 ;; identify the sequence number
+	 (counter (nth 1 label-props))
+	 (sequence-var (intern counter))
 	 (seqno (1+ (or (plist-get org-e-odt-entity-counts-plist sequence-var)
 	 (seqno (1+ (or (plist-get org-e-odt-entity-counts-plist sequence-var)
 			0)))
 			0)))
-	 (label-props (list label category seqno label-style)))
+	 ;; assign an internal label, if user has not provided one
+	 (label (if label (substring-no-properties label)
+		  (format  "%s-%s" default-category seqno)))
+	 ;; identify label style
+	 (label-style (nth 2 label-props))
+	 ;; grok language setting
+	 (en-strings (assoc-default "en" org-e-odt-category-strings))
+	 (lang (plist-get info :language)) ; FIXME
+	 (lang-strings (assoc-default lang org-export-odt-category-strings))
+	 ;; retrieve localized category sting
+	 (pos (- (length org-e-odt-category-map-alist)
+		 (length (memq label-props org-e-odt-category-map-alist))))
+	 (category (or (nth pos lang-strings) (nth pos en-strings)))
+	 (label-props (list label category counter seqno label-style)))
     (setq org-e-odt-entity-counts-plist
     (setq org-e-odt-entity-counts-plist
 	  (plist-put org-e-odt-entity-counts-plist sequence-var seqno))
 	  (plist-put org-e-odt-entity-counts-plist sequence-var seqno))
+    ;; stash label properties for later retrieval
     (push label-props org-e-odt-entity-labels-alist)
     (push label-props org-e-odt-entity-labels-alist)
     label-props))
     label-props))
 
 
@@ -1141,9 +1169,11 @@ ATTR is a string of other attributes of the a element."
 	 (label-style (nth 2 label-props)))
 	 (label-style (nth 2 label-props)))
     (unless label-props
     (unless label-props
       (error "Unknown category: %S" default-category))
       (error "Unknown category: %S" default-category))
-    (org-e-odt-do-format-label-reference label category seqno label-style)))
+    (org-e-odt-do-format-label-reference
+     label category counter seqno label-style)))
 
 
-(defun org-e-odt-format-label-definition (caption label category seqno label-style)
+(defun org-e-odt-format-label-definition (caption label category counter
+						  seqno label-style)
   (assert label)
   (assert label)
   (setq label (org-solidify-link-text label))
   (setq label (org-solidify-link-text label))
   (format-spec
   (format-spec
@@ -1151,10 +1181,11 @@ ATTR is a string of other attributes of the a element."
    `((?e . ,category)
    `((?e . ,category)
      (?n . ,(org-e-odt-format-tags-simple
      (?n . ,(org-e-odt-format-tags-simple
 	     '("<text:sequence text:ref-name=\"%s\" text:name=\"%s\" text:formula=\"ooow:%s+1\" style:num-format=\"1\">" . "</text:sequence>")
 	     '("<text:sequence text:ref-name=\"%s\" text:name=\"%s\" text:formula=\"ooow:%s+1\" style:num-format=\"1\">" . "</text:sequence>")
-	     (format "%d" seqno) label category category))
-     (?c . ,(or (and caption (concat ": " caption)) "")))))
+	     (format "%d" seqno) label counter counter))
+     (?c . ,(or caption "")))))
 
 
-(defun org-e-odt-do-format-label-reference (label category seqno label-style)
+(defun org-e-odt-do-format-label-reference (label category counter
+						  seqno label-style)
   (assert label)
   (assert label)
   (save-match-data
   (save-match-data
     (let* ((fmt (cddr (assoc-string label-style org-e-odt-label-styles t)))
     (let* ((fmt (cddr (assoc-string label-style org-e-odt-label-styles t)))
@@ -1167,10 +1198,9 @@ ATTR is a string of other attributes of the a element."
 			   (?n . ,(format "%d" seqno)))) fmt1 label))))
 			   (?n . ,(format "%d" seqno)))) fmt1 label))))
 
 
 (defun org-e-odt-format-entity-caption (label caption category)
 (defun org-e-odt-format-entity-caption (label caption category)
-  (or (and label
-	   (apply 'org-e-odt-format-label-definition
-		  caption (org-e-odt-add-label-definition label category)))
-      caption ""))
+  (if (not (or label caption)) ""
+    (apply 'org-e-odt-format-label-definition caption
+	   (org-e-odt-add-label-definition label category))))
 
 
 (defun org-e-odt-format-tags-1 (tag text prefix suffix &rest args)
 (defun org-e-odt-format-tags-1 (tag text prefix suffix &rest args)
   (cond
   (cond
@@ -1919,9 +1949,10 @@ See `org-e-odt-add-label-definition' and
 See `org-e-odt-entity-labels-alist' for known CATEGORY-NAMEs.")
 See `org-e-odt-entity-labels-alist' for known CATEGORY-NAMEs.")
 
 
 (defvar org-e-odt-label-styles
 (defvar org-e-odt-label-styles
-  '(("text" "(%n)" "text" "(%n)")
-    ("category-and-value" "%e %n%c" "category-and-value" "%e %n")
-    ("value" "%e %n%c" "value" "%n"))
+  '(("math-formula" "%c" "text" "(%n)")
+    ("math-label" "(%n)" "text" "(%n)")
+    ("category-and-value" "%e %n: %c" "category-and-value" "%e %n")
+    ("value" "%e %n: %c" "value" "%n"))
   "Specify how labels are applied and referenced.
   "Specify how labels are applied and referenced.
 This is an alist where each element is of the
 This is an alist where each element is of the
 form (LABEL-STYLE-NAME LABEL-ATTACH-FMT LABEL-REF-MODE
 form (LABEL-STYLE-NAME LABEL-ATTACH-FMT LABEL-REF-MODE
@@ -1942,23 +1973,62 @@ specifiers - %e and %n.  %e is replaced with the CATEGORY-NAME.
 %n is replaced with SEQNO. See
 %n is replaced with SEQNO. See
 `org-e-odt-format-label-reference'.")
 `org-e-odt-format-label-reference'.")
 
 
+(defcustom org-e-odt-category-strings
+  '(("en" "Table" "Figure" "Equation" "Equation"))
+  "Specify category strings for various captionable entities.
+Captionable entity can be one of a Table, an Embedded Image, a
+LaTeX fragment (generated with dvipng) or a Math Formula.
+
+For example, when `org-export-default-language' is \"en\", an
+embedded image will be captioned as \"Figure 1: Orgmode Logo\".
+If you want the images to be captioned instead as \"Illustration
+1: Orgmode Logo\", then modify the entry for \"en\" as shown
+below.
+
+  \(setq org-e-odt-category-strings
+	'\(\(\"en\" \"Table\" \"Illustration\"
+	   \"Equation\" \"Equation\"\)\)\)"
+  :group 'org-export-e-odt
+  :version "24.1"
+  :type '(repeat (list (string :tag "Language tag")
+		       (choice :tag "Table"
+			       (const :tag "Use Default" nil)
+			       (string :tag "Category string"))
+		       (choice :tag "Figure"
+			       (const :tag "Use Default" nil)
+			       (string :tag "Category string"))
+		       (choice :tag "Math Formula"
+			       (const :tag "Use Default" nil)
+			       (string :tag "Category string"))
+		       (choice :tag "Dvipng Image"
+			       (const :tag "Use Default" nil)
+			       (string :tag "Category string")))))
+
 (defvar org-e-odt-category-map-alist
 (defvar org-e-odt-category-map-alist
   '(("__Table__" "Table" "value")
   '(("__Table__" "Table" "value")
-    ("__Figure__" "Figure" "value")
-    ("__MathFormula__" "Equation" "text")
+    ("__Figure__" "Illustration" "value")
+    ("__MathFormula__" "Text" "math-formula")
     ("__DvipngImage__" "Equation" "value")
     ("__DvipngImage__" "Equation" "value")
     ;; ("__Table__" "Table" "category-and-value")
     ;; ("__Table__" "Table" "category-and-value")
     ;; ("__Figure__" "Figure" "category-and-value")
     ;; ("__Figure__" "Figure" "category-and-value")
     ;; ("__DvipngImage__" "Equation" "category-and-value")
     ;; ("__DvipngImage__" "Equation" "category-and-value")
     )
     )
-  "Map a CATEGORY-HANDLE to CATEGORY-NAME and LABEL-STYLE.
-This is an alist where each element is of the form
-\\(CATEGORY-HANDLE CATEGORY-NAME LABEL-STYLE\\).  CATEGORY_HANDLE
-could either be one of the internal handles (as seen above) or be
-derived from the \"#+LABEL:<label-name>\" specification.  See
-`org-e-odt-get-category-from-label'.  CATEGORY-NAME and
-LABEL-STYLE are used for generating ODT labels.  See
-`org-e-odt-label-styles'.")
+  "Map a CATEGORY-HANDLE to OD-VARIABLE and LABEL-STYLE.
+This is a list where each entry is of the form \\(CATEGORY-HANDLE
+OD-VARIABLE LABEL-STYLE\\).  CATEGORY_HANDLE identifies the
+captionable entity in question.  OD-VARIABLE is the OpenDocument
+sequence counter associated with the entity.  These counters are
+declared within
+\"<text:sequence-decls>...</text:sequence-decls>\" block of
+`org-e-odt-content-template-file'.  LABEL-STYLE is a key
+into `org-e-odt-label-styles' and specifies how a given entity
+should be captioned and referenced.
+
+The position of a CATEGORY-HANDLE in this list is used as an
+index in to per-language entry for
+`org-e-odt-category-strings' to retrieve a CATEGORY-NAME.
+This CATEGORY-NAME is then used for qualifying the user-specified
+captions on export.")
 
 
 (defvar org-e-odt-manifest-file-entries nil)
 (defvar org-e-odt-manifest-file-entries nil)
 (defvar hfy-user-sheet-assoc)		; bound during org-do-lparse
 (defvar hfy-user-sheet-assoc)		; bound during org-do-lparse
@@ -2048,8 +2118,8 @@ Intended to be locally bound around a call to `org-export-as-html'." )
 ;;; User Configuration Variables
 ;;; User Configuration Variables
 
 
 (defgroup org-export-e-odt nil
 (defgroup org-export-e-odt nil
-  "Options for exporting Org mode files to HTML."
-  :tag "Org Export HTML"
+  "Options for exporting Org mode files to ODT."
+  :tag "Org Export ODT"
   :group 'org-export)
   :group 'org-export)
 
 
 (defcustom org-e-odt-protect-char-alist
 (defcustom org-e-odt-protect-char-alist
@@ -2236,7 +2306,7 @@ variable, the list of valid values are populated based on
 		 `((const :tag "None" nil)
 		 `((const :tag "None" nil)
 		   ,@(mapcar (lambda (c)
 		   ,@(mapcar (lambda (c)
 			       `(const :tag ,c ,c))
 			       `(const :tag ,c ,c))
-			     (org-lparse-reachable-formats "odt")))))
+			     (org-e-odt-reachable-formats "odt")))))
 
 
 (defcustom org-e-odt-table-styles
 (defcustom org-e-odt-table-styles
   '(("OrgEquation" "OrgEquation"
   '(("OrgEquation" "OrgEquation"
@@ -4081,7 +4151,8 @@ contextual information."
 	       "</colgroup>"))))
 	       "</colgroup>"))))
     (concat preamble (if colgropen "</colgroup>"))))
     (concat preamble (if colgropen "</colgroup>"))))
 
 
-(defun org-e-odt-list-table (lines caption label attributes)
+(defun org-e-odt-list-table (lines caption label attributes
+				   &optional short-caption)
   (let* ((splice nil) head
   (let* ((splice nil) head
 	 (org-e-odt-table-rownum -1)
 	 (org-e-odt-table-rownum -1)
 	 i (cnt 0)
 	 i (cnt 0)
@@ -4099,7 +4170,7 @@ contextual information."
       (setq org-lparse-table-is-styled t)
       (setq org-lparse-table-is-styled t)
 
 
       (concat
       (concat
-       (org-e-odt-begin-table caption label attributes)
+       (org-e-odt-begin-table caption label attributes short-caption)
        ;; FIXME (org-e-odt-table-preamble)
        ;; FIXME (org-e-odt-table-preamble)
        (org-e-odt-begin-table-rowgroup head)
        (org-e-odt-begin-table-rowgroup head)
 
 
@@ -4190,7 +4261,8 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
 	      (parent (car genealogy))
 	      (parent (car genealogy))
 	      (parent-type (org-element-type parent)))
 	      (parent-type (org-element-type parent)))
 	 (org-e-odt-list-table
 	 (org-e-odt-list-table
-	  (org-e-odt-org-table-to-list-table lines) caption label attr))))))
+	  (org-e-odt-org-table-to-list-table lines)
+	  caption label attr short-caption))))))
 
 
 
 
 ;;;; Target
 ;;;; Target