From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jambunathan K Subject: Re: How do I convert org to OpenOffice? Date: Wed, 03 Nov 2010 00:38:01 +0530 Message-ID: <81k4kvbl2m.fsf@gmail.com> References: <87hbh85tev.fsf@MagnumOpus.khem> <878w2k5r8b.fsf@MagnumOpus.khem> <10354.1285789401@alphaville.usa.hp.com> <87sk0sux62.fsf@MagnumOpus.khem> <14934.1285793982@alphaville.usa.hp.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from [140.186.70.92] (port=56264 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PDMlE-00075A-DC for emacs-orgmode@gnu.org; Tue, 02 Nov 2010 15:43:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PDMDi-0006wr-R8 for emacs-orgmode@gnu.org; Tue, 02 Nov 2010 15:08:41 -0400 Received: from mail-yw0-f41.google.com ([209.85.213.41]:35276) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PDMDi-0006uz-7G for emacs-orgmode@gnu.org; Tue, 02 Nov 2010 15:08:34 -0400 Received: by ywl5 with SMTP id 5so4511529ywl.0 for ; Tue, 02 Nov 2010 12:08:33 -0700 (PDT) In-Reply-To: (Lennart Borgman's message of "Tue, 2 Nov 2010 18:53:25 +0100") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Lennart Borgman Cc: nicholas.dokos@hp.com, Org Mode --=-=-= Lennart Interesting that two people are working on org->OpenOffice exporter. The other person is me. I made this announcement roughly one week in to the project. - http://lists.gnu.org/archive/html/emacs-orgmode/2010-10/msg00372.html > I have struggled a bit with various ways to export from org-mode to > odt. (Thanks for all the tips here.) > > And it was not that fun when things gots complicated so I wonder if it > is better with a direct export. I took the rudimentary exporter in > muse and started to work a bit on it. I have not done very much yet, > just the part that puts all things together once the pieces (for > example content.xml) are there. You can find what I have done so far > in util/org-odt.el in the nXhtml repository. I started with org-html.el. I am attaching a test.org and test.odt from my work area (*as it is*). You will see that following things are taking shape: 1. Table Of Contents (Still not a 'native' Table Of Contents) 2. Various Character Styles 3. Various Paragraph Styles 4. Lists - Numbered, Bulleted, Description 5. Links - Internet Links, Internal Links as Bookmark/Xref 6. An embedded image 7. A simple table with a caption and numbering (you can see that xref to table has apparently broken) 8. Various kinds of Footnotes If you look inside the odt file you will see that meta.xml also taking shape. I have adopted an approach of scanning various features rather than solidifying the given feature. So the appearance could be flattering. Jambunathan K. Attachments: test.org (as plain), test.odt (as zip) --=-=-= Content-Disposition: attachment; filename=test.org Content-Description: test.org #+TITLE: OpenDocument MetaData Usecases and Requirements #+AUTHOR: Jambunathan K #+EMAIL: kjambunathan@gmail.com #+DATE: 2010-10-26 Sat #+LANGUAGE: en #+OPTIONS: H:3 num:t \n:nil @:t ::t |:t ^:t -:t f:t *:t <:t * Character Styles ** Bold *This is bold text* ** Italic /This is an italicized text/ ** Underline _This is an underlined text_ ** Code =This is a code text= ** Verbatim ~This is a verbatim text~ ** Strikethrough +This is a strikethorugh text+ * Paragraph Styles ** Quotation There is a quote below. #+BEGIN_QUOTE Everything should be made as simple as possible, but not any simpler -- Albert Einstein #+END_QUOTE ** Verse There is a verse below. #+BEGIN_VERSE Great clouds overhead Tiny black birds rise and fall Snow covers Emacs -- AlexSchroeder #+END_VERSE ** Centered Here is a centered paragraph. #+BEGIN_CENTER Everything should be made as simple as possible, \\ but not any simpler #+END_CENTER ** Example There is an example below #+srcname: #+begin_example First line of the example. Second line of the example. #+end_example ** Source Block There is a source block below. #+srcname: #+begin_src emacs-lisp (defun helloworld () "" (message "hello world")) #+end_src * Lists ** Simple Lists *** Numbered List This is a numbered list. 1. L1N1 2. L1N2 3. L1N3 *** Bulleted List This is a bulleted list. - L1B1 - L1B2 - L1B3 *** A Complex List 1. L1N1 1. L2N2 2. L2N3 2. L1N4 * L2B1 * L2B2 - L3B3 First paragraph. Second paragraph. - L3B4 3. L1N5 1. L2N6 1. L3N7 ** A Very Complex List *** Lord of the Rings My favorite scenes are (in this order) 1. The attack of the Rohirrim 2. Eowyn's fight with the witch king + this was already my favorite scene in the book + I really like Miranda Otto. - Definition-1 :: Description-1 - Definition-2 :: Description-2 # * 3. Peter Jackson being shot by Legolas - on DVD only He makes a really funny face when it happens. But in the end, no individual scenes matter but the film as a whole. Important actors in this film are: - Elijah Wood :: He plays Frodo - Sean Austin :: He plays Sam, Frodo's friend. I still remember him very well from his role as Mikey Walsh in The Goonies - Embedded Definition 1 :: Embedded Description 1 - Embedded Definition 2 :: Embedded Description 2 * Links ** Targets *** Fuzzy Target *** Target with CUSTOMID :PROPERTIES: :CUSTOM_ID: aabbccddeeff :END: *** Dedicated Target # <> *** <<>> ** References *** References to Fuzzy Target This is a link to [[Fuzzy Target]]. *** References to CUSTOMID links This is a link to [[#aabbccddeeff][Target with CUSTOMID]]. This is nodesc link to [[#aabbccddeeff]]. *** References to Dedicated Target There is a link to nodesc [[Dedicated Target]] here. There is a link to [[Dedicated%20Target][Jump to Dedicated Target]] here. *** References to Radioed Links This section has references to Radioed Target. One more reference to Radioed Target. * Images #+CAPTION: figure-caption #+LABEL: fig:figure-label #+ATTR_LaTeX: width=12cm, height=8cm placement=[H] [[./001.png]] * Tables #+CAPTION: An Example Table #+LABEL: table:10 | Labels | Column1 | Column2 | Column3 | |--------+---------+---------+---------| | / | < | > | <> | | Row1 | R1C1 | R1C2 | R1C3 | | Row2 | R2C1 | R2C2 | R2C3 | |--------+---------+---------+---------| * Table Referenced Please refer to \ref{table:10} for further information. * Footnote Definitions [1] One [fn:XYZ] XYZ * Footnote Usage # Also see org-footnote-autolabel, org-footnote-define-inline, # org-footnote-section, org-footnote-auto-adjust. [C-u] C-c C-x f. ** Plain Footnotes Footnote [1]. One more reference to footnote [1]. ** Named Footnotes Footnote named XYZ [fn:XYZ]. ** Inlined Footnote Inlined footnote [fn:: inline definition] ** Named and Inlined Footnote Named and Inlined footnote [fn:name: named definition] * Pending Items #+ODT #+BEGIN_ODT #+END_ODT #+ATTR_ODT http://www.w3.org/2003/entities/2007/xhtml1-symbol.ent * Introduction While existing OpenDocument metadata offers support for the widely-used Dublin Core vocabulary, it is limited in the following ways: 1. It provides no rules for extension. 2. It only allows descriptions of the document as a whole. This document was prepared by the OpenDocument Metadata Subcommittee, and includes representative use cases and requirements for enhancing this metadata support. ** What is Metadata? The SVG metadata specification defines metadata as structured data about data. This structured data describes, explains, locates, or otherwise makes it easier to retrieve, use, or manage an information resource [NISO-META]. It is the sort of content one typically uses to describe documents, images, contacts, events, and so forth. # - Item11 # - Item12 # - Item121 # - Item122 ** Why is Metadata Important? Metadata allows the document author to encode more of his/her human intelligence into the document. Document metadata in electronic documents is the natural evolution of the marginal comment or the footnote in paper documents. Moreover, this enhanced metadata can also enable powerful automated solutions. When customers and developers ask for support for custom content functionality, then, it is often in order to provide domain-specific metadata support. * Use Cases The following use cases have been consolidated from a more comprehensive list collected by the OpenDocument Metadata Subcommittee. ** Accessibility Enhanced metadata about document content can be particularly useful for accessibility purposes. This use case imagines a blind user who is having software read back an ODF document to them. Upon getting to an image, the software could optionally present descriptive information about the image, such as its creator, title, and so forth. The same would apply to any included metadata descriptions (see below). ** Bibliographies and Citations Citations can be thought of as dynamic fields whose formatting is generated from separate metadata, based on the requirements of a given citation style. A common use case is collaborative editing, where each author may use a different editing application and/or bibliographic database. ODF metadata should make it possible for this sort of collaborative roundtrip editing scenario to work, and for the citation fields to remain "live" across applications. This might involve also the ability for database applications to store their own application-specific metadata along with the more generic bibliographic metadata. ** Content Tagging User wants to add richerCon metadata to in-document content. In the simple case, they highlight text and tag it with some term. In a more complex case, they associate more structured metadata with content; for example a contact record for a participant in a meeting. A similar example might involve a doctor who wishes to record diagnostic information about a patient in a structured way. In this case, they might invoke a contextual menu item that brings up a custom inline field that allows them to choose the patient and the diagnosis. The displayed text is then human readable, but behind it lies more structured metadata that allows a user to access additional information about the patient, or for tools to later extract the information for other purposes. ** Enhanced Search Effective document search requires richer description than simply plain-text content. While basic default metadata such as title or creator can be helpful, there is need for the possibility of richer, custom, metadata. A legal office may want to include case information about a document, information about the plaintiffs, and so forth, all of which can facilitate enhanced search. They may also want to track relations among documents; for example, that between a final version and its draft original. ** Workflow Workflow and collaboration solutions depend on portable metadata embedded in files. This may include information about who edited a document, its status, the rights associated with its use, its relationships to other documents or to a collection of documents, and so forth. * Design Goals and Principles The following design goals and principles have been extracted from the use cases, and are used to frame the requirements. ** Balance Expressiveness and Ease-of-Implementation Enhanced metadata support should allow for complex metadata description where necessary, but should be designed with ease-of-implementation in mind for both third-party and primary application developers. ** Enable Extensibility Enhanced metadata should provide a strategic innovation opportunity for OpenDocument by allowing developers to build compelling solutions independent of the OpenDocument standardization process. ** Ensure Interoperability Enhanced metadata should provide an infrastructure that assures round-tripping interoperability among compliant OpenDocument applications. * Requirements The OpenDocument enhanced metadata proposal shall address the following requirements: ** Standard Model Beyond standard core support, there should be clear rules for custom extension metadata. These rules must be based on a clearly specified formal model, such that metadata extensions: 1. may be at least displayed without any particular programming logic 2. may reference other resource descriptions1, including across partitions of user functionality (a document description or bibliographic citation, say, to reference a contact record) This model may involve adopting all or part of RDF for a general extensible description framework, and may include compatibility or interoperability with similar RDF-based metadata formats such as RSS 1.0, XHTML 2.0 metainformation or XMP. This requirement facilitates the following goals: Enable Extensibility and Ensure Interoperability. ** Default Vocabularies OpenDocument should provide a rich set of default properties and classes for describing resources that go beyond the current support. The proposal should seek to reuse or define mappings to existing vocabularies, which may include deepening support for Dublin Core and/or adding support for vCard and/or Creative Commons to describe specific content of general applicability to office documents. This requirement facilitates the following goals: Balance Expressiveness and Ease-of-Implementation and Ensure Interoperability. ** Mechanism to Associate Content with Metadata Proposal should define valid document objects that can be described using enhanced metadata (for example, words, sentences, paragraphs, tables, pictures, etc.), as well as a mechanism to associate those objects with their descriptions. This requirement facilitates the following goals: Enable Extensibility and Ensure Interoperability. ** Consistent Identification Scheme IRIs provide a well-developed infrastructure for globally unique identification which also facilitates integration with network-based solutions, and so should be used to identify resources. These identifiers can then be used to link document content with descriptions, or resource descriptions with other resource descriptions. This requirement facilitates the following goals: Enable Extensibility and Ensure Interoperability. ** Separate Processing Metadata must be able to be processed, extracted, removed and so forth independently of the document content. This requirement facilitates the following goals: Balance Expressiveness and Ease-of-Implementation, Enable Extensibility and Ensure Interoperability. ** Levels of Conformance The enhanced metadata proposal should define levels of conformance so that users and developers have expectations about the level of support to expect in a given application. At minimum, all OpenDocument applications must preserve foreign content, but other levels of conformance might relate to display and/or editing of such foreign content. This requirement facilitates the following goals: Ensure Interoperability. ** Ability to Add Multiple Annotations to the Same Content This requirement falls out of the need to support collaborative editing, where the same document can be edited by multiple users, either synchronously or asynchronously. Since these users may also be applying metadata, the same words, paragraphs, etc., may see the same class of metadata applied multiple times. A practical consideration is that XML does not allow the same attribute name to be applied multiple times to the same element. So a metadata scheme which relied exclusively on metadata via attributes would have difficulty meeting this requirement. This requirement facilitates the following goals: Enable Extensibility. * Bibliography [NISO-META] NISO (2004) Understanding Metadata, NISO Press:Bethesda, MD, http://www.niso.org/standards/resources/UnderstandingMetadata.pdf --=-=-= Content-Type: application/zip Content-Disposition: inline; filename=test.odt Content-Transfer-Encoding: base64 Content-Description: test.odt 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 AAA= --=-=-= Content-Disposition: attachment; filename=org-odt.el Content-Description: org-odt.el ;;; org-odt.el --- Opendocument export for Org-mode ;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 ;; Free Software Foundation, Inc. ;; Author: Jambunathan K (kjambunathan at gmail dot com) ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org ;; Version: 7.01trans ;; ;; This file is part of GNU Emacs. ;; ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see . ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Commentary: ;;; Code: (require 'org-exp) (eval-when-compile (require 'cl)) (declare-function org-id-find-id-file "org-id" (id)) (declare-function odtize-region "ext:odtize" (beg end)) (defgroup org-export-odt nil "Options specific for ODT export of Org-mode files." :tag "Org Export ODT" :group 'org-export) (defcustom org-export-odt-coding-system nil "Coding system for ODT export, defaults to `buffer-file-coding-system'." :group 'org-export-odt :type 'coding-system) (defcustom org-export-odt-extension "odt" "The extension for exported ODT files." :group 'org-export-odt :type 'string) (defcustom org-export-odt-xml-declaration '(("odt" . "") ("php" . "\"; ?>")) "The extension for exported ODT files. %s will be replaced with the charset of the exported file. This may be a string, or an alist with export extensions and corresponding declarations." :group 'org-export-odt :type '(choice (string :tag "Single declaration") (repeat :tag "Dependent on extension" (cons (string :tag "Extension") (string :tag "Declaration"))))) (defcustom org-export-odt-tag-class-prefix "" "Prefix to class names for TODO keywords. Each tag gets a class given by the tag itself, with this prefix. The default prefix is empty because it is nice to just use the keyword as a class name. But if you get into conflicts with other, existing CSS classes, then this prefix can be very useful." :group 'org-export-odt :type 'string) (defcustom org-export-odt-todo-kwd-class-prefix "" "Prefix to class names for TODO keywords. Each TODO keyword gets a class given by the keyword itself, with this prefix. The default prefix is empty because it is nice to just use the keyword as a class name. But if you get into conflicts with other, existing CSS classes, then this prefix can be very useful." :group 'org-export-odt :type 'string) (defcustom org-export-odt-title-format "\n%s\n" "Format for typesetting the document title in ODT export." :group 'org-export-odt :type 'string) (defcustom org-export-odt-toplevel-hlevel 2 "The level for level 1 headings in ODT export. This is also important for the classes that will be wrapped around headlines and outline structure. If this variable is 1, the top-level headlines will be

, and the corresponding classes will be outline-1, section-number-1, and outline-text-1. If this is 2, all of these will get a 2 instead. The default for this variable is 2, because we use

for formatting the document title." :group 'org-export-odt :type 'string) (defcustom org-export-odt-link-org-files-as-odt t "Non-nil means make file links to `file.org' point to `file.odt'. When org-mode is exporting an org-mode file to ODT, links to non-odt files are directly put into a href tag in ODT. However, links to other Org-mode files (recognized by the extension `.org.) should become links to the corresponding odt file, assuming that the linked org-mode file will also be converted to ODT. When nil, the links still point to the plain `.org' file." :group 'org-export-odt :type 'boolean) (defcustom org-export-odt-inline-images 'maybe "Non-nil means inline images into exported ODT pages. This is done using an tag. When nil, an anchor with href is used to link to the image. If this option is `maybe', then images in links with an empty description will be inlined, while images with a description will be linked only." :group 'org-export-odt :type '(choice (const :tag "Never" nil) (const :tag "Always" t) (const :tag "When there is no description" maybe))) (defcustom org-export-odt-inline-image-extensions '("png" "jpeg" "jpg" "gif") "Extensions of image files that can be inlined into ODT." :group 'org-export-odt :type '(repeat (string :tag "Extension"))) (defcustom org-odt-table-tag "" "The ODT tag that is used to start a table. This must be a tag, but you may change the options like borders and spacing." :group 'org-export-odt :type 'string) (defcustom org-odt-table-header-tags '(" " . "") "The opening tag for table header fields. This is customizable so that alignment options can be specified. %s will be filled with the scope of the field, either row or col. See also the variable `org-export-odt-table-use-header-tags-for-first-column'." :group 'org-export-tables :type '(cons (string :tag "Opening tag") (string :tag "Closing tag"))) (defcustom org-odt-table-data-tags '(" " . "") "The opening tag for table data fields. This is customizable so that alignment options can be specified." :group 'org-export-tables :type '(cons (string :tag "Opening tag") (string :tag "Closing tag"))) (defcustom org-odt-table-row-tags '("" . "") "The opening tag for table data fields. This is customizable so that alignment options can be specified. Instead of strings, these can be Lisp forms that will be evaluated for each row in order to construct the table row tags. During evaluation, the variable `head' will be true when this is a header line, nil when this is a body line. And the variable `nline' will contain the line number, starting from 1 in the first header line. For example (setq org-odt-table-row-tags (cons '(if head \"\" (if (= (mod nline 2) 1) \"\" \"\")) \"\")) will give even lines the class \"tr-even\" and odd lines the class \"tr-odd\"." :group 'org-export-tables :type '(cons (choice :tag "Opening tag" (string :tag "Specify") (sexp)) (choice :tag "Closing tag" (string :tag "Specify") (sexp)))) (defconst org-odt-table-header-rows-tags '("" . "")) (defconst org-odt-table-rows-tags '("" . "")) (defconst org-odt-table-column-tags '("" . ". Set by publishing functions. This may also be a function, building and inserting the preamble.") (defvar org-export-odt-postamble nil "Postamble, to be inserted just before . Set by publishing functions. This may also be a function, building and inserting the postamble.") (defvar org-export-odt-auto-preamble t "Should default preamble be inserted? Set by publishing functions.") (defvar org-export-odt-auto-postamble t "Should default postamble be inserted? Set by publishing functions.") ;;; Hooks (defvar org-export-odt-after-blockquotes-hook nil "Hook run during ODT export, after blockquote, verse, center are done.") (defvar org-export-odt-final-hook nil "Hook run at the end of ODT export, in the new buffer.") ;;; ODT export (defconst org-odt-sequence-ref-format "%s") (defun org-export-odt-preprocess (parameters) "Convert LaTeX fragments to images." (when (and org-current-export-file (plist-get parameters :LaTeX-fragments)) (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 (cond ((eq (plist-get parameters :LaTeX-fragments) 'verbatim) 'verbatim) ((eq (plist-get parameters :LaTeX-fragments) 'mathjax ) 'mathjax) ((eq (plist-get parameters :LaTeX-fragments) t ) 'mathjax) ((eq (plist-get parameters :LaTeX-fragments) 'dvipng ) 'dvipng) (t nil)))) (goto-char (point-min)) (let (label l1) (while (re-search-forward "\\\\ref{\\([^{}\n]+\\)}" nil t) (org-if-unprotected-at (match-beginning 1) (setq label (match-string 1)) (save-match-data (if (string-match "\\`[a-z]\\{1,10\\}:\\(.+\\)" label) (setq l1 (substring label (match-beginning 1))) (setq l1 label))) ;; (replace-match (format "[[#%s][%s]]" label l1) t t) (replace-match (format org-odt-sequence-ref-format label l1) t t))))) ;;;###autoload (defun org-export-as-odt-and-open (arg) "Export the outline as ODT and immediately open it with a browser. If there is an active region, export only the region. The prefix ARG specifies how many levels of the outline should become headlines. The default is 3. Lower levels will become bulleted lists." (interactive "P") (org-export-as-odt arg 'hidden) (org-open-file buffer-file-name) (when org-export-kill-product-buffer-when-displayed (kill-buffer (current-buffer)))) ;;;###autoload (defun org-export-as-odt-batch () "Call the function `org-export-as-odt'. This function can be used in batch processing as: emacs --batch --load=$HOME/lib/emacs/org.el --eval \"(setq org-export-headline-levels 2)\" --visit=MyFile --funcall org-export-as-odt-batch" (org-export-as-odt org-export-headline-levels 'hidden)) ;;;###autoload (defun org-export-as-odt-to-buffer (arg) "Call `org-export-as-odt` with output to a temporary buffer. No file is created. The prefix ARG is passed through to `org-export-as-odt'." (interactive "P") (org-export-as-odt arg nil nil "*Org ODT Export*") (when org-export-show-temporary-export-buffer (switch-to-buffer-other-window "*Org ODT Export*"))) ;;;###autoload (defun org-replace-region-by-odt (beg end) "Assume the current region has org-mode syntax, and convert it to ODT. This can be used in any buffer. For example, you could write an itemized list in org-mode syntax in an ODT buffer and then use this command to convert it." (interactive "r") (let (reg odt buf pop-up-frames) (save-window-excursion (if (org-mode-p) (setq odt (org-export-region-as-odt beg end t 'string)) (setq reg (buffer-substring beg end) buf (get-buffer-create "*Org tmp*")) (with-current-buffer buf (erase-buffer) (insert reg) (org-mode) (setq odt (org-export-region-as-odt (point-min) (point-max) t 'string))) (kill-buffer buf))) (delete-region beg end) (insert odt))) ;;;###autoload (defun org-export-region-as-odt (beg end &optional body-only buffer) "Convert region from BEG to END in org-mode buffer to ODT. If prefix arg BODY-ONLY is set, omit file header, footer, and table of contents, and only produce the region of converted text, useful for cut-and-paste operations. If BUFFER is a buffer or a string, use/create that buffer as a target of the converted ODT. If BUFFER is the symbol `string', return the produced ODT as a string and leave not buffer behind. For example, a Lisp program could call this function in the following way: (setq odt (org-export-region-as-odt beg end t 'string)) When called interactively, the output buffer is selected, and shown in a window. A non-interactive call will only return the buffer." (interactive "r\nP") (when (interactive-p) (setq buffer "*Org ODT Export*")) (let ((transient-mark-mode t) (zmacs-regions t) ext-plist rtn) (setq ext-plist (plist-put ext-plist :ignore-subtree-p t)) (goto-char end) (set-mark (point)) ;; to activate the region (goto-char beg) (setq rtn (org-export-as-odt nil nil ext-plist buffer body-only)) (if (fboundp 'deactivate-mark) (deactivate-mark)) (if (and (interactive-p) (bufferp rtn)) (switch-to-buffer-other-window rtn) rtn))) (defvar odt-table-tag nil) ; dynamically scoped into this. (defvar org-par-open nil) ;;; org-odt-cvt-link-fn (defconst org-odt-cvt-link-fn nil "Function to convert link URLs to exportable URLs. Takes two arguments, TYPE and PATH. Returns exportable url as (TYPE PATH), or nil to signal that it didn't handle this case. Intended to be locally bound around a call to `org-export-as-odt'." ) (defun org-odt-cvt-org-as-odt (opt-plist type path) "Convert an org filename to an equivalent odt filename. If TYPE is not file, just return `nil'. See variable `org-export-odt-link-org-files-as-odt'" (save-match-data (and org-export-odt-link-org-files-as-odt (string= type "file") (string-match "\\.org$" path) (progn (list "file" (concat (substring path 0 (match-beginning 0)) "." (plist-get opt-plist :odt-extension))))))) ;;; org-odt-should-inline-p (defun org-odt-should-inline-p (filename descp) "Return non-nil if link FILENAME should be inlined. The decision to inline the FILENAME link is based on the current settings. DESCP is the boolean of whether there was a link description. See variables `org-export-odt-inline-images' and `org-export-odt-inline-image-extensions'." (declare (special org-export-odt-inline-images org-export-odt-inline-image-extensions)) (and (or (eq t org-export-odt-inline-images) (and org-export-odt-inline-images (not descp))) (org-file-image-p filename org-export-odt-inline-image-extensions))) ;;; org-odt-make-link (defun org-odt-make-link (opt-plist type path fragment desc attr may-inline-p &optional xref) "Make an ODT link. OPT-PLIST is an options list. TYPE is the device-type of the link (THIS://foo.odt) PATH is the path of the link (http://THIS#locationx) FRAGMENT is the fragment part of the link, if any (foo.odt#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." (setq xref (and org-export-odt-use-bookmarks-for-internal-links xref)) (declare (special org-par-open)) (save-match-data (let* ((filename path) ;;First pass. Just sanity stuff. (components-1 (cond ((string= type "file") (list type ;;Substitute just if original path was absolute. ;;(Otherwise path must remain relative) (if (file-name-absolute-p path) (concat "file://" (expand-file-name path)) path))) ((string= type "") (list nil path)) (t (list type path)))) ;;Second pass. Components converted so they can refer ;;to a remote site. (components-2 (or (and org-odt-cvt-link-fn (apply org-odt-cvt-link-fn opt-plist components-1)) (apply #'org-odt-cvt-org-as-odt opt-plist components-1) components-1)) (type (first components-2)) (thefile (second components-2))) ;;Third pass. Build final link except for leading type ;;spec. (cond ;; FIXME: for internal links assumes thefile as empty ((and (or (not type)) fragment) (setq thefile (let ((prefix (if xref org-export-odt-bookmark-prefix "#"))) (concat prefix fragment)))) ((or (string= type "http") (string= type "https")) (setq xref nil) (if fragment (setq thefile (concat thefile "#" fragment)))) (t (setq xref nil))) ;;Final URL-build, for all types. (setq thefile (let ((str (org-export-odt-format-href thefile))) (if (and type (not (string= "file" type))) (concat type ":" str) str))) (if (and may-inline-p ;;Can't inline a URL with a fragment. (not fragment)) (progn (message "image %s %s" thefile org-par-open) (org-export-odt-format-image thefile org-par-open)) ;; FIXME: how to handle attr in xref case. For now it is ;; ignored (org-odt-format-internal-link thefile (org-export-odt-format-desc desc) xref (and (not xref) (or attr ""))))))) (defconst org-odt-document-content-header " ") (defun org-odt-fill-tabs-and-spaces (line) (replace-regexp-in-string "\\([\t]\\|\\([ ]+\\)\\)" (lambda (s) (cond ((string= s "\t") "") ((> (length s) 1) (format "" (length s))) (t " "))) line)) ;; ODT: FOOTNOTES (defun org-odt-get-footnote-definitions (lines) "Given a list of LINES, return a list of alist footnotes." (let ((list nil) line) (while (setq line (pop lines)) (if (string-match "^[ \t]*\\[\\([0-9]+\\)\\] \\(.+\\)" line) (push (cons (match-string 1 line) (match-string 2 line)) list))) list)) (defun org-odt-format-footnote (n def) (format " %s %s " n n def)) (defun org-odt-format-footnote-ref (n) (format " %s " n n)) ;; email ;; (when (and org-export-email-info email (string-match "\\S-" email)) ;; (if (listp (split-string email ",+ *")) ;; (mapc (lambda(e)) ;; (split-string email ",+ *")))) ;; lang-words: ("en" "Author" "Date" "Table of Contents" "Footnotes") ;; ODT: META FILE (defun org-export-odt-update-meta-file (opt-plist) (with-current-buffer (find-file-noselect "meta.xml" (file-name-directory buffer-file-name)) (let ((date (plist-get opt-plist :date)) (author (plist-get opt-plist :author)) (language (plist-get opt-plist :language)) (email (plist-get opt-plist :email)) (keywords (plist-get opt-plist :keywords)) (description (plist-get opt-plist :description)) (title (plist-get opt-plist :title))) (cond ((and date (string-match "%" date)) (setq date (format-time-string date))) (date) (t (setq date (format-time-string "%Y-%m-%d %T %Z")))) ;; FIXME: Revisit these two lines. Seems bogus to me (setq date (and org-export-time-stamp-file date)) (setq author (and org-export-author-info author)) (insert (format " %s \n" (or author "")) (format " %s \n" (or author "")) (format " %s \n" (or date "")) (format " %s \n" (or date "")) (when org-export-creator-info (format " Org-%s/Emacs-%s \n" org-version emacs-version)) (format " %s \n" (or keywords "")) ;; FIXME: Is subject same as description (format " %s \n" (or description "")) (format " %s \n" (or title "")))))) ;; ODT: TABLE OF CONTENTS (defcustom org-export-odt-use-bookmarks-for-toc t "Export Internal links as bookmarks?.") (defun org-odt-toc-parse-headline (line level-offset umax-toc lines org-last-level) (when (and (string-match org-todo-line-regexp line) (not (get-text-property 0 'org-protected line))) (let (level txt todo) (setq level (org-tr-level (- (match-end 1) (match-beginning 1) level-offset)) txt (save-match-data (org-odt-expand (org-export-cleanup-toc-line (match-string 3 line)))) todo (when org-export-mark-todo-in-toc (or (and (match-beginning 2) (not (member (match-string 2 line) org-done-keywords))) ;; TODO, not DONE (and (= level umax-toc) (org-search-todo-below line lines level))))) (when (<= level umax-toc) (org-odt-toc-ascend-descend-levels (- level org-last-level)) (org-odt-toc-insert-item todo txt (org-section-number level)) level)))) (defun org-odt-toc-check-any-target (line) (while (string-match org-any-target-regexp line) (setq line (replace-match (concat "@" (match-string 1 line) "@ ") t t line))) line) (defun org-odt-toc-ascend-descend-levels (cnt) (cond ((> cnt 0) (while (>= (setq cnt (1- cnt)) 0) (org-odt-open-list "OrgBulletedList") (org-odt-open-list-item)) (insert "\n")) ((< cnt 0) (setq cnt (- cnt)) (while (>= (setq cnt (1- cnt)) 0) (org-odt-close-list-item) (org-odt-close-list) (org-odt-close-list-item) (org-odt-open-list-item) (insert "\n"))) (t (org-odt-close-list-item) (org-odt-open-list-item)))) (defun org-odt-toc-insert-item (todo txt snumber) (when (string-match (org-re "[ \t]+:\\([[:alnum:]_@:]+\\):[ \t]*$") txt) (setq txt (replace-match "    \\1" t nil txt))) (when (string-match quote-re0 txt) (setq txt (replace-match "" t t txt))) (when org-export-with-section-numbers (setq txt (concat snumber " " txt))) (while (string-match "<\\(<\\)+\\|>\\(>\\)+" txt) (setq txt (replace-match "" t t txt))) (org-odt-open-par) (let* ((href (replace-regexp-in-string "\\." "_" (format "sec-%s" snumber))) (href (or (cdr (assoc href org-export-preferred-target-alist)) href)) (prefix (if org-export-odt-use-bookmarks-for-toc org-export-odt-bookmark-prefix "#")) (href (format "%s%s" prefix href))) ;; FIXME: todo case is not handled right now (when todo (setq txt (format "%s" txt))) (insert (org-odt-format-internal-link href txt org-export-odt-use-bookmarks-for-toc ""))) (org-odt-close-par)) (defun org-odt-insert-toc (the-toc first-heading-pos) (when thetoc (goto-char (point-min)) (if (or (re-search-forward "

\\s-*\\[TABLE-OF-CONTENTS\\]\\s-*

" nil t) (re-search-forward "\\[TABLE-OF-CONTENTS\\]" nil t)) (progn (goto-char (match-beginning 0)) (replace-match "")) (goto-char first-heading-pos) (when (looking-at "\\s-*

") (goto-char (match-end 0)) (insert "\n"))) (org-odt-open-section "table-of-contents") (mapc 'insert thetoc) (org-odt-close-section))) (defun org-odt-do-toc (h lines level-offset umax-toc) (let ((org-min-level (org-get-min-level lines level-offset)) (org-last-level org-min-level)) (with-temp-buffer (org-odt-insert-heading h org-export-odt-toplevel-hlevel) (org-odt-open-section "text-table-of-contents") ;; FIXME: This shouldn't be zero (setq org-last-level 0) (setq lines (mapcar '(lambda (line) (let ((l (org-odt-toc-parse-headline line level-offset umax-toc lines org-last-level))) (when l (setq org-last-level l) (setq line (org-odt-toc-check-any-target line)))) line) lines)) (while (> org-last-level (1- org-min-level)) (setq org-last-level (1- org-last-level)) (org-odt-close-list-item) (org-odt-close-list)) (org-odt-close-section) (buffer-string)))) ;; FINAL CLEANUP (defun org-odt-delete-empty-paragraphs () (interactive) (goto-char (point-min)) (let ((open "") (close "")) (while (re-search-forward (format "%s[ \r\n\t]*%s" open close) nil t) ;; (read-string "Enter:") (replace-match "")))) (defun org-odt-delete-empty-lists () (goto-char (point-min)) (while (re-search-forward "
  • [ \r\n\t]*
  • \n?" nil t) (replace-match ""))) (defun org-odt-fixup-whitespace-placeholders () (goto-char (point-min)) (let (beg end n) (while (setq beg (next-single-property-change (point) 'org-whitespace)) (setq n (get-text-property beg 'org-whitespace) end (next-single-property-change beg 'org-whitespace)) (goto-char beg) (delete-region beg end) (insert (format "%s" (make-string n ?x)))))) (defun org-odt-misc-cleanup () ;; Remove empty lines at the beginning of the file. (goto-char (point-min)) (when (looking-at "\\s-+\n") (replace-match "")) ;; Remove display properties (remove-text-properties (point-min) (point-max) '(display t))) (defun org-odt-final-cleanup () (org-odt-delete-empty-paragraphs) (org-odt-delete-empty-lists) (org-odt-fixup-whitespace-placeholders) (org-odt-misc-cleanup)) ;;; org-export-as-odt ;;;###autoload (defun org-export-as-odt (arg &optional hidden ext-plist to-buffer body-only pub-dir) "Export the outline as a pretty ODT file. If there is an active region, export only the region. The prefix ARG specifies how many levels of the outline should become headlines. The default is 3. Lower levels will become bulleted lists. HIDDEN is obsolete and does nothing. EXT-PLIST is a property list with external parameters overriding org-mode's default settings, but still inferior to file-local settings. When TO-BUFFER is non-nil, create a buffer with that name and export to that buffer. If TO-BUFFER is the symbol `string', don't leave any buffer behind but just return the resulting ODT as a string. When BODY-ONLY is set, don't produce the file header and footer, simply return the content of ..., without even the body tags themselves. When PUB-DIR is set, use this as the publishing directory." (interactive "P") (run-hooks 'org-export-first-hook) ;; Make sure we have a file name when we need it. (when (and (not (or to-buffer body-only)) (not buffer-file-name)) (if (buffer-base-buffer) (org-set-local 'buffer-file-name (with-current-buffer (buffer-base-buffer) buffer-file-name)) (error "Need a file name to be able to export"))) (message "Exporting...") (setq-default org-todo-line-regexp org-todo-line-regexp) (setq-default org-deadline-line-regexp org-deadline-line-regexp) (setq-default org-done-keywords org-done-keywords) (setq-default org-maybe-keyword-time-regexp org-maybe-keyword-time-regexp) (let* ((opt-plist (org-export-process-option-filters (org-combine-plists (org-default-export-plist) ext-plist (org-infile-export-plist)))) (body-only (or body-only (plist-get opt-plist :body-only))) (odt-extension (plist-get opt-plist :odt-extension)) (link-validate (plist-get opt-plist :link-validation-function)) valid thetoc first-heading-pos (odd org-odd-levels-only) (region-p (org-region-active-p)) (rbeg (and region-p (region-beginning))) (rend (and region-p (region-end))) (subtree-p (if (plist-get opt-plist :ignore-subtree-p) nil (when region-p (save-excursion (goto-char rbeg) (and (org-at-heading-p) (>= (org-end-of-subtree t t) rend)))))) (level-offset (if subtree-p (save-excursion (goto-char rbeg) (+ (funcall outline-level) (if org-odd-levels-only 1 0))) 0)) (opt-plist (setq org-export-opt-plist (if subtree-p (org-export-add-subtree-options opt-plist rbeg) opt-plist))) ;; The following two are dynamically scoped into other ;; routines below. (org-current-export-dir (or pub-dir (org-export-directory :odt opt-plist))) (org-current-export-file buffer-file-name) (level 0) (line "") (origline "") txt todo (umax nil) (umax-toc nil) (target (if to-buffer nil (expand-file-name (concat (file-name-sans-extension (or (and subtree-p (org-entry-get (region-beginning) "EXPORT_FILE_NAME" t)) (file-name-nondirectory buffer-file-name))) "." (or "odt" odt-extension)) (file-name-as-directory (or pub-dir (org-export-directory :odt opt-plist)))))) (current-dir (if buffer-file-name (file-name-directory buffer-file-name) default-directory)) (outdir (org-export-odt-outdir-init)) (filename (expand-file-name "content.xml" outdir)) (buffer (if to-buffer (cond ((eq to-buffer 'string) (get-buffer-create "*Org ODT Export*")) (t (get-buffer-create to-buffer))) (find-file-noselect filename))) (org-levels-open (make-vector org-level-max nil)) (language (plist-get opt-plist :language)) (title (or (and subtree-p (org-export-get-title-from-subtree)) (plist-get opt-plist :title) (and (not body-only) (not (plist-get opt-plist :skip-before-1st-heading)) (org-export-grab-title-from-buffer)) (and buffer-file-name (file-name-sans-extension (file-name-nondirectory buffer-file-name))) "UNTITLED")) (dummy (setq opt-plist (plist-put opt-plist :title title))) ;; ODT FIXME: figure this out ;; (odt-table-tag (plist-get opt-plist :odt-table-tag)) (quote-re0 (concat "^[ \t]*" org-quote-string "\\>")) (quote-re (concat "^\\(\\*+\\)\\([ \t]+" org-quote-string "\\>\\)")) (inquote nil) (infixed nil) (inverse nil) (in-local-list nil) (local-list-type nil) (local-list-indent nil) (llt org-plain-list-ordered-item-terminator) (lang-words nil) (head-count 0) (start 0) (coding-system (and (boundp 'buffer-file-coding-system) buffer-file-coding-system)) (coding-system-for-write (or org-export-odt-coding-system coding-system)) (save-buffer-coding-system (or org-export-odt-coding-system coding-system)) (charset (and coding-system-for-write (fboundp 'coding-system-get) (coding-system-get coding-system-for-write 'mime-charset))) (region (buffer-substring (if region-p (region-beginning) (point-min)) (if region-p (region-end) (point-max)))) (org-export-have-math nil) (lines (org-split-string (org-export-preprocess-string region :emph-multiline t :for-odt t :skip-before-1st-heading (plist-get opt-plist :skip-before-1st-heading) :drawers (plist-get opt-plist :drawers) :todo-keywords (plist-get opt-plist :todo-keywords) :tags (plist-get opt-plist :tags) :priority (plist-get opt-plist :priority) :footnotes (plist-get opt-plist :footnotes) :timestamps (plist-get opt-plist :timestamps) :archived-trees (plist-get opt-plist :archived-trees) :select-tags (plist-get opt-plist :select-tags) :exclude-tags (plist-get opt-plist :exclude-tags) :add-text (plist-get opt-plist :text) :LaTeX-fragments (plist-get opt-plist :LaTeX-fragments)) "[\r\n]")) (mathjax "") table-open type table-buffer table-orig-buffer ind item-type starter rpl path attr desc descp desc1 desc2 link nodesc snumber fnc item-tag item-number footnotes footref-seen id-file href footnote-def footnote-list ) (setq footnote-list (org-odt-get-footnote-definitions lines)) (let ((inhibit-read-only t)) (org-unmodified (remove-text-properties (point-min) (point-max) '(:org-license-to-kill t)))) (message "Exporting...") (org-init-section-numbers) ;; Get the language-dependent settings (setq lang-words (or (assoc language org-export-language-setup) (assoc "en" org-export-language-setup))) ;; Switch to the output buffer (set-buffer buffer) (let ((inhibit-read-only t)) (erase-buffer)) (fundamental-mode) (org-install-letbind) (and (fboundp 'set-buffer-file-coding-system) (set-buffer-file-coding-system coding-system-for-write)) (let (style (case-fold-search nil) (org-odd-levels-only odd)) ;; create local variables for all options, to make sure all called ;; functions get the correct information (mapc (lambda (x) (set (make-local-variable (nth 2 x)) (plist-get opt-plist (car x)))) org-export-plist-vars) (setq umax (if arg (prefix-numeric-value arg) org-export-headline-levels)) (setq umax-toc (if (integerp org-export-with-toc) (min org-export-with-toc umax) umax)) (unless body-only (insert org-odt-document-content-header) (org-export-odt-insert-plist-item opt-plist :preamble opt-plist) ;; FIXME: (plist-get opt-plist :auto-preamble)? (when (and org-export-odt-auto-preamble title) (insert (format org-export-odt-title-format "Heading_20_1.title" (org-odt-expand title))))) (setq thetoc (and org-export-with-toc (not body-only) (org-odt-do-toc (nth 3 lang-words) lines level-offset umax-toc))) (setq head-count 0) (org-init-section-numbers) (org-odt-do-open-par) (while (setq line (pop lines) origline line) (catch 'nextline ;; end of quote section? (when (and inquote (string-match "^\\*+ " line)) (insert "\n") (org-odt-do-open-par) (setq inquote nil)) ;; inside a quote section? (when inquote (insert (org-odt-protect line) "\n") (throw 'nextline nil)) ;; Fixed-width, verbatim lines (examples) (when (and org-export-with-fixed-width (string-match "^[ \t]*:\\(\\([ \t]\\|$\\)\\(.*\\)\\)" line)) (when (not infixed) (setq infixed t) (org-odt-do-open-par "Example")) (insert (org-odt-protect (match-string 3 line)) "\n") (when (or (not lines) (not (string-match "^[ \t]*:\\(\\([ \t]\\|$\\)\\(.*\\)\\)" (car lines)))) (setq infixed nil) (org-odt-do-open-par)) (throw 'nextline nil)) ;; Explicit list closure (when (equal "ORG-LIST-END" line) (while local-list-indent (org-odt-do-close-list-item (car local-list-type)) ;; (insert (format "\n" (car local-list-type))) (org-odt-close-list) (pop local-list-type) (pop local-list-indent)) (setq in-local-list nil) (org-odt-do-open-par) (throw 'nextline nil)) ;; Protected ODT ;; FIXME: take care of leading spaces? Or better still ;; find a better textual environment (when (get-text-property 0 'org-protected line) (let (par (ind (get-text-property 0 'original-indentation line))) (when (re-search-backward "\\(\\)\\([ \t\r\n]*\\)\\=" (- (point) 100) t) (setq par (match-string 1)) (replace-match "\\2\n")) ;; (insert line "\n") (insert (org-odt-fill-tabs-and-spaces line) "") (while (and lines (or (= (length (car lines)) 0) (not ind) (equal ind (get-text-property 0 'original-indentation (car lines)))) (or (= (length (car lines)) 0) (get-text-property 0 'org-protected (car lines)))) (org-odt-open-par "OrgSourceBlock") (insert (org-odt-fill-tabs-and-spaces (pop lines))) (org-odt-close-par)) ;; this terminates the example section (and par (org-odt-open-par "Text_20_body"))) (throw 'nextline nil)) ;; Blockquotes, verse, and center (setq style nil) (cond ((equal "ORG-BLOCKQUOTE-START" line) (setq style "Quotations")) ((equal "ORG-CENTER-START" line) (setq style "Orgmode-Center")) ((equal "ORG-VERSE-START" line) (setq inverse t) (setq style "Orgmode-Verse"))) (when style (org-odt-do-open-par style) (throw 'nextline nil)) (when (or (equal "ORG-BLOCKQUOTE-END" line) (equal "ORG-CENTER-END" line) (equal "ORG-VERSE-END" line)) (org-odt-do-open-par) (setq inverse nil) (throw 'nextline nil)) (run-hooks 'org-export-odt-after-blockquotes-hook) (when inverse (let ((i (org-get-string-indentation line))) (if (> i 0) ;; (setq line (concat (mapconcat 'identity ;; (make-list (* 2 i) "\\nbsp") "") ;; " " (org-trim line))) (setq line (concat (format "" (* 2 i)) " " (org-trim line)))) (unless (string-match "\\\\\\\\[ \t]*$" line) (setq line (concat line "\\\\"))))) ;; make targets to anchors (setq start 0) (while (string-match "<<]*\\)>>>?\\((INVISIBLE)\\)?[ \t]*\n?" line start) (cond ((get-text-property (match-beginning 1) 'org-protected line) (setq start (match-end 1))) ((match-end 2) (setq line (replace-match (format "@@" (org-solidify-link-text (match-string 1 line)) (org-solidify-link-text (match-string 1 line))) t t line))) ((and org-export-with-toc (equal (string-to-char line) ?*)) ;; FIXME: NOT DEPENDENT on TOC????????????????????? ;; headline that is radioed (setq line (replace-match (match-string 1 line) t t line))) (t (setq line (replace-match (concat "@" (match-string 1 line) "@ ") t t line))))) (setq line (org-odt-handle-time-stamps line)) ;; replace "&" by "&", "<" and ">" by "<" and ">" ;; handle @<..> ODT tags (replace "@>..<" by "<..>") ;; Also handle sub_superscripts and checkboxes (or (string-match org-table-hline-regexp line) (setq line (org-odt-expand line))) ;; Format the links (setq start 0) (while (string-match org-bracket-link-analytic-regexp++ line start) (setq start (match-beginning 0)) (setq path (save-match-data (org-link-unescape (match-string 3 line)))) (setq type (cond ((match-end 2) (match-string 2 line)) ((save-match-data (or (file-name-absolute-p path) (string-match "^\\.\\.?/" path))) "file") (t "internal"))) (setq path (org-extract-attributes (org-link-unescape path))) (setq nodesc (get-text-property 0 'org-no-description path)) (setq attr (get-text-property 0 'org-attributes path)) (setq desc1 (if (match-end 5) (match-string 5 line)) desc2 (if (match-end 2) (concat type ":" path) path) descp (and desc1 (not (equal desc1 desc2))) desc (or desc1 desc2)) ;; Make an image out of the description if that is so wanted (when (and descp (org-file-image-p desc org-export-odt-inline-image-extensions)) (save-match-data (if (string-match "^file:" desc) (setq desc (substring desc (match-end 0))))) (setq desc (org-add-props (concat "") '(org-protected t)))) (cond ((equal type "internal") (let ((frag-0 (if (= (string-to-char path) ?#) (substring path 1) path)) (xref nodesc)) (setq rpl (org-odt-make-link opt-plist "" "" (org-solidify-link-text (save-match-data (org-link-unescape frag-0)) nil) desc attr nil xref)))) ((and (equal type "id") (setq id-file (org-id-find-id-file path))) ;; This is an id: link to another file (if it was the same file, ;; it would have become an internal link...) (save-match-data (setq id-file (file-relative-name id-file (file-name-directory org-current-export-file))) (setq rpl (org-odt-make-link opt-plist "file" id-file (concat (if (org-uuidgen-p path) "ID-") path) desc attr nil)))) ((member type '("http" "https")) ;; standard URL, can inline as image (setq rpl (org-odt-make-link opt-plist type path nil desc attr (org-odt-should-inline-p path descp)))) ((member type '("ftp" "mailto" "news")) ;; standard URL, can't inline as image (setq rpl (org-odt-make-link opt-plist type path nil desc attr nil))) ((string= type "coderef") (let* ((coderef-str (format "coderef-%s" path)) (attr-1 (format "class=\"coderef\" onmouseover=\"CodeHighlightOn(this, '%s');\" onmouseout=\"CodeHighlightOff(this, '%s');\"" coderef-str coderef-str))) (setq rpl (org-odt-make-link opt-plist type "" coderef-str (format (org-export-get-coderef-format path (and descp desc)) (cdr (assoc path org-export-code-refs))) attr-1 nil)))) ((functionp (setq fnc (nth 2 (assoc type org-link-protocols)))) ;; The link protocol has a function for format the link (setq rpl (save-match-data (funcall fnc (org-link-unescape path) desc1 'odt)))) ((string= type "file") ;; FILE link (save-match-data (let* ((components (if (string-match "::\\(.*\\)" path) (list (replace-match "" t nil path) (match-string 1 path)) (list path nil))) ;;The proper path, without a fragment (path-1 (first components)) ;;The raw fragment (fragment-0 (second components)) ;;Check the fragment. If it can't be used as ;;target fragment we'll pass nil instead. (fragment-1 (if (and fragment-0 (not (string-match "^[0-9]*$" fragment-0)) (not (string-match "^\\*" fragment-0)) (not (string-match "^/.*/$" fragment-0))) (org-solidify-link-text (org-link-unescape fragment-0)) nil)) (desc-2 ;;Description minus "file:" and ".org" (if (string-match "^file:" desc) (let ((desc-1 (replace-match "" t t desc))) (if (string-match "\\.org$" desc-1) (replace-match "" t t desc-1) desc-1)) desc))) (setq rpl (if (and (functionp link-validate) (not (funcall link-validate path-1 current-dir))) desc (org-odt-make-link opt-plist "file" path-1 fragment-1 desc-2 attr (org-odt-should-inline-p path-1 descp))))))) (t ;; just publish the path, as default (setq rpl (concat "<" type ":" (save-match-data (org-link-unescape path)) ">")))) (setq line (replace-match rpl t t line) start (+ start (length rpl)))) ;; TODO items (if (and (string-match org-todo-line-regexp line) (match-beginning 2)) (setq line (concat (substring line 0 (match-beginning 2)) " " (org-export-odt-get-todo-kwd-class-name (match-string 2 line)) "" (substring line (match-end 2))))) ;; Does this contain a reference to a footnote? (when org-export-with-footnotes (setq start 0) (while (string-match "\\([^* \t].*?\\)\\[\\([0-9]+\\)\\]" line start) (if (get-text-property (match-beginning 2) 'org-protected line) (setq start (match-end 2)) (let* ((n (match-string 2 line)) (def (cdr (assoc n footnote-list)))) (cond ((assoc n footref-seen) (setq line (replace-match (format "%s%s" (or (match-string 1 line) "") (org-odt-format-footnote-ref n)) t t line))) (t (push (cons n 1) footref-seen) (setq line (replace-match (format "%s%s" (or (match-string 1 line) "") (org-odt-format-footnote n def)) t t line)))))))) (cond ((string-match "^\\(\\*+\\)[ \t]+\\(.*\\)" line) ;; This is a headline (setq level (org-tr-level (- (match-end 1) (match-beginning 1) level-offset)) txt (match-string 2 line)) (if (string-match quote-re0 txt) (setq txt (replace-match "" t t txt))) (if (<= level (max umax umax-toc)) (setq head-count (+ head-count 1))) ;; FIXME: Empty lines before the first headline creates a ;; paragraph. Unless they are closed, it interferes with ;; the placement of table of contents. For now just close ;; such paragraphs. (org-odt-close-par-maybe) (setq first-heading-pos (or first-heading-pos (point))) (org-odt-level-start level txt umax (and org-export-with-toc (<= level umax)) head-count) ;; QUOTES (when (string-match quote-re line) (org-odt-close-par-maybe) (insert "
    ")
    	      (setq inquote t)))
    
    	   ((and org-export-with-tables
    		 (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)" line))
    	    (when (not table-open)
    	      ;; New table starts
    	      (setq table-open t table-buffer nil table-orig-buffer nil))
    
    	    ;; Accumulate lines
    	    (setq table-buffer (cons line table-buffer)
    		  table-orig-buffer (cons origline table-orig-buffer))
    	    (when (or (not lines)
    		      (not (string-match "^\\([ \t]*\\)\\(|\\|\\+-+\\+\\)"
    					 (car lines))))
    	      (setq table-open nil
    		    table-buffer (nreverse table-buffer)
    		    table-orig-buffer (nreverse table-orig-buffer))
    	      (org-odt-close-par-maybe)
    	      (insert (org-format-table-odt table-buffer table-orig-buffer))))
    	   (t
    	    ;; Normal lines
    	    (when (string-match
    		   (cond
    		    ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)")
    		    ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)")
    		    ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+)\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)")
    		    (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))
    		   line)
    	      (setq ind (or (get-text-property 0 'original-indentation line)
    			    (org-get-string-indentation line))
    		    item-type (if (match-beginning 4) "o" "u")
    		    starter (if (match-beginning 2)
    				(substring (match-string 2 line) 0 -1))
    		    line (substring line (match-beginning 5))
    		    item-number nil
    		    item-tag nil)
    	      (if (string-match "\\[@\\(?:start:\\)?\\([0-9]+\\)\\][ \t]?" line)
    		  (setq item-number (match-string 1 line)
    			line (replace-match "" t t line)))
    	      (if (and starter (string-match "\\(.*?\\) ::[ \t]*" line))
    		  (setq item-type "d"
    			item-tag (match-string 1 line)
    			line (substring line (match-end 0))))
    	      (cond
    	       ((and starter
    		     (or (not in-local-list)
    			 (> ind (car local-list-indent))))
    		;; Start new (level of) list
    
    
    		(org-odt-close-par-maybe)
    
    		(cond
    		 ((equal item-type "u") (org-odt-do-open-list item-type))
    		 ((equal item-type "o") (org-odt-do-open-list item-type))
    
    		 ;; TODO
    		 ((and (equal item-type "o") item-number)
    		  (format "
      \n
    1. \n" item-number)) ((equal item-type "d") (org-odt-do-open-description-list item-tag))) (push item-type local-list-type) (push ind local-list-indent) (setq in-local-list t)) ;; Continue list (starter ;; terminate any previous sublist but first ensure ;; list is not ill-formed. (let ((min-ind (apply 'min local-list-indent))) (when (< ind min-ind) (setq ind min-ind))) (while (< ind (car local-list-indent)) (org-odt-do-close-list-item (car local-list-type)) (org-odt-close-list) (pop local-list-type) (pop local-list-indent) (setq in-local-list local-list-indent)) ;; insert new item (org-odt-do-close-list-item (car local-list-type)) (cond ((equal (car local-list-type) "d") (org-odt-do-open-description-list-item item-tag)) ;; TODO ((and (equal item-type "o") item-number) (format "
    2. \n" item-number)) (t (org-odt-do-open-list-item))))) (if (string-match "^[ \t]*\\[\\([X ]\\)\\]" line) (setq line (replace-match (if (equal (match-string 1 line) "X") "[X]" "[X]") t t line)))) ;; Horizontal line (when (string-match "^[ \t]*-\\{5,\\}[ \t]*$" line) (if org-par-open (insert "\n

      \n
      \n

      \n") (insert "\n


      \n")) (throw 'nextline nil)) ;; Empty lines start a new paragraph. If hand-formatted lists ;; are not fully interpreted, lines starting with "-", "+", "*" ;; also start a new paragraph. (if (string-match "^ [-+*]-\\|^[ \t]*$" line) (org-odt-do-open-par)) ;; Is this the start of a footnote? (when org-export-with-footnotes (when (and (boundp 'footnote-section-tag-regexp) (string-match (concat "^" footnote-section-tag-regexp) line)) ;; ignore this line (throw 'nextline nil)) (when (string-match "^[ \t]*\\[\\([0-9]+\\)\\]" line) (org-odt-close-par-maybe) ;; ignore this line (throw 'nextline nil))) ;; Check if the line break needs to be conserved (cond ((string-match "\\\\\\\\[ \t]*$" line) (setq line (replace-match "" t t line))) (org-export-preserve-breaks (setq line (concat line "")))) ;; Check if a paragraph should be started (let ((start 0)) (while (and org-par-open (string-match "\\\\par\\>" line start)) ;; Leave a space in the

      so that the footnote matcher ;; does not see this. (if (not (get-text-property (match-beginning 0) 'org-protected line)) (setq line (replace-match "

      " t t line))) (setq start (match-end 0)))) (insert line "\n"))))) ;; Properly close all local lists and other lists (when inquote (insert "

    \n") (org-odt-do-open-par)) (org-odt-level-start 1 nil umax (and org-export-with-toc (<= level umax)) head-count) ;; the to close the last text-... div. (when (and (> umax 0) first-heading-pos) (insert "
    \n")) (let ((bib (org-export-odt-get-bibliography))) (when bib (insert "\n" bib "\n"))) (unless body-only (org-export-odt-update-meta-file opt-plist) (org-export-odt-insert-plist-item opt-plist :postamble opt-plist) ;; odt code ;; (insert "\n") (org-odt-close-section) ;; odt code ;; (insert "\n") ;; (insert "\n\n") (insert "\n
    ") (insert "\n
    ") (insert "\n
    \n")) (unless (plist-get opt-plist :buffer-will-be-killed) (normal-mode) (if (eq major-mode (default-value 'major-mode)) (odt-mode))) (org-odt-insert-toc thetoc first-heading-pos) (org-odt-final-cleanup) ;; Run the hook (run-hooks 'org-export-odt-final-hook) (or to-buffer (progn (org-export-odt-zip outdir target) ;; FIXME: use find-file-noselect? (find-file target))) (goto-char (point-min)) (or (org-export-push-to-kill-ring "ODT") (message "Exporting... done")) (if (eq to-buffer 'string) (prog1 (buffer-substring (point-min) (point-max)) (kill-buffer (current-buffer))) (current-buffer))))) (defun org-export-odt-insert-plist-item (plist key &rest args) (let ((item (plist-get plist key))) (cond ((functionp item) (apply item args)) (item (insert item))))) (defun org-export-odt-format-href (s) "Make sure the S is valid as a href reference in an XODT document." (save-match-data (let ((start 0)) (while (string-match "&" s start) (setq start (+ (match-beginning 0) 3) s (replace-match "&" t t s))))) s) (defun org-export-odt-format-desc (s) "Make sure the S is valid as a description in a link." (if (and s (not (get-text-property 1 'org-protected s))) (save-match-data (org-odt-do-expand s)) s)) ;; DON'T DISTURB ;; (defun org-export-odt-format-image (src par-open) ;; "Create image tag with source and attributes." ;; (save-match-data ;; (if (string-match "^ltxpng/" src) ;; (format "\"%s\"/" ;; src (org-find-text-property-in-string 'org-latex-src src)) ;; (let* ((caption (org-find-text-property-in-string 'org-caption src)) ;; (attr (org-find-text-property-in-string 'org-attributes src)) ;; (label (org-find-text-property-in-string 'org-label src))) ;; (setq caption (and caption (org-odt-do-expand caption))) ;; (concat ;; (if caption ;; (format "%s
    ;;

    " ;; (if org-par-open "

    \n" "") ;; (if label (format "id=\"%s\" " label) ""))) ;; (format "" ;; src ;; (if (string-match "\\%s ;;
    %s" ;; (concat "\n

    " caption "

    ") ;; (if org-par-open "\n

    " "")))))))) (defun org-export-odt-format-image (src par-open) "Create image tag with source and attributes." (save-match-data (if (string-match "^ltxpng/" src) (format "\"%s\"/" src (org-find-text-property-in-string 'org-latex-src src)) (let* ((caption (org-find-text-property-in-string 'org-caption src)) (attr (org-find-text-property-in-string 'org-attributes src)) (label (org-find-text-property-in-string 'org-label src))) (setq caption (and caption (org-odt-do-expand caption))) (org-odt-embed-image src))))) (defun org-export-odt-get-bibliography () "Find bibliography, cut it out and return it." (catch 'exit (let (beg end (cnt 1) bib) (save-excursion (goto-char (point-min)) (when (re-search-forward "^[ \t]*

    " nil t) (setq cnt (+ cnt (if (string= (match-string 0) "") (forward-char 1)) (setq bib (buffer-substring beg (point))) (delete-region beg (point)) (throw 'exit bib)))) nil)))) (defvar org-table-number-regexp) ; defined in org-table.el (defun org-format-table-odt (lines olines) "Find out which ODT converter to use and return the ODT code." (if (stringp lines) (setq lines (org-split-string lines "\n"))) (if (string-match "^[ \t]*|" (car lines)) ;; A normal org table (org-format-org-table-odt lines) ;; Table made by table.el - test for spanning (let* ((hlines (delq nil (mapcar (lambda (x) (if (string-match "^[ \t]*\\+-" x) x nil)) lines))) (first (car hlines)) (ll (and (string-match "\\S-+" first) (match-string 0 first))) (re (concat "^[ \t]*" (regexp-quote ll))) (spanning (delq nil (mapcar (lambda (x) (not (string-match re x))) hlines)))) (if (and (not spanning) (not org-export-prefer-native-exporter-for-tables)) ;; We can use my own converter with ODT conversions (org-format-table-table-odt lines) ;; Need to use the code generator in table.el, with the original text. (org-format-table-table-odt-using-table-generate-source olines))))) (defvar org-table-number-fraction) ; defined in org-table.el (defconst org-odt-table-caption-format "Table %s %s") (defun org-format-org-table-odt (lines &optional splice) "Format a table into ODT." (require 'org-table) ;; Get rid of hlines at beginning and end (if (string-match "^[ \t]*|-" (car lines)) (setq lines (cdr lines))) (setq lines (nreverse lines)) (if (string-match "^[ \t]*|-" (car lines)) (setq lines (cdr lines))) (setq lines (nreverse lines)) (when org-export-table-remove-special-lines ;; Check if the table has a marking column. If yes remove the ;; column and the special lines (setq lines (org-table-clean-before-export lines))) (let* ((caption (org-find-text-property-in-string 'org-caption (car lines))) (label (org-find-text-property-in-string 'org-label (car lines))) ;; ODT FIXME: Attributes ;; (attributes (org-find-text-property-in-string 'org-attributes ;; (car lines))) ;; (odt-table-tag (org-export-splice-attributes ;; odt-table-tag attributes)) (head (and org-export-highlight-first-table-line (delq nil (mapcar (lambda (x) (string-match "^[ \t]*|-" x)) (cdr lines))))) (nline 0) fnum nfields i tbopen line fields odt gr colgropen rowstart rowend (style '())) (setq caption (and caption (org-odt-do-expand caption))) (if splice (setq head nil)) (unless splice (push (if head (car org-odt-table-header-rows-tags) (car org-odt-table-rows-tags)) odt)) (setq tbopen t) (while (setq line (pop lines)) (catch 'next-line (if (string-match "^[ \t]*|-" line) (progn (unless splice (push (if head (cdr org-odt-table-header-rows-tags) (cdr org-odt-table-rows-tags)) odt) (if lines (push (car org-odt-table-rows-tags) odt) (setq tbopen nil))) (setq head nil) ;; head ends here, first time around ;; ignore this line (throw 'next-line t))) ;; Break the line into fields (setq fields (org-split-string line "[ \t]*|[ \t]*")) (unless fnum (setq fnum (make-vector (length fields) 0) nfields (length fnum))) (setq nline (1+ nline) i -1 rowstart (eval (car org-odt-table-row-tags)) rowend (eval (cdr org-odt-table-row-tags))) (push (concat rowstart (mapconcat (lambda (x) (setq i (1+ i)) (if (and (< i nfields) ; make sure no rogue line causes an error here (string-match org-table-number-regexp x)) (incf (aref fnum i))) (cond ;; ODT FIXME (head (concat (format (car org-odt-table-header-tags) (or (nth i style) "Default")) x (cdr org-odt-table-header-tags))) ;; ((and (= i 0) org-export-odt-table-use-header-tags-for-first-column) ;; (concat ;; (format (car org-odt-table-header-tags) "row") ;; x ;; (cdr org-odt-table-header-tags))) (t (concat (format (car org-odt-table-data-tags) (or (nth i style) "Default")) x (cdr org-odt-table-data-tags))))) fields "") rowend) odt))) (unless splice (if tbopen (push (cdr org-odt-table-rows-tags) odt))) (unless splice (push "\n" odt)) (setq odt (nreverse odt)) (unless splice ;; ODT FIXME: colgroups ;; Put in col tags with the alignment (unfortunately often ignored...) (unless (car org-table-colgroup-info) (setq org-table-colgroup-info (cons :start (cdr org-table-colgroup-info)))) ;; (push (mapconcat ;; (lambda (x) ;; (setq gr (pop org-table-colgroup-info)) ;; (format "%s
    %s" ;; (if (memq gr '(:start :startend)) ;; (prog1 ;; (if colgropen "\n" "") ;; (setq colgropen t)) ;; "") ;; (if (> (/ (float x) nline) org-table-number-fraction) ;; "right" "left") ;; (if (memq gr '(:end :startend)) ;; (progn (setq colgropen nil) "") ;; "")) ;; ) ;; fnum "") ;; odt) ;; (if colgropen (setq odt (cons (car odt) (cons "" (cdr odt))))) ;; ODT FIXME: Revisit table:table-column (push (format (car org-odt-table-column-tags) (length fnum)) odt) ;; Since the output of ODT table formatter can also be used in ;; DocBook document, we want to always include the caption to make ;; DocBook XML file valid. ;; ODT FIXME: caption and labels (push (format org-odt-table-tag "TableName" "TableStyle") odt) (if label (push (format org-odt-table-caption-format label label (or caption "")) odt) (push (format org-odt-table-caption-format "FIXME" "FIXME" (or caption "")) odt)) ) (concat (mapconcat 'identity odt "\n") "\n"))) (defun org-export-splice-attributes (tag attributes) "Read attributes in string ATTRIBUTES, add and replace in ODT tag TAG." (if (not attributes) tag (let (oldatt newatt) (setq oldatt (org-extract-attributes-from-string tag) tag (pop oldatt) newatt (cdr (org-extract-attributes-from-string attributes))) (while newatt (setq oldatt (plist-put oldatt (pop newatt) (pop newatt)))) (if (string-match ">" tag) (setq tag (replace-match (concat (org-attributes-to-string oldatt) ">") t t tag))) tag))) (defun org-format-table-table-odt (lines) "Format a table generated by table.el into ODT. This conversion does *not* use `table-generate-source' from table.el. This has the advantage that Org-mode's ODT conversions can be used. But it has the disadvantage, that no cell- or row-spanning is allowed." (let (line field-buffer (head org-export-highlight-first-table-line) fields odt empty i) (setq odt (concat odt-table-tag "\n")) (while (setq line (pop lines)) (setq empty " ") (catch 'next-line (if (string-match "^[ \t]*\\+-" line) (progn (if field-buffer (progn (setq odt (concat odt "" (mapconcat (lambda (x) (if (equal x "") (setq x empty)) (if head (concat (format (car org-odt-table-header-tags) "col") x (cdr org-odt-table-header-tags)) (concat (car org-odt-table-data-tags) x (cdr org-odt-table-data-tags)))) field-buffer "\n") "\n")) (setq head nil) (setq field-buffer nil))) ;; Ignore this line (throw 'next-line t))) ;; Break the line into fields and store the fields (setq fields (org-split-string line "[ \t]*|[ \t]*")) (if field-buffer (setq field-buffer (mapcar (lambda (x) (concat x "
    " (pop fields))) field-buffer)) (setq field-buffer fields)))) (setq odt (concat odt "
    \n")) odt)) (defun org-format-table-table-odt-using-table-generate-source (lines) "Format a table into odt, using `table-generate-source' from table.el. This has the advantage that cell- or row-spanning is allowed. But it has the disadvantage, that Org-mode's ODT conversions cannot be used." (require 'table) (with-current-buffer (get-buffer-create " org-tmp1 ") (erase-buffer) (insert (mapconcat 'identity lines "\n")) (goto-char (point-min)) (if (not (re-search-forward "|[^+]" nil t)) (error "Error processing table")) (table-recognize-table) (with-current-buffer (get-buffer-create " org-tmp2 ") (erase-buffer)) (table-generate-source 'odt " org-tmp2 ") (set-buffer " org-tmp2 ") (buffer-substring (point-min) (point-max)))) (defun org-odt-handle-time-stamps (s) "Format time stamps in string S, or remove them." (catch 'exit (let (r b) (while (string-match org-maybe-keyword-time-regexp s) (or b (setq b (substring s 0 (match-beginning 0)))) (setq r (concat r (substring s 0 (match-beginning 0)) " @" (if (match-end 1) (format "@%s @" (match-string 1 s))) (format " @%s@" (substring (org-translate-time (match-string 3 s)) 1 -1)) "@") s (substring s (match-end 0)))) ;; Line break if line started and ended with time stamp stuff (if (not r) s (setq r (concat r s)) (unless (string-match "\\S-" (concat b s)) (setq r (concat r "@
    "))) r)))) (defvar odtize-buffer-places) ; from odtize.el (defun org-export-odtize-region-for-paste (beg end) "Convert the region to ODT, using odtize.el. This is much like `odtize-region-for-paste', only that it uses the settings define in the org-... variables." (let* ((odtize-output-type org-export-odtize-output-type) (odtize-css-name-prefix org-export-odtize-css-font-prefix) (odtbuf (odtize-region beg end))) (unwind-protect (with-current-buffer odtbuf (buffer-substring (plist-get odtize-buffer-places 'content-start) (plist-get odtize-buffer-places 'content-end))) (kill-buffer odtbuf)))) ;;;###autoload (defun org-export-odtize-generate-css () "Create the CSS for all font definitions in the current Emacs session. Use this to create face definitions in your CSS style file that can then be used by code snippets transformed by odtize. This command just produces a buffer that contains class definitions for all faces used in the current Emacs session. You can copy and paste the ones you need into your CSS file. If you then set `org-export-odtize-output-type' to `css', calls to the function `org-export-odtize-region-for-paste' will produce code that uses these same face definitions." (interactive) (require 'odtize) (and (get-buffer "*odt*") (kill-buffer "*odt*")) (with-temp-buffer (let ((fl (face-list)) (odtize-css-name-prefix "org-") (odtize-output-type 'css) f i) (while (setq f (pop fl) i (and f (face-attribute f :inherit))) (when (and (symbolp f) (or (not i) (not (listp i)))) (insert (org-add-props (copy-sequence "1") nil 'face f)))) (odtize-region (point-min) (point-max)))) (switch-to-buffer "*odt*") (goto-char (point-min)) (if (re-search-forward "" nil t) (delete-region (1+ (match-end 0)) (point-max))) (beginning-of-line 1) (if (looking-at " +") (replace-match "")) (goto-char (point-min))) (defun org-odt-protect (s) "convert & to &, < to < and > to >" ;; FIXME: Messes with verse element. Disable it for now ;; FIXME: If Disabled creates <<<>>> in TOC for Radioed Headlines, ;; so enable it Naturally verse environment is right now broken (when t (let ((start 0)) (while (string-match "&" s start) (setq s (replace-match "&" t t s) start (1+ (match-beginning 0)))) (while (string-match "<" s) (setq s (replace-match "<" t t s))) (while (string-match ">" s) (setq s (replace-match ">" t t s))) ;; (while (string-match "\"" s) ;; (setq s (replace-match """ t t s))) ) ) s) (defun org-odt-expand (string) "Prepare STRING for ODT export. Apply all active conversions. If there are links in the string, don't modify these." (let* ((re (concat org-bracket-link-regexp "\\|" (org-re "[ \t]+\\(:[[:alnum:]_@#%:]+:\\)[ \t]*$"))) m s l res) (if (string-match "^[ \t]*\\+-[-+]*\\+[ \t]*$" string) string (while (setq m (string-match re string)) (setq s (substring string 0 m) l (match-string 0 string) string (substring string (match-end 0))) (push (org-odt-do-expand s) res) (push l res)) (push (org-odt-do-expand string) res) (apply 'concat (nreverse res))))) (defcustom org-export-odt-emphasis-alist `(("*" "" "") ("/" "" "") ("_" "" "") ("=" "" "") ("~" "" "") ("+" "" "")) "A list of DocBook expressions to convert emphasis fontifiers. Each element of the list is a list of three elements. The first element is the character used as a marker for fontification. The second element is a formatting string to wrap fontified text with. The third element decides whether to protect converted text from other conversions." :group 'org-export-odt :type 'alist) ;; FIXME: rename, this is a general variable (defcustom org-export-odt-expand t "Non-nil means for ODT export, treat @<...> as ODT tag. When nil, these tags will be exported as plain text and therefore not be interpreted by a browser. This option can also be set with the +OPTIONS line, e.g. \"@:nil\"." :group 'org-export-odt :type 'boolean) (defun org-odt-do-expand (s) "Apply all active conversions to translate special ASCII to ODT." (setq s (org-odt-protect s)) (if org-export-odt-expand (while (string-match "@<\\([^&]*\\)>" s) (setq s (replace-match "<\\1>" t nil s)))) (if org-export-with-emphasize (setq s (org-export-odt-convert-emphasize s))) ;; FIXME: -- to ndash conversion happens here. Disable it for now. (if (and nil org-export-with-special-strings) (setq s (org-export-odt-convert-special-strings s))) (if org-export-with-sub-superscripts (setq s (org-export-odt-convert-sub-super s))) (if org-export-with-TeX-macros (let ((start 0) wd rep) (while (setq start (string-match "\\\\\\([a-zA-Z]+[0-9]*\\)\\({}\\)?" s start)) (if (get-text-property (match-beginning 0) 'org-protected s) (setq start (match-end 0)) (setq wd (match-string 1 s)) (if (setq rep (org-entity-get-representation wd 'odt)) (setq s (replace-match rep t t s)) (setq start (+ start (length wd)))))))) s) (defun org-export-odt-convert-special-strings (string) "Convert special characters in STRING to ODT." (let ((all org-export-odt-special-string-regexps) e a re rpl start) (while (setq a (pop all)) (setq re (car a) rpl (cdr a) start 0) (while (string-match re string start) (if (get-text-property (match-beginning 0) 'org-protected string) (setq start (match-end 0)) (setq string (replace-match rpl t nil string))))) string)) (defun org-export-odt-convert-sub-super (string) "Convert sub- and superscripts in STRING to ODT." (let (key c (s 0) (requireb (eq org-export-with-sub-superscripts '{}))) (while (string-match org-match-substring-regexp string s) (cond ((and requireb (match-end 8)) (setq s (match-end 2))) ((get-text-property (match-beginning 2) 'org-protected string) (setq s (match-end 2))) (t (setq s (match-end 1) key (if (string= (match-string 2 string) "_") "sub" "sup") c (or (match-string 8 string) (match-string 6 string) (match-string 5 string)) string (replace-match (concat (match-string 1 string) "<" key ">" c "") t t string))))) (while (string-match "\\\\\\([_^]\\)" string) (setq string (replace-match (match-string 1 string) t t string))) string)) (defun org-export-odt-convert-emphasize (string) "Apply emphasis for opendocument exporting." (let ((s 0) rpl) (while (string-match org-emph-re string s) (if (not (equal (substring string (match-beginning 3) (1+ (match-beginning 3))) (substring string (match-beginning 4) (1+ (match-beginning 4))))) (setq s (match-beginning 0) rpl (concat (match-string 1 string) (nth 1 (assoc (match-string 3 string) org-export-odt-emphasis-alist)) (match-string 4 string) (nth 2 (assoc (match-string 3 string) org-export-odt-emphasis-alist)) (match-string 5 string)) string (replace-match rpl t t string) s (+ s (- (length rpl) 2))) (setq s (1+ s)))) string)) (defun org-odt-do-open-par (&optional style) "Insert

    , but first close previous paragraph if any." (org-odt-close-par-maybe) (org-odt-open-par (or style "Text_20_body")) (setq org-par-open t)) (defun org-odt-close-par-maybe () "Close paragraph if there is one open." (when org-par-open (org-odt-close-par) (setq org-par-open nil))) ;; debugging utilities (defun org-odt-insert-comment (comment) (when t (insert (format "\n\n" comment)))) (defun org-odt-throw-error (msg) (throw 'error msg)) ;; headings (defun org-odt-open-section (name) (let ((style "Sect1")) (insert (format "\n" style name)))) (defun org-odt-close-section () (insert "\n\n")) (defun org-odt-insert-heading (heading outline-level) (insert (format "\n" outline-level outline-level) heading "\n\n")) ;; primitives begin (defun org-odt-open-par (&optional style) (setq style (or style "Text_20_body")) (insert (format "\n\n" style))) (defun org-odt-close-par () (insert "\n\n")) (defun org-odt-open-list (&optional style) (if style (insert (format "\n" style)) (insert ""))) (defun org-odt-close-list () (insert "\n")) (defun org-odt-open-list-item () (insert "\n")) (defun org-odt-close-list-item () (insert "\n")) ;; primitives end ;; compounds begin (defun org-odt-do-open-list (&optional item-type) (let (style-name) (cond ((equal item-type "u") (setq style-name "OrgBulletedList")) ((equal item-type "o") (setq style-name "OrgNumberedList")) ((equal item-type "d") (setq style-name "OrgDescriptionList"))) (org-odt-close-par-maybe) (org-odt-open-list style-name) (org-odt-do-open-list-item))) (defun org-odt-do-open-list-item (&optional style) (org-odt-open-list-item) (org-odt-do-open-par style)) (defun org-odt-do-open-description-list (item-tag) ;; (format "

    \n
    %s
    \n" item-tag) (org-odt-open-list "OrgDescriptionList") (org-odt-do-open-description-list-item item-tag)) (defun org-odt-do-open-description-list-item (item-tag) "" ;; (format "
    %s
    \n" item-tag) (org-odt-do-open-list-item "Text_20_body_20_bold") (insert item-tag) (org-odt-do-close-list-item) (org-odt-open-list-item) (org-odt-do-open-list)) (defun org-odt-do-close-list-item (&optional type) "Close
  • if necessary." ;; (insert (if (equal type "d") "
  • \n" "\n")) (org-odt-close-par-maybe) (org-odt-close-list-item) (when (equal type "d") (org-odt-close-list) (org-odt-close-list-item))) ;; compounds end (defvar in-local-list) (defvar local-list-indent) (defvar local-list-type) (defvar body-only) ; dynamically scoped into this. (defun org-odt-level-start (level title umax with-toc head-count) "Insert a new level in ODT export. When TITLE is nil, just close all open levels." (org-odt-close-par-maybe) (let* ((target (and title (org-get-text-property-any 0 'target title))) (extra-targets (and target (assoc target org-export-target-aliases))) (extra-class (and title (org-get-text-property-any 0 'odt-container-class title))) (preferred (and target (cdr (assoc target org-export-preferred-target-alist)))) (remove (or preferred target)) (l org-level-max) snumber snu href suffix) (setq extra-targets (remove remove extra-targets)) (setq extra-targets (mapconcat (lambda (x) (if (org-uuidgen-p x) (setq x (concat "ID-" x))) (format "" x x)) extra-targets "")) (while (>= l level) (if (aref org-levels-open (1- l)) (progn (org-odt-level-close l umax) (aset org-levels-open (1- l) nil))) (setq l (1- l))) (when title ;; If title is nil, this means this function is called to close ;; all levels, so the rest is done only if title is given (when (string-match (org-re "\\(:[[:alnum:]_@#%:]+:\\)[ \t]*$") title) (setq title (replace-match (if org-export-with-tags (save-match-data (concat "   " (mapconcat (lambda (x) (format "%s" (org-export-odt-get-tag-class-name x) x)) (org-split-string (match-string 1 title) ":") " ") "")) "") t t title))) (if (> level umax) (progn (if (aref org-levels-open (1- level)) (progn (org-odt-close-li) (if target (insert (format "
  • " target) extra-targets title "
    \n") (insert "
  • " title "
    \n"))) (aset org-levels-open (1- level) t) (org-odt-close-par-maybe) (if target (insert (format "
      \n
    • " target) extra-targets title "
      \n") (insert "
        \n
      • " title "
        \n")))) (aset org-levels-open (1- level) t) (setq snumber (org-section-number level) snu (replace-regexp-in-string "\\." "_" snumber)) (setq level (+ level org-export-odt-toplevel-hlevel -1)) (if (and org-export-with-section-numbers (not body-only)) (setq title (concat ;; interfering in bookmarks ;; (format "%s" ;; level snumber) " " title))) (unless (= head-count 1) (insert "\n\n")) (setq href (cdr (assoc (concat "sec-" snu) org-export-preferred-target-alist))) (setq suffix (or href snu)) (setq href (or href (concat "sec-" snu))) ;; suffix: 1.2 & href sec-1.2 ;; suffix: aabb & href aabb (insert (format "" "Sect1" suffix)) (org-odt-insert-heading (concat (format "%s" snumber) ;; (format "%s%s" snumber title) (let* ((frag href) (txt (concat (format org-odt-bookmark-tag frag) title))) (if (or org-export-odt-use-bookmarks-for-internal-links org-export-odt-use-bookmarks-for-toc) (setq txt (org-odt-bookmark-text-range frag txt))) txt)) level) (insert (format "" "Sect1" suffix)) (org-odt-do-open-par))))) (defun org-export-odt-get-tag-class-name (tag) "Turn tag into a valid class name. Replaces invalid characters with \"_\" and then prepends a prefix." (save-match-data (while (string-match "[^a-zA-Z0-9_]" tag) (setq tag (replace-match "_" t t tag)))) (concat org-export-odt-tag-class-prefix tag)) (defun org-export-odt-get-todo-kwd-class-name (kwd) "Turn todo keyword into a valid class name. Replaces invalid characters with \"_\" and then prepends a prefix." (save-match-data (while (string-match "[^a-zA-Z0-9_]" kwd) (setq kwd (replace-match "_" t t kwd)))) (concat org-export-odt-todo-kwd-class-prefix kwd)) (defun org-odt-level-close (level max-outline-level) "Terminate one level in ODT export." (if (<= level max-outline-level) (insert "\n") (org-odt-close-li) (insert "
      \n"))) ;; Zip and Unzipping of ODT files (defconst org-export-odt-tmpdir-prefix "odt-") ;; xml files generated on-the-fly (setq org-export-odt-save-list '("META-INF/manifest.xml" "content.xml" "meta.xml")) ;; xml files that are copied (setq org-export-odt-nosave-list '("styles.xml")) ;; xml files that contribute to the final odt file (setq org-export-odt-file-list (append org-export-odt-save-list org-export-odt-nosave-list)) (defun org-export-odt-outdir-init () (interactive) (let* ((outdir (make-temp-file org-export-odt-tmpdir-prefix t)) (content-file (expand-file-name "content.xml" outdir)) (manifest-file (expand-file-name "META-INF/manifest.xml" outdir)) (meta-file (expand-file-name "meta.xml" outdir)) (styles-file (expand-file-name "styles.xml" outdir)) (pictures-dir (expand-file-name "Pictures" outdir))) ;; manifest file (make-directory (file-name-directory manifest-file)) (with-current-buffer (find-file-noselect manifest-file) (erase-buffer) (insert (mapconcat 'identity (car org-export-odt-manifest-lines) "\n")) (insert "\n") (save-excursion (insert (mapconcat 'identity (cdr org-export-odt-manifest-lines) "\n")))) ;; meta file (with-current-buffer (find-file-noselect meta-file) (erase-buffer) (insert (mapconcat 'identity (car org-export-odt-meta-lines) "\n")) (insert "\n") (save-excursion (insert (mapconcat 'identity (cdr org-export-odt-meta-lines) "\n")))) ;; styles file (copy-file org-export-odt-styles-file styles-file t) ;; Pictures dir (make-directory pictures-dir) ;; content file (with-current-buffer (find-file-noselect content-file) (erase-buffer)) outdir)) ;; INLINE IMAGES ;; FIXME: Handle case where the same image is embedded multiple times ;; in the document (defconst org-odt-manifest-file-entry-tag "") (defun org-odt-update-manifest-file (media-type full-path) (with-current-buffer (find-file-noselect "META-INF/manifest.xml" outdir) (insert (format org-odt-manifest-file-entry-tag media-type full-path)))) ;; ;; ;; ;; ;; ;; ;; style-name => fr1 (inherits from Graphics) ;; name => graphics1 (possibly could be skipped) ;; anchor-type => paragraph ;; width => 12.435cm (can this be varied) ;; height => 10.054cm (can this be varied) ;; z-index => 0 (can this be varied) ;; INLINE IMAGES WITH CAPTIONS (SIMPLIFIED) ;; ;; ;; ;; ;; ;; ;; Illustration 1: FigureCaption ;; ;; ;; ;; INLINE IMAGES (TRUE FORM) ;; ;; ;; ;; Illustration 1: FigureCaption ;; ;; (defconst org-odt-frame-tag '("" . "")) (defconst org-odt-image-tag "") (defun org-odt-embed-image (path &optional width height) (with-temp-buffer (let* ((image-type (file-name-extension path)) (media-type (format "image/%s" type)) (full-path (format "Pictures/%s" (file-name-nondirectory path))) (width (or width 12)) (height (or height 10)) ;; in cms (z-index 0)) ;; copy the image to pictures dir ;; current-dir is dyanmically bound (message "current-dir: %s" current-dir) (copy-file (expand-file-name path current-dir) "Pictures" nil) ;; (org-odt-do-open-par "Standard") (insert (format (car org-odt-frame-tag) "Graphics" "graphics1" "paragraph" width height z-index)) (insert (format org-odt-image-tag full-path)) (insert (format (cdr org-odt-frame-tag))) ;; (org-odt-close-par) ;; add it to the save list (push full-path org-export-odt-file-list) (message "file-list: %s" org-export-odt-file-list) ;; update manifest file (org-odt-update-manifest-file media-type full-path)) (buffer-substring-no-properties (point-min) (point-max)))) ;; ODT: ANCHORS and LINKS (defconst org-odt-a-tag " %s ") ;; ODT: BOOKMARKS AND XREFS ;; Either marks a point or a marks a range ;; When it marks a point, it can be referenced using internet-style ;; link that are prefixed with a # ;; When it marks a range, it can be referenced using a OpenOffice ;; style xref (defconst org-odt-bookmark-tag "") (defconst org-odt-bookmark-start-end-tag '("" . "")) (defconst org-odt-bookmark-ref-tag " %s ") (defcustom org-export-odt-use-bookmarks-for-internal-links t "Export Internal links as bookmarks?.") (defconst org-export-odt-bookmark-prefix "__OrgXref_") (defun org-odt-bookmark-text-range (bmk-name text) (setq bmk-name (concat org-export-odt-bookmark-prefix bmk-name)) (concat (format (car org-odt-bookmark-start-end-tag) bmk-name) text (format (cdr org-odt-bookmark-start-end-tag) bmk-name))) (defun org-odt-bookmark-ref-begin (label) (insert (format (car org-odt-bookmark-ref-tag) label))) (defun org-odt-bookmark-ref-end () (insert (format (cdr org-odt-bookmark-ref-tag)))) (defun org-odt-format-internal-link (href desc xref &optional attr) (if xref (format org-odt-bookmark-ref-tag href desc) (format org-odt-a-tag href (or attr "") desc))) ;; PACKAGING (defun org-export-odt-zip (outdir target) ;; save all xml files (mapc (lambda (file) (with-current-buffer (find-file-noselect (expand-file-name file outdir)) ;; prettify output (indent-region (point-min) (point-max)) (save-buffer))) org-export-odt-save-list) (let* ((target-name (file-name-nondirectory target)) (target-dir (file-name-directory target)) (cmd (format "zip -r %s %s" target-name (mapconcat 'identity org-export-odt-file-list " ")))) (when (file-exists-p target) ;; FIXME: If the file is locked this throws an error (delete-file target)) ;; FIXME: check exit status (shell-command cmd nil) ;; move the file from outdir to target-dir (rename-file target-name target-dir) ;; kill all xml buffers (mapc (lambda (file) (kill-buffer (find-file-noselect (expand-file-name file outdir)))) org-export-odt-save-list) ;; delete the temporary directory created for zipping (delete-directory outdir))) ;; FIXME: Rationalize the path for styles file (defcustom org-export-odt-styles-file "~/src/base/org-mode/contrib/odt/styles.xml" "Default style file for use with ODT exporter." :group 'org-export-odt :type 'file) (defconst org-export-odt-manifest-lines '(("" "" "" "" "" "" "") . (""))) (defconst org-export-odt-meta-lines '(("" "" " ") . (" " ""))) (provide 'org-odt) ;; arch-tag: 8109d84d-eb8f-460b-b1a8-f45f3a6c7ea1 ;;; org-odt.el ends here --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=org-exp.el.diff Content-Description: org-exp.el.diff diff --git a/lisp/org-exp.el b/lisp/org-exp.el index ae18ad3..bf94899 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -893,6 +893,8 @@ value of `org-export-run-in-background'." \[D] export as DocBook [V] export as DocBook, process to PDF, and open +\[o] export as ODT [O] export as ODT and open + \[j] export as TaskJuggler [J] ... and open \[m] export as Freemind mind map @@ -921,6 +923,8 @@ value of `org-export-run-in-background'." (?g org-export-generic t) (?D org-export-as-docbook t) (?V org-export-as-docbook-pdf-and-open t) + (?o org-export-as-odt t) + (?O org-export-as-odt-and-open nil) (?j org-export-as-taskjuggler t) (?J org-export-as-taskjuggler-and-open t) (?m org-export-as-freemind t) @@ -1020,10 +1024,12 @@ on this string to produce the exported version." (asciip (plist-get parameters :for-ascii)) (latexp (plist-get parameters :for-LaTeX)) (docbookp (plist-get parameters :for-docbook)) + (odtp (plist-get parameters :for-odt)) (backend (cond (htmlp 'html) (latexp 'latex) (asciip 'ascii) - (docbookp 'docbook))) + (docbookp 'docbook) + (odtp 'odt))) (archived-trees (plist-get parameters :archived-trees)) (inhibit-read-only t) (drawers org-drawers) @@ -1193,6 +1199,12 @@ on this string to produce the exported version." (require 'org-docbook nil) (org-export-docbook-preprocess parameters)) + ;; ODT-specific preprocessing + ;; Table References are inserted here + (when odtp + (require 'org-odt nil) + (org-export-odt-preprocess parameters)) + ;; Remove or replace comments (org-export-handle-comments (plist-get parameters :comments)) @@ -1650,7 +1662,7 @@ These special cookies will later be interpreted by the backend. ((memq backend '(latex)) nil) ;; 2. Line-processing backends need to be told where lists end. - ((memq backend '(html docbook)) + ((memq backend '(html docbook odt)) (funcall process-buffer "ORG-LIST-END\n")) ;; 3. Others backends do not need to know this: clean list enders. (t @@ -2292,6 +2304,22 @@ INDENT was the original indentation of the block." "]]>\n") '(org-protected t org-example t)) "#+END_DOCBOOK\n")) + + ;; FIXME: backend should really be odt. Use html for + ;; now. The test short-circuits html specific processing + ;; that happens later. Not sure whether we need any of it + ;; later. + + ((eq backend 'odt) + (setq rtn (org-export-number-lines + rtn 'docbook 0 0 num cont rpllbl fmt)) + (concat "\n#+BEGIN_ODT\n" + (org-add-props + (concat + "" + rtn "\n") '(org-protected t org-example t)) + "#+END_ODT\n")) + ((eq backend 'html) ;; We are exporting to HTML (when lang --=-=-= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Emacs-orgmode mailing list Please use `Reply All' to send replies to the list. Emacs-orgmode@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-orgmode --=-=-=--