phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] [20843] update manual


From: Sigurd Nes
Subject: [Phpgroupware-cvs] [20843] update manual
Date: Fri, 20 Nov 2009 10:27:38 +0000

Revision: 20843
          
http://svn.sv.gnu.org/viewvc/?view=rev&root=phpgroupware&revision=20843
Author:   sigurdne
Date:     2009-11-20 10:27:37 +0000 (Fri, 20 Nov 2009)
Log Message:
-----------
update manual

Modified Paths:
--------------
    people/sigurdne/modules/manual/trunk/inc/class.odt2xhtml.inc.php
    people/sigurdne/modules/manual/trunk/inc/class.uimanual.inc.php
    people/sigurdne/modules/manual/trunk/templates/base/odt2xhtml.xsl

Added Paths:
-----------
    people/sigurdne/modules/manual/trunk/templates/base/sxw2xhtml.xsl

Modified: people/sigurdne/modules/manual/trunk/inc/class.odt2xhtml.inc.php
===================================================================
--- people/sigurdne/modules/manual/trunk/inc/class.odt2xhtml.inc.php    
2009-11-20 10:27:33 UTC (rev 20842)
+++ people/sigurdne/modules/manual/trunk/inc/class.odt2xhtml.inc.php    
2009-11-20 10:27:37 UTC (rev 20843)
@@ -1,89 +1,614 @@
 <?php
-       /**
-       * phpGroupWare - Manual
+/***
+ * class PHP odt2xhtml
+ * Copyright (C) 2006  Stephane HUC
        *
-       * @author Piotr MaliƄski <address@hidden>
-       * @author Sigurd Nes <address@hidden>
-       * @copyright Copyright (C) 2003,2004,2005,2006,2007 Free Software 
Foundation, Inc. http://www.fsf.org/
-       * @license http://www.gnu.org/licenses/gpl.html GNU General Public 
License
-       * @internal Development of this application was funded by 
http://www.bergen.kommune.no/bbb_/ekstern/
-       * @package manual
-       * @subpackage odt2xhtml
-       * @version $Id$
-       */
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  
USA
+ *
+ * Contact information:
+ *   Stephane HUC
+ *   <address@hidden>
+ *
+ ***/
 
-       /**
-        * odt2xhtml converts odt to xhtml
-        * @package odt2xhtml
-        */
+/******************************************************************************/
+/***   Dont touch at the rest !                                             
***/
+/******************************************************************************/
 
+class odt2xhtml
+{
+       public $dir=array();
+       public $file=array();
+       
+       private $attribute='';
+       private $body='';
+       private $code='';
+       private $content='';
+       private $debug='';
+       private $ext=array();
+       private $id='';
+       private $meta='';
+       private $pattern='';
+       private $position=array();
+       private $style='';
+       private $title='';
+       private $version=''; /*** php version ***/
 
-       class odt2xhtml
+       /***
+           publics functions
+       ***/
+       
+       public function __construct($file)
        {
-               public function oo_unzip($file, $path = false)
+               $this->version = substr(VERSION, 0, 1); // obtain 1rst string 
php version
+               
+               $this->dir['odf'] = 
$GLOBALS['phpgw_info']['server']['temp_dir'];       // dir root
+               
+               $this->file['full_path'] = $file;
+               $file = basename($file);
+               $this->file['name'] = substr($file, 0, -4);             // name 
file without extension
+               $this->file['ext'] = substr($file, -3, 3);              // just 
extension
+               
+               $this->dir['odf_tmp'] = $this->dir['odf'].'/tmp';       // tmp 
dir 
+               $this->dir['html'] = $this->dir['odf'].'/html';         // tmp 
dir html
+               $this->dir['img'] = $this->dir['html'].'/img';          // tmp 
dir img
+               
+               /*** define dir for attribute img src ***/
+               if(defined('IMG_SRC')) $this->dir['img_src'] = IMG_SRC.'img';
+               else $this->dir['img_src'] = 'img';
+               
+               $this->file['dir_tmp'] = 
$this->dir['odf_tmp'].'/php'.$this->version.'_'.$this->file['name'].'_'.$this->file['ext'];
+               $this->file['html_tmp'] = $this->file['dir_tmp'].'_tmp.html';   
// file html tmp
+               $this->file['xml_tmp'] = $this->file['dir_tmp'].'.xml'; // file 
xml tmp
+               
+               $this->dir['img_php'] = $this->dir['img'].'/php'.$this->version;
+               $this->dir['img_php_ext'] = 
$this->dir['img_php'].'/'.$this->file['ext'];
+               $this->dir['img_OOo'] = 
$this->dir['img_php_ext'].'/'.$this->file['name'];
+               $this->dir['pictures'] = $this->file['dir_tmp'].'/Pictures';
+               
+               $this->debug = 0;
+       }
+       
+       public function __destruct() 
+       {
+       }
+       
+       /*** Converter ODT TO XHTML ***/
+       public function convert2xhtml()
+       {
+               /*** verify if file's extension is really odf format ****/
+               $this->_valid_ext();
+               
+               /*** making all directories ***/
+               $this->_mk_all_dir();
+               
+               /*** unzip odf file ***/
+               $this->_unzip_odf();
+               
+               /*** choose better file xsl ***/
+               $this->_choose_valid_xsl();
+               
+               /***  make new file xml with ODF files xml ***/
+               $this->_make_new_xml_with_odf_files();
+               
+               /*** move file img to directory img ***/
+               $this->_mv_img();
+               
+               /*** Create temporary file html by xslt processor ***/
+               $this->_xslt_convert_odf();
+               
+               /*** Create real file html ***/
+               $this->_create_file_html();             
+
+       }
+       
+       /*** delete directory temporary ***/
+       public function delete_tmp($path='')
+       {       
+       //      ini_set('memory_limit', '24M');
+       //      ini_set('max_execution_time', 0);
+               if(empty($path)) $path = $this->dir['odf_tmp'];
+               
+               chmod($path, 0777);
+               $dir_tmp = opendir($path);
+               
+               /*** tant que la condition est juste en type alors on lit ***/
+               while(false !== ($file_tmp = readdir($dir_tmp)))
                {
-                       if(!function_exists('zip_open'))
+                       if($file_tmp != '.' && $file_tmp != '..')
                        {
-                               throw new Exception('NO ZIP FUNCTIONS DETECTED. 
Do you have the PECL ZIP extensions loaded?');
+                               $path_tmp = $path.'/'.$file_tmp;
+                               
+                               if(!empty($path_tmp) && is_file($path_tmp)) 
+                               {
+                                       unlink($path_tmp);
+                               }
+                               else 
+                               {
+                                       $this->delete_tmp($path_tmp);
+                               }
                        }
-                       if(!is_file($file))
+               }
+               
+               closedir($dir_tmp);
+               rmdir($path);
+               
+               if(!empty($this->debug)) echo 'Directory '.$path.' is deleted: 
OK!<br/>';
+               
+       //      ini_set('memory_limit', MEM);
+       //      ini_set('max_execution_time', MAX_TIME);
+       }
+       
+       /*** try to obtain elements when file html is created ***/
+       public function get_elements_html() {
+               $this->subject = 
file_get_contents($this->dir['html'].'/'.$this->file['name'].'.html');
+       
+               $this->pattern['meta'] = '`<meta (.*?) />`es';
+               $this->pattern['css'] = '`<style 
type="text/css">(.*?)</style>`es';
+               $this->pattern['body'] = '`<body>(.*?)</body>`es';
+               $this->pattern['title'] = '`<h1 class="(.*?)">(.*?)</h1>`es';
+               
+               foreach($this->pattern as $k => $v) {
+                       preg_match_all($v, $this->subject, $this->match); 
+                       $this->elements[$k] = $this->match;
+               }
+               
+               return $this->elements;
+       }
+       
+       public function display_elements_html($info,$x) {
+               $this->code='';
+               if($x != '0' && $x != '1') die('You can\'t use other digit, 
than 0 or 1, in the method display_elements_html() !');
+               
+               if(!empty($this->elements[$info]) && 
is_array($this->elements[$info])) {
+                       foreach($this->elements[$info][$x] as $v) {
+                               $this->code .= $v."\n";
+                       }
+                       echo $this->code;
+               }
+               else die('The searched element <strong>'.$info.'</strong> in 
the method display_elements_html() is empty or not exists ... try-it with 
\'css\',\'body\',\'meta\', or \'title\' !');
+       }
+       
+       /***
+           privates functions
+       ***/
+       
+       /*** transform values cm in px ***/
+       function _analyze_attribute($attribute) {
+               
+               if(ereg('cm',$attribute)) {
+                       if(ereg(' ',$attribute)) $xploz = explode(' 
',$attribute);
+                       
+                       if(!empty($xploz) && is_array($xploz)) {
+                               foreach($xploz as $k => $v) {
+                                       if(ereg('cm$',$v)) {
+                                               $v = 
round(floatval($v)*28.6264);
+                                               $xploz[$k] = $v.'px';
+                                       }
+
+                                       for($i=0;$i<count($xploz);$i++) {
+                                               if($i==0) $this->attribute = 
$xploz[$i];
+                                               else $this->attribute .= ' 
'.$xploz[$i];
+                                       }
+                               }
+                       }
+                       else {
+                               $this->attribute = 
round(floatval($attribute)*28.6264);
+                               $this->attribute = $this->attribute.'px';
+                       }
+                       unset($xploz);
+               }
+               else $this->attribute = $attribute;
+
+               $this->attribute = '="'.$this->attribute.'"';
+               
+               return $this->attribute;
+       }
+       
+       /*** choose better file xsl segun file's extension ***/
+       function _choose_valid_xsl() {
+               switch($this->file['ext']) {
+                       case 'odt' :
+                       case 'ott' :
+                               $this->file['xsl'] = PHPGW_SERVER_ROOT . 
'/manual/templates/base/odt2xhtml.xsl';
+                       break;
+                       case 'sxw' :
+                       case 'stw' :
+                               $this->file['xsl'] =PHPGW_SERVER_ROOT . 
'/manual/templates/base/sxw2xhtml.xsl';
+                       break;
+               }
+               
+               if(!empty($this->debug)) { echo 'Choosing valid XSL: ok!<br/>'; 
}
+       }
+       
+       /*** create ultimate file html ***/
+       function _create_file_html() {
+               /*** modify title in html flux ***/
+               $this->file['tmp'] = $this->_replace_content('title');
+               
+               /*** Create real file html ***/
+               
$this->_write_file($this->dir['html'].'/'.$this->file['name'].'.html','w',$this->file['tmp']);
+               
+               if(!empty($this->debug)) { echo 'Creating File HTML: OK!<br/>'; 
}
+       }
+       
+       /*** make image code html ***/
+       private function _make_image($name) 
+       {
+               $this->code = 
'xlink:href="'.$this->dir['img_src'].'/php'.$this->version.'/'.$this->file['ext'].'/'.$this->file['name'].'/'.$name.'"';
+               return $this->code;
+       }
+       
+       /*** make new file xml with ODF files xml ***/
+       private function _make_new_xml_with_odf_files() 
+       {               
+               /*** make file xml ***/
+               $this->content = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
+
+               switch($this->file['ext']) {
+                       case 'odt' :
+                       case 'ott' :
+                               $this->content .= 
$this->_replace_content('open_element_xml4odt');
+                       break;
+                       case 'sxw' :
+                       case 'stt' :
+                               $this->content .= 
$this->_replace_content('open_element_xml4sxw');
+                       break;
+               }
+               
+               
$this->_write_file($this->file['dir_tmp'].'.xml','w',$this->content);
+
+               /*** add meta.xml in file xml ***/
+               $this->file['xml'] = $this->file['dir_tmp'].'/meta.xml';
+
+               if(file_exists($this->file['xml']) && 
is_readable($this->file['xml'])) 
+       {
+                       $this->_read_xml($this->file['xml']);
+                       
+                       /*** modify the content ***/
+                       $this->content = str_replace('<?xml version="1.0" 
encoding="UTF-8"?>','',$this->content);
+                       
+                       switch($this->file['ext']) {
+                               case 'sxw' :
+                               case 'stw' :
+                                       $this->content = str_replace('<!DOCTYPE 
office:document-meta PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" 
"office.dtd">','',$this->content);
+                               break;
+                       }
+                       
+                       /*** build new file xml segun the modified content ***/
+                       
$this->_write_file($this->file['dir_tmp'].'.xml','a',$this->content);
+                       
+                       
+                       if(!empty($this->debug)) { echo 'Making File XML - Part 
Meta : ok!<br/>'; }
+               }
+               else die('Problem with file: '.$this->file['xml']);
+               
+               /*** add styles.xml in file xml modified ***/
+               $this->file['xml'] = $this->file['dir_tmp'].'/styles.xml';
+               
+               if(file_exists($this->file['xml']) && 
is_readable($this->file['xml'])) 
+               {
+                       $this->_read_xml($this->file['xml']);
+                       
+                       /*** modify the content ***/
+                       $this->content = str_replace('<?xml version="1.0" 
encoding="UTF-8"?>','',$this->content);
+                       
+                       switch($this->file['ext']) {
+                               case 'sxw' :
+                               case 'stw' :
+                                       $this->content = str_replace('<!DOCTYPE 
office:document-styles PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" 
"office.dtd">','',$this->content);
+                               break;
+                       }
+                       
+                       # analyze attribute to transform style's value cm in px
+                       $this->content = 
$this->_replace_content('analyze_attribute');
+                       
+                       
if(preg_match_all('/<style:header>(.*)<\/style:header>/Us',$this->content,$this->match))
 
+                               $this->header = 
str_replace('style:header','text:header',$this->match[0][0]);
+                       
if(preg_match_all('/<style:footer>(.*)<\/style:footer>/Us',$this->content,$this->match))
+                               $this->footer = 
str_replace('style:footer','text:footer',$this->match[0][0]);
+                       
+                       /*** build new file xml segun the modified content ***/
+                       
$this->_write_file($this->file['dir_tmp'].'.xml','a',$this->content);
+                       
+                       
+                       if(!empty($this->debug)) { echo 'Making File XML - Part 
Styles: ok!<br/>'; }
+               }
+               else die('Problem with file: '.$this->file['xml']);
+               
+               /*** add content.xml in file xml modified ***/
+               $this->file['xml'] = $this->file['dir_tmp'].'/content.xml';
+               
+               if(file_exists($this->file['xml']) && 
is_readable($this->file['xml'])) 
                        {
-                               throw new Exception('Can\'t find file: '.$file);
+                       $this->_read_xml($this->file['xml']);
+                       
+                       /*** modify the content ***/
+                       $this->content = str_replace('<?xml version="1.0" 
encoding="UTF-8"?>','',$this->content);
+                       
+                       switch($this->file['ext']) {
+                               case 'odt' :
+                               case 'ott' :
+                                       # add header page
+                                       if(!empty($this->header))       
$this->content = 
str_replace('<office:text>','<office:text>'.$this->header,$this->content); 
+                                       # modify src img
+                                       $this->content = 
$this->_replace_content('img_odt');
+                                       # add footer page
+                                       if(!empty($this->footer))       
$this->content = 
str_replace('</office:text>',$this->footer.'</office:text>',$this->content); 
+                               break;
+                               case 'sxw' :
+                               case 'stw' :
+                                       $this->content = str_replace('<!DOCTYPE 
office:document-content PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" 
"office.dtd">','',$this->content);
+                                       # add header page
+                                       if(!empty($this->header))       
$this->content = 
str_replace('<office:body>','<office:body>'.$this->header,$this->content); 
+                                       # modify src img
+                                       $this->content = 
$this->_replace_content('img_sxw');
+                                       # add footer page
+                                       if(!empty($this->footer))       
$this->content = 
str_replace('</office:body>',$this->footer.'</office:body>',$this->content); 
+                               break;
                        }
-                       if($zip = zip_open($file))
+
+                       # analyze attribute to transform style's value cm in px
+                       $this->content = 
$this->_replace_content('analyze_attribute');
+                       # search text in position indice or exposant to 
transform it correctly
+                       $this->_rewrite_position();
+                       
+                       /*** build new file xml segun the modified content ***/
+                       
$this->_write_file($this->file['dir_tmp'].'.xml','a',$this->content);
+                       
+                       if(!empty($this->debug)) { echo 'Making File XML - Part 
Content: ok!<br/>'; }
+               }
+               else die('Problem with file: '.$this->file['xml']);
+               
+               /*** modify the content ***/
+               $this->content = "\n".'</office:document>'."\n";
+               
+               /*** terminate file xml ***/
+               
$this->_write_file($this->file['dir_tmp'].'.xml','a',$this->content);
+               
+               
+               if(!empty($this->debug)) { echo 'Making File XML - Terminated: 
ok!<br/>'; }
+                       }
+
+       private function _mk_all_dir() {
+               umask(0000);
+               
+               /*** making temporary dir ***/
+               if(!file_exists($this->dir['odf_tmp']) && 
!is_dir($this->dir['odf_tmp'])) {
+                       mkdir($this->dir['odf_tmp'], 0777);
+                       if(!empty($this->debug)) { echo 'Making Dir TMP 
'.$this->dir['odf_tmp'].': OK!<br/>'; }
+               }
+               
+               /*** making dir to receive file html ***/
+               if(!file_exists($this->dir['html']) && 
!is_dir($this->dir['html'])) 
                        {
-                               while ($zip_entry = zip_read($zip))
+                       mkdir($this->dir['html'], 0777);
+                       if(!empty($this->debug)) { echo 'Making Dir HTML: 
OK!<br/>'; }
+                       }
+
+               /*** making directory to receive file img ***/
+               if(!file_exists($this->dir['img']) and 
!is_dir($this->dir['img']))
+                       {
+                       mkdir($this->dir['img'], 0777);
+                       if(!empty($this->debug)) { echo 'Making Dir IMG 
'.$this->dir['img'].': OK!<br/>'; }
+               }
+                       
+               if(!file_exists($this->dir['img_php']) and 
!is_dir($this->dir['img_php']))
                                {
-                                       $filename = zip_entry_name($zip_entry);
-                                       if(zip_entry_name($zip_entry) == 
'content.xml' and zip_entry_open($zip, $zip_entry, "r"))
+                       mkdir($this->dir['img_php'], 0777);
+                       if(!empty($this->debug)) { echo 'Making Dir 
'.$this->dir['img_php'].': OK!<br/>'; }
+               }
+                       
+               if(!file_exists($this->dir['img_php_ext']) and 
!is_dir($this->dir['img_php_ext']))
                                        {
-                                               $content = 
zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
-                                               zip_entry_close($zip_entry);
+                       mkdir($this->dir['img_php_ext'], 0777);
+                       if(!empty($this->debug)) { echo 'Making Dir 
'.$this->dir['img_php_ext'].': OK!<br/>'; }
                                        }
-                                       if(ereg('Pictures/', $filename) and 
!ereg('Object', $filename)  and zip_entry_open($zip, $zip_entry, "r"))
+               
+               if(!file_exists($this->dir['img_OOo']) and 
!is_dir($this->dir['img_OOo']))
                                        {
-                                               $img[$filename] = 
zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
-                                               zip_entry_close($zip_entry);
+                       mkdir($this->dir['img_OOo'], 0777);
+                       if(!empty($this->debug)) { echo 'Making Dir 
'.$this->dir['img_OOo'].': OK!<br/>'; }
                                        }
+               
+               if(!empty($this->debug)) { echo 'All dir are making: OK!<br/>'; 
}
                                }
-                               if(isset($content))
+
+       /*** modify title code html ***/
+       private function _modify_title()
+       {
+               $this->title = 
"<head>\n\t<title>&quot;".$this->file['name'].'.'.$this->file['ext'].'&quot; :: 
converted by Odt2Xhtml in PHP5</title>';
+               return $this->title;
+       }
+       
+       /*** make directory image and moving images ***/
+       private function _mv_img()
+       {               
+               /*** move img ***/
+               if(file_exists($this->dir['pictures']) && $this->handle = 
opendir($this->dir['pictures']))
                                {
-                                       if(isset($img) && is_array($img))
+                       while( false !== $this->file['img'] = 
readdir($this->handle) )
                                        {
-                                               if(!is_dir($path.'Pictures'))
+                               
if(is_file($this->dir['pictures'].'/'.$this->file['img']))
                                                {
-                                                       mkdir($path.'Pictures');
+                                       /*** move img at temp directory to img 
directory ***/
+                                       
if(rename($this->dir['pictures'].'/'.$this->file['img'], 
$this->dir['img_OOo'].'/'.$this->file['img'])) {
+                                               
chmod($this->dir['img_OOo'].'/'.$this->file['img'], 0644);
+                                               
+                                               if(!empty($this->debug)) { echo 
'Moving IMG '.$this->file['img'].': ok!<br/>'; }
+                                       }
+                                       else die('Image '.$this->file['img'].' 
can\'t be moved.');
+                               }
+                       }
+                       closedir($this->handle);
+               }
+               //else die('Directory can\'t be opened: 
'.$this->dir['img']['tmp']);
+       }
+       
+       /*** read file xml ***/
+       private function _read_xml($xml) {
+               $this->handle = fopen($xml, 'r');
+               $this->content = fread($this->handle, 
filesize($this->file['xml']));
+               fclose($this->handle);
+       }
+       
+       /*** replace content ***/
+       private function _replace_content($info) {
+               switch($info) {
+                       case 'analyze_attribute' :
+                               $this->exec=1;
+                               $this->search = '/="(.*?)"/es';
+                               $this->replace = 
"odt2xhtml::_analyze_attribute('$1')";
+                               $this->subject = $this->content;
+                       break;
+                       case 'img_odt' :
+                               $this->exec=1;
+                               $this->search = 
'#xlink:href="Pictures/([.a-zA-Z_0-9]*)"#es';
+                               $this->replace = "odt2xhtml::_make_image('$1')";
+                               $this->subject = $this->content;
+                       break;
+                       case 'img_sxw' :
+                               $this->exec=1;
+                               $this->search = 
'!xlink:href="\#Pictures/([.a-zA-Z_0-9]*)"!es';
+                               $this->replace = "odt2xhtml::_make_image('$1')";
+                               $this->subject = $this->content;
+                       break;
+                       case 'open_element_xml4odt' :
+                               $this->buffer = '<office:document 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0">';
+                       break;
+                       case 'open_element_xml4sxw' :
+                               $this->buffer = '<office:document 
xmlns:office="http://openoffice.org/2000/office";>';
+                       break;
+                       case 'title' :
+                               $this->exec=1;
+                               $this->search = '/<head>/es';
+                               $this->replace = "odt2xhtml::_modify_title()";
+                               $this->subject = $this->file['tmp'];
+                       break;
                                                }
-                                               foreach($img as $key => $val)
+               
+               if(!empty($this->exec)) $this->buffer = 
preg_replace($this->search,$this->replace,$this->subject);
+               
+               return $this->buffer;
+               
+               unset($this->buffer,$this->exec);
+       }
+       
+       /*** search text in position indice or exposant and transform it ***/
+       private function _rewrite_position() 
                                                {
-                                                       
file_put_contents($path.$key, $val);
+               # search styles text-position
+               switch($this->file['ext']) {
+                       case 'odt' :
+                       case 'ott' :
+                               if(preg_match_all('`<style:style 
style:name="T([0-9]+)" style:family="text"><style:text-properties 
style:text-position="(.*?)"/></style:style>`es',$this->content,$this->match)) {
+                                       $this->_make_position($this->match);
+                               }
+                       break;
+                       case 'sxw' :
+                       case 'stw' :
+                               if(preg_match_all('`<style:style 
style:name="T([0-9]+)" style:family="text"><style:properties 
style:text-position="(.*?)"/></style:style>`es',$this->content,$this->match)) {
+                                       $this->_make_position($this->match);
+                               }
+                       break;
+               }
+               unset($this->match);
+               # search text relative to style text-position
+               if(!empty($this->position) && preg_match_all('`<text:span 
text:style-name="T([0-9]+)">(.*?)</text:span>`es',$this->content,$this->match)) 
{
+                       
+                       foreach($this->match[1] as $k => $v) {
+                               if(in_array($v,$this->position['name'])) {
+                                       foreach($this->position['name'] as $k2 
=> $v2) {
+                                               if($v2 == $v) {
+                                                       
$this->position['search'][$k2] = '<text:span 
text:style-name="T'.$this->position['name'][$k2].'">'.$this->match[2][$k].'</text:span>';
+                                                       
$this->position['replace'][$k2] = '<text:'.$this->position['string'][$k2].' 
text:style-name="T'.$this->position['name'][$k2].'">'.$this->match[2][$k].'</text:'.$this->position['string'][$k2].'>';
                                                }
                                        }
-                                       return $content;
+                                               }
+                                       }
                                }
+               unset($this->match);
+               # replace search text position par replace text position
+               if(!empty($this->position['search']) && 
is_array($this->position['search'])) {
+                       foreach($this->position['search'] as $k => $v) {
+                               $this->content = str_replace($v, 
$this->position['replace'][$k], $this->content);
                        }
                }
+               unset($this->position);
+       }
 
-               public function oo_convert($xml)
+       /*** Unzip file ODT ***/
+       private function _unzip_odf() 
                {
-                       $xls = new DOMDocument;
-                       $xls->load(PHPGW_SERVER_ROOT . 
'/manual/templates/base/odt2html.xsl');
-               //      $xls->load(PHPGW_SERVER_ROOT . 
'/manual/templates/base/odt2xhtml.xsl');
-               //      $xls->load('xslt/export/xhtml/ooo2xhtml.xsl');
-               //      $xls->load('template.xsl');
-                       $xslt = new XSLTProcessor;
-                       $xslt->importStylesheet($xls);
+               $archive = CreateObject('phpgwapi.pclzip', 
$this->file['full_path']);
                
-                       $x = preg_replace('#<draw:image 
xlink:href="Pictures/([a-z .A-Z_0-9]*)" (.*?)/>#es', 
"ODT2XHTML::makeImage('\\1')", $xml);
+               if($archive->extract(PCLZIP_OPT_PATH, $this->file['dir_tmp']) 
== 0) 
+               {
+                       die('Error: '.$archive->errorInfo(true));
+               }
                
-                       $xml = new DOMDocument;
-                       $xml->loadXML($x);
-                       return $xslt->transformToXML($xml);
+               if(!empty($this->debug)) { echo 'Unzip ok!<br/>'; }
+               
                }
 
-               public function makeImage($img)
+       /*** Verify if extension is really odt ***/
+       private function _valid_ext() 
                {
-                       return '&lt;img src="Pictures/'.$img.'" border="0" 
/&gt;';
+               $this->ext['valid'] = array('odt', 'ott', 'stw', 'sxw');
+               
+               if(!in_array($this->file['ext'], $this->ext['valid'])) {
+                       die('No valid extension ! The script stop it ! Your 
extension could be odt, ott or sxw, stw...');
                }
+               
+               if(!empty($this->debug)) { echo 'Valid extension!<br/>'; }
        }
-?>
+       
+       /*** write file ***/
+       private function _write_file($filename,$mode,$resource) {
+               $this->handle = fopen($filename,$mode);
+               fwrite($this->handle,$resource);
+               fclose($this->handle);
+       }
+       
+       /*** PHP Convert XML ***/
+       private function _xslt_convert_odf() 
+       {
+               $xls = new DOMDocument();
+               $xls->load($this->file['xsl']);
+
+               $xslt = new XSLTProcessor();
+               $xslt->importStylesheet($xls);
+
+               $xml = new DOMDocument();
+               $xml->load($this->file['xml_tmp']);
+
+               $this->file['tmp'] = 
html_entity_decode($xslt->transformToXML($xml));
+               if(!empty($this->debug)) { echo 'Convert ODF to Temporary File 
HTML: ok!<br/>'; }
+       }
+       
+       /***
+               Protected functions
+       ***/
+       
+       /*** this function is run by method _rewrite_position() ***/
+       protected function _make_position($match) {
+               if(!empty($match) && is_array($match)) {
+                       foreach($match[1] as $k => $v) {
+                               $this->position['name'][$k] = $v;
+                               $this->position['string'][$k] = 
substr($match[2][$k], 0, 3);
+                       }
+               }
+       }
+}

Modified: people/sigurdne/modules/manual/trunk/inc/class.uimanual.inc.php
===================================================================
--- people/sigurdne/modules/manual/trunk/inc/class.uimanual.inc.php     
2009-11-20 10:27:33 UTC (rev 20842)
+++ people/sigurdne/modules/manual/trunk/inc/class.uimanual.inc.php     
2009-11-20 10:27:37 UTC (rev 20843)
@@ -11,8 +11,8 @@
        */
 
        /**
-        * Description
-        * @package property
+        * Manual Renderer
+        * @package manual
         */
 
        class manual_uimanual
@@ -68,16 +68,15 @@
 
                function help()
                {
-                       $odt2xhtml      = CreateObject('manual.odt2xhtml');
+                       $GLOBALS['phpgw_info']['flags']['noframework'] = true;
+                       $GLOBALS['phpgw_info']['flags']['no_reset_fonts'] = 
true;
                        $app = phpgw::get_var('app', 'string', 'GET');
                        $section = phpgw::get_var('section', 'string', 'GET');
 
                        if(!$section)
                        {
-                               $referer = 
parse_url(phpgw::get_var('HTTP_REFERER', 'string', 'SERVER') );
-                               parse_str($referer['query']);
-
-                               if(isset($menuaction) && $menuaction)
+                               $menuaction = phpgw::get_var('referer');
+                               if($menuaction)
                                {
                                        list($app_from_referer, $class, 
$method) = explode('.',$menuaction);
                                        if ( strpos($class, 'ui') === 0 )
@@ -111,7 +110,13 @@
 
                        if(is_file($odtfile))
                        {
-                               echo 
$odt2xhtml->oo_convert($odt2xhtml->oo_unzip($odtfile));
+                               $odt2xhtml      = 
CreateObject('manual.odt2xhtml',$odtfile);
+                               $odt2xhtml->convert2xhtml();
+                               $odt2xhtml->get_elements_html();
+                               //$odt2xhtml->display_elements_html('css',0); 
+                               //$odt2xhtml->display_elements_html('title',0); 
+                               $odt2xhtml->display_elements_html('body',0); 
+                               $odt2xhtml->delete_tmp();
                        }
                        else
                        {
@@ -128,6 +133,7 @@
 
                function attrib_help()
                {
+                       $GLOBALS['phpgw_info']['flags']['noframework'] = true;
                        $t =& $GLOBALS['phpgw']->template;
                        $t->set_root(PHPGW_APP_TPL);
 
@@ -138,16 +144,14 @@
                        $location       = phpgw::get_var('location');
                        $id                     = phpgw::get_var('id', 'int');
 
-                       $custom         = 
createObject('phpgwapi.custom_fields');
-                       
-                       $attrib_data    = $custom->get_attrib_single($appname, 
$location, $id);
+                       $attrib_data    = 
$GLOBALS['phpgw']->custom_fields->get($appname, $location, $id);
 
                        $function_msg   = lang('Help');
 
-                       $t->set_file('help','help.tpl');
-                       $t->set_var('title',lang('Help') . ' - "' . 
$attrib_data['input_text'] . '"');
-                       $t->set_var('help_msg',$attrib_data['helpmsg'] );
-                       $t->set_var('lang_close',lang('close') );
+                       $t->set_file('help', 'help.tpl');
+                       $t->set_var('title', lang('Help') . " - 
\"{$attrib_data['input_text']}\"");
+                       $t->set_var('help_msg', $attrib_data['helpmsg'] );
+                       $t->set_var('lang_close', lang('close'));
                                                                                
        
                        $GLOBALS['phpgw']->common->phpgw_header();
                        $t->pfp('out','help');

Modified: people/sigurdne/modules/manual/trunk/templates/base/odt2xhtml.xsl
===================================================================
--- people/sigurdne/modules/manual/trunk/templates/base/odt2xhtml.xsl   
2009-11-20 10:27:33 UTC (rev 20842)
+++ people/sigurdne/modules/manual/trunk/templates/base/odt2xhtml.xsl   
2009-11-20 10:27:37 UTC (rev 20843)
@@ -1,45 +1,5 @@
-<?xml version="1.0"?>
-<!--
-This file is dual-licensed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-LGPL:
-    This stylesheet converts OpenDocument text files to XHTML.
-    Copyright (C) 2005-2006 J. David Eisenberg
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library 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
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-       
-       Author: J. David Eisenberg
-       Contact: address@hidden
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
- Apache 2.0
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-
+<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0"
-       xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
     xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
     xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
     xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
@@ -54,183 +14,351 @@
     xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
     xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
     xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0"
-
     xmlns:dc="http://purl.org/dc/elements/1.1/";
     xmlns:xlink="http://www.w3.org/1999/xlink";
     xmlns:math="http://www.w3.org/1998/Math/MathML";
     xmlns:xforms="http://www.w3.org/2002/xforms";
-
     xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
     xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
     xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0"
-       
        xmlns:ooo="http://openoffice.org/2004/office";
        xmlns:ooow="http://openoffice.org/2004/writer";
        xmlns:oooc="http://openoffice.org/2004/calc";
-       xmlns:int="http://catcode.com/odf_to_xhtml/internal";
+       xmlns:int="http://opendocumentfellowship.org/internal"; 
     xmlns="http://www.w3.org/1999/xhtml";
-       exclude-result-prefixes="office meta config text table draw presentation
-               dr3d chart form script style number anim dc xlink math xforms fo
-               svg smil ooo ooow oooc int #default"
->
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
+       exclude-result-prefixes="office meta config text table draw 
presentation dr3d chart form script style number anim dc xlink math xforms fo 
svg smil ooo ooow oooc int #default">
 
-<xsl:output
+       <xsl:output 
        method="xml"
        indent="yes"
        omit-xml-declaration="yes"
-       doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
-       doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";
        encoding="UTF-8"
-/>
-<xsl:variable name="lineBreak"><xsl:text>
-</xsl:text></xsl:variable>
+       standalone="no"
+       doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+       doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";
+       />
+       
+       <xsl:variable name="lineBreak">
+               <xsl:text>
+               </xsl:text>
+       </xsl:variable>
+       
+       <xsl:template match="/office:document">
+               <html xmlns="http://www.w3.org/1999/xhtml";>
+                       <xsl:attribute name="xml:lang"><xsl:value-of 
select="substring(office:document-meta/office:meta/dc:language,1,2)"/></xsl:attribute>
+                       <xsl:attribute name="lang"><xsl:value-of 
select="substring(office:document-meta/office:meta/dc:language,1,2)"/></xsl:attribute>
+               <head>
+                       <xsl:apply-templates select="office:document-meta"/>
+                       <xsl:call-template name="process-all-styles"/>
+               </head>
+               <xsl:apply-templates select="office:document-content"/>
+               </html>
+       </xsl:template>
+       
+       <xsl:template match="office:document-content">
+               <body>
+                       <xsl:comment> office:body/office:text </xsl:comment>
+                       <xsl:apply-templates select="office:body/office:text"/>
+                       <xsl:comment> add-footnote-bodies </xsl:comment>
+                       <xsl:call-template name="add-footnote-bodies"/>
+               </body>
+       </xsl:template> 
+       
+<!-- element p -->     
+       <xsl:template match="text:p">
+               <xsl:choose>
+                       <xsl:when test="descendant::draw:*">
+                               <xsl:apply-templates/>
+                               <xsl:if test="count(node())=0"><br/></xsl:if>
+                       </xsl:when>
+                       
+                       <xsl:when test="@text:style-name='Quotations' and 
node()">
+                               <blockquote>
+                                       <p 
class="{translate(@text:style-name,'.','_')}">
+                                               <xsl:apply-templates/>
+                                       </p>
+                               </blockquote>
+                       </xsl:when>
+                       
+                       <xsl:otherwise>
+                               <p 
class="{translate(@text:style-name,'.','_')}">
+                                       <xsl:apply-templates/>
+                                       <xsl:if 
test="count(node())=0"><br/></xsl:if>
+                               </p>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+       
+<!-- element span -->  
+       <xsl:template match="text:span">
+       <span class="{translate(@text:style-name,'.','_')}">
+               <xsl:apply-templates/>
+       </span>
+       </xsl:template>
+       
+<!-- element h -->
+       <xsl:template match="text:h">
+       <!-- Heading levels go only to 6 in XHTML -->
+       <xsl:if test="node()">
+               <xsl:variable name="level">
+               <xsl:choose>
+                       <!-- text:outline-level is optional, default is 1 -->
+                               <xsl:when 
test="not(@text:outline-level)">1</xsl:when>
+                               <xsl:when test="@text:outline-level &gt; 
6">6</xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of 
select="@text:outline-level"/>
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
 
-<xsl:key name="listTypes" match="text:list-style" use="@style:name"/>
+               <xsl:element name="{concat('h', $level)}">
+               <xsl:attribute name="class">
+                               <xsl:value-of 
select="translate(@text:style-name,'.','_')"/>
+               </xsl:attribute>
+               <a name="{generate-id()}"/>
+               <xsl:apply-templates/>
+               </xsl:element>
+       </xsl:if>
+       </xsl:template>
+       
+       <!-- this elements are not defined by ODF -->
+       <xsl:template match="text:header">
+               <div>
+                       <xsl:attribute name="id">
+                               <xsl:text>header</xsl:text>
+                       </xsl:attribute>
+                       <xsl:apply-templates/>
+               </div>
+       </xsl:template>
+       
+       <xsl:template match="text:footer">
+               <div>
+                       <xsl:attribute name="id">
+                               <xsl:text>footer</xsl:text>
+                       </xsl:attribute>
+       <xsl:apply-templates/>
+               </div>
+       </xsl:template>
+       
+       <xsl:template match="text:sub">
+               <sub 
class="{translate(@text:style-name,'.','_')}"><xsl:apply-templates/></sub>
+       </xsl:template>
+       
+       <xsl:template match="text:sup">
+               <sup 
class="{translate(@text:style-name,'.','_')}"><xsl:apply-templates/></sup>
+       </xsl:template>
+       <!-- end adding -->
+       
+<!-- preserve tabulation -->
+       <xsl:template match="text:tab">
+               <xsl:text xml:space="preserve"> </xsl:text>
+       </xsl:template>
+       
+<!-- element br -->
+       <xsl:template match="text:line-break">
+       <br/>
+       </xsl:template>
+       
+<!-- preserve spaces -->
+       <xsl:variable name="spaces" xml:space="preserve"/>
+       
+       <xsl:template match="text:s">
+               <xsl:choose>
+                       <xsl:when test="@text:c">
+                               <xsl:call-template name="insert-spaces">
+                                       <xsl:with-param name="n" 
select="@text:c"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:text> </xsl:text>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+<!-- insert spaces -->
+       <xsl:template name="insert-spaces">
+       <xsl:param name="n"/>
+               <xsl:choose>
+                       <xsl:when test="$n &lt;= 30">
+                               <xsl:value-of select="substring($spaces, 1, 
$n)"/>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:value-of select="$spaces"/>
+                               <xsl:call-template name="insert-spaces">
+                                       <xsl:with-param name="n">
+                                               <xsl:value-of select="$n - 30"/>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+<!-- element a -->
+       <xsl:template match="text:a">
+               <a href="address@hidden:href}"><xsl:apply-templates/></a>
+       </xsl:template>
+<!-- preserve bookmark -->     
+       <xsl:template match="text:bookmark-start|text:bookmark">
+               <a name="address@hidden:name}">
+                       <span style="font-size: 0px">
+                               <xsl:text> </xsl:text>
+                       </span>
+               </a>
+       </xsl:template>
+<!-- preserve footnote -->
+  <xsl:template match="text:note">
+       <xsl:variable name="footnote-id" select="text:note-citation"/>
+       <a href="#footnote-{$footnote-id}">
+               <sup><xsl:value-of select="$footnote-id"/></sup>
+       </a>
+       </xsl:template>
+<!-- preserve note body -->
+       <xsl:template match="text:note-body"/>
+       <xsl:template name="add-footnote-bodies">
+               <xsl:apply-templates select="//text:note" 
mode="add-footnote-bodies"/>
+       </xsl:template>
+<!-- preserve footnote bodies -->
+       <xsl:template match="text:note" mode="add-footnote-bodies">
+               <xsl:variable name="footnote-id" select="text:note-citation"/>
+                       <p><a name="footnote-{$footnote-id}"><sup><xsl:value-of 
select="$footnote-id"/></sup>:</a></p>
+               <xsl:apply-templates select="text:note-body/*"/>
+       </xsl:template>
 
-<xsl:template match="/office:document-content">
-<html xmlns="http://www.w3.org/1999/xhtml";>
-<head>
-<title>Converted by odt_to_xhtml.xsl</title>
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<xsl:apply-templates select="office:automatic-styles"/>
-</head>
-<body>
-<xsl:apply-templates select="office:body/office:text"/>
-</body>
-</html>
-</xsl:template>
-
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<!--
-       This section of the transformation handles styles in the
-       content.xml file
--->
-<xsl:template match="office:automatic-styles">
+<!-- procede all styles -->
+       <xsl:template name="process-all-styles">
        <style type="text/css">
-       <xsl:apply-templates/>
+       /* ODF paragraphs, by default, don't have any line spacing. */
+       p { margin: 0px; padding: 0px; }
+       /* put a default link style in, so we can see links */
+       a[href] { color: blue; text-decoration: underline; }
+       
+       <xsl:apply-templates select="office:document-styles/office:styles"/>
+       <xsl:apply-templates 
select="office:document-content/office:automatic-styles"/>
+       <xsl:call-template name="toc-styles"/>
        </style>
-</xsl:template>
+       </xsl:template>
+       
+<!-- procede toc styles -->
+       <xsl:template name="toc-styles">
+               <xsl:apply-templates select="//text:table-of-content" 
mode="toc-styles"/>
+       </xsl:template>
 
-<xsl:template match="style:style">
+       <xsl:template match="text:table-of-content" mode="toc-styles">
+       <!-- Generate styles for the ToC -->
+               /* ToC styles start */
+               <xsl:apply-templates select="//text:h/@text:outline-level" 
mode="toc-styles"/>
+               /* ToC styles end */
+       </xsl:template>
+
+       <xsl:template match="text:h/@text:outline-level" mode="toc-styles">
+       <xsl:text>.toc_outline_level_</xsl:text>
+       <xsl:value-of select="."/>
+       <xsl:text> { margin-left: </xsl:text>
+       <xsl:value-of select="round(.*0.5*28.6264)"/> <!-- modified : transform 
cm in px for 72 dpi -->
+       <xsl:text>px; }&#xa;</xsl:text>
+
+       <xsl:value-of select="$lineBreak"/>
+
+       <xsl:text>.toc_outline_level_</xsl:text>
+       <xsl:value-of select="."/>
+       <xsl:text> a { text-decoration: none } &#xa;</xsl:text>
+
+       <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+
+       <xsl:template match="*" mode="toc-styles"/>
+
+       <xsl:template match="office:document-styles/office:styles">
+               /* Document styles start */
+               <xsl:apply-templates/>
+               /* Document styles end */
+       </xsl:template>
+       
+       <xsl:template match="office:document-content/office:automatic-styles">
+               /* Automatic styles start */
+               <xsl:apply-templates/>
+               /* Automatic styles end */
+       </xsl:template>
+       
+       <xsl:template match="style:default-style">
        <xsl:choose>
                <xsl:when test="@style:family='table'">
-                       <xsl:call-template name="process-table-style"/>
+                               <xsl:text>table</xsl:text>
                </xsl:when>
-               <xsl:when test="@style:family='table-column'">
-                       <xsl:call-template name="process-table-column-style"/>
-               </xsl:when>
                <xsl:when test="@style:family='table-cell'">
-                       <xsl:call-template name="process-table-cell-style"/>
+                       <xsl:text>td</xsl:text>
+               </xsl:when>
+               <xsl:when test="@style:family='table-row'">
+                   <xsl:text>tr</xsl:text>
                </xsl:when>
                <xsl:when test="@style:family='paragraph'">
-                       <xsl:call-template name="process-paragraph-style"/>
+                               <xsl:text>p</xsl:text>
                </xsl:when>
                <xsl:when test="@style:family='text'">
-                       <xsl:call-template name="process-text-style"/>
+                   <xsl:text>p</xsl:text>
                </xsl:when>
+               <xsl:otherwise>
+                               <xsl:text>.default_</xsl:text>
+                               <xsl:value-of 
select="translate(@style:family,'.','_')"/>
+                       </xsl:otherwise>
        </xsl:choose>
-</xsl:template>
+               <xsl:text> {</xsl:text><xsl:value-of select="$lineBreak"/>
 
-<xsl:template name="process-table-style">
-       <xsl:if test="style:table-properties">
-               <xsl:value-of select="$lineBreak"/>
-               <xsl:text>.</xsl:text>
-               <xsl:value-of select="translate(@style:name,'.','_')"/>
-               <xsl:text>{width: </xsl:text>
-               <xsl:value-of select="style:table-properties/
-                       @style:width"/>
-               <xsl:text>}</xsl:text>
-               <xsl:value-of select="$lineBreak"/>
-       </xsl:if>
-</xsl:template>
-
-<xsl:template name="process-table-column-style">
-       <xsl:if test="style:table-column-properties">
-               <xsl:value-of select="$lineBreak"/>
-               <xsl:text>.</xsl:text>
-               <xsl:value-of select="translate(@style:name,'.','_')"/>
-               <xsl:text>{width: </xsl:text>
-               <xsl:value-of select="style:table-column-properties/
-                       @style:column-width"/><xsl:text>;</xsl:text>
-               <xsl:value-of select="$lineBreak"/>
-                               <xsl:call-template 
name="handle-style-properties">
-                       <xsl:with-param name="nodeSet"
-                               select="style:table-properties"/>
+               <xsl:call-template name="process-styles">
+                       <xsl:with-param name="node" select="."/>
                </xsl:call-template>
-               <xsl:text>}</xsl:text>
-               <xsl:value-of select="$lineBreak"/>
-       </xsl:if>
-</xsl:template>
 
-<xsl:template name="process-table-cell-style">
-       <xsl:if test="style:table-cell-properties">
-               <xsl:value-of select="$lineBreak"/>
+               <xsl:text>}&#xa;</xsl:text>
+       </xsl:template>
+
+       <xsl:template match="style:style">
                <xsl:text>.</xsl:text>
                <xsl:value-of select="translate(@style:name,'.','_')"/>
-               <xsl:text>{</xsl:text><xsl:value-of select="$lineBreak"/>
-               <xsl:call-template name="handle-style-properties">
-                       <xsl:with-param name="nodeSet"
-                               select="style:table-cell-properties"/>
-               </xsl:call-template>
-               <xsl:text>}</xsl:text><xsl:value-of select="$lineBreak"/>
-       </xsl:if>
-</xsl:template>
+               <xsl:text> {</xsl:text><xsl:value-of select="$lineBreak"/>
 
-<xsl:template name="process-paragraph-style">
-       <xsl:if test="style:paragraph-properties">
-               <xsl:value-of select="$lineBreak"/>
-               <xsl:text>.</xsl:text>
-               <xsl:value-of select="translate(@style:name,'.','_')"/>
-               <xsl:text>{</xsl:text><xsl:value-of select="$lineBreak"/>
-               <xsl:call-template name="handle-style-properties">
-                       <xsl:with-param name="nodeSet"
-                               select="style:paragraph-properties"/>
+               <xsl:call-template name="process-styles">
+                       <xsl:with-param name="node" select="."/>
                </xsl:call-template>
-               <xsl:text>}</xsl:text><xsl:value-of select="$lineBreak"/>
-       </xsl:if>
-</xsl:template>
 
-<xsl:template name="process-text-style">
-       <xsl:if test="style:text-properties">
-               <xsl:value-of select="$lineBreak"/>
-               <xsl:text>.</xsl:text>
-               <xsl:value-of select="translate(@style:name,'.','_')"/>
-               <xsl:text>{</xsl:text><xsl:value-of select="$lineBreak"/>
-               <xsl:call-template name="handle-style-properties">
-                       <xsl:with-param name="nodeSet"
-                               select="style:text-properties"/>
+               <xsl:text>}&#xa;</xsl:text>
+       </xsl:template>
+
+       <xsl:template name="process-styles">
+               <xsl:param name="node"/>
+               <xsl:if test="$node/@style:parent-style-name">
+                       <xsl:variable name="parentStyle" 
select="$node/@style:parent-style-name"/>
+                       <xsl:call-template name="process-styles">
+                               <xsl:with-param name="node" 
select="//style:address@hidden:name=$parentStyle]"/>
                </xsl:call-template>
-               <xsl:text>}</xsl:text><xsl:value-of select="$lineBreak"/>
        </xsl:if>
-</xsl:template>
 
-<xsl:template name="handle-style-properties">
-       <xsl:param name="nodeSet"/>
-       <xsl:for-each select="$nodeSet/@*">
-               <xsl:variable name="this" select="."/>
-               <xsl:variable name="find" select="document('')/xsl:stylesheet/
-                       int:attr-map/int:address@hidden($this)]"/>
-               <xsl:if test="$find">
-                       <xsl:variable name="action" select="$find/@action"/>
-                       <xsl:choose>
-                               <xsl:when test="$action='pass-through'">
+               <xsl:apply-templates 
select="$node/style:paragraph-properties/@*" mode="styleattr"/>
+               <xsl:apply-templates select="$node/style:text-properties/@*" 
mode="styleattr"/>
+               <xsl:apply-templates 
select="$node/style:table-cell-properties/@*" mode="styleattr"/>
+               <xsl:apply-templates select="$node/style:table-properties/@*" 
mode="styleattr"/>
+               <xsl:apply-templates 
select="$node/style:table-column-properties/@*" mode="styleattr"/>
+               <xsl:apply-templates select="$node/style:graphic-properties/@*" 
mode="styleattr"/>
+       </xsl:template>
+
+       <xsl:template 
match="@fo:border-left|@fo:border-right|@fo:border-top|@fo:border-bottom|@fo:border|@fo:margin-left|@fo:margin-right|@fo:margin-top|@fo:margin-bottom|@fo:margin|@fo:padding-left|@fo:padding-right|@fo:padding-top|@fo:padding-bottom|@fo:padding|@fo:text-align|@fo:text-indent|@fo:font-variant|@fo:font-family|@fo:color|@fo:background-color|@fo:font-size|@svg:font-family|@fo:font-style|@fo:font-weight|@fo:line-height|@style:width"
 mode="styleattr">
                                        <xsl:call-template name="pass-through"/>
-                               </xsl:when>
-                               <xsl:when test="$action='check-align'">
-                                       <xsl:call-template name="check-align"/>
-                               </xsl:when>
-                       </xsl:choose>
-               </xsl:if>
-       </xsl:for-each>
-</xsl:template>
+       </xsl:template>
 
-<xsl:template name="pass-through">
-       <xsl:value-of select="local-name()"/><xsl:text>: </xsl:text>
-       <xsl:value-of select="."/><xsl:text>;</xsl:text>
+       <xsl:template match="@style:font-name" mode="styleattr">
+               <xsl:text>font-family: '</xsl:text>
+               <xsl:value-of select="."/><xsl:text>';</xsl:text>
        <xsl:value-of select="$lineBreak"/>
-</xsl:template>
+       </xsl:template>
 
-<xsl:template name="check-align">
+       <xsl:template 
match="@style:text-underline-style|@style:text-underline-type" mode="styleattr">
+<!-- CSS2 only has one type of underline.
+       We can improve this when CSS3 is better supported.
+-->
+               <xsl:if test="not(.='none')">
+                       <xsl:text>text-decoration: underline;</xsl:text>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template match="@fo:text-align" mode="styleattr">
        <xsl:value-of select="local-name()"/><xsl:text>: </xsl:text>
        <xsl:choose>
                <xsl:when test=".='start'"><xsl:text>left</xsl:text></xsl:when>
@@ -239,9 +367,44 @@
        </xsl:choose>
        <xsl:text>;</xsl:text>
        <xsl:value-of select="$lineBreak"/>
-</xsl:template>
+       </xsl:template>
 
-<xsl:template match="text:list-level-style-bullet">
+       <xsl:template match="@style:horizontal-pos" mode="styleattr">
+               <xsl:choose>
+       <!-- We can't support the others until we figure out pagination. -->
+                       <xsl:when test=".='left'">
+                       /* Left alignment */
+                               <xsl:text>margin-left: 0; margin-right: 
auto;</xsl:text>
+                       </xsl:when>
+                       <xsl:when test=".='right'">
+                       /* Right alignment */
+                               <xsl:text>margin-left: auto; margin-right: 
0;</xsl:text>
+                       </xsl:when>
+                       <xsl:when test=".='center'">
+                       /* Centered alignment */
+                               <xsl:text>margin: 0 auto;</xsl:text>
+                       </xsl:when>
+               </xsl:choose>
+               <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+
+       <xsl:template match="@style:column-width" mode="styleattr">
+               <xsl:text>width: </xsl:text><xsl:value-of 
select="."/><xsl:text>;</xsl:text>
+       </xsl:template>
+
+       <xsl:template match="@*" mode="styleattr">
+               <!-- don't output anything for attrs we don't understand -->
+       </xsl:template>
+
+       <xsl:template name="pass-through">
+               <xsl:value-of select="local-name()"/><xsl:text>: </xsl:text>
+               <xsl:value-of select="."/>
+               <xsl:text>; </xsl:text>
+               
+               <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+<!-- style li -->
+       <xsl:template match="text:list-level-style-bullet">
        <xsl:text>.</xsl:text>
        <xsl:value-of select="../@style:name"/>
        <xsl:text>_</xsl:text>
@@ -253,12 +416,11 @@
                <xsl:when test="@text:level mod 3 = 0">square</xsl:when>
                <xsl:otherwise>decimal</xsl:otherwise>
        </xsl:choose>
-       <xsl:text>;}</xsl:text>
+               <xsl:text>;}&#xa;</xsl:text>
        <xsl:value-of select="$lineBreak"/>
-</xsl:template>
-
-
-<xsl:template match="text:list-level-style-number">
+       </xsl:template>
+<!-- style ol -->
+       <xsl:template match="text:list-level-style-number">
        <xsl:text>.</xsl:text>
        <xsl:value-of select="../@style:name"/>
        <xsl:text>_</xsl:text>
@@ -272,115 +434,39 @@
                <xsl:when test="@style:num-format='a'">lower-alpha</xsl:when>
                <xsl:otherwise>decimal</xsl:otherwise>
        </xsl:choose>
-       <xsl:text>;}</xsl:text>
+               <xsl:text>;}&#xa;</xsl:text>
        <xsl:value-of select="$lineBreak"/>
-</xsl:template>
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<!--
-       This section of the transformation handles the true content
-       elements in the content.xml file
--->
-
-<!--
-       Yes, paragraphs in ODT really produce a <div> in XHTML,
-       because an ODT paragraph has no extra line spacing.
--->
-<xsl:template match="text:p">
-       <div class="{translate(@text:style-name,'.','_')}">
-               <xsl:apply-templates/>
-               <xsl:if test="count(node())=0"><br /></xsl:if>
-       </div>
-</xsl:template>
-
-<xsl:template match="text:span">
-       <span class="{translate(@text:style-name,'.','_')}">
-               <xsl:apply-templates/>
-       </span>
-</xsl:template>
-
-<xsl:template match="text:h">
-       <!-- Heading levels go only to 6 in XHTML -->
-       <xsl:variable name="level">
-               <xsl:choose>
-                       <xsl:when test="@text:outline-level &gt; 6">6</xsl:when>
-                       <xsl:otherwise>
-                               <xsl:value-of select="@text:outline-level"/>
-                       </xsl:otherwise>
-               </xsl:choose>
-       </xsl:variable>
-       <xsl:element name="{concat('h', $level)}">
+       </xsl:template>
+<!-- element table -->
+       <xsl:template match="table:table">
+               <table>
+                       <xsl:if test="@table:style-name">
                <xsl:attribute name="class">
-                       <xsl:value-of
-                       select="translate(@text:style-name,'.','_')"/>
+                                       <xsl:value-of 
select="@table:style-name"/>
                </xsl:attribute>
-               <xsl:apply-templates/>
-       </xsl:element>
-</xsl:template>
-
-<!--
-       When processing a list, you have to look at the parent style
-       *and* level of nesting
--->
-<xsl:template match="text:list">
-       <xsl:variable name="level" select="count(ancestor::text:list)+1"/>
-       
-       <!-- the list class is the @text:style-name of the outermost
-               <text:list> element -->
-       <xsl:variable name="listClass">
-               <xsl:choose>
-                       <xsl:when test="$level=1">
-                               <xsl:value-of select="@text:style-name"/>
-                       </xsl:when>
-                       <xsl:otherwise>
-                               <xsl:value-of select="
-                                       
ancestor::text:list[last()]/@text:style-name"/>
-                       </xsl:otherwise>
-               </xsl:choose>
-       </xsl:variable>
-       
-       <!-- Now select the <text:list-level-style-foo> element at this
-               level of nesting for this list -->
-       <xsl:variable name="node" select="key('listTypes',
-               $listClass)/address@hidden:level='$level']"/>
-
-       <!-- emit appropriate list type -->
-       <xsl:choose>
-               <xsl:when test="local-name($node)='list-level-style-number'">
-                       <ol class="{concat($listClass,'_',$level)}">
-                               <xsl:apply-templates/>
-                       </ol>
-               </xsl:when>
-               <xsl:otherwise>
-                       <ul class="{concat($listClass,'_',$level)}">
-                               <xsl:apply-templates/>
-                       </ul>
-               </xsl:otherwise>
-       </xsl:choose>
-</xsl:template>
-
-<xsl:template match="text:list-item">
-       <li><xsl:apply-templates/></li>
-</xsl:template>
-
-<xsl:template match="table:table">
-       <table class="address@hidden:style-name}">
+                               <caption><xsl:value-of 
select="@table:style-name"/></caption>
+                       </xsl:if>
                <colgroup>
                        <xsl:apply-templates select="table:table-column"/>
                </colgroup>
                <xsl:if test="table:table-header-rows/table:table-row">
                        <thead>
-                       <xsl:apply-templates
-                               
select="table:table-header-rows/table:table-row"/>
+                                       <xsl:apply-templates 
select="table:table-header-rows/table:table-row"/>
                                </thead>
                </xsl:if>
+                       <xsl:if test="table:table-footer-rows/table:table-row">
+                               <tfoot>
+                                       <xsl:apply-templates 
select="table:table-footer-rows/table:table-row"/>
+                               </tfoot>
+                       </xsl:if>
                <tbody>
                <xsl:apply-templates select="table:table-row"/>
                </tbody>
        </table>
-</xsl:template>
+       </xsl:template>
 
-<xsl:template match="table:table-column">
-<col>
+       <xsl:template match="table:table-column">
+               <col>
        <xsl:if test="@table:number-columns-repeated">
                <xsl:attribute name="span">
                        <xsl:value-of select="@table:number-columns-repeated"/>
@@ -391,16 +477,16 @@
                        <xsl:value-of 
select="translate(@table:style-name,'.','_')"/>
                </xsl:attribute>
        </xsl:if>
-</col>
-</xsl:template>
-
-<xsl:template match="table:table-row">
-<tr>
+               </col>
+       </xsl:template>
+<!-- element tr -->
+       <xsl:template match="table:table-row">
+       <tr>
        <xsl:apply-templates select="table:table-cell"/>
-</tr>
-</xsl:template>
+       </tr>
+       </xsl:template>
 
-<xsl:template match="table:table-cell">
+       <xsl:template match="table:table-cell">
        <xsl:variable name="n">
                <xsl:choose>
                        <xsl:when test="@table:number-columns-repeated != 0">
@@ -412,16 +498,16 @@
        <xsl:call-template name="process-table-cell">
                <xsl:with-param name="n" select="$n"/>
        </xsl:call-template>
-</xsl:template>
+       </xsl:template>
 
-<xsl:template name="process-table-cell">
+<!-- element td -->
+       <xsl:template name="process-table-cell">
        <xsl:param name="n"/>
        <xsl:if test="$n != 0">
                <td>
                <xsl:if test="@table:style-name">
                        <xsl:attribute name="class">
-                               <xsl:value-of 
select="translate(@table:style-name,
-                                       '.','_')"/>
+                                               <xsl:value-of 
select="translate(@table:style-name,'.','_')"/>
                        </xsl:attribute>
                </xsl:if>
                <xsl:if test="@table:number-columns-spanned">
@@ -440,106 +526,309 @@
                        <xsl:with-param name="n" select="$n - 1"/>
                </xsl:call-template>
        </xsl:if>
-</xsl:template>
+       </xsl:template>
 
-<xsl:template match="text:tab">
-       <xsl:text xml:space="preserve"> </xsl:text>
-</xsl:template>
+       <xsl:key name="listTypes" match="text:list-style" use="@style:name"/>
+       <xsl:template match="text:list">
+               <xsl:variable name="level" 
select="count(ancestor::text:list)+1"/>
+               <!-- the list class is the @text:style-name of the outermost 
<text:list> element -->
+               <xsl:variable name="listClass">
+                       <xsl:choose>
+                               <xsl:when test="$level=1">
+                                       <xsl:value-of 
select="@text:style-name"/>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of 
select="ancestor::text:list[last()]/@text:style-name"/>
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
 
-<xsl:template match="text:line-break">
-       <br />
-</xsl:template>
+       <!-- Now select the <text:list-level-style-foo> element at this level 
of nesting for this list -->
+               <xsl:variable name="node" 
select="key('listTypes',$listClass)/address@hidden:level='$level']"/>
 
-<xsl:variable name="spaces"
-    xml:space="preserve">                              </xsl:variable>
-
-<xsl:template match="text:s">
-<xsl:choose>
-    <xsl:when test="@text:c">
-        <xsl:call-template name="insert-spaces">
-            <xsl:with-param name="n" select="@text:c"/>
-        </xsl:call-template>
+       <!-- emit appropriate list type -->
+               <xsl:choose>
+               <!-- element ol -->
+                       <xsl:when 
test="local-name($node)='list-level-style-number'">
+                               <ol class="{concat($listClass,'_',$level)}">
+                                       <xsl:apply-templates/>
+                               </ol>
     </xsl:when>
+               <!-- element ul -->
     <xsl:otherwise>
-        <xsl:text> </xsl:text>
+                               <ul class="{concat($listClass,'_',$level)}">
+                                       <xsl:apply-templates/>
+                               </ul>
     </xsl:otherwise>
-</xsl:choose>
-</xsl:template>
+               </xsl:choose>
+       </xsl:template>
 
-<xsl:template name="insert-spaces">
-<xsl:param name="n"/>
-<xsl:choose>
-    <xsl:when test="$n &lt;= 30">
-        <xsl:value-of select="substring($spaces, 1, $n)"/>
-    </xsl:when>
+<!-- element li -->
+       <xsl:template match="text:list-item">
+               <li><xsl:apply-templates/></li>
+       </xsl:template>
     
+<!-- manage office:document-meta -->
+       <xsl:template match="office:document-meta">
+               <xsl:apply-templates/>
+       </xsl:template>
+       
+<!-- element meta -->
+       <xsl:template match="office:meta">
+               <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/"/>
+               <xsl:comment> Metadata starts </xsl:comment>
+               <xsl:apply-templates select="meta:generator"/>
+               <xsl:apply-templates select="dc:title"/>
+               <xsl:apply-templates select="dc:description"/>
+               <xsl:apply-templates select="dc:subject"/>
+               <xsl:apply-templates select="meta:keyword"/>
+               <xsl:apply-templates select="meta:initial-creator"/>
+               <xsl:apply-templates select="dc:creator"/>
+               <xsl:apply-templates select="meta:creation-date"/>
+               <xsl:apply-templates select="dc:date"/>
+               <xsl:apply-templates select="dc:language"/>     
+               <meta http-equiv="Content-Type" 
content="text/html;charset=UTF-8"/>
+               <meta name="DC.Format" scheme="IMT" content="charset=UTF-8" />
+               <meta name="DC.Format" scheme="IMT" content="text/html" />
+               <xsl:comment> Metadata ends </xsl:comment>
+       </xsl:template>
+
+<!-- meta generator -->        
+       <xsl:template match="meta:generator">
+               <meta name="generator" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc title -->
+       <xsl:template match="dc:title">
+               <title><xsl:apply-templates/></title>
+               <meta name="DC.Title" content="{current()}"/>
+       </xsl:template>
+
+<!-- dc description -->
+       <xsl:template match="dc:description">
+               <meta name="Description" content="{current()}"/>
+               <meta name="DC.Description" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc subject -->
+       <xsl:template match="dc:subject">
+       <meta name="DC.Subject" content="{current()}"/>
+       </xsl:template>
+       
+<!-- meta keyword -->
+       <xsl:template match="meta:keyword">
+               <meta name="keywords" content="{current()}"/>
+       </xsl:template>
+
+<!-- meta initial creator -->
+       <xsl:template match="meta:initial-creator">
+               <meta name="author" content="{current()}"/>
+               <meta name="DC.Creator" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc creator -->
+       <xsl:template match="dc:creator">
+               <meta name="DC.Contributor" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc language -->
+       <xsl:template match="dc:language">
+               <meta http-equiv="content-language" content="{current()}"/>
+               <meta name="DC.Language" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc description -->
+       <xsl:template match="dc:description">
+               <meta name="description" content="{current()}"/>
+               <meta name="DC.Description" content="{current()}"/>
+       </xsl:template>
+       
+<!-- meta creation date -->
+       <xsl:template match="meta:creation-date">
+               <meta name="DC.Date.created" content="{current()}"/>
+               <meta name="DC.Date.dateCopyrighted" content="{current()}"/>
+       </xsl:template>
+
+<!-- dc date -->
+       <xsl:template match="dc:date">
+               <meta name="revised" content="{current()}"/>
+               <meta name="DC.Date.modified" content="{current()}"/>
+       </xsl:template>
+
+       <xsl:param name="param_track_changes"/>
+       <xsl:template match="text:tracked-changes">
+               <xsl:comment> Document has track-changes on </xsl:comment>
+       </xsl:template>
+
+       <xsl:template match="text:change">
+       <xsl:if test="$param_track_changes">
+               <xsl:variable name="id" select="@text:change-id"/>
+               <xsl:variable name="change" 
select="//text:address@hidden:id=$id]"/>
+               <xsl:element name="del">
+                       <xsl:attribute name="datetime">
+                               <xsl:value-of select="$change//dc:date"/>
+                       </xsl:attribute>
+                       <!--<xsl:apply-templates 
match="$change/text:deletion/*"/>-->
+               </xsl:element>
+       </xsl:if>
+       </xsl:template>
+
+       <xsl:template match="office:change-info"/>
+       <xsl:param name="param_baseuri"/>
+       <xsl:template match="draw:frame">
+               <xsl:choose>
+                       <!-- if parent text:h -->
+                       <xsl:when test="ancestor::text:h">
+                               <xsl:element name="span">
+                                       <xsl:attribute name="class">
+                                               <xsl:value-of 
select="translate(@draw:style-name,'.','_')"/>
+                                       </xsl:attribute>
+                                       <xsl:attribute name="style">
+                                       <!-- This border could be removed, but 
OOo does default to showing a border. 
+                                               <xsl:text> border: 1px solid 
#888;</xsl:text> -->
+                                               <xsl:if 
test="@svg:width">width: <xsl:value-of 
select="substring-before(@svg:width,'px')+2"/>px; </xsl:if>
+                                               <xsl:if 
test="@svg:height">height: <xsl:value-of 
select="substring-before(@svg:height,'px')+2"/>px; </xsl:if>
+                                       </xsl:attribute>
+                                       <xsl:choose>
+                                               <xsl:when 
test="ancestor::draw:a">
+                                                       <xsl:element name="a">
+                                                               <xsl:attribute 
name="href">
+                                                                       
<xsl:value-of select="../@xlink:href"/>
+                                                               </xsl:attribute>
+                                                               <xsl:attribute 
name="title">
+                                                                       
<xsl:value-of select="../@office:name"/>
+                                                               </xsl:attribute>
+                                                               
<xsl:apply-templates/>
+                                                       </xsl:element>
+                                               </xsl:when>
+                                               
<xsl:otherwise><xsl:apply-templates/></xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:element>
+                       </xsl:when>
+                       <!-- if parent is text:p -->
+                       <xsl:when test="ancestor::text:p">
+                               <xsl:element name="div">
+                                       <xsl:attribute name="class">
+                                               <xsl:value-of 
select="translate(@draw:style-name,'.','_')"/>
+                                       </xsl:attribute>
+                                       <xsl:attribute name="style">
+                                       <!-- This border could be removed, but 
OOo does default to showing a border. -->
+                                               <xsl:text>border: 1px solid 
#888; </xsl:text>
+                                               <xsl:if test="@svg:width"><!-- 
div width modified -->
+                                                       <xsl:text>width: 
</xsl:text>
+                                                       <xsl:choose>
+                                                               <xsl:when 
test="ancestor::draw:frame">
+                                                                       
<xsl:value-of select="substring-before(@svg:width,'px')+2"/>
+                                                               </xsl:when>
+                                                               <xsl:when 
test="ancestor::text:p">
+                                                                       
<xsl:value-of select="substring-before(@svg:width,'px')+4"/>
+                                                               </xsl:when>
     <xsl:otherwise>
-        <xsl:value-of select="$spaces"/>
-        <xsl:call-template name="insert-spaces">
-            <xsl:with-param name="n">
-                <xsl:value-of select="$n - 30"/>
-            </xsl:with-param>
-        </xsl:call-template>
+                                                                       
<xsl:value-of select="substring-before(@svg:width,'px')"/>
     </xsl:otherwise>
-</xsl:choose>
-</xsl:template>
+                                                       </xsl:choose>
+                                                       <xsl:text>px; 
</xsl:text>
+                                               </xsl:if>
+                                               <xsl:if test="@svg:height"><!-- 
div height modified -->
+                                                       <xsl:text>height: 
</xsl:text>
+                                                       <xsl:choose>
+                                                               <xsl:when 
test="ancestor::draw:frame">
+                                                                       
<xsl:value-of select="substring-before(@svg:height,'px')+2"/>
+                                                               </xsl:when>
+                                                               <xsl:when 
test="ancestor::text:p">
+                                                                       
<xsl:value-of select="substring-before(@svg:height,'px')+4"/>
+                                                               </xsl:when>
+                                                               <xsl:otherwise>
+                                                                       
<xsl:value-of select="substring-before(@svg:height,'px')"/>
+                                                               </xsl:otherwise>
+                                                       </xsl:choose>
+                                                       <xsl:text>px; 
</xsl:text>
+                                               </xsl:if>
+                                       </xsl:attribute>
+                                       <xsl:choose>
+                                               <xsl:when 
test="ancestor::draw:a">
+                                                       <xsl:element name="a">
+                                                               <xsl:attribute 
name="href">
+                                                                       
<xsl:value-of select="../@xlink:href"/>
+                                                               </xsl:attribute>
+                                                               <xsl:attribute 
name="title">
+                                                                       
<xsl:value-of select="../@office:name"/>
+                                                               </xsl:attribute>
+                                                               
<xsl:apply-templates/>
+                                                       </xsl:element>
+                                               </xsl:when>
+                                               
<xsl:otherwise><xsl:apply-templates/></xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:element>
+                       </xsl:when>
+               </xsl:choose>
+       </xsl:template>
 
-<xsl:template match="text:a">
-<a href="address@hidden:href}"><xsl:apply-templates/></a>
-</xsl:template>
+       <xsl:template match="draw:frame/draw:image">
+               <xsl:element name="img">
+       <!-- Default behaviour
+               <xsl:attribute name="style">
+                       width: 100%;
+                       height: 100%;
+                       <xsl:if test="not(../@text:anchor-type='character')">
+               display: block;
+                       </xsl:if>
+                       </xsl:attribute>
+               -->
+                       <xsl:if test="not(../@text:anchor-type='character')">
+                               <xsl:attribute name="style">display: 
block;</xsl:attribute>
+       </xsl:if>
 
-<!--
-       <text:bookmark-start /> and <text:bookmark-end /> can
-       be on non-wellformed boundaries. The quickest solution is
-       to create an <a name=""></a> element.
+                       <xsl:attribute name="width">
+                               <xsl:value-of 
select="substring-before(../@svg:width,'px')"/>
+                       </xsl:attribute>
+                       
+                       <xsl:attribute name="height">
+                               <xsl:value-of 
select="substring-before(../@svg:height,'px')"/>
+                       </xsl:attribute>
+               
+                       <xsl:attribute name="alt">
+                               <!--<xsl:value-of select="../svg:desc"/>-->
+                               <xsl:value-of select="../@draw:name"/>
+                       </xsl:attribute>
+                       
+                       <xsl:attribute name="src">
+                               <xsl:value-of 
select="concat($param_baseuri,@xlink:href)"/>
+                               <!--<xsl:value-of select="@xlink:href"/>-->
+                       </xsl:attribute>
+                       
+                       <xsl:if test="../svg:desc">
+                               <xsl:attribute name="longdesc">
+                                       <xsl:value-of select="../svg:desc"/>
+                               </xsl:attribute>
+                       </xsl:if>               
+               </xsl:element>
+       </xsl:template>
+
+       <xsl:template match="svg:desc"/>
        
-       If you don't put in any content, it becomes an empty element,
-       which will confuse browsers. While we would love to insert
-       a zero-width non-breaking space (Unicode 0x200b), Internet
-       Explorer doesn't recognize it.  Hence this ugly hack:
--->
-<xsl:template match="text:bookmark-start|text:bookmark">
-<a name="address@hidden:name}"><span style="font-size: 0px"><xsl:text> 
</xsl:text></span></a>
-</xsl:template>
+       <xsl:template match="text:table-of-content">
+       <!-- We don't parse the app's ToC but generate our own. -->
+       <div class="toc">
+               <xsl:apply-templates select="text:index-body/text:index-title"/>
+               <xsl:apply-templates select="//text:h" mode="toc"/>
+       </div>
+       </xsl:template>
 
-<!--
-       This template is too dangerous to leave active...
-<xsl:template match="text()">
-       <xsl:if test="normalize-space(.) !=''">
-               <xsl:value-of select="normalize-space(.)"/>
-       </xsl:if>
-</xsl:template>
--->
+       <xsl:template match="text:h" mode="toc">
+       <xsl:element name="p">
+               <xsl:attribute name="class">
+                       <xsl:text>toc_outline_level_</xsl:text>
+                       <xsl:choose>
+                               <xsl:when test="@text:outline-level">
+                                       <xsl:value-of 
select="@text:outline-level"/>
+                               </xsl:when>
+                               <!-- ODF spec says that when unspecified the 
outline level should be considered to be 1. -->
+                               <xsl:otherwise>1</xsl:otherwise>
+                       </xsl:choose>
+               </xsl:attribute>
+               <a href="#{generate-id()}"><xsl:value-of select="."/></a>
+               </xsl:element>
+       </xsl:template>
 
-<!--
-       This is a list of fo: attributes to be transferred to the
-       output document. The action tells which template is to be
-       called to process the attribute.
--->
-<int:attr-map>
-       <int:attr name="fo:border-left" action="pass-through"/>
-       <int:attr name="fo:border-right" action="pass-through"/>
-       <int:attr name="fo:border-top" action="pass-through"/>
-       <int:attr name="fo:border-bottom" action="pass-through"/>
-       <int:attr name="fo:border" action="pass-through"/>
-       <int:attr name="fo:margin-left" action="pass-through"/>
-       <int:attr name="fo:margin-right" action="pass-through"/>
-       <int:attr name="fo:margin-top" action="pass-through"/>
-       <int:attr name="fo:margin-bottom" action="pass-through"/>
-       <int:attr name="fo:margin" action="pass-through"/>
-       <int:attr name="fo:padding-left" action="pass-through"/>
-       <int:attr name="fo:padding-right" action="pass-through"/>
-       <int:attr name="fo:padding-top" action="pass-through"/>
-       <int:attr name="fo:padding-bottom" action="pass-through"/>
-       <int:attr name="fo:padding" action="pass-through"/>
-       <int:attr name="fo:text-indent" action="pass-through"/>
-       <int:attr name="fo:font-variant" action="pass-through"/>
-       <int:attr name="fo:font-family" action="pass-through"/>
-       <int:attr name="fo:color" action="pass-through"/>
-       <int:attr name="fo:background-color" action="pass-through"/>
-       <int:attr name="fo:font-style" action="pass-through"/>
-       <int:attr name="fo:font-weight" action="pass-through"/>
-       <int:attr name="fo:line-height" action="pass-through"/>
-       <int:attr name="fo:text-align" action="check-align"/>
-</int:attr-map>
 </xsl:stylesheet>

Added: people/sigurdne/modules/manual/trunk/templates/base/sxw2xhtml.xsl
===================================================================
--- people/sigurdne/modules/manual/trunk/templates/base/sxw2xhtml.xsl           
                (rev 0)
+++ people/sigurdne/modules/manual/trunk/templates/base/sxw2xhtml.xsl   
2009-11-20 10:27:37 UTC (rev 20843)
@@ -0,0 +1,844 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" 
+       xmlns:office="http://openoffice.org/2000/office"; 
+       xmlns:meta="http://openoffice.org/2000/meta"; 
+       xmlns:text="http://openoffice.org/2000/text"; 
+       xmlns:table="http://openoffice.org/2000/table"; 
+       xmlns:draw="http://openoffice.org/2000/drawing"; 
+       xmlns:presentation="http://openoffice.org/2000/presentation"; 
+       xmlns:chart="http://openoffice.org/2000/chart"; 
+       xmlns:form="http://openoffice.org/2000/form"; 
+       xmlns:script="http://openoffice.org/2000/script"; 
+       xmlns:style="http://openoffice.org/2000/style"; 
+       xmlns:dc="http://purl.org/dc/elements/1.1/"; 
+       xmlns:xlink="http://www.w3.org/1999/xlink"; 
+       xmlns:math="http://www.w3.org/1998/Math/MathML"; 
+       xmlns:xforms="http://www.w3.org/2002/xforms"; 
+       xmlns:fo="http://www.w3.org/1999/XSL/Format"; 
+       xmlns:svg="http://www.w3.org/2000/svg"; 
+       xmlns:smil="http://www.w3.org/TR/REC-smil"; 
+       xmlns:ooo="http://openoffice.org/2004/office"; 
+       xmlns:ooow="http://openoffice.org/2004/writer"; 
+       xmlns:oooc="http://openoffice.org/2004/calc"; 
+       xmlns:int="http://opendocumentfellowship.org/internal"; 
+       xmlns="http://www.w3.org/1999/xhtml"; 
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
+       exclude-result-prefixes="office meta text table draw presentation chart 
form script style dc xlink math xforms fo svg smil ooo ooow oooc int #default">
+       
+       <xsl:output 
+       method="xml" 
+       indent="yes" 
+       omit-xml-declaration="yes" 
+       encoding="UTF-8" 
+       doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+       doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";
+       />
+
+<!--
+100 dpi <=> x*38.37
+72 dpi <=> x*28.6264
+-->
+       
+       <xsl:variable name="lineBreak">
+               <xsl:text>
+               </xsl:text>
+       </xsl:variable>
+       
+       <xsl:template match="/office:document">
+               <html xmlns="http://www.w3.org/1999/xhtml";>
+                       <xsl:attribute name="xml:lang"><xsl:value-of 
select="substring(office:document-meta/office:meta/dc:language,1,2)"/></xsl:attribute>
+                       <xsl:attribute name="lang"><xsl:value-of 
select="substring(office:document-meta/office:meta/dc:language,1,2)"/></xsl:attribute>
+               <head>
+                       <xsl:apply-templates select="office:document-meta"/>
+                       <xsl:call-template name="process-all-styles"/>
+               </head>
+               <xsl:apply-templates select="office:document-content"/>
+               </html>
+       </xsl:template>
+       
+       <xsl:template match="office:document-content">
+               <body>
+                       <xsl:comment> office:body </xsl:comment>
+                       <xsl:apply-templates select="office:body"/>
+                       <xsl:comment> add-footnote-bodies </xsl:comment>
+                       <xsl:call-template name="add-footnote-bodies"/>
+               </body>
+       </xsl:template> 
+       
+<!-- element p -->     
+       <xsl:template match="text:p">
+               <xsl:choose>
+                       <xsl:when test="descendant::draw:*">
+                               <xsl:apply-templates/>
+                               <xsl:if test="count(node())=0"><br/></xsl:if>
+                       </xsl:when>
+                       
+                       <xsl:when test="@text:style-name='Quotations' and 
node()">
+                               <blockquote>
+                                       <p 
class="{translate(@text:style-name,'.','_')}">
+                                               <xsl:apply-templates/>
+                                       </p>
+                               </blockquote>
+                       </xsl:when>
+                       
+                       <xsl:otherwise>
+                               <p 
class="{translate(@text:style-name,'.','_')}">
+                                       <xsl:apply-templates/>
+                                       <xsl:if 
test="count(node())=0"><br/></xsl:if>
+                               </p>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+       
+<!-- element span -->  
+       <xsl:template match="text:span">
+       <span class="{translate(@text:style-name,'.','_')}">
+               <xsl:apply-templates/>
+       </span>
+       </xsl:template>
+       
+<!-- element h -->
+       <xsl:template match="text:h">
+       <!-- Heading levels go only to 6 in XHTML -->
+       <xsl:if test="node()">
+               <xsl:variable name="level">
+               <xsl:choose>
+                       <!-- text:outline-level is optional, default is 1 -->
+                               <xsl:when 
test="not(@text:outline-level)">1</xsl:when>
+                               <xsl:when test="@text:outline-level &gt; 
6">6</xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of 
select="@text:outline-level"/>
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+
+               <xsl:element name="{concat('h', $level)}">
+               <xsl:attribute name="class">
+                               <xsl:value-of 
select="translate(@text:style-name,'.','_')"/>
+               </xsl:attribute>
+               <a name="{generate-id()}"/>
+               <xsl:apply-templates/>
+               </xsl:element>
+       </xsl:if>
+       </xsl:template>
+       
+       <!-- this elements are not defined by ODF -->
+       <xsl:template match="text:header">
+               <div>
+                       <xsl:attribute name="id">
+                               <xsl:text>header</xsl:text>
+                       </xsl:attribute>
+                       <xsl:apply-templates/>
+               </div>
+       </xsl:template>
+       
+       <xsl:template match="text:footer">
+               <div>
+                       <xsl:attribute name="id">
+                               <xsl:text>footer</xsl:text>
+                       </xsl:attribute>
+                       <xsl:apply-templates/>
+               </div>
+       </xsl:template>
+       
+       <xsl:template match="text:sub">
+               <sub 
class="{translate(@text:style-name,'.','_')}"><xsl:apply-templates/></sub>
+       </xsl:template>
+       
+       <xsl:template match="text:sup">
+               <sup 
class="{translate(@text:style-name,'.','_')}"><xsl:apply-templates/></sup>
+       </xsl:template>
+       <!-- end adding -->
+       
+<!-- preserve tabulation -->
+       <xsl:template match="text:tab">
+               <xsl:text xml:space="preserve"> </xsl:text>
+       </xsl:template>
+       
+<!-- element br -->
+       <xsl:template match="text:line-break">
+       <br/>
+       </xsl:template>
+       
+<!-- preserve spaces -->
+       <xsl:variable name="spaces" xml:space="preserve"/>
+       
+       <xsl:template match="text:s">
+               <xsl:choose>
+                       <xsl:when test="@text:c">
+                               <xsl:call-template name="insert-spaces">
+                                       <xsl:with-param name="n" 
select="@text:c"/>
+                               </xsl:call-template>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:text> </xsl:text>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+<!-- insert spaces -->
+       <xsl:template name="insert-spaces">
+       <xsl:param name="n"/>
+               <xsl:choose>
+                       <xsl:when test="$n &lt;= 30">
+                               <xsl:value-of select="substring($spaces, 1, 
$n)"/>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:value-of select="$spaces"/>
+                               <xsl:call-template name="insert-spaces">
+                                       <xsl:with-param name="n">
+                                               <xsl:value-of select="$n - 30"/>
+                                       </xsl:with-param>
+                               </xsl:call-template>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+<!-- element a -->
+       <xsl:template match="text:a">
+               <a href="address@hidden:href}"><xsl:apply-templates/></a>
+       </xsl:template>
+<!-- preserve bookmark -->     
+       <xsl:template match="text:bookmark-start|text:bookmark">
+               <a name="address@hidden:name}">
+                       <span style="font-size: 0px">
+                               <xsl:text> </xsl:text>
+                       </span>
+               </a>
+       </xsl:template>
+<!-- preserve footnote -->
+  <xsl:template match="text:note">
+       <xsl:variable name="footnote-id" select="text:note-citation"/>
+       <a href="#footnote-{$footnote-id}">
+               <sup><xsl:value-of select="$footnote-id"/></sup>
+       </a>
+       </xsl:template>
+<!-- preserve note body -->
+       <xsl:template match="text:note-body"/>
+       <xsl:template name="add-footnote-bodies">
+               <xsl:apply-templates select="//text:note" 
mode="add-footnote-bodies"/>
+       </xsl:template>
+<!-- preserve footnote bodies -->
+       <xsl:template match="text:note" mode="add-footnote-bodies">
+               <xsl:variable name="footnote-id" select="text:note-citation"/>
+                       <p><a name="footnote-{$footnote-id}"><sup><xsl:value-of 
select="$footnote-id"/></sup>:</a></p>
+               <xsl:apply-templates select="text:note-body/*"/>
+       </xsl:template>
+
+<!-- procede all styles -->
+       <xsl:template name="process-all-styles">
+       <style type="text/css">
+       /* ODF paragraphs, by default, don't have any line spacing. */
+       p { margin: 0px; padding: 0px; }
+       /* put a default link style in, so we can see links */
+       a[href] { color: blue; text-decoration: underline; }
+       
+       <xsl:apply-templates select="office:document-styles/office:styles"/>
+       <xsl:apply-templates 
select="office:document-content/office:automatic-styles"/>
+       <xsl:call-template name="toc-styles"/>
+       </style>
+       </xsl:template>
+       
+<!-- procede toc styles -->
+       <xsl:template name="toc-styles">
+               <xsl:apply-templates select="//text:table-of-content" 
mode="toc-styles"/>
+       </xsl:template>
+
+       <xsl:template match="text:table-of-content" mode="toc-styles">
+       <!-- Generate styles for the ToC -->
+               /* ToC styles start */
+               <xsl:apply-templates select="//@text:outline-level" 
mode="toc-styles"/>
+               /* ToC styles end */
+       </xsl:template>
+
+       <xsl:template match="@text:outline-level" mode="toc-styles">
+       <xsl:text>.toc_outline_level_</xsl:text>
+       <xsl:value-of select="."/>
+       <xsl:text> { margin-left: </xsl:text>
+       <xsl:value-of select="round(current()*0.5*28.6264)"/> <!-- modified : 
transform cm in px for 72 dpi -->
+       <xsl:text>px; }&#xa;</xsl:text>
+
+       <xsl:value-of select="$lineBreak"/>
+
+       <xsl:text>.toc_outline_level_</xsl:text>
+       <xsl:value-of select="."/>
+       <xsl:text> a { text-decoration: none } &#xa;</xsl:text>
+
+       <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+
+       <xsl:template match="*" mode="toc-styles"/>
+       
+       <xsl:template match="office:document-styles/office:styles">
+               /* Document styles start */
+               <xsl:apply-templates/>
+               /* Document styles end */
+       </xsl:template>
+       
+       <xsl:template match="office:document-content/office:automatic-styles">
+               /* Automatic styles start */
+               <xsl:apply-templates/>
+               /* Automatic styles end */
+       </xsl:template>
+       
+       <xsl:template match="style:default-style">
+               <xsl:choose>
+               <xsl:when test="@style:family='table'">
+                               <xsl:text>table</xsl:text>
+               </xsl:when>
+               <xsl:when test="@style:family='table-cell'">
+                       <xsl:text>td</xsl:text>
+               </xsl:when>
+               <xsl:when test="@style:family='table-row'">
+                   <xsl:text>tr</xsl:text>
+               </xsl:when>
+               <xsl:when test="@style:family='paragraph'">
+                               <xsl:text>p</xsl:text>
+               </xsl:when>
+               <xsl:when test="@style:family='text'">
+                   <xsl:text>p</xsl:text>
+               </xsl:when>
+               <xsl:otherwise>
+                               <xsl:text>.default_</xsl:text>
+                               <xsl:value-of 
select="translate(@style:family,'.','_')"/>
+                       </xsl:otherwise>
+               </xsl:choose>
+               <xsl:text> {</xsl:text><xsl:value-of select="$lineBreak"/>
+   
+               <xsl:call-template name="process-styles">
+                       <xsl:with-param name="node" select="."/>
+               </xsl:call-template>
+
+               <xsl:text>}&#xa;</xsl:text>
+       </xsl:template>
+
+       <xsl:template match="style:style">
+               <xsl:text>.</xsl:text>
+               <xsl:value-of select="translate(@style:name,'.','_')"/>
+               <xsl:text> {</xsl:text><xsl:value-of select="$lineBreak"/>
+
+               <xsl:call-template name="process-styles">
+                       <xsl:with-param name="node" select="."/>
+               </xsl:call-template>
+
+               <xsl:text>}&#xa;</xsl:text>
+       </xsl:template>
+
+       <xsl:template name="process-styles">
+               <xsl:param name="node"/>
+               <xsl:if test="$node/@style:parent-style-name">
+                       <xsl:variable name="parentStyle" 
select="$node/@style:parent-style-name"/>
+                       <xsl:call-template name="process-styles">
+                               <xsl:with-param name="node" 
select="//style:address@hidden:name=$parentStyle]"/>
+                   </xsl:call-template>
+               </xsl:if>
+
+               <xsl:apply-templates select="$node/style:properties/@*" 
mode="styleattr"/>
+               <!--<xsl:apply-templates 
select="$node/style:text-properties/@*" mode="styleattr"/>
+               <xsl:apply-templates 
select="$node/style:table-cell-properties/@*" mode="styleattr"/>
+               <xsl:apply-templates select="$node/style:table-properties/@*" 
mode="styleattr"/>
+               <xsl:apply-templates 
select="$node/style:table-column-properties/@*" mode="styleattr"/>
+               <xsl:apply-templates select="$node/style:graphic-properties/@*" 
mode="styleattr"/>-->
+       </xsl:template>
+
+       <xsl:template 
match="@fo:border-left|@fo:border-right|@fo:border-top|@fo:border-bottom|@fo:border|@fo:margin-left|@fo:margin-right|@fo:margin-top|@fo:margin-bottom|@fo:margin|@fo:padding-left|@fo:padding-right|@fo:padding-top|@fo:padding-bottom|@fo:padding|@fo:text-align|@fo:text-indent|@fo:font-variant|@fo:font-family|@fo:color|@fo:background-color|@fo:font-size|@svg:font-family|@fo:font-style|@fo:font-weight|@fo:line-height|@style:width"
 mode="styleattr">
+               <xsl:call-template name="pass-through"/>
+       </xsl:template>
+
+       <xsl:template match="@style:text-background-color" mode="styleattr">
+               <xsl:text>background-color: </xsl:text>
+               <xsl:value-of select="."/><xsl:text>; </xsl:text>
+               <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+
+       <xsl:template match="@style:font-name" mode="styleattr">
+               <xsl:text>font-family: '</xsl:text>
+               <xsl:value-of select="."/><xsl:text>'; </xsl:text>
+               <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+
+       <xsl:template 
match="@style:text-underline-style|@style:text-underline-type" mode="styleattr">
+<!-- CSS2 only has one type of underline.
+       We can improve this when CSS3 is better supported.
+-->
+               <xsl:if test="not(.='none')">
+                       <xsl:text>text-decoration: underline; </xsl:text>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:template match="@fo:text-align" mode="styleattr">
+               <xsl:value-of select="local-name()"/><xsl:text>: </xsl:text>
+               <xsl:choose>
+                       <xsl:when 
test=".='start'"><xsl:text>left</xsl:text></xsl:when>
+                       <xsl:when 
test=".='end'"><xsl:text>right</xsl:text></xsl:when>
+                       <xsl:otherwise><xsl:value-of 
select="."/></xsl:otherwise>
+               </xsl:choose>
+               <xsl:text>; </xsl:text>
+               <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+
+       <xsl:template match="@style:horizontal-pos" mode="styleattr">
+               <xsl:choose>
+       <!-- We can't support the others until we figure out pagination. -->
+                       <xsl:when test=".='left'">
+                               /* Left alignment */
+                               <xsl:text>margin-left: 0; margin-right: 
auto;</xsl:text>
+                       </xsl:when>
+                       <xsl:when test=".='right'">
+                               /* Right alignment */
+                               <xsl:text>margin-left: auto; margin-right: 
0;</xsl:text>
+                       </xsl:when>
+                       <xsl:when test=".='center'">
+                               /* Centered alignment */
+                               <xsl:text>margin: 0 auto;</xsl:text>
+                       </xsl:when>
+               </xsl:choose>
+               <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+
+       <xsl:template match="@style:column-width" mode="styleattr">
+               <xsl:text>width: </xsl:text><xsl:value-of 
select="."/><xsl:text>; </xsl:text>
+       </xsl:template>
+
+       <xsl:template match="@*" mode="styleattr">
+               <!-- don't output anything for attrs we don't understand -->
+       </xsl:template>
+
+       <xsl:template name="pass-through">
+               <xsl:value-of select="local-name()"/><xsl:text>: </xsl:text>
+               <xsl:value-of select="."/>
+               <xsl:text>; </xsl:text>
+               
+               <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+<!-- style li -->
+       <xsl:template match="text:list-level-style-bullet">
+               <xsl:text>.</xsl:text>
+               <xsl:value-of select="../@style:name"/>
+               <xsl:text>_</xsl:text>
+               <xsl:value-of select="@text:level"/>
+               <xsl:text> { list-style-type: </xsl:text>
+               <xsl:choose>
+                       <xsl:when test="@text:level mod 3 = 1">disc</xsl:when>
+                       <xsl:when test="@text:level mod 3 = 2">circle</xsl:when>
+                       <xsl:when test="@text:level mod 3 = 0">square</xsl:when>
+                       <xsl:otherwise>decimal</xsl:otherwise>
+               </xsl:choose>
+               <xsl:text>;}&#xa;</xsl:text>
+               <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+<!-- style ol -->
+       <xsl:template match="text:list-level-style-number">
+               <xsl:text>.</xsl:text>
+               <xsl:value-of select="../@style:name"/>
+               <xsl:text>_</xsl:text>
+               <xsl:value-of select="@text:level"/>
+               <xsl:text> { list-style-type: </xsl:text>
+               <xsl:choose>
+                       <xsl:when 
test="@style:num-format='1'">decimal</xsl:when>
+                       <xsl:when 
test="@style:num-format='I'">upper-roman</xsl:when>
+                       <xsl:when 
test="@style:num-format='i'">lower-roman</xsl:when>
+                       <xsl:when 
test="@style:num-format='A'">upper-alpha</xsl:when>
+                       <xsl:when 
test="@style:num-format='a'">lower-alpha</xsl:when>
+                       <xsl:otherwise>decimal</xsl:otherwise>
+               </xsl:choose>
+               <xsl:text>;}&#xa;</xsl:text>
+               <xsl:value-of select="$lineBreak"/>
+       </xsl:template>
+<!-- element table -->
+       <xsl:template match="table:table">
+               <table>
+                       <xsl:if test="@table:style-name">
+                               <xsl:attribute name="class">
+                                       <xsl:value-of 
select="@table:style-name"/>
+                               </xsl:attribute>
+                               <caption><xsl:value-of 
select="@table:style-name"/></caption>
+                       </xsl:if>
+                               <colgroup>
+                                       <xsl:apply-templates 
select="table:table-column"/>
+                               </colgroup>
+                       <xsl:if test="table:table-header-rows/table:table-row">
+                               <thead>
+                                       <xsl:apply-templates 
select="table:table-header-rows/table:table-row"/>
+                               </thead>
+                       </xsl:if>
+                       <xsl:if test="table:table-footer-rows/table:table-row">
+                               <thead>
+                                       <xsl:apply-templates 
select="table:table-footer-rows/table:table-row"/>
+                               </thead>
+                       </xsl:if>
+                       <tbody>
+                               <xsl:apply-templates select="table:table-row"/>
+                       </tbody>
+               </table>
+       </xsl:template>
+       
+       <xsl:template match="table:sub-table">
+               <table>
+                       <xsl:if test="@table:style-name">
+                               <xsl:attribute name="class">
+                                       <xsl:value-of 
select="@table:style-name"/>
+                               </xsl:attribute>
+                       </xsl:if>
+                               <colgroup>
+                                       <xsl:apply-templates 
select="table:table-column"/>
+                               </colgroup>
+                       <xsl:if test="table:table-header-rows/table:table-row">
+                               <thead>
+                                       <xsl:apply-templates 
select="table:table-header-rows/table:table-row"/>
+                               </thead>
+                       </xsl:if>
+                       <xsl:if test="table:table-footer-rows/table:table-row">
+                               <thead>
+                                       <xsl:apply-templates 
select="table:table-footer-rows/table:table-row"/>
+                               </thead>
+                       </xsl:if>
+                       <tbody>
+                               <xsl:apply-templates select="table:table-row"/>
+                       </tbody>
+               </table>
+       </xsl:template>
+       
+       <xsl:template match="table:table-column">
+               <col>
+                       <xsl:if test="@table:number-columns-repeated">
+                               <xsl:attribute name="span">
+                                       <xsl:value-of 
select="@table:number-columns-repeated"/>
+                               </xsl:attribute>
+                       </xsl:if>
+                       <xsl:if test="@table:style-name">
+                               <xsl:attribute name="class">
+                                       <xsl:value-of 
select="translate(@table:style-name,'.','_')"/>
+                               </xsl:attribute>
+                       </xsl:if>
+               </col>
+       </xsl:template>
+<!-- element tr -->
+       <xsl:template match="table:table-row">
+       <tr>
+               <xsl:apply-templates select="table:table-cell"/>
+       </tr>
+       </xsl:template>
+
+       <xsl:template match="table:table-cell">
+               <xsl:variable name="n">
+                       <xsl:choose>
+                               <xsl:when test="@table:number-columns-repeated 
!= 0">
+                                       <xsl:value-of 
select="@table:number-columns-repeated"/>
+                               </xsl:when>
+                               <xsl:otherwise>1</xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+               <xsl:call-template name="process-table-cell">
+                       <xsl:with-param name="n" select="$n"/>
+               </xsl:call-template>
+       </xsl:template>
+       
+<!-- element td -->
+       <xsl:template name="process-table-cell">
+       <xsl:param name="n"/>
+               <xsl:if test="$n != 0">
+                       <td>
+                               <xsl:if test="@table:style-name">
+                                       <xsl:attribute name="class">
+                                               <xsl:value-of 
select="translate(@table:style-name,'.','_')"/>
+                                       </xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="@table:number-columns-spanned">
+                                       <xsl:attribute name="colspan">
+                                               <xsl:value-of 
select="@table:number-columns-spanned"/>
+                                       </xsl:attribute>
+                               </xsl:if>
+                               <xsl:if test="@table:number-rows-spanned">
+                                       <xsl:attribute name="rowspan">
+                                               <xsl:value-of 
select="@table:number-rows-spanned"/>
+                                       </xsl:attribute>
+                               </xsl:if>
+                               <xsl:apply-templates/>
+                       </td>
+                       <xsl:call-template name="process-table-cell">
+                               <xsl:with-param name="n" select="$n - 1"/>
+                       </xsl:call-template>
+               </xsl:if>
+       </xsl:template>
+
+       <xsl:key name="listTypes" match="text:list-style" use="@style:name"/>
+       <xsl:template match="text:list">
+               <xsl:variable name="level" 
select="count(ancestor::text:list)+1"/>
+               <!-- the list class is the @text:style-name of the outermost 
<text:list> element -->
+               <xsl:variable name="listClass">
+                       <xsl:choose>
+                               <xsl:when test="$level=1">
+                                       <xsl:value-of 
select="@text:style-name"/>
+                               </xsl:when>
+                               <xsl:otherwise>
+                                       <xsl:value-of 
select="ancestor::text:list[last()]/@text:style-name"/>
+                               </xsl:otherwise>
+                       </xsl:choose>
+               </xsl:variable>
+ 
+       <!-- Now select the <text:list-level-style-foo> element at this level 
of nesting for this list -->
+               <xsl:variable name="node" 
select="key('listTypes',$listClass)/address@hidden:level='$level']"/>
+
+       <!-- emit appropriate list type -->
+               <xsl:choose>
+               <!-- element ol -->
+                       <xsl:when 
test="local-name($node)='list-level-style-number'">
+                               <ol class="{concat($listClass,'_',$level)}">
+                                       <xsl:apply-templates/>
+                               </ol>
+                       </xsl:when>
+               <!-- element ul -->
+                       <xsl:otherwise>
+                               <ul class="{concat($listClass,'_',$level)}">
+                                       <xsl:apply-templates/>
+                               </ul>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+       
+<!-- element li -->
+       <xsl:template match="text:list-item">
+               <li><xsl:apply-templates/></li>
+       </xsl:template>
+
+<!-- manage office:document-meta -->
+       <xsl:template match="office:document-meta">
+               <xsl:apply-templates/>
+       </xsl:template>
+       
+<!-- element meta -->
+       <xsl:template match="office:meta">
+               <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/"/>
+               <xsl:comment> Metadata starts </xsl:comment>
+               <xsl:apply-templates select="meta:generator"/>
+               <xsl:apply-templates select="dc:title"/>
+               <xsl:apply-templates select="dc:description"/>
+               <xsl:apply-templates select="dc:subject"/>
+               <xsl:apply-templates select="meta:keyword"/>
+               <xsl:apply-templates select="meta:initial-creator"/>
+               <xsl:apply-templates select="dc:creator"/>
+               <xsl:apply-templates select="meta:creation-date"/>
+               <xsl:apply-templates select="dc:date"/>
+               <xsl:apply-templates select="dc:language"/>     
+               <meta http-equiv="Content-Type" 
content="text/html;charset=UTF-8"/>
+               <meta name="DC.Format" scheme="IMT" content="charset=UTF-8" />
+               <meta name="DC.Format" scheme="IMT" content="text/html" />
+               <xsl:comment> Metadata ends </xsl:comment>
+       </xsl:template>
+
+<!-- meta generator -->        
+       <xsl:template match="meta:generator">
+               <meta name="generator" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc title -->
+       <xsl:template match="dc:title">
+               <title><xsl:apply-templates/></title>
+               <meta name="DC.Title" content="{current()}"/>
+       </xsl:template>
+
+<!-- dc description -->
+       <xsl:template match="dc:description">
+               <meta name="Description" content="{current()}"/>
+               <meta name="DC.Description" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc subject -->
+       <xsl:template match="dc:subject">
+       <meta name="DC.Subject" content="{current()}"/>
+       </xsl:template>
+       
+<!-- meta keyword -->
+       <xsl:template match="meta:keyword">
+               <meta name="keywords" content="{current()}"/>
+       </xsl:template>
+
+<!-- meta initial creator -->
+       <xsl:template match="meta:initial-creator">
+               <meta name="author" content="{current()}"/>
+               <meta name="DC.Creator" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc creator -->
+       <xsl:template match="dc:creator">
+               <meta name="DC.Contributor" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc language -->
+       <xsl:template match="dc:language">
+               <meta http-equiv="content-language" content="{current()}"/>
+               <meta name="DC.Language" content="{current()}"/>
+       </xsl:template>
+       
+<!-- dc description -->
+       <xsl:template match="dc:description">
+               <meta name="description" content="{current()}"/>
+               <meta name="DC.Description" content="{current()}"/>
+       </xsl:template>
+       
+<!-- meta creation date -->
+       <xsl:template match="meta:creation-date">
+               <meta name="DC.Date.created" content="{current()}"/>
+               <meta name="DC.Date.dateCopyrighted" content="{current()}"/>
+       </xsl:template>
+
+<!-- dc date -->
+       <xsl:template match="dc:date">
+               <meta name="revised" content="{current()}"/>
+               <meta name="DC.Date.modified" content="{current()}"/>
+       </xsl:template>
+
+       <xsl:param name="param_track_changes"/>
+       <xsl:template match="text:tracked-changes">
+               <xsl:comment> Document has track-changes on </xsl:comment>
+       </xsl:template>
+
+       <xsl:template match="text:change">
+       <xsl:if test="$param_track_changes">
+               <xsl:variable name="id" select="@text:change-id"/>
+               <xsl:variable name="change" 
select="//text:address@hidden:id=$id]"/>
+               <xsl:element name="del">
+                       <xsl:attribute name="datetime">
+                               <xsl:value-of select="$change//dc:date"/>
+                       </xsl:attribute>
+                       <!--<xsl:apply-templates 
match="$change/text:deletion/*"/>-->
+               </xsl:element>
+       </xsl:if>
+       </xsl:template>
+
+       <xsl:template match="office:change-info"/>
+       <xsl:param name="param_baseuri"/>
+       <xsl:template match="draw:a">
+               <xsl:choose>
+                       <!-- if parent text:h -->
+                       <xsl:when test="ancestor::text:h">
+                               <xsl:element name="span">
+                                       <xsl:if 
test="draw:image/@draw:style-name">
+                                               <xsl:attribute name="class">
+                                                       <xsl:value-of 
select="translate(draw:image/@draw:style-name,'.','_')"/>
+                                               </xsl:attribute>
+                                       </xsl:if>
+                                       <xsl:if test="//svg:desc">
+                                               <xsl:attribute name="style">
+                                               <!-- This border could be 
removed, but OOo does default to showing a border. -->
+                                                       <xsl:text>border: 1px 
solid #888; </xsl:text> 
+                                                       <xsl:if 
test="draw:image/@svg:width">width: <xsl:value-of 
select="substring-before(draw:image/@svg:width,'px')"/>px; </xsl:if>
+                                                       <xsl:if 
test="draw:image/@svg:height">height: <xsl:value-of 
select="substring-before(draw:image/@svg:height,'px')"/>px; </xsl:if>
+                                               </xsl:attribute>                
                                
+                                       </xsl:if>
+                                       <xsl:choose>
+                                               <xsl:when test="../draw:a">
+                                                       <xsl:element name="a">
+                                                               <xsl:attribute 
name="href">
+                                                                       
<xsl:value-of select="@xlink:href"/>
+                                                               </xsl:attribute>
+                                                               <xsl:attribute 
name="title">
+                                                                       
<xsl:value-of select="@office:name"/>
+                                                               </xsl:attribute>
+                                                               
<xsl:apply-templates/>
+                                                       </xsl:element>
+                                               </xsl:when>
+                                               
<xsl:otherwise><xsl:apply-templates/></xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:element>
+                       </xsl:when>
+                       <!-- if parent is text p -->
+                       <xsl:when test="ancestor::text:p">
+                               <xsl:element name="div">
+                                       <xsl:attribute name="class">
+                                               <xsl:value-of 
select="translate(draw:image/@draw:style-name,'.','_')"/>
+                                       </xsl:attribute>
+                                       <xsl:attribute name="id">
+                                               <xsl:text>text-box</xsl:text>
+                                       </xsl:attribute>
+                                       <xsl:attribute name="style">
+                                       <!-- This border could be removed, but 
OOo does default to showing a border. -->
+                                               <xsl:text>border: 1px solid 
#888; </xsl:text>
+                                               <xsl:if 
test="draw:image/@svg:width">width: <xsl:value-of 
select="substring-before(draw:image/@svg:width,'px')"/>px; </xsl:if>
+                                               <xsl:if 
test="draw:image/@svg:height">height: <xsl:value-of 
select="substring-before(draw:image/@svg:height,'px')"/>px; </xsl:if>
+                                       </xsl:attribute>
+                                       <xsl:choose>
+                                               <xsl:when test="../draw:a">
+                                                       <xsl:element name="a">
+                                                               <xsl:attribute 
name="href">
+                                                                       
<xsl:value-of select="@xlink:href"/>
+                                                               </xsl:attribute>
+                                                               <xsl:attribute 
name="title">
+                                                                       
<xsl:value-of select="@office:name"/>
+                                                               </xsl:attribute>
+                                                               
<xsl:apply-templates/>
+                                                       </xsl:element>
+                                               </xsl:when>
+                                               
<xsl:otherwise><xsl:apply-templates/></xsl:otherwise>
+                                       </xsl:choose>
+                               </xsl:element>
+                       </xsl:when>
+                       <xsl:otherwise><xsl:apply-templates/></xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template match="draw:image">
+               <xsl:element name="img">
+       <!-- Default behaviour
+               <xsl:attribute name="style">
+                       width: 100%;
+                       height: 100%;
+                       <xsl:if test="not(../@text:anchor-type='character')">
+               display: block;
+                       </xsl:if>
+                       </xsl:attribute>
+               -->
+                       <xsl:if test="not(../@text:anchor-type='character')">
+                               <xsl:attribute name="style">display: block; 
</xsl:attribute>
+                       </xsl:if>
+                       
+                       <xsl:attribute name="width">
+                               <xsl:value-of 
select="substring-before(@svg:width,'px')"/>
+                       </xsl:attribute>
+                       
+                       <xsl:attribute name="height">
+                               <xsl:value-of 
select="substring-before(@svg:height,'px')"/>
+                       </xsl:attribute>
+               
+                       <xsl:attribute name="alt">
+                               <xsl:value-of select="@draw:name"/>
+                       </xsl:attribute>
+                       
+                       <xsl:attribute name="src">
+                               <xsl:value-of 
select="concat($param_baseuri,@xlink:href)"/>
+                       </xsl:attribute>
+                       
+                       <xsl:if test="//svg:desc">
+                               <xsl:attribute name="longdesc">
+                                       <xsl:value-of select="//svg:desc"/>
+                               </xsl:attribute>
+                       </xsl:if>               
+               </xsl:element>
+       </xsl:template>
+
+       <xsl:template match="svg:desc"/>
+       
+       <xsl:template match="text:table-of-content">
+       <!-- We don't parse the app's ToC but generate our own. -->
+       <div class="toc">
+               <xsl:apply-templates select="text:index-body/text:index-title"/>
+               <xsl:apply-templates select="//text:h" mode="toc"/>
+       </div>
+       </xsl:template>
+
+       <xsl:template match="text:h" mode="toc">
+       <xsl:element name="p">
+               <xsl:attribute name="class">
+                       <xsl:text>toc_outline_level_</xsl:text>
+                       <xsl:choose>
+                               <xsl:when test="@text:outline-level">
+                                       <xsl:value-of 
select="@text:outline-level"/>
+                               </xsl:when>
+                               <!-- ODF spec says that when unspecified the 
outline level should be considered to be 1. -->
+                               <xsl:otherwise>1</xsl:otherwise>
+                       </xsl:choose>
+               </xsl:attribute>
+               <a href="#{generate-id()}"><xsl:value-of select="."/></a>
+               </xsl:element>
+       </xsl:template>
+
+</xsl:stylesheet>


Property changes on: 
people/sigurdne/modules/manual/trunk/templates/base/sxw2xhtml.xsl
___________________________________________________________________
Added: svn:keywords
   + Id Revision
Added: svn:eol-style
   + native





reply via email to

[Prev in Thread] Current Thread [Next in Thread]