Browse Source

org-odt.el: Embed links to mathml files as ODF formula

* contrib/lisp/org-odt.el
(org-odt-embedded-formulas-count):New variable.
(org-odt-init-outfile): Reset above variable.
(org-odt-is-formula-link-p, org-odt-format-inline-formula)
(org-odt-copy-formula-file, org-export-odt-format-formula)
(org-export-odt-do-format-formula)
(org-export-odt-do-format-numbered-formula): New functions for
formatting mathml file links as embedded ODF formulae.
(org-odt-format-org-link): Add check for links to mathml files
and call `org-odt-format-inline-formula'.
(org-export-odt-format-image): Update function signature.  Use
`org-latex-src' property to identify latex dvipng images.  Use
the (to be committed) `org-latex-src-embed-type' to identify
whether the equation image should be inlined or displayed.
(org-odt-format-textbox): Modified to accomodate correct
formatting of captioned formula.
(org-odt-format-inlinetask): Modified to accomodate changes to
the previous function.
(org-export-odt-do-format-image): Minor change.
(org-export-odt-do-preprocess-latex-fragments): When LaTeX
fragment option is set to `t' or `mathjax' check for
availability of latex to mathml converter using (to be
committed) `org-format-latex-mathml-available-p'.  If such a
converter is available and configured, use it.  Otherwise
default to the earlier behaviour.

Refer the following post for more information:
http://article.gmane.org/gmane.emacs.orgmode/46712
Jambunathan K 13 years ago
parent
commit
be69dd2d50
1 changed files with 137 additions and 31 deletions
  1. 137 31
      contrib/lisp/org-odt.el

+ 137 - 31
contrib/lisp/org-odt.el

@@ -1055,6 +1055,98 @@ value of `org-export-odt-use-htmlfontify."
 	       (org-odt-copy-image-file thefile) thelink))))
     (org-export-odt-format-image thefile href)))
 
+(defun org-export-odt-do-format-numbered-formula (embed-as caption attr label
+							   width height href)
+  (with-temp-buffer
+    (let ((org-lparse-table-colalign-info '((0 "c" "8") (0 "c" "1"))))
+      (org-lparse-do-format-list-table
+       `((,(org-export-odt-do-format-formula ; caption and label
+					     ; should be nil
+	    embed-as nil attr nil width height href)
+	  ,(org-odt-format-entity-caption label caption "Equation")))
+       nil nil nil nil nil org-lparse-table-colalign-info))
+    (buffer-substring-no-properties (point-min) (point-max))))
+
+(defun org-export-odt-do-format-formula (embed-as caption attr label
+						  width height href)
+  "Create image tag with source and attributes."
+  (save-match-data
+    (cond
+     ((and (not caption) (not label))
+      (let (style-name anchor-type)
+	(case embed-as
+	  (paragraph
+	   (setq style-name  "OrgSimpleGraphics" anchor-type "paragraph"))
+	  (character
+	   (setq style-name  "OrgInlineGraphics" anchor-type "as-char"))
+	  (t
+	   (error "Unknown value for embed-as %S" embed-as)))
+	(org-odt-format-frame href style-name width height nil anchor-type)))
+     (t
+      (concat
+       (org-odt-format-textbox
+	(org-odt-format-stylized-paragraph
+	 'illustration
+	 (concat
+	  (let ((extra ""))
+	    (org-odt-format-frame
+	     href "" width height extra "paragraph"))
+	  (org-odt-format-entity-caption label caption)))
+	"OrgCaptionFrame" width height))))))
+
+(defun org-export-odt-format-formula (src href &optional embed-as)
+  "Create image tag with source and attributes."
+  (save-match-data
+    (let* ((caption (org-find-text-property-in-string 'org-caption src))
+	   (caption (and caption (org-xml-format-desc caption)))
+	   (attr (org-find-text-property-in-string 'org-attributes src))
+	   (label (org-find-text-property-in-string 'org-label src))
+	   (embed-as (or embed-as
+			 (and (org-find-text-property-in-string
+			       'org-latex-src src)
+			      (org-find-text-property-in-string
+			       'org-latex-src-embed-type src))
+			 'paragraph))
+	   (attr-plist (when attr (read  attr)))
+	   (width (plist-get attr-plist :width))
+	   (height (plist-get attr-plist :height)))
+      (org-export-odt-do-format-formula
+       embed-as caption attr label width height href))))
+
+(defvar org-odt-embedded-formulas-count 0)
+(defun org-odt-copy-formula-file (path)
+  "Returns the internal name of the file"
+  (let* ((src-file (expand-file-name
+		    path (file-name-directory org-current-export-file)))
+	 (target-dir (format "Formula-%04d/"
+			     (incf org-odt-embedded-formulas-count)))
+	 (target-file (concat target-dir "content.xml")))
+    (when (not org-lparse-to-buffer)
+      (message "Embedding %s as %s ..."
+	       (substring-no-properties path) target-file)
+
+	(make-directory target-dir)
+	(org-odt-create-manifest-file-entry
+	 "application/vnd.oasis.opendocument.formula" target-dir "1.2")
+
+	(copy-file src-file target-file 'overwrite)
+	(org-odt-create-manifest-file-entry "text/xml" target-file))
+    target-file))
+
+(defun org-odt-format-inline-formula (thefile)
+  (let* ((thelink (if (file-name-absolute-p thefile) thefile
+		    (org-xml-format-href
+		     (org-odt-relocate-relative-path
+		      thefile org-current-export-file))))
+	 (href
+	  (org-odt-format-tags
+	   "<draw:object xlink:href=\"%s\" xlink:type=\"simple\" xlink:show=\"embed\" xlink:actuate=\"onLoad\"/>" ""
+	   (file-name-directory (org-odt-copy-formula-file thefile)))))
+    (org-export-odt-format-formula thefile href)))
+
+(defun org-odt-is-formula-link-p (file)
+  (member (downcase (file-name-extension file)) '("mathml")))
+
 (defun org-odt-format-org-link (opt-plist type-1 path fragment desc attr
 					  descp)
   "Make an HTML link.
@@ -1065,7 +1157,6 @@ FRAGMENT is the fragment part of the link, if any (foo.html#THIS)
 DESC is the link description, if any.
 ATTR is a string of other attributes of the a element.
 MAY-INLINE-P allows inlining it as an image."
-
   (declare (special org-lparse-par-open))
   (save-match-data
     (let* ((may-inline-p
@@ -1075,7 +1166,6 @@ MAY-INLINE-P allows inlining it as an image."
 	   (type (if (equal type-1 "id") "file" type-1))
 	   (filename path)
 	   (thefile path))
-
       (cond
        ;; check for inlined images
        ((and (member type '("file"))
@@ -1084,12 +1174,13 @@ MAY-INLINE-P allows inlining it as an image."
 	      filename org-odt-export-inline-image-extensions)
 	     (or (eq t org-odt-export-inline-images)
 		 (and org-odt-export-inline-images (not descp))))
-
-	;; (when (and (string= type "file") (file-name-absolute-p path))
-	;;   (setq thefile (concat "file://" (expand-file-name path))))
-	;; (setq thefile (org-xml-format-href thefile))
-	;; (org-export-html-format-image thefile)
 	(org-odt-format-inline-image thefile))
+       ;; check for embedded formulas
+       ((and (member type '("file"))
+	     (not fragment)
+	     (org-odt-is-formula-link-p filename)
+	     (or (not descp)))
+	(org-odt-format-inline-formula thefile))
        (t
 	(when (string= type "file")
 	  (setq thefile
@@ -1186,14 +1277,19 @@ MAY-INLINE-P allows inlining it as an image."
    (expand-file-name
     (concat (sha1 file-name) "." (file-name-extension file-name)) "Pictures")))
 
-(defun org-export-odt-format-image (src href)
+(defun org-export-odt-format-image (src href &optional embed-as)
   "Create image tag with source and attributes."
   (save-match-data
     (let* ((caption (org-find-text-property-in-string 'org-caption src))
 	   (caption (and caption (org-xml-format-desc caption)))
 	   (attr (org-find-text-property-in-string 'org-attributes src))
 	   (label (org-find-text-property-in-string 'org-label src))
-	   (embed-as (if (string-match "^ltxpng/" src) 'character 'paragraph))
+	   (embed-as (or embed-as
+			 (if (org-find-text-property-in-string
+			      'org-latex-src src)
+			     (or (org-find-text-property-in-string
+				  'org-latex-src-embed-type src) 'character)
+			   'paragraph)))
 	   (attr-plist (when attr (read  attr)))
 	   (size (org-odt-image-size-from-file
 		  src (plist-get attr-plist :width)
@@ -1214,12 +1310,13 @@ MAY-INLINE-P allows inlining it as an image."
      '("<draw:frame draw:style-name=\"%s\"%s>" . "</draw:frame>")
      text style frame-attrs)))
 
-(defun org-odt-format-textbox (text style &optional width height)
+(defun org-odt-format-textbox (text style &optional width height extra)
   (org-odt-format-frame
    (org-odt-format-tags
     '("<draw:text-box %s>" . "</draw:text-box>")
-    text (format " fo:min-height=\"%0.2fcm\"" (or height 0.5)))
-   style width nil (and (not width) " style:rel-width=\"100%\"")))
+    text (concat (format " fo:min-height=\"%0.2fcm\"" (or height .2))
+		 (format " fo:min-width=\"%0.2fcm\"" (or width .2))))
+   style width nil extra))
 
 (defun org-odt-format-inlinetask (heading content
 					  &optional todo priority tags)
@@ -1230,8 +1327,7 @@ MAY-INLINE-P allows inlining it as an image."
 		 (org-lparse-format
 		  'HEADLINE (concat (org-lparse-format-todo todo) " " heading)
 		  nil tags))
-		content) "OrgInlineTaskFrame")))
-
+		content) "OrgInlineTaskFrame" nil nil " style:rel-width=\"100%\"")))
 (defun org-export-odt-do-format-image (embed-as caption attr label
 						width height href)
   "Create image tag with source and attributes."
@@ -1239,11 +1335,13 @@ MAY-INLINE-P allows inlining it as an image."
     (cond
      ((and (not caption) (not label))
       (let (style-name anchor-type)
-	(cond
-	 ((eq embed-as 'paragraph)
-	  (setq style-name  "OrgSimpleGraphics" anchor-type "paragraph"))
-	 ((eq embed-as 'character)
-	  (setq style-name  "OrgInlineGraphics" anchor-type "as-char")))
+	(case embed-as
+	  (paragraph
+	   (setq style-name  "OrgSimpleGraphics" anchor-type "paragraph"))
+	  (character
+	   (setq style-name  "OrgInlineGraphics" anchor-type "as-char"))
+	  (t
+	   (error "Unknown value for embed-as %S" embed-as)))
 	(org-odt-format-frame href style-name width height nil anchor-type)))
      (t
       (concat
@@ -1376,7 +1474,8 @@ MAY-INLINE-P allows inlining it as an image."
 
     ;; reset variables
     (setq org-odt-manifest-file-entries nil
-	  org-odt-embedded-images-count 0)
+	  org-odt-embedded-images-count 0
+	  org-odt-embedded-formulas-count 0)
 
     content-file))
 
@@ -1625,24 +1724,31 @@ visually."
 (defun org-export-odt-do-preprocess-latex-fragments ()
   "Convert LaTeX fragments to images."
   (let* ((latex-frag-opt (plist-get org-lparse-opt-plist :LaTeX-fragments))
-	 (latex-frag-opt-1		;  massage the options
+	 (latex-frag-opt		;  massage the options
 	  (or (and (member latex-frag-opt '(mathjax t))
+		   (not (and (fboundp 'org-format-latex-mathml-available-p)
+			     (org-format-latex-mathml-available-p)))
 		   (prog1 org-lparse-latex-fragment-fallback
 		     (org-lparse-warn
 		      (concat
-		       "Use of MathJax is incompatible with ODT exporter. "
+		       "LaTeX to MathML converter not available. "
 		       (format "Using %S instead."
 			       org-lparse-latex-fragment-fallback)))))
-	      latex-frag-opt)))
-    (when (and org-current-export-file latex-frag-opt-1)
-      ;; Investigate MathToWeb for converting TeX equations to MathML
-      ;; http://lists.gnu.org/archive/html/emacs-orgmode/2011-03/msg01755.html
+	      latex-frag-opt))
+	 cache-dir display-msg)
+    (cond
+     ((eq latex-frag-opt 'dvipng)
+      (setq cache-dir "ltxpng/")
+      (setq display-msg "Creating LaTeX image %s"))
+     ((member latex-frag-opt '(mathjax t))
+      (setq cache-dir "ltxmathml/")
+      (setq display-msg "Creating MathML formula %s")))
+    (when (and org-current-export-file)
       (org-format-latex
-       (concat "ltxpng/" (file-name-sans-extension
-			  (file-name-nondirectory
-			   org-current-export-file)))
-       org-current-export-dir nil "Creating LaTeX image %s"
-       nil nil latex-frag-opt-1))))
+       (concat cache-dir (file-name-sans-extension
+			  (file-name-nondirectory org-current-export-file)))
+       org-current-export-dir nil display-msg
+       nil nil latex-frag-opt))))
 
 (defun org-export-odt-preprocess-latex-fragments ()
   (when (equal org-export-current-backend 'odt)